Desk

State

MonadDb: the database is part of the consensus budget

A parallel executor that waits on a disk built for one reader is not parallel. MonadDb is the state store shaped around many readers and the Merkle work a block actually does.

MONAF Desk · 25 October 2026 · 7 min

Trie
Not a filing cabinet
Parallel
Readers at once
Lagging
State vs header
eth_call
Committed view

Most of the time in an EVM call is not the arithmetic. It is finding the word of state the call wants, proving that word sits in the Merkle tree, and writing the new word back. A client that does this through a general-purpose database pays a tax on every read: extra copies, a layout that is not the tree, and a lock that assumes one thread. Monad’s answer is MonadDb, a store built for that tree and for many readers at once.

SHAPE, NOT A BENCHMARKMost of the call is finding stateState read46%Merkle proof28%Compute14%Write-back12%
Where a typical EVM call spends its time. The bars are illustrative of the shape, not a benchmark of one contract.

Why it sits under the executor

Optimistic parallel execution issues many reads before it knows which transactions will survive. If those reads queue behind one another, the parallelism was theatre. MonadDb is the component that makes the concurrent reads cheap enough that the replay path, not the disk, is the limiting factor. Asynchronous execution makes the same demand one level up: execution is still flushing the last block while consensus has moved on, so the store cannot be a single lock held across both.

For people who do not run a validator, the consequence is indirect and practical. Indexers that reconstruct state by replaying every receipt from genesis will feel the block rate first. At 300 milliseconds, a naive poller that asks for “the latest block” on a one-second timer is already three blocks behind and does not know it. Historical state, the kind a trader wants when they ask what a pool looked like at a given slot, is an indexer problem. The chain will give you the current root quickly. It will not file your notebooks.

If the database is slow, the parallel executor is a diagram.

What not to infer

MonadDb does not make an archive query free, and it does not remove the need for a receipt. A dapp that reads state through the standard eth_call path gets the concurrency the node has. A dapp that scrapes logs in a single thread gets the concurrency it wrote. The database is part of the chain’s budget. It is not part of yours until your client uses it.

Store the tree in the shape of the proof

Account state on an EVM chain is a Merkle Patricia trie. A call does not want “the next row”. It wants a scattered word, and a proof that the word sits where the state root says it sits. A stock database stores bytes in an order chosen for general files, then the client reconstructs the proof. MonadDb is the store built the other way round: the layout follows the trie, and many readers can be in it at once. Those readers are required by the executor. Optimistic parallelism issues state reads before it knows which transactions will survive the conflict check. If the reads queue, the diagram of parallel execution was a drawing.

More than one version is in the building

While execution is speculative, the store is holding work that a replay may throw away. That is a database problem, not a slogan. Versions have to be cheap to keep and cheap to drop, or the node takes a lock and becomes serial at the exact moment the scheduler tried not to be. Application code does not see those versions. An eth_call is answered from committed state. It is not answered from the speculative fork, and it is not answered from three slots ago unless the node you asked has kept the history. “The chain is fast” and “this RPC has the history I wanted” are separate sentences.

Sources

  1. 1Monad — How Monad Works
  2. 2Monad developer documentation