Files
MESH2/docs/specs/MESH-Protocol-Specification-Suite-v0.1.0.md
anthonyrawlins f2d62fa03d Initial workspace: scaffold + constitution + spec documents
Rust workspace with 5 crates (mesh-types, mesh-crypto, mesh-network,
mesh-validator, mesh-wallet), PROJECT_CONSTITUTION.md for CHORUS
automated ingestion, and the full MESH protocol specification suite.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 20:49:44 +11:00

56 KiB
Raw Blame History

MESH PROTOCOL

Minimal-Exchange Settlement Hypergraph

Formal Protocol Specification Suite

Version 0.1.0-draft

March 2026

CLASSIFICATION: PUBLIC --- OPEN STANDARD

License: Apache 2.0 (specification) / CC-BY-SA 4.0 (documentation)

Table of Contents

SPEC-001: Overview, Conventions, and Threat Model

1.1 Purpose

This document suite constitutes the formal specification of the MESH protocol (Minimal-Exchange Settlement Hypergraph). It is intended to provide sufficient detail for an independent engineering team to produce a conformant implementation without access to the authors, the reference implementation, or any other materials beyond these specifications and the referenced academic papers.

Each specification in this suite is self-contained for its component, but cross-references other specifications where interfaces exist. Implementers MUST read SPEC-001 before any other specification, as it defines the conventions, terminology, and threat model that apply to all subsequent documents.

1.2 Document Conventions

RFC 2119 Keywords: The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in these documents are to be interpreted as described in RFC 2119. All uses are capitalised for emphasis.

Notation: Mathematical notation follows standard conventions. Sets are denoted by capital letters (A, E, V). Functions use lowercase (f, g, σ). The symbol ≺ denotes the causal partial order. The symbol ‖ denotes concatenation of byte strings. The symbol ⊕ denotes XOR. The notation [n] means the set {0, 1, ..., n-1}.

Byte Encoding: All multi-byte integers are encoded in little-endian format unless explicitly stated otherwise. All cryptographic values (public keys, signatures, hashes) are encoded as fixed-length byte arrays. Lengths are specified in bytes.

Pseudo-code: Algorithm descriptions use Python-like pseudo-code with explicit type annotations. This is descriptive, not prescriptive --- implementations may use any language or approach that produces identical outputs for identical inputs across all test vectors.

1.3 Specification Suite Index


Spec ID Title Scope

SPEC-001 Overview, Conventions, and This document. Global Threat Model conventions, terminology, threat model, and security properties.

SPEC-002 Settlement Hypergraph Data Core data structures: Model accounts, transitions, hyperedges, causal ordering, the Value Semiring.

SPEC-003 Tier 1 --- Consensusless Byzantine Consistent Broadcast Settlement Protocol for simple payments. Sub-300ms finality path.

SPEC-004 Tier 2 --- DAG-BFT Ordered DAG-based consensus for Settlement complex multi-party settlements requiring total order.

SPEC-005 Tier 3 --- Asynchronous BFT Liveness-guaranteed fallback Fallback under network partition. aBFT protocol.

SPEC-006 Cryptographic Primitives and All cryptographic operations, Cipher Suites key formats, cipher suite negotiation, PQ migration.

SPEC-007 Privacy Layer Pedersen commitments, Bulletproofs+ range proofs, stealth addresses, selective disclosure.

SPEC-008 Value Routing and Exchange Multi-hop routing, PTLC atomicity, connector protocol, packet format, price discovery.

SPEC-009 Network Transport and Peer Wire protocol, message Discovery framing, peer discovery, eclipse attack resistance.

SPEC-010 Validator Operations and Validator lifecycle, key Governance management, upgrade protocol, fee model, governance.


1.4 System Model

1.4.1 Participants

The MESH network consists of the following participant types:

  • Accounts: End-user entities identified by a public key. An account holds balances in zero or more asset types and initiates settlements. An account has a monotonically increasing sequence number that prevents replay attacks. Accounts do not run persistent software --- they interact via client applications (wallets).

  • Validators: Infrastructure nodes that verify and certify state transitions. The validator set V = {v₁, v₂, ..., vₙ} is known to all participants and changes only through the governance protocol (SPEC-010). Each validator holds a signing key pair. Validators are expected to have persistent storage and reliable network connectivity.

  • Connectors: Nodes that hold balances in multiple asset types and facilitate cross-asset settlement by providing liquidity. Connectors are a specialisation of accounts --- they are accounts that additionally run the connector protocol (SPEC-008). Any account MAY become a connector.

1.4.2 Threat Model

MESH assumes the following threat model, which applies to all specifications:

Byzantine Validators: Up to f < n/3 validators may be Byzantine (arbitrarily malicious). Byzantine validators may: crash, send conflicting messages to different parties, collude with each other, delay messages selectively, and attempt to forge or suppress settlements. They may NOT break the cryptographic assumptions (see SPEC-006).

Network Model: The network is partially synchronous for Tier 1 and Tier 2 protocols. This means there exists an unknown bound Δ such that after Global Stabilisation Time (GST), all messages between correct validators are delivered within Δ. Before GST, messages may be delayed arbitrarily. For Tier 3, the network is fully asynchronous (no timing assumptions).

Byzantine Accounts: Any account may be Byzantine. A Byzantine account may attempt to: double-spend (issue two conflicting transitions from the same state), forge transaction certificates, or collude with Byzantine validators. The protocol MUST prevent all such attacks when f < n/3.

Cryptographic Assumptions: Security relies on: (a) the hardness of the Discrete Logarithm Problem in the chosen elliptic curve group (Suite 0), (b) the hardness of Module-LWE (Suite 1+), (c) collision resistance of SHA-3/SHAKE, (d) the random oracle model for Fiat-Shamir transforms. These are specified precisely in SPEC-006.

1.4.3 Security Properties

The protocol MUST satisfy the following properties under the stated threat model. These are the acceptance criteria for any conformant implementation.

