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.
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
| Key | Held by | Purpose |
|---|---|---|
| Agent key | Your node | Signs every agent spend |
| Owner key | The owner; keep it cold | Exit, policy changes, agent rotation |
| Enclave keys | One 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 key | Ed25519 software key on the service host | Signs wallet roots, x402 guard receipts and bound statements |
| Anchoring key | Plain Cardano key on the service host | Pays for the daily anchor transaction |
Why every member signs
- Every quorum key must be in
required_signers(otherwisequorum_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
503and nothing moves. - Owner exit needs no Exchain key.
Attestation
- 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.
- 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. GET /v1/wallets/{walletId}/health(token required) shows each member'sreachable,attestationAgeSecandpcr0;GET /v1/x402/signerslists 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
| Rail | Each enclave checks | Each enclave does not check |
|---|---|---|
| Cardano | The 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 signers | Mandate 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 chains | The 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 s | Mandate 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
| Compromised | Can | Cannot |
|---|---|---|
| Agent key | Request payments | Spend outside the mandate; the on-chain ceiling also bounds it if the service is bypassed |
| Co-sign service | Allow 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 anchoring | Spend 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 member | Refuse to sign, which stops all payments | Sign alone; every payment needs every quorum member and the agent |
| Agent key and every Exchain key | Move at most the remainder of the current on-chain period ceiling, to any address | Change the ceiling or block the owner's exit |
| Exchain disappears | Agent spends stop | Lock 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_idandenclave_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.