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

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

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.