SAFETY-1 (No Double-Spend): If a settlement certificate is issued for a transition t on account a, then no conflicting transition t (same account, same sequence number, different content) can ever receive a valid settlement certificate. This holds even if f < n/3 validators are Byzantine.

SAFETY-2 (Value Conservation): For every settlement hyperedge e, the sum of all value debited from source accounts equals the sum of all value credited to destination accounts, within the same asset type. Cross-asset exchanges are modelled as paired settlements with an exchange rate, not as creation or destruction of value.

SAFETY-3 (No Inflation): No state transition may increase the total supply of any asset type. The only way to introduce new value into the system is through the on-ramp protocol (SPEC-008 §8.6), which requires proof of external settlement.

LIVENESS-1 (Settlement Finality): If a correct account initiates a valid Tier 1 settlement and at least 2f+1 validators are correct and reachable, the settlement achieves finality within 2Δ time (two message delays).

LIVENESS-2 (No Deadlock): The protocol MUST NOT reach a state where a correct account's funds are permanently locked. All conditional settlements have timeouts. All escrows have expiration. No correct account can be denied access to its own balance indefinitely.

PRIVACY-1 (Amount Confidentiality): Settlement amounts MUST NOT be observable by any party other than the sender, recipient, and (where applicable) the connectors on the settlement path. Validators verify amount validity through zero-knowledge proofs without learning the amounts.

PRIVACY-2 (Unlinkability): Given two settlement certificates, no observer (including validators) can determine whether they involve the same sender or recipient, except with negligible probability, unless the sender or recipient voluntarily discloses this linkage.

1.5 Versioning and Compatibility

The MESH protocol uses semantic versioning (MAJOR.MINOR.PATCH). A change in MAJOR version indicates a breaking change that requires all validators to upgrade simultaneously (hard fork). A change in MINOR version indicates a backward-compatible addition. A change in PATCH version indicates a bug fix.

All protocol messages include a version field. Validators MUST reject messages with an unsupported MAJOR version. Validators SHOULD process messages with a higher MINOR version than their own, ignoring unknown fields. This enables rolling upgrades without network-wide coordination for non-breaking changes.

SPEC-002: Settlement Hypergraph Data Model

2.1 Purpose

This specification defines the core data structures of the MESH protocol. All other specifications reference these structures. Implementers MUST support all data types defined here with the exact byte-level encoding specified.

2.2 Primitive Types


Type Size Description

u8 1 byte Unsigned 8-bit integer.

u32 4 bytes Unsigned 32-bit integer, little-endian.

u64 8 bytes Unsigned 64-bit integer, little-endian.

u128 16 bytes Unsigned 128-bit integer, little-endian. Used for all value amounts. Supports up to 3.4 × 10³⁸ base units.

Hash 32 bytes Output of SHA3-256. Used for content addressing and Merkle commitments.

PublicKey 32 bytes Ed25519 public key. For Suite 1+, see SPEC-006 (Suite 0) for expanded sizes.

Signature 64 bytes Ed25519 signature. For Suite 1+, see SPEC-006. (Suite 0)

Commitment 32 bytes Pedersen commitment point (compressed Edwards form). See SPEC-007.

RangeProof variable Bulletproofs+ range proof. See SPEC-007 for encoding.

AssetID 32 bytes SHA3-256(asset_name || issuer_pubkey || precision). Uniquely identifies an asset type.


2.3 Account State

An account is the fundamental unit of participation in the MESH network. Each account is identified by its public key and maintains local state that is updated by state transitions.

2.3.1 AccountState Structure

struct AccountState {

owner: PublicKey, // The account's public key (identity)

sequence: u64, // Monotonically increasing counter

balances: Map<AssetID, Commitment>, // Balance per asset (committed)

state_hash: Hash, // SHA3-256 of serialised state

last_cert: Hash, // Hash of most recent settlement certificate

created_at: u64, // Unix timestamp (seconds) of account creation

}

The sequence number starts at 0 for new accounts and increments by exactly 1 for each transition. A validator MUST reject any transition whose sequence number is not exactly last_sequence + 1. This is the primary mechanism preventing double-spends: two conflicting transitions would share the same sequence number, and the equivocation is detectable.

Balances are stored as Pedersen commitments, not plaintext values. A commitment C = vG + bH commits to value v using blinding factor b. The validator cannot learn v, but can verify that transitions are consistent using the homomorphic property of the commitments (see SPEC-007).

2.3.2 Account Creation

An account is created by its first state transition. There is no separate registration step. The first transition MUST have sequence number 0 and MUST be a receive transition (receiving value from another account or from the on-ramp protocol). An account with no balances and no transitions does not exist in the protocol.

2.4 State Transitions

A state transition is an atomic change to one or more accounts. Transitions are the edges of the causal graph.

2.4.1 Transition Structure

struct Transition {

version: u8, // Protocol major version

transition_type: TransitionType, // enum: Send, Receive, Exchange, OnRamp, OffRamp

sender: PublicKey, // Account initiating the transition

sequence: u64, // Sender's next sequence number

recipients: Vec<Recipient>, // One or more recipients (hyperedge)

asset_id: AssetID, // Asset being transferred

amount: Commitment, // Value committed (Pedersen)

range_proof: RangeProof, // Proves amount ≥ 0 and ≤ sender balance

fee: Commitment, // Fee committed (paid to validators)

fee_proof: RangeProof, // Proves fee ≥ 0

causal_deps: Vec<Hash>, // Hashes of transitions this depends on

expiry: u64, // Unix timestamp after which transition is void

memo: [u8; 256], // Encrypted end-to-end data (opaque to validators)

signature: Signature, // Sender's signature over all above fields

}

2.4.2 Recipient Structure

struct Recipient {

address: PublicKey, // Recipient's public key (or stealth address)

amount: Commitment, // Value committed to this recipient

range_proof: RangeProof, // Proves amount ≥ 0

}

A transition with multiple recipients is a single atomic operation. Either all recipients receive their amounts, or none do. This is how MESH natively supports multi-party settlements without requiring smart contracts.

2.4.3 Transition Validation Rules

