Consent protocol: Internet-Draft -03
XCIM records explicit consent from the person controlling a recipient email address to an identified sender for specified types of communication. An independent third party attests the consent, with immutable evidence anchored in a blockchain.
Revision -03 specifies EVP, OAuth with authenticated provider API verification, and OpenID Connect (OIDC) as alternative methods to establish control of the email address giving consent. An issuer may use any one admitted method after its required checks. Address verification alone does not grant permission: the same recipient must separately and explicitly accept the identified sender and communication types.
Corrected scope and revision status · eXplicit Consent-Identified Mail (XCIM): draft-saez-xcim-03 · Published text.
This is an individual Internet-Draft with intended status Experimental. Publication does not imply IETF endorsement, working-group adoption or an approved RFC. Amoy provisioning and live-node trials remain paused.
AN01-F01: AS anchor contract and local EVM fixtures
N1–N6 adopted project direction, implemented as reviewable contract, schemas and development vectors.
Local development evidence. The contract is implemented and compiled. No public Amoy deployment, Bor/Heimdall node or live finality verification is claimed. No XCIM_PASS.
Adoption record · Historical alternatives and recommendation · Open dependencies and AN-T01–AN-T20 coverage
Reproducible source and build
Download preserved AN01-F01 ZIP · Solidity source · Compiled artifact and hashes · Standard JSON input · Compiler dependency lock · Publication manifest
solc-js 0.8.30, target paris, optimizer 200, no viaIR or metadata trailer. Runtime reconstruction with constructor immutables is compared to local EVM execution. Amoy EVM compatibility and external review remain pending.
Separate test results
- 34 local PyEVM cases / 46 steps, plus 2 address/chain context checks.
- 65 artifact cases (4 positive / 61 adversarial), using explicitly synthetic node views.
- 19 structural cases for 8 new schemas.
EVM vectors · Artifact patches and expected results · Schema vectors · Synthetic TEST ONLY base. These are same-project tests, not independent operator interoperability or execution of all 20 network scenarios.
NB01-F01 adds the receiver-node adapter and authenticated bootstrap with real loopback TLS/SQLite tests and synthetic Bor/Heimdall responses. Real node admission and live AN integration remain pending. Download latest review ZIP; AN01-F01 ZIP above is preserved.
Eight new closed schemas
- anchor-evidence.schema.json
- common.schema.json
- deployment-binding.schema.json
- evidence-set.schema.json
- finality-policy.schema.json
- intent.schema.json
- receiver-policy.schema.json
- signed-deployment-binding.schema.json
AN01 wraps the unchanged AS01-F01 authority evidence (whose anchor slot stays null) with separate anchor artifacts under new schema IDs. A finalized-view reference or valid JSON cannot authenticate consensus. P1 Proof acceptance remains disabled.
Run from the extracted bundle
python -m pip install -r an01/requirements.txt
cd an01
npm ci --ignore-scripts --no-audit --no-fund
node tools/compile.mjs --check
python tools/check_artifacts.py
python tools/check_evm.py
Package guide · Contract details · Closure gates · Implementation evidence. Historical P1, AS proposal, AS01-F01 and AN01-P01 ZIPs retain their published bytes.
AN01-F01 — contratos, implementación y límites
Fecha 2026-10-19. N1–N6 adoptadas; revisión de desarrollo, sin cierre G06-M/O. La propuesta original conserva la comparación de alternativas. Esta revisión concreta formatos y ejecución local.
1. Contrato compilado
ASCheckpointAnchor.sol implementa exactamente las funciones, eventos y errores
del ABI N1. Constructor: G/T/I no cero, publisher/guardian distintos y no cero.
Una instancia para un issuer/log; sin proxy/setters/llamadas externas/delegatecall.
La EOA publisher escribe; guardian sólo detiene. No hay pagos ni tokens.
Head comienza en (0,0). Exigir secuencia head+1, hasta 2^53-1, C no cero y
previous_C igual al head. Guardar cada secuencia, actualizar head y emitir un
evento atómicamente. Un retry histórico exacto devuelve el mismo ID sin evento;
otra variante revierte. halt es irreversible e idempotente; bloquea incluso
retries de anchor y conserva getters. checkpointAt desconocido devuelve ceros.
La precedencia de errores es: publisher, halted, rango, C cero, conflicto/orden.
ABI inválido, value no cero y selector desconocido revierten sin error XCIM.
Solidity admite calldata extra conforme a sus reglas; el decoder de eventos
del receiver exige topics/data de longitudes exactas.
El contrato publica bytes32; no verifica JWS ni consentimiento. Un publisher comprometido puede bloquear el log publicando hashes no válidos; la firma AS sigue siendo un requisito separado. Rotar publisher/guardian exige nueva instancia/log/genesis y bootstrap aceptado, sin reset unilateral de floors.
Compilación: solc-js 0.8.30+commit.73712a01.Emscripten.clang, optimizer 200,
sin viaIR, target paris, metadata hash none/CBOR deshabilitado. Es una elección
de build local reproducible, no certificación de soporte Amoy. La
interfaz Standard JSON oficial
documenta estos parámetros. compile.mjs rechaza versión, diagnósticos o ABI
divergentes. SPDX UNLICENSED es un marcador de desarrollo: derechos/licencia de
distribución e IETF siguen pendientes. No usar este build sin revisión externa.
2. Compromisos y representaciones
Se mantienen G/C y las fórmulas D/I/T/anchor_id de N1. G/C/I/T y el compromiso
del binding se transportan como base64url canónico de 32 bytes sin padding.
Hashes de red/código/ABI/transacción son hex lowercase 0x+64; direcciones son
hex lowercase 0x+40. Hex y base64url no se vuelven a hashear como strings para
ABI: se decodifican a bytes32. C usa el payload JCS de C4, no su envelope JWS.
B = SHA-256(UTF8("XCIM-AS-EVM-01-DEPLOYMENT-BINDING\0") || JCS(binding_payload))
ABIhash = SHA-256(JCS(ABI_array_N1))
creation_input = creation_code_template || abi.encode(G,T,I,publisher,guardian)
ABIhash usa el array N1 publicado, cuyos nombres/orden se preservan; el ABI del
compilador se contrasta por semántica (tipo/nombre de función/indexed/argumentos),
sin exigir nombres de outputs ni internalType. Source hash usa bytes UTF-8;
compiler_input_sha256 usa JSON.stringify compacto de la entrada Standard JSON
con su orden declarado. No es JCS. Ambos bytes están publicados para reproducir.
El hash del template de creación excluye argumentos de constructor; por tanto no incluye T. El runtime final sí contiene inmutables: se reconstruye con las referencias del compilador y se contrasta con ejecución EVM. ABI/template/receta → genesis e intent → T/args → creación → runtime/address/receipt → binding B. G/T/I nunca incluyen B; C4 nunca contiene su propio receipt/bloque/anchor_id.
3. Schemas y firma raíz
Todos son JSON Schema 2020-12, cerrados salvo $defs/refs declarados, con IDs
offline https://xcim.invalid/ietf/an01/schemas/. Cadenas/arrays/bytes/enteros
están acotados; schema válido no prueba relaciones ni autoridad.
| Schema | Contrato |
|---|---|
intent |
Scope issuer/log/G/I, red/genesis, ABI/template/receta, publisher/guardian y finality policy. Sin dirección/tx/binding futuros. |
deployment-binding |
Intent T, scope/red, ubicación/creación/runtime, constructor, bootstrap, root-policy epoch y vigencia. |
signed-deployment-binding |
Envelope de quórum AS. Payload decodificado debe cumplir deployment-binding; no es JSON payload arbitrario aceptado. |
finality-policy |
Nodo Bor/Heimdall/pins, finalidad/ancestry/estado por hash exigidos; fallback latest/dos RPC prohibido; cotas 120/30/10. |
anchor-evidence |
T/B/C, secuencia/ubicación/índices, topics/data exactos, policy y referencia de vista finalizada. No acepta confirmed/flags de autoridad. |
receiver-policy |
Nueva envoltura C1: política AS01 explícita + intent/B/address y política de finalidad aceptados localmente. |
evidence-set |
Nueva envoltura C7: evidencia AS01 intacta con null + intent, binding firmado y evidencia de anchor aparte. |
common |
Hashes/hex/address/enteros acotados y envelope de quórum reutilizado. |
Binding JWS: alg=Ed25519, typ=application/xcim-as-anchor-binding+jcs, kid
exacto bajo el quórum root de la política local y su epoch. Payload/protected
JCS canónico, base64url sin padding, firmantes de thumbprints distintos y claves
vigentes al emitir y usar; siguen las reglas AS de quórum. Typ provisional sin
registro IANA. Discovery/email no provisiona roots ni pins. No aceptar el primer
binding firmado por claves incluidas en ese mismo mensaje como bootstrap.
El checker de fixture valida también C2/C3/C4 y permiso con AS01, luego relaciones intent/B/constructor/código/evento/estado. La envoltura nueva es explícita y no se pasa como C7 F01 ni habilita el Proof P1. Runtime de receiver/SMTP, lifecycle de bindings/root-policy y persistencia todavía requieren implementación.
4. Vista de nodo y frescura
anchor-evidence.finalized_view_reference sólo identifica un bloque. El esquema
no contiene una proof portable de consenso. En operación el receiver debe
autenticar su nodo, bootstrap, sync, finalized header, ancestry y receipt/estado
bajo ese hash; EIP-1898 describe consultas
por hash/canonicalidad. El JSON del issuer no es esa fuente de autoridad.
an01.verify_fixture acepta sólo contexto TEST ONLY y vistas sintéticas con
consensus_verified=false. Su resultado siempre es
AN01_LOCAL_ARTIFACT_FIXTURE_OK, también con consenso/PASS false. Los campos
synced/canonical/receipt del fixture son oráculos del test, no verificaciones
de red ni flags utilizables como autoridad en un receiver. No existe ruta
productiva que los convierta en PASS.
La batería compara B canónico bajo F, código/getters en el mismo F, provenance de deploy, head actual, halt, floors y deadlines. El deadline de artefacto es mínimo de AS, binding, claves raíz usadas y timestamp F+120; el presupuesto local de caché se devuelve separado en segundos, jamás como timestamp del issuer. Reuso o SMTP deben comprobar ambas cotas con relojes adecuados. No instalar floors ni dejar que una descarga tardía extienda los 300s. Contradicciones finalizadas exigen cuarentena; floors durables, ancestry real y el nodo están pendientes.
5. Resultados y cobertura
34 casos/46 pasos EVM ejecutan bytecode local y verifican eventos, return values, head/historia, getters, inmutables y no mutación observable al revertir/reintentar. Dos checks adicionales prueban separación por dirección y chain ID local. Se contrasta la reconstrucción de runtime con el código desplegado en PyEVM. El checker de artefactos prueba firmas/relaciones contra vistas sintéticas; sus casos positivos no acreditan una transacción Amoy ni un receipt auténtico.
Los casos AN-T01–AN-T20 originales mezclan contrato, receiver, red y operación. Se mapean explícitamente: cubrir una parte local no los vuelve escenarios end-to-end ejecutados. G06-M/O, revisión externa e interop siguen abiertos.