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
1
Collect events
Immutable groups all events created within an anchoring period (daily by default) for each workspace.
2
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.
3
Submit to Base
The Merkle root is submitted to the
ImmutableAnchor smart contract on the Base blockchain (Chain ID 8453) — an Ethereum L2.4
Confirm on-chain
Once the transaction is confirmed, the anchor record is updated with the transaction hash, block number, and explorer URL.
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:Anchor Lifecycle
Each anchor transitions through three statuses: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