ExchainDocs
DocsAPI

Verification and securityTrust model

Trust model

Who holds which key, what each party checks, and what each failure can and cannot do.

Review Exchain's authorization the way an attacker would: the co-sign service decides but holds no key that signs payments, signatures come from the attested quorum, and every member of the attested quorum must sign.

Trust boundaries
Your sideExchain serviceAttested quorumPublicAgent keyOwner keyCo-sign serviceno custody keyDaemonAttested signerSealed key vaultapproved code onlyChainJournalrequestsign requestattested callunseal keywitnesspublishessubmitsexit, no Exchain
Keys that can sign payments live only in the attested signers; the owner reaches the chain without Exchain.

The attested quorum

The attested quorum is the set of independent signers that co-sign for Exchain. Each member runs in a hardware-isolated AWS Nitro Enclave and is verified against the approved image (PCR0) before it is used. Every member must sign. A wallet names each member's key, and the health endpoint lists them.

Keys

KeyHeld byPurpose
Agent keyYour nodeSigns every agent spend
Owner keyThe owner; keep it coldExit, policy changes, agent rotation
Enclave keysOne per quorum member: Ed25519, plus an EVM key derived from it. Generated inside the member's enclave and sealed with KMS to the approved image (PCR0)Co-sign agent spends
Journal publisher keyEd25519 software key on the service hostSigns wallet roots, x402 guard receipts and bound statements
Anchoring keyPlain Cardano key on the service hostPays for the daily anchor transaction

Why every member signs

  • Every quorum key must be in required_signers (otherwise quorum_incomplete), and Cardano needs a witness for each one. On EVM chains the Safe threshold is all owners. So every quorum member must sign.
  • Any single member's refusal stops the payment.
  • One member down means 503 and nothing moves.
  • Owner exit needs no Exchain key.

Attestation

  1. Each enclave key is sealed with an AWS KMS key whose policy releases it only to the approved image measurement (PCR0). Debug enclaves are rejected.
  2. The daemon on each enclave's host verifies a fresh Nitro attestation (random nonce, AWS root, PCR0, public key) and reuses it for at most 5 minutes. Without one it refuses to sign, and the API answers 503.
  3. GET /v1/wallets/{walletId}/health (token required) shows each member's reachable, attestationAgeSec and pcr0; GET /v1/x402/signers lists the enclave EVM addresses with their PCR0. For mainnet EVM chains, the service also verifies the EVM attestation itself, with its own nonce.

What each enclave checks

RailEach enclave checksEach enclave does not check
CardanoThe transaction rules on its own clock: network, one wallet input, continuing output and state token, payee pinning, governed assets and the 6 ADA rider, fee ≤ 10 ADA, escrow datum and claims, spent ≤ limit and minimum balance on the continuing datum, validity window, required signersMandate limits, seller gates, registry and price gates (service only). On layer 1, the real outflow and period roll-over arithmetic (service only, because it reads the live UTxO)
EVM chainsThe typed data (an EIP-3009 or Permit2 authorization, or a Safe transaction for a token without EIP-3009) against the wallet and the claim; an authorization's window ≤ 600 sMandate limits and seller binding (service only)

The wallet details the enclave checks against (wallet, escrow and agent addresses, quorum) are supplied by the service.

If something is compromised

CompromisedCanCannot
Agent keyRequest paymentsSpend outside the mandate; the on-chain ceiling also bounds it if the service is bypassed
Co-sign serviceAllow payments the mandate should refuse, up to the on-chain period ceiling, for transactions the agent built and signed. Stop signing. Stop publishing roots or anchoringSpend without the agent's signature. Make an enclave sign an output to anything other than an address the service declared as escrow or agent, move unlisted assets, exceed the datum limits or sign outside the validity window. Rewrite anchored history without the break showing
One quorum memberRefuse to sign, which stops all paymentsSign alone; every payment needs every quorum member and the agent
Agent key and every Exchain keyMove at most the remainder of the current on-chain period ceiling, to any addressChange the ceiling or block the owner's exit
Exchain disappearsAgent spends stopLock funds: the owner exits with the owner key alone

On EVM chains, the hard ceiling is the Safe's balance of each governed asset, plus the treasury allowance when one is set.

Records

  • Each daemon writes a hash-chained sign log before every signature, on the enclave's host.
  • Every enclave answer carries boot_id and enclave_seq. A gap reveals an unlogged call.
  • The service writes and fsyncs its request and signer ledgers before acting.
  • Seven reconciliation checks run every 5 minutes. Any mismatch pages an engineer.
  • Ledgers ship every minute to put-only storage with S3 Object Lock. Ledger heads are the last leaf of every run root, which the daily Cardano mainnet anchor commits to.

Private data

  • The journal never shows counterparties, job hashes, agent identifiers, purchase ids, bounds or the wallet UTxO ref.
  • Amounts appear only after settlement.
  • Ledgers never store tokens or session ids.

Report a vulnerability

Email security@exchain.network.

On this page