A validator MUST apply the following checks to every transition, in order. If any check fails, the transition MUST be rejected with the specified error code.

  1. VERSION_CHECK: transition.version MUST equal a supported protocol major version. Error: ERR_UNSUPPORTED_VERSION.

  2. SIGNATURE_CHECK: The signature MUST be valid under the sender's public key over the canonical serialisation of all fields except the signature itself. Error: ERR_INVALID_SIGNATURE.

  3. SEQUENCE_CHECK: transition.sequence MUST equal the sender's current sequence number + 1. Error: ERR_INVALID_SEQUENCE.

  4. EXPIRY_CHECK: The current time MUST be less than transition.expiry. Error: ERR_EXPIRED.

  5. BALANCE_CHECK: The committed amount + fee MUST be provably ≤ the sender's committed balance for the specified asset, using the homomorphic property. Error: ERR_INSUFFICIENT_BALANCE. (Details in SPEC-007.)

  6. RANGE_CHECK: All range proofs MUST verify. This proves all amounts are non-negative and within the valid range [0, 2⁶⁴). Error: ERR_INVALID_RANGE_PROOF.

  7. CONSERVATION_CHECK: The sum of recipient amount commitments + fee commitment MUST equal the sender's debited amount commitment. Formally: Σ(recipient.amount) + fee = amount. This is checked on the commitment points: Σ(C_recipient_i) + C_fee = C_amount. Error: ERR_CONSERVATION_VIOLATION.

  8. CAUSAL_CHECK: Every hash in causal_deps MUST reference a transition that the validator has already processed and certified. Error: ERR_UNKNOWN_DEPENDENCY.

  9. EQUIVOCATION_CHECK: The validator MUST NOT have previously signed a vote for a different transition with the same (sender, sequence) pair. If it has, this is an equivocation attempt. The validator MUST produce an equivocation proof (both conflicting transitions) and broadcast it. Error: ERR_EQUIVOCATION.

2.5 Settlement Certificates

A settlement certificate is cryptographic proof that a transition has been accepted by a quorum of validators and is therefore final.

2.5.1 Certificate Structure

struct SettlementCertificate {

transition_hash: Hash, // SHA3-256 of the certified transition

epoch: u64, // Validator set epoch (see SPEC-010)

votes: Vec<ValidatorVote>, // Votes from ≥ 2f+1 validators

}

struct ValidatorVote {

validator_id: PublicKey, // Voting validator's public key

signature: Signature, // Signature over (transition_hash || epoch)

}

A settlement certificate is valid if and only if: (a) it contains votes from at least 2f+1 distinct validators in the epoch's validator set, (b) all vote signatures are valid, and (c) no equivocation proof exists for the certified transition.

Settlement certificates are the fundamental unit of finality in MESH. Once a valid certificate exists for a transition, that transition is irreversible. Any participant can independently verify a certificate without contacting any validator. Certificates are transferable: a recipient can present a certificate to any third party as proof of payment.

2.6 The Causal Partial Order

Transitions in MESH are ordered by causality, not by time. Transition t₁ causally precedes transition t₂ (written t₁ ≺ t₂) if and only if at least one of the following holds:

  1. t₂.causal_deps contains the hash of t₁ (direct dependency).

  2. There exists a transition t₃ such that t₁ ≺ t₃ and t₃ ≺ t₂ (transitive closure).

  3. t₁ and t₂ are on the same account and t₁.sequence < t₂.sequence (same-account ordering).

Two transitions t₁ and t₂ are concurrent (written t₁ || t₂) if neither t₁ ≺ t₂ nor t₂ ≺ t₁. Concurrent transitions on different accounts can be processed in any order or in parallel, because they do not affect each other's validity.

This causal structure forms a directed acyclic graph (DAG). The graded structure is defined by the rank function ρ(t) = 1 + max({ρ(d) : d ∈ t.causal_deps} {ρ(prev_t) : prev_t is the previous transition on the same account}), with ρ(genesis) = 0. The rank provides a natural "logical clock" for the system without requiring synchronised physical clocks.

2.7 The Value Semiring

The Value Semiring 𝕍 = (V, ⊕, ⊗, 0, 1) formalises multi-asset value operations:

  • V is the set of all (amount: u128, asset_id: AssetID) pairs.

  • ⊕ (aggregation): (a₁, id) ⊕ (a₂, id) = (a₁ + a₂, id). Only defined for same asset_id. Aggregation of different assets produces a ValueSet (multiset over V).

  • ⊗ (exchange): (a, id₁) ⊗ rate = (a × rate.numerator / rate.denominator, id₂) where rate is an ExchangeRate from id₁ to id₂. This models currency conversion.

  • 0: The zero value (0, any_id). Identity element for ⊕.

  • 1: The identity exchange rate (numerator = denominator = 1, same asset). Identity element for ⊗.

The semiring axioms (associativity, commutativity, distributivity of ⊗ over ⊕, absorbing zero) guarantee that multi-hop payment path composition is well-defined and that value conservation can be verified algebraically. Implementers MUST use exact integer arithmetic (u128) for all value calculations. Floating-point arithmetic is PROHIBITED.

2.8 Serialisation

All structures are serialised using a deterministic binary encoding. The canonical serialisation is the input to all hash and signature operations. The encoding rules are:

  1. Fixed-size fields are encoded in their natural byte representation (little-endian for integers).

  2. Variable-length fields (Vec<T>) are encoded as: length (u32) || element₁ || element₂ || ... || elementₙ.

  3. Optional fields are encoded as: presence_flag (u8, 0 or 1) || value (if present).

  4. Structs are encoded as the concatenation of their fields in declaration order.

  5. Maps are encoded as a sorted (by key) Vec of (key, value) pairs.

Implementers MUST produce identical byte sequences for identical data. The canonical serialisation of a structure S is denoted encode(S). The hash of a structure is hash(S) = SHA3-256(encode(S)).

SPEC-003: Tier 1 --- Consensusless Settlement Protocol

3.1 Purpose

