Execution
Are there any differences in opcode pricing?
Are there any differences in opcode pricing?
How does Monad's optimistic parallel execution manage interdependent transactions?
How does Monad's optimistic parallel execution manage interdependent transactions?
| Transaction # | What happens |
|---|---|
| 0 | Alice sends Bob 5 USDC |
| 1 | Bob sends Charlie 10 USDC |
| Pending Result # | Inputs | Outputs |
|---|---|---|
| 0 | Alice: 100 Bob: 100 | Alice: 95 Bob: 105 |
| 1 | Bob: 100 Charlie: 100 | Bob: 90 Charlie: 110 |
In optimistic parallel execution, transactions get re-executed if their first execution was done with inputs that subsequently were mutated. What if there is a long list of serially dependent transactions?
In optimistic parallel execution, transactions get re-executed if their first execution was done with inputs that subsequently were mutated. What if there is a long list of serially dependent transactions?
Do I need to change my code to take advantage of Monad’s parallelism? Would it make sense to split my contract into many contracts to reduce the probability of two transactions touching the same contract?
Do I need to change my code to take advantage of Monad’s parallelism? Would it make sense to split my contract into many contracts to reduce the probability of two transactions touching the same contract?
What specific optimizations does MonadDB introduce over traditional databases for EVM state storage?
What specific optimizations does MonadDB introduce over traditional databases for EVM state storage?
io_uring and by bypassing the filesystem. io_uring is a new linux kernel technology that
allows execution threads to issue I/O requests without stalling or tieing up threads. This allows
many I/O requests to be issued in parallel, sequenced by the kernel, and serviced by the first
available thread on return.Finally, in MonadDb, each node in the trie is versioned, allowing for intuitive maintenance of
the merkle trie and efficient state synchronization algorithms. Only the necessary trie
components are sent during statesync, making bootstrapping and recovery faster.Why doesn't Monad make EIP-2930 access lists mandatory? Wouldn’t it make execution more efficient?
Why doesn't Monad make EIP-2930 access lists mandatory? Wouldn’t it make execution more efficient?
- Usage of access lists generally increases the size of transactions; long-term we think that bandwidth is the biggest bottleneck
- In Ethereum, the workflow for a user to submit using access lists is: simulate the transaction, note which storage slots are accessed, then submit the transaction with these slots mentioned in the access list. However, the state of the world may change between simulation and the real execution; we feel that it’s the job of the system to handle this gracefully under the hood.
- It would break integrations with existing wallets which don’t support EIP-2930.
- Note that EIP-2930 access lists are actually underspecified, at least from the perspective of anticipating state contention. If two transactions both read from the same storage slot (but neither writes to it) then, with respect to that storage slot, there is no state contention - neither transaction can invalidate the other’s computation. Contention only occurs when an earlier transaction writes to a storage slot that a later transaction will read. EIP-2930 access lists mention which storage slots are accessed, but don’t make note of whether the transaction will read from or write to that storage slot.
Consensus
How are leaders selected?
How are leaders selected?
- An epoch occurs roughly every 5.5 hours (50000 blocks). Validator stake weights are locked in one epoch ahead (i.e. any changes for epoch N+1 must be registered prior to the start of epoch N).
- At the start of each epoch, each validator computes the leader schedule based on running a deterministic pseudorandom function on the stake weights. Since the function is deterministic, everyone arrives at the same leader schedule.
How many nodes can participate in consensus? Is participation permissionless?
How many nodes can participate in consensus? Is participation permissionless?
ACTIVE_VALSET_SIZE
which is currently set to 200.
Thus, the top 200 validators (ordered by stake weight) can participate directly in consensus.
This parameter is likely to change over time.Participation is permissionless; one simply needs to be in the top ACTIVE_VALSET_SIZE
validators.Raptorcast
Where can I find a detailed description of RaptorCast?
Where can I find a detailed description of RaptorCast?
Why was UDP chosen instead of TCP in RaptorCast?
Why was UDP chosen instead of TCP in RaptorCast?
What is the difference between Raptorcast and the propagation methods in Ethereum, Solana, or L2s?
What is the difference between Raptorcast and the propagation methods in Ethereum, Solana, or L2s?
- Monad uses Raptor codes while Turbine uses Reed-Solomon
- Monad uses a 2-level broadcast tree with every other validator as a level-1 node while Solana uses a deeper, less structured broadcast tree with fewer level-1 nodes and more complex logic for determining the broadcast tree. There aren’t BFT guarantees on block delivery the way that there are for Monad.
Mempool
If there is a gap in nonces, will transactions after the gap be preserved in the mempool?
If there is a gap in nonces, will transactions after the gap be preserved in the mempool?
Block States and Finality
When can a node start executing a block?
When can a node start executing a block?
When can a node be sure about the state?
When can a node be sure about the state?
D=3 blocks, but
it is still known locally because state is deterministic given a fixed ordering of transactions.If you want to be certain that your local node did not make a computation error (e.g. due to
cosmic rays), you may wait D=3 blocks for the delayed merkle root, which makes the block in
question enter the Verified state.RPC
When calling `eth_call` with an old block number, I received this response: `Block requested not found. Request might be querying historical state that is not available. If possible, reformulate query to point to more recent blocks`. What's going on?
When calling `eth_call` with an old block number, I received this response: `Block requested not found. Request might be querying historical state that is not available. If possible, reformulate query to point to more recent blocks`. What's going on?
Features
Is EIP-7702 supported?
Is EIP-7702 supported?
Is EIP-7951 (or RIP-7212) supported?
Is EIP-7951 (or RIP-7212) supported?
0x0100 following EIP-7951. See Precompiles for
more details.Miscellaneous
What is the point of low validator hardware requirements (32 GB RAM, 2x 2TB SSD, 16-core CPU), if there will only be 100-200 voting nodes?
What is the point of low validator hardware requirements (32 GB RAM, 2x 2TB SSD, 16-core CPU), if there will only be 100-200 voting nodes?
Why was rust chosen for the consensus client and C++ for execution?
Why was rust chosen for the consensus client and C++ for execution?
io_uring
and boost::fibers. Rust was selected for consensus to take advantage of stricter memory safety
given that consensus concerns itself with slightly higher-level systems engineering problems.
