Overview
The CHAIN layer is an optional component that anchors proof records to an external blockchain or distributed ledger. This provides independent verification that proof records existed at a specific time and have not been tampered with.
Note: CHAIN layer is required for BASIS Complete conformance but optional for BASIS Core.
Responsibilities
- •Batch proofs — Aggregate multiple proof records for efficient anchoring
- •Create anchor — Submit Merkle root or aggregate hash to blockchain
- •Store reference — Record blockchain transaction ID with proof records
- •Verify anchors — Provide verification that proofs were anchored at claimed time
Requirements
MUSTAnchor proof batches within 24 hours of creation
MUSTStore blockchain transaction reference with anchored proofs
MUSTProvide API to verify anchor for any proof
SHOULDUse established blockchain (Ethereum, Polygon, etc.)
MAYSupport multiple blockchain targets
Anchoring Process
┌─────────────────────────────────────────────────────────────┐
│ Proof Records │
│ prf_001 prf_002 prf_003 prf_004 prf_005 ... │
└─────────────────────────────────────────────────────────────┘
│
▼ Batch (e.g., every hour)
┌─────────────────────────────────────────────────────────────┐
│ Merkle Tree │
│ │
│ ROOT │
│ / \ │
│ H(01+02) H(03+04) │
│ / \ / \ │
│ H(01) H(02) H(03) H(04) │
└─────────────────────────────────────────────────────────────┘
│
▼ Submit Merkle root
┌─────────────────────────────────────────────────────────────┐
│ Blockchain │
│ Transaction: 0xabc123... │
│ Data: Merkle root hash │
│ Timestamp: Block #12345678 │
└─────────────────────────────────────────────────────────────┘AnchorRecord Schema
{
"anchor_id": "anc_def456ghi",
"timestamp": "2026-01-15T11:00:00Z",
"proof_ids": [
"prf_xyz789abc",
"prf_uvw456def",
"prf_rst123jkl"
],
"merkle_root": "sha256:b3c4d5e6f7g8...",
"blockchain": {
"network": "polygon",
"chain_id": 137,
"transaction_hash": "0x1a2b3c4d5e6f...",
"block_number": 52345678,
"block_timestamp": "2026-01-15T11:00:15Z"
},
"verification_url": "https://polygonscan.com/tx/0x1a2b3c..."
}Supported Blockchains
| Network | Chain ID | Cost | Finality |
|---|---|---|---|
| Ethereum Mainnet | 1 | ~$5-50/tx | ~15 minutes |
| Polygon | 137 | ~$0.01/tx | ~2 minutes |
| Arbitrum One | 42161 | ~$0.10/tx | ~1 minute |
| Base | 8453 | ~$0.01/tx | ~2 minutes |
Verification Process
To verify a proof was anchored:
- Retrieve the proof record and its anchor reference
- Fetch the Merkle proof (path from proof to root)
- Recompute the Merkle root using the proof and path
- Fetch the blockchain transaction
- Verify the transaction contains the expected Merkle root
- Verify the block timestamp matches expected anchor time
Failure Handling
Blockchain unavailable
Impact: Non-critical — proofs remain valid in PROOF layer
Action: Queue for later anchoring, retry with backoff
Transaction fails
Impact: Anchoring delayed, proofs unaffected
Action: Retry with adjusted gas, alert if persistent
Verification fails
Impact: Potential tampering or data corruption
Action: Security alert, do not trust affected proofs