<?xml version='1.0' encoding='UTF-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-guorong-utxo-dns-01" category="exp" xml:lang="en" tocDepth="3" tocInclude="true" symRefs="true" sortRefs="true">
  <front>
    <title>UTXO Domain Name System (UTXO6-DNS): Base Protocol and PRN Regulatory Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-guorong-utxo-dns-01"/>
        <author
 fullname="Guorong Tian"
 initials="GT"
 surname="Tian"
>
      <organization>CoCa Global Joint Foundation</organization>
      <address>
        <postal>

        <street>No. 67-3, Tan Gong South Road, Weicang Street</street>
        <city>Jiaxing County</city>
        <region>Zhejiang Province</region>
        <country>China</country>
      
        </postal>
        <email>foundation@utxocp.cn</email>
        <email>cocapetroleum@gmail.com</email>
      </address>
    </author>
        <author
 fullname="ZhibinLei"
 initials="Z"
 surname="ZhibinLei"
>
      <organization>Institute of Web3.0 Hong Kong</organization>
      <address>
        <email>zblei@ust.hk</email>
      </address>
    </author>
        <author
 fullname="FanYinYang"
 initials="F"
 surname="FanYinYang"
>
      <organization>CoCa Global Joint Foundation</organization>
      <address>
        <email>yang.fanyin0101@gmail.com</email>
      </address>
    </author>
        <author
 fullname="YidanZhu"
 initials="Y"
 surname="YidanZhu"
>
      <organization>W3C-UW2ICG</organization>
      <address>
        <email>monica@utxocp.cn</email>
      </address>
    </author>
        <author
 fullname="Xinfeng. Huang"
 initials="XH"
 surname="Huang"
