The hash chain
Every decision record is chained to the one before it:canonicalize sorts every object key recursively, so the same logical record always
serializes to the same bytes. verifyChain(records) recomputes every link and returns
the first sequence number where it breaks, if any.
Ed25519 signatures
The hash chain proves nothing was altered after the fact. It does not, by itself, prove who produced it. Every record is additionally signed:signerPubkey:
replay(corpus) === ledger.
Records produced in CI/replay with no configured keypair carry no signature — this is
expected, not an error.
signature and signerPubkey are optional fields.Merkle inclusion proofs
At each on-chain checkpoint (see below), Tissue builds a real binary Merkle tree over every decision hash from genesis through that checkpoint, and anchors the root. Anyone can then request a proof that a specific decision is included in that anchored root:On-chain anchoring
Two real, distinct anchoring mechanisms exist, both using Solana’s standard SPL Memo program (TxLINE’s own oracle program has no generic commitment instruction, so Memo is the correct tool — not a workaround):- Pre-Match Commitment (“Proof of Edge”). Before any in-play score message is folded into match state, Tissue’s opening priced markets are hashed and anchored in a real, confirmed transaction — proving the model was committed before kickoff, not fit retroactively.
- Periodic checkpoint anchoring. At a configurable decision interval
(
policy.exec.checkpoint_interval_decisions), the current Merkle root over every decision so far is anchored again — continuous on-chain evidence through the match, not just a single pre-kickoff snapshot.
/state.
Signed policy snapshots
policy.toml is the single source of truth for every tunable constant in the pricing
and risk logic — no magic numbers live in code. At boot, Tissue hashes the canonical
policy object and signs it with the same operator keypair, appending a new entry to a
durable log only when the policy actually changed since the last recorded boot:
Source proof verification
Every score and odds message is checked against TxLINE’s own Merkle proof endpoints and validated on-chain (validate_odds / validate_stat) before it can enter the decision
pipeline. This is fail-closed: a message that fails verification is never admitted, not
quoted around and flagged after the fact.
This tamper-detection logic is directly tested, not just assumed correct: a dedicated
suite constructs matching stream-message/proof pairs and then tampers each field one at
a time (message ID, fixture, market, prices, in-running state, batch window) to confirm
every mismatch is actually rejected. A separate adversarial suite feeds the ingest
pipeline deliberately corrupted raw payloads — non-numeric timestamps, out-of-range
scores, non-numeric odds prices — and asserts they’re rejected or safely clamped rather
than silently corrupting downstream pricing.
Full replay
replay(corpus) === ledger is asserted in CI on every build. Given the exact same
ordered feed, Tissue always produces the exact same hash chain — no wall-clock
dependence, no non-determinism.