This specification defines the protocol for simple settlements that do not require global transaction ordering. Tier 1 handles the common case of one-to-one and one-to-many payments where the sender is the sole owner of the transferred value. This is the fast path, designed for sub-300ms finality in retail payment scenarios.

Tier 1 is based on Byzantine Consistent Broadcast (Bracha, 1987). The key insight is that pre-funded, single-owner transfers do not require consensus because there is no shared state to agree on --- only the sender's balance needs to be checked, and the sender's account chain is single-writer.

3.2 Preconditions

A transition is eligible for Tier 1 processing if and only if ALL of the following hold:

  1. The transition involves exactly one sender account.

  2. The sender account has sufficient committed balance (verifiable via range proofs).

  3. The transition does not depend on any uncommitted (pending) transition from a different account.

  4. The transition does not involve conditional logic (no escrows, no time-locks beyond the standard expiry).

If any precondition is not met, the transition MUST be routed to Tier 2. The routing decision is made by the sender's wallet software, not by validators. A wallet that incorrectly routes a Tier-2-eligible transition to Tier 1 will receive rejection from validators (ERR_TIER1_INELIGIBLE).

3.3 Protocol Steps

The Tier 1 protocol consists of two phases: Vote Collection and Certificate Broadcast. The sender coordinates both phases.

3.3.1 Phase 1: Vote Collection

The sender constructs a valid Transition (per SPEC-002 §2.4) and sends it to all validators.

Message: VOTE_REQUEST

sender → all validators

payload: Transition

Upon receiving a VOTE_REQUEST, each correct validator vᵢ performs the following:

  1. Apply all validation rules from SPEC-002 §2.4.3, in order.

  2. If all checks pass, compute vote_signature = Sign(vᵢ.secret_key, transition_hash || current_epoch).

  3. Send VOTE_RESPONSE(validator_id, vote_signature) to the sender.

  4. Record (sender, sequence, transition_hash) in local state to enable equivocation detection.

If any validation rule fails, the validator sends VOTE_REJECT(error_code, error_detail) to the sender. The validator MUST NOT sign a vote for a transition that fails any check.

CRITICAL: Step 4 is the equivocation lock. Once a validator has voted for transition t with (sender, sequence) = (A, 42), it MUST NOT vote for any other transition t with the same (A, 42). If it receives such a request, it MUST respond with ERR_EQUIVOCATION and broadcast an equivocation proof.

3.3.2 Phase 2: Certificate Assembly and Broadcast

The sender collects VOTE_RESPONSE messages. Once the sender has 2f+1 valid votes from distinct validators, it assembles a SettlementCertificate.

Message: SETTLEMENT_CERTIFICATE

sender → all validators

payload: SettlementCertificate

Upon receiving a SETTLEMENT_CERTIFICATE, each correct validator:

  1. Verifies the certificate contains ≥ 2f+1 valid, distinct votes for the referenced transition hash.

  2. Verifies that all vote signatures are valid under the respective validator public keys in the current epoch's validator set.

  3. Applies the transition to its local state: debits the sender's committed balance, credits each recipient's committed balance, increments the sender's sequence number.

  4. Stores the certificate and its transition as part of the permanent record.

After step 3, the transition is final. The sender's balance has been irrevocably reduced and the recipient's balance has been irrevocably increased. There is no rollback mechanism.

3.3.3 Recipient Notification

Recipients learn of incoming payments by one of the following mechanisms:

  • Push notification: Validators MAY push SETTLEMENT_CERTIFICATE messages to the recipient if the recipient is online and connected to the validator.

  • Pull query: Recipients MAY poll validators for new certificates addressed to their public key (or stealth addresses --- see SPEC-007).

  • Out-of-band: The sender MAY transmit the certificate directly to the recipient via any channel (QR code, NFC, Bluetooth, messaging app).

The recipient does not need to be online during the settlement. Certificates are persistent and can be claimed at any time. However, a recipient MUST submit a Receive transition (with the certificate as a causal dependency) to update their account state and make the received funds spendable.

3.4 Timing Analysis

Under normal network conditions (after GST), the protocol completes in:


Step Duration Cumulative

Sender → Validators RTT/2 (≈50ms 50ms (VOTE_REQUEST) intra-continental)

Validator processing + ≈10ms per transition 60ms signing

Validators → Sender RTT/2 (≈50ms) 110ms (VOTE_RESPONSE)

Sender assembles <1ms 111ms certificate

Sender → Validators RTT/2 (≈50ms) 161ms (CERTIFICATE)

Validator applies ≈10ms 171ms transition


Total wall-clock time from initiation to finality: approximately 170ms intra-continental. This is well below the 300ms threshold required for contactless payment terminals and comparable to current card network authorisation times.

The sender does not need to wait for all 2f+1 responses; it needs only the fastest 2f+1. With n validators geographically distributed, the effective latency is the (2f+1)-th order statistic of the RTT distribution, not the maximum.

3.5 Equivocation Handling

An equivocation occurs when a Byzantine sender attempts to issue two different transitions with the same sequence number, sending each to a different subset of validators.

3.5.1 Detection

If a validator vᵢ receives a VOTE_REQUEST for transition t with (sender, sequence) = (A, k), but has already voted for a different transition t with the same (A, k), then vᵢ constructs an equivocation proof:

struct EquivocationProof {

transition_1: Transition, // First observed transition

transition_2: Transition, // Conflicting transition

detector: PublicKey, // Validator that detected equivocation

detector_sig: Signature, // Validator's signature over the proof

}

3.5.2 Propagation

The detecting validator broadcasts the EquivocationProof to all other validators. Upon receiving a valid equivocation proof, every correct validator:

  1. Rejects both transitions permanently for this (sender, sequence) pair.

  2. Revokes any vote previously issued for either transition.

  3. Stores the equivocation proof as permanent evidence.

An equivocating account's funds are not lost but are frozen at the last known-good state. The account owner must submit a new transition with the correct sequence number (skipping the equivocated one) to resume operations. The protocol MAY impose a cooldown penalty (SPEC-010).

3.6 Sharding

