<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-viftode-trustchain-trust-01" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="TrustChain Trust">Trust Computation for the TrustChain Bilateral Ledger Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-viftode-trustchain-trust-01"/>
    <author fullname="Vlad-George Iftode">
      <organization>Delft University of Technology</organization>
      <address>
        <email>vladiftode3@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="09"/>
    <area>Security</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>trust</keyword>
    <keyword>bilateral ledger</keyword>
    <keyword>decentralized</keyword>
    <keyword>Sybil resistance</keyword>
    <keyword>max-flow</keyword>
    <keyword>random walks</keyword>
    <keyword>audit</keyword>
    <keyword>AI agents</keyword>
    <abstract>
      <?line 73?>

<t>This document specifies trust computation, audit recording, delegation,
and key succession mechanisms for the TrustChain bilateral ledger protocol
(draft-pouwelse-trustchain-01).  The base protocol specifies a bilateral
block structure for recording pairwise interactions but explicitly leaves
trust computation out of scope.  This document fills that gap by defining:
(1) a canonical hash computation for cross-implementation compatibility,
(2) an interaction graph constructed from half-block pairs,
(3) pluggable Sybil-resistant path-diversity algorithms over the
interaction graph -- maximum network flow (Edmonds-Karp) and personalized
random walks (MeritRank),
(4) a multiplicative trust score combining connectivity, chain integrity,
and interaction diversity,
(5) an audit block type for single-player recording of agent actions as
a signed, hash-chained log when no counterparty is available,
(6) a delegation protocol for transitive authority with budget splitting
and revocation, (7) a bilateral succession protocol for key rotation, and
(8) a chain anchoring mechanism that binds chain heads to external
time-stamping authorities for evidence-grade deployments.</t>
    </abstract>
  </front>
  <middle>
    <?line 94?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The TrustChain protocol <xref target="I-D.pouwelse-trustchain"/> introduces a bilateral
ledger data structure in which each participant maintains a personal chain
of half-blocks.  Pairwise interactions are recorded as linked proposal-
agreement pairs, creating a tamper-evident record of bilateral history
without global consensus.  The original specification explicitly states
that "trust calculations are out of scope" and defers the mechanism by
which interaction records are converted into trust scores.</t>
      <t>This document specifies the trust computation layer that operates over
TrustChain's bilateral ledger.  The design is grounded in two reference
implementations -- one in Rust and one in Python -- that together pass
more than 900 tests validating algorithmic correctness and cross-language
compatibility.</t>
      <t>The key contributions are:</t>
      <ul spacing="normal">
        <li>
          <t>A canonical block hash computation using sorted-key JSON serialization
and SHA-256, enabling deterministic hashing across implementations.</t>
        </li>
        <li>
          <t>An interaction graph construction where each half-block contributes 0.5
units of edge weight, and two pluggable Sybil-resistant path-diversity
algorithms over that graph: maximum network flow (Edmonds-Karp) from a
set of seed nodes, and personalized random walks (MeritRank)
<xref target="MERITRANK"/>.</t>
        </li>
        <li>
          <t>A multiplicative trust score: trust = connectivity × integrity ×
diversity, where connectivity derives from network flow, integrity
from hash chain verification, and diversity from the number of
distinct interaction partners.  A Sybil gate enforces that if the
network flow component is zero, the overall trust score is zero
regardless of integrity or diversity.</t>
        </li>
        <li>
          <t>A delegation protocol that enables transitive authority via bilateral
half-block pairs, with scope constraints, depth limits, TTL caps,
budget splitting, and unilateral revocation.</t>
        </li>
        <li>
          <t>A bilateral succession protocol for key rotation that preserves
identity continuity through the social graph.</t>
        </li>
        <li>
          <t>An audit block type enabling single-player operation: an agent records
its actions as self-referencing, signed, hash-chained blocks even when
no counterparty is available, with configurable recording levels and
named transaction schemas (<xref target="audit-blocks"/>).</t>
        </li>
        <li>
          <t>A chain anchoring mechanism that periodically binds chain heads to
external time-stamping authorities or transparency logs, so that a
single-player audit log can be verified against its own creator
(<xref target="chain-anchoring"/>).</t>
        </li>
      </ul>
      <section anchor="relationship-to-draft-pouwelse-trustchain-01">
        <name>Relationship to draft-pouwelse-trustchain-01</name>
        <t>This document extends <xref target="I-D.pouwelse-trustchain"/> in several ways:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Additional block fields</strong>: The HalfBlock format adds <tt>block_type</tt>,
<tt>block_hash</tt>, and <tt>timestamp</tt> fields not present in the original TxBlock.</t>
          </li>
          <li>
            <t><strong>Canonical hashing</strong>: The original draft does not specify a hash
computation algorithm.  This document defines one using sorted-key
JSON and SHA-256.</t>
          </li>
          <li>
            <t><strong>Wire format</strong>: JSON is used as the wire format for blocks, in contrast
to the binary encoding implied by the original draft.</t>
          </li>
          <li>
            <t><strong>Additional block types</strong>: Beyond the implicit proposal and agreement
types, this document adds checkpoint, delegation, revocation,
succession, and audit block types.</t>
          </li>
          <li>
            <t><strong>Trust computation</strong>: The entirety of <xref target="trust-computation"/> is new.</t>
          </li>
          <li>
            <t><strong>Delegation and succession</strong>: The entirety of <xref target="delegation"/> and
<xref target="succession"/> is new.</t>
          </li>
        </ul>
        <t>A detailed comparison is provided in <xref target="differences-from-pouwelse"/>.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP 14
<xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals,
as shown here.</t>
      <t>The following terms are used throughout this document:</t>
      <dl>
        <dt>Half-Block:</dt>
        <dd>
          <t>A single block in a participant's personal chain.  Each half-block
records one side of a bilateral interaction.  Two linked half-blocks
(a proposal and an agreement) constitute a complete interaction record.</t>
        </dd>
        <dt>Personal Chain:</dt>
        <dd>
          <t>An append-only sequence of half-blocks maintained by a single
participant, identified by that participant's public key.</t>
        </dd>
        <dt>Proposal:</dt>
        <dd>
          <t>A half-block created by the initiator of an interaction.  Its
<tt>link_sequence_number</tt> is set to 0 (unknown) because the responder
has not yet created their half-block.</t>
        </dd>
        <dt>Agreement:</dt>
        <dd>
          <t>A half-block created by the responder to an interaction.  Its
<tt>link_sequence_number</tt> references the responder's position in their
own chain, and the <tt>link_public_key</tt> matches the proposal's creator.</t>
        </dd>
        <dt>Seed Node:</dt>
        <dd>
          <t>A well-known identity whose trust score is axiomatically 1.0.  Seed
nodes serve as sources in the network flow computation and anchor
the trust graph.</t>
        </dd>
        <dt>Interaction Graph:</dt>
        <dd>
          <t>A directed weighted graph where nodes are public keys and edge weights
represent the volume of bilateral interactions between participants.</t>
        </dd>
        <dt>Sybil Gate:</dt>
        <dd>
          <t>The rule that a participant with zero network flow from the seed set
receives a trust score of zero, regardless of chain integrity.  This
prevents Sybil identities from accumulating trust without genuine
interactions with the trusted subgraph.</t>
        </dd>
        <dt>Delegation:</dt>
        <dd>
          <t>A bilateral agreement that grants one identity (the delegate) the
authority to act on behalf of another (the delegator), subject to
scope and depth constraints.</t>
        </dd>
        <dt>Succession:</dt>
        <dd>
          <t>A bilateral agreement between an old key pair and a new key pair that
transfers identity continuity, enabling key rotation.</t>
        </dd>
      </dl>
    </section>
    <section anchor="data-model">
      <name>Data Model</name>
      <section anchor="halfblock-format">
        <name>HalfBlock Format</name>
        <t>A half-block is the fundamental data unit of TrustChain.  Each half-block
contains the fields defined in <xref target="halfblock-fields"/>.</t>
        <table anchor="halfblock-fields">
          <name>HalfBlock Fields</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Type</th>
              <th align="left">Size (hex)</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">public_key</td>
              <td align="left">String</td>
              <td align="left">64 chars</td>
              <td align="left">Ed25519 public key of the block creator (hex-encoded, 32 bytes)</td>
            </tr>
            <tr>
              <td align="left">sequence_number</td>
              <td align="left">Integer</td>
              <td align="left">-</td>
              <td align="left">Position in the creator's personal chain (&gt;= 1)</td>
            </tr>
            <tr>
              <td align="left">link_public_key</td>
              <td align="left">String</td>
              <td align="left">64 chars</td>
              <td align="left">Ed25519 public key of the counterparty (hex-encoded, 32 bytes)</td>
            </tr>
            <tr>
              <td align="left">link_sequence_number</td>
              <td align="left">Integer</td>
              <td align="left">-</td>
              <td align="left">Counterparty's sequence number; 0 for proposals</td>
            </tr>
            <tr>
              <td align="left">previous_hash</td>
              <td align="left">String</td>
              <td align="left">64 chars</td>
              <td align="left">SHA-256 hash of the previous block in the creator's chain (hex-encoded, 32 bytes)</td>
            </tr>
            <tr>
              <td align="left">signature</td>
              <td align="left">String</td>
              <td align="left">128 chars</td>
              <td align="left">Ed25519 signature over the block_hash (hex-encoded, 64 bytes)</td>
            </tr>
            <tr>
              <td align="left">block_type</td>
              <td align="left">String</td>
              <td align="left">-</td>
              <td align="left">One of: "proposal", "agreement", "checkpoint", "delegation", "revocation", "succession", "audit"</td>
            </tr>
            <tr>
              <td align="left">transaction</td>
              <td align="left">Object</td>
              <td align="left">-</td>
              <td align="left">Application-defined JSON payload</td>
            </tr>
            <tr>
              <td align="left">block_hash</td>
              <td align="left">String</td>
              <td align="left">64 chars</td>
              <td align="left">SHA-256 hash of the block (hex-encoded, 32 bytes)</td>
            </tr>
            <tr>
              <td align="left">timestamp</td>
              <td align="left">Integer</td>
              <td align="left">-</td>
              <td align="left">Block creation time (milliseconds since Unix epoch)</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>sequence_number</tt> MUST be greater than or equal to 1 (GENESIS_SEQ).
The <tt>link_sequence_number</tt> MUST be 0 for proposal blocks and greater
than or equal to 1 for agreement blocks.</t>
      </section>
      <section anchor="block-types">
        <name>Block Types</name>
        <t>Seven block types are defined:</t>
        <dl>
          <dt>Proposal:</dt>
          <dd>
            <t>The initiator's half of a bilateral interaction.  The
