Why Blockchain
The hash chain (Layer 1) detects tampering — but only if you trust that the hashes themselves haven’t been rewritten. Blockchain anchoring removes that trust requirement. By publishing Merkle roots to a public blockchain, we create a permanent, independently verifiable record that exists outside our control. Even if we rewrote our entire database and recomputed every hash, the on-chain Merkle roots would not match.How It Works
Collect events
Immutable groups all events created within an anchoring period (daily by default) for each workspace.
Build Merkle tree
A binary Merkle tree is constructed from the event hashes. If the number of leaves is odd, the last leaf is duplicated. The tree is reduced to a single 64-character hex root.
Submit to Base
The Merkle root is submitted to the
ImmutableAnchor smart contract on the Base blockchain (Chain ID 8453) — an Ethereum L2.The Merkle tree is a standard binary tree. When the number of leaves is odd, the last leaf is duplicated to complete the pair. This produces a single 64-character hex root that represents all events in the period.
The Smart Contract
TheImmutableAnchor.sol contract is deliberately simple — its only job is to permanently record Merkle roots:
Anchored event log is permanent and publicly readable. Anyone can query it from Basescan or directly from a Base node.
Why Base
Base is an Ethereum L2 (Layer 2) rollup. It provides:| Property | Benefit |
|---|---|
| Low transaction cost | Anchoring costs fractions of a cent per workspace per day |
| Fast confirmations | Transactions confirm in seconds, not minutes |
| Ethereum security | Inherits Ethereum’s security guarantees via rollup proofs |
| Public and permissionless | Anyone can read the chain — no account or API key needed |
| Chain ID 8453 | Standard EVM chain, supported by all major tools |
Anchor Lifecycle
Each anchor transitions through three statuses:| Status | Meaning |
|---|---|
pending | Merkle root computed, transaction not yet sent |
submitted | Transaction sent to Base, awaiting confirmation |
confirmed | Transaction confirmed on-chain, tx_hash and block_number recorded |
Anchor Chaining
Anchors are themselves chained. Each anchor stores aprevious_anchor_hash computed from the previous anchor:
Basescan Verification
Every confirmed anchor includes anexplorer_url pointing directly to the transaction on Basescan:
- Confirm the transaction exists and is confirmed
- Read the
Anchoredevent log - Extract the
merkleRootbytes32 value - Compare it to what Immutable reports via the API