<?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.31 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-viftode-trustchain-trust-00" category="exp" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="TrustChain Trust">Trust Computation for the TrustChain Bilateral Ledger Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-viftode-trustchain-trust-00"/>
    <author fullname="Vlad-George Iftode">
      <organization>Delft University of Technology</organization>
      <address>
        <email>v.g.iftode@student.tudelft.nl</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <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>
    <abstract>
      <?line 58?>

<t>This document specifies trust computation, 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) a maximum network flow algorithm (Edmonds-Karp) over the interaction
graph for Sybil-resistant trust scoring,
(4) a composite trust score combining chain integrity with network flow,
(5) a delegation protocol for transitive authority with budget splitting
and revocation, and (6) a bilateral succession protocol for key rotation.</t>
    </abstract>
  </front>
  <middle>
    <?line 73?>

<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
over 600 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 a maximum network flow (Edmonds-Karp)
algorithm from a set of seed nodes that provides Sybil resistance.</t>
        </li>
        <li>
          <t>A composite trust score that combines chain integrity (hash chain
verification) with network flow, enforcing a Sybil gate: if the
network flow component is zero, the overall trust score is zero
regardless of chain integrity.</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>
      </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, and
succession 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"</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>Six 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.  This is the
only block type 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>
        </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".</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">INTEGRITY_WEIGHT</td>
              <td align="left">0.5</td>
              <td align="left">Default weight for chain integrity in composite score</td>
            </tr>
            <tr>
              <td align="left">NETFLOW_WEIGHT</td>
              <td align="left">0.5</td>
              <td align="left">Default weight for network flow in composite score</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>
          </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="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 only block type permitting this
equality is "checkpoint", and checkpoint blocks do not represent
interactions between distinct parties.</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="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 composite trust score for a participant with public key p is:</t>
        <artwork><![CDATA[
function compute_trust(p):
    if double_spend_fraud_recorded(p):
        return 0.0

    integrity = chain_integrity(p)

    if seed_nodes are configured:
        netflow = trust_netflow(p)
        if netflow < EPSILON:
            return 0.0  // Sybil gate
        score = INTEGRITY_WEIGHT * integrity
              + NETFLOW_WEIGHT * netflow
        return clamp(score, 0.0, 1.0)

    return integrity
]]></artwork>
        <t>The Sybil gate is critical: when seed nodes are configured and the
network flow score is below EPSILON (1e-10), the composite trust
score MUST be 0.0 regardless of the chain integrity score.  This
prevents an attacker from creating isolated chains with perfect
integrity to gain trust without genuine interactions with the
trusted subgraph.</t>
        <t>When no seed nodes are configured, the trust score degrades to
chain integrity only.  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>
    <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>
        </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>
      </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="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 1059?>

<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, and succession 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, Edmonds-Karp
maximum network flow, chain integrity scoring, composite trust
scores, and the Sybil gate.</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 weights, 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).  296 tests.</t>
        </dd>
        <dt>Python:</dt>
        <dd>
          <t>https://github.com/viftode4/trustchain-py -- Python SDK, PyPI package
<tt>trustchain-py</tt>.  310 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:
- max_flow(s_0, B) = 1.0 (path: s_0 -&gt; A -&gt; B, bottleneck 1.0)
- netflow(B) = 1.0 / 1.0 = 1.0
- Assuming perfect chain integrity: trust(B) = 0.5 * 1.0 + 0.5 * 1.0 = 1.0</t>
        <t>Trust for C:
- max_flow(s_0, C) = 0.5 (path: s_0 -&gt; A -&gt; B -&gt; C, bottleneck 0.5)
- netflow(C) = 0.5 / 1.0 = 0.5
- Assuming perfect chain integrity: trust(C) = 0.5 * 1.0 + 0.5 * 0.5 = 0.75</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:
- Chain integrity = 1.0 (perfect chains)
- netflow(S_i) = 0.0 (no path from seed set)
- Sybil gate applies: trust(S_i) = 0.0</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:
H4sIAAAAAAAAA8V9a3cbx9Hm9/kVvdQHgzYAkdTFNvMy71IUZTORKEWk7OQk
XnIIDMiJBjN4ZwakGJr57VtPVfVtBqBkn+zZnBMLBPpSXV1dt66qHo1GSZu3
RbZrNk7rZdOag2q+WLZpm1elmVW1aa8yw78cXKV5aV7kRdpmdVqY19n0MqvN
u7pqq0lVbCTpxUWdXduBpDl/3Egm1Oeyqm93TfZpkUyrSZnOacppnc7a0XU+
a6tpNmrRdoJu8nG0tZU0y4t53jQETHu7oB55Oc0WGf2nbJNyOb/I6t1kSoPv
JpOqbLKyWTa7ZpYWTZYQJE+StM5SgugkmyzrvL3dSG6q+uNlXS0X9O1ROc2v
8+mSFnPi5tlIPma31Gq6mxgzMgwJf7pwKy945fzlNJsQKPRl/q9syt+c3FJD
U2dN3rRpOcn4y3n6aTQrqpskSZftVVXL2LNlUQgiNn4q0unoh6yqLzNzxOjY
oCbG0Bdpmf+Lt4OavcyKWWs+lPl1Vje0HlPNzGk2uSqrorq8lS7ZPM0Lans9
vhwLZv930y6BsTH+oQHGJe1WUlb1nMa9zgDM+1cHO9vb3+vH77a/fWo/bj3Z
wcej0cvxolreZITaYKd2ecqIgnjjd82+YGJkMdGaZpIW6UWRmYuimnzk7gKx
xwn+NzKKkz9VV2lp3umk0pT32uxsbX832t7ib5qszmmKclbZAY5K2qYya0cv
QV6WylYAP9raFvBTQjs13Lhq20Wz+/gxzZLSpk4+ZvU4z9rZmLbhMVHt47VD
PSaEGvPq6N3JaPu7rdHTGC9Mfpn5MW2uzAnhYprWUzM4+fFkczUCaDrqdcy7
TvR2VDY00rLNsN22f2Po397mO/w8G219twY/gJKGf/fhhWFYN1YjYdLUk3FJ
eze+rK4fL5YXRT5hiJrH06wlGns8yxfNYxri8VP6SIASDjBPTFbfb21t4ePp
/pv9kw658FdEKUw3o/0bOq3mzbJo89H+JdErUVDTZnNzkZWTq3laf3yQXNYd
IYuSnWdr8JHWf83BtnaebW+Pt57tPP9+DUbS+lN+zbSQXjSPw+bJaDQy9CWI
pk2S06u8MUQvyzlW0SyyST6jSYWZmInnsENiIEV2qZ+xocR8TLOcTDJmRsmc
9pcYQDNvVjHjLksyC2XGyeAhot8c03bQSBdpk7kuAZipHzjhs2poYctJCxoG
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
SUTS/wWUNFglQ6sAAA==

-->

</rfc>