<tt>link_sequence_number</tt> is 0 because the responder's block does not
yet exist.</t>
          </dd>
          <dt>Agreement:</dt>
          <dd>
            <t>The responder's half of a bilateral interaction.  Links back to the
proposal via <tt>link_public_key</tt> and <tt>link_sequence_number</tt>.</t>
          </dd>
          <dt>Checkpoint:</dt>
          <dd>
            <t>A self-referencing block that records consensus state or an external
anchor attestation (<xref target="chain-anchoring"/>).  Checkpoint and audit blocks
are the only block types where <tt>public_key</tt> MAY equal
<tt>link_public_key</tt>.</t>
          </dd>
          <dt>Delegation:</dt>
          <dd>
            <t>Records the granting of authority from one identity to another.
Uses the proposal-agreement flow described in <xref target="delegation"/>.</t>
          </dd>
          <dt>Revocation:</dt>
          <dd>
            <t>Records the unilateral revocation of a delegation.  Created only by
the delegator; no bilateral agreement is required.</t>
          </dd>
          <dt>Succession:</dt>
          <dd>
            <t>Records a key rotation from an old identity to a new identity.  Uses
the proposal-agreement flow described in <xref target="succession"/>.</t>
          </dd>
          <dt>Audit:</dt>
          <dd>
            <t>A self-referencing record of a unilateral action, created when no
counterparty is available (single-player mode).  The
<tt>link_public_key</tt> equals the creator's <tt>public_key</tt> and the
<tt>link_sequence_number</tt> is 0.  Audit blocks form a signed,
hash-chained log of an agent's actions; see <xref target="audit-blocks"/>.</t>
          </dd>
        </dl>
        <t>Block type strings are case-insensitive on input but MUST be serialized
as lowercase.</t>
      </section>
      <section anchor="hash-computation">
        <name>Hash Computation</name>
        <t>The block hash MUST be computed using the following algorithm:</t>
        <ol spacing="normal" type="1"><li>
            <t>Construct a key-value map containing the entries listed in
<xref target="hash-input-fields"/>.</t>
          </li>
          <li>
            <t>Sort the map entries lexicographically by key.</t>
          </li>
          <li>
            <t>Serialize the sorted map as compact JSON with no extraneous
whitespace (no spaces after colons or commas).</t>
          </li>
          <li>
            <t>Compute the SHA-256 digest <xref target="FIPS-180-4"/> of the UTF-8 encoding
of the JSON string.</t>
          </li>
          <li>
            <t>Encode the 32-byte digest as lowercase hexadecimal (64 characters).</t>
          </li>
        </ol>
        <table anchor="hash-input-fields">
          <name>Hash Input Fields</name>
          <thead>
            <tr>
              <th align="left">Key</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">"block_type"</td>
              <td align="left">The block's type string</td>
            </tr>
            <tr>
              <td align="left">"link_public_key"</td>
              <td align="left">The counterparty's public key</td>
            </tr>
            <tr>
              <td align="left">"link_sequence_number"</td>
              <td align="left">The counterparty's sequence number (integer)</td>
            </tr>
            <tr>
              <td align="left">"previous_hash"</td>
              <td align="left">Hash of the previous block in the chain</td>
            </tr>
            <tr>
              <td align="left">"public_key"</td>
              <td align="left">The creator's public key</td>
            </tr>
            <tr>
              <td align="left">"sequence_number"</td>
              <td align="left">The creator's sequence number (integer)</td>
            </tr>
            <tr>
              <td align="left">"signature"</td>
              <td align="left">The empty string ""</td>
            </tr>
            <tr>
              <td align="left">"timestamp"</td>
              <td align="left">The block's timestamp (integer, milliseconds)</td>
            </tr>
            <tr>
              <td align="left">"transaction"</td>
              <td align="left">The transaction payload (JSON value)</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>signature</tt> field MUST always be set to the empty string <tt>""</tt>
during hash computation.  This ensures the hash is deterministic and
can be computed before signing.</t>
        <t>Implementations MUST use a sorted-key map (e.g., BTreeMap in Rust,
OrderedDict with sorted keys in Python) to guarantee canonical key
ordering across languages and platforms.</t>
      </section>
      <section anchor="signature-scheme">
        <name>Signature Scheme</name>
        <t>All signatures use Ed25519 <xref target="RFC8032"/>.</t>
        <t>To sign a block:</t>
        <ol spacing="normal" type="1"><li>
            <t>Compute the <tt>block_hash</tt> as specified in <xref target="hash-computation"/>.</t>
          </li>
          <li>
            <t>Compute the Ed25519 signature over the UTF-8 bytes of the
hex-encoded <tt>block_hash</tt> string.</t>
          </li>
          <li>
            <t>Encode the 64-byte signature as lowercase hexadecimal (128 characters).</t>
          </li>
        </ol>
        <t>To verify a block signature:</t>
        <ol spacing="normal" type="1"><li>
            <t>Decode the <tt>public_key</tt> from hexadecimal to obtain the 32-byte
Ed25519 public key.</t>
          </li>
          <li>
            <t>Decode the <tt>signature</tt> from hexadecimal to obtain the 64-byte
Ed25519 signature.</t>
          </li>
          <li>
            <t>Verify the signature over the UTF-8 bytes of the hex-encoded
<tt>block_hash</tt> string.</t>
          </li>
        </ol>
        <t>Note that the signature is computed over the hex string representation
of the block hash, not the raw hash bytes.</t>
      </section>
      <section anchor="validation-invariants">
        <name>Block Validation Invariants</name>
        <t>Implementations MUST validate the following invariants for every
received block.  A block that fails any check MUST be considered
invalid.</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Sequence number range</strong>: <tt>sequence_number</tt> &gt;= 1.</t>
          </li>
          <li>
            <t><strong>Link sequence number range</strong>: <tt>link_sequence_number</tt> is either 0
or &gt;= 1.</t>
          </li>
          <li>
            <t><strong>Public key format</strong>: <tt>public_key</tt> is exactly 64 hexadecimal
characters.</t>
          </li>
          <li>
            <t><strong>Signature validity</strong>: The Ed25519 signature over the <tt>block_hash</tt>
verifies against the <tt>public_key</tt>.</t>
          </li>
          <li>
            <t><strong>Link public key format</strong>: If <tt>link_public_key</tt> is non-empty, it
MUST be exactly 64 hexadecimal characters.</t>
          </li>
          <li>
            <t><strong>No self-signed blocks</strong>: <tt>public_key</tt> MUST NOT equal
<tt>link_public_key</tt>, unless <tt>block_type</tt> is "checkpoint" or "audit".</t>
          </li>
          <li>
            <t><strong>Genesis hash consistency (forward)</strong>: If <tt>sequence_number</tt> is 1,
then <tt>previous_hash</tt> MUST be the genesis hash (64 zero characters:
<tt>"0000...0000"</tt>).</t>
          </li>
          <li>
            <t><strong>Genesis hash consistency (reverse)</strong>: If <tt>sequence_number</tt> is not
1, then <tt>previous_hash</tt> MUST NOT be the genesis hash.</t>
          </li>
          <li>
            <t><strong>Previous hash format</strong>: If <tt>previous_hash</tt> is not the genesis
hash, it MUST be exactly 64 hexadecimal characters.</t>
          </li>
          <li>
            <t><strong>Future timestamp tolerance</strong>: <tt>timestamp</tt> MUST NOT exceed the
current time plus 300,000 milliseconds (5 minutes).</t>
          </li>
        </ol>
      </section>
      <section anchor="constants">
        <name>Constants</name>
        <t>The following constants are defined for use throughout this
specification:</t>
        <table anchor="constants-table">
          <name>Protocol Constants</name>
          <thead>
            <tr>
              <th align="left">Constant</th>
              <th align="left">Value</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">GENESIS_HASH</td>
              <td align="left">64 '0' characters</td>
              <td align="left">Previous hash for the first block in any chain</td>
            </tr>
            <tr>
              <td align="left">GENESIS_SEQ</td>
              <td align="left">1</td>
              <td align="left">First valid sequence number</td>
            </tr>
            <tr>
              <td align="left">UNKNOWN_SEQ</td>
              <td align="left">0</td>
              <td align="left">Link sequence number for proposals</td>
            </tr>
            <tr>
              <td align="left">CONNECTIVITY_THRESHOLD (K)</td>
              <td align="left">3.0</td>
              <td align="left">Path diversity divisor for connectivity factor</td>
            </tr>
            <tr>
              <td align="left">DIVERSITY_THRESHOLD (M)</td>
              <td align="left">5.0</td>
              <td align="left">Unique peer divisor for diversity factor</td>
            </tr>
            <tr>
              <td align="left">MAX_DELEGATION_TTL</td>
              <td align="left">2,592,000,000 ms (30 days)</td>
              <td align="left">Maximum delegation time-to-live</td>
            </tr>
            <tr>
              <td align="left">FUTURE_TIMESTAMP_TOLERANCE</td>
              <td align="left">300,000 milliseconds (5 minutes)</td>
              <td align="left">Maximum acceptable clock drift</td>
            </tr>
            <tr>
              <td align="left">EPSILON</td>
              <td align="left">1e-10</td>
              <td align="left">Floating-point zero threshold</td>
            </tr>
            <tr>
              <td align="left">MERITRANK_NUM_WALKS</td>
              <td align="left">10,000</td>
              <td align="left">Default number of random walks (MeritRank)</td>
            </tr>
            <tr>
              <td align="left">MERITRANK_ALPHA</td>
              <td align="left">0.85</td>
              <td align="left">Walk continuation probability (MeritRank)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="protocol-operations">
      <name>Protocol Operations</name>
      <section anchor="proposal-agreement">
        <name>Proposal-Agreement Flow</name>
        <t>A bilateral interaction proceeds in four phases:</t>
        <section anchor="phase-1a-create-proposal">
          <name>Phase 1a: Create Proposal</name>
          <t>The initiator creates a proposal half-block:</t>
          <ol spacing="normal" type="1"><li>
              <t>Validate that <tt>counterparty_pubkey</tt> is exactly 64 hexadecimal
characters.</t>
            </li>
            <li>
              <t>Validate that <tt>counterparty_pubkey</tt> does not equal the initiator's
own public key (self-proposals are forbidden).</t>
            </li>
            <li>
              <t>Set <tt>sequence_number</tt> to one greater than the highest sequence
number in the initiator's chain.</t>
            </li>
            <li>
              <t>Set <tt>previous_hash</tt> to the <tt>block_hash</tt> of the current chain head,