Tier 1 supports horizontal sharding because each account is independent. A validator MAY partition its accounts across multiple machines (shards), each handling a disjoint subset of accounts. The partitioning function is: shard_id = hash(account_pubkey) mod num_shards.

Shards operate independently --- they share no state. A settlement between accounts on different shards requires the sender to contact validators on the sender's shard only (because only the sender's balance and sequence number are checked). The recipient's shard learns about the settlement when the certificate is presented.

This means throughput scales linearly with the number of shards. A validator with 16 shards across 16 machines can handle 16× the throughput of a single machine, with no coordination overhead.

SPEC-006: Cryptographic Primitives and Cipher Suites

6.1 Purpose

This specification defines all cryptographic operations used by the MESH protocol. All implementations MUST use the exact algorithms, parameters, and encodings specified here. Deviations will produce incompatible signatures and proofs, causing interoperability failures.

MESH uses a cipher suite abstraction that allows the protocol to upgrade cryptographic primitives without changing the protocol logic. Each cipher suite is a complete, internally consistent set of cryptographic algorithms.

6.2 Cipher Suite 0 (Launch Suite)

Cipher Suite 0 is the mandatory-to-implement suite for the initial protocol launch. It uses well-established, patent-free cryptographic primitives.


Operation Algorithm

Digital Signatures Ed25519 (RFC 8032). Curve: Curve25519. Key size: 32 bytes. Signature size: 64 bytes.

Key Agreement X25519 (RFC 7748). Ephemeral ECDH for session key establishment.

Hash Function SHA3-256 (FIPS 202). Output: 32 bytes. Used for all content hashing.

Extendable Output SHAKE256 (FIPS 202). Used for key derivation and domain separation.

Symmetric Encryption ChaCha20-Poly1305 (RFC 8439). For memo encryption and transport layer.

Commitment Scheme Pedersen Commitments over Curve25519. C = vG + bH. See SPEC-007.

Range Proofs Bulletproofs+ over Curve25519. See SPEC-007.

KDF HKDF-SHA3-256 (adapted from RFC 5869 using SHA3-256).


6.3 Cipher Suite 1 (Post-Quantum Hybrid)

Cipher Suite 1 adds post-quantum algorithms in a hybrid configuration. Security holds if either the classical or PQ assumption is unbroken. This suite is OPTIONAL for launch and MUST be supported within 18 months of mainnet.


Operation Algorithm

Digital Signatures Ed25519 || ML-DSA-65 (FIPS 204). Hybrid: both signatures are computed and concatenated. Verification requires BOTH to be valid. Combined signature size: 64 + 3309 = 3373 bytes.

Key Encapsulation X25519 || ML-KEM-768 (FIPS 203). Hybrid KEM: shared secret = HKDF(X25519_secret || ML-KEM_secret). Combined ciphertext: 32 + 1088 = 1120 bytes.

Hash Function SHA3-256 (unchanged --- already quantum-resistant).

Hash-based Signatures SLH-DSA-SHA2-128f (FIPS 205). Used for (fallback) long-term keys where signature size is less critical.

Backup KEM HQC-128 (NIST 5th standard). Used as secondary KEM for cryptographic diversity.


6.4 Key Formats

6.4.1 Account Key Pair

Each account has a single key pair used for signing transitions and receiving stealth payments.

struct AccountKeyPair {

secret_key: [u8; 32], // Ed25519 secret seed

public_key: [u8; 32], // Ed25519 public key = ScalarBaseMult(secret_key)

view_key: [u8; 32], // For stealth address scanning (see SPEC-007)

}

The view_key is derived deterministically: view_key = HKDF-SHA3-256(secret_key, salt="mesh-view-key", info="", length=32). The view_key allows a third party (e.g., a watch-only wallet) to detect incoming payments without the ability to spend them.

6.4.2 Validator Key Pair

Each validator has a signing key pair for voting on transitions. Validators MUST use threshold key generation (SPEC-010) so that no single ceremony participant knows the full secret key.

6.5 Domain Separation

All hash and signature operations MUST use domain separation to prevent cross-protocol attacks. The domain separator is a fixed-length prefix prepended to the input:

hash_transition = SHA3-256("MESH-TRANSITION-V0" || encode(transition))

hash_certificate = SHA3-256("MESH-CERTIFICATE-V0" || encode(certificate))

hash_equivocation = SHA3-256("MESH-EQUIVOCATION-V0" || encode(proof))

sign_vote = Sign(key, "MESH-VOTE-V0" || transition_hash || epoch)

Domain separators are ASCII strings, NOT null-terminated, and are NOT length-prefixed (their length is fixed per domain). If a new domain is added in a future version, it MUST use a unique prefix.

6.6 Cipher Suite Negotiation

During transport-layer handshake (SPEC-009), peers exchange their supported cipher suites ordered by preference. The highest-preference suite supported by both peers is selected. If no common suite exists, the connection MUST be rejected.

All validators MUST support Suite 0. Suite 0 MUST remain supported for at least 5 years after Suite 1 becomes mandatory, to allow migration. A validator MAY support multiple suites simultaneously and process transitions from accounts using different suites.

An account's cipher suite is determined by the format of its public key. Suite 0 keys are 32 bytes. Suite 1 keys are 32 + 1952 = 1984 bytes (Ed25519 pubkey || ML-DSA-65 pubkey). The first byte of the key encoding indicates the suite version.

6.7 Constant-Time Requirements

All cryptographic operations that process secret data MUST be implemented in constant time. Specifically:

  • Signature generation MUST NOT have data-dependent branches or memory access patterns.

  • Key comparison MUST use constant-time byte comparison (e.g., subtle::ConstantTimeEq in Rust).

  • Commitment generation and range proof computation MUST NOT leak the committed value through timing.

Implementations MUST be validated against timing side-channels using tools such as dudect or ctgrind. The formal verification effort (SPEC-010 §10.8) SHOULD include verification of constant-time properties at the assembly level.

SPEC-007: Privacy Layer

7.1 Purpose

