ExchainDocs
DocsAPI

Verification and securityJournal

Journal

The public record of every decision: signed wallet roots, run roots and daily Cardano mainnet anchors.

Every decision Exchain makes, allowed or refused, lands in a public journal at journal.exchain.network: signed every hour per wallet, and anchored once a day on Cardano mainnet.

From decision to anchor
DecisionsWallet roothourly, signedRun roothourly, unsignedLedger headsCardano anchordaily, on mainnetMerkle treeMerkle treelast leafcommitted dailyDecisionsWallet roothourly, signedRun roothourly, unsignedLedger headsCardano anchordaily, on mainnetMerkle treeMerkle treelast leafcommitted daily
Each decision is in a signed wallet root, and each day one Cardano mainnet transaction commits to a run root.

Layers

LayerBuilt fromProtected byCadence
Decision leafblake2b-256 over the decision with the domain string exchain.decision.v1: decision id, wallet id, wallet input, transaction body hash, outcome, and per purchase its id, output, amount, asset, counterparty, job hash, agent identifier, verdict, code and numbers. Byte layout below—Every decision
Wallet rootMerkle root of the wallet's leaves since its last recordEd25519 signature by the publisher key over canonical JSON of 12 fields: schemaVersion, walletId, epoch, fromSeq, toSeq, count, root, from, to, publishedAt, publisherKeyHash, auditHeadEvery hour
Run rootMerkle root of all wallet roots in wallet-id order, plus sha256(auditHead) as the last leafNot signed. Committed by the anchorEvery hour
AnchorCardano mainnet transaction with metadata label 1958: { v, root, walletCount, epochRange }Cardano mainnetOnce per UTC day, on the first run after 00:00 UTC. Includes decisions from every network and chain

Merkle rule: each node is SHA-256(left ‖ right), and a lone last node is paired with itself. The anchor fixes that run's wallet roots and the ledger heads.

Anchor metadata, label 1958
{ "1958": { "v": 1, "root": "<32 bytes>", "walletCount": 27, "epochRange": [2, 1198] } }

Statuses

StatusMeaning
pendingNo root includes the decision yet
signedIn a signed wallet root and run; no landed anchor at or after its run
anchoredThe first landed anchor at or after its run is its own run's
coveredA later run's anchor is the first to land after this decision's run

Public and private fields

In the leafOn the public journal
Decision id, wallet id, outcome, transaction body hash, member count, per-member verdict and codeYes
AmountOnly after settlement, totalled per asset
Counterparty, job hash, agent identifier, purchase id, bound, used, attempted, wallet UTxO refNo

Recomputing a leaf needs the decision JSON from GET /v1/decisions/{decisionId} or the evidence bundle.

Files

Served at https://journal.exchain.network without credentials.

FileContent
publisher.json{ keyHash, vkey } of the publisher key
latest.jsonThe latest run, with its signed wallet records
<walletId>/<epoch>.jsonOne signed wallet record, with its anchor once landed
<walletId>/latest.jsonThe wallet's latest signed record
d/<decisionId>.jsonDecision summary, verdicts, proof and status
w/<walletId>.jsonWallet counts and up to 500 newest decisions
tx/<hash>.jsonPointer from a transaction hash to a decision or run
anchors.jsonEvery anchored run: run, txHash, slot, network, root
recent.jsonJournal statistics and anchoring status
history/<scope>-<n>.jsonAll decisions in pages of 500, oldest first

API alternative: GET /v1/journal/roots?walletId=&from=&to=, no token. Check a decision step by step: Verify a decision.

On this page