or GENESIS_HASH if this is the first block.</t>
            </li>
            <li>
              <t>Set <tt>link_public_key</tt> to <tt>counterparty_pubkey</tt>.</t>
            </li>
            <li>
              <t>Set <tt>link_sequence_number</tt> to 0 (UNKNOWN_SEQ).</t>
            </li>
            <li>
              <t>Set <tt>block_type</tt> to "proposal".</t>
            </li>
            <li>
              <t>Compute <tt>block_hash</tt> per <xref target="hash-computation"/>.</t>
            </li>
            <li>
              <t>Sign the block per the signature scheme.</t>
            </li>
            <li>
              <t>Store the block in the local chain.</t>
            </li>
          </ol>
        </section>
        <section anchor="phase-1b-receive-proposal">
          <name>Phase 1b: Receive Proposal</name>
          <t>The responder receives and validates the proposal:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify that <tt>block_type</tt> is "proposal".</t>
            </li>
            <li>
              <t>Verify that <tt>link_public_key</tt> matches the responder's own public key.</t>
            </li>
            <li>
              <t>Validate block invariants per <xref target="validation-invariants"/>.</t>
            </li>
            <li>
              <t>Check for double-sign and double-countersign fraud (see
<xref target="double-spend-detection"/>).</t>
            </li>
            <li>
              <t>Store the proposal.</t>
            </li>
          </ol>
          <t>Implementations SHOULD warn on sequence number gaps but MUST NOT
reject blocks solely due to gaps, as blocks may arrive out of order
during chain crawling.</t>
        </section>
        <section anchor="phase-2a-create-agreement">
          <name>Phase 2a: Create Agreement</name>
          <t>The responder creates an agreement half-block:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify that the received block is a proposal.</t>
            </li>
            <li>
              <t>Verify that <tt>link_public_key</tt> matches the responder's own public key.</t>
            </li>
            <li>
              <t>Verify the proposal's signature.</t>
            </li>
            <li>
              <t>Set <tt>sequence_number</tt> to one greater than the highest sequence
number in the responder's chain.</t>
            </li>
            <li>
              <t>Set <tt>previous_hash</tt> to the <tt>block_hash</tt> of the current chain head,
or GENESIS_HASH if this is the first block.</t>
            </li>
            <li>
              <t>Set <tt>link_public_key</tt> to the proposal's <tt>public_key</tt>.</t>
            </li>
            <li>
              <t>Set <tt>link_sequence_number</tt> to the proposal's <tt>sequence_number</tt>.</t>
            </li>
            <li>
              <t>Set <tt>block_type</tt> to "agreement".</t>
            </li>
            <li>
              <t>Set <tt>transaction</tt> to an exact copy of the proposal's <tt>transaction</tt>.
Note: delegation and succession agreements MAY modify the
<tt>outcome</tt> field in the transaction (e.g., from "proposed" to
"accepted") while keeping all other fields identical.</t>
            </li>
            <li>
              <t>Compute <tt>block_hash</tt> per <xref target="hash-computation"/>.</t>
            </li>
            <li>
              <t>Sign the block.</t>
            </li>
            <li>
              <t>Store the block.</t>
            </li>
          </ol>
        </section>
        <section anchor="phase-2b-receive-agreement">
          <name>Phase 2b: Receive Agreement</name>
          <t>The initiator receives and validates the agreement:</t>
          <ol spacing="normal" type="1"><li>
              <t>Verify that <tt>block_type</tt> is "agreement".</t>
            </li>
            <li>
              <t>Verify that <tt>link_public_key</tt> matches the initiator's own public key.</t>
            </li>
            <li>
              <t>Validate block invariants per <xref target="validation-invariants"/>.</t>
            </li>
            <li>
              <t>Retrieve the linked proposal from the local store at
<tt>link_sequence_number</tt>.</t>
            </li>
            <li>
              <t>Verify counterparty identity: the agreement's <tt>public_key</tt> MUST
equal the proposal's <tt>link_public_key</tt>.</t>
            </li>
            <li>
              <t>Verify that the linked block is a proposal.</t>
            </li>
            <li>
              <t>Verify that the agreement's <tt>transaction</tt> exactly matches the
proposal's <tt>transaction</tt>.</t>
            </li>
            <li>
              <t>Check for fraud and store the agreement.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="chain-crawling">
        <name>Chain Crawling</name>
        <t>Chain crawling is the mechanism by which a participant discovers the
full chain of a counterparty.  A participant MAY request any portion
of another participant's chain by specifying a public key and a
sequence number range.</t>
        <t>When crawling:</t>
        <ul spacing="normal">
          <li>
            <t>Implementations SHOULD validate each received block per
<xref target="validation-invariants"/>.</t>
          </li>
          <li>
            <t>Sequence gaps SHOULD generate warnings but MUST NOT cause rejection