This specification defines the privacy mechanisms that make settlement amounts and participant identities confidential by default. Every transition in MESH uses the mechanisms defined here. There is no "transparent mode" --- privacy is not optional.

7.2 Pedersen Commitments

All value amounts in MESH are represented as Pedersen commitments rather than plaintext integers. A Pedersen commitment to value v with blinding factor b is:

C = v·G + b·H

where G is the Ed25519 base point and H is a secondary generator point. The point H MUST be generated via a nothing-up-my-sleeve construction:

H = HashToCurve(SHA3-256("MESH-PEDERSEN-H-V0"))

using the hash-to-curve method specified in RFC 9380 (Elligator 2 for Curve25519). The discrete logarithm of H with respect to G is unknown and computationally infeasible to determine. This ensures the binding property: no one can open a commitment to a different value.

7.2.1 Commitment Operations

Pedersen commitments are additively homomorphic:

  • Addition: Commit(v₁, b₁) + Commit(v₂, b₂) = Commit(v₁ + v₂, b₁ + b₂). This allows validators to verify that inputs equal outputs by checking that the sum of input commitments equals the sum of output commitments + fee commitment.

  • Subtraction: Commit(v₁, b₁) - Commit(v₂, b₂) = Commit(v₁ - v₂, b₁ - b₂). Used for balance verification.

  • Scalar multiplication: k · Commit(v, b) = Commit(k·v, k·b). Used for exchange rate application.

Validators perform conservation checks entirely on commitment points. They never learn the underlying values.

7.2.2 Blinding Factor Management

The sender MUST generate a fresh, cryptographically random blinding factor for every commitment. Blinding factors MUST be generated from a CSPRNG seeded with at least 256 bits of entropy. Reusing blinding factors across commitments leaks information about the committed values.