>
      <organization>Hong Kong Ronghua International Group Co., Ltd.</organization>
      <address>
        <email>1917351588@163.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="21"/>
    <area>Internet</area>
    <workgroup>Individual Submission (DNSOP DISPATCH discussion planned)</workgroup>
    <keyword>UTXO</keyword>
    <keyword>DNS</keyword>
    <keyword>PRN</keyword>
    <keyword>regulatory compliance</keyword>
    <keyword>audit</keyword>
    <keyword>MPC</keyword>
    <keyword>vLEI</keyword>
    <keyword>AgentPolicyEnvelope</keyword>
    <abstract>
      <t>All domain names used in examples throughout this document use ".test" in accordance with RFC 2606. In actual deployments, ".utxo" is used.</t>
      <t>This document specifies the UTXO Domain Name System (UTXO6-DNS), a decentralized naming protocol that maps .utxo domain names to blockchain UTXO (Unspent Transaction Output) endpoints and generates verifiable IPv6 Interface Identifiers (IIDs) using Verifiable Random Functions (VRFs). The base protocol defines a new DNS RR type (UTXO, code 260), an EDNS0 option for capability discovery, and fallback mechanisms to coexist with legacy DNS, updating RFC 1034, RFC 1035, and RFC 7217.</t>
      <t>Additionally, this document defines an optional compliance overlay --- the Penetrating Regulation Node (PRN) extensions --- that can be deployed by regulated financial institutions to meet AML/CFT requirements, provide audit trails, and verify legal entity identities using GLEIF vLEI credentials. The PRN extensions include optional regulatory attributes in UTXO RRs, a new PRNAUDIT RR type for daily audit summaries, a RESTful API (PRN-API) for regulatory dashboards, a 2-of-3 MPC threshold signature framework for audit integrity, and native vLEI integration. This document also describes a transaction lifecycle compliance enforcement model (AnteHandler) and an application-layer policy format (AgentPolicyEnvelope) for declarative authorization.</t>
      <t>The PRN extensions are privacy-preserving (only Merkle roots and aggregated statistics are shared), decentralized (no central authority), and verifiable (audit summaries are jointly signed by independent auditing firms).</t>
      <t><strong>This document is published as an Experimental specification.</strong> It is not an IETF standard and does not represent IETF consensus. It is intended for informational purposes, to facilitate implementation experience, and to support early discussion within the DNSOP working group. See <xref target="status"/> for details.</t>
      <t><strong>Note:</strong> The AgentPolicyEnvelope JSON Schema (Appendix I) and the AnteHandler compliance enforcement model (Section 4) are application-layer constructs provided as informative examples. They are not on the IETF standards track and are not subject to IETF consensus. Their inclusion in this document is intended to facilitate interoperability of experimental deployments.</t>
    </abstract>
  </front>

  <middle>
    <!-- ============================================================ -->
    <section anchor="status" numbered="true" toc="default">
      <name>Document Status: Experimental</name>
      <t>This document is published as an <strong>Experimental</strong> specification. According to <xref target="RFC2026"/>, the "Experimental" designation typically denotes a specification that is part of some research or development effort. Such a specification is published for the general information of the Internet technical community and as an archival record of the work.</t>
      <t>This document is <strong>not</strong> on the IETF standards track. It does not represent IETF consensus, nor does it imply any endorsement by the IETF, the IESG, or any IETF Working Group. It is an individual submission published for experimental and informational purposes only.</t>
      <t>The base protocol described in Section 2 is intended to form the basis for future standardization; the PRN extensions in Section 3 and the compliance enforcement model in Section 4 are experimental. Readers are advised that the mechanisms described in this document have not been subject to broad interoperability testing, security review, or IETF Working Group scrutiny. Deployment should be undertaken with caution and after appropriate risk assessment.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <section anchor="bg" numbered="true" toc="default">
        <name>Background and Problem Statement</name>
        <t>Traditional DNS maps names to IP addresses. However, modern digital assets (cryptocurrencies, tokenised real-world assets, NFTs) are identified by opaque blockchain addresses that are not routable, not human-friendly, and lack a standardised binding to the Internet's naming and addressing layers. This forces each blockchain application to build its own messaging overlay. Meanwhile, IPv6 provides a 128-bit address space with a 64-bit Interface Identifier (IID) that is programmable by design -- but current IID generation (RFC 7217) uses only local device information, not asset ownership.</t>
        <t>This document defines the UTXO6-DNS protocol, which bridges that gap by allowing a domain name to resolve to a UTXO endpoint identifier, and by providing a method to generate IIDs directly from UTXO ownership using Verifiable Random Functions (VRF, RFC 9381). The system allows a human-readable '.utxo' domain name to resolve to a routable IPv6 address that is cryptographically owned by the UTXO holder.</t>
        <t>Furthermore, for adoption by regulated financial institutions, the protocol is extended with the Penetrating Regulation Node (PRN) overlay to meet AML/CFT regulations, provide auditable transaction records, and verify legal entity identities. These extensions are optional and do not affect the core resolution protocol.</t>
      </section>

      <section anchor="scope" numbered="true" toc="default">
        <name>Scope</name>
        <t>This document defines:</t>
        <ul spacing="normal">
          <li>The base UTXO6-DNS resolution protocol, including VRF-based IID generation, the UTXO RR type, and basic EDNS0 support (Section 2).</li>
          <li>Optional PRN extensions: regulatory attributes in UTXO RRs, the PRNAUDIT RR type, EDNS0 option for PRN, PRN-API, MPC audit framework, vLEI integration (Section 3).</li>
          <li>A transaction lifecycle compliance enforcement model (AnteHandler) that PRN nodes MAY implement (Section 4).</li>
          <li>An informative JSON Schema for AgentPolicyEnvelope, an application-layer policy format (Appendix I).</li>
        </ul>
        <t>This document does not specify payment processing, smart contract execution, or blockchain consensus mechanisms. The AgentPolicyEnvelope format is provided as an informative example and is not an IETF standard.</t>
      </section>

      <section anchor="dnsop-discussion" numbered="true" toc="default">
        <name>DNSOP Working Group Discussion</name>
        <t>This document is intended to facilitate early discussion within the <strong>DNS Operations (DNSOP)</strong> working group. The authors plan to present this proposal in the DNS DISPATCH portion of an upcoming DNSOP meeting, with the goal of collecting feedback on:</t>
        <ul spacing="normal">
          <li>Interest in adopting the base UTXO6-DNS protocol as a standards-track document.</li>
          <li>Whether the PRN extensions are within the DNSOP charter's scope.</li>
          <li>Implementation and deployment considerations.</li>
        </ul>
        <t>DNSOP working group mailing list: <eref target="https://mailarchive.ietf.org/arch/browse/dnsop/"/></t>
      </section>

      <section anchor="terminology" numbered="true" toc="default">
        <name>Terminology</name>
        <dl spacing="compact">
          <dt><strong>UTXO</strong></dt><dd>Unspent Transaction Output -- a fundamental unit of value in blockchain systems.</dd>
          <dt><strong>IID</strong></dt><dd>Interface Identifier -- the lower 64 bits of an IPv6 address.</dd>
          <dt><strong>VRF</strong></dt><dd>Verifiable Random Function -- a cryptographic function that produces a random-looking output and a proof that can be verified.</dd>
          <dt><strong>SLAAC</strong></dt><dd>Stateless Address Autoconfiguration -- the IPv6 mechanism for address generation.</dd>
          <dt><strong>PRN</strong></dt><dd>Penetrating Regulation Node -- a node deployed by a regulated entity to implement compliance functions.</dd>
          <dt><strong>vLEI</strong></dt><dd>verifiable Legal Entity Identifier -- a W3C Verifiable Credential for legal entity identity.</dd>
          <dt><strong>MPC</strong></dt><dd>Multi-Party Computation -- cryptographic protocol for threshold signing.</dd>
          <dt><strong>AgentPolicyEnvelope</strong></dt><dd>A JSON structure containing declarative authorization policies for a .utxo domain (e.g., spending limits, asset whitelists). This is an application-layer construct defined informatively in Appendix I.</dd>
          <dt><strong>AnteHandler</strong></dt><dd>A pre-block validation pipeline that enforces compliance checks before a transaction is included in a block.</dd>
        </dl>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in <xref target="RFC2119"/>.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- SECTION 2: BASE PROTOCOL -->
    <section anchor="base-protocol" numbered="true" toc="default">
      <name>Base UTXO6-DNS Protocol</name>
      <section anchor="vrf-iid" numbered="true" toc="default">
        <name>IPv6 Interface Identifier Generation from UTXO</name>
        <section anchor="vrf-derivation" numbered="true" toc="default">
          <name>VRF-based IID Derivation</name>
          <t>A UTXO owner generates a stable, verifiable IID for any network prefix using:</t>
          <sourcecode type="pseudocode">IID = VRF(UTXO_privkey, Prefix || UTXO_TXID || OutputIndex || Nonce)[64]</sourcecode>
          <t>where:</t>
          <ul spacing="normal">
            <li><strong>VRF</strong> is a Verifiable Random Function as defined in <xref target="RFC9381"/> (e.g., ECVRF-EDWARDS25519-SHA512).</li>
            <li><strong>UTXO_privkey</strong> is the private key that controls the UTXO.</li>
            <li><strong>Prefix</strong> is the 64-bit IPv6 network prefix received in a Router Advertisement.</li>
            <li><strong>UTXO_TXID</strong> is the 256-bit transaction hash of the UTXO.</li>
            <li><strong>OutputIndex</strong> is the index of the UTXO in that transaction (0--65535).</li>
            <li><strong>Nonce</strong> is an optional 32-bit value for privacy rotation.</li>
          </ul>
          <t>The output IID <bcp14>MUST</bcp14> be treated as a 64-bit integer and used for SLAAC. The global/local bit (u=1) and multicast bit (g=0) <bcp14>SHOULD</bcp14> be set according to RFC 4291.</t>
        </section>

        <section anchor="vrf-verify" numbered="true" toc="default">
          <name>Verification of IID</name>
          <t>Given the UTXO public key, the same input parameters, and the VRF proof, any party can verify that the IID was generated by the UTXO owner. Verification does not require blockchain access, enabling offline validation.</t>
        </section>

        <section anchor="rfc7217-rel" numbered="true" toc="default">
          <name>Relationship with RFC 7217 and RFC 4941</name>
          <t>This construction follows the pattern of <xref target="RFC7217"/> but replaces the secret key with a UTXO private key and adds VRF proof. The Nonce corresponds to RFC 4941 temporary addresses. This updates RFC 7217 by adding a new allowed secret source.</t>
        </section>
      </section>

      <section anchor="utxo-rr" numbered="true" toc="default">
        <name>UTXO Resource Record Type</name>
        <t>This document defines a new DNS resource record type, <tt>UTXO</tt>, with code 260. The RDATA format is:</t>
        <sourcecode type="ascii-art">
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | EndpointLen | Flags | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Endpoint Identifier (variable) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ VRF Proof (variable) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</sourcecode>
        <t>Fields:</t>
        <ol spacing="normal">
          <li><strong>Version</strong> (1 octet): currently 1.</li>
          <li><strong>EndpointLen</strong> (1 octet): length of the Endpoint Identifier.</li>
          <li><strong>Flags</strong> (1 octet): bit 0 = LegacyIPPresent (if set, an A/AAAA record follows the VRF proof).</li>
          <li><strong>Reserved</strong> (1 octet): <bcp14>MUST</bcp14> be zero.</li>
          <li><strong>Endpoint Identifier</strong>: a byte string identifying a blockchain endpoint. For .utxo domains, this <bcp14>MUST</bcp14> be CBOR-encoded as specified in <xref target="appendix-f"/>.</li>
          <li><strong>VRF Proof</strong>: optional proof for verification.</li>
        </ol>
        <t>If the LegacyIPPresent flag is set, an A or AAAA record is appended after the VRF proof.</t>
      </section>

      <section anchor="base-edns0" numbered="true" toc="default">
        <name>EDNS0 Option for Base Capability Discovery</name>
        <t>An EDNS0 option (code TBD, suggested 16) is defined for clients to indicate UTXO-DNS support. The option follows the format defined in <xref target="RFC6891"/>. The option data is 2 octets: version (1) and reserved (0). Servers <bcp14>SHOULD</bcp14> echo it.</t>
      </section>

      <section anchor="resolver-behaviour" numbered="true" toc="default">
        <name>Resolver Behaviour and Fallback</name>
        <t>A UTXO-DNS recursive resolver <bcp14>MUST</bcp14> implement the following logic for queries of type UTXO (260) or ANY:</t>
        <sourcecode type="pseudocode">if domain ends with ".utxo" or ".utxo.&lt;region&gt;":
  try:
    result = blockchain_query(domain, timeout=2s)
    if result.valid:
      return response with UTXO record + proof
  except (timeout, not_found, invalid_proof):
    if qtype == UTXO or ANY:
      return NXDOMAIN or error
    else:
      return legacy_lookup(domain)