of valid blocks.</t>
          </li>
          <li>
            <t>Hash chain continuity (each block's <tt>previous_hash</tt> matching the
prior block's <tt>block_hash</tt>) SHOULD be verified.</t>
          </li>
        </ul>
      </section>
      <section anchor="double-spend-detection">
        <name>Double-Spend Detection</name>
        <t>Two forms of fraud are detectable through the bilateral ledger:</t>
        <dl>
          <dt>Double-Sign Fraud:</dt>
          <dd>
            <t>Two different blocks exist with the same <tt>(public_key,
sequence_number)</tt> pair but different content.  This indicates the
chain owner created a fork in their personal chain.</t>
          </dd>
          <dt>Double-Countersign Fraud:</dt>
          <dd>
            <t>A block's <tt>link_public_key</tt> and <tt>link_sequence_number</tt> reference a
proposal that already has a different agreement linked to it.  This
indicates the chain owner countersigned conflicting interactions.</t>
          </dd>
        </dl>
        <t>Implementations MUST check for both forms of fraud when receiving
blocks.  Detected fraud MUST be recorded and SHOULD be propagated
to peers during chain crawling.</t>
        <t>When a participant has recorded double-spend fraud, their trust score
is set to 0.0 (see <xref target="score-composition"/>).</t>
      </section>
    </section>
    <section anchor="audit-blocks">
      <name>Audit Blocks</name>
      <t>The bilateral proposal-agreement flow requires a counterparty.  Many
agent actions have none: invoking a local tool, calling a third-party
API that does not speak this protocol, or recording an internal
decision.  Audit blocks extend the personal chain to these unilateral
events, turning it into a signed, hash-chained log of an agent's
actions ("single-player mode").</t>
      <section anchor="audit-block-creation">
        <name>Audit Block Creation</name>
        <t>To create an audit block, a participant:</t>
        <ol spacing="normal" type="1"><li>
            <t>Sets <tt>sequence_number</tt> to the next position in its own chain and
<tt>previous_hash</tt> to the current chain head, exactly as for any other
block type.</t>
          </li>
          <li>
            <t>Sets <tt>link_public_key</tt> to its own public key (self-referencing) and
<tt>link_sequence_number</tt> to 0.</t>
          </li>
          <li>
            <t>Sets <tt>block_type</tt> to "audit" and places the event payload in
<tt>transaction</tt>.</t>
          </li>
          <li>
            <t>Computes the hash and signature as specified in
<xref target="hash-computation"/>.</t>
          </li>
        </ol>
        <t>If a transaction schema is configured (<xref target="audit-schemas"/>), the payload
MUST be validated against the schema before the block is created.  When
multiple audit blocks are created as a batch, implementations SHOULD
validate all payloads before creating any block, so that a batch is
recorded atomically or not at all.</t>
        <t>Audit blocks interleave freely with bilateral blocks in the same
personal chain; the chain remains a single append-only sequence.</t>
      </section>
      <section anchor="recording-levels">
        <name>Recording Levels</name>
        <t>Implementations MAY classify audit events by semantic type and control
recording volume through a configured level.  Seven event types are
defined, serialized in snake_case:</t>
        <table anchor="event-types">
          <name>Audit Event Types</name>
          <thead>
            <tr>
              <th align="left">Event Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">tool_call</td>
              <td align="left">Agent invoked a tool (name, argument hash, result hash)</td>
            </tr>
            <tr>
              <td align="left">llm_decision</td>
              <td align="left">Model completion (model, input/output hashes, token count)</td>
            </tr>
            <tr>
              <td align="left">error</td>
              <td align="left">Failures, exceptions, retries</td>
            </tr>
            <tr>
              <td align="left">state_change</td>
              <td align="left">Configuration changes, permission grants, mode switches</td>
            </tr>
            <tr>
              <td align="left">human_override</td>
              <td align="left">Human-in-the-loop intervention</td>
            </tr>
            <tr>
              <td align="left">external_api</td>
              <td align="left">Third-party API calls (URL, status, timing)</td>
            </tr>
            <tr>
              <td align="left">raw_http</td>
              <td align="left">Every HTTP request and response (forensics)</td>
            </tr>
          </tbody>
        </table>
        <t>Three recording levels are defined:</t>
        <dl>
          <dt>Minimal:</dt>
          <dd>
            <t>Records <tt>tool_call</tt> and <tt>error</tt> events only.</t>
          </dd>
          <dt>Standard:</dt>
          <dd>
            <t>Adds <tt>llm_decision</tt>, <tt>state_change</tt>, and <tt>human_override</tt>.  This is
the RECOMMENDED default.</t>
          </dd>
          <dt>Comprehensive:</dt>
          <dd>
            <t>Records all event types, including <tt>external_api</tt> and <tt>raw_http</tt>.</t>
          </dd>
        </dl>
        <t>A configuration MAY additionally enable or disable individual event
types, overriding the level defaults.  When no configuration is
present, all events are recorded.</t>
      </section>
      <section anchor="audit-schemas">
        <name>Transaction Schemas</name>
        <t>Audit transaction payloads are application-defined JSON by default.
Deployments that present audit chains to third parties SHOULD configure
a named schema that defines required payload fields.  Three built-in
schemas are defined:</t>
        <table anchor="schema-table">
          <name>Built-in Audit Transaction Schemas</name>
          <thead>
            <tr>
              <th align="left">Schema</th>
              <th align="left">Required Fields</th>
              <th align="left">Purpose</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">base</td>
              <td align="left">action, outcome</td>
              <td align="left">Minimal action record</td>
            </tr>
            <tr>
              <td align="left">ai_act</td>
              <td align="left">action, outcome, model, input_hash, output_hash</td>
              <td align="left">EU AI Act Article 12 record-keeping alignment</td>
            </tr>
            <tr>
              <td align="left">aiuc1</td>
              <td align="left">action, outcome, policy_id, compliance_status</td>
              <td align="left">AIUC-1 agent governance alignment</td>
            </tr>
          </tbody>
        </table>
        <t>Payloads MAY carry additional fields beyond those required.  Schema
identifiers are case-insensitive on input.</t>
      </section>
      <section anchor="audit-trust-semantics">
        <name>Trust Semantics of Audit Blocks</name>
        <t>Audit blocks are self-attested.  They count toward chain integrity
(<xref target="chain-integrity"/>) and recency, but they are excluded from the
interaction graph (<xref target="graph-construction"/>) and therefore earn no
connectivity or diversity credit.  An identity cannot raise its trust
score by writing audit blocks; the Sybil gate is unaffected.</t>
        <t>The evidentiary value of an audit chain rests on hash chaining,
signatures, and external anchoring (<xref target="chain-anchoring"/>).  The
limitations of self-attested records, and the rewriting attack they
admit without anchoring, are discussed in <xref target="chain-rewriting"/>.</t>
      </section>
    </section>
    <section anchor="trust-computation">
      <name>Trust Computation</name>
      <section anchor="graph-construction">
        <name>Interaction Graph Construction</name>
        <t>The interaction graph is a directed weighted graph G = (V, E, w) where:</t>
        <ul spacing="normal">
          <li>
            <t>V is the set of all public keys that have created at least one block.</t>
          </li>
          <li>
            <t>E is the set of directed edges between public keys.</t>
          </li>
          <li>
            <t>w: E -&gt; R+ assigns a non-negative weight to each edge.</t>
          </li>
        </ul>
        <t>The graph is constructed as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>For each public key p in the block store:
a. Retrieve all blocks in p's chain.
b. For each block b in p's chain:
            </t>
            <ul spacing="normal">
              <li>
                <t>If b.public_key equals b.link_public_key, skip (exclude
self-loops).</t>
              </li>
              <li>
                <t>Add 0.5 to the edge weight w(b.public_key, b.link_public_key).</t>
              </li>
            </ul>
          </li>
        </ol>
        <t>Each half-block contributes 0.5 units of edge weight.  A complete
bilateral interaction (one proposal and one agreement) contributes
1.0 total: 0.5 from the proposal's creator and 0.5 from the
agreement's creator.</t>
        <t>Self-loops (blocks where <tt>public_key</tt> equals <tt>link_public_key</tt>) MUST
be excluded from the graph.  The block types permitting this equality
are "checkpoint" and "audit" (<xref target="audit-blocks"/>); neither represents an
interaction between distinct parties, and both MUST be excluded from
the interaction graph.</t>
      </section>
      <section anchor="max-flow">
        <name>Maximum Network Flow</name>
        <t>The network flow trust score for a target identity t is computed
using the Edmonds-Karp maximum flow algorithm with a super-source
construction.</t>
        <section anchor="super-source-construction">
          <name>Super-Source Construction</name>
          <ol spacing="normal" type="1"><li>
              <t>Let S be the set of seed nodes.</t>
            </li>
            <li>
              <t>Create a virtual super-source node s_0.</t>
            </li>
            <li>
              <t>For each seed node s_i in S:
a. Compute the total outflow: <tt>outflow(s_i) = sum of w(s_i, v)
   for all v adjacent to s_i</tt>.
b. Add an edge from s_0 to s_i with capacity equal to
   <tt>outflow(s_i)</tt>.
c. Accumulate the total seed outflow: <tt>total_outflow +=
   outflow(s_i)</tt>.</t>
            </li>
            <li>
              <t>If <tt>total_outflow</tt> is 0, the trust score for any target is 0.0.</t>
            </li>
          </ol>
          <t>The super-source capacity for each seed equals that seed's total
outflow in the interaction graph.  This ensures that a seed's
influence on trust scores is proportional to its interaction volume.</t>
        </section>
        <section anchor="edmonds-karp">
          <name>Edmonds-Karp Algorithm</name>
          <t>The trust score for target t is:</t>
          <artwork><![CDATA[
trust_netflow(t) = min(max_flow(s_0, t) / total_outflow, 1.0)
]]></artwork>
          <t>where max_flow(s_0, t) is computed using the Edmonds-Karp algorithm
(BFS-based Ford-Fulkerson):</t>
          <artwork><![CDATA[
function edmonds_karp(capacity, source, sink):
    total_flow = 0.0
    loop:
        // BFS phase: find shortest augmenting path
        parent = {}
        visited = {source}
        queue = [source]
        while queue is not empty:
            node = dequeue(queue)
            if node == sink:
                break
            for each neighbor next with capacity[node][next] > EPSILON:
                if next not in visited:
                    visited = visited + {next}
                    parent[next] = node
                    enqueue(queue, next)
        if sink not in parent:
            break  // no augmenting path exists
        // Find bottleneck capacity along the path
        path_flow = infinity
        node = sink
        while node in parent:
            prev = parent[node]
            path_flow = min(path_flow, capacity[prev][node])
            node = prev
        // Update residual graph
        node = sink
        while node in parent:
            prev = parent[node]
            capacity[prev][node] -= path_flow
            capacity[node][prev] += path_flow
            node = prev
        total_flow += path_flow
    return total_flow
]]></artwork>
          <t>The EPSILON threshold (1e-10) is used to treat near-zero capacities
as zero, avoiding infinite loops due to floating-point imprecision.</t>
          <t>If the target is a seed node, the trust score is 1.0 by definition,
without running the max-flow computation.</t>
        </section>
        <section anchor="complexity-note">
          <name>Complexity Note</name>
          <t>The Edmonds-Karp algorithm runs in O(V * E^2) time.  For typical
TrustChain deployments, the interaction graph is sparse and the
max-flow computation is fast relative to graph construction.
Implementations MAY substitute alternative max-flow algorithms (e.g.,
Dinic's algorithm) provided they produce identical results.</t>
        </section>
      </section>
      <section anchor="meritrank">
        <name>Personalized Random Walks (MeritRank)</name>
        <t>As an alternative to maximum network flow, implementations MAY compute
path diversity using MeritRank <xref target="MERITRANK"/>, a Sybil-tolerant
reputation algorithm based on Monte Carlo personalized random walks.</t>
        <t>The algorithm operates on the same interaction graph defined in
<xref target="graph-construction"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>From the seed set, perform MERITRANK_NUM_WALKS random walks
(default 10,000).  At each step a walk continues with probability
MERITRANK_ALPHA (default 0.85), moving to a neighbor chosen with
probability proportional to edge weight, and terminates otherwise.</t>
          </li>
          <li>
            <t>The path-diversity score for a target t is the visit frequency of
t across all walks, normalized to [0, 1].</t>
          </li>
          <li>
            <t>Identities with recorded double-spend fraud receive negative-weight
counterpart edges on all edges pointing toward them, so that walks
penalize trust flowing through fraudulent nodes.</t>
          </li>
        </ol>
        <t>MeritRank bounds the benefit of Sybil attacks through decay rather
than a strict flow cutoff.  This tolerates sparse but legitimate
topologies better than max-flow, at the cost of probabilistic rather
than exact scores.  Because the computation is randomized,
implementations SHOULD use a walk count high enough that score
variance is small relative to decision thresholds.</t>
      </section>
      <section anchor="algorithm-selection">
        <name>Algorithm Selection</name>
        <t>The connectivity factor in <xref target="score-composition"/> consumes a
path-diversity score in [0, 1] produced by either <xref target="max-flow"/> or
<xref target="meritrank"/>.  Implementations MUST support at least one algorithm
and MUST document which algorithm produced a reported score.  Scores
produced by different algorithms are not directly comparable;
deployments that compare trust scores across participants MUST use a
single algorithm consistently.  The Sybil gate in
<xref target="score-composition"/> applies identically under both algorithms.</t>
      </section>
      <section anchor="chain-integrity">
        <name>Chain Integrity Score</name>
        <t>The chain integrity score measures the fraction of a participant's
chain that passes structural verification:</t>
        <artwork><![CDATA[
function chain_integrity(pubkey):
    chain = get_chain(pubkey)
    if chain is empty:
        return 1.0
    total = length(chain)
    for i = 0 to total - 1:
        expected_seq = i + 1
        if chain[i].sequence_number != expected_seq:
            return i / total  // sequence gap detected
        if i == 0:
            expected_prev = GENESIS_HASH
        else:
            expected_prev = chain[i - 1].block_hash
        if chain[i].previous_hash != expected_prev:
            return i / total  // hash chain break detected
        if not verify_signature(chain[i]):
            return i / total  // invalid signature detected
    return 1.0
]]></artwork>
        <t>An empty chain returns 1.0 (no evidence of misbehavior).  The score
represents the fraction of the chain that is internally consistent
before the first detected anomaly.</t>
        <t>If a checkpoint is available and a block's sequence number falls at
or before the checkpoint's recorded head for that public key,
implementations MAY skip signature verification for that block
(the checkpoint attests to its validity).</t>
      </section>
      <section anchor="score-composition">
        <name>Score Composition</name>
        <t>The trust score for a participant with public key p is computed as
the product of three factors: connectivity, integrity, and diversity.
The multiplicative composition ensures that weakness in any single
factor cannot be compensated by strength in the others.</t>
        <artwork><![CDATA[
function compute_trust(p):
    if double_spend_fraud_recorded(p):
        return 0.0

    integrity = chain_integrity(p)
    unique_peers = count_distinct_interaction_partners(p)
    diversity = min(unique_peers / DIVERSITY_THRESHOLD, 1.0)

    if seed_nodes are configured:
        if p is a seed node:
            return 1.0
        path_diversity = path_diversity(p)  // max-flow or MeritRank
        if path_diversity < EPSILON:
            return 0.0  // Sybil gate
        connectivity = min(path_diversity / CONNECTIVITY_THRESHOLD, 1.0)
        return clamp(connectivity * integrity * diversity, 0.0, 1.0)

    // No seeds: integrity only (no Sybil resistance).
    return integrity
]]></artwork>
        <t>The three factors are:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Connectivity</strong> = min(path_diversity / K, 1.0), where path_diversity
is computed by the configured algorithm: maximum network flow from
the seed super-source to the target (<xref target="max-flow"/>) or MeritRank
visit frequency (<xref target="meritrank"/>).  K = CONNECTIVITY_THRESHOLD (default 3.0)
represents the number of independent paths needed for full
connectivity credit.</t>
          </li>
          <li>
            <t><strong>Integrity</strong> = chain_integrity(p), the fraction of the participant's
chain with valid hash linkage, sequence numbering, and signatures
(see <xref target="chain-integrity"/>).</t>
          </li>
          <li>
            <t><strong>Diversity</strong> = min(unique_peers / M, 1.0), where unique_peers is the
number of distinct interaction partners in the participant's chain.
M = DIVERSITY_THRESHOLD (default 5.0) represents the number of
distinct peers needed for full diversity credit.</t>
          </li>
        </ul>
        <t>The Sybil gate is critical: when seed nodes are configured and the
path diversity is below EPSILON (1e-10), the trust score MUST be
0.0 regardless of the integrity or diversity scores.  This prevents
an attacker from creating isolated chains with perfect integrity to
gain trust without genuine interactions with the trusted subgraph.</t>
        <t>The multiplicative composition means that an attacker who achieves
high connectivity through a single path but interacts with only one
peer receives a low score (diversity penalty), and an attacker who
fabricates many peers but has no path from the seeds receives zero
(Sybil gate).</t>
        <t>When no seed nodes are configured, the trust score degrades to
chain integrity only.  Connectivity and diversity default to 1.0
since there is no topology to measure.  This mode provides no Sybil
resistance and SHOULD only be used in closed deployments where all
participants are pre-authenticated.</t>
      </section>
      <section anchor="incremental-graph-updates">
        <name>Incremental Graph Updates</name>
        <t>The interaction graph MAY be cached and updated incrementally.
An implementation SHOULD track, for each public key, the highest
sequence number already incorporated into the graph.  When
recomputing trust:</t>
        <ol spacing="normal" type="1"><li>
            <t>For each public key, compare the current chain length against
the previously recorded sequence number.</t>
          </li>
          <li>
            <t>Only process new blocks (those with sequence numbers beyond the
recorded position).</t>
          </li>
          <li>
            <t>Update edge weights in the cached graph.</t>
          </li>
        </ol>
        <t>This avoids rescanning the entire block store on every trust query.</t>
      </section>
    </section>
    <section anchor="delegation">
      <name>Delegation</name>
      <section anchor="delegation-record">
        <name>Delegation Record</name>
        <t>A delegation is represented by a DelegationRecord with the following
fields:</t>
        <table anchor="delegation-record-fields">
          <name>DelegationRecord Fields</name>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">delegation_id</td>
              <td align="left">String</td>
              <td align="left">Unique ID (hex)</td>
            </tr>
            <tr>
              <td align="left">delegator_pubkey</td>
              <td align="left">String</td>
              <td align="left">Delegator's public key</td>
            </tr>
            <tr>
              <td align="left">delegate_pubkey</td>
              <td align="left">String</td>
              <td align="left">Delegate's public key</td>
            </tr>
            <tr>
              <td align="left">scope</td>
              <td align="left">Array</td>
              <td align="left">Allowed types; empty=all</td>
            </tr>
            <tr>
              <td align="left">max_depth</td>
              <td align="left">Integer</td>
              <td align="left">Sub-delegation depth cap</td>
            </tr>
            <tr>
              <td align="left">issued_at</td>
              <td align="left">Integer</td>
              <td align="left">Issuance time (ms epoch)</td>
            </tr>
            <tr>
              <td align="left">expires_at</td>
              <td align="left">Integer</td>
              <td align="left">Expiry time (ms epoch)</td>
            </tr>
            <tr>
              <td align="left">delegation_block_hash</td>
              <td align="left">String</td>
              <td align="left">Delegator's proposal hash</td>
            </tr>
            <tr>
              <td align="left">agreement_block_hash</td>
              <td align="left">String?</td>
              <td align="left">Delegate's agreement hash</td>
            </tr>
            <tr>
              <td align="left">parent_delegation_id</td>
              <td align="left">String?</td>
              <td align="left">Parent delegation ID</td>
            </tr>
            <tr>
              <td align="left">revoked</td>
              <td align="left">Boolean</td>
              <td align="left">Revocation flag</td>
            </tr>
            <tr>
              <td align="left">revocation_block_hash</td>
              <td align="left">String?</td>
              <td align="left">Revocation block hash</td>
            </tr>
          </tbody>
        </table>
        <t>The <tt>delegation_id</tt> is computed as the SHA-256 hash of the string
<tt>"delegator_pubkey:delegate_pubkey:timestamp"</tt>, encoded as hexadecimal.
Fields marked with "?" are nullable (may be absent).  The <tt>scope</tt>
field is a JSON array of interaction type strings; an empty array
indicates unrestricted delegation.  The <tt>max_depth</tt> field controls
sub-delegation: 0 means no sub-delegation is permitted, with a
maximum value of 2.  Timestamps (<tt>issued_at</tt>, <tt>expires_at</tt>) are
in milliseconds since the Unix epoch.</t>
      </section>
      <section anchor="scope-and-depth-constraints">
        <name>Scope and Depth Constraints</name>
        <dl>
          <dt>Scope:</dt>
          <dd>
            <t>A delegation's <tt>scope</tt> is a list of interaction type strings (e.g.,
["compute", "storage"]).  An empty scope means the delegate is
unrestricted.  When creating a proposal that involves a delegated
identity, the proposal's <tt>interaction_type</tt> in the transaction
MUST be included in the delegate's scope (if the scope is non-empty).</t>
          </dd>
          <dt>Depth:</dt>
          <dd>
            <t>The <tt>max_depth</tt> field controls sub-delegation.  A value of 0 means
the delegate MUST NOT further delegate.  A value of 1 means the
delegate may create one level of sub-delegation.  The maximum
permitted value is 2.</t>
          </dd>
        </dl>
        <t>Sub-delegation constraints:</t>
        <ul spacing="normal">
          <li>
            <t>A sub-delegation's <tt>max_depth</tt> MUST be strictly less than the
parent delegation's <tt>max_depth</tt>.</t>
          </li>
          <li>
            <t>If the parent's scope is non-empty (restricted), the sub-delegation's
<tt>scope</tt> MUST also be non-empty and MUST be a subset of the parent's
scope.  An unrestricted sub-delegation (empty scope) under a
restricted parent is forbidden, as it would constitute privilege
escalation.</t>
          </li>
          <li>
            <t>The parent delegation MUST be active at the time of sub-delegation.</t>
          </li>
        </ul>
      </section>
      <section anchor="delegation-acceptance">
        <name>Delegation Acceptance</name>
        <t>Delegation follows the bilateral proposal-agreement flow:</t>
        <section anchor="delegator-creates-proposal">
          <name>Delegator Creates Proposal</name>
          <ol spacing="normal" type="1"><li>
              <t>Validate <tt>max_depth</tt> does not exceed 2.</t>
            </li>
            <li>
              <t>Compute <tt>delegation_id = SHA-256("delegator_pubkey:delegate_pubkey:now_ms")</tt> encoded as hex.</t>
            </li>
            <li>
              <t>Enforce sub-delegation constraints if the delegator is itself a delegate.</t>
            </li>
            <li>
              <t>Compute <tt>expires_at = now_ms + ttl_ms</tt>, where <tt>ttl_ms</tt> MUST NOT
exceed MAX_DELEGATION_TTL (2,592,000,000 milliseconds = 30 days).</t>
            </li>
            <li>
              <t>Create a proposal half-block with:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>block_type</tt> = "delegation"</t>
                </li>
                <li>
                  <t><tt>link_sequence_number</tt> = 0</t>
                </li>
                <li>
                  <t><tt>transaction</tt> containing:</t>
                </li>
              </ul>
            </li>
          </ol>
          <sourcecode type="json"><![CDATA[
{
    "interaction_type": "delegation",
    "outcome": "proposed",
    "scope": ["compute", "storage"],
    "max_depth": 1,
    "expires_at": 1735689600000,
    "delegation_id": "a1b2c3..."
}
]]></sourcecode>
        </section>
        <section anchor="delegate-accepts">
          <name>Delegate Accepts</name>
          <ol spacing="normal" type="1"><li>
              <t>Verify <tt>block_type</tt> is "delegation".</t>
            </li>
            <li>
              <t>Verify <tt>link_public_key</tt> matches the delegate's own public key.</t>
            </li>
            <li>
              <t>Verify the proposal's signature.</t>
            </li>
            <li>
              <t>Verify the transaction contains a valid <tt>delegation_id</tt> (non-empty string),
<tt>expires_at</tt> (integer), and <tt>max_depth</tt> (integer).</t>
            </li>
            <li>
              <t>Verify the current time is before <tt>expires_at</tt>.</t>
            </li>
            <li>
              <t>Create an agreement half-block with <tt>block_type</tt> = "delegation".</t>
            </li>
            <li>
              <t>Create and store a DelegationRecord.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="delegated-trust">
        <name>Delegated Trust</name>
        <t>When computing trust for a delegate identity:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the identity has an active delegation:
a. Walk the <tt>parent_delegation_id</tt> chain to find the root delegator.
b. Compute the root delegator's trust via the standard algorithm
   (<xref target="score-composition"/>).
c. Count the number of active delegations at the root level (N).
d. The delegate's effective trust = <tt>root_trust / max(N, 1)</tt>.
e. Clamp to [0.0, 1.0].</t>
          </li>
          <li>
            <t>If the identity was previously a delegate but has no active
delegation (revoked or expired), the trust score is 0.0.</t>
          </li>
          <li>
            <t>If the identity is a delegator: for each delegation (active or
revoked), if the delegate has recorded double-spend fraud, the
delegator's trust is 0.0 (fraud propagation).</t>
          </li>
        </ol>
        <t>The budget split (<tt>root_trust / N</tt>) ensures that delegating authority
dilutes the delegator's trust across all active delegates, preventing
trust amplification through delegation.</t>
        <section anchor="active-delegation-predicate">
          <name>Active Delegation Predicate</name>
          <t>A delegation is active at time <tt>now_ms</tt> if and only if:</t>
          <artwork><![CDATA[
active(d, now_ms) = NOT d.revoked
                    AND now_ms >= d.issued_at
                    AND now_ms < d.expires_at
]]></artwork>
          <t>The <tt>issued_at</tt> bound is inclusive; the <tt>expires_at</tt> bound is exclusive.</t>
        </section>
      </section>
      <section anchor="revocation">
        <name>Revocation</name>
        <t>Delegation revocation is unilateral: only the delegator signs.</t>
        <ol spacing="normal" type="1"><li>
            <t>Verify the delegation exists and the caller is the delegator.</t>
          </li>
          <li>
            <t>Verify the delegation is not already revoked.</t>
          </li>
          <li>
            <t>Create a half-block with:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>block_type</tt> = "revocation"</t>
              </li>
              <li>
                <t><tt>link_public_key</tt> = delegate's public key</t>
              </li>
              <li>
                <t><tt>link_sequence_number</tt> = 0 (unilateral, no counterparty block)</t>
              </li>
              <li>
                <t><tt>transaction</tt>:</t>
              </li>
            </ul>
          </li>
        </ol>
        <sourcecode type="json"><![CDATA[
{
    "interaction_type": "revocation",
    "outcome": "revoked",
    "delegation_id": "a1b2c3..."
}
]]></sourcecode>
        <ol spacing="normal" type="1"><li>
            <t>Mark the DelegationRecord as revoked, recording the revocation
block hash.</t>
          </li>
        </ol>
        <t>Revocation takes effect immediately.  The delegate's trust score
becomes 0.0 upon the next trust computation.</t>
      </section>
      <section anchor="ttl-limits">
        <name>TTL Limits</name>
        <t>The time-to-live for any delegation MUST NOT exceed MAX_DELEGATION_TTL
(2,592,000,000 milliseconds, equivalent to 30 days).  Implementations
MUST reject delegation proposals that specify an <tt>expires_at</tt> timestamp
more than MAX_DELEGATION_TTL milliseconds after the current time.</t>
      </section>
    </section>
    <section anchor="succession">
      <name>Succession</name>
      <section anchor="key-rotation">
        <name>Key Rotation</name>
        <t>Succession enables key rotation while preserving identity continuity
in the social graph.  A succession is bilateral: both the old key
and the new key must sign.</t>
        <section anchor="old-key-creates-proposal">
          <name>Old Key Creates Proposal</name>
          <ol spacing="normal" type="1"><li>
              <t>The old key MUST have at least one block in its chain (cannot
succeed from an empty chain).</t>
            </li>
            <li>
              <t>Compute <tt>succession_id = SHA-256("old_pubkey:new_pubkey:now_ms")</tt>
encoded as hex.</t>
            </li>
            <li>
              <t>Create a proposal half-block with:
              </t>
              <ul spacing="normal">
                <li>
                  <t><tt>block_type</tt> = "succession"</t>
                </li>
                <li>
                  <t><tt>link_public_key</tt> = new key's public key</t>
                </li>
                <li>
                  <t><tt>link_sequence_number</tt> = 0</t>
                </li>
                <li>
                  <t><tt>transaction</tt>:</t>
                </li>
              </ul>
            </li>
          </ol>
          <sourcecode type="json"><![CDATA[
{
    "interaction_type": "succession",
    "outcome": "proposed",
    "succession_id": "d4e5f6..."
}
]]></sourcecode>
        </section>
        <section anchor="new-key-accepts">
          <name>New Key Accepts</name>
          <ol spacing="normal" type="1"><li>
              <t>Verify <tt>block_type</tt> is "succession".</t>
            </li>
            <li>
              <t>Verify <tt>link_public_key</tt> matches the new key's public key.</t>
            </li>
            <li>
              <t>Verify the old key's signature on the proposal.</t>
            </li>
            <li>
              <t>Create an agreement half-block with <tt>block_type</tt> = "succession".</t>
            </li>
            <li>
              <t>Store a SuccessionRecord mapping old_pubkey to new_pubkey.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="identity-resolution">
        <name>Identity Resolution</name>
        <t>After succession, the old public key resolves to the new public key.
Resolution follows the succession chain:</t>
        <artwork><![CDATA[
function resolve_identity(pubkey):
    current = pubkey
    seen = {}
    loop:
        if current in seen:
            break  // cycle guard
        seen = seen + {current}
        if succession_record exists for current:
            current = succession_record.new_pubkey
        else:
            break
    return current
]]></artwork>
        <t>The cycle guard prevents infinite loops in case of malformed
succession chains.</t>
        <t>Identity resolution SHOULD be applied before trust computation so
that interactions under an old key contribute to the current key's
trust score.</t>
      </section>
    </section>
    <section anchor="deployment-model">
      <name>Deployment Model</name>
      <section anchor="sidecar-proxy">
        <name>Sidecar Proxy</name>
        <t>The RECOMMENDED deployment model is a sidecar process that runs
alongside each agent or service.  The sidecar:</t>
        <ol spacing="normal" type="1"><li>
            <t>Listens on a local HTTP proxy port (default: 8203).</t>
          </li>
          <li>
            <t>Intercepts outbound HTTP requests from the co-located agent.</t>
          </li>
          <li>
            <t>For each outbound request:
a. Resolves the target's public key (via DNS, registry, or
   peer-to-peer discovery).