The sender MUST transmit the blinding factor to the recipient (encrypted with the recipient's public key) so the recipient can verify and spend the received funds. The blinding factor is included in the encrypted memo field of the transition.

7.3 Bulletproofs+ Range Proofs

A Pedersen commitment hides the value but does not prevent negative values. Without range proofs, a malicious sender could commit to a negative amount, effectively creating value from nothing. Bulletproofs+ range proofs prove that a committed value lies in [0, 2⁶⁴) without revealing the value.

7.3.1 Parameters


Parameter Value

Curve Curve25519 (Ristretto group for Bulletproofs+)

Range [0, 2⁶⁴). All amounts are unsigned 64-bit integers in base units.

Proof size (single) Approximately 576-672 bytes depending on the number of range statements.

Aggregation Multiple range proofs in a single transition SHOULD be aggregated into a single proof. Aggregated proof size is O(log₂(n · 64)) group elements.

Proving time Target: < 500ms on a 2020-era mobile SoC (ARM Cortex-A78 or equivalent).

Verification time Target: < 10ms per proof on validator hardware.


7.3.2 Proof Generation

The sender generates a Bulletproofs+ range proof for each committed amount using the Fiat-Shamir heuristic for non-interactivity. The transcript MUST include the following domain-separated inputs, in order:

  1. The domain separator: "MESH-BP+-V0".

  2. The commitment point C (32 bytes, compressed Ristretto).

  3. The transition hash (32 bytes) --- binds the proof to the specific transition.

Implementations MUST use the Merlin transcript protocol for Fiat-Shamir challenges, as specified in the dalek-cryptography Bulletproofs library documentation. The proof encoding follows the dalek format: 2·⌈log₂(64)⌉ + 2 curve points + 3 scalars.

7.4 Stealth Addresses

Stealth addresses prevent observers from linking payments to a recipient's long-term public key.

7.4.1 Protocol

To send a payment to recipient with public key P_recipient and view key V_recipient:

  1. Sender generates an ephemeral key pair: (r, R = r·G).

  2. Sender computes shared secret: S = HKDF(r · V_recipient, salt="mesh-stealth", length=32).

  3. Sender computes one-time stealth address: P_stealth = P_recipient + SHA3-256(S)·G.

  4. Sender addresses the transition to P_stealth and includes R (the ephemeral public key) in the encrypted memo.

To detect incoming payments, the recipient (or a delegated scanner with the view key):

  1. For each new transition with recipient P_stealth and ephemeral key R:

  2. Compute S = HKDF(view_key · R, salt="mesh-stealth", length=32).

  3. Compute P_expected = P_recipient + SHA3-256(S)·G.

  4. If P_expected == P_stealth, this payment is for us. The spending key for this stealth address is: s_stealth = s_recipient + SHA3-256(S), where s_recipient is the recipient's secret key.

7.5 Selective Disclosure

When a participant needs to prove properties of their transactions to a third party (auditor, tax authority, counterparty), they generate a zero-knowledge proof that reveals only the required information.

Example disclosure types:

  • Balance proof: "My balance in asset X is at least Y." Proven by opening a range proof on the current balance commitment with a lower bound.

  • Transaction history proof: "My total outgoing transfers in period [t₁, t₂] were Z." Proven by aggregating commitments from the relevant transitions and opening the aggregate.

  • Counterparty proof: "I paid entity E exactly amount A on date D." Proven by revealing the blinding factor for a specific transition to the verifier.

Selective disclosure proofs are generated client-side by the disclosing party. Validators are not involved. The proofs are standard Schnorr proofs of knowledge of the opening of Pedersen commitments, which are straightforward to implement and verify.

SPEC-008: Value Routing and Exchange

8.1 Purpose

This specification defines how value is routed across multiple hops and exchanged between different asset types. This is the currency-agnostic layer that enables MESH to settle any form of value without being tied to a specific currency.

8.2 The MESH Packet

Inspired by the Interledger Protocol (ILPv4), MESH routes value in small packets. Each packet is an independent, atomic unit of value transfer.

8.2.1 Packet Structure

struct MeshPacket {

version: u8,

packet_type: PacketType, // enum: Prepare, Fulfill, Reject

destination: Address, // MESH address of final recipient

amount: u128, // Amount in the destination asset's base units

source_asset: AssetID, // Asset being sent

dest_asset: AssetID, // Asset to be received

condition: Hash, // PTLC condition (point, not hash --- see §8.4)

expiry: u64, // Unix timestamp

data: [u8; 32768], // End-to-end encrypted data (opaque to connectors)

}

8.3 Addressing

MESH uses a hierarchical address scheme inspired by IP addresses and ILP addresses:

mesh.<network>.<connector>.<account>

Examples:

  • mesh.mainnet.au-bank-connector.alice --- Alice's account via an Australian bank connector

  • mesh.mainnet.solar-exchange.grid42 --- Energy grid account via a solar exchange connector

Connectors route packets based on address prefixes, similar to IP routing tables. A connector that handles the prefix mesh.mainnet.au-bank-connector will accept packets addressed to any account under that prefix.

8.4 Point Time-Locked Contracts (PTLCs)

MESH uses PTLCs instead of HTLCs for atomic multi-hop settlement. PTLCs use adaptor signatures rather than hash preimages, providing two critical privacy improvements:

  1. No correlation: In HTLCs, the same hash preimage is used across all hops, allowing any observer to link hops in the same payment. In PTLCs, each hop uses a different adaptor point, making hops unlinkable.

  2. Scriptless: PTLCs do not require the underlying settlement layer to support hash locks or any scripting. They work with plain Schnorr signatures, which are supported in Suite 0.

8.4.1 PTLC Construction

Setup: Sender Alice wants to pay Recipient Bob through Connector Charlie.

  1. Alice generates a random secret scalar s and computes the corresponding point Y = s·G.

  2. Alice sends a Prepare packet to Charlie with condition Y.

  3. Charlie generates a new random scalar s and computes Y = s·G + Y (his adaptor is offset from Alice's).

  4. Charlie sends a Prepare packet to Bob with condition Y.

  5. Bob knows the expected Y (communicated by Alice out-of-band in the encrypted data field). Bob computes the adaptor signature under Y and sends a Fulfill to Charlie.

  6. Charlie uses Bob's adaptor signature to recover s, then computes the adaptor signature under Y for Alice. Charlie sends Fulfill to Alice.

  7. Alice uses Charlie's adaptor signature to recover s, confirming the payment completed.

At each hop, the adaptor point is different, so an observer who sees the (Charlie → Bob) hop cannot link it to the (Alice → Charlie) hop. The math ensures atomicity: either all hops complete (everyone learns their respective secrets) or none do (timeouts expire and funds are refunded).

8.5 Packet Splitting

Large payments are split into small packets to minimise per-packet risk:

  • Default packet size: Configurable per connector, recommended default: 1000 base units of the source asset (~$10 AUD at standard precision).

  • Parallelism: Multiple packets MAY be sent simultaneously along different paths.

  • Retry: If a packet is rejected (Reject response), the sender MAY retry on a different path.

  • Completion: The payment is complete when the sender has received Fulfill for all packets. Partial completion is possible (some packets fulfilled, others expired). The sender's wallet is responsible for retrying or notifying the user.

The recipient's wallet MUST be able to reconstruct the total payment from individual packets. The sender includes a payment_id and packet_index in the encrypted end-to-end data of each packet.

8.6 On-Ramp and Off-Ramp

Value enters and exits the MESH network through on-ramp and off-ramp connectors. These are connectors that bridge between MESH and external settlement systems (bank accounts, card networks, mobile money, blockchains).

8.6.1 On-Ramp Protocol

  1. User deposits value into the on-ramp connector's external account (e.g., bank transfer).

  2. On-ramp connector verifies the deposit on the external system.

  3. On-ramp connector initiates a Tier 1 settlement crediting the user's MESH account with the corresponding committed amount.

  4. The on-ramp transition includes a reference to the external deposit (e.g., bank transaction ID) in the causal_deps field (as an opaque hash) for auditability.

On-ramp connectors are trust points: the user must trust the connector to honour deposits. This is analogous to trusting a bank with a deposit. The MESH protocol does not eliminate this trust requirement --- it minimises it by making the on-ramp the only point where external trust is needed.

8.6.2 Off-Ramp Protocol

  1. User initiates a settlement to the off-ramp connector's MESH account.

  2. Off-ramp connector receives the settlement certificate.

  3. Off-ramp connector initiates the external transfer (e.g., bank transfer to user's bank account).

  4. Off-ramp connector provides the user with an external settlement proof (e.g., bank transaction confirmation).

The off-ramp connector bears counterparty risk: it has already received value on MESH and must honour the external transfer. Connectors manage this risk through reputation, insurance, or regulatory compliance.

SPEC-010: Validator Operations and Governance

10.1 Purpose

This specification defines validator lifecycle management, the governance model for protocol upgrades, the fee model, and the formal verification requirements. Validators are the infrastructure backbone of MESH. This spec ensures validators are incentivised, accountable, and replaceable.

10.2 Validator Set

The validator set is the set of public keys authorised to vote on settlements. It is defined per epoch.

10.2.1 Epochs

An epoch is a period during which the validator set is fixed. Epoch duration is a governance parameter; the recommended initial value is 24 hours. At each epoch boundary:

  1. The new validator set is computed based on the governance protocol's decisions.

  2. Validators perform a distributed key generation (DKG) ceremony to produce new threshold signing keys.

  3. The new epoch is activated when 2f+1 validators have confirmed readiness.

10.2.2 Initial Validator Set

The genesis epoch's validator set is hardcoded in the protocol specification. It consists of 7 validators operated by the founding organisations. This is an acknowledged centralisation point that is mitigated by:

  • A public commitment to expand to 21 validators within 12 months of mainnet launch.

  • A public commitment to transition to reputation-based entry within 36 months.

  • All validator software, keys (public), and operational procedures are published.

  • Any single founding validator can be removed by a 5/7 vote of the remaining validators.

10.3 Fee Model

Validators are compensated through per-settlement fees paid by the sender. Fees are denominated in the settlement's asset type (not in a native token).

10.3.1 Fee Structure

The fee for a Tier 1 settlement is: fee = max(base_fee, amount × fee_rate), where:

  • base_fee: Minimum fee per settlement. Governance parameter. Recommended initial value: equivalent of $0.001 AUD.

  • fee_rate: Proportional fee rate. Governance parameter. Recommended initial value: 0.001% (1 basis point).

Tier 2 settlements pay 2× the Tier 1 fee (to reflect the higher resource cost of consensus). Tier 3 settlements pay 3×.

Fees are committed (Pedersen commitment) just like amounts. Validators verify the fee meets the minimum using range proofs but do not learn the exact amount. Fee revenue is distributed equally among all validators in the epoch.

10.4 Governance Protocol

Protocol changes follow a structured process:

10.4.1 MESH Improvement Proposals (MIPs)

  1. Draft: Anyone may submit a MIP to the public repository. MIPs must include: motivation, specification changes (in the format of this document suite), backward compatibility analysis, security analysis, and formal verification plan.

  2. Review: Minimum 30-day public review period. All feedback must be addressed in writing.

  3. Formal Verification: For any MIP affecting Tier 1, 2, or 3 protocols, the changed properties must be re-verified in TLA+ and/or Tamarin. Proof artifacts must be published.

  4. Validator Vote: 2/3 supermajority of the current validator set must vote to accept. Voting is on-chain (a Tier 2 settlement to a governance contract address).

  5. Activation: Accepted MIPs are activated at the next epoch boundary (or a specified future epoch). Validators that have not upgraded by activation are automatically excluded from the new epoch's validator set.

10.5 Key Management

Validator signing keys are generated using a distributed key generation (DKG) protocol. The DKG ensures:

  • No single party ever knows the full signing key.

  • Any t-of-n subset of validators can produce a valid signature (threshold t = 2f+1).

  • The key generation ceremony is verifiable: all participants can confirm the output is correct.

The specific DKG protocol is Pedersen's DKG (1991) with Feldman's VSS (1987) for verifiability. These are patent-free, well-studied protocols with existing open-source implementations.

10.6 Formal Verification Requirements

The following properties MUST be formally verified before mainnet launch. "Formally verified" means: a machine-checked proof exists in a published proof artifact, using one of the specified tools, and the proof artifact is reproducible from source.


Property Tool Scope

No double-spend (SAFETY-1) TLA+ (TLC model Tier 1 protocol state checker) machine, up to 5 validators, 3 accounts

Value conservation TLA+ Tier 1 and Tier 2 (SAFETY-2) settlement paths

Liveness (LIVENESS-1) TLA+ Tier 1 protocol, partial synchrony model

Signature unforgeability Tamarin Prover Ed25519 signing/verification protocol

Commitment binding Tamarin Prover Pedersen commitment scheme

PTLC atomicity Tamarin Prover Two-hop PTLC construction

Stealth address ProVerif Stealth address unlinkability generation and detection protocol

Key secrecy (DKG) Tamarin Prover Distributed key generation ceremony


For each entry in this table, the verification MUST cover: (a) the stated property holds under the threat model (SPEC-001 §1.4.2), (b) the property is violated if the threat model assumptions are weakened (sanity check), and (c) the proof artifact is published alongside the specification.

Verification of the implementation (as opposed to the protocol model) is a continuous process. The reference implementation MUST pass all test vectors derived from the formal models. Property-based testing (e.g., using proptest in Rust) MUST cover at least 90% of the protocol state space as measured by state coverage analysis.

10.7 Test Vectors

Each specification MUST include a set of test vectors: known input/output pairs that any conformant implementation MUST produce identically. Test vectors are provided as JSON files in the protocol repository under /test-vectors/{spec-id}/. At minimum, each specification requires:

  • 10 positive test vectors (valid inputs that must be accepted).

  • 10 negative test vectors (invalid inputs that must be rejected with the specified error code).

  • 5 edge case vectors (boundary conditions, maximum values, empty collections).

Test vector files include: the input data (hex-encoded), the expected output (hex-encoded), and a human-readable description of what the test verifies.

Document Control

Revision History


Version Date Author Description

0.1.0 2026-03-09 MESH Foundation Initial draft. Specifications 001, 002, 003, 006, 007, 008, 010.


Outstanding Items

  • SPEC-004 (Tier 2 DAG-BFT): Draft in progress. Requires clean-room protocol synthesis from academic literature.

  • SPEC-005 (Tier 3 aBFT): Draft in progress. Protocol selection pending performance benchmarking.

  • SPEC-009 (Network Transport): Draft in progress. Wire protocol and peer discovery.

  • Test vectors: To be generated after reference implementation reaches alpha.

  • Formal verification artifacts: TLA+ models in progress for SPEC-003.

References

  • Bracha, G. (1987). Asynchronous Byzantine agreement protocols. Information and Computation, 75(2), 130-143.

  • Baudet, M., Danezis, G., Sonnino, A. (2020). FastPay: High-Performance Byzantine Fault Tolerant Settlement. ACM AFT 2020.

  • Bünz, B., Bootle, J., Boneh, D., Poelstra, A., Wuille, P., Maxwell, G. (2018). Bulletproofs: Short Proofs for Confidential Transactions and More. IEEE S&P 2018.

  • Bünz, B., Agrawal, S., Zamani, M., Boneh, D. (2020). Bulletproofs+. Crypto 2020.

  • FIPS 202: SHA-3 Standard. NIST, 2015.

  • FIPS 203: ML-KEM. NIST, 2024.

  • FIPS 204: ML-DSA. NIST, 2024.

  • FIPS 205: SLH-DSA. NIST, 2024.

  • RFC 8032: Edwards-Curve Digital Signature Algorithm (EdDSA).

  • RFC 8439: ChaCha20 and Poly1305 for IETF Protocols.

  • RFC 9380: Hashing to Elliptic Curves.

  • Thomas, S., Schwartz, E. (2015). Interledger Protocol (ILP). W3C Community Group.

  • Pedersen, T.P. (1991). Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing. CRYPTO 1991.

  • Feldman, P. (1987). A practical scheme for non-interactive verifiable secret sharing. FOCS 1987.