Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Short– to Mid-Term Roadmap

This document represents the short- to mid-term roadmap. Items listed here are actionable, concrete, and intended to be worked on in the coming weeks. Long-term research directions and second-order ideas are intentionally out of scope.

Priority reflects relative urgency, not effort.

This is a WIP document and it requires better descriptions; it’s supposed to be used internally.


Priority Legend

PriorityMeaning
0Highest priority, low effort with potential win
1High. Should be addressed soon
2Medium. Important but not blocking
3Low. Useful improvement
4Very low. Nice to have
5Deprioritized for now
6Long tail / hygiene
Not yet prioritized

Execution

ItemIssuePriorityStatusDescription
Replace BTreeMap with FxHashMap#57570Discarded (small regression)Replace BTreeMap/BTreeSet with FxHashMap/FxHashSet
Use FxHashset for access lists#58000Done (8% improvement)Replace HashSet with FxHashset
Skip Zero-Initialization in Memory Resize#57550Measure #5774Use unsafe set_len (EVM spec says expanded memory is zero)
Remove RefCell from Memory#57560Measure #5793Consider using UnsafeCell with manual safety guarantees, or restructure to avoid shared ownership.
Try out PEVM0Done. Simple integration caused regression.Benchmark again against pevm
Inline Hot Opcodes#57520Done. 0 to 20% speedup depending on the time.Opcodes call a function in a jump table when some of the most used ones could perform better being inlined instead
Test ECPairing libraries#57580Done (#5792). Used Arkworks. 2x speedup on those specific operations.Benchmark arkworks pairing in levm
PGO/BOLT#57590In progress (#5775)Try out both PGO and BOLT to see if we can improve perf
Use an arena allocator for substate tracking#57540Discarded (#5791). Regression of 10% in mainnet.Substates are currently a linked list allocated through boxing. Consider using an arena allocator (e.g. bumpalo) for them
ruint#57600Discarded simple approach. Regression.Try out ruint as the U256 library to see if it improves performance. Part of SIMD initiative
Nibbles#58011Measure #5912 and #5932Nibbles are currently stored as a byte (u8), when they could be stored compactly as actual nibbles in memory and reduce by half their representation size. Also we may stack-allocate their buffers instead of heap-allocated vecs.
RLP Duplication#59491PendingCheck whether we are encoding/decoding something twice (clearly unnecessary)
Object pooling#59342PendingReuse EVM stack frames to reduce allocations and improve performance
Avoid clones in hot path#57532Measure #5809 on mainnetAvoid Clone on Account Load and check rest of the hot path
SIMD Everywhere2PendingThere are some libraries that can be replaced by others that use SIMD instructions for better performance
EXTCODESIZE without full bytecode1Done (#6034). Improvement of 25%.EXTCODESIZE loads entire bytecode just to get length. Add get_account_code_size() or store code length alongside code (crates/vm/levm/src/opcode_handlers/environment.rs:260-274)
TransactionQueue data structure1Discarded. It is not significant within the critical path.TransactionQueue uses Vec with remove(0) which is O(n). Replace with BinaryHeap/BTreeSet or VecDeque for O(log n) or O(1) operations (crates/blockchain/payload.rs:708-820)

IO

ItemIssuePriorityStatusDescription
Add Block Cache (RocksDB)#59350Discarded. Did not improve (#6195).Currently there is no explicit block cache, relying on OS page cache. Also try row cache
Use Two-Level Index (RocksDB)#59360Discarded. Performance regressed by two orders of magnitude on both throughput and latency (#6196).Use Two-Level Index with Partitioned Filters
Enable unordered writes for State (RocksDB)#59370PendingFor ACCOUNT_TRIE_NODES, STORAGE_TRIE_NODES cf_opts.set_unordered_write(true); Faster writes when we don’t need strict ordering
Increase Bloom Filter (RocksDB)#59380PendingChange and benchmark higher bits per key for state tables
Consider LZ4 for State Tables (RocksDB)#59390PendingTrades CPU for smaller DB and potentially better cache utilization
Page caching + readahead#59400PendingUse for trie iteration, sync operations
Optimize for Point Lookups (RocksDB)#59410PendingAdds hash index inside FlatKeyValue for faster point lookups
Modify block size (RocksDB)#59420PendingBenchmark different block size configurations
Memory-Mapped Reads (RocksDB)#59430PendingCan be an improvement on high-RAM systems
Increase layers commit threshold#59440PendingFor read-heavy workloads with plenty of RAM
Remove locks#59451PendingCheck if there are still some unnecessary locks, e.g. in the VM we have one
Benchmark bloom filter#59461PendingReview trie layer’s bloom filter, remove it or test other libraries/configurations
Use multiget on trie traversal#49491PendingUsing multiget on trie traversal might reduce read time
Bulk reads for block bodies1PendingImplement multi_get for get_block_bodies and get_block_bodies_by_hash which currently loop over per-key reads (crates/storage/store.rs:388-454)
Canonical tx index1PendingTransaction location lookup does O(k) prefix scans. Add a canonical-tx index table or DUPSORT layout for O(1) lookups (crates/storage/store.rs:562-606)
Reduce trie cache Mutex contention1Pendingtrie_cache is behind Arc<Mutex<Arc<TrieLayerCache>>>. Use ArcSwap or RwLock for lock-free reads (crates/storage/store.rs:159,1360)
Reduce LatestBlockHeaderCache contention1PendingLatestBlockHeaderCache uses Mutex for every read. Use ArcSwap for atomic pointer swaps (crates/storage/store.rs:2880-2894)
Use Bytes/Arc in trie layer cache2PendingTrie layer cache clones Vec<u8> values on every read. Use Bytes or Arc<[u8]> to reduce allocations (crates/storage/layering.rs:57,63)
Split hot vs cold data2PendingGeth “freezer/ancients” pattern: store recent state in fast KV store, push old bodies/receipts to append-only ancient store to reduce compaction pressure
Configurable cache budgets2PendingExpose cache split for DB/trie/snapshot as runtime config. Currently hardcoded in ethrex
Toggle compaction during sync2PendingDisable RocksDB compaction during snap sync for higher write throughput, then compact after (Nethermind pattern). Wire disable_compaction/enable_compaction into sync stages
Spawned#59473PendingSpawnify io intensive components/flows. Mempool and Snapsync are top priorities

RPC

ItemPriorityStatusDescription
Parallel tx decoding0DiscardedUse rayon to decode transactions in parallel. Currently sequential at ~5-10μs per tx
simd-json0DiscardedReplace serde_json with simd-json for SIMD-accelerated JSON parsing
Remove payload.clone()0PendingAvoid cloning ExecutionPayload in get_block_from_payload (crates/networking/rpc/engine/payload.rs:674). Use references or owned values directly
Remove params.clone()0PendingAvoid cloning params before serde_json::from_value(). Use references instead of params[i].clone() in RPC handlers (crates/networking/rpc/engine/payload.rs)
Use Bytes instead of String0PendingChange HTTP body extraction from String to Bytes and use serde_json::from_slice() instead of from_str() to avoid UTF-8 validation overhead (crates/networking/rpc/rpc.rs:536,563)
RawValue for params1PendingUse Option<Vec<serde_json::value::RawValue>> instead of Option<Vec<Value>> in RpcRequest to defer parsing until needed (crates/networking/rpc/utils.rs:242)
Parallel tx root1PendingParallelize compute_transactions_root which computes ~400 keccak256 hashes for 200 txs (crates/blockchain/payload.rs:671)
phf method routing2PendingReplace match statements with phf::Map for O(1) RPC method dispatch instead of O(n) string comparisons (crates/networking/rpc/rpc.rs:652-765)
Pre-create JWT decoder2PendingCache DecodingKey and Validation at startup instead of creating them on every auth request (crates/networking/rpc/authentication.rs:43-46)
HTTP/2 support3PendingAdd HTTP/2 support for reduced latency through multiplexing
Direct response serialization3PendingSerialize responses directly to the output buffer instead of intermediate Value
TCP tuning3PendingTune TCP settings (nodelay, buffer sizes) for lower latency

ZK + L2

ItemPriorityStatusDescription
ZK API1PendingImprove prover API to unify multiple backends
Native Rollups2PendingAdd EXEC Precompile POC
Based Rollups2PendingBased Rollups Roadmap
Zisk2In ProgressIntegrate full Zisk Proving on the L2
zkVMs2In ProgressMake GuestProgramState more strict when information is missing

SnapSync

ItemPriorityStatusDescription
Download receipts and blocks1PendingAfter snap sync is finished and the node is executing blocks, it should download all historical blocks and receipts in the background
Download headers in background (no rewrite)1PendingDownload headers in background
Avoid copying trie leaves when inserting (no rewrite)1PendingAvoid copying trie leaves when inserting
Rewrite snapsync4PendingUse Spawned for snapsync

UX / DX

ItemPriorityStatusDescription
Improve internal documentation0In ProgressImprove internal docs for developers, add architecture
geth db migration tooling0In ProgressAs we don’t support pre-merge blocks we need a tool to migrate other client’s DB to ours at a specific block
Add MIT License0PendingAdd dual license
Add Tests1In ProgressImprove coverage
Add Fuzzing1In ProgressAdd basic fuzzing scenarios
Add Prop test1In ProgressAdd basic property testing scenarios
Add security runs to CI1In ProgressAdd fuzzing and every security tool we have to the CI
CLI Documentation1PendingReview CLI docs and flags
API Documentation1PendingAdd API documentation to docs. Add compliance matrix
IPv6 support1PendingIPv6 is not fully supported
P2P leechers1PendingImprove scoring heuristic and kick leechers
Custom Deterministic Benchmark1In ProgressWe have a tool to run certain mainnet blocks, integrate that tool into our pipeline for benchmarking (not easy with DB changes)
Benchmark contract call & simple transfers1PendingCreate a new benchmark with contract call & simple transfers
Improve Error handling1In ProgressAvoid panic, unwrap and expect
Websocket subscriptions2PendingAdd subscription support for websocket
Not allow empty blocks in dev mode2PendingFor L2 development it’s useful not to have empty blocks
P2P rate limiting3PendingImprove scoring heuristic and DDoS protection
Migrations4PendingAdd DB Migration mechanism for ethrex upgrades
No STD5PendingSupport WASM target for some crates related to proving and execution. Useful for dApp builders and light clients

New Features

ItemPriorityStatusDescription
Block-Level Access Lists2DoneImplement EIP-7928
Disc V52In ProgressAdd discV5 Support
Sparse BlobpoolPendingImplement EIP-8070
Pre merge blocksPendingBe able to process pre merge blocks
Archive nodePendingAllow archive node mode