b. Creates a proposal half-block recording the interaction.
c. Forwards the request to the target.
d. Receives the agreement half-block from the target's sidecar.
e. Stores both half-blocks.</t>
          </li>
          <li>
            <t>Exposes trust query endpoints for the co-located agent.</t>
          </li>
        </ol>
        <t>The agent sets <tt>HTTP_PROXY</tt> to the sidecar's address and requires
no code changes.  Trust is handled transparently at the
infrastructure layer.</t>
        <t>For HTTPS, the sidecar handles the CONNECT method and performs
a TrustChain handshake before establishing the TLS tunnel.
Implementations MUST NOT proxy CONNECT requests to loopback
addresses, RFC 1918 private addresses, or link-local addresses
to prevent server-side request forgery (SSRF).</t>
      </section>
      <section anchor="offline-operation">
        <name>Offline Operation</name>
        <t>TrustChain operates without continuous network connectivity:</t>
        <ul spacing="normal">
          <li>
            <t>Each participant's personal chain is stored locally and travels
with the participant.</t>
          </li>
          <li>
            <t>Trust computation uses only locally available chain data.</t>
          </li>
          <li>
            <t>When connectivity is restored, chains synchronize via the crawling
mechanism (<xref target="chain-crawling"/>).</t>
          </li>
          <li>
            <t>Delegation and succession records are stored locally and