else:
  return legacy_lookup(domain)</sourcecode>
        <t>For A/AAAA queries, the resolver <bcp14>MAY</bcp14> first attempt blockchain resolution to get a legacy IP from the UTXO record's LegacyIPPresent field; if that fails, it falls back to the legacy DNS. For type UTXO, fallback is <bcp14>NOT allowed</bcp14>.</t>
      </section>

      <section anchor="base-integration" numbered="true" toc="default">
        <name>Integration Considerations</name>
        <ul spacing="normal">
          <li><strong>Namespace</strong>: only '.utxo' and '.utxo.&lt;region&gt;' trigger UTXO resolution.</li>
          <li><strong>Cache</strong>: TTL of UTXO records <bcp14>SHOULD</bcp14> be min(legacy TTL, blockchain finality) (recommended 300 seconds).</li>
          <li><strong>Fallback security</strong>: clients <bcp14>MAY</bcp14> enforce UTXO-only for certain domains.</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- SECTION 3: PRN EXTENSIONS -->
    <section anchor="prn-overview" numbered="true" toc="default">
      <name>PRN Compliance Extensions</name>
      <section anchor="prn-arch" numbered="true" toc="default">
        <name>Overview</name>
        <t>A PRN node is an optional compliance overlay. A regulated entity <bcp14>MAY</bcp14> deploy a PRN node associated with one or more .utxo domains. The node performs:</t>
        <ul spacing="normal">
          <li>UTXO6-DNS resolution.</li>
          <li>vLEI verification for counterparties.</li>
          <li>Maintenance of a daily Merkle tree of transactions.</li>
          <li>Generation of daily audit summaries signed by the node and then by an audit committee via MPC.</li>
          <li>Publication of summaries via DNS (PRNAUDIT RR) and PRN-API.</li>
        </ul>
        <t>These extensions do not modify the base resolution protocol.</t>
      </section>

      <section anchor="prn-dns-ext" numbered="true" toc="default">
        <name>DNS Resource Record Extensions</name>
        <section anchor="utxo-rr-attr" numbered="true" toc="default">
          <name>Optional Attributes in UTXO RR</name>
          <t>The UTXO RR presentation format supports optional attributes. This document defines:</t>
          <dl spacing="compact">
            <dt><tt>prn-endpoint</tt></dt><dd>URI for the PRN-API.</dd>
            <dt><tt>audit-group</tt></dt><dd>Audit committee identifier.</dd>
            <dt><tt>policy</tt></dt><dd>A URI (e.g., <tt>ipfs://...</tt> or <tt>https://...</tt>) pointing to an <strong>AgentPolicyEnvelope</strong> JSON object. The resolved content <bcp14>MUST</bcp14> conform to the informative schema defined in <xref target="appendix-i"/>. Example: <tt>"policy=ipfs://QmX..."</tt>.</dd>
            <dt><tt>regulatory-jurisdiction</tt></dt><dd>ISO 3166-1 alpha-2 country code.</dd>
            <dt><tt>stablecoin-whitelist</tt></dt><dd>Pipe-separated list of allowed stablecoins.</dd>
            <dt><tt>vlei-did</tt></dt><dd>vLEI credential DID.</dd>
          </dl>
          <t>Example:</t>
          <artwork type="example">
example.test. 3600 IN UTXO (
  "chain=ethereum"
  "address=0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0"
  "prn-endpoint=https://prn.example.com/api/v1"
  "audit-group=hk-audit-group-01"
  "policy=ipfs://QmXyZ..."
  "regulatory-jurisdiction=HK"
  "stablecoin-whitelist=USDC|USDT|HKDA"
  "vlei-did=did:vlei:gleif:984500B9D5C8"
)</artwork>
        </section>

        <section anchor="prnaudit-rr" numbered="true" toc="default">
          <name>PRNAUDIT RR Type</name>
          <t>A new RR type <tt>PRNAUDIT</tt> (suggested code TBD1) stores daily audit summaries. RDATA:</t>
          <sourcecode type="ascii-art">
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Date (YYYYMMDD) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved (must be 0) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Merkle Root Hash (32 bytes) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ MPC Signature (64 bytes) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Audit Period Indicator | (remaining bytes, if any) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</sourcecode>
          <t><strong>Date</strong>: 4-byte unsigned integer YYYYMMDD.<br/>
          <strong>Merkle Root</strong>: SHA-256 hash of transaction tree root.<br/>
          <strong>MPC Signature</strong>: 64-byte Schnorr multi-signature.<br/>
          <strong>Audit Period</strong>: 0=DAILY, 1=MONTHLY, 2=QUARTERLY, 3=ANNUAL.</t>
          <t>PRNAUDIT RRs <bcp14>MAY</bcp14> be stored at the domain or at <tt>_audit.example.tast</tt>.</t>
        </section>

        <section anchor="prn-edns0" numbered="true" toc="default">
          <name>EDNS0 Option for PRN</name>
          <t>A new EDNS0 option (code TBD2) is defined. The option data <bcp14>MAY</bcp14> contain sub-options: 0x01 (request PRNAUDIT), 0x02 (request vLEI status).</t>
        </section>
      </section>

      <section anchor="prn-api" numbered="true" toc="default">
        <name>PRN-API Specification</name>
        <t>The PRN-API is a RESTful interface exposed at the prn-endpoint. Authentication <bcp14>MUST</bcp14> be OAuth 2.0, mTLS, or HMAC-SHA256. When using TLS, <xref target="RFC8446"/> MUST be enforced.</t>

        <section anchor="api-endpoints" numbered="true" toc="default">
          <name>Core Endpoints</name>
          <ul spacing="normal">
            <li><tt>GET /health</tt> -- operational status</li>
            <li><tt>POST /vlei/verify</tt> -- verify vLEI credential</li>
            <li><tt>GET /audit/daily-summary?date=YYYY-MM-DD</tt></li>
            <li><tt>GET /audit/monthly-report?year=YYYY&amp;month=MM</tt></li>
            <li><tt>POST /compliance/check</tt> -- check transaction compliance</li>
            <li><tt>GET /registry/lookup?domain=.utxo</tt></li>
          </ul>
          <t>Full OpenAPI specification is provided in <xref target="appendix-g"/>.</t>
        </section>

        <section anchor="websocket" numbered="true" toc="default">
          <name>WebSocket Streaming</name>
          <t>PRN nodes <bcp14>MAY</bcp14> expose <tt>wss://...</tt> for real-time messages (transaction, alert, health, audit_complete).</t>
        </section>
      </section>

      <section anchor="mpc-audit" numbered="true" toc="default">
        <name>MPC Audit Framework</name>
        <section anchor="threshold-sig" numbered="true" toc="default">
          <name>Threshold Signature Protocol (GG20)</name>
          <t>Three independent auditing firms operate MPC nodes. The committee public key is known. The <xref target="GG20"/> protocol produces a 64-byte Schnorr signature (R and s).</t>
        </section>

        <section anchor="daily-summary" numbered="true" toc="default">
          <name>Daily Audit Summary Generation</name>
          <t>Each PRN node maintains a Merkle tree of <tt>H(tx_hash || from_domain || to_domain || amount || timestamp)</tt>. At day end, it computes the root, aggregates metrics, signs with its HSM key, broadcasts to the committee, and stores the multi-signed summary. Full transaction data <bcp14>SHOULD</bcp14> be retained for at least seven years.</t>
        </section>

        <section anchor="agg-reports" numbered="true" toc="default">
          <name>Aggregated Reports</name>
          <t>Monthly, quarterly, and annual reports are derived from daily summaries using Merkle trees of daily hashes, each with a fresh MPC signature.</t>
        </section>
      </section>

      <section anchor="vlei-integration" numbered="true" toc="default">
        <name>vLEI Credential Integration</name>
        <section anchor="vlei-verify-flow" numbered="true" toc="default">
          <name>Verification Flow</name>
          <t>PRN nodes verify vLEI by fetching <tt>https://api.gleif.org/api/v1/vlei/{lei}</tt> (see <xref target="GLEIF-API"/>), verifying the response signature, checking expiration and revocation, and optionally confirming domain linkage.</t>
        </section>

        <section anchor="vlei-caching" numbered="true" toc="default">
          <name>Caching Requirements</name>
          <t>To avoid overload, PRN nodes <bcp14>MUST</bcp14> cache with max TTL 300s, webhook invalidation, minimum 10k entries, LRU eviction.</t>
        </section>
      </section>

      <section anchor="dashboard" numbered="true" toc="default">
        <name>Regulatory Dashboard Integration</name>
        <t>Dashboards can integrate with any PRN node using the PRN-API. A reference open-source implementation is available.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- SECTION 4: TRANSACTION LIFECYCLE &amp; ANTEHANDLER -->
    <section anchor="tx-lifecycle" numbered="true" toc="default">
      <name>Transaction Lifecycle and Compliance Enforcement</name>
      <section anchor="antehandler-overview" numbered="true" toc="default">
        <name>Overview</name>
        <t>PRN nodes implementing transaction enforcement <bcp14>MAY</bcp14> perform a set of pre-block validation checks --- collectively referred to as the <strong>AnteHandler</strong> --- before a transaction is included in a block. These checks are independent of the DNS resolution protocol and are provided as an informative compliance model. The AnteHandler enforces application-layer policies defined in the AgentPolicyEnvelope (see <xref target="appendix-i"/>).</t>
        <t>If any of the following checks fail, the transaction <bcp14>MUST</bcp14> be rejected (i.e., it is not included in the block). This is a <strong>pre-block interception</strong>, not a post-audit check.</t>
      </section>

      <section anchor="antehandler-checks" numbered="true" toc="default">
        <name>AnteHandler Checks</name>
        <t>The AnteHandler consists of the following seven mandatory checks:</t>
        <table align="center">
          <thead>
            <tr><th>#</th><th>Check Name</th><th>Description</th></tr>
          </thead>
          <tbody>
            <tr><td>1</td><td><strong>KYCgate</strong></td><td>Verify that both the sender's and the receiver's vLEI credentials are active (not revoked, not expired).</td></tr>
            <tr><td>2</td><td><strong>Sanctions</strong></td><td>Check that the sender and receiver do not appear on any applicable sanctions lists (L1/L2/L3 entities).</td></tr>
            <tr><td>3</td><td><strong>TravelRule</strong></td><td>Verify that beneficiary disclosure information is present and compliant with FATF Travel Rule requirements.</td></tr>
            <tr><td>4</td><td><strong>ThresholdFlag</strong></td><td>Ensure that the transaction amount ≤ <tt>per_tx_limit</tt> as specified in the AgentPolicyEnvelope.</td></tr>
            <tr><td>5</td><td><strong>VelocityFlag</strong></td><td>Ensure that the cumulative transaction amount for the sender for the current day (UTC) ≤ <tt>daily_limit</tt> as specified in the AgentPolicyEnvelope.</td></tr>
            <tr><td>6</td><td><strong>RoleGate</strong></td><td>Verify that the initiating AI Agent has been properly authorized by the Legal Entity (as represented by the vLEI credential).</td></tr>
            <tr><td>7</td><td><strong>AgentPolicyGate</strong></td><td>Verify the digital signature on the AgentPolicyEnvelope, confirm that the policy has not expired, and ensure that the transaction conforms to all constraints in the policy (e.g., <tt>allowed_assets</tt>, <tt>whitelist</tt>).</td></tr>
          </tbody>
        </table>
      </section>

      <section anchor="antehandler-enforcement" numbered="true" toc="default">
        <name>Enforcement and Auditing</name>
        <t>Transactions that pass all AnteHandler checks are forwarded to the consensus layer for inclusion in a block. Transactions that fail any check are rejected immediately; they are not broadcast to the consensus layer and do not incur transaction fees.</t>
        <t>PRN nodes <bcp14>SHOULD</bcp14> log all AnteHandler decisions (both accepted and rejected) with sufficient detail to support later audit. The logged data <bcp14>SHOULD</bcp14> include the transaction hash, the check that failed (if any), and a timestamp. These logs <bcp14>MAY</bcp14> be included in the daily Merkle tree summarised by the PRNAUDIT RR.</t>
        <t><strong>Note:</strong> The AnteHandler model described in this section is provided as an informative example of how a PRN node might implement transaction compliance. It is not on the IETF standards track and is not subject to IETF consensus. Deployments <bcp14>MAY</bcp14> implement additional checks or omit checks as required by local regulations.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- SECURITY -->
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <section anchor="base-security" numbered="true" toc="default">
        <name>Base Protocol Security</name>
        <ul spacing="normal">
          <li><strong>Private key theft</strong>: if stolen, attacker can generate same IIDs. Mitigations: multi-signature, time-locks, HSMs.</li>
          <li><strong>VRF strength</strong>: <bcp14>MUST</bcp14> use algorithms with at least 128-bit security (e.g., Ed25519 VRF).</li>
          <li><strong>Privacy</strong>: address rotation via Nonce provides similar properties to RFC 4941; zero-knowledge proofs can be used for advanced privacy.</li>
        </ul>
      </section>

      <section anchor="prn-security" numbered="true" toc="default">
        <name>PRN Extensions Security</name>
        <t>Threats and mitigations (STRIDE model):</t>
        <table align="center">
          <thead>
            <tr><th>Category</th><th>Threat</th><th>Mitigation</th></tr>
          </thead>
          <tbody>
            <tr><td>Spoofing</td><td>Domain ownership forgery</td><td>vLEI + UTXO private key signatures</td></tr>
            <tr><td>Spoofing</td><td>PRN node impersonation</td><td>mTLS + node certificates</td></tr>
            <tr><td>Tampering</td><td>Audit summary alteration</td><td>MPC threshold signatures</td></tr>
            <tr><td>Tampering</td><td>Transaction proof forgery</td><td>Merkle tree + ZK proofs</td></tr>
            <tr><td>Repudiation</td><td>Domain registration denial</td><td>On-chain immutable logs</td></tr>
            <tr><td>Information Disclosure</td><td>Domain owner privacy leakage</td><td>Stealth addresses</td></tr>
            <tr><td>Denial of Service</td><td>Resolution DoS</td><td>Caching + fallback</td></tr>
            <tr><td>Elevation of Privilege</td><td>Governance permission abuse</td><td>Multi-signature + timelocks</td></tr>
          </tbody>
        </table>
        <t>PRN nodes <bcp14>MUST</bcp14> implement rate limiting (1000 authenticated requests per minute). The PRN private key <bcp14>SHOULD</bcp14> be stored in an HSM meeting FIPS 140-2 Level 3 or equivalent.</t>
      </section>

      <section anchor="policy-security" numbered="true" toc="default">
        <name>Policy Integrity and Signature Verification</name>
        <t>PRN nodes that enforce AgentPolicyEnvelope policies <bcp14>MUST</bcp14> verify the digital signature on the policy before enforcing any limits. The signature <bcp14>SHOULD</bcp14> be generated using the legal entity's private key (the same key that controls the vLEI credential). PRN nodes <bcp14>MUST</bcp14> check that:</t>
        <ul spacing="normal">
          <li>The signature is cryptographically valid.</li>
          <li>The <tt>issued_at</tt> timestamp is not in the future.</li>
          <li>The <tt>expires_at</tt> timestamp has not passed.</li>
          <li>The <tt>domain</tt> field matches the domain being resolved.</li>
        </ul>
      </section>

      <section anchor="policy-fetching" numbered="true" toc="default">
        <name>Policy Fetching Risks</name>
        <t>Since the <tt>policy</tt> attribute is a URI (e.g., <tt>ipfs://</tt> or <tt>https://</tt>), PRN nodes face the following risks:</t>
        <ul spacing="normal">
          <li><strong>Data unavailability</strong>: the policy content may be unreachable. PRN nodes <bcp14>SHOULD</bcp14> implement caching and retry mechanisms. If a policy cannot be fetched after a configurable number of retries (e.g., 3 attempts), the transaction <bcp14>SHOULD</bcp14> be rejected.</li>
          <li><strong>Tampering in transit</strong>: when using <tt>https://</tt>, TLS <bcp14>MUST</bcp14> be enforced (RFC 8446). When using <tt>ipfs://</tt>, content addressing provides integrity by default (the CID includes a cryptographic hash).</li>
          <li><strong>Policy injection</strong>: malicious actors may attempt to serve forged policies. PRN nodes <bcp14>MUST</bcp14> verify the policy's signature against the vLEI public key before enforcement. Policies that fail signature verification <bcp14>MUST</bcp14> be discarded.</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <!-- IANA -->
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>IANA is requested to assign the following:</t>
      <dl spacing="compact">
        <dt><strong>DNS RR Type for UTXO</strong></dt><dd>Type: UTXO, Suggested value: 260, Reference: this document (Section 2.3).</dd>
        <dt><strong>DNS RR Type for PRNAUDIT</strong></dt><dd>Type: PRNAUDIT, Suggested value: 65401, Reference: this document (Section 3.2.2).</dd>
        <dt><strong>EDNS0 Option for Base Capability</strong></dt><dd>Option Name: UTXO-DNS, Suggested value: 16, Reference: this document (Section 2.4).</dd>
        <dt><strong>EDNS0 Option for PRN</strong></dt><dd>Option Name: PRN-EXT, Suggested value: 65001, Reference: this document (Section 3.2.3).</dd>
        <dt><strong>Media Type application/prn-api+json</strong></dt><dd>Type name: application, Subtype name: prn-api+json, Reference: this document (Section 3.3).</dd>
      </dl>
      <t><strong>Note:</strong> Because this document is Experimental, IANA may defer assignment until a standards-track document requests them. Implementers should use these suggested values only in experimental/private deployments.</t>
      <t><strong>AgentPolicyEnvelope JSON Schema:</strong> This document defines no new IANA registrations for the AgentPolicyEnvelope JSON Schema (Appendix I). The schema is provided as an informative example of an application-layer policy format. Should the community wish to standardize this format, the appropriate venue would be W3C or another organization focused on identity and compliance standards, rather than IANA.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>The authors thank Eric Vyncke (INT AD) for guidance on experimental status and the DNS DISPATCH process, Mohamed Boucadair for proposing the DNSOP DISPATCH presentation, and the DNSOP working group for the opportunity to present this work. The authors also thank GLEIF for the vLEI standard and API, and the broader IETF community for feedback.</t>
    </section>
  </middle>

  <!-- ============================================================ -->

<back>
  <references title="Normative References">
    <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
      <front><title>Key words for use in RFCs to Indicate Requirement Levels</title><author><organization>IETF</organization></author><date year="1997" month="March"/></front>
    </reference>
    <reference anchor="RFC2026" target="https://www.rfc-editor.org/info/rfc2026">
      <front><title>The Internet Standards Process -- Revision 3</title><author><organization>IETF</organization></author><date year="1996" month="October"/></front>
    </reference>
    <reference anchor="RFC6891" target="https://www.rfc-editor.org/info/rfc6891">
      <front><title>Extension Mechanisms for DNS (EDNS0)</title><author><organization>IETF</organization></author><date year="2013" month="April"/></front>
    </reference>
    <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749">
      <front><title>The OAuth 2.0 Authorization Framework</title><author><organization>IETF</organization></author><date year="2012" month="October"/></front>
    </reference>
    <reference anchor="RFC7217" target="https://www.rfc-editor.org/info/rfc7217">
      <front><title>A Method for Generating Semantically Opaque Interface Identifiers with IPv6 Stateless Address Autoconfiguration (SLAAC)</title><author initials="F." surname="Gont"/><date year="2014" month="April"/></front>
    </reference>
    <reference anchor="RFC9381" target="https://www.rfc-editor.org/info/rfc9381">
      <front><title>Verifiable Random Functions (VRFs)</title><author initials="S." surname="Goldberg"/><author initials="L." surname="Reyzin"/><author initials="D." surname="Papadopoulos"/><author initials="J." surname="Vcelak"/><date year="2023" month="August"/></front>
    </reference>
    <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
      <front><title>Concise Binary Object Representation (CBOR)</title><author initials="C." surname="Bormann"/><author initials="P." surname="Hoffman"/><date year="2020" month="December"/></front>
    </reference>
    <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446">
      <front><title>The Transport Layer Security (TLS) Protocol Version 1.3</title><author initials="E." surname="Rescorla"/><date year="2018" month="August"/></front>
    </reference>
    <reference anchor="GG20" target="https://dl.acm.org/doi/10.1145/3243734.3243859">
      <front><title>Fast Multiparty Threshold ECDSA with Fast Trustless Setup</title><author initials="R." surname="Gennaro"/><author initials="S." surname="Goldfeder"/><date year="2018"/></front>
    </reference>
  </references>

  <references title="Informative References">
    <reference anchor="GLEIF-API" target="https://www.gleif.org/en/lei-data/gleif-api">
      <front><title>GLEIF API Service Catalog</title><author><organization>GLEIF</organization></author></front>
    </reference>
    <reference anchor="Vyncke" target="https://www.vyncke.org/myipcolor.php">
      <front><title>myipcolor - IPv6 Address Colour Visualisation</title><author initials="E." surname="Vyncke"/></front>
    </reference>
    <reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259">
      <front><title>The JavaScript Object Notation (JSON) Data Interchange Format</title><author initials="T." surname="Bray"/><date year="2017" month="December"/></front>
    </reference>
  </references>

  <!-- ============================================================ -->
  <!-- APPENDIX A: Error Codes -->
  <section anchor="appendix-a" numbered="true" toc="default">
    <name>Full List of Error Codes</name>
    <table>
      <thead><tr><th>Code</th><th>Name</th><th>Description</th></tr></thead>
      <tbody>
        <tr><td>0</td><td>NOERROR</td><td>Successful completion</td></tr>
        <tr><td>1</td><td>FORMERR</td><td>Format error</td></tr>
        <tr><td>2</td><td>SERVFAIL</td><td>Server failure</td></tr>
        <tr><td>3</td><td>NXDOMAIN</td><td>Domain name does not exist</td></tr>
        <tr><td>4</td><td>NOTIMP</td><td>Function not implemented</td></tr>
        <tr><td>5</td><td>REFUSED</td><td>Query refused</td></tr>
        <tr><td>6</td><td>YXDOMAIN</td><td>Domain name already exists</td></tr>
        <tr><td>7</td><td>YXRRSET</td><td>Resource record set already exists</td></tr>
        <tr><td>8</td><td>NXRRSET</td><td>Resource record set does not exist</td></tr>
        <tr><td>9</td><td>NOTAUTH</td><td>Server not authoritative</td></tr>
        <tr><td>10</td><td>NOTZONE</td><td>Domain name not in zone</td></tr>
        <tr><td>100</td><td>BLOCKCHAIN_ERROR</td><td>Blockchain interaction error</td></tr>
        <tr><td>101</td><td>PROOF_INVALID</td><td>Proof invalid</td></tr>
        <tr><td>102</td><td>DOMAIN_EXPIRED</td><td>Domain name expired</td></tr>
        <tr><td>103</td><td>INSUFFICIENT_FUNDS</td><td>Insufficient funds</td></tr>
        <tr><td>104</td><td>SIGNATURE_INVALID</td><td>Signature invalid</td></tr>
        <tr><td>105</td><td>CONTRACT_ERROR</td><td>Smart contract error</td></tr>
      </tbody>
    </table>
  </section>

  <!-- APPENDIX B: Example Messages -->
  <section anchor="appendix-b" numbered="true" toc="default">
    <name>Example Messages</name>
    <section anchor="b1" numbered="true" toc="default">
      <name>UTXO Query</name>
      <sourcecode type="plaintext">Hex: 5544 01 01 0000 0001 0000 0000 0000 0001 0000 0000 0000 0048 3045 0221...
Decoded:
- Protocol: UTXO-DNS (0x5544)
- Version: 1
- Type: Query (1)
- Message ID: 1
- QType: UTXO (260)
- QClass: IN (1)
- Domain: jmbc.user.test
- EDNS0 option: code 16, data 0x0100</sourcecode>
    </section>

    <section anchor="b2" numbered="true" toc="default">
      <name>UTXO Response</name>
      <sourcecode type="plaintext">Hex: 5544 01 02 0000 0001 0000 0000 0000 0001 0000 0000 00 00 0060...
Decoded:
- RCode: NOERROR (0)
- Answer Count: 1
- UTXO record: version=1, endpoint=..., VRF proof=...
- Legacy IPv6: 2001:db8:1234:5678:9abc:def0:1234:5678</sourcecode>
    </section>

    <section anchor="b3" numbered="true" toc="default">
      <name>VRF Proof Verification Flow</name>
      <sourcecode type="plaintext">Client -&gt; Resolver -&gt; Blockchain node
1. UTXO query (EDNS0 option)
2. Fetch UTXO record + VRF proof
3. Return response + proof
4. Verify VRF proof (RFC 9381) using public key, prefix, UTXO id
5. Compare IID with VRF output</sourcecode>
    </section>
  </section>

  <!-- APPENDIX C: Configuration Examples -->
  <section anchor="appendix-c" numbered="true" toc="default">
    <name>Configuration Examples</name>
    <sourcecode type="yaml"># utxo-dns-resolver.yaml
version: 1.0
network:
  chain_id: "jmbc-mainnet-1"
  rpc_endpoints: ["https://rpc.jmbc.test:8545"]
resolver:
  cache_size: 10000
  cache_ttl: 300
  enable_privacy: true
security:
  require_proof: true</sourcecode>
  </section>

  <!-- APPENDIX D: Colour Visualisation -->
  <section anchor="appendix-d" numbered="true" toc="default">
    <name>IPv6 Address Color Visualisation</name>
    <t>Using Eric Vyncke's tool <xref target="Vyncke"/> at <eref target="https://www.vyncke.org/myipcolor.php"/>, the address 2001:db8:1234:5678:9abc:def0:1234:5678 produces a colour gradient demonstrating that the 64-bit IID can carry arbitrary data. The corner colours are:</t>
    <table>
      <thead><tr><th>Chunk (24 bits)</th><th>RGB</th><th>Colour</th></tr></thead>
      <tbody>
        <tr><td>1a2b3c</td><td>(26,43,60)</td><td>#1A2B3C</td></tr>
        <tr><td>4d5e6f</td><td>(77,94,111)</td><td>#4D5E6F</td></tr>
      </tbody>
    </table>
  </section>

  <!-- APPENDIX E: UTXO6C Compliance Record -->
  <section anchor="appendix-e" numbered="true" toc="default">
    <name>UTXO6C Compliance Record and vLEI Integration</name>
    <t>This appendix defines a DNS RR type UTXO6C (proposed code 261) that binds a GLEIF vLEI to a '.utxo' domain. The RDATA format includes Version, Flags, vLEI DID, KYC Level, Jurisdiction, Last Update, and Status URL. Resolution flow: resolver queries UTXO6C, client verifies with GLEIF API; PRN implementations <bcp14>MUST</bcp14> reject transactions where the vLEI is revoked or expired. Daily vLEI state Merkle roots may be anchored on-chain for offline verification.</t>
  </section>

  <!-- APPENDIX F: CBOR Metadata -->
  <section anchor="appendix-f" numbered="true" toc="default">
    <name>CBOR Domain Metadata Encoding for .utxo TLD</name>
    <t>For .utxo domains, the Endpoint Identifier field of the UTXO RR <bcp14>MUST</bcp14> contain a CBOR-encoded structure according to the following CDDL:</t>
    <sourcecode type="cddl">utxo-domain-data = {
  version: uint .size 1,       ; MUST be 1
  fqdn: tstr,                  ; e.g., "jmbc.user.test.hk."
  owner-pkh: bytes .size 32,   ; SHA-256 of owner public key
  expires: uint .size 4,
  ? records: {
    ? ipv4: bytes .size 4,
    ? ipv6: bytes .size 16,
    ? jmbc-addr: tstr,
    ? crypto-payment: { + text =&gt; text }
  },
  ? vlei-did: tstr,
  ? ttl: uint .size 2,
  ? flags: uint .size 1
}</sourcecode>
    <t>Example JSON representation:</t>
    <sourcecode type="json">{
  "version": 1,
  "fqdn": "jmbc.user.test.",
  "owner-pkh": h'1a2b...',
  "expires": 1735689600,
  "records": {
    "ipv6": h'20010db8000000000000000000000001',
    "crypto-payment": { "eth:usdc": "0xA0b8...", "sol:usdt": "9vN5..." }
  },
  "vlei-did": "did:vlei:254900G9E3Y6L9X1KQ79",
  "ttl": 300
}</sourcecode>
    <t>Resolvers <bcp14>MUST</bcp14> return the raw CBOR bytes as the Endpoint Identifier. Decoding failures result in SERVFAIL. Caching <bcp14>MUST</bcp14> respect min(TTL, expires - now).</t>
  </section>

  <!-- APPENDIX G: OpenAPI Specification -->
  <section anchor="appendix-g" numbered="true" toc="default">
    <name>PRN-API OpenAPI Specification (Excerpt)</name>
    <sourcecode type="yaml">openapi: 3.0.0
info:
  title: PRN-API
  version: 1.0.0
servers:
  - url: https://{prn-node}/api/prn/v1
paths:
  /health:
    get:
      summary: Health check
      responses: { '200': { description: OK } }
  /vlei/verify:
    post:
      summary: Verify vLEI credential
      responses: { '200': { description: Verification result } }
  /audit/daily-summary:
    get:
      parameters:
        - name: date
          in: query
          required: true
          schema: { type: string, format: date }
      responses: { '200': { description: Daily summary } }</sourcecode>
  </section>

  <!-- APPENDIX H: Audit Summary Pseudocode -->
  <section anchor="appendix-h" numbered="true" toc="default">
    <name>Example: Daily Audit Summary Generation (Pseudocode)</name>
    <sourcecode type="python">class PRNNode:
    def generate_daily_summary(self, date):
        txs = self.db.get_transactions(date)
        leaves = [
            sha256(f"{tx.id}|{tx.from_domain}|{tx.to_domain}|{tx.amount}|{tx.timestamp}")
            for tx in txs
        ]
        merkle_root = self.merkle_tree(leaves).root
        summary = {
            "date": date,
            "merkle_root": merkle_root,
            "tx_count": len(txs),
            "total_volume": sum(tx.amount for tx in txs),
            "unique_traders": len(set(tx.from_domain for tx in txs) | set(tx.to_domain for tx in txs)),
            "high_risk_tx_count": sum(1 for tx in txs if tx.risk_score &gt; 80)
        }
        summary["prn_node_signature"] = self.hsm.sign(merkle_root)
        summary["mpc_multi_signature"] = self.request_mpc_signature(merkle_root)
        self.db.store_summary(summary)
        self.publish_prnaudit_rr(summary)
        return summary</sourcecode>
  </section>

  <!-- APPENDIX I: AgentPolicyEnvelope JSON Schema -->
  <section anchor="appendix-i" numbered="true" toc="default">
    <name>AgentPolicyEnvelope JSON Schema (Informative)</name>
    <t>This appendix defines an informative JSON Schema <xref target="RFC8259"/> for the <strong>AgentPolicyEnvelope</strong>, an application-layer policy format used to declare authorization constraints for a .utxo domain. This format is provided as an example of how the <tt>policy</tt> attribute (Section 3.2.1) might be structured. It is <strong>not</strong> on the IETF standards track and is <strong>not</strong> subject to IETF consensus. It is published here to facilitate interoperability of experimental deployments.</t>

    <section anchor="i-schema" numbered="true" toc="default">
      <name>JSON Schema</name>
      <sourcecode type="json">{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["domain", "lei", "per_tx_limit", "daily_limit",
               "allowed_assets", "issued_at", "expires_at", "signature"],
  "properties": {
    "domain": {
      "type": "string",
      "description": "The .utxo domain name this policy applies to"
    },
    "lei": {
      "type": "string",
      "description": "vLEI Legal Entity Identifier (e.g., 254900GLEIF123)"
    },
    "per_tx_limit": {
      "type": "string",
      "description": "Maximum amount per single transaction (e.g., '50 HKD')"
    },
    "daily_limit": {
      "type": "string",
      "description": "Maximum cumulative amount per day (e.g., '200 HKD')"
    },
    "allowed_assets": {
      "type": "array",
      "items": { "type": "string" },
      "description": "List of allowed asset symbols or contract addresses"
    },
    "whitelist": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Optional list of allowed counterparty addresses"
    },
    "issued_at": {
      "type": "integer",
      "description": "UNIX timestamp when the policy was issued"
    },
    "expires_at": {
      "type": "integer",
      "description": "UNIX timestamp when the policy expires"
    },
    "signature": {
      "type": "string",
      "description": "Digital signature over the policy by the legal entity's private key"
    }
  }
}</sourcecode>
    </section>

    <section anchor="i-example" numbered="true" toc="default">
      <name>Example Policy</name>
      <sourcecode type="json">{
  "domain": "gogreen.test",
  "lei": "254900GLEIF123",
  "per_tx_limit": "50 HKD",
  "daily_limit": "200 HKD",
  "allowed_assets": ["HKD"],
  "whitelist": ["0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0"],
  "issued_at": 1717182000,
  "expires_at": 1719782000,
  "signature": "0x3a6b8c9d2e1f4a7b5c8d9e2f3a6b8c9d..."
}</sourcecode>
      <t>In this example, the policy allows the domain <tt>gogreen.test</tt> to transact up to 50 HKD per transaction, with a daily cumulative limit of 200 HKD, using only the HKD asset, and only with the specified counterparty address. The policy is valid from 1717182000 to 1719782000 and is signed by the legal entity that controls the vLEI credential.</t>
      <t><strong>Note:</strong> This format is provided for informational purposes only. Deployments <bcp14>MAY</bcp14> use alternative policy formats as required by local regulations or business logic. Standardization of this format is outside the scope of the IETF.</t>
    </section>
  </section>
</back>

</rfc>