synchronized alongside block data.</t>
          </li>
        </ul>
        <t>Trust scores computed offline may be stale.  Implementations SHOULD
record the freshness of chain data and MAY reduce trust scores for
data that has not been synchronized recently.</t>
      </section>
      <section anchor="chain-anchoring">
        <name>Chain Anchoring</name>
        <t>A personal chain is tamper-evident relative to a known head: modifying
any interior block changes every subsequent hash.  The chain creator,
however, holds the signing key and can rewrite and re-sign the entire
chain from any point.  For bilateral blocks this is detectable because
the counterparty holds the other half-block; audit blocks
(<xref target="audit-blocks"/>) have no counterparty and require an external anchor
to be verifiable against their creator.</t>
        <t>Anchoring procedure:</t>
        <ol spacing="normal" type="1"><li>
            <t>The participant periodically obtains an external attestation of
its current chain head hash.  The RECOMMENDED interval is every
100 blocks or every 24 hours, whichever comes first.  Acceptable
attestation sources include:  </t>
            <ul spacing="normal">
              <li>
                <t>a time-stamp token over the head hash issued by an RFC 3161
time-stamping authority <xref target="RFC3161"/>,</t>
              </li>
              <li>
                <t>an inclusion proof from an append-only transparency log, or</t>
              </li>
              <li>
                <t>a countersignature from an independent witness identity whose
own chain is anchored or bilaterally verifiable.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The participant records the attestation in a checkpoint block whose
<tt>transaction</tt> contains at minimum: the anchor type, the anchored
head hash, the sequence number of the anchored head, and the
encoded attestation.</t>
          </li>
          <li>
            <t>A verifier presented with the chain MUST validate the attestation
against the issuing authority and MUST confirm that the anchored
head hash appears in the presented chain at the recorded sequence
number.</t>
          </li>
        </ol>
        <t>An anchor establishes that the anchored prefix existed no later than
the attestation time.  A verifier SHOULD treat only the prefix up to
the most recent valid anchor as externally attested; blocks after the
last anchor are operator-attested only.</t>
        <t>Deployments that present chains as evidence to third parties such as
auditors, insurers, or regulators MUST anchor ("evidence-grade"
profile).  Deployments using chains only for peer-to-peer trust
computation MAY omit anchoring, since bilateral counterparty copies
provide the equivalent protection for interaction blocks.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="sybil-attacks">
        <name>Sybil Attacks</name>
        <t>The primary defense against Sybil attacks is the network flow
computation (<xref target="max-flow"/>).  An attacker who creates many identities
can build long chains with perfect integrity, but without genuine
interactions with seed-adjacent nodes, the network flow from the
seed set to the Sybil identities is zero.  The Sybil gate
(<xref target="score-composition"/>) ensures that zero network flow results in
zero trust, regardless of chain integrity.</t>
        <t>The effectiveness of this defense depends on:</t>
        <ul spacing="normal">
          <li>
            <t>Seed node selection: Seeds MUST be well-known, stable identities
with genuine interaction histories.  Compromised seed nodes
directly undermine Sybil resistance.</t>
          </li>
          <li>
            <t>Graph connectivity: The defense is strongest when the legitimate
interaction graph is well-connected.  Isolated clusters may have
low network flow even for legitimate participants.</t>
          </li>
        </ul>
      </section>
      <section anchor="seed-node-compromise">
        <name>Seed Node Compromise</name>
        <t>If a seed node is compromised, an attacker can create interactions
between the seed and Sybil identities, granting them non-zero
network flow.  Mitigations include:</t>
        <ul spacing="normal">
          <li>
            <t>Using multiple seed nodes so that compromising a single seed has
limited impact.</t>
          </li>
          <li>
            <t>Monitoring seed node interaction patterns for anomalies.</t>
          </li>
          <li>
            <t>Rotating seed nodes periodically.</t>
          </li>
        </ul>
      </section>
      <section anchor="chain-truncation">
        <name>Chain Truncation</name>
        <t>A malicious participant could present a truncated version of their
chain to hide unfavorable interactions.  Defenses include:</t>
        <ul spacing="normal">
          <li>
            <t>Cross-referencing: If participant A has a block linking to
participant B at sequence number 5, but B only presents a chain
of length 3, this indicates potential truncation.</t>
          </li>
          <li>
            <t>Social verification: Participants who have interacted with the
malicious party hold copies of their half-blocks and can detect
omissions.</t>
          </li>
          <li>
            <t>External anchoring: A valid anchor (<xref target="chain-anchoring"/>) pins the
chain head at a point in time.  Presenting a chain shorter than a
previously anchored head reveals the truncation.</t>
          </li>
        </ul>
      </section>
      <section anchor="chain-rewriting">
        <name>Single-Player Chain Rewriting</name>
        <t>An audit chain (<xref target="audit-blocks"/>) is signed entirely by its creator.
Without external anchoring, an operator who controls the signing key
can discard the chain from any block onward and re-sign a sanitized
history; hash chaining alone cannot detect this because every hash in
the rewritten chain is internally consistent.  Chain anchoring
(<xref target="chain-anchoring"/>) closes this gap: once a head is anchored, any
rewrite of the anchored prefix is detectable by a verifier holding the
attestation.</t>
        <t>Two limitations remain even with anchoring:</t>
        <ul spacing="normal">
          <li>
            <t>Records between the last anchor and the present can still be
rewritten.  Shorter anchoring intervals shrink this window;
high-value deployments SHOULD anchor more frequently.</t>
          </li>
          <li>
            <t>Anchoring proves integrity of what was recorded, not completeness of
recording.  An action that was never recorded leaves no trace.
Deployments SHOULD capture events at the infrastructure layer (e.g.,
the sidecar proxy of <xref target="deployment-model"/>) rather than relying on
application cooperation, and SHOULD define expected coverage
contractually so that a recording gap is itself a detectable policy
violation.</t>
          </li>
        </ul>
      </section>
      <section anchor="temporal-attacks">
        <name>Temporal Attacks</name>
        <t>The future timestamp tolerance (5 minutes) limits the ability of
an attacker to pre-date blocks.  However, timestamp manipulation
within the tolerance window is possible.  Implementations SHOULD:</t>
        <ul spacing="normal">
          <li>
            <t>Use NTP-synchronized clocks.</t>
          </li>
          <li>
            <t>Record both the claimed timestamp and the local receipt time.</t>
          </li>
          <li>
            <t>Treat large timestamp discrepancies as a signal of potential
manipulation.</t>
          </li>
        </ul>
        <t>External anchors (<xref target="chain-anchoring"/>) additionally provide a trusted
upper bound: every block at or before an anchored sequence number
demonstrably existed no later than the attestation time, which limits
retroactive fabrication of history to the window since the last
anchor.</t>
      </section>
      <section anchor="network-level-protections">
        <name>Network-Level Protections</name>
        <t>When deploying the sidecar proxy:</t>
        <ul spacing="normal">
          <li>
            <t>The CONNECT method handler MUST block proxying to loopback,
private (RFC 1918), and link-local addresses to prevent
server-side request forgery (SSRF).  This includes IPv4
loopback, the three RFC 1918 private ranges, IPv4 and IPv6
link-local ranges, and the IPv6 loopback address.</t>
          </li>
          <li>
            <t>HTTP request bodies SHOULD be limited in size (RECOMMENDED:
1 MiB) to prevent denial-of-service via oversized payloads.</t>
          </li>
          <li>
            <t>QUIC <xref target="RFC9000"/> connections SHOULD implement per-source rate
limiting to prevent connection flooding.</t>
          </li>
          <li>
            <t>Private key files SHOULD be stored with restrictive permissions
(e.g., 0600 on Unix systems).</t>
          </li>
        </ul>
      </section>
      <section anchor="eclipse-attacks">
        <name>Eclipse Attacks</name>
        <t>An attacker who controls all of a participant's network peers can
manipulate which chains are crawled, presenting a curated view of
the graph that makes Sybil nodes appear connected to seeds.
Mitigations include:</t>
        <ul spacing="normal">
          <li>
            <t>Obtaining chain data from multiple independent sources.</t>
          </li>
          <li>
            <t>Caching previously crawled chains locally and detecting
inconsistencies when the same chain is presented differently by
different peers.</t>
          </li>
          <li>
            <t>Using out-of-band channels to verify seed node chain data.</t>
          </li>
        </ul>
      </section>
      <section anchor="collusion">
        <name>Collusion</name>
        <t>A group of legitimate high-trust nodes can collude to inflate a
Sybil node's trust by creating interaction blocks with Sybil
identities.  The network flow computation limits the damage:
the total trust allocated to the Sybil cluster is bounded by the
colluding nodes' combined outflow toward the cluster.  Using
multiple independent seed nodes reduces the impact of any single
colluding seed.</t>
      </section>
      <section anchor="computational-denial-of-service">
        <name>Computational Denial of Service</name>
        <t>The Edmonds-Karp algorithm runs in O(V * E^2) time.  An attacker
who creates many low-weight edges (via cheap interactions) can
force expensive max-flow computations.  Implementations SHOULD:</t>
        <ul spacing="normal">
          <li>
            <t>Cache the interaction graph and use incremental updates
(<xref target="incremental-graph-updates"/>).</t>
          </li>
          <li>
            <t>Set a maximum computation timeout for trust queries.</t>
          </li>
          <li>
            <t>Rate-limit interaction creation from any single identity.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8032">
          <front>
            <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
        <reference anchor="I-D.pouwelse-trustchain" target="https://datatracker.ietf.org/doc/draft-pouwelse-trustchain/">
          <front>
            <title>TrustChain: A Sybil-resistant scalable blockchain</title>
            <author initials="J." surname="Pouwelse" fullname="Johan Pouwelse">
              <organization/>
            </author>
            <date year="2018" month="October"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-pouwelse-trustchain-01"/>
        </reference>
        <reference anchor="FIPS-180-4" target="https://csrc.nist.gov/publications/detail/fips/180/4/final">
          <front>
            <title>Secure Hash Standard (SHS)</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 180-4"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC3161">
          <front>
            <title>Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)</title>
            <author fullname="C. Adams" initials="C." surname="Adams"/>
            <author fullname="P. Cain" initials="P." surname="Cain"/>
            <author fullname="D. Pinkas" initials="D." surname="Pinkas"/>
            <author fullname="R. Zuccherato" initials="R." surname="Zuccherato"/>
            <date month="August" year="2001"/>
            <abstract>
              <t>This document describes the format of a request sent to a Time Stamping Authority (TSA) and of the response that is returned. It also establishes several security-relevant requirements for TSA operation, with regards to processing requests to generate responses. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3161"/>
          <seriesInfo name="DOI" value="10.17487/RFC3161"/>
        </reference>
        <reference anchor="MERITRANK" target="https://arxiv.org/abs/2207.09950">
          <front>
            <title>MeritRank: Sybil Tolerant Reputation for Merit-based Tokenomics</title>
            <author initials="B." surname="Nasrulin" fullname="Bulat Nasrulin">
              <organization/>
            </author>
            <author initials="G." surname="Ishmaev" fullname="Georgy Ishmaev">
              <organization/>
            </author>
            <author initials="J." surname="Pouwelse" fullname="Johan Pouwelse">
              <organization/>
            </author>
            <date year="2022" month="July"/>
          </front>
          <seriesInfo name="arXiv" value="2207.09950"/>
        </reference>
        <reference anchor="TAMAS" target="https://arxiv.org/abs/2511.05269">
          <front>
            <title>TAMAS: A Trust-Aware Multi-Agent System benchmark</title>
            <author initials="V.-G." surname="Iftode" fullname="Vlad-George Iftode">
              <organization/>
            </author>
            <date year="2025"/>
          </front>
          <seriesInfo name="arXiv" value="2511.05269"/>
        </reference>
      </references>
    </references>
    <?line 1355?>

<section anchor="differences-from-pouwelse">
      <name>Differences from draft-pouwelse-trustchain-01</name>
      <t>This section summarizes the differences between this document and the
original TrustChain specification <xref target="I-D.pouwelse-trustchain"/>.</t>
      <dl>
        <dt>Data Model:</dt>
        <dd>
          <t>The original TxBlock is extended with three new fields: <tt>block_type</tt>
(string), <tt>block_hash</tt> (SHA-256 hex), and <tt>timestamp</tt> (milliseconds).
The <tt>insert_time</tt> field from the original is removed in favor of
<tt>timestamp</tt>.</t>
        </dd>
        <dt>Wire Format:</dt>
        <dd>
          <t>This document specifies JSON as the wire format with canonical
sorted-key serialization.  The original draft implies a binary
encoding.</t>
        </dd>
        <dt>Hash Algorithm:</dt>
        <dd>
          <t>The original draft does not specify a hash algorithm.  This document
uses SHA-256 over canonical JSON.</t>
        </dd>
        <dt>Block Types:</dt>
        <dd>
          <t>The original draft has an implicit two-type model (request and
response, equivalent to proposal and agreement).  This document
adds checkpoint, delegation, revocation, succession, and audit
types.</t>
        </dd>
        <dt>Trust Computation:</dt>
        <dd>
          <t>The original draft states "trust calculations are out of scope."
This document specifies interaction graph construction, two
pluggable path-diversity algorithms (Edmonds-Karp maximum network
flow and MeritRank personalized random walks), chain integrity
scoring, interaction diversity, a multiplicative trust composition
(connectivity × integrity × diversity), and the Sybil gate.</t>
        </dd>
        <dt>Audit Recording:</dt>
        <dd>
          <t>Not present in the original.  This document introduces a
self-referencing audit block type for single-player recording of
unilateral agent actions, with recording levels and pluggable
transaction schemas.</t>
        </dd>
        <dt>Chain Anchoring:</dt>
        <dd>
          <t>Not present in the original.  This document introduces periodic
anchoring of chain heads to external time-stamping authorities or
transparency logs for evidence-grade deployments.</t>
        </dd>
        <dt>Delegation:</dt>
        <dd>
          <t>Not present in the original.  This document introduces delegated
authority with scope constraints, depth limits, budget splitting,
TTL caps, and unilateral revocation.</t>
        </dd>
        <dt>Succession:</dt>
        <dd>
          <t>Not present in the original.  This document introduces bilateral
key rotation with identity resolution.</t>
        </dd>
        <dt>Validation:</dt>
        <dd>
          <t>The original draft specifies five validation rules.  This document
extends these to ten rules, adding public key format checks,
genesis hash consistency, previous hash format, and future timestamp
tolerance.</t>
        </dd>
        <dt>Constants:</dt>
        <dd>
          <t>This document defines an explicit constants table (<xref target="constants-table"/>)
including GENESIS_HASH, GENESIS_SEQ, trust thresholds, delegation TTL
caps, and floating-point thresholds.  No such table exists in the
original.</t>
        </dd>
        <dt>Deployment Model:</dt>
        <dd>
          <t>This document specifies a sidecar proxy deployment model with
HTTP_PROXY interception and HTTPS CONNECT tunneling.  The original
draft does not define a deployment model.</t>
        </dd>
      </dl>
    </section>
    <section anchor="reference-implementations">
      <name>Reference Implementations</name>
      <t>Two reference implementations exist:</t>
      <dl>
        <dt>Rust:</dt>
        <dd>
          <t>https://github.com/viftode4/trustchain -- workspace with four crates
(trustchain-core, trustchain-transport, trustchain-node,
trustchain-wasm).  523 tests.  Implements both path-diversity
algorithms, audit blocks with all three built-in schemas, and the
sidecar proxy.</t>
        </dd>
        <dt>Python:</dt>
        <dd>
          <t>https://github.com/viftode4/trustchain-py -- Python SDK, PyPI package
<tt>trustchain-py</tt>.  475 tests.</t>
        </dd>
      </dl>
      <t>Both implementations maintain wire compatibility through canonical
JSON hashing with sorted keys, integer millisecond timestamps, and
hex-encoded keys and signatures.  Cross-language integration tests
verify interoperability.  The implementations have been evaluated
using the TAMAS benchmark <xref target="TAMAS"/>.</t>
    </section>
    <section anchor="trust-score-examples">
      <name>Trust Score Examples</name>
      <t>This appendix provides worked examples of trust score computation.</t>
      <section anchor="example-1-simple-three-node-network">
        <name>Example 1: Simple Three-Node Network</name>
        <t>Consider three participants: Alice (A), Bob (B), and Carol (C).
Alice is a seed node.</t>
        <t>Interactions:
- A and B complete 2 bilateral interactions (2 half-blocks per side,
  4 total).
- B and C complete 1 bilateral interaction (1 half-block per side,
  2 total).</t>
        <t>Interaction graph edges:
- w(A, B) = 2 * 0.5 = 1.0 (A's 2 proposals to B)
- w(B, A) = 2 * 0.5 = 1.0 (B's 2 agreements with A)
- w(B, C) = 1 * 0.5 = 0.5 (B's 1 proposal to C)
- w(C, B) = 1 * 0.5 = 0.5 (C's 1 agreement with B)</t>
        <t>Super-source construction:
- outflow(A) = w(A, B) = 1.0
- Edge: s_0 -&gt; A with capacity 1.0
- total_outflow = 1.0</t>
        <t>Trust for B:
- path_diversity(B) = max_flow(s_0, B) = 1.0 (path: s_0 -&gt; A -&gt; B, bottleneck 1.0)
- connectivity(B) = min(1.0 / 3.0, 1.0) = 0.333
- integrity(B) = 1.0 (perfect chain)
- unique_peers(B) = 2 (A and C)
- diversity(B) = min(2 / 5.0, 1.0) = 0.4
- trust(B) = 0.333 * 1.0 * 0.4 = 0.133</t>
        <t>Trust for C:
- path_diversity(C) = max_flow(s_0, C) = 0.5 (path: s_0 -&gt; A -&gt; B -&gt; C, bottleneck 0.5)
- connectivity(C) = min(0.5 / 3.0, 1.0) = 0.167
- integrity(C) = 1.0 (perfect chain)
- unique_peers(C) = 1 (B only)
- diversity(C) = min(1 / 5.0, 1.0) = 0.2
- trust(C) = 0.167 * 1.0 * 0.2 = 0.033</t>
        <t>Note: the low scores reflect that this is a small network.  As B and C
accumulate more interactions with distinct peers who are themselves
connected to the seed set, their scores will increase.</t>
      </section>
      <section anchor="example-2-sybil-attack-scenario">
        <name>Example 2: Sybil Attack Scenario</name>
        <t>An attacker creates 10 Sybil identities (S1..S10) and has each pair
interact extensively.  None of the Sybil identities interact with
any seed-adjacent node.</t>
        <t>For any Sybil identity S_i:
- integrity(S_i) = 1.0 (perfect chains)
- path_diversity(S_i) = 0.0 (no path from seed set)
- Sybil gate applies: trust(S_i) = 0.0</t>
        <t>Even though each Sybil has high diversity (many distinct peers within
the Sybil cluster), the Sybil gate fires before diversity is
evaluated, producing a hard zero.</t>
      </section>
      <section anchor="example-3-delegation-budget-split">
        <name>Example 3: Delegation Budget Split</name>
        <t>Alice (seed, trust 1.0) delegates to Bob and Carol.</t>
        <ul spacing="normal">
          <li>
            <t>root_trust = trust(Alice) = 1.0</t>
          </li>
          <li>
            <t>active_delegation_count = 2</t>
          </li>
          <li>
            <t>trust(Bob) = 1.0 / 2 = 0.5</t>
          </li>
          <li>
            <t>trust(Carol) = 1.0 / 2 = 0.5</t>
          </li>
        </ul>
        <t>If Alice later revokes Bob's delegation:
- trust(Bob) = 0.0 (revoked delegate)
- active_delegation_count = 1
- trust(Carol) = 1.0 / 1 = 1.0</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The bilateral ledger concept originates from Johan Pouwelse's work on
TrustChain at Delft University of Technology.  The author thanks
Prof. Pouwelse for creating the foundational protocol and for his
encouragement of this extension.</t>
      <t>The reference implementations benefited from the py-ipv8 project's
BarterCast reputation system, which informed early design decisions
around interaction-based trust, though the final NetFlow design
diverges significantly.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V963bbVpLufzzFPvKPUG5SluRLEmXcfWRZTjSxZbclp2dW
T44EkaCENghwAFCyWvG8xjzQvNipr6r2DQBlp2fOOlkrCUUC+1K7dt0vk8kk
afO2yPbMxmm9alpzUC2WqzZt86o086o27VVm+JeDqzQvzYu8SNusTgvzOptd
ZrV5V1dtNa2KjSS9uKizazuQPM4fN5IpvXNZ1bd7Jvu0TGbVtEwXNOWsTuft
5Dqft9Usm7R4dorX5ONkeydpVheLvGloMe3tkt7Iy1m2zOg/ZZuUq8VFVu8l
Mxp8L5lWZZOVzarZM/O0aLKEVvI4SesspRWdZNNVnbe3G8lNVX+8rKvVkr49
Kmf5dT5b0WZO3Dwbycfslp6a7SXGTAyvhD9duJ0XvHP+cpZNaSn0Zf73bMbf
nNzSg6bOmrxp03Ka8ZeL9NNkXlQ3/EedlrNqYW7S4mPDX6SrWS5z7B+Z9JIG
bJIkXbVXVS2LmK+KQiC28UuRziY/ZlV9mZkjhtsGPWIMfZGW+d/53Oixl1kx
b82HMr/O6oY2bqq5Oc2mV2VVVJe38kq2SPOCnr2mIeUIHv/vS3y3Na0WG0lS
VvWCxrvOsIj3rw52d3a+14/f7Xz7xH7cfryLj0eTl1vLanWTEeyDo9zjqSIU
Y8zYM/sCqokFVWuaaVqkF0VmLopq+pFfl5V6WOCfiVFY/HN1lZbmnU4qjzIy
mN3tne8mO9v8TZPVOU1Rzis7wFFJ51hm7eQl8M+i4cDigYG8/JTATQ9uXLXt
stl79IhmSenUpx+zeivP2vkWgf8RofWjtUM9IoAa8+ro3clk57vtyZMYLoyf
mfkpba7MCcFiltYzMzr56WRzGAA0Hb11zKdNCHlUNjTSqs1wzPb9xtD/e4fu
4PN0sv3dGvhglTT8uw8vDK91YxgI06aebpV0dluX1fWj5eqiyKe8oubRLGsJ
jx7N82XziIZ49IQ+0kIJBpgnRqvvt7e39ePjnWc7+Pjm8P3R6fv9459jKL2h
lbbv0/Ljnt6y06qgC0mY8z6LaBY/OLlIm4wAUH3MymqRT5t7cenFim63OU6b
elVYtAt+5ht3a46aq0WaXfd+vg8Td3cn29+ugXRa/0sOirm7u/3t1vb33z/d
XgPrtP6UXzOWpRfNo/Bxev50/83+Seei8Vd0x/jGTfZviBCaN6uizSf7IDAE
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
WqZyZJuCbe4Y7L4HbCsaOUlCbAnzdJcLX6bLxlurSXIizYx9u2pJb0jSImIy
W3GkJJ4eQ/d3UXak09c1m74lmYuNKtaMJJdpSmpnISqux4ldTxId/e3ihKOJ
QfRgnyoGhyxHGSqW7JwIwPM/ihXeChBEpwWWgif/87QuXJJetKf/P2jds3to
XQcgsZL57ZcoXvftvmv1uzUk0Ic8CEXDM4GZ9VyDGpk/kryxvPUWaT9d+AKc
kQZWmb1QeouDrz1mNuwoXVQzRQrW5uhWEK11plg9xdD4qxZONkkp/cpmGxLz
RXtiiY6+2ITXo0BMdSa5G0VhJGxM7cLiK5wCyUGifycH2NnpsgD6brdH6eMr
HJD1zh32cs09dD31DvsvEvbwbH/XHQ6Fg/9hyv4+g6/rWsDTScT1wZDCFBuG
IwfVrQ0ZeOr2FbtX1Qm8FwOt6ycF/cboXlAL0brvtn/WJ526h0HC+W3/8Wgp
0UWzImhwEFja+nv2XcgnhQnyNXPY5+ZStZwp14EyFujmHAJhOc1nhF+ErMfS
sDCpWJO049DWWd5MYUOTNaPQj1JJ9o2H58Imy/BV3H64/9nzRyr0sqqtPdZG
eMax5TIwLUQzeCRJO5ClOW4jGbROEhj+AkuO3SAnNK1h/c4syzmwHf645EDy
exB9YpxplWUFHRSGHWRHs2DBDvFQiDASvyOihOT7EhjEZGCDkCbiFVQZwScG
jniZ1sPWZWuMUuqq5gid3KYYfdNExG7TrjTITRPkeSlC1QmEKlJiVagiJFoj
bRFJu6nY4sX2fEVPNvTgEdFBg2zGbnI4nY2dEhT2Fd7nGCUa1ebUOHmLo5l8
eHKTLoiGj/zN5cyjmHRsnkvQLg7AjweI4r6o5y4vkSPYusuoWH1TOjkLQcBz
BHPbMP1uvojbxkEgsbrd7PtT+B2BUj5vgHMMHfmUqPOCFja75TSHNNiaFwaV
YhFjz1sfLR7tNd6pXzknO5VzWmMrTgofHb7OQzl1JOqC7nMXIzg6Rm4XIgZc
IQfBMC6mgses9dNXceAkO4uqgECK2PFZQruCUaox66RppgAx/QKo3MghPsvs
Yz3ZIBY/CVJOtrZZ90DwEH5iIUEjiTVTU8NsXgiy3j2IImU0TsWh/7pAJQ2S
avoU9Q0RziQujnKVXiMVouRqc9fVR6GSwlXbqirGqCtRaIGLq7yeTXiwZP/d
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

-->

</rfc>
