Compare commits

...

2100 Commits

Author SHA1 Message Date
Georgios Konstantopoulos
378c5851d5 wip 2025-12-18 19:22:54 -05:00
Arsenii Kulikov
30162c535e perf: properly share precompile cache + use moka (#20502) 2025-12-18 22:42:44 +00:00
Federico Gimenez
cd8fec3273 feat(stages): use EitherWriter for TransactionLookupStage RocksDB writes (#20428) 2025-12-18 21:34:17 +00:00
Tomass
1e38c7fea8 chore(hardforks): drop unnecessary field reassignment in TTD branch (#20457)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-18 21:02:56 +00:00
Block Wizard
4dfaf238c9 chore(net): fix misleading comment about uncompressed message size check (#19510) 2025-12-18 20:34:50 +00:00
forkfury
4cf36dda54 docs: correct FinishedStateUpdates message name (#20471) 2025-12-18 20:16:15 +00:00
phrwlk
41ce3d3bbf docs: fix Docker db-access troubleshooting example (#20483) 2025-12-18 20:13:01 +00:00
sashass1315
429d13772e chore(cli): correct p2p body error message (#20498) 2025-12-18 20:01:59 +00:00
Gigi
0cbf89193d docs: correct intra-doc link references (#20467) 2025-12-18 19:56:57 +00:00
radik878
0c3c42bffe chore(primitives-traits): correct SealedBlock::senders return description (#20465) 2025-12-18 19:56:22 +00:00
cui
cdbbd08677 fix: session config should be read from config file (#20484)
Co-authored-by: weixie.cui <weixie.cui@okg.com>
2025-12-18 19:53:18 +00:00
Alexey Shekhirin
4adb1fa5ac fix(cli): default to 0 genesis block number (#20494) 2025-12-18 15:07:59 +00:00
Brian Picciano
b3a792ad1e fix(engine): Use OverlayStateProviderFactory for state root fallback (#20462) 2025-12-18 14:30:11 +00:00
Arsenii Kulikov
98a7095c7a fix: properly determine first stage during pipeline consistency check (#20460) 2025-12-18 10:43:08 +00:00
Matthias Seitz
701e5ec455 chore: add engine terminate (#20420)
Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com>
2025-12-18 09:01:36 +00:00
Lorsmirq Benton
8e00e81af4 docs: remove orphaned debug.mdx (#20474) 2025-12-18 04:14:23 +00:00
YK
453514c48f perf(engine): share Arc<ExecutionOutcome> to avoid cloning BundleState (#20448) 2025-12-18 01:07:18 +00:00
James Niken
432ac7afa1 chore: fix blob count in validation benchmark (#20456) 2025-12-18 00:51:45 +00:00
Emilia Hane
c7fca9f2b4 chore(node): Report actual gas price to ethstats (#20461)
Co-authored-by: Rifvck Zieger <rifvckzieger@gmail.com>
2025-12-18 00:50:16 +00:00
DaniPopes
715ca5b980 chore: simplify prewarm state providers (#20469) 2025-12-17 22:11:11 +00:00
Federico Gimenez
9ae62aad26 feat(storage): add method to check invariants on RocksDB tables (#20340) 2025-12-17 20:26:51 +00:00
YK
c65df40526 perf: remove redundant contains_key check in ProofSequencer::add_proof (#20459) 2025-12-17 13:58:59 +00:00
Vui-Chee
d8acc1e4cf feat: support non-zero genesis block numbers (#19877)
Co-authored-by: JimmyShi22 <417711026@qq.com>
2025-12-17 11:03:12 +00:00
sashass1315
852aad8126 docs(exex): document ChainRevert flow in how-it-works (#20455) 2025-12-17 10:28:49 +00:00
Karl Yu
61c072ad20 feat: add engine_getBlobsV3 method (#20451) 2025-12-17 10:15:49 +00:00
Lorsmirq Benton
6a5b985113 docs: remove orphaned recover CLI documentation (#20447) 2025-12-17 10:13:55 +00:00
joshieDo
1adc6aec00 chore(engine): extract on_persistence_complete (#20443) 2025-12-17 09:07:54 +00:00
Matthias Seitz
5edc16ad85 perf: only populate cache during prewarm (#20445) 2025-12-17 08:46:16 +00:00
phrwlk
f54a8a1ef5 fix(payload): clarify PayloadTransactions mark_invalid semantics (#20452) 2025-12-17 08:44:17 +00:00
leniram159
c681851ec8 chore: make docs correct (#20440)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-12-17 04:32:18 +00:00
DaniPopes
d964fcbcde chore: simplify execution state providers (#20444) 2025-12-16 22:52:57 +00:00
Alexey Shekhirin
e79691aae7 feat: turn on asm-keccak by default, use maxperf profile in Dockerfiles (#20422) 2025-12-16 22:43:20 +00:00
bigbear
4231f4b688 docs: fix incorrect API example in node-components.mdx (#20297) 2025-12-16 15:09:29 +00:00
Léa Narzis
0b607113dc refactor(era): make era count in era file name optional (#20292) 2025-12-16 15:08:43 +00:00
emmmm
be4dc53b92 docs: fix --color auto option description (#20352) 2025-12-16 15:06:04 +00:00
emmmm
4afb555d06 docs(opstack): document all rollup CLI arguments (#20374) 2025-12-16 15:04:34 +00:00
Matthias Seitz
ab2ef99458 chore: add keccak-global (#20418) 2025-12-16 14:59:09 +00:00
Sophia Raye
bfd4b79245 docs(trace): remove duplicate comment (#20360) 2025-12-16 14:56:01 +00:00
Federico Gimenez
49057b1c0c feat(storage): add with_default_tables() to register RocksDB column families at initialization (#20416) 2025-12-16 12:59:58 +00:00
Gigi
b6772370d7 docs: fix incorrect method reference in try_recover_sealed_with_senders (#20410) 2025-12-16 12:27:53 +00:00
Karl Yu
d72935628a feat: add support for eth/70 eip-7975 (#20255)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-16 12:05:11 +00:00
YK
ad63b135d6 feat(storage): implement EitherWriter/EitherReader methods for RocksDB (#20408) 2025-12-16 11:26:31 +00:00
Brian Picciano
90651ae8e8 feat(engine): Use BAL in state root validation (#20383) 2025-12-16 11:05:51 +00:00
Matthias Seitz
bbd51862d4 chore: rm flaky bench (#20413) 2025-12-16 09:35:38 +00:00
Arsenii Kulikov
08a16a5bde perf: recover transactions in parallel during network import (#20385) 2025-12-16 09:33:24 +00:00
Snezhkko
f2c39db7a2 chore(rpc): fix misleading link and comment (#20367) 2025-12-16 09:32:25 +00:00
oooLowNeoNooo
ae9e84d6e3 fix(discv4): correct ping_interval default value in docs (#20396) 2025-12-16 09:29:45 +00:00
theo
c51da593d1 feat(net/p2p): support fixed external addresses with DNS resolution (#20411) 2025-12-16 09:28:31 +00:00
Matthias Seitz
0e08f9f56c perf: remove unnecessary channels from parallel trie operations (#20406) 2025-12-16 09:15:27 +00:00
sashass1315
7eef092110 docs(exex): sync hello-world notifications loop with code (#20403) 2025-12-16 08:39:45 +00:00
YK
40e8241bf5 feat(storage): use RocksDBBatch in EitherWriter and related modules (#20377) 2025-12-16 03:57:41 +00:00
dependabot[bot]
dd9ff731e4 chore(deps): bump peter-evans/create-pull-request from 7 to 8 (#20402)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-16 00:11:22 +00:00
dependabot[bot]
83f9d1837f chore(deps): bump actions/download-artifact from 4 to 7 (#20401)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-16 00:11:00 +00:00
dependabot[bot]
68911e617b chore(deps): bump actions/upload-artifact from 5 to 6 (#20400)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-16 00:10:40 +00:00
0xcharry
36ba6db029 chore: remove redundant .as_str() calls after to_string() (#20404) 2025-12-16 00:10:03 +00:00
Matthias Seitz
fec4432d82 perf: defer transaction pool notifications until after lock release (#20405) 2025-12-15 23:06:34 +00:00
Matthias Seitz
179da26305 perf: use RwLock for transaction pool listeners (#20398)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-12-15 21:47:59 +00:00
Matthias Seitz
b5e7a694d2 chore: update metric once (#20371) 2025-12-15 20:38:24 +00:00
Maxim Evtush
9489667814 fix: post-state generator to include deletions in proptest (#20276) 2025-12-15 16:43:02 +00:00
gustavo
004877ba59 refactor(cli): cleanup repair-trie metrics (#20226) 2025-12-15 16:41:48 +00:00
Brian Picciano
a9e36923e1 feat(trie): Proof Rewrite: Use cached branch nodes (#20075)
Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-12-15 15:27:04 +00:00
DaniPopes
74a3816611 ci: reduce feature powerset depth (#20379) 2025-12-15 14:42:14 +00:00
Alexey Shekhirin
5576d4547f revert: feat(engine): run sync state root if not enough parallelism (#20127) (#20378) 2025-12-15 14:05:54 +00:00
DaniPopes
21216e2f24 perf: use indexed parallel iterators for tx recovery (#20342) 2025-12-15 13:40:03 +00:00
YK
42c1e1afe1 feat(storage): add account history constructors to EitherWriter/EitherReader (#20366) 2025-12-15 12:45:07 +00:00
MoNyAvA
5f7e87fa2a docs: add blob sub-pool to tx pool docs (#20375) 2025-12-15 12:27:54 +00:00
Matthias Seitz
1b417dacc4 chore: sanity check for u64::Max (#20373) 2025-12-15 11:33:50 +00:00
Niven
bb952be5b5 feat(flashblocks): support eth_getBlockTransactionCount for flashblocks (#20291)
Co-authored-by: lucas <66681646+limyeechern@users.noreply.github.com>
Co-authored-by: lucas.lim <lucas.lim@okg.com>
2025-12-15 11:29:23 +00:00
Federico Magnani
f927eec880 chore: export FlashBlockDecoder (#20370) 2025-12-15 11:00:46 +00:00
Tomass
9c61f5568c fix(rpc-testing-util): use buffer_unordered in trace_block_opcode_gas_unordered (#20369) 2025-12-15 10:38:40 +00:00
ligt
662c0486a1 feat(storage): add rocksdb provider into database provider (#20253) 2025-12-15 10:15:57 +00:00
Matthias Seitz
997848c2a1 fix(txpool): remove stale senderinfo (#20368) 2025-12-15 10:00:25 +00:00
Olexandr88
155bdecf3b docs(repo): add Ethereum-specific crates section (#20363) 2025-12-15 09:56:40 +00:00
github-actions[bot]
679234f105 chore(deps): weekly cargo update (#20359)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-12-14 20:54:42 +00:00
phrwlk
419c7b489b fix(rpc): remove dead flashbots module config (#20364) 2025-12-14 20:54:15 +00:00
Rej Ect
06dac07b5f ci(hive): bump actions/cache to v5 (#20349) 2025-12-13 09:04:07 +00:00
YK
5621132b8b feat: add RocksDB variant to EitherReader and EitherWriter (#20288) 2025-12-13 04:06:44 +00:00
Matthias Seitz
3380eb69c8 fix: only collect already tracked accounts (#20341) 2025-12-12 22:09:21 +00:00
Arsenii Kulikov
0366497ada perf: skip redundant recovery (#20343) 2025-12-12 22:01:05 +00:00
Alexey Shekhirin
cd71f3d5a4 feat(engine): record total latencies on instrumented state provider drop (#20337) 2025-12-12 21:14:44 +00:00
Alexey Shekhirin
64909d33e6 feat(engine): cli argument to disable state cache (#20143) 2025-12-12 17:51:22 +00:00
Alexey Shekhirin
3c9ad31344 chore(engine): make InstrumentedStateProvider public (#20335) 2025-12-12 16:41:42 +00:00
gustavo
f3e14fd061 feat(rpc): handle dedicated eth_simulate errors (#20099) 2025-12-12 16:40:13 +00:00
Alexey Shekhirin
daf6b88dc6 feat(node): engine args defaults (#20203) 2025-12-12 15:54:05 +00:00
emmmm
d2d58f9a0e docs: add missing RPC namespaces to JSON-RPC intro (#20321) 2025-12-12 15:40:38 +00:00
Matthias Seitz
ace4e515b5 chore: bump inspectors 0.33.2 (#20334) 2025-12-12 15:39:04 +00:00
Hesham Shabanah
134164954b feat: add --max-peers CLI flag (#20139)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-12 13:26:44 +00:00
Lorsmirq Benton
2775dd1f23 docs: correct comments in custom-inspector (#20304) 2025-12-12 13:21:03 +00:00
Alexey Shekhirin
ac0f9687bd chore(engine): move noisy multiproof debug logs to trace level (#20331) 2025-12-12 13:01:01 +00:00
Arsenii Kulikov
a9c21a395d perf: spawn rpc handlers as blocking (#20330) 2025-12-12 12:15:02 +00:00
Federico Magnani
df7ad9ae45 chore(ethapi): increase visibility tx_batch_sender (#20315)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-12 12:14:43 +00:00
sashass1315
5903e42a98 docs: refresh repo layout crate lists (#20319) 2025-12-12 10:59:57 +00:00
Matthias Seitz
3c41b99599 chore: lower block buffer size (#20324) 2025-12-12 08:15:54 +00:00
pepes
d70d80fff1 fix(docs): document discv5 discovery port 9200 (#20322) 2025-12-12 08:12:08 +00:00
gustavo
ed3a8a03d5 feat(node-core): make rpc server args customizable (#20312) 2025-12-11 23:24:31 +00:00
YK
bfcd46d01d feat: add account_history_in_rocksdb field to StorageSettings (#20282) 2025-12-11 19:37:36 +00:00
Brian Picciano
194d545fae feat(engine): Add BAL stub methods to ExecutionPayload and BlockOrPayload (#20311)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-11 19:07:43 +00:00
sashass1315
97243ec1f4 docs: fix misleading links (#20300) 2025-12-11 18:49:18 +00:00
DaniPopes
93c1b0f52f ci: add more sccache (#20316) 2025-12-11 18:46:11 +00:00
Arsenii Kulikov
474c09095f feat: bump alloy-evm (#20314) 2025-12-11 19:46:34 +01:00
Matthias Seitz
24c298133f feat: allow larger ws frames on client side (#20307) 2025-12-11 16:43:10 +00:00
Block Wizard
da27336a1e docs: add architecture diagrams to ExEx documentation (#20193)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-11 11:41:15 +00:00
Matthias Seitz
2e567d6658 feat: add semaphore for blocking IO requests (#20289) 2025-12-11 11:35:50 +00:00
Alexey Shekhirin
28e7c8a7cb ci: scale down depot runners (#20295) 2025-12-11 11:33:49 +00:00
Matthias Seitz
a2a5e03cb8 perf: fetch header directly (#20294) 2025-12-11 11:18:51 +00:00
Sophia Raye
6073aa5b4a docs(exex): fix DebugApi comment (#20296) 2025-12-11 10:06:31 +00:00
Karl Yu
e90cfedf3d feat: add support for testing_ rpc namespace and testing_buildBlockV1 (#20094)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-11 08:56:46 +00:00
Matthias Seitz
8b27ca6fa2 chore: update engine_getBlobs metric (#20290) 2025-12-11 08:11:54 +00:00
Tomass
1752d6fb99 chore(optimism): move predeploy constant to op-alloy (#20181)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-11 07:04:01 +00:00
emmmm
ac891a780b docs: fix stages order and add missing EraStage (#20283) 2025-12-11 06:26:27 +00:00
Adrian
036626b8a7 docs: improve map_add_ons method documentation (#20248) 2025-12-11 06:03:34 +00:00
josé v
68f0c9812f feat: add transaction_hash_numbers_in_rocksdb field to StorageSettings (#20209) 2025-12-11 01:07:12 +00:00
sashass1315
c9920c9690 docs: clarify network mode, tx gossip and NAT (#20247) 2025-12-10 21:52:04 +00:00
Karl Yu
af82606ff4 feat: add support for debug_getBadBlock (#20177)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-10 21:03:53 +00:00
radik878
38331a362e fix(rpc): avoid signing Optimism deposit transactions (#20254) 2025-12-10 20:46:43 +00:00
Tomass
e8dae2ae7d chore(deps): bump op-alloy to 0.23.0 (#20256)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-12-10 20:44:54 +00:00
Sophia Raye
ce5f90175b docs(jsonrpc): add missing debug namespace RPC methods (#20267) 2025-12-10 17:24:29 +00:00
gustavo
8c361c87c2 feat(txpool): handle more simulated scenarios in test_utils/pool.rs (#20138) 2025-12-10 17:13:59 +00:00
Block Wizard
4fbbb1fe54 feat: add recover_transactions_unchecked_ref to BlockBody (#20266) 2025-12-10 17:13:08 +00:00
Brian Picciano
b7d8815104 perf(prune): use delete_current_duplicates for MerkleChangeSets tables (#20230) 2025-12-10 13:33:11 +00:00
Alexey Shekhirin
b91cd8f451 ci: sccache (#20265) 2025-12-10 13:05:25 +00:00
Alexey Shekhirin
09aee4e35a ci: use 16 cores for Hive workflow (#20264) 2025-12-10 13:02:14 +00:00
Alexey Shekhirin
505a384b10 ci: increase partitions for crate-checks to 3 (#20261) 2025-12-10 13:02:11 +00:00
phrwlk
6e00b99b67 docs: use canonical --rollup.sequencer and note aliases (#20260) 2025-12-10 12:18:36 +00:00
emmmm
1d389cfe7a docs(jsonrpc): add missing debug namespace RPC methods (#20258) 2025-12-10 12:17:50 +00:00
Matthias Seitz
2e62387469 feat: use max retries for debug consensus rpc client (#20257) 2025-12-10 11:06:38 +00:00
Block Wizard
31133255fe docs(reth-bench): fix incorrect authrpc.jwtsecret flag (#20249) 2025-12-10 09:30:50 +00:00
Matthias Seitz
a6b9472d1c fix: use generic header (#20250) 2025-12-10 09:11:39 +00:00
forkfury
6636d2a2ad docs: fix timestamp validation comment (#20246) 2025-12-10 08:41:23 +00:00
YK
ab6854d159 docs(reth-bench): fix incorrect output flag in README (#20240) 2025-12-10 07:18:34 +00:00
Charlie-Mack
5a274fc939 feat: add example for launching a node with custom rpc middleware (#20159) 2025-12-10 07:15:46 +00:00
radik878
c9431b224b refactor(rpc): remove dead got_notif flag from RpcService batch handler (#20171) 2025-12-10 07:15:09 +00:00
emmmm
8cbfd91db0 docs: add missing bodies_history and merkle_changesets prune config fields (#20244) 2025-12-10 07:10:57 +00:00
Block Wizard
43f9942ba7 docs(txpool): fix PoolSize total field comment to include blob pool (#20241) 2025-12-10 07:05:42 +00:00
Léa Narzis
06adc3ee0c refactor(rpc): return error instead of clamping for get_filter_block_range (#20218) 2025-12-10 07:03:30 +00:00
dependabot[bot]
fbf6be4cf2 chore(deps): bump dawidd6/action-homebrew-bump-formula from 6 to 7 (#20205)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-10 07:01:28 +00:00
Forostovec
21d61d40d1 docs: document state and block overrides for trace_call (#20217) 2025-12-10 07:00:59 +00:00
YK
cf7d709358 perf(engine): batch multiproof messages (#20066)
Co-authored-by: 0xSooki <0xsooki@gmail.com>
2025-12-10 03:42:08 +00:00
Vitalyr
e9355caba5 feat(reth-bench-compare): add reth command to summary output (#20089) 2025-12-10 02:12:57 +00:00
Brian Picciano
fdd9d5bb40 docs(trie): correct TrieInput::extend_with_blocks docstring (#20225) 2025-12-10 02:03:42 +00:00
AJStonewee
9eeba7e6b3 feat(transaction-pool): add new_blob_pool_transactions_listener (#20216)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-12-09 23:41:00 +00:00
forkfury
0085acc868 docs: remove incorrect total_difficulty mention from process_iter (#20234)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-12-09 23:27:16 +00:00
Alexey Shekhirin
c697147f90 ci: use depot runners (#20222) 2025-12-09 23:03:44 +00:00
kurahin
7388d6636d docs(config): clarify PruneConfig::merge semantics (#20235) 2025-12-09 21:15:02 +00:00
SashaMalysehko
0b859c0735 fix(rpc): validate fee history reward percentiles (#20198) 2025-12-09 21:03:17 +00:00
yyhrnk
a8e0606fa7 fix(cli): reference correct --without-evm flag in init-state error (#20231) 2025-12-09 21:00:45 +00:00
Galoretka
969689d9b6 docs: add admin_peers and admin_clearTxpool sections (#20185) 2025-12-09 20:59:44 +00:00
Adrian
ad2081493a docs: add missing documentation for serde_bincode_compat::ExExNotification (#20236) 2025-12-09 20:59:05 +00:00
Brian Picciano
abfb6d3965 feat(cli): Allow walking a range of an MDBX table using db mdbx get (#20233) 2025-12-09 20:37:06 +00:00
Alexey Shekhirin
0f0eb7a531 feat(net): pool transactions import duration metric (#20228) 2025-12-09 13:57:01 +00:00
Alexey Shekhirin
4f1e486b4f feat(engine): execution wait, pre, post metrics (#20166) 2025-12-09 13:30:58 +00:00
Alexey Shekhirin
05307d088c perf(chain-state): executed_block_receipts_ref (#20227) 2025-12-09 13:08:15 +00:00
Arsenii Kulikov
245cca7ce2 perf: avoid collect in truncate_pool (#20221) 2025-12-09 11:08:21 +00:00
Arsenii Kulikov
28d6996fc4 feat: add helper method to eth validator (#20206) 2025-12-08 22:48:54 +00:00
Karl Yu
0eaffdf489 feat: add StorageSettings for StoragesHistory in RocksDB (#20154) 2025-12-08 22:22:36 +00:00
futreall
9c141cac4b fix(rpc): return error if toBlock exceeds current head (#20202) 2025-12-08 17:42:01 +00:00
Léa Narzis
fc6ab35c5c test(era): complete int tests with roundtrip mainnet era files (#20064) 2025-12-08 17:01:21 +00:00
joshieDo
f88bf4e427 fix: set merkle changesets distance minimum to 128 (#20200) 2025-12-08 16:10:11 +00:00
Matthias Seitz
3d330caf36 perf: avoid duplicate storage get call (#20180) 2025-12-08 16:02:22 +00:00
Matthias Seitz
5a43e77771 fix: trace filter range off by one (#20199) 2025-12-08 15:54:08 +00:00
forkfury
5b3c479ed5 feat(primitives-traits): add recover_transactions_ref to avoid cloning (#20187)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-08 14:51:07 +00:00
Matthias Seitz
dc06b47abe fix: make inserted blocks part of fcu canonical (#20164)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-12-08 14:06:39 +00:00
Arsenii Kulikov
e9cd7cc003 feat: parallelize recovery (#20169)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-08 14:05:37 +00:00
Alexey Shekhirin
f633efc969 ci: run on ubuntu instead of reth runner (#20196) 2025-12-08 14:30:20 +01:00
github-actions[bot]
2f55b1c30f chore(deps): weekly cargo update (#20174)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-12-07 11:15:14 +00:00
Matthias Seitz
3e96557e69 chore: featuer gate rocksdb (#20170) 2025-12-06 18:55:55 +00:00
sashass1315
8bd970bad8 fix: make get_exact error on missing blobs to match trait contract (#19347)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-06 17:32:19 +00:00
Fallengirl
d765521c3d chore(deps): clean up unused imports and dependencies in reth-downloaders (#19875) 2025-12-06 16:27:27 +00:00
Charlie-Mack
4bde1bb048 fix(node): Added missing trait bound on RethRpcAddOns for EthereumAddOns (#20155) 2025-12-06 16:20:35 +00:00
Tomass
9146ca4501 chore(optimism): deduplicate ADDRESS_L2_TO_L1_MESSAGE_PASSER (#20160) 2025-12-06 14:28:38 +00:00
sashass1315
6655a9377a docs: add architecture diagram for EVM node component (#20162) 2025-12-06 13:35:45 +00:00
stevencartavia
56e60a3704 feat: add merge_if_module_configured_with that accepts a closure (#20158) 2025-12-06 10:49:47 +00:00
cui
193af2219b feat: generate part of sidebar (#20040) 2025-12-06 10:16:09 +00:00
Léa Narzis
73b4fcc41a docs(era): use lighthouse decoding support for era types (#20147) 2025-12-06 10:15:16 +00:00
GarmashAlex
6fc752d66a docs: fix broken link (#20076) 2025-12-06 10:13:46 +00:00
Bashmunta
ed104a964a refactor(net): remove unused enable_packet_filter and ban_duration from config (#20146) 2025-12-06 08:02:44 +00:00
ligt
00ccb2b9b4 feat(persistence): implement RocksDB provider (#20071)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-12-05 20:29:19 +00:00
Matthias Seitz
addb51f2e2 chore: use drop guard for transact task (#20134) 2025-12-05 18:18:55 +00:00
Brian Picciano
a80c290ca0 feat(cli): repair-trie metrics (#20121) 2025-12-05 16:10:43 +00:00
Alexey Shekhirin
3830c765e0 feat(node): tx pool optional args defaults (#20142) 2025-12-05 15:55:18 +00:00
Matthias Seitz
190297083a chore: relax server impl (#20141) 2025-12-05 15:21:58 +00:00
Matthias Seitz
9712fe56e5 chore: add identifying info to traces (#20140) 2025-12-05 14:57:43 +00:00
Alexey Shekhirin
0a6d20bd1b feat(node): tx pool args defaults (#20136) 2025-12-05 13:27:25 +00:00
Arsenii Kulikov
4c17de8553 fix: add missing 2718 impl for receipt (#20137) 2025-12-05 12:49:49 +00:00
Matthias Seitz
a0dc85fc95 chore: bump revm inspectors (#20132) 2025-12-05 11:44:39 +00:00
Merkel Tranjes
3c1fc99600 perf(rpc): use maybe_cached_block_and_receipts for AtBlockHash (#19910)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-12-05 11:31:43 +00:00
Fallengirl
49059f500e fix(rpc): remove redundant blob_gas_used calculation in eth_callBundle (#20131) 2025-12-05 11:30:28 +00:00
Alexey Shekhirin
f744ad6e0b feat(engine): more engine execution tracing spans (#20135) 2025-12-05 11:16:38 +00:00
Alexey Shekhirin
cfde951976 feat(engine): run sync state root if not enough parallelism (#20127) 2025-12-04 22:59:00 +00:00
Arsenii Kulikov
07bca4f26a perf(engine): only recover senders once (#20118) 2025-12-04 20:43:51 +00:00
Arsenii Kulikov
9e1b2474b0 fix: change Receipt rlp (#20074) 2025-12-04 20:29:22 +00:00
Matthias Seitz
d71cd129a7 chore: allow empty blobparams in ethconfig (#20105) 2025-12-04 18:48:37 +00:00
Ignacio Hagopian
e53990cf41 fix(chainspec): add ChainConfig to StatelessInput and add ChainConfig creator helpers (#20101)
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2025-12-04 18:46:04 +00:00
Matthias Seitz
61f5b4e06f chore: add payload info to trace (#20124) 2025-12-04 17:42:09 +00:00
Matthias Seitz
1f7d552d63 test: ensure invalid block hook is opt out (#20125) 2025-12-04 17:38:54 +00:00
gustavo
b8f0b5d67e fix(rpc): improve/preserve error messages for TransactionConversionError (#20057) 2025-12-04 15:43:42 +00:00
Ignacio Hagopian
409b74fc36 feat(tests): add Osaka fork specification to ForkSpec enum (#20120) 2025-12-04 14:33:38 +00:00
0xMushow
282932d3eb fix(net): enforce stricter bound on check_peer_blocks (#20116) 2025-12-04 11:50:36 +00:00
Block Wizard
b6d886f288 docs(engine): fix transact_batch comment (#20097) 2025-12-04 11:44:08 +00:00
joshieDo
d6caf7f063 fix: set minimum pruning distance to 64 blocks for trie changesets (#20108) 2025-12-04 10:12:38 +00:00
gustavo
7b90bcd3e1 chore(docker): upgrade lighthouse image to version 8.0.1 (#20109) 2025-12-03 22:55:59 +00:00
Bashmunta
a68980dd72 fix(txpool): derive accurate queued reason for SubPool::Blob (#20095) 2025-12-03 22:03:37 +00:00
Matthias Seitz
4adf163fdc chore: add alias for flashblocks-url (#20093) 2025-12-03 20:17:34 +00:00
Matthias Seitz
7e6a59b6ac chore: make ethconfig work with headermut (#20102) 2025-12-03 17:16:18 +00:00
Matthias Seitz
0b3fc3019f chore: add helper fn for building pool (#20100) 2025-12-03 16:02:36 +00:00
Đạt Nguyễn
3a9dbdc840 feat(tx-pool): make metrics, listener structs, and fields public (#20087) 2025-12-03 10:50:50 +00:00
gustavo
af1e12fd43 chore(txpool): feature gate test (#20082) 2025-12-03 10:04:07 +00:00
Block Wizard
8fd86ba516 docs(metrics): fix mpsc copy-paste doc errors (#20085) 2025-12-03 10:03:40 +00:00
YK
e0a6f54b42 perf(trie): add HashedPostStateSorted::from_reverts (#20047) 2025-12-03 05:05:23 +00:00
Bashmunta
98e9a1d09e fix(ipc): make IpcServer Debug impl generic (#20042) 2025-12-02 15:08:02 +00:00
joshieDo
8f2811dd19 fix: ensure MerkleChangeSets pruner only runs if pipeline stage has finished (#20073) 2025-12-02 14:08:47 +00:00
dependabot[bot]
9260f2fe40 chore(deps): bump actions/upload-artifact from 4 to 5 (#20063)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-02 13:58:49 +00:00
Block Wizard
cefddbb39d docs(engine): fix canonical_block_by_hash comments (#20067) 2025-12-02 11:06:40 +00:00
strmfos
8f5b4ae324 fix(rpc): check correct variable for division by zero in blob gas ratio (#20053) 2025-12-01 11:57:51 +00:00
Block Wizard
cdb896f8de docs(trace): fix trace_callMany params structure and formatting inconsistencies (#20051) 2025-12-01 10:25:20 +00:00
github-actions[bot]
4f5b842543 chore(deps): weekly cargo update (#20043)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-11-30 10:06:57 +00:00
Arsenii Kulikov
b3c00ed602 fix: convert headers in newHeads (#20036) 2025-11-28 20:27:08 +00:00
Alexey Shekhirin
7922edf63d feat(storage): log storage settings on startup (#19931) 2025-11-28 20:01:59 +00:00
Matthias Seitz
93d81ed4d5 chore: add elapsed info to logs (#20035) 2025-11-28 19:42:48 +00:00
Galoretka
0334953357 docs: correct profiling feature name and jemalloc env var (#20030) 2025-11-28 16:34:41 +00:00
Francis Li
194a01adda feat(engine): Update execution cache on inserted executed blocks (#19822)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-28 14:32:15 +00:00
oxBoni
c5764f51bd chore: avoid cloning block range when ranking peers (#20033)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-28 14:12:44 +00:00
dependabot[bot]
6becc6bd60 chore(deps): bump dawidd6/action-homebrew-bump-formula from 5 to 6 (#19951)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-28 14:04:50 +00:00
ANtutov
56cb1581d6 chore(ethereum): avoid cloning requests in try_into_v4 (#19851) 2025-11-28 14:00:54 +00:00
gustavo
c6b1a45ce4 feat(txpool): add append_* helpers (#20028) 2025-11-28 13:59:43 +00:00
Vitalyr
b92741a1db refactor(tree): remove unnecessary block clone (#19848) 2025-11-28 13:57:52 +00:00
cui
ef0c1e2d50 fix: update sidebar.ts (#20032)
Co-authored-by: weixie.cui <weixie.cui@okg.com>
2025-11-28 13:10:21 +00:00
Matthias Seitz
44ba8eb640 chore: drop jar early (#20031) 2025-11-28 12:44:33 +00:00
Matthias Seitz
507becb451 docs: fix trace call docs (#20029) 2025-11-28 13:10:56 +01:00
cui
e910e58778 feat: docs for op-reth (#20024)
Co-authored-by: weixie.cui <weixie.cui@okg.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-28 11:41:27 +00:00
radik878
47e8f51627 fix(transaction-pool): Spawn ValidationTask to keep channel open (#19943)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-28 11:14:57 +00:00
ANtutov
813786247a docs(trace): fix trace_call method invocation table (#19977)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-28 11:12:22 +00:00
Bashmunta
c9e661658b perf: disable storage branch masks for non-target accounts (#19598) 2025-11-28 11:11:55 +00:00
sashass1315
2695f00b83 fix: propagate-only pending listener dropping promoted txs (#20013) 2025-11-28 10:09:28 +00:00
ANtutov
73117ecd0a fix(rpc): unify EthFilterConfig TTL default with constant (#20026) 2025-11-28 09:57:07 +00:00
Fibonacci747
b2fe49efd9 fix: remove dead resolved_links state from SyncTree and its usage (#20022) 2025-11-28 09:55:23 +00:00
Matthias Seitz
6446f404ff test: add helper for tracing a range of blocks (#19959) 2025-11-28 11:01:19 +01:00
Matthias Seitz
846ffc6f7e chore: consume result logs (#20025) 2025-11-28 10:53:18 +01:00
Tomass
36c62807dc fix(mev): correct refund calculation in sim_bundle (#19991) 2025-11-28 09:20:32 +00:00
YK
e8fd2eedfd perf(trie): compute and sort trie inputs async (#19894) 2025-11-28 06:10:59 +00:00
Matthias Seitz
65d75a77c0 fix(net): back off slightly after graceful connection termination (#20020) 2025-11-27 23:41:09 +00:00
phrwlk
ac6069e1e0 docs(jsonrpc/trace): document opcode gas endpoints (#20011) 2025-11-27 22:09:33 +00:00
Matthias Seitz
8621308952 fix: keep peer status unchanged on new discovered updates (#20018) 2025-11-27 19:37:53 +00:00
YK
6598b88e02 fix(bench-compare): filter empty strings from additional reth args (#20004) 2025-11-27 18:07:55 +00:00
Matthias Seitz
78f8dddfc2 chore: add additional peer manager logs (#20015) 2025-11-27 17:01:26 +00:00
Artyom Bakhtin
014f115c47 feat: Reproducible builds and *.deb packages (#19678)
Signed-off-by: bakhtin <a@bakhtin.net>
2025-11-27 11:35:22 +00:00
stevencartavia
07c5956ce7 chore: move CliHeader to primitives traits and rename to HeaderMut (#20001) 2025-11-27 09:43:55 +00:00
oxBoni
d3f6c4c666 chore: remove unused stream item generic from SyncListener future impl (#20003) 2025-11-27 09:43:47 +00:00
Fibonacci747
0f4d475223 fix: preserve basic nodes from peers file by avoiding peer_config overwrite (#19887)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-26 23:08:00 +00:00
gustavo
c037a57d05 perf(payload): move fields instead of cloning in PayloadBuilderStack::try_build (#19998) 2025-11-26 22:03:54 +00:00
Galoretka
1e4b15b6cc docs: document missing config sections and fields (#19996) 2025-11-26 21:58:39 +00:00
josé v
eab90f8fe6 chore: refactor pooled_transaction_hashes_max for early termination (#19999) 2025-11-26 21:56:29 +00:00
Matthias Seitz
8aad5a6006 chore: rm unused warnings (#19958) 2025-11-26 23:05:41 +01:00
Snezhkko
f386f96f1e perf(payload): move parent_header in PayloadBuilderStack::build_empty_payload (#19995) 2025-11-26 19:13:29 +00:00
Matthias Seitz
dc8c4eebdc feat: add helper for is nonce too low (#19993) 2025-11-26 19:12:35 +00:00
Matthias Seitz
5b9d8c5008 chore: add clone into pooled (#19989) 2025-11-26 15:38:02 +00:00
Brian Picciano
7345e1e5b5 feat(trie): Benchmarks comparing proof_v2 to "legacy" proof implementation (#19967)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-11-26 14:18:15 +00:00
stevencartavia
ac120ffd31 feat: introduce PayloadValidator::payload_to_block (#19953) 2025-11-26 11:26:57 +00:00
Matthias Seitz
2f58f67974 feat!: accept error by ref (#19981) 2025-11-26 10:04:20 +00:00
cui
c72644f867 fix: docs link in https://reth.rs/cli/cli (#19961) 2025-11-26 09:47:24 +00:00
Rej Ect
e62cb8f82b ci: update checkout action to v6 (#19930) 2025-11-26 09:46:58 +00:00
Matthias Seitz
0f11d469bb chore: extract notify event helpers (#19985) 2025-11-26 09:25:04 +00:00
Matthias Seitz
21a4b13828 feat: add next_tx_and_priority for Besttransactions (#19982) 2025-11-26 09:11:45 +00:00
Arsenii Kulikov
8528769896 fix: better RpcConvert bounds (#19980) 2025-11-25 23:17:11 +00:00
Matthias Seitz
acf2d948b6 chore: more txpool pub (#19978) 2025-11-25 20:52:42 +00:00
Matthias Seitz
587b1f45db chore: add helper for Chain (#19976) 2025-11-25 18:13:43 +00:00
Matthias Seitz
69b97e3f63 chore: make more pool internals pub (#19974) 2025-11-25 17:43:37 +00:00
Matthias Seitz
cb932b3f7d feat: add helper for TransactionValidationOutcome (#19973) 2025-11-25 17:19:41 +00:00
Matthias Seitz
52defdc479 feat: export validator (#19971) 2025-11-25 16:42:22 +00:00
Bashmunta
a3ee6b2761 chore: avoid redundant factory construction in witness/proof overlay init (#19969) 2025-11-25 16:25:24 +00:00
Matthias Seitz
8b38877797 chore: make fields pub (#19970) 2025-11-25 15:36:19 +00:00
Arsenii Kulikov
70b8724b8d feat: PoolTransaction::requres_nonce_check (#19968) 2025-11-25 14:40:58 +00:00
Matthias Seitz
d9d833f556 feat: make a few more things pub (#19966) 2025-11-25 14:20:50 +00:00
gustavo
edc31d23e2 feat(txpool): add total_other_transactions metric (#19965) 2025-11-25 13:59:30 +00:00
strmfos
87e2716f3f fix(net): correct Debug impl for StatusEth69 (#19963) 2025-11-25 11:58:02 +00:00
Brian Picciano
1b59cd2155 feat(trie): Proof V2: retain proof nodes which match targets (#19941)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-11-25 11:23:27 +00:00
YK
1c31abce27 fix(metrics): remove duplicate trie_input_duration recording (#19955) 2025-11-25 10:25:40 +00:00
emmmm
8c8efc6082 docs(consensus): fix misleading docstring in validate_4844_header_standalone (#19960) 2025-11-25 08:54:43 +00:00
Forostovec
c680d2e7bd docs: fix incorrect default values in configuration.mdx (#19936) 2025-11-25 08:33:44 +00:00
Dan Cline
a7bd7bd626 feat(cli): add db account-storage command (#19952) 2025-11-25 08:32:32 +00:00
Francis Li
ba862da221 feat(flashblock): Enable eth_getTransactionByHash support for flashblock (#19954)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-25 08:31:24 +00:00
Dan Cline
e57fe4510c docs(cli): remove reference to engine experimental (#19944) 2025-11-24 22:47:49 +00:00
Vitalyr
f2600ace51 chore: avoid needless clone in module array conversion (#19939) 2025-11-24 21:50:17 +00:00
Matthias Seitz
366f509b2f chore: spawn tx iter earlier (#19948) 2025-11-24 21:22:59 +00:00
Francis Li
118fd3b372 feat(flashblocks): Cache recent flashblocks (#19786)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-24 18:01:46 +00:00
cui
b546aca5c1 fix: npm run build failed in docs/vocs directory (#19937) 2025-11-24 16:35:38 +00:00
Acat
c7b689016a fix(txpool): ensure skipped high-priority transactions are tracked in BestTransactions (#19940) 2025-11-24 15:31:47 +00:00
Arsenii Kulikov
4467bc9f4b fix: correctly fetch pending hashes (#19938) 2025-11-24 14:36:43 +00:00
YK
c2d73988de chore(test): Increase timeout for ethereum e2e tests (#19933) 2025-11-24 11:30:30 +00:00
Arsenii Kulikov
c2912a7333 refactor(tracing): introduce DebugInspector (#19925) 2025-11-24 10:38:13 +00:00
David Klank
bd9e41c551 chore(era): move reth-ethereum-primitives to dev-dependencies (#19847) 2025-11-24 09:56:30 +00:00
cui
b6f62473e0 feat: update docs link in cli/SUMMARY.mdx (#19909) 2025-11-24 09:56:02 +00:00
Bashmunta
d429a665b2 chore: remove unused lifetime from map_internal_err impl (#19924) 2025-11-24 09:52:39 +00:00
Andrés David Ramírez Chiquillo
75af47c456 feat(payload): enforce Osaka validation for GetPayloadV4 (#19929) 2025-11-24 09:51:12 +00:00
YK
f1fc979116 feat(reth-bench-compare): add standard deviation metrics to comparison report (#19928) 2025-11-24 09:39:27 +00:00
Maximilian Hubert
d278b75c3a chore(stages): fix naming and simplify add_stages implementation (#19923) 2025-11-24 08:47:54 +00:00
Đạt Nguyễn
e03c9da85c refactor: remove unused add_transactions_with_origins trait (#19824) 2025-11-24 06:53:10 +00:00
Arsenii Kulikov
ee63c7d6b4 refactor: simplify rpc state provider traits (#19920) 2025-11-23 19:06:10 +00:00
Matthias Seitz
1702107028 feat: make txpool notify fns pub (#19918) 2025-11-23 14:07:59 +01:00
github-actions[bot]
32f0a74462 chore(deps): weekly cargo update (#19917)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-11-23 11:50:58 +00:00
Arsenii Kulikov
a83ac8cc63 refactor(e2e): relax bounds (#19913) 2025-11-23 13:05:48 +01:00
Léa Narzis
7f40013cf6 feat(tracing-otlp): make trace id ratio sample customizable with --tracing-otlp.sample-ratio arg (#19438) 2025-11-21 21:05:43 +00:00
Arsenii Kulikov
6e365949c4 feat: allow customizing dev block timestamp (#19904) 2025-11-21 20:38:20 +00:00
Léa Narzis
e15b404a30 feat(era-file): back to era file support (#19482) 2025-11-21 20:03:28 +00:00
Alexey Shekhirin
39ef6216fb feat(provider, static-file): transaction senders segment (#19508)
Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-21 19:34:16 +00:00
Francis Li
5e0732404c chore(op-alloy): update op-alloy to v0.22.4 (#19905) 2025-11-21 18:25:05 +00:00
gustavo
9f3949cd35 chore(examples): complete state_provider_example (#19903) 2025-11-21 15:58:49 +00:00
Mablr
b0494a158a chore(rpc-eth-types): use FillTransaction from alloy (#19890) 2025-11-21 15:52:28 +00:00
YK
002e755dd4 chore(bench-compare): Add latency distribution stats to reth-bench-compare (#19873)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-21 14:52:55 +00:00
Arsenii Kulikov
a43128277f fix: correctly poll tx fetcher (#19900) 2025-11-21 14:41:28 +00:00
Alexey Shekhirin
86825ac3b7 refactor(cli): deduplicate ethereum init_tracing implementations (#19898) 2025-11-21 14:23:57 +00:00
Alexey Shekhirin
0ba122923a ci: partition cargo-checks job (#19897) 2025-11-21 12:48:31 +00:00
Dan Cline
2a953a821a fix: remove noisy storage proof spans (#19892) 2025-11-21 11:48:32 +00:00
Matthias Seitz
cc7edeb354 chore: dont treat invalid fork as fatal (#19888)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-11-20 20:51:49 +01:00
gejeduck
9cdcc8e087 feat: respect BlockRangeInfo when selecting peer for request (#16704)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-20 18:19:11 +00:00
Merkel Tranjes
55dacfc739 chore: bump op-alloy deps to 0.22.3 (#19885) 2025-11-20 18:18:53 +00:00
stevencartavia
1ca4348db7 chore: replace op-reth OpReceipt with op-alloy's (#19846)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-11-20 15:59:21 +00:00
Léa Narzis
8c2b037c9a fix(era): fix roundtrip, decoding receipt for era mainnet test (#19862) 2025-11-20 14:49:01 +00:00
Brian Picciano
b72bb6790a feat(trie): Proof rewrite: implement stack-based algorithm for calculating trie nodes from leaves (#19863)
Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-20 13:37:55 +00:00
Arsenii Kulikov
c48aed264c refactor: tx policy traits (#19878) 2025-11-20 13:33:46 +00:00
gustavo
d550e4eb07 test(provider): remove stale todo (#19876) 2025-11-20 12:21:51 +00:00
Brian Picciano
c195aee2b2 feat(trie): Implement set_hashed_address on mock trie cursors (#19864) 2025-11-20 11:53:22 +00:00
Matthias Seitz
2e5a155b6d chore: use installed client name for start log (#19868) 2025-11-20 01:58:53 +00:00
Matthias Seitz
5b6ce8bd64 fix: ensure we poll again (#19866) 2025-11-20 00:11:32 +00:00
sashass1315
c75dc322d9 feat(rpc): warn when --ws.api is set but --ws is disabled (#19855) 2025-11-19 23:57:44 +00:00
Alexey Shekhirin
cfc34367fb feat(provider): change storage settings on existing nodes via CLI (#19771)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-11-19 22:47:28 +00:00
Alexey Shekhirin
17985b2c94 chore(engine, trie): cleanup traces (#19856) 2025-11-19 17:46:36 +00:00
Brian Picciano
c57792cff4 feat(trie): Implement skeleton of proof_v2 (#19687) 2025-11-19 16:33:05 +00:00
YK
e58aa09f82 perf(engine): return sorted data from compute_trie_input (#19340) 2025-11-19 16:01:24 +00:00
Xzavier
a72c1dab88 fix(net): resolve external ip on startup (#19852) 2025-11-19 15:50:14 +00:00
Dan Cline
65f72e3209 chore(trie): add spans for how long we wait on proofs in recv (#19859) 2025-11-19 15:49:35 +00:00
Alexey Shekhirin
819330c596 feat(engine): new payload last gas/s metric (#19853) 2025-11-19 12:43:34 +00:00
joshieDo
e93bd0a087 fix: ensure that pruning all rows doesn't leave the offset file corrupted (#19819) 2025-11-18 22:07:23 +00:00
joshieDo
d10070e6f4 fix: stage drop command shouldnt delete jars (#19817) 2025-11-18 22:07:18 +00:00
Dan Cline
a301276e4b feat(primitives-traits): add teragas (#19843) 2025-11-18 22:04:50 +00:00
Arsenii Kulikov
27d28e5e7d feat: EthApiError::from_revert (#19836) 2025-11-18 19:51:26 +00:00
Đạt Nguyễn
7a72550745 perf(rpc): reduce estimate gas trait bounds to EvmStateProvider (#19746) 2025-11-18 18:54:37 +00:00
strmfos
a812aea8d1 fix: correct argument order in save_diff calls for invalid block hooks (#19676) 2025-11-18 18:36:03 +00:00
joshieDo
982fa4829a chore: add logs to StaticFileProvider::check_consistency (#19816) 2025-11-18 18:31:22 +00:00
Forostovec
4836062d7b feat(node): remove unnecessary ConnWrapper clone in connect() (#19456) 2025-11-18 18:07:07 +00:00
Alexey Shekhirin
9dc6e256a9 feat(trie): record cursor metrics as span fields (#19830) 2025-11-18 15:15:13 +00:00
Bashmunta
02fc6af313 fix(rpc): metered getPayloadBodiesByHash timing to await before recording (#19827) 2025-11-18 15:12:04 +00:00
gustavo
90e265134f chore: document filter topic usage in db-access example (#19829) 2025-11-18 14:56:33 +00:00
Karl Yu
4f94fa240f feat: add helpers for testing rpc requests with prestate (#19790)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-18 15:34:34 +01:00
Matthias Seitz
69c219eede chore: bump version v1.9.3 (#19831) 2025-11-18 14:59:51 +01:00
joshieDo
9501b4b55a fix: ensure receipt consistency check is done over block number (#19723) 2025-11-18 11:00:57 +00:00
radik878
d997bd0634 docs(db): refresh db crate docs to current API and paths (#19818) 2025-11-17 23:55:40 +00:00
ANtutov
8020cf4494 fix(era-downloader): align checksums with file index in fs::read_dir (#19793)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-17 22:27:16 +00:00
Matthias Seitz
d726375d11 chore: remove flaky benches (#19804) 2025-11-17 22:27:10 +00:00
Matthias Seitz
e634dc46c8 fix: remove bad reset and cancel on drop (#19821) 2025-11-17 22:26:43 +00:00
Matthias Seitz
940be8a092 fix(net): use external ip for discv5 config (#19784) 2025-11-17 22:26:19 +01:00
Dan Cline
23eb96c209 fix(cli): always commit the unwind for stage run headers (#19768) 2025-11-17 19:26:46 +00:00
Matthias Seitz
2a16222ea1 revert: "perf(persistence): improve write batch for HashedPostState & TrieUpdatesSorted" (#19814) 2025-11-17 20:39:01 +01:00
Alexey Shekhirin
fb763edb43 refactor(provider): unify static file indexes into one struct (#19803) 2025-11-17 19:02:28 +00:00
Alexey Shekhirin
6fa11ff2f8 test(prune): fix bodies static files expected block range (#19811) 2025-11-17 17:45:59 +00:00
phrwlk
1568f4c451 perf(payload): remove string allocations and unused import (#19799) 2025-11-17 17:10:13 +00:00
YK
d5025392d0 perf(trie): optimize chunking configuration (#19800)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-11-17 15:47:24 +00:00
Forostovec
90621de27c fix(prune): avoid extra iterator consumption (#19758)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-17 15:43:47 +00:00
gustavo
adbc68c66c fix: add alloy-rlp dependency to testing-utils (test_sign_eip_155) (#19807) 2025-11-17 15:41:50 +00:00
joshieDo
cac2443dfc chore: add logs around commit and update_index on StaticFileProvider (#19802)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-17 14:51:11 +00:00
Andrés David Ramírez Chiquillo
ea794ff387 chore(provider): use parking_lot RwLock for overlay cache (#19798) 2025-11-17 14:40:49 +00:00
Matthias Seitz
4efd3f8882 chore(op-reth/scr): update superchain-registry (#19806)
Co-authored-by: theo <80177219+theochap@users.noreply.github.com>
2025-11-17 15:44:16 +01:00
YK
c5365de1fb chore(bench-compare): clarify percentage calculation method for final report (#19796) 2025-11-17 13:11:44 +00:00
Ligt Nguyen
65ca4a3afa perf(persistence): improve write batch for HashedPostState & TrieUpdatesSorted (#19739) 2025-11-17 12:56:41 +00:00
gustavo
4260ccd2b5 chore: remove unnecessary todos in witness_db (#19801) 2025-11-17 10:57:17 +00:00
YK
ab5c4452c1 chore: add code owners for reth-bench-compare (#19797) 2025-11-17 00:28:34 +00:00
Vaibhav Arora
af2cc34c36 docs: update rust version (#19789) 2025-11-16 23:59:19 +00:00
Merkel Tranjes
74d9e8b73a chore: inline hardcoded filter name in segment filename (#19420) 2025-11-16 23:57:59 +00:00
Forostovec
48624dcd8c fix(net): fix update_root ENR/LINK handling (#19620) 2025-11-16 23:55:53 +00:00
Fibonacci747
55875ec8a4 fix(transaction-pool): mark TransactionEvent::Invalid as final (#19782) 2025-11-16 23:43:52 +00:00
Léa Narzis
d66069deb0 feat(rpc-provider): add MeteredBatchRequests(Future) (#19779) 2025-11-16 23:26:53 +00:00
Gengar
d1084ca43a docs: clarify BetterPayloadEmitter emits both Better and Freeze outcomes (#19795) 2025-11-16 23:24:19 +00:00
forkfury
46aa02876d fix(tasks): prevent infinite recursion in TaskSpawner implementation (#19788) 2025-11-16 23:22:14 +00:00
sashass1315
2ade18d111 chore(payload): remove redundant attr clone (#19791) 2025-11-16 10:24:50 +00:00
Francis Li
5866a82516 feat(flashblock): improve state root calculation condition (#19667) 2025-11-16 10:22:59 +00:00
github-actions[bot]
a3cebced10 chore(deps): weekly cargo update (#19785)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-11-16 07:17:05 +00:00
Block Wizard
fce0825f81 fix(grafana): restore DS_PROMETHEUS placeholder replacement (#19773) 2025-11-15 09:30:53 +00:00
Jennifer
7fdd9c39e3 refactor: rename state_root span to await_state_root (#19769) 2025-11-14 22:56:44 +00:00
Alexey Shekhirin
860a453930 refactor(cli): db subcommands (#19754) 2025-11-14 22:37:01 +00:00
Brian Picciano
f88fae0ea1 perf(trie): Cache overlays in the OverlayStateProviderFactory (#19752) 2025-11-14 22:20:58 +00:00
Avory
60f663e5b4 fix(payload): emit events for Freeze payload outcomes (#19435)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-14 17:13:39 +00:00
Alexey Shekhirin
c78bca259e chore: replace labels in Grafana dashboard for docker compose (#19756) 2025-11-14 16:35:08 +00:00
Alex Pikme
9eff492d48 feat(flashblocks): add metrics for current block and index (#19712)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-14 15:23:46 +00:00
Alexey Shekhirin
b6e6bd35c0 refactor(stages): empty transactions range (#19753) 2025-11-14 15:11:34 +00:00
Avory
d150b0a39b docs: remove obsolete max_changesets documentation (#19731) 2025-11-14 14:57:01 +00:00
Arsenii Kulikov
63409fe650 chore: bump revm (#19757) 2025-11-14 14:33:40 +00:00
cui
7191e9ca10 feat: add --netrestrict to node cmd like in geth (#19686)
Co-authored-by: weixie.cui <weixie.cui@okg.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-14 13:08:51 +00:00
Gengar
a21a3cc0d6 docs: add comprehensive documentation for NodeType enum (#19740) 2025-11-14 13:00:37 +00:00
radik878
26f575440d docs(stages): align stages.md with current pipeline and PoS semantics (#19733) 2025-11-14 12:58:27 +00:00
YK
3ac5bf4dd1 feat(bench-compare): add configurable OTLP trace queue size (#19737)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-14 12:55:33 +00:00
Chad
cce85b310b feat: make PayloadBuilderArgs defaults customizable (#19696)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-11-14 12:52:28 +00:00
Fallengirl
60d5687dbd docs: resolve broken intra-doc link in transactions module (#19744) 2025-11-14 12:43:45 +00:00
Matthias Seitz
20270ec616 fix: add minbasefee for jovian attributes (#19726) 2025-11-14 12:02:20 +00:00
Matthias Seitz
fb8b28fced feat: add --skip-invalid-blocks (#19750) 2025-11-14 11:27:09 +00:00
Matthias Seitz
bc7803dbe0 chore: use hex! macro in chainspec tests (#19671) 2025-11-14 09:57:38 +00:00
Matthias Seitz
947b67e8c6 chore: reset log interval on new stats (#19693) 2025-11-14 09:55:33 +00:00
Brian Picciano
531c8f4ced feat(db): Add metrics/spans to OverlayStateProviderFactory (#19745) 2025-11-14 09:47:41 +00:00
Matthias Seitz
cfd0e3f5ed chore: improve test database error messages (#19557) 2025-11-14 09:40:44 +00:00
YK
6db85df46d fix(bench-compare): fix CSV parser schema (#19742) 2025-11-14 08:47:08 +00:00
Matthias Seitz
326165185d feat: add more block meta to comparison (#19722)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-14 00:47:28 +00:00
Dan Cline
2233f8661c feat(docs): Add section about setting up Jaeger and OTLP (#19628)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-13 23:37:52 +00:00
Mablr
bedbfb83f3 refactor(rpc-convert): move rpc conversion traits/impls to alloy-evm (#19616) 2025-11-13 23:01:43 +00:00
forkfury
ba84eeaccd docs(revm): document lifetime requirements for CachedReads wrappers (#19725) 2025-11-13 22:58:02 +00:00
youyyytrok
bff7ddcdf3 docs: fixed dead Sentry link (#19714) 2025-11-13 22:57:33 +00:00
oooLowNeoNooo
c51cf92db0 fix(stateless): export stateless_validation function (#19729) 2025-11-13 20:56:06 +00:00
Matthias Seitz
86246b6f4b fix: ensure open db tx is dropped (#19727) 2025-11-13 20:07:19 +00:00
Léa Narzis
96993dd073 refactor(era-downloader): support both era and era1 file types in downloader (#19617) 2025-11-13 19:26:21 +00:00
Ignacio Hagopian
c5b7d4a58a chore(stateless): show wrapped error message (#19716)
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2025-11-13 18:05:04 +00:00
Alexey Shekhirin
ce2dc9203b feat(cli): reth db static-file-header (#19719) 2025-11-13 17:48:53 +00:00
Brian Picciano
d77e4815c3 feat(bench): Disable log styling in reth-bench-compare sub-processes (#19718) 2025-11-13 16:52:59 +00:00
joshieDo
88d853e724 feat: always write receipts to static files on new nodes (#19399) 2025-11-13 16:37:30 +00:00
Arsenii Kulikov
ca33e8a457 chore: bump revm-interpreter (#19709) 2025-11-13 12:19:04 +00:00
David Klank
270fb977ba fix(db-api): resolve test compilation errors (#19704)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-13 09:39:06 +00:00
Fibonacci747
a96b22875b chore: remove redundant eth/68 NewPooledTransactionHashes length validation (#19708) 2025-11-13 09:29:21 +00:00
0xLogicalx
7a599dc130 chore: remove redundant clone in exex subscription RPC setup (#19699) 2025-11-13 00:09:19 +00:00
Alex Pikme
474351a929 feat(op-rpc): support batch rpc calls in historical forwarding (#19679)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-12 23:32:35 +00:00
Dan Cline
95d8916825 chore(engine): add basic tx result information to execution spans (#19698) 2025-11-12 23:08:11 +00:00
Dan Cline
75e9359fec chore(cli): disable long read transaction for db list and pipeline (#19694) 2025-11-12 21:19:02 +00:00
Merkel Tranjes
ec92a839fc refactor(stages): use named structs for ExecInput returns (#19689) 2025-11-12 17:54:07 +00:00
Brian Picciano
573191e1d1 chore(trie): Allow reusing Hashed/TrieCursors (#19588) 2025-11-12 17:31:04 +00:00
Alexey Shekhirin
95b8a8535b feat(stages): get transaction range starting from first available block (#19662) 2025-11-12 14:43:39 +00:00
Alexey Shekhirin
c57a5204c2 refactor(provider): explicit static file segment matches (#19664)
Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com>
2025-11-12 14:31:48 +00:00
leniram159
6c1296da5d feat: support block number in required-block-hashes parameter (#18546)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-12 13:52:38 +00:00
Brian Picciano
3f1a7b37e9 chore(trie): Add metrics to track all cursor operations in proof workers (#19633) 2025-11-12 13:35:37 +00:00
Andrés David Ramírez Chiquillo
55a49080c6 feat(db): introduce --db.page-size argument (#19594) 2025-11-12 13:21:56 +00:00
phrwlk
40f89af926 chore: remove unused latest_update_kind from TxPool (#19634) 2025-11-12 13:20:36 +00:00
josé v
a7a4c3bf59 chore: make extra_data_size_limit configurable in EthBeaconConsensus (#19496) 2025-11-12 13:15:47 +00:00
Avory
abe6bf6125 fix(stages): implement floor rounding for percentage in no_std mode (#19675) 2025-11-12 12:57:32 +00:00
Merkel Tranjes
54cca9efd0 fix(hardforks): don't print pre-merge section if empty (#19654)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-12 12:52:43 +00:00
Francis Li
12fd25892d refactor(flashblock): Move all flashblocks related data structure to op-alloy (#19608) 2025-11-12 12:26:42 +00:00
strmfos
43407d47f9 fix: require config path when not using --default (#19632) 2025-11-12 12:16:34 +00:00
Fibonacci747
385fcddbe0 fix(ethstats): prevent shutdown on read errors (#19672) 2025-11-12 12:15:08 +00:00
cui
8479f286ea feat: add --p2p-secret-key-hex which is similiar nodekeyhex in geth (#19670)
Co-authored-by: weixie.cui <weixie.cui@okg.com>
2025-11-12 12:15:03 +00:00
Delweng
d9537a416a feat(rpc): debug_traceCall support TxIndex (#18477)
Signed-off-by: jsvisa <delweng@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-12 11:49:04 +00:00
Arsenii Kulikov
bacb3522bb chore: bump revm v33 (#19674) 2025-11-12 11:46:40 +00:00
Salman Pathan
7b89167ce1 chore: add target: flashblock for all flashblock related traces (#19656) 2025-11-12 11:07:21 +00:00
Karl Yu
56ded417e9 feat: limit handling of incoming txs to trusted peers (#19666)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-12 10:45:26 +00:00
bigbear
2e5f6f8323 fix: preserve parent beacon root in pending env (#19645) 2025-11-12 09:29:43 +00:00
Matthias Seitz
b3c3affc5f chore: downgrade noisy log (#19660) 2025-11-12 09:28:26 +00:00
Alexey Shekhirin
64f33cf648 feat(node): allow to configure blocks per file for static file segments (#19562) 2025-11-12 09:23:08 +00:00
Hai | RISE
967edb541e fix: fix new casting error in signal handler (#19669) 2025-11-12 10:34:21 +01:00
Hai | RISE
ef2d9da53b fix(tree-engine): also update in-memory tree when there are attributes in an unwind forkchoice (#19668) 2025-11-12 10:34:00 +01:00
Alexey Shekhirin
01f497bc49 test(static-file): segment header serialization roundtrip and snapshots (#19657) 2025-11-11 20:02:09 +00:00
Alexey Shekhirin
151ae651ad ci: use macos-14 runner (#19658) 2025-11-11 18:37:19 +01:00
Alexey Shekhirin
c780256158 feat(cli): log warning if otlp feature is not enabled (#19648) 2025-11-11 16:38:47 +00:00
Ragnar
3c39444597 fix(stages): correct tip_tx field comment in PipelineBuilder (#19655) 2025-11-11 16:00:28 +00:00
YK
3a672ee0a4 feat(bench-compare): add OTLP tracing support for baseline/feature comparison (#19626) 2025-11-11 15:49:48 +00:00
YK
08dc9cb096 fix(metrics): move trie_input_duration recording to capture full setup (#19649) 2025-11-11 15:47:48 +00:00
Abhivansh
9bc2bf23f4 refactor: capped to to best_block (#19640) 2025-11-11 12:59:30 +00:00
Alexey Shekhirin
087b1665f1 chore: bump version to 1.9.2 (#19647) 2025-11-11 13:22:42 +01:00
Alexey Shekhirin
93003560cf revert: "refactor(prune): remove receipts log filter segment (#19184)" (#19646) 2025-11-11 12:01:39 +00:00
stevencartavia
5f6229fc56 feat: add support for eip-7872 Max blob flag for local builders (#19614) 2025-11-11 10:33:35 +00:00
Alexey Shekhirin
1c256b00ff refactor(provider): introduce EitherWriter::new_receipts (#19600) 2025-11-11 10:29:20 +00:00
YK
4621456ef9 feat(bench-compare): add block range to comparison report (#19643) 2025-11-11 09:31:37 +00:00
Dan Cline
cbc80bab7f chore(static-file): add note on underscores in names (#19639) 2025-11-10 22:18:43 +00:00
rakita
7b3300841f chore: bump op-revm v12.0.2 patch (#19629) 2025-11-10 14:53:28 +00:00
pepes
21b9e3af50 fix: log correct account worker count (#19619) 2025-11-10 12:16:04 +00:00
Matthias Seitz
2e5ac1ce13 chore: add feature propagation to sdk (#19627) 2025-11-10 11:52:30 +00:00
Léa Narzis
b539348bb5 feat(cli): add cli flag --txpool.disable-blobs-support to disable blob support (#19559)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-09 19:32:14 +00:00
Gengar
db1737ea87 docs(chainspec): improve fork_id and satisfy documentation (#19523) 2025-11-09 19:24:46 +00:00
github-actions[bot]
9a0418032d chore(deps): weekly cargo update (#19607)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-09 11:57:19 +00:00
Adrian
a07b83f2fd fix(chainspec): use correct Jovian timestamp constant for Base Sepolia test (#19606) 2025-11-09 11:57:06 +00:00
YK
4b8d2e8774 fix(codspeed): add harness = false for update benchmark in reth-trie-sparse (#19599) 2025-11-08 14:08:48 +00:00
Dan Cline
43e5cc7989 chore(trie): add number of target slots to storage proof span (#19590) 2025-11-08 08:37:32 +00:00
sashass1315
414e995c3d fix(storage): propagate IO errors in parse_accounts to avoid silent partial imports (#19582) 2025-11-08 06:34:20 +00:00
stevencartavia
ec7e8d450b chore: remove unused event variant in ConsensusEngineEvent enum (#19596) 2025-11-08 06:02:47 +00:00
Micke
32a80e8c49 perf(trie): replace static Vec with const slice for empty updates (#19499) 2025-11-07 17:55:00 +00:00
joshieDo
177ad4c0b8 chore: remove duplicated provider method transaction_block (#19585) 2025-11-07 15:03:39 +00:00
Brian Picciano
7faddbaaee chore(trie): Use Vec<Option<...>> in HashedPostStateCursors (#19487)
Co-authored-by: Francis Li <francis.li@uniswap.org>
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-11-07 14:05:22 +00:00
Alexey Shekhirin
5006d5fa87 chore: bump version to 1.9.1 (#19578)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-07 12:08:22 +00:00
Alexey Shekhirin
b0310d1394 feat(engine): metric for time diff between newPayload end and next forkchoiceUpdated start (#19577) 2025-11-07 11:53:44 +00:00
Alexey Shekhirin
05cc14f547 chore: use instance label in Grafana dashboard (#19573) 2025-11-07 11:47:17 +00:00
Brian Picciano
b48c72fad2 chore: BuiltPayloadExecutedBlock (#19430) 2025-11-07 09:16:55 +00:00
Matthias Seitz
4394860df4 ci: add independent tagging options (#19574) 2025-11-07 09:48:43 +01:00
YK
5464312672 fix(bench-compare): validate remote git references (#19569) 2025-11-07 08:10:16 +00:00
Matthias Seitz
9f9ab671c3 ci: tag (#19572) 2025-11-07 09:17:44 +01:00
rakita
42ac2aaeb6 chore: bump revm v31.0.1 (#19567) 2025-11-07 08:34:56 +01:00
Vitalyr
4d258cb98d fix: update docs and arg comments (#19537)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-07 00:31:09 +00:00
Matthias Seitz
f69c544da6 refactor: replace GenericArray with regular arrays in ECIES (#19563) 2025-11-06 23:43:58 +00:00
Matthias Seitz
e813681c5d feat(debug): re-establish block subscription (#19550) 2025-11-06 23:05:11 +00:00
Alexey Shekhirin
3385ec5e6e test(static-file): StaticFileSegment string and serde roundtrips (#19561) 2025-11-06 22:34:13 +00:00
MIHAO PARK
7ade95e9fa chore(consensus): update GasLimitInvalidIncrease/GasLimitInvalidDecrease error msg (#18561)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-06 21:53:45 +00:00
Arsenii Kulikov
4d9d712b43 refactor: provide default implementation for send_raw_transaction (#19564) 2025-11-06 21:33:57 +00:00
phrwlk
cb78b9da67 fix(net): preserve ECIESError in connect_without_timeout (#19558)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-06 21:26:07 +00:00
Alexey Shekhirin
7997cd4283 chore(provider): exhaustive segment match in static files check (#19556) 2025-11-06 18:06:43 +00:00
Alexey Shekhirin
27cf27a984 refactor(provider): introduce EitherWriter (#19554) 2025-11-06 17:36:03 +00:00
Erce Can Bektüre
a6c0ac8cf4 fix: Update filter last poll timestamp in filter logs (#19549) 2025-11-06 16:20:50 +00:00
Snezhkko
04093cc3be fix(prune): use saturating_sub in PruneLimiter::deleted_entries_limit_left (#19535) 2025-11-06 15:49:08 +00:00
Alexey Shekhirin
c5870312e4 feat(static-file): dynamic static file size (#19381) 2025-11-06 14:34:05 +00:00
Andrés Ramírez-Chiquillo
d81d547c93 docs: explain default db size and error in CLI help (#19533)
Co-authored-by: ¨Andrurachi¨ <¨andruvrch@gmail.com¨>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-06 13:33:15 +00:00
phrwlk
65acaf330e fix: remove redundant header insertion in extend_blocks and tests (#19534) 2025-11-06 12:51:18 +00:00
Karl Yu
9d9c1d2824 feat: add capabilities to fetch Peer type (#19543) 2025-11-06 12:16:32 +00:00
Alexey Shekhirin
4f1f2d8033 ci: check that Grafana dashboard doesn't contain DS_PROMETHEUS (#19541) 2025-11-06 11:39:04 +00:00
Alexey Shekhirin
671c690cc1 chore: add new engine metrics to dashboard, fix multiproof charts (#19540) 2025-11-06 11:39:01 +00:00
Alexey Shekhirin
b947455061 refactor(provider, cli): simplify getting provider for index or range (#19440) 2025-11-06 11:34:51 +00:00
Alexey Shekhirin
e5c47fe350 feat(provider): configurable blocks per static file segment (#19458) 2025-11-06 10:53:38 +00:00
David Klank
7cc4fdfaeb fix(stages-types): resolve compilation errors in tests (#19501) 2025-11-06 10:35:22 +00:00
Brian Picciano
ea4a686e86 fix(trie): InMemoryTrieCursor case where all DB nodes are deleted (#19464) 2025-11-06 09:19:39 +00:00
Avory
791de250d7 perf(era-utils): avoid unnecessary PathBuf clone in export (#19530) 2025-11-06 09:04:24 +00:00
oooLowNeoNooo
0928059f5c fix: replace unreachable libmdbx documentation URL (#19532) 2025-11-06 08:24:25 +00:00
Alexey Shekhirin
99fe175823 feat(engine): record newPayload/forkchoiceUpdated metrics outside of RPC (#19522) 2025-11-06 07:47:03 +00:00
joshieDo
e20e56b75e feat: add Metadata table and StorageSettings to ProviderFactory (#19384) 2025-11-06 00:39:49 +00:00
Léa Narzis
e3b38b2de5 chore(era): move era types to era module (#19527) 2025-11-05 19:42:07 +00:00
Fibonacci747
ba8be3fb64 feat(optimism): Simplify trait bounds in revalidate_interop_txs_stream (#19500) 2025-11-05 17:16:57 +00:00
Maxim Evtush
2bcd7388d7 docs: fix license links in README.md (#19519) 2025-11-05 17:16:04 +00:00
Léa Narzis
2ba17cf10d refactor(era): move era types and file handling to new module (#19520) 2025-11-05 17:07:45 +00:00
David Klank
629363a6ea refactor: use Url::as_str() directly in era modules (#19485) 2025-11-05 17:07:10 +00:00
Alexey Shekhirin
11d28b1abb chore: use dashboard variable in main Grafana dashboard (#19518) 2025-11-05 15:48:01 +00:00
Léa Narzis
1b5f1293bc refactor(era): move to e2s module e2s types and file handling (#19490) 2025-11-05 15:40:32 +00:00
Matthias Seitz
84785f025e chore: bump v1.9.0 (#19507) 2025-11-05 13:33:46 +00:00
Matthias Seitz
5b062b21e1 chore: bump hardforks (#19506) 2025-11-05 12:30:37 +00:00
Cypher Pepe
1cd5b50aaf fix: dead link Sentry (#19505) 2025-11-05 11:54:27 +00:00
Matthias Seitz
89be06f6ad chore: bump version 1.8.4 (#19503) 2025-11-05 12:38:37 +01:00
Matthias Seitz
644ecce821 chore: bump min ckzg (#19504) 2025-11-05 11:10:16 +01:00
Matthias Seitz
b90badbe6d fix: skip code check in get_transaction_by_sender_and_nonce (#19502) 2025-11-05 09:49:17 +00:00
josé v
f4715ee62f chore: add custom hardforks example (#19391)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-04 23:50:41 +00:00
Avory
8ac37f3c67 docs(banlist): document timeout update behavior on re-ban (#19497) 2025-11-04 23:19:08 +00:00
Matthias Seitz
3ae73e63e5 perf: improve ethsendrawsync for op with flashblock (#19462)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-11-04 20:48:55 +00:00
theo
c3a60fa75a chore(op-reth/scr): update superchain-registry configs. Commit 9e3f71cee0e4e2acb4864cb00f5fbee3555d8e9f (#19495) 2025-11-04 18:39:34 +00:00
Matthias Seitz
fdcc540492 fix: spawn block fetching blocking (#19491)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-11-04 17:52:09 +00:00
Arsenii Kulikov
29761637ef fix: use cost when checking fee cap (#19493) 2025-11-04 18:17:22 +01:00
Alexey Shekhirin
5a6d3ddcad feat(reth-bench-compare): upstream from personal repo (#19488)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-04 15:10:05 +00:00
Brian Picciano
dd25caec12 chore: Various cleanups after consistent DB view removal (#19489) 2025-11-04 14:49:12 +00:00
sashass1315
583eb837f0 docs(trie): fix PrefixSetMut docs and freeze() comment (#19467) 2025-11-04 14:27:12 +00:00
Karl Yu
736a730a32 feat: support pending block tag in eth_getLogs for flashblocks (#19388)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-04 14:02:50 +00:00
Matthias Seitz
2cb4e1bd2a perf: use latest hash directly (#19486) 2025-11-04 13:30:42 +00:00
Matthias Seitz
6021a68dab perf(rpc): use cache for latest block and receipts (#19483) 2025-11-04 10:08:52 +00:00
Block Wizard
44e99e56f0 fix(net): remove capacity inflation from buffered blocks size calculation (#19481) 2025-11-04 09:05:27 +00:00
Matthias Seitz
f3cf8d5e10 feat: add helper to disable discovery (#19478) 2025-11-04 08:51:33 +00:00
Matthias Seitz
a311423292 chore: add queued reason to event (#19476) 2025-11-04 00:35:39 +00:00
Matthias Seitz
0c00c1b48a chore: add --miner.gaslimit alias (#19475) 2025-11-04 00:35:07 +00:00
Doryu
3f2432761b chore: Remove unused jsonrpsee tracing import in exex subscription example (#19448) 2025-11-03 21:40:55 +00:00
MIHAO PARK
bb694fb576 chore(grafana): deduce label by aggregate metrics (#18550) 2025-11-03 20:41:23 +00:00
joshieDo
c9897ad230 fix: update min_block on StaticFileProvider::update_index (#19469) 2025-11-03 19:53:10 +00:00
MIHAO PARK
66957c7902 chore(node): compact duration formatting in stage progress logs (#18720) 2025-11-03 19:47:35 +00:00
Matthias Seitz
24fa984da4 chore: add js-tracer feature to bins (#19441) 2025-11-03 19:25:50 +00:00
Matthias Seitz
93649fed0b chore: bump revm 31 (#19470)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-11-03 18:49:08 +00:00
Brian Picciano
846025545c fix(db): OverlayStateProviderFactory: default validation lower bound to 0 (#19468) 2025-11-03 17:14:45 +00:00
Matthias Seitz
a0eccf7128 chore: use name const for cli name (#19466) 2025-11-03 17:06:48 +00:00
Matthias Seitz
ea69063aae feat: schedule fusaka (#19455) 2025-11-03 16:51:46 +00:00
Alexey Shekhirin
7438bdbdf6 refactor(prune): derive EnumIter instead of explicit array of segments (#19465) 2025-11-03 15:28:14 +00:00
Matthias Seitz
7905fba953 feat: add broadcast channel for received flashblocks (#19459)
Co-authored-by: Federico Gimenez <fgimenez@users.noreply.github.com>
2025-11-03 12:55:36 +01:00
Matthias Seitz
1e8f35c046 feat(op-reth): add FlashblocksListeners container and receipt helpers (#19446)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-03 09:30:20 +00:00
sashass1315
714ebf749c fix: avoid unnecessary self.clone() in OpNetworkBuilder::network_config (#19451) 2025-11-03 08:52:49 +00:00
Matthias Seitz
1e27e73494 chore: add config_mut helpers (#19436) 2025-11-03 09:51:54 +01:00
github-actions[bot]
0bca7b150d chore(deps): weekly cargo update (#19443)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-11-02 10:01:04 +00:00
Brian Picciano
780161a647 chore: OverlayStateProviderFactory: don't query for reverts unless necessary (#19412) 2025-11-01 15:13:51 +00:00
Matthias Seitz
e6aeba0d7d feat: support custom Download command defaults (#19437) 2025-11-01 10:51:46 +00:00
William Nwoke
dee0eca4d9 feat(tasks): distinguish blocking and non-blocking tasks in metrics (#18440)
Co-authored-by: Nathaniel Bajo <nathanielbajo@Nathaniels-MacBook-Pro.local>
Co-authored-by: Emilia Hane <emiliaha95@gmail.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-31 16:32:30 +00:00
Alexey Shekhirin
5f04690e28 revert: "feat: Add building and publishing of *.deb packages (#18615)" (#19011) 2025-10-31 16:30:47 +00:00
MIHAO PARK
71c124798c perf(cli): optimize StorageChangeSets import in merkle stage dump (#18022)
Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-31 16:08:07 +00:00
anim001k
dff382b8e2 fix: Inline value match in SparseTrie::find_leaf to remove redundant wrapper (#19138)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-31 16:06:06 +00:00
FT
d8729a9d2c chore(docker): remove apt-get upgrade to ensure reproducible and faster builds (#19080) 2025-10-31 16:04:54 +00:00
oooLowNeoNooo
a5eb01b26b fix: rename variable in block_hash method from 'code' to 'hash' (#19269) 2025-10-31 16:00:06 +00:00
Alexey Shekhirin
a43345b54c perf(tree): only chunk multiproof targets if needed (#19326) 2025-10-31 15:45:03 +00:00
Ragnar
e894db8e07 perf: optimize SyncHeight event handling to avoid recursive calls (#19372)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-31 15:44:14 +00:00
bigbear
b05eb5f793 fix(txpool): correct propagate field name in Debug output (#19278) 2025-10-31 15:36:22 +00:00
Micke
1c5c709d61 chore(codecs): replace todo with unimplemented in Compact derive (#19284) 2025-10-31 15:32:28 +00:00
Avory
3bb90e64a2 fix(beacon-api-sidecar): use correct block metadata for reorged blobs (#19424) 2025-10-31 15:08:45 +00:00
Matthias Seitz
ecd49aed11 perf: only chunk if more > 1 available (#19427) 2025-10-31 15:03:10 +00:00
Udoagwa Franklin
af9b04c1a3 feat(op-reth): implement miner_setGasLimit RPC (#19247)
Co-authored-by: frankudoags <frankudoags.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-31 15:02:51 +00:00
Alexey Shekhirin
1f2f1d432f feat(node): CLI argument for sync state idle when backfill is idle (#19429) 2025-10-31 14:16:27 +00:00
Matthias Seitz
9f4f66dd8e perf: bias towards proof results (#19426) 2025-10-31 12:48:33 +00:00
Brian Picciano
728e03706c feat(reth-bench): Default --wait-time to 250ms (#19425) 2025-10-31 12:39:40 +00:00
Gengar
b6be053cbe fix(codecs): return remaining slice in EIP-1559 from_compact (#19413) 2025-10-31 11:55:19 +00:00
Matthias Seitz
8a72b519b2 chore: add count field to trace (#19422) 2025-10-31 11:53:01 +00:00
Brian Picciano
4d437c43bf fix: Properly set MerkleChangeSets checkpoint in stage's fast-path (#19421) 2025-10-31 10:56:37 +00:00
Ragnar
60fba66a4f fix(compact): prevent bitflag overflow by using usize accumulator (#19408) 2025-10-31 09:32:51 +00:00
Eric Woolsey
d29370ebf8 chore: update superchain reg to c9881d543174ff00b8f3a9ad3f31bf4630b9743b (#19418) 2025-10-31 09:09:29 +00:00
Yash
cff942ed0e chore: add tracing features to node-core crate (#19415)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-31 00:01:32 +00:00
Forostovec
6fafff5f14 fix: highest_nonces update in PendingPool::remove_transaction (#19301)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-30 20:43:11 +00:00
Wojtek Łopata
dc8efbf9b3 feat: add --rpc.evm-memory-limit flag (#19279)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-30 19:53:43 +00:00
Skylar Ray
fccf76a19a fix(engine): remove redundant parent_to_child cleanup in insert_executed (#19380) 2025-10-30 18:51:27 +00:00
Lancelot de Ferrière
59bf11779c feat: Output the block execution outputs after validating (reth-stateless) (#19360) 2025-10-30 15:50:29 +00:00
sashass1315
e9400527cd chore(net): avoid cloning GetBlockBodies request (#19404) 2025-10-30 15:12:10 +00:00
leniram159
5f5dbb0121 fix: accurate build features reporting in reth --version (#19124) 2025-10-30 14:48:30 +00:00
Brian Picciano
d87d0d1a1f fix: Prune checkpoint fixes (#19407) 2025-10-30 13:40:18 +00:00
Federico Gimenez
be291144ee fix(engine): trigger live sync after backfill completes at finalized (#19390) 2025-10-30 12:55:32 +00:00
Emilia Hane
7c007f7cda fix(cli): Metrics log when passed metrics port 0 (#19406)
Co-authored-by: Varun Doshi <doshivarun202@gmail.com>
2025-10-30 11:50:19 +00:00
Matthias Seitz
bec4d7c436 perf: box ForkId in Peer struct to reduce size (#19402) 2025-10-29 23:50:39 +00:00
Matthias Seitz
3fa10defd1 chore: bump discv5 (#19400) 2025-10-29 22:06:03 +00:00
Forostovec
f303b28974 chore: reuse gzip read buffer to avoid per-iteration allocation (#19398) 2025-10-29 22:02:30 +00:00
strmfos
b15c285310 perf(codecs): avoid String allocation in proc macro type checking (#19354) 2025-10-29 21:11:13 +00:00
Matthias Seitz
752891b7cb chore: fix unused warning (#19395) 2025-10-29 22:19:42 +01:00
Matthias Seitz
e808b9ab8f chore: fix unused dep (#19397) 2025-10-29 22:19:29 +01:00
leniram159
be50b284b3 feat: display blob params alongside hardfork info (#19358) 2025-10-29 20:34:31 +00:00
Galoretka
1ed41d5151 chore(primitives-traits): gate test-only modules (#19393) 2025-10-29 20:24:40 +00:00
theo
7dc07e8258 feat(jovian/rpc): update receipts to transmit over RPC with Jovian compatible fields (#19368)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-29 20:22:54 +00:00
Dan Cline
7989c7094b docs: fix otlp flag in monioring docs (#19394) 2025-10-29 20:09:43 +00:00
Avory
715369b819 docs: improve RESS protocol module documentation (#19370) 2025-10-29 16:36:02 +00:00
Merkel Tranjes
ea2b26f46a fix: remove PersistenceState from TreeCtx (#19356) 2025-10-29 16:32:43 +00:00
phrwlk
dbc93466ca fix(engine): align compute_trie_input docs with actual persistence behavior (#19385)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-10-29 15:55:35 +00:00
theo
1114a9c07e feat(precompiles/jovian): add jovian precompiles to op-reth (#19333)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-29 17:02:57 +01:00
Mablr
66cfa9ed1a feat(rpc): implement debug_dbGet (#19369) 2025-10-29 15:45:58 +00:00
Jennifer
30942597db fix: add more context to expected hive failures (#19363)
Co-authored-by: rakita <rakita@users.noreply.github.com>
2025-10-29 15:31:35 +00:00
theo
8a795e7d40 feat(jovian/timestamps): add jovian timestamps to op-reth (#19290) 2025-10-29 16:28:17 +01:00
Brian Picciano
d5a7ecf45a chore: Update nix flake (#19386) 2025-10-29 14:39:03 +00:00
emiliano-conduitxyz
5a4287aa6d fix(op-reth): use latest for runtime image (#19331) 2025-10-29 14:35:42 +01:00
Brian Picciano
6659080dc0 fix: Don't always clone in-memory overlays in OverlayStateProviderFactory (#19383) 2025-10-29 13:18:26 +00:00
Matthias Seitz
caaedfadcb chore: bump 1.8.3 (#19379) 2025-10-29 13:07:30 +01:00
joshieDo
644be05659 feat: add pruning of transactions from static-files (#19241) 2025-10-29 11:50:51 +00:00
Brian Picciano
527c24df6d fix(trie): use block hash in OverlayStateProviderFactory (#19353) 2025-10-29 10:34:51 +00:00
Đạt Nguyễn
17a984929b feat: impl a function to create new instance of TransactionEvents (#19375)
Co-authored-by: Neo Krypt <neo@canxium.org>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-29 10:00:37 +00:00
Karl Yu
3827e5cb1d perf: wrap tx with Arc to avoid deep cloning (#19350) 2025-10-29 08:30:29 +00:00
YK
10d9a7e3c6 refactor(trie): restructure proof task workers into structs (#19344) 2025-10-29 08:09:39 +00:00
theo
77ef028aca fix(op-reth/consensus): fixes header validation for jovian. decouple excess blob gas and blob gas used (#19338) 2025-10-29 07:39:29 +00:00
Matthias Seitz
ff46daddb6 feat: insert at timestamp (#19365) 2025-10-28 20:29:26 +00:00
Mablr
adb4f48471 feat(reth-optimism-node): Add OP E2E mineblock test with isthmus activated at genesis (#19305) 2025-10-28 20:13:44 +00:00
Matthias Seitz
6651ae7852 chore: add ChainHardforks::extend (#19332) 2025-10-28 20:36:23 +01:00
joshieDo
ac4f80ded3 chore: dont write receipts to both storages on archive node (#19361) 2025-10-28 17:22:20 +00:00
Matthias Seitz
3ce6e87ab9 chore: update docs for expected test failure (#19343) 2025-10-28 16:07:39 +00:00
joshieDo
020eb6ad7e fix(pipeline): ensure we dont pass an outdated target to header stage (#19351) 2025-10-28 15:02:19 +00:00
YK
5091482dec refactor(trie): reorder proof_task.rs for better code organization (#19342) 2025-10-28 11:14:08 +00:00
Avory
0f3e0eee63 refactor: make DatabaseProof trait stateful (#18753) 2025-10-28 10:14:07 +00:00
Francis Li
5e2ed163f3 fix(engine): Eliminates spurious warning logs in prewarm task (#19133)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-28 09:27:33 +00:00
dependabot[bot]
0da38b9732 chore(deps): bump actions/download-artifact from 5 to 6 (#19336)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 09:23:53 +00:00
dependabot[bot]
e547c027f3 chore(deps): bump actions/upload-artifact from 4 to 5 (#19335)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-28 09:22:33 +00:00
YK
7e6f676d16 feat(metrics): improve multiproof worker metrics (#19337) 2025-10-28 09:00:22 +00:00
YK
e2b5c7367c chore: update Grafana dashboard with split pending multiproof metrics (#19339) 2025-10-28 06:44:19 +00:00
josé v
50e88c29be chore: replace CacheDB with State<DB> in RPC crate (#19330)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-10-27 22:00:58 +00:00
Jennifer
1581aaa615 fix: update section name in expected failures, add more concise comments (#19328) 2025-10-27 21:46:29 +00:00
Brian Picciano
ffeaa4772d chore(engine): Remove ConsistentDbView (#19188)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-27 19:09:21 +00:00
Mablr
a264ccbbc2 feat(metrics): add push gateway support for Prometheus metrics (#19243) 2025-10-27 17:11:23 +00:00
Dan Cline
b1dfbc7e88 chore: remove trie capacity metrics (#19327) 2025-10-27 17:07:37 +00:00
Gengar
0569e884c4 docs: improve documentation for mock database and transactions (#19302) 2025-10-27 15:59:48 +00:00
theo
f9c89a9bc9 feat(jovian/block-validation): fix block validation for jovian (#19304) 2025-10-27 15:59:04 +00:00
Brian Picciano
7e59141c4b fix(trie): Rewrite InMemoryTrieOverlay (with proptests!) (#19277) 2025-10-27 15:18:48 +00:00
Alexey Shekhirin
080cf72464 chore(trie): reduce sparse trie tracing (#19321) 2025-10-27 15:16:56 +00:00
phrwlk
a6fe713a6c chore: remove dead OpL1BlockInfo.number field and writes (#19325) 2025-10-27 14:42:55 +00:00
YK
eed0d9686c refactor(trie): Unify proof return types (#19311) 2025-10-27 13:58:28 +00:00
Brian Picciano
fa1f86cb91 fix(prune): Add unused variants back to PruneSegment enum (#19318) 2025-10-27 13:12:22 +00:00
radik878
f088ec09cb docs(eth-wire): update docs to reflect eth-wire-types, alloy_rlp, version-aware decoding, and RLPx multiplexing (#19319) 2025-10-27 11:58:55 +00:00
Matthias Seitz
106ffefc0f chore: use hex bytes type (#19317) 2025-10-27 12:57:44 +01:00
Gengar
bb73d794fd docs: populate modify-node section with node-custom-rpc implementation guide (#18672) 2025-10-27 12:57:27 +01:00
sashass1315
19f5d51d86 chore: remove redundant PhantomData from NodeHooks (#19316) 2025-10-27 11:41:48 +00:00
Brian Picciano
be73e4a246 fix(trie): Fix trie_reverts not returning sorted nodes (#19280) 2025-10-27 10:48:17 +00:00
Alexey Shekhirin
6b3534d407 ci: pin Bun to v1.2.23 (#19315) 2025-10-27 10:32:37 +00:00
Alexey Shekhirin
763bf350be chore(net): upgrade some noisy spans to TRACE (#19312) 2025-10-27 10:02:52 +00:00
VolodymyrBg
094594142f fix(engine): module doc to reflect schnellru::LruMap backend (#19296) 2025-10-27 11:18:10 +01:00
Maximilian Hubert
4f660dac85 fix(fs): correct ReadLink error message and add missing read_link wra… (#19287) 2025-10-27 11:17:29 +01:00
Galoretka
74cc561917 chore(ethereum): remove redundant std::default::Default import (#19299) 2025-10-27 11:16:16 +01:00
guha-rahul
ded9d3ce33 refactor: add more Snap response types (#19303)
Co-authored-by: suhas-sensei <suhas.ghosal2002@gmail.com>
2025-10-27 10:49:39 +01:00
YK
53119fd5a1 refactor(trie): rename queue_storage_proof to send_storage_proof (#19310) 2025-10-27 10:49:04 +01:00
github-actions[bot]
159ff01cd2 chore(deps): weekly cargo update (#19300)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-10-26 16:37:00 +00:00
phrwlk
e22a511764 fix(node): classify connect_async failures as WebSocket and use Url parse error (#19286) 2025-10-25 06:37:22 +00:00
Alexey Shekhirin
0c8417288b feat(tracing): set default OTLP log level to WARN (#19283) 2025-10-24 18:39:08 +00:00
Alexey Shekhirin
25f0d896d9 chore(trie): do not create a parent span for proof worker handle (#19281) 2025-10-24 15:57:51 +00:00
AJStonewee
f177103937 fix(trie): correct comment in sparse_trie_reveal_node_1 test (#19193) 2025-10-24 15:13:12 +00:00
Alexey Shekhirin
dc781126c2 feat(trie): proof task tracing improvements (#19276) 2025-10-24 14:04:01 +00:00
Jennifer
a69bbb3d7b fix: hive tests consume test suite (#19240)
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
2025-10-24 13:50:53 +00:00
YK
f29f4caf0e perf: Eliminate spawn_blocking in multiproof manager (#19203) 2025-10-24 11:56:57 +00:00
Galoretka
b88b46ac1f fix(optimism): guard follow-up inserts by payload_id to prevent mixed sequences (#19264) 2025-10-24 11:48:29 +00:00
0xeabz
a767fe3b14 feat: allow using SafeNoSync for MDBX (#18945)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-24 11:25:14 +00:00
Dan Cline
4a24cb3b49 fix(engine): re-insert storage cache and use arc (#18879) 2025-10-24 09:32:55 +00:00
josé v
ddcfc8a440 chore: add add_or_replace_if_module_configured method (#19266) 2025-10-24 09:31:22 +00:00
strmfos
51fbd5a519 fix: no_std compatibility in reth-optimism-chainspec (#19271) 2025-10-24 08:36:30 +00:00
Yash
08fc0a918d feat: eth_fillTransaction (#19199)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
Co-authored-by: jxom <7336481+jxom@users.noreply.github.com>
2025-10-24 08:16:21 +00:00
radik878
189b00b1e6 chore(net): remove unnecessary TODO (#19268) 2025-10-23 20:03:16 +00:00
joshieDo
5a9c7703d1 chore: rm StaticFileReceipts pruner (#19265) 2025-10-23 18:44:06 +00:00
joshieDo
3883df3e6c chore: remove db pruning of header/txs segments (#19260) 2025-10-23 17:20:55 +00:00
Arsenii Kulikov
4adfa286f7 fix: return hashed peer key as id (#19245) 2025-10-23 16:17:26 +00:00
Léa Narzis
6739914ce7 feat(otlp-tracing): enable to export traces with grpc export with tracing-otlp and tracing-otlp-protocol arg (#18985) 2025-10-23 14:44:24 +00:00
Dan Cline
7b7f563987 fix(engine): shrink tries after clearing (#19159) 2025-10-23 14:38:32 +00:00
Alexey Shekhirin
81b1949c3c fix(cli): prune CLI argument names (#19215) 2025-10-23 16:06:04 +02:00
Ragnar
f3b9349d6f docs: add usage examples and documentation to NoopConsensus (#19194) 2025-10-23 13:34:51 +00:00
Alexey Shekhirin
3d3a05386a refactor(static-file): remove unused segments (#19209) 2025-10-23 13:31:15 +00:00
Fallengirl
75931f8772 chore: align env filter comment with configured directives (#19237) 2025-10-23 13:13:03 +00:00
Matthias Seitz
c54719145b fix: use known paris activation blocks in genesis parsing (#19258) 2025-10-23 12:43:56 +00:00
Roman Hodulák
71f91cf4eb feat(prune): Add an empty reth-prune-db crate (#19232) 2025-10-23 11:43:24 +00:00
Matthias Seitz
ce876a96ad fix: use network id in p2p command (#19252) 2025-10-23 13:39:12 +02:00
Fallengirl
b2236d1db7 docs: correct Payment tx type from 0x7E to 0x2A (#19255) 2025-10-23 13:20:59 +02:00
YK
4548209e7b perf: rm pending queue from MultiproofManager (#19178) 2025-10-23 07:19:21 +00:00
Alexey Shekhirin
f8845c6fbb fix(engine): payload processor tracing event targets (#19223) 2025-10-23 04:36:16 +00:00
theo
bcef01ce47 feat(jovian): track da footprint block limit. Update basefee calculation (#19048)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-10-22 23:28:23 +00:00
Matthias Seitz
346ef408a4 chore: swap order for canon stream (#19242) 2025-10-22 20:38:53 +00:00
radik878
4f6cc7a359 fix(node): remove unused ConsensusLayerHealthEvent variants (#19238) 2025-10-22 18:20:25 +00:00
Dan Cline
1972ec0949 revert: "fix(engine): flatten storage cache (#18880)" (#19235) 2025-10-22 16:33:54 +00:00
Federico Gimenez
8119045258 chore(e2e): relax bounds (#19231) 2025-10-22 16:29:55 +00:00
Alexey Shekhirin
fa2f173aac chore(storage): remove UnifiedStorageWriterError (#19210) 2025-10-22 16:10:33 +00:00
Jennifer
bab9dee555 fix: rename consume-* test suite (#19230) 2025-10-22 15:16:29 +00:00
Roman Hodulák
df0da36bc4 test(hive): Ignore new failures that are won't fix (#19218) 2025-10-22 15:04:08 +00:00
Matthias Seitz
f438a6cc83 chore: add elapsed info log (#19211) 2025-10-22 15:02:37 +00:00
wizard
b9f6068f59 fix: incorrect RPC namespace reference (#19225) 2025-10-22 14:04:10 +00:00
Matthias Seitz
778146cb01 chore: use retrylayer for benchmarkcontext (#19227) 2025-10-22 13:36:49 +00:00
Brian Picciano
47dc43287f fix(reth-bench): Lower block channel capacity and make it configurable (#19226) 2025-10-22 13:27:03 +00:00
Brian Picciano
712569d4ce feat: warning log when blocked on execution cache (#19222) 2025-10-22 13:04:16 +00:00
Brian Picciano
35b28ea543 fix: OverlayStateProviderFactory: validating trie changeset range and revert target (#19207) 2025-10-22 12:30:26 +00:00
greg
7a98145def fix: captured impl trait lifetime (#19216)
Signed-off-by: Gregory Edison <gregory.edison1993@gmail.com>
2025-10-22 11:58:01 +00:00
Matthias Seitz
56d8cea939 chore: only alloc required capacity (#19217) 2025-10-22 11:40:56 +00:00
Matthias Seitz
bb620736b9 perf: check prewarm termination multiple times (#19214) 2025-10-22 11:29:00 +00:00
Arsenii Kulikov
0ea75f5edf fix: small features fix (#19212) 2025-10-22 11:21:59 +00:00
Alexey Shekhirin
b5df3f31b2 refactor(prune): remove receipts log filter segment (#19184) 2025-10-22 10:22:11 +00:00
robinsdan
4d3c163120 perf(net): convert Bytes to BytesMut to avoid reallocation (#19204) 2025-10-22 08:46:26 +00:00
Alexey Shekhirin
ada053aa67 chore: remove rkrasiuk from codeowners (#19206) 2025-10-22 10:10:47 +02:00
YK
60e3eded5e refactor: decouple max proof task concurrency from inflight proof limits (#19171) 2025-10-22 06:53:55 +00:00
Dan Cline
e810df943b feat(engine): improve payload validator tracing spans 2 (#19155) 2025-10-21 22:14:16 +00:00
Avory
c6af584b00 docs: improve SealedBlockRecoveryError documentation (#19120) 2025-10-21 19:19:56 +00:00
Merkel Tranjes
1d58ae1ff8 feat: improve oversized data error message (#19190) 2025-10-21 19:15:13 +00:00
Dmitry
ba6d593aa0 chore: fix misleading log message for body size check (#19173) 2025-10-21 19:13:25 +00:00
Alex Pikme
876346d143 fix: add arrayvec to dev-dependencies in reth-trie-common (#19192) 2025-10-21 19:12:57 +00:00
Matthias Seitz
21785a30e8 test: add node record parse test (#19172) 2025-10-21 21:20:09 +02:00
Matthias Seitz
2c086f0ed3 chore: rm generic array dep from discv4 (#19140) 2025-10-21 21:18:45 +02:00
0xsensei
563ae0d30b fix: drop support for total difficulty table (#16660)
Co-authored-by: Aditya Pandey <adityapandey@Adityas-MacBook-Air.local>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: joshieDo <93316087+joshieDo@users.noreply.github.com>
2025-10-21 16:55:08 +00:00
maradini77
645672916a fix: remove unnecessary trait bounds in extend_sorted_vec helper (#19154) 2025-10-21 15:53:08 +00:00
Federico Gimenez
01820fdaf7 feat(e2e): add builder API for configuring test node setups (#19146) 2025-10-21 13:04:19 +00:00
Brawn
93b63bc765 chore: fix incorrect hex value in comment (0x2A instead of 0x7E) (#19181) 2025-10-21 12:45:37 +00:00
David Klank
dbceffdcf4 refactor(ipc): simplify RpcServiceCfg from enum to struct (#19180) 2025-10-21 12:37:58 +00:00
Arsenii Kulikov
936baf1232 refactor: remove FullNodePrimitives (#19176) 2025-10-21 12:05:38 +00:00
Alexey Shekhirin
7263a7b4eb fix(cli): prune config saving to file (#19174) 2025-10-21 11:59:11 +00:00
joshieDo
e21048314c chore: remove total difficulty from HeaderProvider (#19151) 2025-10-21 10:56:36 +00:00
MozirDmitriy
f0c0b3db4e feat(storage): replace unreachable todo!() with explicit unreachable!() in compact derive (#19152) 2025-10-21 10:21:36 +00:00
Alex Pikme
792b82d895 perf: fix redundant Arc clone in file_client tests (#19170) 2025-10-21 10:48:46 +02:00
Dan Cline
49bbcdc38c chore: rm high frequency otel-related debug logs (#19147) 2025-10-20 17:09:57 +00:00
Brian Picciano
915b627f4f fix: Revert "feat(engine): improve payload validator tracing spans (#18960)" (#19145) 2025-10-20 16:06:23 +00:00
malik
e198a38d62 perf: batch byte for serialization (#19096)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-20 15:04:31 +00:00
0xMushow
be2306da31 chore(config): clean up gas limit code (#19144) 2025-10-20 14:41:10 +00:00
Skylar Ray
90e0d37367 fix: remove tautological assertions in validator tests (#19134) 2025-10-20 14:19:55 +00:00
Brian Picciano
6ee53922d0 fix(prune): Disable pruning limits (#19141) 2025-10-20 14:05:16 +00:00
Arsenii Kulikov
20f807778d Revert "refactor: unify Pipeline creation codepaths" (#19143) 2025-10-20 13:15:10 +00:00
Brian Picciano
ca19c19b38 chore: fix+update nix flake (#19142) 2025-10-20 13:04:05 +00:00
Brian Picciano
8eb5461dad chore(trie): Add lifetime to cursors returned from Trie/HashedCursorFactorys (#19114) 2025-10-20 12:18:24 +00:00
Andrew Huang
79c11ff567 fix: Add support for init-state for op-reth chains that are not op-mainnet… (#19116)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-20 14:06:15 +02:00
Arsenii Kulikov
c5a52c7d44 fix(e2e): gracefully wait for payload (#19137) 2025-10-20 10:50:51 +00:00
Matthias Seitz
11c449feb0 feat: add helper apply fns (#19122) 2025-10-20 09:29:09 +00:00
leopardracer
e185025447 fix: Remove duplicate debug log in write_blocks_to_rlp (#19132) 2025-10-20 10:57:03 +02:00
github-actions[bot]
2f9281b6c1 chore(deps): weekly cargo update (#19126)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-19 18:44:55 +02:00
Micke
67bf37babd chore: remove redundant collect in debug trace (#19121) 2025-10-18 17:17:43 +02:00
GarmashAlex
10ed1844e4 fix(net): correct error messages for decrypt and header paths (#19039) 2025-10-18 17:11:15 +02:00
Matthias Seitz
a718752bf5 chore: fix clippy (#19118) 2025-10-18 11:22:02 +02:00
Dmitry
a8ef47d14c docs: fix wrong label for --color=auto (#19110)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-18 11:21:10 +02:00
Ignacio Hagopian
46228d0a18 feat(stateless): make UncompressedPublicKey serializable (#19115)
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
2025-10-18 10:41:56 +02:00
GarmashAlex
8d91b9e443 feat(cli): Reuse a single StaticFileProducer across file import chunks (#18964)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-18 10:34:29 +02:00
Dan Cline
63f560705c feat: add capacity metrics for tries (#19117) 2025-10-18 09:56:56 +02:00
Alexey Shekhirin
4a32bc0fe5 feat(engine): improve payload validator tracing spans (#18960)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-10-17 21:20:12 +00:00
Arsenii Kulikov
a5618f57a8 feat: convert pooled blobs transition (#19095) 2025-10-17 17:34:38 +00:00
leopardracer
6a918f4cab fix: Deduplicate hashed storage preparation in MemoryOverlayStateProvider (#19087) 2025-10-17 15:48:22 +00:00
YK
d1f6637a5a refactor: naming fix for multiproof dispatch (#19102) 2025-10-17 15:46:17 +00:00
Dharm Singh
1b830e9ed1 feat: derive dev accounts from mnemonic in dev mode (#18299)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-10-17 15:19:21 +00:00
Matthias Seitz
928d91dbf9 chore: add comment section for claude (#19108) 2025-10-17 14:45:24 +00:00
crazykissshout
1634535e00 fix: add bundle and transaction context to call_many errors (#18127)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-17 14:40:26 +00:00
Arsenii Kulikov
ca26219aa6 feat: convert blobs at RPC (#19084) 2025-10-17 11:45:23 +00:00
sashass1315
cfb26912d3 fix(cli): remove redundant EthChainSpec bound in run_with_components (#19106) 2025-10-17 10:59:49 +00:00
maradini77
e46a9bc40c fix(sim): clamp bundle timeout to max instead of falling back to default (#18840)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-17 10:47:14 +00:00
futreall
4c7b1ed9d4 fix: add revm-state to dev-dependencies of chain-state crate (#19044) 2025-10-17 10:11:11 +00:00
Dan Cline
ff68bfe935 chore: lower ecies instrument calls to trace (#19004) 2025-10-17 10:05:18 +00:00
Matthias Seitz
a2c50947b8 chore: exhaustive match for builtin tracer (#19105) 2025-10-17 09:42:18 +00:00
Léa Narzis
3af2c93fc6 feat(cli): add method CliRunner::block_on (#19088) 2025-10-17 09:24:19 +00:00
Roman Hodulák
73af300286 fix(cli): Remove duplicit static file header and transaction append (#19103) 2025-10-17 08:45:00 +00:00
Matthias Seitz
a8e387bd10 chore: init state touchups (#19066) 2025-10-16 21:07:40 +00:00
stevencartavia
48d8298e1f feat: add Pool::remove_transaction(hash) (#19098) 2025-10-16 21:02:26 +00:00
Avory
53ef7a386c docs: fix duplicate method comments in ChainInfoTracker (#18929) 2025-10-16 20:53:36 +00:00
AJStonewee
25e8d6bb77 chore: clarify the wrong Length description (#19094) 2025-10-16 20:06:08 +00:00
Matthias Seitz
cc490b668a fix: accurately track account and code weighs (#19091) 2025-10-16 15:44:08 +00:00
Matthias Seitz
5887a15966 revert: "fix: Revert "chore: disable fee charge in env"" (#19073) 2025-10-16 14:30:36 +00:00
Matthias Seitz
ff2236e5b4 fix: support rlp hex in read_header_from_file (#19089) 2025-10-16 14:25:56 +00:00
MozirDmitriy
8788782f25 fix(net): remove redundant remove of evicted hash in fetcher (#19083) 2025-10-16 12:40:12 +00:00
Karl Yu
7e006d6845 chore: remove unused rayon pool from WorkloadExecutor (#19065)
Co-authored-by: sashass1315 <sashass1315@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-16 12:06:05 +00:00
Alexey Shekhirin
e969262c7e refactor: rename disable_caching_and_prewarming to disable_prewarming (#19072) 2025-10-16 10:58:42 +00:00
kevaundray
be648d950c feat: Stateless validation function receives public keys corresponding to each transaction (#17841)
Co-authored-by: Wolfgang Welz <welzwo@gmail.com>
2025-10-16 10:21:15 +00:00
Skylar Ray
5beeaedfae chore(fs-util): remove redundant tmp_path clone (#19003) 2025-10-16 10:10:11 +00:00
Mablr
386eaa3ff6 fix(discv5): get fork_id from Enr for all network stacks (#18988)
Co-authored-by: emhane <elsaemiliaevahane@gmail.com>
Co-authored-by: Emilia Hane <emiliaha95@gmail.com>
2025-10-16 09:56:27 +00:00
Brian Picciano
be94d0d393 feat(trie): Merge trie changesets changes into main (#19068)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-10-16 09:52:35 +00:00
GarmashAlex
3de82cf2bd fix(net): Increment out_of_order_requests in BodiesDownloader on range reset (#19063) 2025-10-16 08:58:05 +00:00
Alexey Shekhirin
84aa51481b chore: rename CLI argument --tracing-otlp-level to --tracing-otlp.filter (#19061)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-16 08:42:25 +00:00
YK
a84bef0832 refactor: revert Remove max_proof_task_concurrency as configurable variable" (#19062) 2025-10-16 07:28:04 +00:00
Copilot
926b1a43fe refactor: Remove max_proof_task_concurrency as configurable variable (#19009)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: yongkangc <46377366+yongkangc@users.noreply.github.com>
Co-authored-by: Yong Kang <chiayongkang@hotmail.com>
2025-10-15 23:52:27 +00:00
Matthias Seitz
a096709865 chore: defense for new SubscriptionKind item (#19054) 2025-10-15 21:28:29 +00:00
James Prestwich
65a7f35a56 feat: use env filter for otlp, respect otel env var (#19050) 2025-10-15 21:10:24 +00:00
drhgencer
5c19ce7580 refactor(txpool): reuse cached gas_limit value (#19052) 2025-10-15 20:19:03 +00:00
Arsenii Kulikov
f6a583ffc4 feat: stricter bound (#19049) 2025-10-15 20:15:47 +00:00
radik878
080d508ebf fix(session): remove Clone derive from SessionCounter (#19051) 2025-10-15 20:14:42 +00:00
Arsenii Kulikov
7779ed8c73 feat: bump revm (#18999) 2025-10-15 17:55:35 +00:00
sashass1315
fd4597e9bd chore(primitives-traits): relax SignerRecoverable bounds for Extended<B,T> (#19045) 2025-10-15 17:53:47 +00:00
Matthias Seitz
6bb0d1b929 chore: increase versioned hash index cache (#19038) 2025-10-15 17:52:03 +00:00
Arsenii Kulikov
20b14d59c7 fix: correct Compact impl for Option (#19042) 2025-10-15 16:08:26 +00:00
Matthias Seitz
8880119e17 fix: use header type generic for mask (#19037) 2025-10-15 14:27:44 +00:00
Federico Gimenez
daa91939f8 chore(ci): update expected failures (#19034) 2025-10-15 13:43:12 +00:00
YK
eb9b08c696 perf: background init of workers (#19012) 2025-10-15 13:16:54 +00:00
Galoretka
0cbd514e4b feat(engine): deprecate TestPipelineBuilder::with_executor_results (#19017) 2025-10-15 13:03:49 +00:00
Matthias Seitz
63ec808973 fix: respect cli blob size setting (#19024) 2025-10-15 14:52:43 +02:00
Matthias Seitz
1b952def26 fix: unused warnings for tracing (#19025) 2025-10-15 14:39:54 +02:00
Matthias Seitz
39ef9dd528 chore: bump alloy-core (#19026) 2025-10-15 14:39:06 +02:00
Luca Provini
fc03347cdd feat: add pending sequence as pub (#19022) 2025-10-15 14:02:26 +02:00
Skylar Ray
45194fc5df chore: remove unused Args struct from exex-subscription example (#19019) 2025-10-15 11:22:21 +00:00
Udoagwa Franklin
6b08d30e14 feat(devp2p): make eth p2p networkId configurable (#19020)
Co-authored-by: frankudoags <frankudoags.com>
2025-10-15 11:15:42 +00:00
Federico Gimenez
7fc3980904 chore(ci): bump hive eest to v5.3.0 (#19021) 2025-10-15 10:45:36 +00:00
josé v
731e107ee6 chore: refactor loop in add_new_transactions (#19006) 2025-10-15 09:42:11 +00:00
GarmashAlex
a1aed9d9f0 chore(privitives-traits): remove unused serde derives and camelCase attribute (#19014) 2025-10-15 09:41:02 +00:00
Ivan Wang
ee6cac72de feat: add metrics for safe and finalized block heights (#18987) 2025-10-15 09:07:42 +00:00
Matthias Seitz
2f82b7c771 chore: bump book timeout (#19016) 2025-10-15 11:06:34 +02:00
Jennifer
b6f7fae19a ci: Add tests for Paris scenario in hive.yml (#19013) 2025-10-15 08:49:51 +00:00
Brian Picciano
00f173307c fix: Set Era pipeline stage to last checkpoint when there is no target (#19000) 2025-10-15 08:15:34 +00:00
stevencartavia
06b33fd64b chore: replace poll_next_unpin loop with poll_recv_many (#18978) 2025-10-15 08:12:01 +00:00
Karl Yu
856ad08776 refactor(engine): simplify InvalidBlockWitnessHook::on_invalid_block for better testability (#18696) 2025-10-15 03:50:41 +00:00
Julian Meyer
092599bd2c fix: required optimism primitives features in db-api (#19005) 2025-10-15 03:38:21 +00:00
YK
11c9949add refactor(trie): remove proof task manager (#18934)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-15 01:49:39 +00:00
anim001k
082b5dad37 refactor(storage): fix ChainStateKey enum variant name (#18992) 2025-10-15 01:11:01 +00:00
YK
e0b7a86313 perf(tree): worker pooling for account proofs (#18901)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-15 00:26:02 +00:00
Dan Cline
169a1fb97b fix(engine): flatten storage cache (#18880) 2025-10-14 19:12:55 +00:00
Arsenii Kulikov
c661cd2f75 refactor: unify Pipeline creation codepaths (#18955) 2025-10-14 16:20:21 +00:00
Forostovec
7aebea2f37 chore(evm): mark ExecuteOutput as unused and slated for removal (#18754) 2025-10-14 14:18:33 +00:00
Forostovec
0470ee8735 fix(stateless): enforce BLOCKHASH ancestor header limit (#18920) 2025-10-14 14:05:47 +00:00
drhgencer
cec30cd9f3 chore: remove unused imports in blockchain_provider (#18867)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-14 16:06:06 +02:00
Alvarez
9fa2779959 fix(network): prevent metric leak in outgoing message queue on session teardown (#18847) 2025-10-14 13:33:45 +00:00
Léa Narzis
5065890823 chore: bump otlp crates (#18984) 2025-10-14 09:34:20 +00:00
stevencartavia
2a441d6261 refactor: convert satisfy_base_fee_ids to use closure (#18979) 2025-10-14 09:29:01 +00:00
MozirDmitriy
221d585f08 chore(optimism): remove unnecessary Debug bounds from header generics (#18989) 2025-10-14 08:54:55 +00:00
stevencartavia
ab2b11f40e feat: allow otlp level to be configurable (#18981) 2025-10-14 00:41:22 +00:00
Léa Narzis
59ace58925 feat(cli): enable traces export via tracing-otlp cli arg (#18242)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-10-13 20:28:16 +00:00
Alvarez
9b0a2c37b4 perf(tests): remove redundant format! in ef-tests run_only (#18909) 2025-10-13 18:27:03 +00:00
Federico Gimenez
2041188744 chore(ci): update eest 7594 issue link in hive expected failures file (#18976) 2025-10-13 18:03:43 +00:00
Forostovec
55d294dc7f chore(rpc): Remove redundant U256::from in suggested_priority_fee (#18969) 2025-10-13 17:22:07 +00:00
Alexey Shekhirin
0f919a949e ci: remove reproducible build from release.yml (#18958) 2025-10-13 16:51:32 +00:00
maradini77
1dfd0ff772 fix: use max B256 for upper bound in empty-storage check (#18962) 2025-10-13 15:25:01 +00:00
sashaodessa
211e330eb9 fix: remove noisy stderr prints in ERA1 cleanup (EraClient::delete_outside_range) (#18895) 2025-10-13 14:00:40 +00:00
sashaodessa
ea65aca0d7 fix: misleading error message in db list: show actual table name (#18896) 2025-10-13 13:48:42 +00:00
Brian Picciano
edc8261913 fix(trie): Properly upsert into StoragesTrie in repair-trie (#18941) 2025-10-13 13:29:50 +00:00
YK
691b14bfca perf(tree): add elapsed time to parallel state root completion log (#18959) 2025-10-13 12:53:12 +00:00
maradini77
6c27b35e19 refactor(cli): use structured logging (tracing) in p2p command (#18957) 2025-10-13 12:24:58 +00:00
maradini77
4415bc5d7a refactor: replace println! with structured logging in test_vectors (#18956) 2025-10-13 11:51:19 +00:00
Emilia Hane
0f14980d88 chore(rpc): Moves SequencerMetrics into reth-optimism-rpc (#18921) 2025-10-13 10:24:55 +00:00
radik878
16ba9e8979 fix(payload): correct Debug label for PayloadTimestamp in PayloadServiceCommand (#18954) 2025-10-13 12:19:28 +02:00
Brian Picciano
16e79888ae fix(testsuite): Fix unused updates in e2e-test-utils (#18953) 2025-10-13 09:36:17 +00:00
Tilak Madichetti
99a5da2f91 fix(example): launch with debug capabilities (#18947) 2025-10-11 10:50:52 +00:00
Tilak Madichetti
b1d6c90fbb fix(examples): change method to launch with debug capabilities (#18946) 2025-10-11 10:50:31 +00:00
emmmm
5c18df9889 refactor: remove needless collect() calls in trie tests (#18937) 2025-10-10 16:23:10 +00:00
MIHAO PARK
aec3e3dcc5 chore(grafana): use precompile address as legend (#18913) 2025-10-10 12:26:47 +00:00
YK
397a30defb perf(tree): worker pooling for storage in multiproof generation (#18887)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-10 07:58:15 +00:00
Léa Narzis
d2070f4de3 feat: wait for new blocks when build is in progress (#18831)
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
2025-10-09 16:42:59 +00:00
emmmm
6f96a32812 chore: align node_config threshold constant (#18914) 2025-10-09 11:18:49 +00:00
stevencartavia
df6afe9daa docs: duplicate comment in Eip4844PoolTransactionError (#18858) 2025-10-08 15:03:44 +00:00
Federico Gimenez
c78378a8ce ci: cache hive simulator images to reduce prepare-hive job time (#18899) 2025-10-08 14:53:25 +00:00
Merkel Tranjes
c0caaa17be refactor: replace collect().is_empty() with next().is_none() in tests (#18902)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-10-08 14:20:39 +00:00
Dan Cline
6770ba9eed feat(provider): add get_account_before_block to ChangesetReader (#18898) 2025-10-08 13:11:16 +00:00
William Nwoke
bed26238dc refactor(engine): separate concerns in on_forkchoice_updated for better maintainability (#18661)
Co-authored-by: Nathaniel Bajo <nathanielbajo@Nathaniels-MacBook-Pro.local>
Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-10-08 11:54:59 +00:00
radik878
1aa312c12b chore(node): simplify EngineApiExt bounds by removing redundant constraints (#18905) 2025-10-08 11:46:20 +00:00
Brian Picciano
273ee08443 fix(trie): Reveal extension child when extension is last remaining child of a branch (#18891) 2025-10-08 11:05:27 +00:00
Léa Narzis
b82ad07775 chore: make clippy happy (#18900) 2025-10-08 10:18:49 +00:00
Arsenii Kulikov
319a8dceb4 chore: relax ChainSpec impls (#18894) 2025-10-07 17:54:25 +00:00
Skylar Ray
029509cc42 refactor: eliminate redundant allocation in precompile cache example (#18886) 2025-10-07 11:34:35 +00:00
Forostovec
2f3e2c6c97 fix(era-utils): fix off-by-one for Excluded end bound in process_iter (#18731)
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
2025-10-07 11:23:54 +00:00
josé v
83cec3793b docs: yellowpaper sections in consensus implementation (#18881) 2025-10-06 21:33:12 +00:00
Alexey Shekhirin
e9598ba5ac feat(storage): read headers and transactions only from static files (#18788) 2025-10-06 11:39:48 +00:00
sprites0
d77bfd89b4 feat: Use generic HeaderTy for reth db get static-file headers (#18870)
Co-authored-by: sprites0 <199826320+sprites0@users.noreply.github.com>
2025-10-06 10:15:52 +00:00
Skylar Ray
f54741c52b fix: streamline payload conversion in custom engine API (#18864) 2025-10-06 10:06:12 +00:00
Dan Cline
978b8a2cd3 docs(engine): fix outdated comment on TreeMetrics (#18855) 2025-10-06 09:10:51 +00:00
Federico Gimenez
b550387602 chore: update hive expected/ignored failures (#18863) 2025-10-05 11:55:28 +00:00
Arsenii Kulikov
78535b0747 feat: make ChainSpec generic over header (#18856) 2025-10-03 17:18:57 +00:00
Artyom Bakhtin
fe10c07852 feat: Add building and publishing of *.deb packages (#18615)
Signed-off-by: bakhtin <a@bakhtin.net>
2025-10-03 15:36:56 +00:00
Brian Picciano
d276ce5758 feat: OverlayStateProvider (#18822)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-03 14:21:27 +00:00
GarmashAlex
373576704b chore(cli): remove unnecessary ProviderFactory clone in db_ro_exec! (#18845) 2025-10-03 12:37:17 +00:00
MozirDmitriy
5c05beb404 chore: relax trait bounds for EmptyBodyStorage in storage API (#18842) 2025-10-03 12:36:44 +00:00
Arsenii Kulikov
871bc82eee chore: do not generate fuzz tests in Compact macro (#18849) 2025-10-03 11:58:44 +00:00
Hai | RISE
8effbf265b perf(multiproof): cache storage proof root of missed leaves (#18750) 2025-10-03 10:57:31 +00:00
Federico Gimenez
fafe44d386 feat(rpc): support custom transaction error types in EthApiError (#18844) 2025-10-02 18:55:21 +00:00
DaniPopes
73f50ee9a1 ci: cache zepter installation (#18843) 2025-10-02 18:46:27 +00:00
futreall
656c00e3d6 perf: optimize account cache updates to reduce duplicate lookups (#18825) 2025-10-02 12:34:44 +00:00
Matthias Seitz
1d1fea72b6 docs: apply spelling and grammar fixes (#18836)
Co-authored-by: Jennifer Paffrath <jenpaff0@gmail.com>
Co-authored-by: Max <max@digi.net>
2025-10-02 11:22:43 +00:00
Mablr
467420ec25 feat(evm): Make ConfigureEngineEvm methods faillible (#18827) 2025-10-02 11:16:40 +00:00
Matthias Seitz
3a6ff3ba93 perf: avoid hash copies (#18834) 2025-10-02 11:15:10 +00:00
MozirDmitriy
9b005f36ce feat(flashblocks): relax Sync bounds on Sink and connect futures (#18830) 2025-10-02 10:10:31 +00:00
Arsenii Kulikov
2029842f77 feat: integrate EvmEnv helpers (#18817) 2025-10-02 10:10:30 +00:00
sashass1315
661400e857 fix(ress): avoid panic on Missing trie updates in ress provider witness construction (#18796) 2025-10-02 09:45:36 +00:00
Galoretka
33bf2b2acc chore(node): remove no-op impl for LaunchContextWith WithComponents (#18821) 2025-10-01 20:16:42 +00:00
Matthias Seitz
4f56de535f fix: track inemorysize more accurately (#18820) 2025-10-01 16:29:27 +00:00
nethoxa
f98e706072 fix: Add eth69 status validation (#18819)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-01 16:06:01 +00:00
Matthias Seitz
80b4d26b9d chore: use exact size for account weight (#18816) 2025-10-01 14:46:03 +00:00
Matthias Seitz
a18f1a2e38 chore: use correct inflight metric (#18815) 2025-10-01 13:41:12 +00:00
MIHAO PARK
a2bde852bb feat(node): reduce the status logging (#18010) 2025-10-01 09:56:31 +00:00
YK
83de2137f2 refactor(engine): simplify validate_block_with_state (#18659)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-01 08:22:42 +00:00
Julio
5004c2e1a3 feat(op-reth): add optional state root calc for flashblocks (#18721)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-10-01 07:57:38 +00:00
Karl Yu
7af393bb35 chore: update ETHEREUM_BLOCK_GAS_LIMIT (#18779) 2025-10-01 07:14:39 +00:00
Skylar Ray
f813a52c80 feat: impl Debug for FnLauncher (#18807) 2025-10-01 07:09:06 +00:00
futreall
bafb482ca1 fix: poll the pinger timeout Sleep future (#18797) 2025-10-01 07:07:57 +00:00
Federico Gimenez
22f9708f6a fix(storage): clean up HeaderNumbers entries during block unwinds (#18790) 2025-09-30 16:41:36 +00:00
viktorking7
0694abcee8 fix: Prevent u64 timestamp wrap-around in LocalMiner (#18791) 2025-09-30 15:29:14 +00:00
Matthias Seitz
530e62d0e9 chore: bump alloy 1.0.37 (#18795) 2025-09-30 16:27:04 +02:00
Tim
05d17bfe04 chore: bump version to 1.8.2 (#18792)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-30 16:02:45 +02:00
Matthias Seitz
a53c6205cc fix: remove cancun check (#18787) 2025-09-30 12:07:07 +00:00
GarmashAlex
2d4635b53d fix: remove the leading hash comparison from RecoveredBlock<B>::PartialEq. (#18785) 2025-09-30 11:54:32 +00:00
Federico Gimenez
db524d158e fix(op-reth): forward pre-bedrock transaction RPC calls to historical endpoint (#18784) 2025-09-30 10:09:46 +00:00
Ignacio Hagopian
7e5e8b55b3 feat(stateless): enable test runs to return execution witness (#18740)
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
Co-authored-by: Kevaundray Wedderburn <kevtheappdev@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-30 08:44:02 +00:00
Yichi Zhang
0da9fabf87 fix(transaction-pool): Fix wrong assertion (#18778) 2025-09-30 08:14:43 +00:00
Andrea Simeoni
2cbdb42c2c feat(op-reth): custom FlashBlock decoder from bytes (#18770) 2025-09-30 08:13:01 +00:00
dustinjake
b3cbfa4ced feat(flashblocks): additional pending flashblock data (#18776) 2025-09-30 08:08:39 +00:00
YK
b8c16e392a refactor(engine): small nits - remove shallow abstraction for decoded_storage_proof (#18780) 2025-09-30 07:57:11 +00:00
futreall
2cf9fc8f54 refactor: remove redundant Setup::new() method (#18781) 2025-09-30 07:56:19 +00:00
Ragnar
121c0dedf8 feat(eth-wire): implement disconnect on Status message after handshake (#18773) 2025-09-29 19:35:49 +00:00
Alexey Shekhirin
058ffdc21e feat(storage): write headers and transactions only to static files (#18681) 2025-09-29 17:04:59 +00:00
James Niken
564e3a67fc fix: correct TxTypeCustom extended identifier decoding (#18769) 2025-09-29 14:38:37 +00:00
Merkel Tranjes
b940d0a9fb fix: prevent integer underflow in pipeline unwind target calculation (#18743) 2025-09-29 11:54:28 +00:00
sashass1315
18775914a4 fix(primitives-traits): use size_of::<H>() for ommers capacity in BlockBody (#18764) 2025-09-29 09:49:30 +00:00
YK
ec4e6aafde perf: optimize Optimism deposit transaction prewarming (#18327) 2025-09-29 09:06:17 +00:00
radik878
48b725aec2 chore(engine): remove unnecessary ChainSpecProvider bound from invalid block witness hook (#18760) 2025-09-28 16:30:28 +00:00
github-actions[bot]
c98833ba14 chore(deps): weekly cargo update (#18757)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-28 13:33:13 +02:00
Matthias Seitz
850083dbde chore: remove doc_auto_cfg feature (#18758) 2025-09-28 12:53:45 +02:00
nethoxa
abae566f13 fix(rpc): fix eth_config impl (#18744)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-28 12:42:08 +02:00
Marcin Papież
efbff54ea6 docs: add note to launch on --dev mode (#18745) 2025-09-28 12:41:45 +02:00
Adrian
be326fe047 test: add missing Drop trait tests for CancelOnDrop (#18749) 2025-09-28 12:38:37 +02:00
MIHAO PARK
722507ed41 docs(ethereum): extend run with debug.rpc-consensus-url (#18747) 2025-09-27 07:14:59 +00:00
stevencartavia
1addf61a23 feat: keep track of most recently emitted range update and change int… (#18722) 2025-09-26 16:02:38 +00:00
VolodymyrBg
95e8a65d33 chore(trie): demote verbose proof debug logs to TRACE (#18738) 2025-09-26 15:08:31 +00:00
Galoretka
c9fea939a1 fix(chain-state): remove redundant transaction clone in test utils (#18710)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-26 14:20:34 +00:00
MIHAO PARK
74c4cdbf09 fix(rpc-engine): don't fetch the pruned block (#18589) 2025-09-26 14:17:10 +00:00
MIHAO PARK
0299160e93 feat(rpc): merge the header not found and resource not found (#18657) 2025-09-26 14:09:23 +00:00
Mablr
6a50aa3ea5 feat: make more EVM and RPC conversions fallible (#18685) 2025-09-26 13:56:46 +00:00
Alexey Shekhirin
057c71281f feat(cli): configure multiproof chunking via arguments (#18736) 2025-09-26 13:00:16 +00:00
Waiting
5dc2857713 feat(downloaders): add file-client feature gate (#18707) 2025-09-26 12:59:08 +00:00
Delweng
597fa73023 fix(rpc/engine): check osaka in getBlobsV1 (#18669)
Signed-off-by: Delweng <delweng@gmail.com>
2025-09-26 15:14:09 +02:00
anim001k
8852269a7d fix: Apply WS CORS regardless of HTTP being enabled (#18729) 2025-09-26 11:53:52 +00:00
Brian Picciano
ff4cc6e3ba chore: Accept range in HashedPostState::from_reverts (#18728) 2025-09-26 11:29:37 +00:00
Hai | RISE
8d44bebf8d perf(multiproof): do not chunk more tasks when task queue is full (#18727) 2025-09-26 11:15:02 +00:00
Matthias Seitz
4b134c3a46 fix: increase backoff timeout (#18733) 2025-09-26 11:04:40 +00:00
viktorking7
aa192c255b fix: Bearer token parsing vulnerability (#18712) 2025-09-25 20:08:00 +00:00
Matthias Seitz
b6cf855738 docs: add note about v5 (#18701) 2025-09-25 19:03:53 +00:00
drhgencer
284d1b377f perf: avoid redundant bytecode hash calculation in RPC provider (#18711) 2025-09-25 18:24:45 +00:00
0xKitsune
0e4e32fb16 chore: update spawn maintenance tasks vis (#18709) 2025-09-25 16:55:08 +00:00
YK
8f881789b7 perf(engine): reduce cloning on terminate caching (#18693) 2025-09-25 14:58:25 +00:00
YK
a047a055ab chore: bump rust to edition 2024 (#18692) 2025-09-25 12:18:51 +00:00
Galoretka
9a26947db6 fix(primitives-traits): delegate is_create for Extended::Other to fix create-detection (#18699) 2025-09-25 10:34:32 +00:00
dustinjake
0f46e38a7d chore(flashblocks): flasblock service metrics (#18697) 2025-09-25 10:13:20 +00:00
sw4sy
a31dce9b3c feat(net): added check for non zero latest_hash in BlockRangeUpdate (#18695)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-25 08:11:43 +00:00
josé v
6cdfc48bc8 feat(flashblocks): prefill cache on canonical tip updates (#18691) 2025-09-25 07:55:01 +00:00
Forostovec
4d609847bf fix(engine): remove redundant parent_to_child removal during eviction (#18648) 2025-09-25 06:53:49 +00:00
Haotian
8f804d385d feat: node import support importing gzip compressed file (#17877)
Signed-off-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-24 21:08:54 +00:00
MIHAO PARK
bdc59799d0 fix(cli): replace unwrap with error propagation in merkle stage (#18656) 2025-09-24 20:35:10 +00:00
GarmashAlex
3b0d98f346 fix(engine): align sparse trie removal log target with engine::root::sparse (#18686) 2025-09-24 17:48:54 +00:00
radik878
8e488a730a chore(engine): remove unused EngineServiceError from engine service (#18666)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-24 14:35:27 +00:00
Arsenii Kulikov
468925fcaa feat: support empty SUPPORTED_CHAINS for ChainSpecParser (#18679) 2025-09-24 14:27:07 +00:00
Matthias Seitz
00e51575eb test: add unwind parse test (#18677) 2025-09-24 15:51:50 +02:00
morito
e6050e0332 docs: some fixes on discv4 docs (#18601)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-24 12:41:34 +00:00
phrwlk
6631fc4e82 feat(net): correct per-response size metric to avoid capacity/empty-block inflation (#18553) 2025-09-24 12:21:51 +00:00
Joly
27c0b7b8a0 chore: enable all Ethereum protocol versions instead of hardcoding (#18065)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-24 12:19:54 +00:00
Andrea Simeoni
324cce3461 feat(bootnode): Persists the discovery secret key (#18643) 2025-09-24 12:14:59 +00:00
Arsenii Kulikov
7fb24e57a8 refactor: simplify EthApiSpeс trait (#18674) 2025-09-24 14:13:49 +02:00
Hai | RISE
1a68d8e968 feat(db): add MDBX put-append for fast ordered puts (#18603) 2025-09-24 11:48:50 +00:00
Starkey
f07d9248b9 fix: avoid panic in new-payload-fcu benchmark (#18602) 2025-09-24 11:37:14 +00:00
YK
a80f0c83a3 chore(revert): add tokio runtime with custom thread naming (#18670) 2025-09-24 10:52:51 +00:00
Tim
70fdd2248e chore: update voc.config.to text to v1.8.1 (#18667) 2025-09-24 09:51:09 +00:00
crazykissshout
aeaa8ec5a2 docs(db): correct misleading test comments in post_state.rs (#18664)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-09-24 09:03:07 +00:00
Gengar
f364f7a813 docs: add comprehensive e2e test actions reference documentation (#18621)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-09-24 03:27:02 +00:00
Arsenii Kulikov
96c1566d9b chore: support custom transaction types in EthTransactionValidator (#18655) 2025-09-23 22:23:09 +00:00
Alvarez
4779fea9d4 docs: rm 8MB stack size comment in BlockingTaskPool (#18616) 2025-09-23 21:43:07 +00:00
GarmashAlex
5856c2e9f0 fix(payload): reversed-order test for validate_execution_requests (#18593)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-23 20:34:18 +00:00
Alvarez
8eaadf52d8 fix: Prevent potential underflow in static file header healing (#18628) 2025-09-23 20:32:46 +00:00
crazykissshout
a7632c7431 fix(engine): correct misleading test comments in cached_state.rs (#18652) 2025-09-23 20:12:26 +00:00
Federico Gimenez
4cc50f9799 feat(e2e): add beacon consensus handle to NodeClient (#18632) 2025-09-23 17:45:09 +00:00
YK
064694b2df refactor(engine): simplify on_new_payload (#18613) 2025-09-23 16:04:19 +00:00
Matthias Seitz
e6608be51e chore: release 1.8.1 (#18646) 2025-09-23 17:41:38 +02:00
Matthias Seitz
44aa0fbb0e fix: Revert "chore: disable fee charge in env" (#18645) 2025-09-23 17:40:40 +02:00
dependabot[bot]
6fdf6c4492 chore(deps): bump CodSpeedHQ/action from 3 to 4 (#18333)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-23 14:07:44 +00:00
Tim
e613ee9e85 chore: update voc.config.to text to v1.8.0 (#18644) 2025-09-23 14:07:29 +00:00
Tim
132f5b5204 chore: update version to 1.8.0 in Cargo.toml (#18638)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-23 13:48:38 +00:00
Matthias Seitz
faaebe7f6d fix: check request gas limit before (#18639) 2025-09-23 12:21:59 +00:00
YK
088a0d44c2 chore(observability): add tokio runtime with custom thread naming (#18635)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-09-23 12:05:35 +00:00
Tim
4c9942b920 docs: update dashboard table and rpc urls (#18637) 2025-09-23 12:01:19 +00:00
Matthias Seitz
70a8c06773 feat: add osaka+bpo timestamps (#18627)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-09-23 11:06:52 +00:00
Matthias Seitz
ee834fb892 chore: disable fee charge in env (#18634) 2025-09-23 13:01:20 +02:00
Matthias Seitz
f225751c12 chore: bump inspectors 0.30 (#18633) 2025-09-23 13:01:08 +02:00
YK
7dc3aea930 chore(revert): revert tokio runtime with custom thread naming (#18631) 2025-09-23 10:20:44 +00:00
Matthias Seitz
87c75b9836 chore: bump deps (#18630) 2025-09-23 10:03:07 +00:00
YK
2ec3671633 chore(observability): add tokio runtime with custom thread naming (#18623) 2025-09-23 09:04:54 +00:00
MozirDmitriy
b27a927413 chore(primitive-traits): remove redundant auto-trait bounds from FullNodePrimitives (#18626)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-23 09:03:12 +00:00
Dmitry
e3cc6e2ea5 docs: fix incorrect RPC method names in trace calls (#18619) 2025-09-23 07:56:11 +00:00
Andrea Simeoni
dfab5f9646 fix(cli): bootnode default address (#18617) 2025-09-22 20:19:40 +00:00
Galoretka
87078e9205 fix(primitives-traits): simplify Rayon bounds and fix docs (#18620) 2025-09-22 19:48:10 +00:00
josé v
9e3246e695 chore: specialize send_raw_transaction_sync for op-reth with flashblocks support (#18586)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-22 13:43:57 +00:00
VolodymyrBg
60658be734 fix(handshake): validate peer TD from their_status_message during eth handshake (#18611) 2025-09-22 13:33:55 +02:00
Matthias Seitz
0bd2097995 chore: enforce max tx gas limit on estimate and accesslit (#18612) 2025-09-22 13:04:26 +02:00
Matthias Seitz
39d5563ce8 fix: disable block gas limit (#18583) 2025-09-22 10:07:03 +00:00
Brian Picciano
79c71b8692 chore: Remove reth recover storage-tries sub-command (#18580) 2025-09-22 10:04:40 +00:00
emmmm
9806e07cf8 fix: replace tx_hash method with TxHashRef trait bound (#18357) (#18362)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-22 09:31:17 +00:00
Matthias Seitz
3ebfd7a25e test: add test case for op tx env conversion (#18581) 2025-09-22 11:39:28 +02:00
YK
36107c60ab fix(cache): Ensure execution cache remains locked until updated (#18564)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-09-22 11:38:02 +02:00
YK
95f1931c59 test(engine): add new payload handling tests for canonical insertion and invalid ancestors (#18608) 2025-09-22 08:38:53 +00:00
crStiv
4ddf3ddb45 docs: multiple small textual defects (#18598) 2025-09-21 08:36:24 +00:00
github-actions[bot]
aeb6eddba0 chore(deps): weekly cargo update (#18600)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-21 07:37:18 +00:00
Federico Gimenez
ff59089094 chore(ci): unpin teku image for kurtosis-op (#18595) 2025-09-20 13:59:01 +00:00
Federico Gimenez
aead6c17c5 chore(ci): update expected and ignored hive tests (#18594) 2025-09-20 13:58:41 +00:00
Hai | RISE
55cbefe836 perf(persistence): lookup segment operation once (#18588) 2025-09-20 07:22:31 +00:00
William Nwoke
3655dc7f09 feat(rpc): make send_raw_transaction_sync timeout configurable (#18558)
Co-authored-by: Nathaniel Bajo <nathanielbajo@Nathaniels-MacBook-Pro.local>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-20 05:50:56 +00:00
Matthias Seitz
379db45b40 fix: use timestamp derived max blob count on launch (#18590) 2025-09-20 05:41:56 +00:00
VolodymyrBg
fa531761c4 chore(payload-builder): relax Sync bounds on resolve futures (#18585) 2025-09-19 20:22:53 +00:00
Brian Picciano
ff51faaeac chore(db): Simplifications to trie-related storage-api methods (#18579) 2025-09-19 15:41:32 +00:00
YK
8f4cc90ef9 chore: clippy manual_string_new warning in version.rs (#18576) 2025-09-19 15:03:20 +00:00
Brian Picciano
ebe1a8b014 chore(trie): Use Vec<Option<...>> in InMemoryTrieCursor (#18479) 2025-09-19 13:24:46 +00:00
Dharm Singh
d6160de610 fix(rpc): return empty log set for invalid filter block ranges (#18112)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-19 11:47:38 +00:00
YK
8aeebe10ff fix(txpool): prevent double-processing of tx pool tier (#18446)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-19 11:10:01 +00:00
Alexey Shekhirin
5bc507bfaf fix(reth-bench): do not panic on empty results (#18570) 2025-09-19 10:37:50 +00:00
かとり
4e1c552d3a fix(optimism): always enable interop maintenance task if activated (#18563) 2025-09-19 09:57:49 +00:00
0xOsiris
4fcc4457c1 chore(evm): add public constructor to BlockAssemblerInput (#18559) 2025-09-19 11:59:24 +02:00
Arsenii Kulikov
c9a95d085d feat: add Future AT to LaunchNode and allow customizing local attributes builder (#18556) 2025-09-19 09:34:49 +00:00
Matthias Seitz
4e78f956fd chore: map NaN to 0.0 (#18560) 2025-09-18 22:35:48 +00:00
MozirDmitriy
df9b7a079b chore(chainspec): reuse local hardforks in DEV instead of cloning again (#18557) 2025-09-18 17:38:38 +00:00
MIHAO PARK
e2aa41733c chore(docker): add FEATURES for op dockerfile (#18489) 2025-09-18 13:15:33 +00:00
Federico Gimenez
6f385d0a01 chore(consensus): update EIP-7825 error message format (#18549) 2025-09-18 13:10:21 +00:00
MIHAO PARK
f9e5030386 docs(op): decompress the state file before init-state (#18416) 2025-09-18 15:18:21 +02:00
stevencartavia
ce6199abf6 feat: tree config setting for unwinding canonical header (#18420) 2025-09-18 12:59:08 +00:00
MIHAO PARK
70d634a3f8 feat(rpc): add admin_clearTxpool api (#18539) 2025-09-18 12:58:20 +00:00
Federico Gimenez
ea500f6af9 chore(ci): bump hive timeout (#18544) 2025-09-18 12:52:18 +00:00
Roman Hodulák
e8d32a5491 feat(rpc): Add convert_receipt_with_block method to ReceiptConverter (#18542)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-18 11:06:52 +00:00
Matthias Seitz
ece847287a chore: add cache traces (#18538) 2025-09-18 09:21:44 +00:00
Copilot
64b4ae60f5 docs: document critical cache safety assumptions in ExecutionCache (#18536)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: yongkangc <46377366+yongkangc@users.noreply.github.com>
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-09-18 08:52:13 +00:00
Julio
59cff107bc feat(op-reth): initial setup FlashBlockConsensusClient engine sidecar (#18443) 2025-09-18 08:13:22 +00:00
Dharm Singh
870389c5d6 refactor: EmptyBodyStorage block reader logic (#18508)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-17 23:51:27 +00:00
MIHAO PARK
d357d2acb3 feat(node): rename debug.rpc-consensus-ws to debug-rpc-consensus-url to suport HTTP (#18027)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-17 23:10:55 +00:00
Mablr
2b68d3a424 fix(rpc): use flashblock when preparing tx response on gettxreceipt (#18530) 2025-09-17 20:39:37 +00:00
Federico Gimenez
6bf405a143 chore(ci): bump hive eest tests to v5.1.0 (#18528) 2025-09-17 19:15:17 +00:00
leniram159
4a958f41b8 fix: use noopprovider for pending block state root (#18523) 2025-09-17 17:24:38 +00:00
Roman Hodulák
6e6a497ef2 refactor(evm): Replace revm_spec* functions with alloy-evm and alloy-op-evm versions (#18526) 2025-09-17 16:46:21 +00:00
Roman Hodulák
5a39e57e47 deps: Upgrade alloy and alloy-evm versions 1.0.30 => 1.0.32 and 0.21.0 => 0.21.1 respectively (#18525) 2025-09-17 15:53:24 +00:00
crazykissshout
4b4b122e75 docs(engine): improve cache naming and documentation (#18457)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-09-17 14:45:26 +00:00
Hai | RISE
98ce04d5e0 feat: relax OpEngineValidatorBuilder for more custom payload types (#18520) 2025-09-17 14:37:07 +00:00
Brian Picciano
d9c9810266 fix(trie): Don't run repair-trie if MerkleExecute is incomplete (#18497) 2025-09-17 14:32:02 +00:00
spencer
193f699057 chore(engine): remove calldata exception workaround (#18521) 2025-09-17 14:25:42 +00:00
Alexey Shekhirin
584d7164fd feat(engine): fallback for when both state root task and parallel state root failed (#18519) 2025-09-17 13:31:26 +00:00
Roman Hodulák
5c5b21e489 feat(optimism): Implement local_pending_state for RPC that uses pending_flashblock (#18518) 2025-09-17 12:59:27 +00:00
theo
fabf3e84d4 feat(op/jovian): implement min base fee in op-reth. bump alloy, alloy-evm deps. (#18407)
Co-authored-by: Emilia Hane <emiliaha95@gmail.com>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-09-17 12:47:01 +00:00
VolodymyrBg
8a3d984c11 fix(docs): correct BlockBody root docs and RecoveredBlock “safer variant” references (#18510) 2025-09-17 12:25:27 +00:00
Federico Gimenez
f113a97a78 chore(ci): run eest osaka tests on hive workflow (#18516) 2025-09-17 12:11:25 +00:00
YK
31ce037a25 chore: add myself to CODEOWNERS (#18514) 2025-09-17 10:42:32 +00:00
YK
088eb6c463 feat(metrics): add transaction error counter for prewarming (#18509) 2025-09-17 09:57:30 +00:00
Arsenii Kulikov
04c5820689 fix: don't override existing tables in create_tables_for (#18511)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-17 09:56:35 +00:00
Brian Picciano
9c892b0233 chore: add myself to CODEOWNERS for engine and stages (#18512) 2025-09-17 09:55:11 +00:00
Arsenii Kulikov
9fc89495d0 fix: don't require closure to be Debug (#18507) 2025-09-16 22:51:29 +00:00
sashass1315
c45817c1f2 chore(engine): avoid panic on mpsc send in sparse trie worker (#18502) 2025-09-16 20:39:33 +00:00
Arsenii Kulikov
7296fc68b6 feat: relax EthBlockAssembler (#18505) 2025-09-16 19:38:35 +00:00
Arsenii Kulikov
7af829ed37 feat: make EthBuiltPayload generic over NodePrimitives (#18504) 2025-09-16 19:12:11 +00:00
Arsenii Kulikov
bf58089286 feat: more flexible rpc receipts (#18501) 2025-09-16 20:49:41 +02:00
Matthias Seitz
5274f095fe chore: skip prewarm transact errors (#18498) 2025-09-16 15:13:20 +00:00
MozirDmitriy
1185514c1e fix(engine): exit MultiProofTask loop on closed internal channel (#18490) 2025-09-16 14:22:45 +00:00
Richard Janis Goldschmidt
847330cdfc fix(cli): disallow --instance 0 (#18496) 2025-09-16 14:16:39 +00:00
wizard
d1c966020b docs: fix incorrect transaction type count (#18437) 2025-09-16 12:20:03 +00:00
VolodymyrBg
18052836fe docs(engine): fix LiveSync target doc and clarify disable-parallel-sparse-trie semantics (#18478) 2025-09-16 12:05:39 +00:00
Matthias Seitz
1697826fdb chore: deconstruct non-exhaustive (#18492) 2025-09-16 12:00:37 +00:00
Matthias Seitz
976939ab6b chore: update superchain commit (#18481)
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
2025-09-16 10:55:57 +00:00
Nathaniel Bajo
05008e2841 feat(op-reth): specialize get_transaction_receipt to check pending flashblocks (#18374)
Co-authored-by: Nathaniel Bajo <nathanielbajo@Nathaniels-MacBook-Pro.local>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-09-16 02:07:01 +00:00
Matthias Seitz
8e65a1d1a2 fix: missing generic type hint for cursor (#18483) 2025-09-15 23:32:19 +00:00
CPerezz
b7e9f7608e feat(network): add shadowfork block hash filtering for peers (#18361)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-15 22:14:04 +00:00
Arsenii Kulikov
5f38ff7981 feat: Block::iter_recovered (#18476) 2025-09-15 20:26:19 +00:00
Alexey Shekhirin
5844ff7b17 feat(storage): bump MDBX map size to 8TB (#18360) 2025-09-15 16:42:37 +00:00
Matthias Seitz
2dabb23331 fix(rpc): disable tx gas limit in calls (#18473) 2025-09-15 15:53:23 +00:00
Federico Gimenez
7cf239ab59 feat: add CliApp wrapper for ethereum CLI configuration and execution (#18458) 2025-09-15 15:31:37 +00:00
Federico Gimenez
e578b1b933 chore(ci): update ignored hive tests (#18412) 2025-09-15 14:18:00 +00:00
MIHAO PARK
ec2a898ac6 fix(rpc): add validation for missing headers in debug execution witness (#18444) 2025-09-15 14:15:35 +00:00
Hai | RISE
ef85d93cd7 perf(db): open MDBX DBIs only once at startup (#18424) 2025-09-15 11:57:01 +00:00
MozirDmitriy
d2b9c571a2 fix(engine): remove redundant method-level where bound in InvalidBlockWitnessHook (#18459) 2025-09-15 10:39:20 +00:00
YK
d61349beb2 fix(engine): perform cache updates with guard (#18435) 2025-09-15 10:27:58 +00:00
Fredrik
7d5415a608 perf: Enforce EIP-7825 transaction gas limit for Osaka (#18439)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-15 10:25:16 +00:00
Federico Gimenez
5516ad2d4f chore(ci): unpin kurtosis op package (#18456) 2025-09-15 09:23:02 +00:00
crStiv
1b08843bc5 docs: multiple small textual defects (#18434)
Co-authored-by: YK <chiayongkang@hotmail.com>
2025-09-14 12:08:43 +00:00
Matthias Seitz
96f8454d42 chore: remove type aliases (#18433) 2025-09-14 12:23:46 +02:00
github-actions[bot]
2408586a51 chore(deps): weekly cargo update (#18431)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-09-14 11:27:26 +02:00
stevencartavia
27e4a05cf0 chore: move and rename PendingBlockAndReceipts to BlockAndReceipts (#18430) 2025-09-14 07:41:43 +00:00
lipperhey
1bd6cc21c2 chore: clean up TS warnings in search index & file finder (#18426) 2025-09-13 11:54:02 +00:00
Matthias Seitz
33c75e8e52 chore: add state and response to miner error (#18422) 2025-09-13 13:32:24 +02:00
stevencartavia
99b6dc7986 feat: add helper to PendingBlockAndReceipts (#18423) 2025-09-13 09:51:17 +00:00
stevencartavia
7694b9dee3 feat: fn recovered_tx to indexedTx (#18421) 2025-09-13 10:55:19 +02:00
Hai | RISE
f66e197171 chore(storage): remove unused primed_dbis (#18415) 2025-09-13 07:32:22 +00:00
Hai | RISE
bac0e1f83f perf: downsize mempool tx priority from U256 to u128 (#18413) 2025-09-13 07:30:46 +00:00
TMOT
e276480728 feat(observability): add phase-level observablity to newPayload processing (#18308)
Co-authored-by: YK <chiayongkang@hotmail.com>
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-13 02:01:48 +00:00
Matthias Seitz
44a48ab9fd fix: dont update canon chain to ancestor for opstack (#18410) 2025-09-12 19:36:05 +02:00
かとり
72c2d1b6a0 feat(txpool): break down queued transaction states into specific reasons (#18106)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-12 13:03:41 +00:00
Hai | RISE
51bf7e37e2 perf(db): reuse MDBX DBIs for the same tx (#18292) 2025-09-12 12:34:52 +00:00
Federico Gimenez
bd387cd495 chore: update e2e-test-utils code owners (#18397) 2025-09-12 10:41:12 +00:00
Snezhkko
82fb54763c fix(e2e): persist accepted header in CheckPayloadAccepted and align timestamp (#18275)
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
Co-authored-by: Federico Gimenez <fgimenez@users.noreply.github.com>
2025-09-12 10:41:04 +00:00
Cypher Pepe
87444ef8d0 chore: fixed broken link in history-expiry.mdx (#18400) 2025-09-12 10:38:39 +00:00
leniram159
6d4a1a3ccf chore: use decode_2718_exact for recover raw txs (#18381) 2025-09-12 08:40:17 +00:00
Hai | RISE
40a9954a8e fix: still use real chain id for no-op network (#18382) 2025-09-12 08:30:37 +00:00
stevencartavia
3e4c0cc402 feat: replace PendingBlockAndReceipts tuple with dedicated struct (#18395) 2025-09-11 22:32:09 +00:00
Federico Gimenez
f3aa57a10e fix: map EIP-7623 gas floor errors to expected exception type for test compatibility (#18389) 2025-09-11 20:15:53 +00:00
Yash Atreya
edc1ae8f4d fix(docs): mv search-index to dist from .vocs (#18390) 2025-09-11 14:49:19 +00:00
Yash Atreya
8c2d5cc484 fix(docs): disable jekyll which removes the search-index (#18388) 2025-09-11 12:37:07 +00:00
Matthias Seitz
9d3564ecba fix: relax nonce gap rule if configured (#18385) 2025-09-11 11:39:50 +00:00
Arsenii Kulikov
60568cca8f feat: add helper aliases for node adapters (#18366) 2025-09-11 07:55:13 +00:00
Arsenii Kulikov
a80ed916b1 refactor!: more type-safety in cli (#18375) 2025-09-11 07:54:34 +00:00
Brian Picciano
967a6fb1d5 perf(trie): Use ParallelSparseTrie (if enabled) for storage tries (#17959) 2025-09-10 22:51:52 +00:00
Matthias Seitz
f2350e509e fix: check payload id (#18370) 2025-09-10 18:46:48 +00:00
Federico Gimenez
17a41a2463 feat: bump hive eest tests (#18013) 2025-09-10 18:30:39 +00:00
Federico Gimenez
424974ca37 fix(engine): avoid block fetching inconsistencies for checks during reorgs (#18368) 2025-09-10 17:44:38 +00:00
Federico Gimenez
d6a92287ed feat(engine): check header validity after invalid transaction (#18356) 2025-09-10 12:00:28 +00:00
Yash Atreya
e94658f792 fix(docs): include .vocs to retain search-index (#18363) 2025-09-10 10:22:03 +00:00
Matthias Seitz
700f2e101a feat: add some ethapi builder fns (#18358) 2025-09-10 09:12:02 +00:00
malik
a3aaccd34a perf: optimize canonical_hashes_range with Vec::with_capacity pre-allocation + benchmark (#18072)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-10 07:36:51 +00:00
Rez
fe236cd571 fix: add is_osaka check before erroring in default_ethereum_payload (#18355) 2025-09-10 07:06:12 +00:00
Léa Narzis
3ce0a38108 fix: fix search in vocs doc (#18354) 2025-09-09 20:42:57 +00:00
Emilia Hane
4c363fe1aa feat(op-sdk): custom precompiles (#18350) 2025-09-09 20:04:41 +00:00
Brian Picciano
2fa52f32f4 fix(prune): TransactionLookup pruning issues with pre-merge expiry (#18348) 2025-09-09 16:55:17 +00:00
Arsenii Kulikov
90aa99cb3c feat: support customizable RPC namespace parsers (#18160)
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
2025-09-09 14:17:43 +00:00
Ignacio Hagopian
394a53d7b0 feat(stateless): Run EEST tests in stateless block validator & bug fixes (#18140)
Signed-off-by: Ignacio Hagopian <jsign.uy@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-09 12:48:14 +00:00
Matthias Seitz
4fdc1ceb0c refactor(revm): (#18150) use hardfork activation helpers (#18349)
Co-authored-by: Waiting-Chai <1753609696@qq.com>
2025-09-09 12:47:17 +00:00
malik
1423a30e15 perf: use debug_assert for parked pool lookup (#17712)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-09 12:45:11 +00:00
かとり
b7c2b562e1 fix(stages): implement entities checkpoint update in merkle stage unwind (#18131) 2025-09-09 12:02:52 +00:00
Federico Gimenez
6c9c96c132 fix(ci): pin teku image to fix kurtosis-op build (#18345) 2025-09-09 11:32:13 +00:00
nk_ysg
bfb37da2a9 perf(reth-engine-local): use VecDeque reduce removal operations (#18198) 2025-09-09 11:16:56 +00:00
theo
86eaa6f285 feat(op-reth/flashblocks): subscribe to the flashblock sequences produced (#18276)
Co-authored-by: julio4 <30329843+julio4@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-09 11:10:30 +00:00
Matthias Seitz
aa5e6ad417 fix: properly compute genesis hash (#18300) 2025-09-09 12:15:57 +02:00
Hai | RISE
64afc1e549 perf(merkle-stage): only fetch checkpoint in the branch that needs it (#18339) 2025-09-09 09:04:44 +00:00
Arsenii Kulikov
1e491bc85e feat: cache latest built payload (#18324) 2025-09-09 07:55:34 +00:00
dependabot[bot]
0d13d7f4ff chore(deps): bump actions/stale from 9 to 10 (#18335)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 07:50:59 +00:00
dependabot[bot]
e079ddc7a5 chore(deps): bump actions/github-script from 7 to 8 (#18334)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 07:50:45 +00:00
dependabot[bot]
4b29f5fafe chore(deps): bump actions/setup-go from 5 to 6 (#18332)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 07:50:16 +00:00
Brian Picciano
b4beab1a83 chore(trie): use read-only db handle during repair-trie dry-runs (#18328) 2025-09-09 06:56:26 +00:00
Matthias Seitz
a35b299ae5 docs: update public dashboards (#18331) 2025-09-09 00:34:29 +02:00
Matthias Seitz
23c2dcac9a chore: bump docs version 1.7.0 (#18326) 2025-09-08 23:27:08 +02:00
Matthias Seitz
9d56da53ec chore: bump version 1.7.0 (#18323) 2025-09-08 16:43:05 +02:00
Hai | RISE
6e950a1286 fix: DB benches (#18314) 2025-09-08 13:58:29 +00:00
radik878
cf19c9a10b fix(stateless): verify_execution_witness doc for pre-state mismatch (#18319) 2025-09-08 12:37:36 +00:00
Hai | RISE
1a4b5eca3c fix(bench): fix deadlock in test data generation (#18321) 2025-09-08 12:34:27 +00:00
Hai | RISE
77e13939d0 docs(reth-bench): fix markdown (#18322) 2025-09-08 14:34:45 +02:00
Alexey Shekhirin
e2368676cc ci: pin Rust to 1.88 when building for Windows in Cross (#18320) 2025-09-08 11:52:24 +00:00
Brian Picciano
366d641cc3 feat(trie): Add helper sub-command (#18301) 2025-09-08 11:05:15 +00:00
Julio
81b2e16fb6 feat(optimism): flashblock completed sequences (#18272) 2025-09-08 10:34:42 +00:00
Alexey Shekhirin
dd69dcbd01 refactor(engine): persistence logic (#18318) 2025-09-08 10:32:44 +00:00
kien-rise
bde7464e38 refactor: change PendingPool and PendingTransaction visibility to pub (#18267) 2025-09-08 10:16:45 +00:00
Roman Hodulák
4f930c25c4 refactor(optimism): Extract pending block building responsibility out of FlashBlockService (#18247)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-08 09:15:59 +00:00
Brian Picciano
a14f345c27 chore(trie): dont warn on blinded node reveals (#18317) 2025-09-08 09:09:02 +00:00
Emilia Hane
119ed881ec fix(rpc): error code eth_sendRawTransactionSync timeout (#18252)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-07 11:15:47 +00:00
github-actions[bot]
2e06bbc80f chore(deps): weekly cargo update (#18312)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-09-07 12:49:57 +02:00
Matthias Seitz
8b098755c1 chore: introduce validationtask with capacity (#18291) 2025-09-07 08:45:35 +00:00
Dan Cline
6e75f7b2e2 feat(download): support zst archives in reth download (#18237)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-06 15:33:58 +00:00
Matthias Seitz
de24793b19 chore: clippy happy (#18310) 2025-09-06 09:59:44 +02:00
Femi Bankole
ef337d46a2 feat: introduce maybe_pending method to StateProviderFactory (#18260)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-06 09:31:09 +02:00
James Niken
63a912e312 perf(e2e-test-utils): optimize block checking by fetching header instead of full block (#18254)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-06 08:36:57 +02:00
Matthias Seitz
62f03e41bc chore: fix various typos in comments and documentation (#18296) 2025-09-06 08:36:10 +02:00
Matthias Seitz
01d6f85690 perf: specialize len 1 (#18307) 2025-09-05 22:41:14 +00:00
Arsenii Kulikov
50e8409fa6 feat: expose EvmEnv to caller_gas_allowance (#18302) 2025-09-05 16:55:23 +00:00
Matthias Seitz
0bd1bb2b8c feat: introduce setting for delegated txs slots (#18298) 2025-09-05 16:52:52 +00:00
zhygis
e93e1fcecb feat(gpo): add default fee price argument (#18297)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-05 15:04:48 +00:00
Mablr
d6845357c1 feat(metrics): add TxPoolValidatorMetrics to track inflight validation jobs (#18295) 2025-09-05 12:11:41 +00:00
Matthias Seitz
9c61b46752 perf: specialize validate_transactions_with_origin for task validator (#18288) 2025-09-05 12:09:30 +00:00
Roman Hodulák
848d7fa830 test(optimism): Test that close message is responded to in WsFlashBlockStream (#18268) 2025-09-05 10:54:11 +00:00
Hai | RISE
0cdd54838b chore: delist unused deps with cargo-machete (#18259) 2025-09-05 10:23:52 +00:00
Matthias Seitz
f8b678cf17 perf: specialize single batch request (#18289) 2025-09-05 10:19:15 +00:00
Matthias Seitz
d99f37b243 perf: optimize send raw batching (#18280) 2025-09-05 10:02:51 +00:00
Matthias Seitz
30297092f6 fix: check prune checkpoints for unwind target limit (#18263) 2025-09-05 10:02:28 +00:00
YK
254860f2df chore(txpool): add sanity tests for blob fee bit handling (#18258) 2025-09-05 10:02:05 +00:00
Hai | RISE
4cc600c41e perf(db): do not heap-allocate the stage key per query (#18284) 2025-09-05 09:44:15 +00:00
Matthias Seitz
02ff408b10 perf: build local pending block without updates (#18271) 2025-09-05 10:54:49 +02:00
Matthias Seitz
7c8f5a402e perf: rm redundant collect (#18281) 2025-09-05 01:03:56 +00:00
Arsenii Kulikov
60311096e9 chore: extract validate_against_parent_gas_limit into separate fn (#18277) 2025-09-04 19:00:13 +00:00
Matthias Seitz
cf46aa017d chore: log prune settings on unwind (#18270) 2025-09-04 14:05:19 +00:00
Roman Hodulák
7f8674971f test(optimism): Test that UTF-8 encoded messages are received in WsFlashBlockStream (#18269) 2025-09-04 14:01:56 +00:00
Roman Hodulák
c57feda644 fix(optimism): Reconnect if ws stream ends in WsFlashBlockStream (#18226) 2025-09-04 12:23:32 +00:00
Roman Hodulák
ecd18987b0 feat(optimism): Respond to close messages in WsFlashBlockStream (#18256) 2025-09-04 12:03:36 +00:00
Hai | RISE
b1e19325b6 chore: remove redundant payload trait bounds (#18262) 2025-09-04 10:31:45 +00:00
Roman Hodulák
107399ff0e feat(optimism): Decode text messages in WsFlashBlockStream (#18257) 2025-09-04 09:07:43 +00:00
Roman Hodulák
36e39ebe3d fix(optimism): Compare parent hash and latest hash to invalidate cached flashblock (#18238) 2025-09-03 20:27:04 +00:00
Matthias Seitz
1d7fefecec chore: unify engine downloader targets (#18248) 2025-09-03 17:43:59 +00:00
quantix9
3d8d7ce781 chore: downgrade debug to trace for peer reputation logs (#18250) 2025-09-03 13:40:11 +00:00
Roman Hodulák
29685ce006 test(optimism): Test that WsFlashBlockStream pongs a ping (#18217) 2025-09-03 11:38:07 +00:00
Roman Hodulák
0550289c69 feat(optimism): Respond to ping messages with pong in WsFlashBlockStream (#18212) 2025-09-03 10:39:53 +00:00
Matthias Seitz
9121dba0b6 docs: update urls in docs (#18245) 2025-09-03 12:30:34 +02:00
YK
bb1dfc9e9d perf(txpool): eliminate allocations in basefee enforcement (#18218)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-03 09:49:15 +00:00
nk_ysg
a11655b515 perf(reth-optimism-flashblocks): rm redundant clone (#18196) 2025-09-03 09:21:32 +00:00
Ivan Wang
f0880f3ff0 fix: filter zero storage values when computing withdrawals root in genesis header (#18213) 2025-09-03 07:54:30 +00:00
Dan Cline
783ef65799 chore(trie): use instrument instead of manual span (#18239) 2025-09-03 07:46:18 +00:00
Dan Cline
0acebab68c chore(engine): add better logs and spans for execution (#18240) 2025-09-03 07:45:50 +00:00
Dan Cline
d5a4898384 fix(download): use updated merkle base URL (#18236) 2025-09-03 00:20:24 +02:00
Matthias Seitz
60ce536550 chore: improve flashblock logs (#18232) 2025-09-02 20:49:17 +00:00
Matthias Seitz
733e8cfce9 chore: safe None check (#18225) 2025-09-02 18:31:55 +00:00
Roman Hodulák
298a7cb5ea feat(optimism): Warn if FlashBlockService has stopped (#18227) 2025-09-02 20:27:54 +02:00
Roman Hodulák
44caf60afd test(optimism): Test that sequence stops before a gap (#18228) 2025-09-02 17:39:34 +00:00
Roman Hodulák
358b61b4ef fix(optimism): Prevent repeated executions of current flashblock sequence (#18224) 2025-09-02 14:02:18 +00:00
Matthias Seitz
6bcd5e07ac fix: incorrect blob fee comparison (#18216) 2025-09-02 12:02:47 +00:00
Matthias Seitz
dba13f4486 revert: "perf(txpool): eliminate allocations in basefee enforcement" (#18215) 2025-09-02 13:49:15 +02:00
Matthias Seitz
1788c5c6a2 fix: spawn flashblocks service as blocking (#18214) 2025-09-02 10:39:32 +00:00
Matthias Seitz
d10e5f6fb4 perf: prepare flashblock txs (#18201)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-09-01 19:41:34 +00:00
Matthias Seitz
4d94e201d7 chore: impl ExecutorTx for withtxenv (#18202) 2025-09-01 19:25:40 +00:00
Matthias Seitz
e9801a7997 chore: simplify flashblocks poll logic (#18194)
Co-authored-by: julio4 <30329843+julio4@users.noreply.github.com>
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
2025-09-01 17:40:18 +00:00
Roman Hodulák
fe37279ab3 test(optimism): Test that streaming flashblocks from remote source is successful (#18170) 2025-09-01 13:20:09 +00:00
Brawn
b6fddd7d07 fix: struct serialization to match actual fields (#18189) 2025-09-01 13:20:06 +00:00
Roman Hodulák
945d50a7f1 test(optimism): Cover the case of repeatedly failing to connect to websocket in WsFlashBlockStream (#18169) 2025-09-01 12:40:43 +00:00
Roman Hodulák
e3772c4db9 test(optimism): Cover the case of stream returning errors in WsFlashBlockStream (#18167) 2025-09-01 11:59:50 +00:00
Roman Hodulák
e76c88c219 test(optimism): Cover the failure case of decoding a non-binary message in WsFlashBlockStream (#18166) 2025-09-01 11:26:26 +00:00
Roman Hodulák
9ec6459bda test(optimism): Cover successful decoding of websocket messages in WsFlashBlockStream (#18163) 2025-09-01 10:54:07 +00:00
Brian Picciano
651e34cec6 fix: Pass prefix set from init_from_state_dump into compute_state_root (#18185) 2025-09-01 10:16:35 +00:00
TMOT
d69fda1a2b feat(examples): added txpoolExt_clearTxpool to existing example (#18175) 2025-09-01 10:07:52 +00:00
Roman Hodulák
e9a57a72c8 refactor(optimism): Extract responsibility to connect to a flashblock websocket stream (#18158) 2025-09-01 09:22:04 +00:00
Julio
61b8015c84 perf(optimism): use cached db in FlashblockService (#18125)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-09-01 11:04:03 +02:00
YK
e30da67d35 perf(txpool): eliminate allocations in basefee enforcement (#18162) 2025-09-01 08:18:14 +00:00
Fynn
203cb6e158 feat: enhance engine tree metrics (#18000) 2025-09-01 01:29:22 +00:00
DaniPopes
3ad9743904 chore: avoid using hashmap hashers directly (#18176) 2025-08-31 13:40:13 +00:00
smileclown2024
42eb835569 perf(stages): optimize unwind operation by fetching headers instead full blocks (#18139) 2025-08-31 08:39:17 +00:00
github-actions[bot]
4cc2a4decd chore(deps): weekly cargo update (#18174)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-08-31 08:17:33 +00:00
Matthias Seitz
911ed27787 chore: simplify dev signed tx conversions (#18171) 2025-08-30 19:01:31 +00:00
David Klank
eab2ad7743 refactor: remove unnecessary PathBuf clone in CLI help generator (#18172) 2025-08-30 11:43:33 +00:00
VolodymyrBg
4a28cf4281 fix: correct logical error in delete_outside_range error message (#18031) 2025-08-30 08:07:31 +00:00
James Niken
339f18c48f ci: Fix .PHONY declaration for install-reth-bench target in Makefile (#18152) 2025-08-30 10:03:46 +02:00
pepes
9b863264d4 perf: optimize single-element collection creation (#18168) 2025-08-29 16:21:48 +00:00
dependabot[bot]
0e9cbc80b4 chore(deps): bump actions/upload-pages-artifact from 3 to 4 (#18076)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 14:17:38 +00:00
Julio
297304852b fix(optimism): find fb attrs in base fb (#18164) 2025-08-29 14:01:35 +00:00
quantix9
7170e14404 chore: Add 0x prefix and use macro (#18156) 2025-08-29 12:20:08 +00:00
Roman Hodulák
616e492c79 perf(optimism): Pass noop provider to skip state root calculations for flashblocks (#18161) 2025-08-29 11:27:00 +00:00
nk_ysg
64df86fe30 perf(reth-invalid-block-hooks): use Reverts::eq reduce clone (#18159) 2025-08-29 11:08:24 +00:00
Jonas Bostoen
21ba9c4e05 feat(optimism): add FlashblocksRx getter (#18155) 2025-08-29 10:40:49 +00:00
Brian Picciano
e7685789be fix(trie): Fix call to update_account in witness (#18154) 2025-08-29 10:31:02 +00:00
nk_ysg
5c0c8bb38d chore(reth-optimism-storage): small refactor code (#18104) 2025-08-29 08:58:04 +00:00
YK
ee5006c027 perf(engine): pre-allocate channel handles in prewarm task (#18147) 2025-08-29 08:23:01 +00:00
YK
f93dfec50f perf(engine): pre-allocate Vec capacity in payload processor (#18148) 2025-08-29 07:24:16 +00:00
Eric Woolsey
001fb927b5 feat: generalize impl EngineValidatorAddOn for OpAddOns (#18141) 2025-08-29 06:14:26 +00:00
Max Bytefield
0b316160a9 docs(op): op chains don't require deposit contracts, so as dev chain (#17988)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-28 18:22:26 +00:00
Arsenii Kulikov
66a0a14cf6 refactor: merge EthTransactionValidator and EthTransactionValidatorInner (#18129) 2025-08-28 18:22:01 +00:00
Matthias Seitz
354cfdf90e fix(txpool): ensure fee changes are updated (#18137) 2025-08-28 18:21:40 +00:00
Roman Hodulák
f13cf181ad fix(optimism): Fail if latest and base flashblock parent are different (#18132)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-28 17:44:54 +00:00
Matus Kysel
abf1dbd7a5 feat(net): implement support of subprotocols (#18080)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-28 17:06:16 +00:00
Louis Brown
8bc2bfdf90 feat: Forward transactions to a specified endpoint (#17444)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-08-28 16:18:03 +00:00
Haotian
94547b06a1 fix: import should count on the delta (#17819)
Signed-off-by: tmel <tmel0103@gmail.com>
Signed-off-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: tmel <tmel0103@gmail.com>
2025-08-28 15:27:41 +00:00
Roman Hodulák
594a67d87f fix(optimism): Verify that flashblocks are not old according to canon state (#18123) 2025-08-28 15:23:05 +00:00
Hai | RISE
fad93e95a8 perf(engine): only clone headers instead of full blocks for tree tasks (#18116) 2025-08-28 15:14:58 +00:00
Suyash Nayan
282abc708c fix(engine): Prevent instant miner from creating empty blocks (#18108)
Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
2025-08-28 15:12:58 +00:00
Matus Kysel
63a09bace9 refactor(eth-wire): remove EthVersion::total_messages in favor of EthMessageID::max (#17999) 2025-08-28 12:46:48 +00:00
Matthias Seitz
9e9a0b1867 chore: add prewarm traces (#18117) 2025-08-28 10:24:11 +00:00
Andrea Simeoni
b2c6852c29 fix(optimism): Fix endless poll on the FlashBlockService (#18120) 2025-08-28 09:39:55 +00:00
Arsenii Kulikov
3425a31a2f chore: make caller_gas_allowance an RPC trait method (#18101) 2025-08-28 09:22:47 +00:00
Roman Hodulák
07c62aebda fix(optimism): Prevent old pending flashblock from being returned from pending_flashblock (#18103) 2025-08-28 09:01:27 +00:00
Matthias Seitz
8a4b53361c chore: include err in log (#18119) 2025-08-28 08:44:16 +00:00
leniram159
87a4949f5c feat: add EIP-7934 block size check to validateBuilderSubmissionV5 (#18111) 2025-08-28 07:57:03 +00:00
Matthias Seitz
eb4496dbf0 ci: remove expected failures (#18099) 2025-08-27 21:49:26 +02:00
nk_ysg
1d893a1ce2 chore(reth-optimism-cli): use OpTypedTransaction::eip2718_encode (#18105) 2025-08-27 16:08:10 +00:00
Matthias Seitz
e62c7d2469 feat: add module manipulation methods and RPC server arg helpers (#18084) 2025-08-27 14:35:08 +00:00
Dharm Singh
0804131015 refactor: make transaction validator functions reusable (#17929)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-08-27 14:30:56 +00:00
Roman Hodulák
f376dd8031 feat(optimism): Remove builder of next block environment from FlashBlockService (#18100) 2025-08-27 13:59:02 +00:00
Roman Hodulák
9d1ec366f8 feat(optimism): Implement conversion of ExecutionPayloadBaseV1 into OpNextBlockEnvAttributes (#18097) 2025-08-27 13:30:47 +00:00
Hai | RISE
615bd4a30f perf(engine): only fetch headers instead of full blocks for tree tasks (#18088) 2025-08-27 12:27:37 +00:00
Roman Hodulák
3a5c992394 feat(optimism): Add flashblocks_url as part of rollup args of the op-reth CLI (#18094) 2025-08-27 11:32:00 +00:00
Matthias Seitz
dc598490ac feat: add helper for provider with wallet (#18085) 2025-08-27 10:27:08 +00:00
Matthias Seitz
2e6ab54248 feat: add NoopNetwork example (#18093) 2025-08-27 10:25:43 +00:00
Roman Hodulák
97f4b00fc0 feat(optimism): Launch FlashBlockService when websocket URL is provided in OpEthApi (#18077) 2025-08-27 09:51:33 +00:00
0xKitsune
b7b70a46a5 feat: optionally disable balance check for EthTransactionValidator (#18086) 2025-08-27 09:44:59 +00:00
nk_ysg
f67e7547df fix(era): SlotIndex offset support negative value (#18047) 2025-08-27 08:28:28 +00:00
malik
28774f7ad4 fix: clarify locking behavior comment in InMemoryState (#18081) 2025-08-27 08:05:52 +00:00
Brian Picciano
34de67ab57 fix: Fix state root related metrics (#18045) 2025-08-27 08:04:52 +00:00
Hai | RISE
0889a52ec0 chore(nix): add cargo-nextest to devShell (#18087) 2025-08-27 07:59:09 +00:00
Matthias Seitz
3d8033a03c chore: add helpers for setting minimum protocol basefee (#18083) 2025-08-26 23:51:55 +00:00
Haotian
9d2194fa43 feat: support importing multi files (#17928)
Signed-off-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: tmelhao <tmel0103@gmail.com>
2025-08-26 20:58:53 +00:00
Arsenii Kulikov
db04a19101 feat: fusaka changes (#18071)
Co-authored-by: Roman Krasiuk <rokrassyuk@gmail.com>
Co-authored-by: Bharath Vedartham <vedabharath12345@gmail.com>
2025-08-26 18:43:36 +00:00
Roman Hodulák
13e0fd55de feat(optimism): Change FlashBlockService output ExecutedBlock => PendingBlock (#18078) 2025-08-26 16:59:23 +00:00
Igor Markelov
92743a0d87 feat: FCU unwind: properly reorg in-memory canonical state and update latest block (#17938)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-26 16:54:50 +00:00
Roman Hodulák
3c7301e0bb feat(optimism): Add launch_wss_flashblocks_service function spawning a task sending last pending block (#18067) 2025-08-26 15:15:44 +00:00
Debjit Bhowal
87647b25ac fix(static_file_provider): Exception for Gnosis and Chiado (#18044)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-26 14:31:06 +00:00
Léa Narzis
8c8ffd4329 refactor(rpc): add TxEnv converter to RpcCoverter (#17792)
Co-authored-by: Roman Hodulák <roman.hodulak@polyglot-software.com>
2025-08-26 13:51:07 +00:00
ongyimeng
caa8c541ec perf: use FuturesOrdered instead of join_all to yield results (#17638)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-26 13:26:26 +00:00
Roman Hodulák
7ee085f393 feat(optimism): Add constructors to FlashBlockService and FlashBlockWsStream (#18064) 2025-08-26 13:23:01 +00:00
Hai | RISE
d14658dc5e perf(payload): do not clone full attributes for timestamp validation (#18054) 2025-08-26 15:29:07 +02:00
Roman Hodulák
b50eb7e514 feat(optimism): Wrap incoming stream item in Result for compatibility of FlashBlockService with FlashBlockWsStream (#18063) 2025-08-26 12:15:29 +00:00
Avory
089629ba64 fix: use deterministic RNG in state_root_task benchmark (#18049) 2025-08-26 11:47:53 +00:00
int88
f343b19c1b fix: add secp256k1 to dev-dependencies of dns crate (#18059) 2025-08-26 09:44:10 +00:00
bendanzhentan
138c9172bb fix(node/builder): correct left_mut() method implementation and docs (#18053) 2025-08-26 08:46:45 +00:00
YK
7703e6fb9d refactor(tree): move metered execution functions to tree module (#17912) 2025-08-26 01:14:31 +00:00
Matthias Seitz
dd4aa7cd2a chore: relax EngineValidatorAddOn impl (#18052) 2025-08-25 21:13:25 +02:00
smileclown2024
af57047654 perf: optimize canonical_hashes_range to O(n) complexity (#17975) 2025-08-25 18:42:19 +00:00
かとり
8bec55183e feat: remove the not used executor in sparse_trie (#17966) 2025-08-25 20:15:24 +02:00
Roman Hodulák
23cfd1bb7c feat(optimism): Add FlashBlockService that builds blocks from FlashBlocks (#18009) 2025-08-25 15:02:39 +00:00
Avory
c97b322c54 feat: bump jsonrpsee to v0.26.0 (#17901)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-25 16:54:30 +02:00
Matthias Seitz
d87280e793 chore: apply spelling and typo fixes (#18041) 2025-08-25 16:24:21 +02:00
DaniPopes
c3d211c6f7 chore: remove msrv from clippy.toml (#18034) 2025-08-25 15:21:23 +02:00
iPLAY888
f3c2a3dc27 Update README.md (#18021) 2025-08-25 13:55:08 +02:00
Hai | RISE
014e8dacc9 perf(pool): remove unused hash in tx insertion/validation (#18030) 2025-08-25 10:38:48 +00:00
Dharm Singh
01f667c228 feat(reth-bench): add --advance option for relative block ranges (#17996) 2025-08-25 01:51:24 +00:00
github-actions[bot]
848370b311 chore(deps): weekly cargo update (#18023)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-08-24 10:16:29 +00:00
Matthias Seitz
ce2ce23e30 feat: add accessor methods for RPC handle types (#18016) 2025-08-23 11:27:27 +00:00
Julio
13f7ae463e feat: add log.file.name cli arg (#17883)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-23 04:51:11 +00:00
Ishika Choudhury
304c9090e2 feat: added trace_transaction_storage_access (#16022)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-23 03:23:16 +00:00
Dharm Singh
28b085a352 feat: add CLI support for TransactionPropagationMode in NetworkArgs (#18012)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-23 02:59:34 +00:00
Kero
d5ade8504a fix: replace unwrap with proper error handling in ShardedKey decode (#17902) 2025-08-23 02:48:08 +00:00
Matthias Seitz
fcb74930af feat: add helper for setting tx propagation mode (#18007) 2025-08-22 15:34:10 +00:00
Federico Gimenez
530269e3a6 test(engine): add e2e tests for forkchoice update with finalized blocks (#18004) 2025-08-22 13:01:37 +00:00
Matthias Seitz
42f44a3d74 fix: rlp encoding for sealedblock (#18003) 2025-08-22 10:12:36 +00:00
Brian Picciano
8193fcff93 chore(trie): fully reveal sparse tries prior to leaf updates/removals (#17643)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-22 09:16:38 +00:00
leniram159
d8e8d67ff8 fix: remove unused base_fee_params_at_block function (#17992)
Co-authored-by: Dharm Singh <dharmhsing@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-22 08:01:45 +00:00
JP
e9d4020057 fix(revm-inspectors): update revm-inspectors to fix js tracer opcode gas calculation (#17986) 2025-08-22 09:38:59 +02:00
Roman Hodulák
a4dd305ee9 feat(optimism): Add FlashBlockWsStream for streaming flashblocks from a websocket connection (#17987) 2025-08-21 23:11:56 +02:00
Federico Gimenez
00ae7654e9 chore(cli): add log about state root computation for init-state (#17980) 2025-08-21 19:46:35 +00:00
MIHAO PARK
9209d37e72 chore: remove not used block/receipt memory limiter constants (#17989) 2025-08-21 21:52:54 +02:00
Starkey
b81bdc88f0 chore(db): remove empty TODO comment (#17981) 2025-08-21 19:33:11 +00:00
Roman Hodulák
12abfd76de feat(optimism): Add FlashBlock payload schema (#17984) 2025-08-21 17:35:54 +02:00
Ashin Gau
e0b5203cb0 refactor: Fix incorrect length parameter in StorageTrieEntry::from_compact (#17748) 2025-08-21 14:31:13 +00:00
Roman Hodulák
00dd9eccc6 feat(optimism): Add new reth-optimism-flashblocks crate (#17982) 2025-08-21 16:50:09 +02:00
Roman Hodulák
aabeb06a15 feat(rpc): Use pool-based pending block for pending state over latest (#17924) 2025-08-21 11:41:28 +00:00
MIHAO PARK
6264530a8a docs(net): add Rreceipts69 document (#17969)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-21 10:59:13 +00:00
Federico Gimenez
7ea6daf7d8 fix(optimism): add debug_traceTransaction support for pre-bedrock blocks (#17971) 2025-08-21 10:41:32 +00:00
Roman Hodulák
65907e3d86 feat(rpc): Add local_pending_state that creates a state provider out of a mem-pool built pending block (#17957) 2025-08-21 08:33:15 +00:00
Roman Hodulák
e0ca0407b2 docs(sdk): Add guide for custom transaction envelope macro usage (#17879) 2025-08-21 08:30:12 +00:00
Brian Picciano
df3bf2c00a perf(trie): default ParallelSparseTrie to enabled (accounts only still) (#17956) 2025-08-21 06:24:05 +00:00
Brian Picciano
4fe6ae411a fix: ParallelSparseTrie::update_leaf edge-case, and not correctly clearing all fields for re-use (#17955) 2025-08-21 06:23:42 +00:00
MIHAO PARK
a2751c316e fix(net): Receipts69 should respond with Receipts69 message (#17880) 2025-08-20 21:32:07 +00:00
Starkey
7884c1e063 fix: use len() instead of iter().count() for trace logging (#17968) 2025-08-20 20:30:22 +00:00
Dharm Singh
2c4d90671f docs(trie): document MDBX ordering assumptions in TrieWalker and Trie… (#17906) 2025-08-20 18:20:04 +00:00
Femi Bankole
a89646faee chore(engine): rename block validation task (#17964) 2025-08-20 18:16:19 +00:00
Femi Bankole
1ed7450d53 feat(engine): set default_memory_block_buffer_target to zero (#17963) 2025-08-20 18:01:00 +00:00
かとり
8435976563 feat(optimism): add supervisor_revalidation_duration_seconds metrics (#17897) 2025-08-20 17:32:50 +00:00
Léa Narzis
0110fbe0a9 refactor(evm): use execution payload getters (#17947) 2025-08-20 14:43:48 +00:00
Matthias Seitz
db6ee6428d chore: rm redundant runtime (#17961) 2025-08-20 14:11:24 +00:00
Roman Hodulák
441bad848b feat(rpc): Convert state_at_block_id into async function (#17954) 2025-08-20 14:09:32 +00:00
0xNarumi
4bd788e74c fix: allow at most one in-flight tx (#17960) 2025-08-20 14:04:41 +00:00
Matthias Seitz
81fe6ca05a chore: activate pool if node (#17950) 2025-08-20 13:01:03 +00:00
Matthias Seitz
e110c9b8d4 chore: add helpers to added tx state (#17951) 2025-08-20 13:00:33 +00:00
Léa Narzis
7542580170 refactor(era): add era types and file traits for shared behavior (#17873)
Co-authored-by: Roman Hodulák <hodulakr@gmail.com>
2025-08-20 11:43:20 +00:00
Roman Hodulák
0fa93840e8 feat(rpc): Add spawn_blocking_io_fut that accepts a future (#17953) 2025-08-20 09:45:43 +00:00
Starkey
93fcd82351 fix: replace todo!() with Ok(None) in NoopProvider transaction_block (#17949) 2025-08-20 10:00:18 +02:00
Solar Mithril
0f26562bb6 feat: Add transaction propagation kind 'None' (#17944) 2025-08-19 16:52:58 +00:00
crStiv
a4c57de5ec docs: multiple small textual defects (#17904) 2025-08-19 16:50:40 +00:00
bendanzhentan
d31e4ca835 fix(optimism): correct string formatting in error message (#17923) 2025-08-19 16:47:03 +00:00
dependabot[bot]
d8ade5af38 chore(deps): bump amannn/action-semantic-pull-request from 5 to 6 (#17933)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-19 16:45:20 +00:00
YK
a1a1b11e45 fix(trie): replace rayon with tokio for I/O operations in parallel trie (#17931) 2025-08-19 16:37:17 +00:00
Starkey
41aa3bf7ff fix: optimize empty directory check in is_database_empty (#17932) 2025-08-19 16:23:14 +00:00
Brian Picciano
97763ff7dd chore: fix clippy in nix flake (#17918) 2025-08-19 18:46:11 +02:00
crazykissshout
a3298ecfdd test: remove misleading TODO comments in MockEthProvider (#17926) 2025-08-19 12:45:39 +00:00
bigbear
b9e09d06b7 chore: replace reference (#17899)
Co-authored-by: Yash Atreya <44857776+yash-atreya@users.noreply.github.com>
2025-08-19 12:06:00 +00:00
malik
b81e133fbc perf: reduce cycles on indexing (#17916) 2025-08-19 07:33:10 +00:00
Mourad Kejji
91730cd326 docs: add paragraph about EIP-7702 transaction types (#17865) 2025-08-18 16:51:58 +00:00
Emilia Hane
1b9f9e2a2f chore(grafana): Add description to pruner panel (#17917) 2025-08-18 15:04:56 +00:00
bendanzhentan
56e641a878 chore(metrics): fix MeteredReceiver docs (#17913) 2025-08-18 14:19:14 +00:00
Kero
3f3e4fe7a7 fix: convert anchor() method from recursive to iterative (#17909) 2025-08-18 13:55:26 +00:00
robinsdan
29e4b20588 refactor: remove StateCommitment trait (#17812) 2025-08-18 13:53:53 +00:00
Forostovec
e617dd30c9 fix(ress/provider): return zero headers when request.limit == 0 (#17911) 2025-08-18 12:12:58 +00:00
github-actions[bot]
48df70eaff chore(deps): weekly cargo update (#17907)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-17 10:32:34 +00:00
malik
61662098aa chore(pool): replace saturating_sub with unchecked_sub (#17890) 2025-08-16 00:43:54 +00:00
Matthias Seitz
198ba18e86 chore: remove Beacon from type names (#17868)
Co-authored-by: petarjuki7 <petar.jukic7@gmail.com>
2025-08-15 20:54:05 +00:00
Matthias Seitz
7577ab81aa test: add tests for fetching header,body ranges (#17893) 2025-08-15 20:52:09 +00:00
0xKitsune
f180b0da9b feat: bubble up revm feature flags via revm-reth (#17896) 2025-08-15 18:39:26 +00:00
Roman Hodulák
b3479f6622 refactor(examples): Replace CustomTransactionEnvelope with Signed<TxPayment> as the variant type in the custom node example (#17894) 2025-08-15 14:37:29 +00:00
Shiyas Mohammed
de157aa3a0 feat(rpc): add configurable pending block behaviour (#17677) 2025-08-15 13:09:41 +00:00
Roman Hodulák
055331a667 fix(examples): Implement Compact using blanket implementation (#17878) 2025-08-15 13:01:53 +00:00
YK
3f86efc3bb fix: use map_pure_precompiles for precompile caching (#17886) 2025-08-15 11:48:39 +00:00
colin
87c29027b8 fix(network): off by one error in getting next header (#17889)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-15 13:47:31 +02:00
Matthias Seitz
0de24935c2 chore: clippy happy (#17892) 2025-08-15 13:18:37 +02:00
Emilia Hane
7744ee9e74 chore(tx-pool): Rm redundant async block (#17891) 2025-08-15 13:05:31 +02:00
かとり
6daf5fc777 chore: remove the deprecated ganache api (#17881) 2025-08-14 21:49:20 +00:00
Roman Hodulák
d030ef8b7a feat(rpc): Add RpcTxConverter to allow for providing custom converters with extra context (#17827) 2025-08-14 13:15:10 +00:00
viktorking7
4651b9ae7c fix: critical error handling in ExEx launcher (#17627)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-14 07:45:41 +00:00
Mablr
907448ff3b feat(rpc): Add support for custom Tokio runtime configuration in EthereumAddOns (#17693)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-14 05:40:29 +00:00
Rej Ect
84992f7508 chore(ci): migrate workflows to checkout v5 (#17813) 2025-08-14 05:19:40 +00:00
Jack Drogon
cd7a3c816f fix: replace unsafe unwrap with proper error handling (#17867)
Signed-off-by: Jack Drogon <jack.xsuperman@gmail.com>
2025-08-14 04:40:40 +00:00
Eric Woolsey
b64eed99b5 feat: custom instance label and configurable datasource for mempool dash (#16634) 2025-08-14 04:18:21 +00:00
0xKitsune
e12e6c0d04 feat(txpool): Batch insertions into the Tx Pool (#17670)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-08-13 19:36:34 +00:00
DaniPopes
4e20417a87 fix: box some more futures (#17864) 2025-08-13 18:45:02 +00:00
nk_ysg
544eed8b72 test(chain-state): opt unit test (#17770) 2025-08-13 18:12:48 +00:00
Matthias Seitz
b5aa824120 chore: fix typos and improve documentation (#17862) 2025-08-13 20:33:52 +02:00
greg
cb03cb7e17 feat: make MockEthProvider more generic (#17780)
Signed-off-by: Gregory Edison <gregory.edison1993@gmail.com>
2025-08-13 17:55:10 +00:00
Bashmunta
ad9b528c1f docs(e2s_file): clarify automatic version insertion and entries behavior (#17789)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-13 17:38:57 +00:00
かとり
0fdc1ec28d chore: update crunchy to v0.2.4 (#17856) 2025-08-13 17:38:23 +00:00
phrwlk
f3b99cbf32 fix: remove unused import from execute.rs (#17811) 2025-08-13 17:29:54 +00:00
Roman Hodulák
8065229008 feat(rpc): Add SimTxConverter to allow for providing custom converters with extra context (#17821) 2025-08-13 17:13:55 +00:00
Jack Drogon
1cdc43d79c fix: typo initialise to initialize (#17851)
Signed-off-by: Jack Drogon <jack.xsuperman@gmail.com>
2025-08-13 17:09:59 +00:00
かとり
5dda39dd8d chore: use receipt.into_logs instead of log.to_vec to reduce the unnecessary clone (#17852) 2025-08-13 16:52:31 +00:00
onbjerg
ee8c893f59 chore: remove myself from codeowners (#17855) 2025-08-13 15:14:32 +00:00
Ishika Choudhury
94c93583af feat: introduced configurable version globals (#17711)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-13 14:25:35 +00:00
georgehao
3fe6c0c3c6 fix(call): overwrite gas when exceed the RPC_DEFAULT_GAS_CAP (#17847) 2025-08-13 14:04:20 +00:00
Jack Drogon
f1da87e3e6 fix: clippy warnning manual_is_multiple_of (#17853)
Signed-off-by: Jack Drogon <jack.xsuperman@gmail.com>
2025-08-13 13:47:58 +00:00
Dan Cline
f30016019d fix(db): make db get --raw work with DupSort tables (#17842) 2025-08-13 12:06:49 +00:00
Roman Hodulák
28c7113799 feat(examples): Add custom header extensions to payload attributes in custom_node example (#17797) 2025-08-13 10:45:10 +00:00
Max Bytefield
dfc58eac7c chore: remove s3 stage (#17831) 2025-08-13 09:22:22 +00:00
Pana
02eafd75f1 chore: update db-access example used method (#17815) 2025-08-13 09:10:52 +00:00
Dan Cline
fa31b9edcc chore(deps): bump revm 28.0.1, inspectors, alloy-evm (#17840) 2025-08-12 23:10:13 +00:00
malik
79571315be perf: use unwrap and save 198 cycles (#17836) 2025-08-12 19:34:52 +00:00
Haotian
f49b3202d1 chore(cli): rename file import_op to import_core for clarity (#17826)
Signed-off-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: tmelhao <tmel0103@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-12 18:56:18 +00:00
daksh
443d16f6f7 perf: iterate through nibbles (#17820)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-12 18:54:35 +00:00
Wolfgang Welz
810790c767 feat: allow external block recovery in reth-stateless (#17755) 2025-08-12 18:44:52 +00:00
Mablr
6e691c0f38 chore: Remove BlockMeta variants and unused code (#17835) 2025-08-12 18:29:04 +00:00
Léa Narzis
3cfc01d09b feat(tx-pool): add add_transactions_with_origins helper (#17802) 2025-08-12 17:41:10 +00:00
Cypher Pepe
82f1cc09ff chore: fixed dead links in repo (#17694) 2025-08-12 17:38:02 +02:00
ssolit
5733a32e27 test: modify discv5 startup test to use a random port (#17614) 2025-08-12 17:36:50 +02:00
DaniPopes
772d92056d fix: storage lock race condition (#17823) 2025-08-12 15:03:38 +00:00
malik
01c39f6738 perf: optimize condition ordering in ParkedPool for better short-circuiting (#17816) 2025-08-12 13:40:10 +00:00
Hai | RISE
1077904f55 perf: remove some clones around eth tracing (#17822) 2025-08-12 13:30:35 +00:00
dependabot[bot]
6a79d80ec5 chore(deps): bump actions/download-artifact from 4 to 5 (#17817)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-12 10:55:33 +00:00
dependabot[bot]
e741fac680 chore(deps): bump actions/checkout from 4 to 5 (#17814)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-12 08:12:55 +00:00
Max Bytefield
74dcb8afdb chore(test-vectors): remove TxDeposit compact TODO (#17800)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-08-12 02:10:22 +00:00
Max Bytefield
e208d380b7 chore: remove whitespace of the gas unit and threshold (#17808) 2025-08-12 02:04:39 +00:00
Max Bytefield
f0bd4c6843 chore: rename gas to gas_used in the node logs (#17767) 2025-08-11 21:37:48 +00:00
Solar Mithril
bcbd2d64ce chore: Expose payload builder handle and metrics (#17764) 2025-08-11 16:46:19 +00:00
viktorking7
3ba2370a57 chore: remove redundant words in comment (#17753) 2025-08-11 18:41:38 +02:00
Matthias Seitz
0b1c94a150 feat: add op db access example (#17796) 2025-08-11 15:45:53 +00:00
Femi Bankole
3e0ceda9f1 feat: persist origin on pooled tx backup for propagation setting (#17756)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-11 15:13:45 +00:00
Max Bytefield
76c4c02edb chore: replace ~/.cargo with $CARGO_HOME (#17776) 2025-08-11 14:46:13 +00:00
Max Bytefield
69a1951f54 docs: add optimism Access-list spec (#17775) 2025-08-11 11:32:32 +00:00
Max Bytefield
1ba9e680bc fix: reth dev node implement the --block-max-transactions arg (#17784)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-11 11:28:49 +00:00
colin
42ae8beee6 fix(network): push header before next header check in get_headers_response (#17766)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-11 10:16:54 +00:00
github-actions[bot]
6260c10c52 chore(deps): weekly cargo update (#17777)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-11 11:09:23 +02:00
georgehao
31dd1334e6 docs: remove deprecated difficulty check comment (#17781) 2025-08-11 08:42:50 +00:00
Matthias Seitz
5f0d33425e chore: msrv 1.88 (#17782) 2025-08-10 15:51:26 +00:00
Wolfgang Welz
d8f9f05e2c fix: add validation against parent header in reth-stateless (#17754) 2025-08-08 21:54:12 +00:00
morito
a9cd3fc83c chore: Fix typo tx_inf -> tx_info (#17763) 2025-08-08 18:12:27 +00:00
Snezhkko
c23e533779 refactor(witness): remove unnecessary curly braces in closure (#17752)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-08-08 02:55:10 +00:00
Brian Picciano
82bbed9795 feat: nix flake (#17757)
Co-authored-by: rob <mdnlss@outlook.com>
Co-authored-by: mdnlss <rob73hall@gmail.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-08-07 23:34:07 +00:00
Micke
9862481f18 fix(stages): use correct block number in error message (#17751) 2025-08-07 13:52:48 +00:00
Dan Cline
59e4a5556f feat(grafana): add state root duration histogram graph (#17745) 2025-08-06 22:23:50 +00:00
Fibonacci747
b5e65926a0 fix: add missing semicolon in wallet generation loop (#17739) 2025-08-06 18:30:18 +00:00
Matthias Seitz
baa03294cf fix: enforce propagate on getpooledtx (#17720)
Co-authored-by: Bharath Vedartham <vedabharath12345@gmail.com>
2025-08-06 20:18:05 +02:00
Arsenii Kulikov
f5c2502f55 feat: delay block -> payload conversions (#17681) 2025-08-06 17:53:37 +00:00
Léa Narzis
a4e85841d8 feat(chain-state): add IndexedTx helper (#17737) 2025-08-06 17:24:32 +00:00
queryfast
49f7543aa2 chore: remove redundant word in comment (#17728)
Signed-off-by: queryfast <queryfast@outlook.com>
2025-08-06 16:38:47 +00:00
Léa Narzis
bf2700aa3e feat: add jovian to OpChainSpec (#17671)
Co-authored-by: Emilia Hane <emiliaha95@gmail.com>
2025-08-06 11:14:04 +00:00
Matthias Seitz
62425b2643 chore: feature gate async (#17734) 2025-08-05 23:37:30 +00:00
radik878
f3a42bce55 fix: typo in file deletion error message (#17729) 2025-08-05 23:33:59 +00:00
Matthias Seitz
4f6f97d422 chore: rm trie dep (#17732) 2025-08-05 21:37:57 +00:00
Danno Ferrin
f052c46b84 feat: Execute execution-apis-tests in e2e tests (#17708) 2025-08-05 20:55:05 +00:00
Skanda Bhat
4d96ea0343 test(generators): add topics_count parameter to random_receipt (#17718) 2025-08-05 20:53:32 +00:00
Dan Cline
ac83c27531 fix(db-common): compute state root when initializing from genesis (#17731) 2025-08-05 20:30:30 +00:00
Danno Ferrin
944a5fc19f fix: execution-apis eth_syncing should return false (#17730) 2025-08-05 17:47:35 +00:00
Morty
48941e6db5 fix(GPO): calculate max_tx_gas_used corner case (#17679) 2025-08-04 21:58:02 +00:00
Alexey Shekhirin
1aee213133 deps: bump libmdbx to 0.13.7 (#17727)
Co-authored-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
2025-08-04 21:49:29 +00:00
Matthias Seitz
4db6adfedd chore: fix clippy docs (#17726)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-08-04 20:25:09 +00:00
Bharath Vedartham
6c37ef5635 chore: add flag to disable txpool gossip (#17724) 2025-08-04 18:23:20 +02:00
Matthias Seitz
d5f59070bb test: add ordering test (#17703) 2025-08-04 05:57:02 +02:00
github-actions[bot]
cf3ab02b2f chore(deps): weekly cargo update (#17716)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-08-03 08:35:33 +00:00
nk_ysg
3a201c24bd test(exex): add advance backfill range test (#17714) 2025-08-02 17:52:08 +00:00
Matthias Seitz
6234f61c35 fix: forward unknown hashes pre bedrock (#17709) 2025-08-01 22:14:00 +00:00
stevencartavia
f74efdb02b chore: fix clippy warnings (#17707) 2025-08-01 20:37:25 +00:00
Matthias Seitz
8553bf9cda feat: add all_transaction_hashes (#17700) 2025-08-01 18:37:20 +00:00
Federico Gimenez
db779ed9db fix: feature-gate std-only methods in sparse trie (#17706) 2025-08-01 17:10:24 +00:00
Federico Gimenez
7d660b57b0 refactor: move BasicEngineValidator creation into EngineApiValidatorBuilder trait (#17664)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-08-01 17:08:00 +00:00
Léa Narzis
2170f1b97e test(op-chainspec): add isthmus checks (#17698) 2025-08-01 11:08:24 +00:00
Matthias Seitz
54a4a23f64 fix: skip pending tx updates with higher prio value (#17699) 2025-07-31 18:55:08 +00:00
Matthias Seitz
3a2bf263d7 fix(txpool): also emit promoted pending tx on pool drift (#17695) 2025-07-31 18:54:44 +00:00
Dan Cline
ed56417237 feat(trie): add blinded node metrics in ProofTaskManager (#17685) 2025-07-31 18:54:38 +00:00
Léa Narzis
575a99fd22 chore: bump alloy-op-hardforks and op-alloy (#17697) 2025-07-31 17:57:56 +00:00
0xMushow
0f1ff20926 fix(config): default back gas limit to 45M on mainnet (#17690) 2025-07-31 11:44:59 +00:00
Matthias Seitz
f0051e1016 fix: use primitive header type for fetching header (#17691) 2025-07-31 11:37:40 +00:00
Arsenii Kulikov
568a7e065d refactor: stream transactions while executing payload (#17661) 2025-07-31 11:37:10 +00:00
Emilia Hane
98e30d4340 chore(sdk): Add example for building offline TraceApi with node builder (#17682)
Co-authored-by: ongyimeng <ongyimeng@gmail.com>
2025-07-31 09:39:37 +00:00
Acat
6c7f7f7e54 fix(pool): optimize canonical state change benchmark (#17688) 2025-07-31 09:08:18 +00:00
Matthias Seitz
dd3479ff62 chore: rm clone for witness (#17684) 2025-07-30 23:20:27 +00:00
Dan Cline
6a587a23e9 perf(trie): reuse allocated trie input in payload processor (#17371) 2025-07-30 21:05:35 +00:00
Dan Cline
26173f99b8 feat(trie): add ParallelSparseTrieMetrics (#17405) 2025-07-30 21:05:16 +00:00
Andrea Cerone
3772535220 fix: RPC: feeHistoryEntry should return 0.0 when blob_params.max_blob_count is zero (#17669)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-30 15:15:46 +00:00
stevencartavia
7001f7a33d feat: convert BlockExecutionErrors (#17573) 2025-07-30 12:44:20 +00:00
Sergey Melnychuk
dd4b2869d3 docs(example): extract full contract state from db (#17601)
Co-authored-by: sergey-melnychuk <sergey-melnychuk@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-30 11:36:30 +00:00
Ishika Choudhury
dac5868a10 feat: tracked State for local pending block (#17600)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-30 10:35:33 +00:00
Dan Cline
938d589b52 feat(merkle): add IntermediateRootState for storage root progress (#17548) 2025-07-30 01:09:36 +00:00
Matthias Seitz
a5f2d58650 perf: remove redundant metrics update (#17660) 2025-07-30 01:07:41 +00:00
Haardik
32e27c04df fix: createtx_env after applying state overrides for estimate_gas (#17668) 2025-07-29 18:29:42 +00:00
Soubhik Singha Mahapatra
056ae2abce feat: added max-readers flag for db (#17663) 2025-07-29 14:47:59 +00:00
Shiyas Mohammed
6923e051ee refactor(cli): replace From<Header> with CliHeader trait (#17656)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-29 14:04:31 +00:00
Brian Picciano
489f262d95 docs(trie): update ParallelSparseTrie documentation (#17538)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-07-29 11:05:42 +00:00
Matthias Seitz
12fb913383 perf: add benchmark for on_canonical_state_change (#17645) 2025-07-29 13:04:30 +02:00
Matthias Seitz
e38e247b40 perf: box larger futures (#17633) 2025-07-29 12:51:19 +02:00
Federico Gimenez
60bbd66319 refactor: move invalid block hook creation from LaunchContext to AddOnsContext (#17655) 2025-07-29 10:12:39 +00:00
Federico Gimenez
6487f0b906 feat: separate EngineValidator from PayloadValidator (#17641) 2025-07-29 07:24:16 +00:00
Matthias Seitz
f517e0159f perf: only notify if we have listeners (#17651) 2025-07-29 01:29:02 +02:00
Matthias Seitz
92020d9eb6 perf: can shortcircuit here if no peers (#17650) 2025-07-29 01:28:42 +02:00
Matthias Seitz
9ebe4e5653 chore: only cast basefee once (#17648) 2025-07-28 22:19:33 +00:00
Matthias Seitz
6e148e6b54 perf(txpool): rm unused best bijection (#17649) 2025-07-28 22:02:38 +00:00
Matthias Seitz
7ff8f3fff2 perf: avoid redundant notifications (#17647) 2025-07-28 21:22:34 +00:00
Léa Narzis
6430535dd6 fix(era-test): fix integration tests for era (#17646) 2025-07-28 19:53:35 +00:00
Brian Picciano
7f2bdbbdf8 perf(trie): Process multiproof reveals for storage tries in parallel (#17440) 2025-07-28 16:35:44 +00:00
strmfos
b1f1e9d711 docs: fix doc comments: clarify downloaded bytes and builder return condition (#17566) 2025-07-28 14:25:30 +00:00
Arsenii Kulikov
9d1af5a09c refactor: introduce Enginvalidator in tree (#17598)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-28 09:09:55 +00:00
Arsenii Kulikov
d392c3fdf2 chore: relax Cli::run_with_components (#17630) 2025-07-28 09:07:25 +00:00
github-actions[bot]
7ed3ab0ec6 chore(deps): weekly cargo update (#17628)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-27 16:40:27 +00:00
MozirDmitriy
812dd04b80 fix: correct comment for is_latest_invalid method (#17621) 2025-07-27 10:28:18 +00:00
crStiv
e63dafb3b5 docs: fix typos (#17624) 2025-07-26 14:39:23 +00:00
Matthias Seitz
8796a77cfa feat: support any network type in eth api builder (#17617)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-26 11:51:42 +00:00
anim001k
5748cf92a1 fix: Benchmarking Link in database.md (#17553) 2025-07-26 11:34:15 +00:00
Léa Narzis
3f3ccc3aa8 chore: remove duplicate deps (#17618) 2025-07-26 10:11:17 +00:00
Federico Gimenez
73091305ac chore: make clippy happy (#17620) 2025-07-26 09:53:49 +00:00
Starkey
0a416d33d7 docs: correct error comments in networking optimism modules (#17602) 2025-07-25 14:46:24 +00:00
Mablr
c549188a93 feat(rpc): add method to configure custom tokio runtime for RPC server (#17611) 2025-07-25 14:35:36 +00:00
Emilia Hane
a7cbf81b65 test(sdk): Add test for using node builder with noop components (#17560) 2025-07-25 11:34:24 +00:00
Léa Narzis
de5cbfe4cc test(era1): add more Receipt tests to verify decoding (#17592) 2025-07-25 11:31:41 +00:00
Matthias Seitz
876e964cbc chore: introduce engine module (#17591) 2025-07-24 08:42:18 +00:00
sashaodessa
dc90eb2ffe fix: typo in Cargo.toml (#17588) 2025-07-24 01:00:25 +00:00
Daniel Ramirez
e29707f0ee feat: Add IPC socket permission configuration (#17497)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-23 23:10:53 +00:00
Arsenii Kulikov
6b23818c76 refactor: small simplifications for tree types (#17589) 2025-07-23 22:39:36 +00:00
Micke
eaaf1ab4d8 fix: remove extra space in PostStateRootMismatch error message (#17590) 2025-07-23 20:41:57 +00:00
Starkey
bf36f95211 docs: fix the parameters (#17586) 2025-07-23 18:40:24 +00:00
Federico Gimenez
8bd6bf5dc1 feat(engine): add validate_payload and validate_block methods to EngineValidator trait (#17429) 2025-07-23 13:46:41 +00:00
Matthias Seitz
a72fe7a2d0 chore: move validation to standalone fns (#17582) 2025-07-23 13:44:33 +00:00
Matthias Seitz
9ff444ea9e fix(txpool): enforce encoded length check (#17581) 2025-07-23 13:34:51 +00:00
Tomass
c986441d87 fix: correct prune mode assignments in HistoryIndexingStages (#17575) 2025-07-23 13:03:18 +00:00
Arsenii Kulikov
ff76f66cd7 feat: abstraction for attributes -> NextBlockEnv conversion (#17570) 2025-07-23 11:39:38 +00:00
Léa Narzis
2c5a967898 feat(era): add era types (#17477) 2025-07-23 11:28:17 +00:00
Federico Gimenez
ed8eacfc5b refactor: move EngineValidator trait to reth-engine-tree (#17559) 2025-07-23 11:25:58 +00:00
Federico Gimenez
42c1947c8a chore(hive): update expected failures (#17580) 2025-07-23 10:10:23 +00:00
Federico Gimenez
81e0cb0385 feat(ci): add ignored tests management to hive workflow (#17577) 2025-07-23 10:01:52 +00:00
Rez
752637a5d7 feat: make CompactEnvelope trait public for external crate usage (#17576) 2025-07-23 08:10:14 +00:00
Alexey Shekhirin
58235419bb feat(reth-bench): add gas throughput chart to python script (#17572)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-22 18:51:11 +00:00
Léa Narzis
a1a4f2df7a refactor: use alloy Log::collect_for_receipt instead of macro to collect logs (#17569) 2025-07-22 17:19:12 +00:00
Federico Gimenez
8ce656f834 feat: add TreePayloadValidator (#17451) 2025-07-22 16:55:36 +00:00
Hai | RISE
868c421c5d feat(pool): return state of an added tx (#17442) 2025-07-22 14:51:03 +00:00
0xOsiris
c2098faea3 feat: make basic block builder pub (#17476) 2025-07-22 14:50:18 +00:00
nk_ysg
c1bfa31444 chore: rm unused file (#17563) 2025-07-22 14:50:07 +00:00
Amidamaru
2446c2fd42 perf: process chunks in par for get logs in block range eth_getLogs (#16675) 2025-07-22 14:41:39 +00:00
nk_ysg
ca645b40ee fix(exex): update batch threadshold calculate processed blocks (#17551) 2025-07-22 13:35:16 +00:00
Matthias Seitz
d8451e54e7 chore: bump version v1.6.0 (#17556) 2025-07-22 15:32:51 +02:00
Matthias Seitz
4fb1b8a614 ci: fix era sync test (#17561) 2025-07-22 12:51:59 +00:00
Alexey Shekhirin
a0de7f875e fix: convert latency to milliseconds in reth-bench script (#17555)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-22 11:22:49 +00:00
Arsenii Kulikov
53df3b803a feat: add AddOns for custom node example (#17544) 2025-07-22 13:04:37 +02:00
Matthias Seitz
48617dc33c ci: mark system eest tests as passing (#17542) 2025-07-22 12:58:20 +02:00
Matthias Seitz
3ab5bac40c chore: bump deps (#17554) 2025-07-22 12:57:48 +02:00
adust
58e6113584 feat: implement DatabaseProviderFactory for NoopProvider (#17134)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Emilia Hane <elsaemiliaevahane@gmail.com>
2025-07-22 09:34:53 +00:00
Arsenii Kulikov
7b76a1e00f chore: relax EthereumEthApiBuilder bound (#17546) 2025-07-22 08:47:27 +00:00
Alexey Shekhirin
39f1ee8795 feat(reth-bench): auto-create output directory (#17541)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-21 20:18:45 +00:00
Matthias Seitz
f532e49d2d chore(deps): bump inspectors 027 (#17543) 2025-07-21 20:17:46 +00:00
David Klank
1eff10d871 docs: fix typo in OpReceiptBuilder comment (#17540) 2025-07-21 18:11:34 +00:00
Brian Picciano
566ff51d04 perf(trie): Re-use storage tries across payloads (#17488)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-21 16:32:31 +00:00
PixelPilot
8c50d84187 docs: Fix broken fuzzing module link in database.md (#17523) 2025-07-21 15:17:54 +00:00
Arsenii Kulikov
0a8cb95eb9 feat: EthApiCtx::eth_api_builder (#17532) 2025-07-21 14:51:46 +00:00
Arsenii Kulikov
94c1c3f078 feat: ComponentsFor type alias (#17533) 2025-07-21 14:51:40 +00:00
cakevm
4bd2fd2dac refactor: rename AlloyRethProvider to RpcBlockchainProvider and move to storage (#17524) 2025-07-21 13:59:03 +00:00
Arsenii Kulikov
818e01773a feat: HeaderConverter (#17490)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-21 13:46:48 +00:00
Matthias Seitz
8f26b95643 chore: bump alloy-evm 015 (#17528) 2025-07-21 13:30:13 +00:00
Matthias Seitz
42f791924a fix: ensure required revm features are activated (#17526) 2025-07-21 12:34:33 +00:00
Matthias Seitz
5bc8589162 chore: extend exex ethapi example (#17481) 2025-07-21 14:50:04 +02:00
Matthias Seitz
84387f7c97 chore: sanity secp256k1+rayon activations (#17527) 2025-07-21 14:48:27 +02:00
Rez
ac2974867f feat: make payload validation functions generic over block header type (#17520) 2025-07-21 10:55:47 +00:00
Arsenii Kulikov
0b1f25e56e fix: logIndex in getBlockReceipts (#17519) 2025-07-21 12:40:45 +02:00
Avory
4639f94535 docs(trace): document trace format and response structure (#17517) 2025-07-21 09:44:27 +00:00
AJStonewee
5b01ca7738 docs: normalize dynamic CLI defaults in help generation (#17509) 2025-07-21 09:38:26 +00:00
Fallengirl
52a627bf4d docs: fix error in RawCapabilityMessage comment (#17411) 2025-07-21 09:36:32 +00:00
anim001k
a49fef80c1 fix: temporary file leak in atomic_write_file (#17505) 2025-07-21 09:30:24 +00:00
maradini77
c1ff79c074 fix: Refine Transaction Abstraction Link (#17502) 2025-07-21 09:28:32 +00:00
cakevm
c78f7e4501 feat(alloy-provider): compatibility for non-reth nodes (#17511) 2025-07-21 09:19:04 +00:00
Micke
54855e1798 docs: fix Sepolia URL description (#17495) 2025-07-21 09:17:38 +00:00
Matthias Seitz
bec451026d chore: migrate from codespell to typos (#17501) 2025-07-21 11:18:01 +02:00
Matthias Seitz
2c62cd8b46 ci: dont expect callenv to fail (#17516) 2025-07-21 11:14:46 +02:00
cakevm
8f38b42e3f feat(alloy-provider): implement receipts_by_block and other methods (#17507) 2025-07-20 11:04:48 +00:00
github-actions[bot]
1175f6c178 chore(deps): weekly cargo update (#17506)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-07-20 09:14:55 +00:00
anim001k
03ceac7e79 fix: refactor trace log key and comment formatting (#17459) 2025-07-19 11:08:34 +00:00
viktorking7
627658bda0 fix: correct documentation for block_mut method in SealedBlock (#17489) 2025-07-19 06:58:50 +00:00
NeoByteX
c1a33a2e6e docs: fix outdated file paths in database.md links (#17486) 2025-07-19 06:52:59 +00:00
Dan Cline
f0572fc9d3 perf(tree): add metric for payload conversion + validation latency (#17499) 2025-07-19 06:44:39 +00:00
Matthias Seitz
b0aed0dded fix: force set basefee to 0 if gasprice is 0 (#17496) 2025-07-18 18:12:43 +00:00
Matthias Seitz
81b93ac58b chore: downgrade threadpool init error (#17483) 2025-07-18 18:02:51 +00:00
cakevm
2ced409141 feat(alloy-provider): implement methods for BlockReaderIdExt (#17491) 2025-07-18 16:37:10 +00:00
ongyimeng
623920c63d fix: set correct timestamp when calculating basefee (#17493)
Co-authored-by: rose2221 <rose.jethani@nethermind.io>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-18 16:06:37 +00:00
ongyimeng
537ffeacac feat: continue opchainspec support (#17422)
Co-authored-by: rose2221 <rose.jethani@nethermind.io>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-18 14:44:28 +00:00
Brian Picciano
8fb0fbba73 chore: fix reth-engine-tree dev-dependencies import (#17487) 2025-07-18 14:27:18 +00:00
cakevm
0aef0c35c8 feat(alloy-provider): implement receipt_by_hash method (#17456) 2025-07-18 12:20:25 +00:00
Femi Bankole
0f449f2b39 feat: add Middleware generic to AuthServerConfig (#17373)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-18 11:54:36 +00:00
Rez
1b6f72321a feat: enable CLI support for custom block headers (#17441) 2025-07-18 10:21:51 +00:00
Matthias Seitz
ca116aa7b7 docs: add code example to extend_rpc_modules method (#17446)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jennifer <jenpaff0@gmail.com>
2025-07-18 09:57:07 +00:00
luory ✞
3c9ff6e157 fix: change hyperlink to reth_codec (#17437) 2025-07-18 09:56:59 +00:00
o-az
e089d902ca fix: edit link and config (#17453)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-18 09:30:52 +00:00
cakevm
3add4b1e3d feat(alloy-provider): implement transaction_by_hash method (#17479) 2025-07-18 09:14:12 +00:00
Matthias Seitz
87000e3359 chore: expose chainspec getter (#17461) 2025-07-18 11:14:36 +02:00
Yash Atreya
6927afac16 fix(docs): rustdocs module and nested links (#17478) 2025-07-18 07:49:38 +00:00
Matthias Seitz
65a63e129e feat: add envelope conversion for op (#17469) 2025-07-17 18:48:50 +00:00
Yash Atreya
0fff798cb6 fix(docs): change sdk overview path to /sdk (#17467) 2025-07-17 17:41:22 +00:00
bigbear
d4d3e22f79 fix: correct documentation for block_mut method in RecoveredBlock (#17472) 2025-07-17 15:47:55 +00:00
cakevm
1912ac7547 feat(alloy-provider): implement bytecode_by_hash method (#17471) 2025-07-17 15:39:47 +00:00
Matthias Seitz
425541d5a6 fix: use primitives headers for pruner (#17458) 2025-07-17 14:03:15 +00:00
Arsenii Kulikov
05fed6f991 feat: add helper for building pending block env (#17464) 2025-07-17 14:00:13 +00:00
cakevm
61a19c1bcb feat(alloy-provider): implement sealed_header method (#17455) 2025-07-17 13:56:21 +00:00
Léa Narzis
0b1d950f67 feat(tx-pool): add submit methods to TransactionPool (#17431) 2025-07-17 13:46:10 +00:00
strmfos
237e97ab83 docs: fix typo from optstack to opstack (#17454) 2025-07-17 13:41:33 +00:00
Arsenii Kulikov
7ccb37ebe3 refactor: move receipt conversions to RpcConverter (#17450) 2025-07-17 13:19:30 +00:00
cakevm
2afd109816 chore: correct spelling errors (#17462) 2025-07-17 13:19:19 +00:00
Rez
824e099055 feat: make engine API metered methods and utilities public (#17460) 2025-07-17 11:48:46 +00:00
Tomass
1e20871043 docs: fix typo in NetworkManager diagram (#17448) 2025-07-16 15:40:52 +00:00
Brian Picciano
802be64ef8 perf(trie): parallelize ParallelSparseTrie::reveal_nodes (#17372) 2025-07-16 15:22:32 +00:00
maradini77
825222f3b0 fix: Update JWT Secret Flag in Benchmark Documentation (#17447) 2025-07-16 14:46:18 +00:00
Matthias Seitz
f86959f4c1 docs: enhance direct database access documentation (#17445)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-16 14:38:10 +00:00
anim001k
2d1f8cdea1 fix: rename highest_static_fileted_block to highest_static_file_block (#17427) 2025-07-16 14:26:39 +00:00
viktorking7
fdefed3d79 fix: Update Docker Compose Docs Link in etc/README.md (#17414) 2025-07-16 13:44:06 +00:00
maradini77
8cbd119940 fix: Rename WitnessBlindedProvider to WitnessTrieNodeProvider (#17426) 2025-07-16 13:13:04 +00:00
Alexey Shekhirin
c01f230ffb chore(bin): missing --jwt-secret message in reth-bench (#17443) 2025-07-16 13:11:17 +00:00
cakevm
1179da2222 chore: simplify blob count extraction using new blob_count() method (#17439) 2025-07-16 10:56:13 +00:00
Rez
8e5efb36c3 feat: make revm_spec generic over header type (#17436) 2025-07-16 10:53:13 +00:00
Matthias Seitz
2643324668 chore: bump revm 273 (#17412) 2025-07-16 12:53:48 +02:00
adust
b0d05b69e2 refactor: remove unused sparse trie methods (#17433)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-16 08:00:16 +00:00
Dan Cline
76b19f37ab chore(consensus): refactor fork and ommers check into standalone fn (#17406) 2025-07-15 19:17:23 +00:00
Matthias Seitz
5d72088ecd chore: add txpool submit examples (#17420) 2025-07-15 17:34:06 +02:00
Alexey Shekhirin
cd737052c3 test(engine): enable parallel sparse trie in e2e tests (#17423) 2025-07-15 15:15:06 +00:00
maradini77
4364cd09bc refactor: use DefaultTrieNodeProviderFactory in state root calculation (#17425) 2025-07-15 14:57:33 +00:00
Matthias Seitz
55fa57bb11 chore: box import future (#17424) 2025-07-15 14:43:51 +00:00
Aliaksei Misiukevich
fe1d2d2425 refactor: BlindedPovider rename (#17208)
Signed-off-by: Aliaksei Misiukevich <taberlick@gmail.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-07-15 12:40:52 +00:00
fantasyup
fb9f3cce92 feat: Add support for ethstats (#16396)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-15 10:56:43 +00:00
Dan Cline
c667bc972e chore(txpool): use alloy-primitives HashMap for SenderIdentifiers (#17408) 2025-07-15 10:10:24 +00:00
Federico Gimenez
00d259dbea feat(sdk): make engine API (auth server) optional for custom consensus integrations (#17376) 2025-07-15 09:28:21 +00:00
cakevm
13c59dc1c4 feat(alloy-provider): implement header methods (#17402) 2025-07-15 09:20:58 +00:00
Yash Atreya
13d3d9b577 fix(docs): rustdoc search functionality (#17410)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-15 09:16:27 +00:00
Rez
253721d226 feat: add generic database support for Receipt<T> (#17409) 2025-07-15 09:13:14 +00:00
Roman Hodulák
73f2edb90c feat(rpc): Use generic transaction request as input (#17092)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-14 17:46:52 +00:00
Léa Narzis
52bd07b8fd refactor(rpc): change receipt to Cow<R> for build_receipt (#17382) 2025-07-14 17:15:55 +00:00
Léa Narzis
f83e29cdd3 docs(guides): add export era in history section (#17391) 2025-07-14 16:45:42 +00:00
Matthias Seitz
61bbe5ee29 perf: release listner lock early (#17400) 2025-07-14 15:23:10 +00:00
Acat
44cc67be00 perf: optimize txpool_status RPC by avoiding full transaction collection (#17392)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-14 14:07:32 +00:00
Acat
b9c63f6a10 fix(txpool): Propagate promoted transactions on account updates (#17396)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-14 11:55:08 +00:00
Matthias Seitz
4edd55aacd chore: make clippy happy (#17399) 2025-07-14 11:05:20 +00:00
github-actions[bot]
b19b1b0790 chore(deps): weekly cargo update (#17386)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-07-14 12:19:39 +02:00
nekomoto911
332c656617 perf(blob): optimize blob store gets (#17388) 2025-07-13 09:44:18 +00:00
maradini77
e5e42e79f9 fix: broken link to system requirements in troubleshooting guide (#17384) 2025-07-13 09:03:41 +00:00
Matthias Seitz
b08586946c chore: consolidate typo fixes from multiple PRs (#17387) 2025-07-13 08:57:45 +00:00
crStiv
e010ec290a docs: typos (#17283) 2025-07-13 08:35:00 +00:00
Léa Narzis
ac5d335796 feat: add into_logs() to TxReceipt for Receipt/OpReceipt (#17383) 2025-07-13 08:24:00 +00:00
crStiv
4767e1c251 docs: typos (#17335)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-12 15:55:12 +00:00
otc group
e9389dc640 docs: fix link to installation (#17375)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-12 13:44:56 +02:00
Léa Narzis
1d6a830803 feat: make Receipt generic over TxType (#17237)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-12 06:49:36 +00:00
Alexey Shekhirin
80767f1f30 perf(engine): clear accounts trie in background to not block state root (#17369) 2025-07-11 17:17:51 +00:00
Yash Atreya
f6839ac352 fix(docs): rustdocs search functionality (#17367) 2025-07-11 15:28:29 +00:00
Federico Gimenez
99baeeb413 chore(ci): unpin hive (#17370) 2025-07-11 13:27:07 +00:00
Dan Cline
96f8faf8f0 feat(trie): wire parallel trie config to PayloadProcessor (#17355) 2025-07-11 13:26:22 +00:00
Tomass
2060813af5 docs:fix spelling error in flowchart (#17346) 2025-07-11 12:41:34 +00:00
Dan Cline
bcc9ed461e chore(trie): impl HashedPostState::drain_into_sorted (#17362) 2025-07-11 12:05:15 +00:00
Dan Cline
00d117dd3e chore(trie): impl TrieUpdates::drain_into_sorted (#17361) 2025-07-11 12:05:03 +00:00
Yash Atreya
88ce599f65 fix(docs): update-book-cli job (#17365) 2025-07-11 11:05:51 +00:00
Dan Cline
cbf2ceb344 chore(consensus): remove outdated comment from validate_block_pre_execution (#17360) 2025-07-11 10:27:58 +00:00
Arsenii Kulikov
ea35ebfda2 feat: make ethereum Cli generic over node and remove debug commands (#17363) 2025-07-11 10:07:38 +00:00
Brian Picciano
98c68c1f8a perf(trie): reuse update action buffers in parallel sparse trie processing (#17352) 2025-07-11 09:28:45 +00:00
Federico Gimenez
f148cb3199 feat(rpc): specialise contiguous receipt queries for logs (#16441)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-11 09:21:08 +00:00
Dan Cline
06a7d05649 feat(cli): add enable-parallel-sparse-trie flag (#17357)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-07-10 23:47:25 +00:00
Arsenii Kulikov
4560ac4fe7 feat: support isthmus in reth-bench (#17351) 2025-07-10 23:43:32 +00:00
Dan Cline
a1dd69ee0e feat(trie): add TrieUpdates::clear (#17359) 2025-07-10 22:57:06 +00:00
Dan Cline
2b142fb198 feat(trie): add HashedPostState::clear (#17358) 2025-07-10 22:57:00 +00:00
Matthias Seitz
e263daebce chore: broadcast raw tx for opethapi (#17342) 2025-07-10 22:04:24 +00:00
Matthias Seitz
5479e115f9 chore: add helper to access invalid tx error (#17353) 2025-07-10 21:43:21 +00:00
Matthias Seitz
ee11b424fc chore: add helper convert into error object (#17354) 2025-07-10 21:05:03 +00:00
Dan Cline
2bf4646e2d chore(trie): add Either type for SparseTrieInterface (#17267) 2025-07-10 20:31:43 +00:00
fuder.eth
4668614f41 fix: Typographical Errors in Comments (#17333) 2025-07-10 20:24:38 +00:00
Amidamaru
ccc1493848 chore: make OpAddonsBuilder generic over middleware (#17347) 2025-07-10 20:00:01 +00:00
Matthias Seitz
2813776d4e chore: add helpers for disabling read-tx timeout (#17339)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-10 15:48:19 +00:00
Brian Picciano
6561e8ff46 chore(trie): Implement ParallelSparseTrie::find_leaf (#17326) 2025-07-10 15:04:29 +00:00
Brian Picciano
d7aa751379 feat: add graph selection option to newpayload latency comparison script (#17097) 2025-07-10 13:42:27 +00:00
Dan Cline
c274422bba feat(trie): add generics to SparseTrieTask (#17269)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-07-10 12:45:14 +00:00
Léa Narzis
60c86aeca2 feat(era1): add subcommand export-era (#17132)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-10 12:37:17 +00:00
Alexey Shekhirin
da2ab711d3 refactor: rename RevealedSparseTrie to SerialSparseTrie (#17345) 2025-07-10 12:06:29 +00:00
Federico Gimenez
26b7258d57 feat(ci): reorganize e2e tests with dedicated nextest filter and CI workflow (#17290) 2025-07-10 10:41:48 +00:00
Arsenii Kulikov
1a7c335a60 feat: re-execute command (#17330) 2025-07-10 10:21:51 +00:00
Yash Atreya
ea944fa75a fix(docs): broken rustdocs link (#17341) 2025-07-10 09:33:25 +00:00
Alexey Shekhirin
0f49e35fbb fix(trie): reset hashes of nodes along the path of removed leaf (#17331)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-07-10 09:27:23 +00:00
Matthias Seitz
0326dab81c chore: replace CacheDb with trait bounds (#17315) 2025-07-10 11:34:18 +02:00
Matthias Seitz
b3d722f1fd chore: simplify receipt envelope conversion (#17337) 2025-07-09 22:46:57 +00:00
Matthias Seitz
e3d2632be2 chore: remove type hints (#17336) 2025-07-09 22:46:46 +00:00
Matthias Seitz
b317431b77 chore: make tracer match non-exhaustive (#17338) 2025-07-09 22:29:23 +00:00
Matthias Seitz
4cd0c0d613 test: allow empty response (#17332) 2025-07-09 23:19:42 +02:00
Roman Krasiuk
959323fa6f feat(sync): track time spent in stages (#17321) 2025-07-09 22:44:49 +02:00
Léa Narzis
73f820af40 feat(sdk): add local_payload_attributes_builder to DebugNodeLauncher (#17297)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-09 19:19:25 +02:00
Alexey Shekhirin
9ec522d914 fix(trie): move masks to ParallelSparseTrie level (#17322)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-09 15:06:55 +00:00
Brian Picciano
7195eca1cb fix(trie): ParallelSparseTrie::update_leaf: add moved leaves to the prefix set (#17317) 2025-07-09 14:58:04 +00:00
nekomoto911
0cbb4823c9 perf(txpool): reduce one BTree lookup operation in add_transaction (#17313) 2025-07-09 14:52:44 +00:00
Alexey Shekhirin
b0cf23af44 fix(trie): duplicate hash mask check in sparse trie implementations (#17316)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-09 13:52:10 +00:00
Matthias Seitz
7e3eb03939 docs: add section for enabling pre-merge history expiry (#17320) 2025-07-09 15:44:15 +02:00
catconcat
700b1fd312 feat: make build_receipt infallable (#17287)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-09 13:29:46 +00:00
Matthias Seitz
e15be6584c chore: bump vdocs version (#17318) 2025-07-09 13:23:00 +00:00
Matthias Seitz
162568b297 chore: relax era export bounds (#17312) 2025-07-09 12:26:08 +02:00
Fallengirl
9d8248528b fix: correct typos (#17296) 2025-07-09 10:05:03 +00:00
Bilog WEB3
9a2c66a508 fix(docs): correct duplicated function reference in documentation (#17301) 2025-07-09 09:44:35 +00:00
stevencartavia
e238fc4823 feat: add --prune.receipts.premerge setting (#17295) 2025-07-09 09:14:39 +00:00
Starkey
818712124b docs: myrpc_ext.rs: fix namespace inconsistency in myrpcExt comments (#17300) 2025-07-09 09:10:22 +00:00
Roman Hodulák
cb42ac94b5 refactor(examples): Use TransactionEnvelope macro from alloy for CustomPooledTransaction in the custom-node example (#17302) 2025-07-09 09:09:10 +00:00
Dan Cline
15c6562636 chore(trie): remove Default bound from SparseTrieInterface (#17268) 2025-07-08 18:44:27 +00:00
Federico Gimenez
3ba16128af feat(test): add rpc e2e tests (#17284) 2025-07-08 17:23:14 +00:00
Roman Krasiuk
038ddd6614 perf: remove block cloning from is_descendant check (#17286) 2025-07-08 16:58:40 +00:00
Dan Cline
34f1a606b7 chore(trie): move from_root out of SparseTrieInterface (#17266) 2025-07-08 16:23:57 +00:00
Alexey Shekhirin
34b1d3d5cf ci: add https:// to image URLs in release.yml (#17280) 2025-07-08 13:51:31 +00:00
Alexey Shekhirin
eaf2e50f0f test(trie): add sparse trie tests to parallel sparse trie (#17258)
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-07-08 13:28:54 +00:00
Brian Picciano
bb1e44e8ab fix(trie): ParallelSparseTrie: remove leaves from upper subtrie when update in a lower (#17278) 2025-07-08 11:57:40 +00:00
Matthias Seitz
dbe7ee9c21 chore: bump 1.5.1 (#17277) 2025-07-08 13:31:56 +02:00
Merkel Tranjes
9fe0f25e7b docs: fix correction in storage reverts iterator test comment (#17276) 2025-07-08 11:15:59 +00:00
Roman Hodulák
62c5a57302 docs(guides): Add history expiry (#17274) 2025-07-08 10:31:19 +00:00
Dan Cline
7017627a9f chore(trie): add Send and Sync to SparseTrieInterface (#17270) 2025-07-08 10:15:40 +00:00
Dan Cline
11db28e9b7 feat(trie): add parallel sparse trie to TreeConfig (#17265) 2025-07-08 10:15:04 +00:00
Noisy
68309cac28 docs: update snapshot URL from downloads.merkle.io to snapshots.merkle.io (#17248)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-08 12:14:33 +02:00
Femi Bankole
38f02bb46e feat: include chain-id query param for etherscan v2 API (#17167)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-08 09:56:41 +00:00
Brian Picciano
e9a4222c8a fix(trie): correctly handle path field on cleared ParallelSparseTrie lower subtries (#17259) 2025-07-08 09:45:23 +00:00
Federico Gimenez
557836b93d feat(test): add apply_with_import method to e2e Setup (#17263) 2025-07-08 09:26:27 +00:00
Matthias Seitz
5645659d59 chore: bump alloy (#17275) 2025-07-08 09:24:56 +00:00
GarmashAlex
7c69ab1c8d docs: fix typo basfee → basefee in txpool.mmd (#17252) 2025-07-08 09:23:22 +00:00
VolodymyrBg
af004c0c0d chore: fix typos (#17251) 2025-07-08 09:22:52 +00:00
Galoretka
36d568a404 chore: Fix typo in block number reader comment (#17250) 2025-07-07 23:09:14 +00:00
Brian
1eccb5b7f6 fix: dead link (#17200) 2025-07-07 23:08:48 +00:00
Arsenii Kulikov
78bad34091 chore: check blob fee (#17272) 2025-07-07 23:02:09 +00:00
Matthias Seitz
e4574326ea chore: update size metrics once (#17242) 2025-07-07 21:50:37 +00:00
Alexey Shekhirin
09b4c5e987 fix(trie): add lower subtrie root paths to upper subtrie prefix set (#17262) 2025-07-07 19:56:32 +00:00
Federico Gimenez
e66caca5e9 feat(test): spin up e2e test nodes with imported data (#17261) 2025-07-07 19:13:32 +00:00
Federico Gimenez
dddde9eff9 feat(test): allow to create testing nodes with specific datadir (#17260) 2025-07-07 14:34:38 +00:00
Brian Picciano
468e925077 fix(trie): track branch node updates only in ParallelSparseTrie, not subtries (#17223) 2025-07-07 14:29:19 +00:00
crStiv
927e9c4661 docs: typos (#17246) 2025-07-07 13:38:42 +00:00
James Niken
1f557b399a docs: fix typo fileted to filtered (#17257) 2025-07-07 13:38:13 +00:00
Federico Gimenez
e70f6871b8 refactor: extract import functionality to separate module (#17253) 2025-07-07 13:26:20 +00:00
Alexey Shekhirin
a64dafdb54 fix(trie): ParallelSparseTrie::default should have an empty root node (#17256) 2025-07-07 11:46:23 +00:00
Max Bytefield
44b361a4e2 fix: correct comment in static file writer (#17254) 2025-07-07 09:26:45 +00:00
github-actions[bot]
651f1b97e5 chore(deps): weekly cargo update (#17247)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-07-06 09:42:47 +00:00
Fallengirl
8e800d6f73 docs: deleted extra duplicate environment.rs (#17249) 2025-07-06 09:19:27 +00:00
emmmm
3277333df6 docs: correction comments (#17244) 2025-07-05 10:50:18 +00:00
Udoagwa Franklin
1e9866c858 refactor(rpc): Arc PendingBlock internals (#17240)
Co-authored-by: frankudoags <frankudoags.com>
2025-07-05 08:26:29 +00:00
leopardracer
0592bd06a8 docs: Consistent Spelling for "Reuse" in Documentation (#17232) 2025-07-05 07:38:25 +00:00
bigbear
30a9690a4d fix: correct typo in ValidationApi comment (#17241) 2025-07-05 04:50:14 +00:00
Varun Doshi
beb8fac91b feat: add v5 flashbots relay block validation api for Fusaka (#17179)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-05 04:28:10 +00:00
Udoagwa Franklin
593477c673 refactor(txpool): Remove txhash from PoolUpdate (#17239)
Co-authored-by: frankudoags <frankudoags.com>
2025-07-05 04:24:56 +00:00
Micke
29c1a35e8d docs: fix typo mod.rs (#17233) 2025-07-04 19:12:05 +00:00
Galoretka
e948ab12fc fix: logical error in pruning test for storage_history PruneMode::Full (#17235) 2025-07-04 18:40:15 +00:00
fantasyup
ca36316f3b chore: add capabilities to NetworkStatus (#17236) 2025-07-04 18:13:52 +00:00
fantasyup
dcf3469d56 chore(doc): update exclude list for doc/cli (#17234)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-04 16:44:50 +00:00
Ritesh Das
89d0e6a919 feat(p2p): separate args for (header, body) (#17184)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-04 15:28:12 +00:00
leopardracer
47d2ed55d1 docs: fix typo in documentation comments (#17207) 2025-07-04 14:53:29 +00:00
Matthias Seitz
a46d0c0273 chore: use alloy traits for build receipt (#17211) 2025-07-04 16:52:59 +02:00
Fallengirl
19d4d4f4f3 docs: fix typos across documentation (#17212) 2025-07-04 14:34:25 +00:00
Galoretka
6bf87384ca Fix typo in EVM component documentation (#17227) 2025-07-04 12:53:42 +00:00
GarmashAlex
d101fb7b90 Update metrics documentation link to new official Reth docs (#17220) 2025-07-04 15:01:55 +02:00
Udoagwa Franklin
250f2104ca fix: Returns Arc<RecoveredBlock> in BlockAndReceiptsResult (#17213)
Co-authored-by: frankudoags <frankudoags.com>
2025-07-04 12:43:17 +00:00
Matthias Seitz
9a58ef18a7 chore: load kzg settings in background (#17224) 2025-07-04 12:41:45 +00:00
Arsenii Kulikov
cc46a27ebf chore: make receipt root mismatch log more useful (#17225) 2025-07-04 12:35:49 +00:00
Matthias Seitz
62b1d574e1 docs: improve NodeAddOns trait documentation (#17178)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-04 14:40:18 +02:00
MozirDmitriy
2962f2ea35 chore: fix typo in documentation comment in environment.rs (#17218) 2025-07-04 12:00:17 +00:00
Roman Hodulák
342bab5e82 deps: Upgrade alloy version 1.0.16 => 1.0.17 and all other deps minor versions (#17217)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-04 11:31:28 +00:00
Francis Li
5c47be25c4 feat(txpool): add minimal priority fee configuration for transaction pool (#17183) 2025-07-04 11:22:48 +00:00
Brian Picciano
3b92a23599 chore(trie): make SparseStateTrie generic with respect to trie implementation (#17205)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
2025-07-04 10:53:28 +00:00
Federico Gimenez
3457358880 chore: make clippy happy (#17219) 2025-07-04 10:35:23 +00:00
Matthias Seitz
e49bbe416e chore: bump evm 0.14 (#17206) 2025-07-03 20:39:13 +00:00
Matthias Seitz
3b1b2a0229 fix: dont double serialize resp (#17204) 2025-07-03 16:11:36 +00:00
Arsenii Kulikov
037be8d7ac chore(test): don't use EvmInternals::new (#17188) 2025-07-03 16:01:00 +00:00
Alexey Shekhirin
d026630746 perf(trie): implement SparseTrieInterface for ParallelSparseTrie (#17192)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-03 15:06:08 +00:00
Alexey Shekhirin
7a8a0da1a5 perf(trie): implement SparseTrieInterface for RevealedSparseTrie (#17191)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-03 15:01:18 +00:00
leopardracer
a550025a8f docs: fix typo in trie test comment (#17199) 2025-07-03 14:24:03 +00:00
Alexey Shekhirin
8c38c8b33a perf(trie): sparse trie trait (#17181)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-03 14:19:57 +00:00
Matthias Seitz
d949061fc0 chore: bump inspectors (#17198) 2025-07-03 15:09:29 +02:00
Brian Picciano
c2a2d7d449 feat(trie): ParallelSparseTrie: Compute lower subtrie hashes in parallel (#17173)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-03 10:03:34 +00:00
crStiv
c6e6a54d5b docs: typos (#17168) 2025-07-03 09:46:32 +00:00
PixelPilot
c2737957d7 docs: update snapshot URL from downloads.merkle.io to snapshots.merkle.io (#17190)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-03 09:30:26 +00:00
Dan Cline
f86445e094 feat(trie): add ParallelSparseTrie::update_leaf (#16956)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: Brian Picciano <me@mediocregopher.com>
2025-07-03 06:00:41 +00:00
Ferran Borreguero
60940dd243 Add bootnode cmd to cli runner (#17180)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-02 16:46:56 +00:00
Matthias Seitz
b286a61db8 chore: relax rpc middleware generic (#17174) 2025-07-02 14:52:16 +00:00
CrazyFrog
f54cef5e28 docs: update Grafana repository URL in monitoring documentation (#17175) 2025-07-02 13:58:42 +00:00
Rez
40fd91a068 feat: expose chain_spec field in LocalPayloadAttributesBuilder (#17151) 2025-07-02 13:55:04 +00:00
Aliaksei Misiukevich
3a3bc5f795 feat: trait impl for dbmock (#17124)
Signed-off-by: Aliaksei Misiukevich <taberlick@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-07-02 13:00:33 +00:00
Guro
9c045810ad docs: update metrics link in ethereum.mdx (#17170) 2025-07-02 11:38:23 +00:00
Brian Picciano
b1f9f716a8 chore(trie): factor out SparseTrieState (#17166)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-07-02 11:36:16 +00:00
Rebustron
a37917dd7a chore: removed link for book repo/layout.md (#17164) 2025-07-02 00:42:28 +00:00
Aliaksei Misiukevich
4199dd4676 feat: eth addons' middleware setter (#17159)
Signed-off-by: Aliaksei Misiukevich <taberlick@gmail.com>
2025-07-01 16:18:24 +00:00
Matthias Seitz
1c169257b6 chore: add debug for forkid mismatch (#17157) 2025-07-01 13:31:46 +00:00
Brian Picciano
7350c0151e fix(trie): correct ParallelSparseTrie lower subtrie path management (#17143) 2025-07-01 11:00:50 +00:00
Matthias Seitz
1bd5761b32 chore: bump revm (#17153)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-07-01 10:51:16 +00:00
Matthias Seitz
06b542c556 docs: fix broken links and typos (#17149) 2025-07-01 10:30:57 +00:00
Matthias Seitz
fcf58cb5ac fix: use safe math for withdrawals check (#17150) 2025-06-30 22:14:17 +00:00
Niran Babalola
7276dae4ee feat: introduce max_tx_gas_limit feature to enforce per-transaction gas limits (#17028)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-30 20:44:28 +00:00
youyyytrok
22d271a714 chore: fixed dead link in docs/.../sync-op-mainnet.mdx (#17146) 2025-06-30 20:14:58 +00:00
Brian Picciano
c9f20728f2 chore: pass provider into SparseTrie and SparseStateTrie via impl argument in update/remove_leaf (#17099) 2025-06-30 16:11:51 +00:00
Matthias Seitz
2819ab2c0e chore: promote trace to debug (#17144) 2025-06-30 15:05:45 +00:00
Arsenii Kulikov
bdb3debdf1 feat: remove redundant generic from EthereumEngineValidatorBuilder (#17108) 2025-06-30 14:07:39 +00:00
Roman Hodulák
c63459884e refactor: Replace reth recover_singer_with_buf with alloy (#17107)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-30 13:41:35 +00:00
Matthias Seitz
678b5cd1fc chore: rm unused either type (#17126) 2025-06-30 11:53:04 +00:00
Matthias Seitz
42eb672473 feat(optimism): add debug namespace endpoints to historical RPC forwarding (#17133) 2025-06-30 11:38:32 +00:00
Cypher Pepe
5409d3146b chore: fixed broken links in opstack.mdx (#17135) 2025-06-30 11:27:07 +00:00
Alex Pikme
515e2077b4 docs: fix spelling errors (#17139) 2025-06-30 11:25:09 +00:00
PixelPilot
bf260bfcb8 docs: update Engine API link in ethereum.mdx (#17137) 2025-06-30 11:10:46 +00:00
Matthias Seitz
772c65eab8 docs: add comprehensive documentation for LaunchContext type system (#17120) 2025-06-30 13:12:34 +02:00
Noisy
f67629fe91 docs: fix installation source URL in ARM devices guide (#17128)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-29 11:39:20 +00:00
adust
c08d41a2f7 docs: remove reference to ContextStatefulPrecompile in precompile cache example (#17130)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-29 11:35:24 +00:00
github-actions[bot]
63f6845152 chore(deps): weekly cargo update (#17131)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-06-29 11:22:08 +00:00
Hopium
a072de32d1 docs: fix broken tutorial link (#17127) 2025-06-29 11:13:01 +00:00
PixelPilot
a8fa75148c Replace Book with Docs references (#17125) 2025-06-28 18:27:03 +00:00
cakevm
6f1497cc18 feat(alloy-provider): implement fetch block (#16934) 2025-06-28 09:49:07 +00:00
kilavvy
0a8a4ac2ca docs: fix typo in section of node-components.mdx (#17105) 2025-06-28 09:43:22 +00:00
Matthias Seitz
31d0bb1d58 refactor: move consensus layer events to launch context (#17117) 2025-06-27 23:19:05 +00:00
Matthias Seitz
bfd745117b refactor: move ERA import source creation to LaunchContext (#17115) 2025-06-27 22:46:13 +00:00
Matthias Seitz
8fa928ec5f refactor: make get_healthy_node_client async (#17119) 2025-06-27 22:22:29 +00:00
Matthias Seitz
2c52fc3f93 chore: tell claude to run fmt before opening a pr (#17118) 2025-06-27 22:04:05 +00:00
Matthias Seitz
5c82812072 refactor: move ExEx launching to LaunchContext method (#17114) 2025-06-27 22:02:21 +00:00
strmfos
8980944997 docs: fix error in config.rs (#17113) 2025-06-27 21:58:13 +00:00
Arsenii Kulikov
fae433319c refactor: simplify handling of NetworkPrimitives in CLI (#17112) 2025-06-27 19:39:07 +00:00
Matthias Seitz
34d95414db fix: track earliest available block correctly (#17095) 2025-06-27 16:33:45 +00:00
Matthias Seitz
40e8fb6d4d docs: fix typos across documentation (#17102)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 15:33:52 +00:00
Arsenii Kulikov
e89ea409e4 feat: relax EthereumNode ChainSpec bounds (#17106) 2025-06-27 15:26:16 +00:00
Arsenii Kulikov
b2000155de feat: use Header AT in EthChainSpec::next_block_base_fee (#17101) 2025-06-27 14:37:23 +00:00
Roman Hodulák
5f8aa53c6c deps: Upgrade alloy and op-alloy versions 1.0.13 => 0.18.7 and 0.18.9 (#17103)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-27 14:26:15 +00:00
Matthias Seitz
43b091b0e6 docs: debug clarify healtyh node rpc url setting (#17100) 2025-06-27 14:18:03 +00:00
Matthias Seitz
1d9a255f18 chore: rm redundant bounds (#17104) 2025-06-27 14:17:24 +00:00
kevaundray
384e64ed00 feat: Add StatelessTrie trait for reth-stateless (#17098)
Co-authored-by: Roman Krasiuk <rokrassyuk@gmail.com>
2025-06-27 13:05:00 +00:00
Alexey Shekhirin
0ae4238789 feat: add per-address metrics for precompile cache (#17058)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 12:53:47 +00:00
Yash Atreya
a33be2e02e chore(docs): move to docs from book (#17096)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-27 12:48:45 +00:00
Matthias Seitz
8066771473 fix: use safe conversions for number and timestamps (#17093) 2025-06-26 23:38:26 +00:00
Brian Picciano
cfdd173afc perf(trie): implement remove_leaf for ParallelSparseTrie (#17035) 2025-06-26 16:33:42 +00:00
Femi Bankole
0e832c2c30 chore: replace revm_utils with alloy_evm helpers (#17046)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-26 15:28:16 +00:00
Bilog WEB3
8aeaa4ef35 docs: error fixes for clarity (#17091) 2025-06-26 15:10:32 +00:00
Rez
07b19553a1 feat: centralize EIP-1559 base fee calculation in EthChainSpec (#16927)
Co-authored-by: rose2221 <rose.jethani@nethermind.io>
Co-authored-by: Rose Jethani <101273941+rose2221@users.noreply.github.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-26 14:38:31 +00:00
Varun Doshi
d635035be7 feat: punish malicious peers (#16818)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-26 12:16:34 +00:00
Matthias Seitz
3c2ef0e28f chore: bump version in docs (#17085) 2025-06-26 14:30:21 +02:00
Yash Atreya
a7e19963fb feat(docs): serve rustdocs (#17084)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-26 12:06:01 +00:00
Matthias Seitz
61e38f9af1 chore: bump version 1.5.0 (#17083) 2025-06-26 11:50:41 +00:00
Matthias Seitz
9b3f2576d1 feat: add blanket impl for Receipt trait (#17082) 2025-06-26 11:43:52 +00:00
Yash Atreya
777ee2de29 fix(docs/sdk): heading hierarchy (#17079) 2025-06-26 11:15:59 +00:00
Alexey Shekhirin
2e799062f1 feat: convert reth-bench scripts to use uv script format (#17078)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-26 10:53:23 +00:00
Skylar Ray
55840bb32b docs: error fixes for clarity (#17062) 2025-06-26 10:49:28 +00:00
Yash Atreya
471f6a375e fix(docs): redo system reqs, fix links, rebrand to docs (#17071) 2025-06-26 10:07:49 +00:00
Matthias Seitz
f9e6b10730 chore: bump alloy 1.0.13 (#17072) 2025-06-26 10:58:39 +02:00
Matthias Seitz
4e4937ffd1 feat: include eth_sendRawTransactionSync in eth namesapce (#17070) 2025-06-26 08:30:31 +00:00
Maxim Evtush
988c0f0c53 docs: typo in comment for get_pending_transactions_by_origin (#17065) 2025-06-26 08:17:22 +00:00
Matthias Seitz
142c6342e3 fix(cli): propagate max-tx-input-bytes setting (#17066) 2025-06-25 21:49:41 +00:00
Alexey Shekhirin
bde35a329c docs: add libmdbx restriction to CLAUDE.md (#17060)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-25 21:20:29 +00:00
Roman Hodulák
7349abd126 refactor(examples): Use TransactionEnvelope macro from alloy for CustomTransaction in the custom-node example (#17057) 2025-06-25 21:16:09 +00:00
Matthias Seitz
79d737e6c8 chore: bump alloy patches (#17067) 2025-06-25 21:11:24 +00:00
0xsensei
f6278a1989 feat(trie): add assert_eq_parallel_sparse_trie_proof_nodes (#17052)
Co-authored-by: Aditya Pandey <adityapandey@Adityas-MacBook-Air.local>
2025-06-25 21:05:54 +00:00
Maximilian Hubert
30110bca04 docs: fix typo "takes effect" (#17053) 2025-06-25 15:21:49 +00:00
Eric Woolsey
7267734d5c chore: delete reth-performance dashboard (#16635) 2025-06-25 14:20:24 +00:00
Brian Picciano
eef134521c chore: Add precompile cache hit rate graph to grafana overview (#17055) 2025-06-25 13:54:37 +00:00
Alexey Shekhirin
56f6da5ed1 feat: make jwt-secret argument consistent across reth-bench commands (#17050)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-25 13:13:22 +00:00
Matthias Seitz
51bda0dcb7 chore: use earliest block number (#17044) 2025-06-25 11:47:10 +00:00
Matthias Seitz
14c6b5f5e3 chore: use payload_builder target (#17049) 2025-06-25 11:26:39 +00:00
Alexey Shekhirin
d2b4dd5611 perf(trie): implement ParallelSparseTrie::root method (#17030)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <assistant@anthropic.com>
2025-06-25 10:10:00 +00:00
Kendra Karol Sevilla
5221b6d281 chore: fix typo execution.rs (#17004) 2025-06-25 10:01:36 +00:00
Léa Narzis
4afe7906d2 feat: introduce reth era export (#15909)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-25 08:28:31 +00:00
Yash Atreya
a78be9c133 fix(docs): banner on landing (#17048) 2025-06-25 07:56:24 +00:00
futreall
5f688bb831 docs: fix errors and correction (#17047) 2025-06-25 07:44:37 +00:00
Yash Atreya
48743963fc fix(docs): broken links for images on landing (#17043) 2025-06-24 09:45:48 -07:00
Yash Atreya
eb5e367152 chore(ci): rm concurrency from book workflow (#17038) 2025-06-24 15:46:37 +00:00
FT
df13c6e58b docs: fix typo in transaction expiration comment (#17037) 2025-06-24 15:29:57 +00:00
Alex Pikme
6d04e66d39 chore: fix spelling errors (#17029) 2025-06-24 15:12:35 +00:00
FT
05d44bba90 refactor(rpc): replace ExtendedTxEnvelopeRepr with ExtendedRepr in serde_bincode_compat (#17033) 2025-06-24 15:11:37 +00:00
Matthias Seitz
8485d99dfa feat: add --rollup.historicalrpc CLI argument for op-reth (#16941)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-24 15:10:53 +00:00
Yash Atreya
599de19fb3 chore(book): migrate to vocs (#16605)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-24 15:00:56 +00:00
otc group
f7b26ade33 fix: correct typo “reseipt” → “receipt” in serde_bincode_compat tests (#17034) 2025-06-24 12:59:24 +00:00
Matthias Seitz
f5680e74d5 feat: prune pre merge transaction files (#16702) 2025-06-24 12:41:22 +00:00
Alexey Shekhirin
b8e3f673dd chore(trie): rephrase the log about storage proof task result sending (#17032) 2025-06-24 11:16:32 +00:00
Alexey Shekhirin
e4281b345d refactor(trie): introduce SparseSubtrieInner::rlp_node method (#17031) 2025-06-24 10:53:05 +00:00
Roman Hodulák
b011ad0d8d feat(rpc): Propagate the RPC transaction request from Network and RpcTypes (#17025) 2025-06-24 09:22:08 +00:00
Matthias Seitz
265700cf2f feat: add configurable RPC middleware to RpcAddOns (#17024) 2025-06-24 08:35:19 +00:00
Federico Gimenez
71b33f12cc chore: enable state root task in engine tree unit tests (#17023) 2025-06-24 08:30:08 +00:00
Léa Narzis
3f5486d9c6 feat(tx-pool): add getter methods for EthTransactionValidator internal fields (#17022)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-24 08:16:09 +00:00
Matthias Seitz
b719bb7d56 docs: update outdated validtor docs (#17027) 2025-06-24 10:16:38 +02:00
Matthias Seitz
faa9d3756b chore: remove unused for<'a> (#17026) 2025-06-23 21:47:16 +00:00
Matthias Seitz
cf8ff9829c feat: add codec re-exports to reth-op and reth-ethereum (#17020) 2025-06-23 20:29:25 +00:00
Matthias Seitz
2563a168ee chore: re-export op hardforks from op chainspec (#17018) 2025-06-23 20:29:04 +00:00
Alexey Shekhirin
474096146a perf(trie): SparseSubtrie::update_hashes (#16943) 2025-06-23 18:38:25 +00:00
Matthias Seitz
eefbc953a0 feat: allow access to db via NodeBuilder (#17021) 2025-06-23 17:11:14 +00:00
Brian Picciano
dd5501336c perf(trie): Place the root nodes of the lower SparseSubtries in those tries (#17011)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-23 16:48:39 +00:00
fuder.eth
2462eb2f6a refactor(rpc): rename crate reth_rpc_types_compat → reth_rpc_convert (#17019) 2025-06-23 18:26:50 +02:00
Alexey Shekhirin
3916c8571c revert: test: special case for nibbles implementations of Compact (#17006) (#17012) 2025-06-23 18:26:06 +02:00
Roman Hodulák
5eed5c6d73 feat(rpc): Add TransactionRequest into RpcTypes (#17017) 2025-06-23 15:57:15 +00:00
Roman Hodulák
fd101ea955 refactor(rpc): Rename crate reth_rpc_types_compat => reth_rpc_convert (#17013) 2025-06-23 15:14:25 +00:00
Alexey Shekhirin
34fe4c7c55 perf: U256 nybbles (#16727)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-23 14:33:23 +00:00
Roman Hodulák
3f3c2914ac docs(rpc): Add documentation for RpcConverter (#17010) 2025-06-23 14:28:12 +00:00
Matthias Seitz
dc67f0237f chore: rm standalone fn (#17007) 2025-06-23 16:22:01 +02:00
Roman Hodulák
ff5787da81 refactor(rpc): Rename TransactionCompat => RpcConvert (#17009) 2025-06-23 13:53:43 +00:00
Matthias Seitz
e957971807 docs: rephrase RpcNodeCore docs (#17005) 2025-06-23 13:40:09 +00:00
Krishang Shah
0d5edc240b chore: add size field in the new_header_stream method (#17008) 2025-06-23 13:33:48 +00:00
Alexey Shekhirin
93a407b560 test: special case for nibbles implementations of Compact (#17006) 2025-06-23 13:21:27 +00:00
Arsenii Kulikov
9d61cf8130 chore: simplify RpcConverter (#17002) 2025-06-23 12:45:38 +00:00
Matthias Seitz
023c5d7d98 chore: rm unused eof variant (#17001) 2025-06-23 11:59:38 +00:00
Matthias Seitz
974692d7d9 docs: improve ConfigureEvm trait documentation (#16937)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-23 11:01:36 +00:00
Federico Gimenez
8ce99797a5 refactor: introduce OpFullNodeTypes helper trait to reduce bound duplication (#16431) 2025-06-23 10:28:37 +00:00
Arsenii Kulikov
88edd52649 feat: bump revm v26 (#16969)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-23 09:16:16 +00:00
Matthias Seitz
4f5ad18682 docs: improve payload primitives documentation (#16986) 2025-06-23 11:34:09 +02:00
Federico Gimenez
2ba3d134a9 feat(test): rewrite test_engine_tree_live_sync_transition_eventually_canonical using e2e framework (#16972) 2025-06-23 08:37:13 +00:00
Skylar Ray
9f710adee0 chore: fix typo bootnode.rs (#16995) 2025-06-23 08:36:47 +00:00
Soubhik Singha Mahapatra
55fdebdc0e chore: changed example command (#16993) 2025-06-22 17:28:39 +02:00
Léa Narzis
18cd06f306 docs: add reth_fs_util suggestion instead of std::fs to claude doc helper (#16992) 2025-06-22 16:35:19 +02:00
github-actions[bot]
0c862caa91 chore(deps): weekly cargo update (#16987)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2025-06-22 13:38:16 +02:00
futreall
45a63c615a docs: fix error in HARDFORK-CHECKLIST.md (#16989) 2025-06-22 11:09:29 +00:00
Matthias Seitz
09f740d930 chore: use from conversion for txkind (#16990) 2025-06-22 10:49:22 +00:00
Matthias Seitz
a0c3bbf920 feat: add rpc header compat (#16988) 2025-06-22 09:34:06 +00:00
Roman Hodulák
0131267e3f feat(rpc): Replace associated type Transaction with Network in TransactionCompat (#16973) 2025-06-22 07:32:15 +00:00
Matthias Seitz
7e9f141604 chore: simplify test HttpClient implementations (#16985) 2025-06-21 14:26:13 +00:00
Matthias Seitz
02bbcc8367 fix: use empty withdrawals if parent has withdrawals root (#16980) 2025-06-21 14:03:44 +00:00
Matthias Seitz
6ee5006ac0 chore: relax localpending block bounds (#16979) 2025-06-21 13:19:01 +00:00
Léa Narzis
9ce49a981e chore(era): complete doc for ClientWithFakeIndex (#16984) 2025-06-21 12:29:31 +00:00
Matthias Seitz
ba16804471 feat: add From impl for RecoveredBlock from blocks with recovered transactions (#16983) 2025-06-21 11:37:17 +00:00
Matthias Seitz
9cf910ce2e refactor: remove CallFees re-export and relocate tests (#16981) 2025-06-21 09:46:52 +00:00
Matthias Seitz
9939164d07 chore: remove unused features (#16963) 2025-06-21 09:38:02 +02:00
Emilia Hane
10f8344862 chore(sdk): Add default for noop component (#16570)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-21 06:54:24 +00:00
kilavvy
83802249ea fix: Improve comment in historical RPC tests (#16971) 2025-06-21 08:35:22 +02:00
0xMushow
b786710816 feat(transaction-pool): enforce EIP-2681 (#16967) 2025-06-21 04:54:27 +00:00
Amidamaru
f917cf0eb2 perf(rpc): optimize EVM reuse in eth_estimateGas (#16958) 2025-06-21 04:40:53 +00:00
Roman Hodulák
1339e8770e feat(era): Attach file name and path to checksum error (#16974) 2025-06-20 21:19:58 +00:00
Matthias Seitz
9961d46bb1 fix: add missing historical RPC endpoints for Optimism pre-bedrock (#16976)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-20 17:56:43 +00:00
Dan Cline
85e6e979c2 chore(merkle): add debug log inside incremental loop (#16977) 2025-06-20 17:55:40 +00:00
Federico Gimenez
8f16e2199f chore: resolve unused import warning in reth RPC API subscription attribute (#16975) 2025-06-20 15:43:13 +00:00
Arsenii Kulikov
0ce46431fd chore: propagate inner error in ef tests (#16970) 2025-06-20 12:59:24 +00:00
Matthias Seitz
15529e7923 revert: "ci: pin nextest version" (#16890)
Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
2025-06-20 12:35:07 +00:00
Matthias Seitz
b45f84d78c fix: check if dir exists before removing (#16968) 2025-06-20 12:17:35 +00:00
Brian Picciano
f9b4eba3b7 chore(trie): Replace magic numbers in ParallelSparseTrie code (#16960)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-20 11:23:43 +00:00
Matthias Seitz
343983d0a1 chore: feature gate all op rpc types compat impl (#16964) 2025-06-20 09:51:16 +00:00
Matthias Seitz
24f0365340 chore: use revm tx trait directly (#16961) 2025-06-20 10:43:21 +02:00
Matthias Seitz
5a5b58c6ca chore: update codeowners (#16957) 2025-06-20 02:53:56 +00:00
Matthias Seitz
f318fc26a3 chore: remove duplicate callfees (#16955) 2025-06-19 22:31:23 +00:00
Federico Gimenez
110cb84bdc feat(test): rewrite test_engine_tree_live_sync_fcu_extends_canon_chain using e2e framework (#16949) 2025-06-19 21:16:11 +00:00
Alexey Shekhirin
ea5ffa51fc bench: disable sparse trie update bench as it's flaky (#16953) 2025-06-19 20:10:10 +00:00
Alexey Shekhirin
9231652c6c perf(trie): ParallelSparseTrie::update_subtrie_hashes boilerplate (#16948) 2025-06-19 19:29:06 +00:00
Shane K Moore
f59a82e4c6 chore: add node synced helper (#16928) 2025-06-19 18:46:34 +00:00
Alexey Shekhirin
ad68177508 chore: move parallel sparse trie to its own crate (#16950) 2025-06-19 18:39:05 +00:00
nekomoto911
54cd8b34a4 perf: Reduce unnecessary MDBX transaction creation when constructing StateProvider (#16884) 2025-06-19 14:14:07 +00:00
Alexey Shekhirin
0288a2d14d bench(trie): prepare trie outside of routine, use large input size (#16945) 2025-06-19 13:54:47 +00:00
Brian Picciano
4be2226235 perf: Reuse CachedPrecompileMetrics across block executions (#16944) 2025-06-19 13:52:05 +00:00
Hai | RISE
6aa73f1480 feat: require only account & bytecode reader for tx validation (#16930) 2025-06-19 15:58:57 +02:00
Brian Picciano
ebd57f77bc perf(trie): ParallelSparseTrie::reveal_node (#16894)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-19 13:13:12 +00:00
Rose Jethani
aa725dd0cf feat: add Historical RPC Forwarder Service (#16724)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-19 14:21:05 +02:00
Matthias Seitz
2f9c5ace37 test: flaky connection test (#16939) 2025-06-19 13:59:20 +02:00
Alexey Shekhirin
55dd16ac20 perf(trie): box subtries in parallel sparse trie (#16938) 2025-06-19 11:23:32 +00:00
Solar Mithril
2ebb519287 chore: Expose payload_id (#16931)
Co-authored-by: Solar Mithril <solarmithril@pm.me>
2025-06-19 13:13:52 +02:00
Matthias Seitz
53cd4b2397 chore: add type alias for PayloadAttributes (#16933) 2025-06-19 12:38:29 +02:00
Maxim Evtush
20800be462 docs: Fix Typo in DebugNode Trait Documentation (#16932) 2025-06-19 10:22:41 +02:00
Hai | RISE
cdb5b69d24 chore(tx-validation): remove redundant validate methods (#16929) 2025-06-19 10:21:57 +02:00
Alexey Shekhirin
67e3c11135 perf(trie): ParallelSparseTrie::get_changed_subtries method (#16908)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-06-18 22:51:10 +00:00
Federico Gimenez
57281834ec feat(test): rewrite test_engine_tree_buffered_blocks_are_eventually_connected using e2e framework (#16830) 2025-06-18 21:25:48 +00:00
Matthias Seitz
c0c2eeaa36 chore: remove unused approx_capacity_get_pooled_transactions_req (#16907)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-18 21:24:03 +00:00
Dan Cline
b5f5a3a069 chore(net): document test_trusted_peer_only, fix incoming local_addr (#16925) 2025-06-18 21:22:26 +00:00
Matthias Seitz
fea711e7de deps: update alloy dependencies to latest patch versions (#16922)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-18 23:23:27 +02:00
Dan Cline
8bcf1906f6 chore(engine): add log showing which root algorithm is being used (#16924) 2025-06-18 22:55:44 +02:00
Dan Cline
dbe828546d chore(trie): add more stubs for ParallelSparseTrie (#16918) 2025-06-18 19:53:39 +00:00
FT
5cbb1f650b fix: typos in documentation and source code (#16916) 2025-06-18 21:51:13 +02:00
Matthias Seitz
de56409a51 chore: add missing receipts69 handling (#16913) 2025-06-18 21:50:39 +02:00
Matthias Seitz
d9512e2ca6 docs: improve transaction-related trait documentation (#16920) 2025-06-18 21:46:42 +02:00
cakevm
9d7f0b2e2b feat(alloy-provider): stub out required trait implementations (#16919) 2025-06-18 19:30:45 +00:00
Dan Cline
5f45e30025 docs(trie): mention that SparseSubtrie path is a full path (#16917) 2025-06-18 18:30:50 +00:00
Matthias Seitz
2fa02b7931 fix: allow eth69 block propagation (#16915) 2025-06-18 17:50:34 +00:00
Femi Bankole
e3a78c01e1 feat: load KZG settings on EthTransactionValidator startup (#16889) 2025-06-18 17:22:06 +00:00
Matthias Seitz
da42c0c582 fix: prevent invalid range in fee_history when newest_block is pending (#16910)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-18 17:11:28 +00:00
Roman Hodulák
f6ad01de4a refactor(rpc): Delegate FromConsensusTx conversion for EthereumTxEnvelope to alloy (#16909) 2025-06-18 16:34:22 +00:00
Soubhik Singha Mahapatra
a86e18fa1b chore: added all version const (#16880)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-18 16:02:14 +00:00
Brian Picciano
96c7381932 feat(trie): Embed a SparseSubtrie into the ParallelSparseTrie as its upper trie (#16905) 2025-06-18 15:48:27 +00:00
Alexey Shekhirin
8d8d197466 feat: sparse trie update benchmarks (#16748) 2025-06-18 15:28:00 +00:00
Matthias Seitz
e81747371d docs: improve reth-primitives-traits documentation (#16870) 2025-06-18 15:23:57 +00:00
Alexey Shekhirin
9002d3a203 feat(trie): sparse subtrie type (#16903) 2025-06-18 15:12:40 +00:00
Alexey Shekhirin
d25b11fd77 chore: add @mediocregopher to trie codeowners (#16904) 2025-06-18 15:09:44 +00:00
Dan Cline
9bb5558616 feat: add from_root for ParallelSparseTrie (#16865) 2025-06-18 14:28:44 +00:00
Alexey Shekhirin
d29f83e563 feat: add newPayload throughput and total gas charts to Grafana (#16901) 2025-06-18 14:26:47 +00:00
Ashutosh Varma
8758d82456 feat: add abstractions for permit in metered channel (#16882) 2025-06-18 16:23:57 +02:00
0xNarumi
21cf573d97 fix: move bytecode_by_hash from StateProvider to a dedicated BytecodeReader (#16886) 2025-06-18 13:29:11 +00:00
Krishang Shah
04f09f9208 chore(tx-pool): use max_blobs_per_tx in validating eip4844 txs (#16888)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-18 13:24:01 +00:00
Roman Hodulák
95cd15e595 perf(era): Skip download if ERA file with verified checksum exists (#16804) 2025-06-18 13:20:13 +00:00
Ishika Choudhury
7c0e95bd37 feat: added experimental eth_sendrawtransaction endpoint (wip) (#16683)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-18 13:00:59 +00:00
Alessandro Mazza
5437d2614d test: add walk_dup test with not existing key (#16562) 2025-06-18 14:47:49 +02:00
Alexey Shekhirin
239aa08923 ci: pin nextest version (#16887) 2025-06-18 14:01:32 +02:00
Matthias Seitz
619c8917ca docs: enhance DebugNode trait documentation (#16872)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-06-18 08:59:57 +00:00
Krishang Shah
5dc47e149b fix(op-reth, rpc): eth_getBlockReceipts err for genesis block in op-reth (#16879) 2025-06-18 08:54:37 +00:00
Yeongjong Pyo
8dbbe7bda4 fix(test): handle getting the last base_fee_per_gas (#16881) 2025-06-18 08:33:49 +00:00
Shane K Moore
55134742d6 chore: add block gas limit to block added log (#16875) 2025-06-18 00:24:54 +00:00
Odinson
671f0fe566 feat: introduced loop with range of chunks in the incremental root stage (#16178)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com>
2025-06-17 21:37:27 +00:00
0xsensei
a808533f35 fix(pipeline): prevent unwind beyond history limits (#16593)
Co-authored-by: Aditya Pandey <adityapandey@Adityas-MacBook-Air.local>
2025-06-17 21:33:58 +00:00
rotcan
cb11ab0475 feat(engine): Compare sorted trie updates in witness invalid block hook#15689 (#16481) 2025-06-17 20:31:08 +00:00
Suyash Nayan
1d01f2a46d feat(trie): Decode storage proofs in parallel tasks (#16400)
Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
2025-06-17 20:28:07 +00:00
Dan Cline
243a523149 feat: add CLAUDE.md (#16864) 2025-06-17 20:26:10 +00:00
Eric Woolsey
5c6f236e92 feat: use configurable instance label for overview dashboard (#16633) 2025-06-17 18:29:40 +00:00
Brian Picciano
759101d350 feat: introduce script to compare reth-bench latency CSVs (#16862) 2025-06-17 18:29:37 +00:00
Ishika Choudhury
e8d305bcce refactor: used new fn earliest_block_number for ::Earliest tag (#16859) 2025-06-17 18:12:53 +00:00
Josh_dfG
051cef53bc chore: add rpc-compat feature in reth primitives-traits (#16608)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-17 16:14:11 +00:00
Alessandro Mazza
58cfd2e02b fix(provider): fix doc comments errors (#16749)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-17 15:55:47 +00:00
Eth161dm
7f815bbd8d fix: dead link in tracking-state.md (#16857) 2025-06-17 17:32:33 +02:00
Matthias Seitz
8857c5da03 fix: handle forced propagations (#16845) 2025-06-17 17:32:01 +02:00
Roman Hodulák
d6eb789109 test(chainspec): Test conversion from blob params in genesis config (#16854) 2025-06-17 14:47:34 +00:00
Matthias Seitz
dd1d426555 perf: avoid duplicate peer lookup (#16846) 2025-06-17 14:40:08 +00:00
Roman Hodulák
bcb4fd3711 feat(rpc): Replace manual IntoRpcTx implementation with FromConsensusTx using an additional generic (#16855) 2025-06-17 14:06:49 +00:00
Roman Hodulák
576cef4b13 feat(rpc): Implement FromConsensusTx for generic OpTransaction (#16832) 2025-06-17 13:33:10 +00:00
nekomoto911
71a057bcbe perf: Reduce unnecessary memory copies in compare_storage_trie_updates (#16841)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-17 13:27:22 +00:00
Bilog WEB3
a38428eb05 docs: update comment for is_eip7702() method (#16852) 2025-06-17 14:50:04 +02:00
Matthias Seitz
41c93a1134 chore: bump alloy 1.0.11 (#16853) 2025-06-17 14:42:37 +02:00
Matthias Seitz
34ef2a27e0 feat: add RlpBincode helper (#16849) 2025-06-17 14:31:19 +02:00
Matthias Seitz
7bc6939d53 chore: use earliest block number from provider (#16848) 2025-06-17 14:22:18 +02:00
Arsenii Kulikov
5d754195a3 chore: bump alloy (#16828) 2025-06-17 14:19:07 +02:00
Roman Hodulák
820c334a4a feat(era): Delete files outside the range before counting them (#16805) 2025-06-17 09:06:01 +00:00
Federico Gimenez
3096e9520d chore(ci): pin kurtosis-op optimism package (#16842) 2025-06-17 08:59:49 +00:00
Ishika Choudhury
8477d652f6 refactor: replaced update_status with update_block_range (#16840)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-17 08:51:10 +00:00
Ishika Choudhury
46780aec28 feat: introduced fn earliest_block_number for BlockNumReader (#16831) 2025-06-17 08:15:06 +00:00
dependabot[bot]
ee2e60c144 chore(deps): bump dawidd6/action-homebrew-bump-formula from 4 to 5 (#16838)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 08:13:25 +00:00
dependabot[bot]
ecb92f307c chore(deps): bump dprint/check from 2.2 to 2.3 (#16839)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-17 08:07:07 +00:00
Roman Hodulák
5efd3c0c57 deps: Upgrade op-alloy version 0.18.2 => 0.18.3 and all other deps minor versions (#16835) 2025-06-17 08:06:15 +00:00
Dan Cline
f22c8bdedb feat: add parallel sparse trie skeleton (#16837) 2025-06-16 23:39:16 +00:00
Dan Cline
519cd3e307 perf: reuse accounts trie in payload processing (#16836) 2025-06-16 23:39:03 +00:00
Skylar Ray
b4a0823063 docs: clarify txpool docs (#16833) 2025-06-16 19:20:29 +00:00
Dan Cline
c4da80abaa revert: "perf: reuse accounts trie in payload processing (#16181)" (#16834) 2025-06-16 19:16:49 +00:00
Roman Hodulák
d12a9788d9 feat(rpc): Add FromConsensusTx and implement IntoRpcTx for generic RPC transaction (#16784) 2025-06-16 16:23:09 +00:00
Matthias Seitz
a1a1c0c6bc chore: update op-alloy deps to 0.18.2 (#16827) 2025-06-16 14:18:58 +00:00
Dan Cline
3e0960cb11 perf: reuse accounts trie in payload processing (#16181)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-16 13:17:00 +00:00
Matthias Seitz
a8522e6a25 fix: validate BlockRangeUpdate message per devp2p spec (#16826) 2025-06-16 13:14:42 +00:00
Odinson
259a443bab feat(network): Added Option for dispatching range updates to remote peer (#16776)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-16 12:33:19 +00:00
Matthias Seitz
5f1353c410 feat: add alloy-provider crate for RPC-based state access (#16809)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Federico Gimenez <federico.gimenez@gmail.com>
2025-06-16 11:33:44 +00:00
0xNarumi
fcc935e215 fix: make EthPubSub pub to allow composition and fallback overrides (#16823) 2025-06-16 11:28:24 +00:00
Emilia Hane
68efe4f02d chore(op/cli): Rm unused cli arg rollup.enable-genesis-walkback (#16824) 2025-06-16 10:12:37 +00:00
Arsenii Kulikov
31300e4fde feat: integrate tracing helpers (#16466) 2025-06-16 09:52:21 +00:00
Roman Hodulák
a1d216040e perf(cli): Start from next block based on imported headers in import-era command (#16803) 2025-06-16 09:52:00 +00:00
Matthias Seitz
ad86321afb feat: relax EthereumAddons trait bounds to support generic validators (#16816) 2025-06-16 09:39:57 +00:00
Roman Hodulák
c3caea2047 refactor(era): Remove start_from from EraClient and use it instead of last file index (#16801) 2025-06-16 09:39:02 +00:00
Federico Gimenez
9d391a8b92 feat(test): rewrite test_engine_tree_reorg_with_missing_ancestor_expecting_valid using e2e framework (#16761) 2025-06-16 09:17:52 +00:00
Matthias Seitz
11df5a1d30 feat: re-export MerklePatriciaTrie from reth-ethereum and reth-op (#16814)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-16 09:16:07 +00:00
Matthias Seitz
b8e4cd3ace fix: change some rpc response codes to eth invalid input (#16745) 2025-06-16 09:15:16 +00:00
Roman Hodulák
e2e54d813e fix(era): Commit all writers and save stages checkpoint per file in import (#16810) 2025-06-16 09:10:50 +00:00
Thomas Coratger
0b2336ddb6 feat(stateless): simplify Database implementation for WitnessDatabase (#16820) 2025-06-16 07:54:26 +00:00
Roman Hodulák
fb477d8c28 feat(examples): Add extension into engine_getPayload RPC method response in custom_node example (#16772) 2025-06-15 09:34:18 +00:00
github-actions[bot]
e0acdb102d chore(deps): weekly cargo update (#16719)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-15 09:08:48 +00:00
Matthias Seitz
746e80c819 feat(op): export OpEthApiBuilder from reth-optimism-rpc (#16815) 2025-06-15 10:39:12 +02:00
Soubhik Singha Mahapatra
9dcea7c3fa chore: removed legacy.rs (#16817) 2025-06-15 08:21:29 +00:00
Mablr
bb4bf298ec feat(gas_oracle): implement median-based priority fee suggestion for Optimism (#16794) 2025-06-14 15:29:01 +00:00
Matthias Seitz
82e9988049 docs: document transaction flow into the pool (#16777) 2025-06-14 17:44:57 +02:00
Rez
4e97f48182 feat: make EthereumEngineValidator generic over ChainSpec (#16812) 2025-06-14 14:50:07 +00:00
Matthias Seitz
f057ad5c13 feat: add to_message convenience method to BlockRangeInfo (#16778) 2025-06-14 16:53:08 +02:00
fuder.eth
4a401e1802 fix: typo in test comment (#16811) 2025-06-14 16:50:30 +02:00
Roman Hodulák
381811406e feat(era): Accept anything that converts into Box<Path> as folder of EraClient (#16802) 2025-06-13 20:49:18 +00:00
Matthias Seitz
1f37bddd83 test: add eth69 request/response tests (#16806) 2025-06-13 12:54:16 +00:00
Roman Hodulák
7272b217ab feat(rpc): Implement IntoRpcTx with Ethereum RPC transaction response for Extended (#16783) 2025-06-13 12:49:10 +00:00
Roman Hodulák
8d691ab2c2 feat(examples): Add CustomEngineValidator and its builder to the custom_node example (#16774) 2025-06-13 12:06:53 +00:00
Roman Hodulák
4bc77c729f feat(cli): Create folder and all its parents before import in import-era command (#16800) 2025-06-13 11:45:45 +00:00
Matthias Seitz
71d8420426 chore: bump inspectors 0.24 (#16797) 2025-06-13 11:07:45 +00:00
Roman Hodulák
6f1a32bd04 feat(cli): Create folder in chain specific data directory for import-era command (#16799) 2025-06-13 11:05:51 +00:00
Rez
93e2e5876f feat: make EthereumConsensusBuilder generic over chainSpec (#16793) 2025-06-13 08:44:18 +00:00
Matthias Seitz
f01f31a40e chore: re-export network types (#16789) 2025-06-13 10:30:29 +02:00
Matthias Seitz
217289af6f chore: re-export more op types (#16788) 2025-06-13 05:54:25 +00:00
Federico Gimenez
65b824aef0 chore: pin hive and add test to expected failures (#16790) 2025-06-12 16:40:39 +00:00
Femi Bankole
91977c9d3a feat: introduce 10s timeout when resolving external ips (#16787) 2025-06-12 13:26:53 +00:00
Léa Narzis
9f98728deb feat(net): make bloom filter optional on receipts request (#16718) 2025-06-12 11:48:33 +00:00
Z
e7cbecb0df chore(deps): Upgrade proptest to 1.7 (#16786) 2025-06-12 10:22:44 +00:00
Matthias Seitz
a9bbc9be65 fix: resolve external ip on launch (#16768) 2025-06-12 09:41:48 +00:00
Matthias Seitz
6ddc756489 feat: introduce RPC error for pruned history (#16780) 2025-06-12 09:36:48 +00:00
Roman Hodulák
64fc747bf4 fix(era): Rollback state of StartingStream if fetching file list fails (#16775) 2025-06-12 08:45:40 +00:00
Federico Gimenez
4ade65a57d chore: fix hive unexpected test filter (#16782) 2025-06-12 08:44:48 +00:00
Luis_
1e40b36afc feat: make EthEvmConfig generic over chainSpec (#16758)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-12 00:07:02 +00:00
Udoagwa Franklin
af912c41f3 feat: ensure ETL data directory is cleared on launch (#16770)
Co-authored-by: aolamide <aboyejiolamide15@gmail.com>
2025-06-11 21:26:21 +00:00
Alexey Shekhirin
57e4b919a3 test(trie): fix stored nibbles tests (#16769) 2025-06-11 12:36:55 +00:00
Femi Bankole
bdd0d4384e fix: set parent beacon block to zero hash if parent's beacon block is Some (#16767) 2025-06-11 11:50:36 +00:00
Matthias Seitz
b433561cb7 test: improve ETH69 protocol test coverage (#16759) 2025-06-11 09:53:11 +00:00
Federico Gimenez
663b44a35d chore: update hive expected failures (#16764) 2025-06-11 09:34:36 +00:00
Matthias Seitz
d66bc9a500 feat: add shared local block range info between SessionManager and ActiveSession (#16763)
Co-authored-by: Claude <noreply@anthropic.com>
2025-06-11 09:01:53 +00:00
Roman Hodulák
628f212deb feat(rpc): Add TxEnv conversion function into RpcConverter (#16750) 2025-06-11 08:27:04 +00:00
Roman Hodulák
a410b599f1 ci(sync): Change schedule to run once every 6 hours (#16754) 2025-06-11 06:26:10 +00:00
Roman Hodulák
7e1b80b3b8 ci: Add sync-era workflow that syncs with ERA stage enabled (#16751) 2025-06-10 21:16:44 +00:00
Arsenii Kulikov
1bef0092ee fix: small networking fixes (#16742) 2025-06-10 12:32:18 +00:00
Arsenii Kulikov
895b0e9f82 feat: reintroduce generic executors (#16741) 2025-06-10 10:42:12 +00:00
Udoagwa Franklin
41ed7e0b79 feat: Add info logs for beginning of newPayload requests (#16463) 2025-06-10 09:01:18 +00:00
Matthias Seitz
a201676992 chore: relax eth network builder (#16714) 2025-06-10 08:29:01 +00:00
Matthias Seitz
48deef708a chore: make ethpool alias generic over tx (#16713) 2025-06-10 08:16:24 +00:00
Matthias Seitz
e08a56a564 chore: keep .git folder in docker (#16733) 2025-06-10 07:52:29 +00:00
Federico Gimenez
889004bb6d chore(ci): update hive expected failures (#16737) 2025-06-10 06:11:42 +00:00
Roman Krasiuk
19cac33830 feat: remove preemptive excess blob gas check (#16729) 2025-06-09 14:28:13 +00:00
Roman Hodulák
03fcb332bc feat(rpc): Implement TransactionCompat for generic RPC response builder (#16694) 2025-06-09 09:12:29 +00:00
Federico Gimenez
4760b3286e test: multi-node support in e2e testsuite (#16725) 2025-06-09 08:14:25 +00:00
Odinson
e1a5ecd3bf feat: added closure and relaxed setup_without_evm function (#16720) 2025-06-08 09:21:29 +00:00
Matthias Seitz
b767ffbda2 perf: remove redundant clones (#16716) 2025-06-07 15:11:30 +00:00
Aliaksei Misiukevich
0848739717 feat: fn that replaces and merges network module's endpoints (#16619)
Signed-off-by: Aliaksei Misiukevich <taberlick@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-07 14:51:56 +00:00
Ishika Choudhury
f6dec71dcf feat: added Body::contains_transaction(&TxHash) (#16715) 2025-06-07 12:37:13 +00:00
Matthias Seitz
448ec7da5b chore: re-export cli-util crate (#16711) 2025-06-07 07:25:44 +00:00
Matthias Seitz
f209048bee chore: re-export all types in node mod (#16710) 2025-06-07 09:11:48 +02:00
Matthias Seitz
ae0d6e90da chore: depreacte ethexecutorbuilder (#16709) 2025-06-06 22:50:34 +00:00
Arsenii Kulikov
01a3b03190 chore: remove accidentally commited files (#16708) 2025-06-06 23:18:02 +02:00
Federico Gimenez
1e277921c7 feat(test): rewrite test_engine_tree_valid_and_invalid_forks_with_older_canonical_head_e2e using e2e framework (#16705) 2025-06-06 15:43:29 +00:00
gejeduck
2fccd08845 feat: add block range hint to BlockBodies download request (#16703)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-06 13:45:48 +00:00
Roman Hodulák
3218b3c637 feat(stages): Add ERA pre-merge history import stage (#16008)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-06 12:30:54 +00:00
Federico Gimenez
a04bd716a9 feat(test): rewrite test_engine_tree_valid_forks_with_older_canonical_head using e2e framework (#16699) 2025-06-06 10:29:21 +00:00
Alexey Shekhirin
e869762caf chore: revert docker compose volume renames (#16688) 2025-06-06 10:15:11 +00:00
gejeduck
c1b7eb78de feat: introduce supported range to Peer info (#16687)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-06 09:02:48 +00:00
Igor Markelov
95c68ae584 feat: add always-process-payload-attributes-on-canonical-head config (#16676) 2025-06-06 08:52:37 +00:00
Federico Gimenez
8e54c4b2a6 feat(test): rewrite test_engine_tree_fcu_reorg_with_all_blocks using e2e framework (#16692) 2025-06-06 08:39:12 +00:00
Arsenii Kulikov
2b283ae83f fix: correctly set sync gap (#16695) 2025-06-06 03:10:18 +00:00
Suyash Nayan
faf6741a60 perf(pipeline): speed up fork unwinding with exponential backoff (#16622)
Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-05 21:08:22 +00:00
Arsenii Kulikov
09632905eb fix: ensure that downloader sync gap is only set once (#16693) 2025-06-05 19:44:27 +00:00
Ethan Nguyen
c68e657b69 chore: remove noisy log (#16691) 2025-06-05 17:19:01 +00:00
Ishika Choudhury
81461a8cf9 feat: introduced NoopPayloadServiceBuilder (#16667)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-05 16:36:45 +00:00
Alexey Shekhirin
73a8efca60 perf(engine): enable precompile cache by default (#16685) 2025-06-05 15:42:39 +00:00
Matthias Seitz
285c1acb84 fix: use correct sender_id_or_create as intended (#16684) 2025-06-05 15:41:09 +00:00
Rohit Singh Rathaur
961a7e5930 refactor: replace unbounded HashMap with LruMap in precompile cache (#16326)
Co-authored-by: Ayushdubey86 <dubeyayush1687@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-05 15:03:18 +00:00
Federico Gimenez
199af6eb7c feat(test): rewrite test_engine_tree_fcu_canon_chain_insertion using e2e framework (#16678) 2025-06-05 14:03:45 +00:00
gejeduck
a09f058184 chore: add remaining snap request trait functions (#16682) 2025-06-05 13:52:17 +00:00
Alexey Shekhirin
81dbfdaddf ci: do not check version for release dry runs (#16679) 2025-06-05 13:29:05 +00:00
Leonardo Arias
a69d30c679 feat: cross-compile to RISC-V (#16426)
Co-authored-by: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com>
2025-06-05 12:10:44 +00:00
futreall
5e8bcdfe57 docs: Fix typos in documentation and README (#16677) 2025-06-05 10:49:29 +00:00
Federico Gimenez
306d1c3aee chore: extract engine tests to separate file (#16671) 2025-06-05 09:02:09 +00:00
Louis Brown
ee8acd13e6 chore: Add metrics for supervisor RPC error (#16111)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-05 08:55:06 +00:00
Federico Gimenez
bad715f286 chore(ci): unpin teku image for kurtosis-op ethereum-package (#16670) 2025-06-05 08:51:05 +00:00
Roman Hodulák
63cc4eccad feat(era): Implement retry policy for HTTP client downloader (#16664) 2025-06-05 08:21:17 +00:00
Hai | RISE
cd521ce79d perf: remove some clones around eth_call (#16665) 2025-06-05 08:16:54 +00:00
Mablr
717449b076 feat(GasOracle): new function to compute median (#16645)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-05 10:21:40 +02:00
Suyash Nayan
73b4073363 refactor(txns): inline validation logic and remove validation.rs (#16668)
Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
2025-06-05 07:58:44 +00:00
Matthias Seitz
1efc666a13 chore: relax primtives types bound (#16663) 2025-06-04 21:29:00 +00:00
Arsenii Kulikov
cf80ef4d86 refactor: simplify --dev setup (#16662) 2025-06-04 20:44:50 +00:00
Odinson
6d5b0ef74e feat: Added Socket Address to the network discovery error (#16659) 2025-06-04 18:23:53 +00:00
Federico Gimenez
19caec3dd9 feat: make RpcAddOns::launch_add_ons_with composable (#16646) 2025-06-04 17:22:58 +00:00
Alexey Shekhirin
a5c09cf4af ci: remove build-release-binaries.yml workflow (#16658) 2025-06-04 16:38:52 +00:00
Alexey Shekhirin
0705df5258 ci: check Cargo version against Git tag in release.yml (#16657) 2025-06-04 15:50:03 +00:00
Suyash Nayan
ad8c2c523a feat(txns): Implement flexible TxType filtering policy in TransactionManager (#16495)
Signed-off-by: 7suyash7 <suyashnyn1@gmail.com>
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-04 15:41:46 +00:00
Matthias Seitz
bcd363b4b8 chore: bump version 1.4.8 (#16655) 2025-06-04 15:11:42 +00:00
Soubhik Singha Mahapatra
0a4c21527c chore: used Opstorage impl for optimism (#16594)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-04 14:25:14 +00:00
Veer Chaurasia
89b235040d refactor: unify pending_block fn (#16596) 2025-06-04 13:59:09 +00:00
Matthias Seitz
5eb07896b4 chore: downgrade warn log (#16649) 2025-06-04 13:14:52 +00:00
Muhammed Kadir Yücel
ff404c80e2 feat: trigger resolution task when multiple connection failures occur for a trusted peer (#16652)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
2025-06-04 12:32:58 +00:00
Alexey Shekhirin
2fdae16d5f chore: add Hoodi to docker compose files, fix checkpoint sync URLs (#16653) 2025-06-04 12:32:02 +00:00
Matthias Seitz
c5114b676f chore: bump default gas limit 60M mainnet (#16650) 2025-06-04 12:07:54 +00:00
Matthias Seitz
0201c831d2 perf: use already recovered signer (#16640) 2025-06-04 12:01:26 +00:00
Alexey Shekhirin
78837f9327 ci: use different names for latest and RC Docker jobs (#16654) 2025-06-04 11:59:44 +00:00
Muhammed Kadir Yücel
249fa36432 feat: configure interval for trusted peer DNS resolution (#16647) 2025-06-04 11:41:55 +00:00
Alexey Shekhirin
74bde8adee perf(engine): do not use state root task for non-empty revert state (#16631) 2025-06-04 10:56:03 +00:00
Roman Krasiuk
90d98f3303 feat(txpool): EIP-7825 max gas limit check (#16648) 2025-06-04 10:54:48 +00:00
Femi Bankole
1254438bdd feat: json ChainNotification subscription endpoint (#16644) 2025-06-04 09:58:38 +00:00
Alexey Shekhirin
5106f64f76 fix(engine): recompute trie updates for forked blocks (#16568) 2025-06-04 09:58:19 +00:00
Matthias Seitz
fe5c6d80d5 fix: check additional settings when enabling discv5 (#16643) 2025-06-04 09:25:34 +00:00
Arsenii Kulikov
f7db031f59 chore: make BuildOutcome::map_payload pub (#16636) 2025-06-04 09:19:24 +00:00
Shane K Moore
b6e66a5e9c chore: add minSuggestedPriorityFee check to OpEthapi (#16637)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-04 08:30:32 +00:00
Hai | RISE
40ebef4571 feat(OpEngineValidator): pub chain_spec (#16638) 2025-06-04 08:02:30 +00:00
Arsenii Kulikov
66692a7e45 feat: make NewBlock message generic (#16627) 2025-06-03 19:32:12 +00:00
Ishika Choudhury
441210eb7a chore: removed alloy_consensus::Header constraint in setup_without_db (#16623) 2025-06-03 18:42:24 +00:00
Matthias Seitz
780ed8e8e2 chore: include target and latest in error message (#16630) 2025-06-03 18:34:08 +00:00
Federico Gimenez
10caf93f98 refactor: extract common pool setup logic for Eth and Op nodes (#16607)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-03 17:31:22 +00:00
Alexey Shekhirin
6532de4f4e chore: update Grafana dashboard (#16575) 2025-06-03 15:34:44 +00:00
Roman Hodulák
e2f162038f feat(rpc): Add Primitives associated type to TransactionCompat trait (#16626) 2025-06-03 15:27:30 +00:00
Léa Narzis
ea7eaf61c3 feat: enable external EngineApi access (#16248)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-03 13:10:36 +00:00
Hai | RISE
5f745ede48 feat(OpAddOns): relax trait bounds for generic engine validators (#16615) 2025-06-03 13:08:56 +00:00
Matthias Seitz
3fc463c8a0 feat: impl compress decompress for customheader (#16617) 2025-06-03 12:39:33 +00:00
Federico Gimenez
b5c01d6530 refactor(e2e): split actions.rs into submodule (#16609) 2025-06-03 12:18:07 +00:00
Matthias Seitz
2726b797b3 fix: wrap forkid entry for eth key (#16616) 2025-06-03 11:51:39 +00:00
Tbelleng
fee128da62 feat: 🐛 fix using latest header (#16614) 2025-06-03 10:46:40 +00:00
Ethan Nguyen
1e69bf4f45 chore: Remove OmmersProvider (#16539) 2025-06-03 10:41:13 +00:00
Matthias Seitz
4686778cb9 chore: make clippy happy (#16611) 2025-06-03 11:03:54 +02:00
Ishika Choudhury
5f7fe6b9e2 feat: fixed missing blocktimestamp in logs subscription (#16598) 2025-06-03 11:03:29 +02:00
Solar Mithril
f2d1863485 feat: fix tx da scaling (#16558) 2025-06-03 11:01:23 +02:00
Léa Narzis
ca9f94cc7b refactor: relax OpAddOns trait bounds (#16582) 2025-06-03 10:57:19 +02:00
Merkel Tranjes
aab4d22786 docs(net): replace 404 link message.rs (#16597) 2025-06-03 10:43:26 +02:00
Roman Hodulák
7ac3be5c96 fix(era): Use the url as the index page for HTTP hosts (#16555) 2025-06-02 18:26:23 +00:00
Alexey Shekhirin
de59ccff94 ci: special treatment for release candidate tags (#16603)
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-06-02 16:02:39 +00:00
Federico Gimenez
e19271b9dd test(e2e): set test_state_root_fallback for deep reorg test (#16573) 2025-06-02 15:56:26 +00:00
Léa Narzis
c8f01de878 refactor: replace generics with Node types for OpExecutorBuilder (#16601)
Co-authored-by: Arsenii Kulikov <klkvrr@gmail.com>
2025-06-02 14:52:58 +00:00
1555 changed files with 155029 additions and 53117 deletions

View File

@@ -1,3 +0,0 @@
[codespell]
skip = .git,target,./crates/storage/libmdbx-rs/mdbx-sys/libmdbx,Cargo.toml,Cargo.lock
ignore-words-list = crate,ser,ratatui

View File

@@ -5,3 +5,22 @@ slow-timeout = { period = "30s", terminate-after = 4 }
[[profile.default.overrides]]
filter = "test(general_state_tests)"
slow-timeout = { period = "1m", terminate-after = 10 }
[[profile.default.overrides]]
filter = "test(eest_fixtures)"
slow-timeout = { period = "2m", terminate-after = 10 }
# E2E tests using the testsuite framework from crates/e2e-test-utils
# These tests are located in tests/e2e-testsuite/ directories across various crates
[[profile.default.overrides]]
filter = "binary(e2e_testsuite)"
slow-timeout = { period = "2m", terminate-after = 3 }
[[profile.default.overrides]]
filter = "package(reth-era) and binary(it)"
slow-timeout = { period = "2m", terminate-after = 10 }
# Allow slower ethereum node e2e tests (p2p + blobs) to run up to 5 minutes.
[[profile.default.overrides]]
filter = "package(reth-node-ethereum) and binary(e2e)"
slow-timeout = { period = "1m", terminate-after = 5 }

View File

@@ -12,7 +12,7 @@ workflows:
# Check that `A` activates the features of `B`.
"propagate-feature",
# These are the features to check:
"--features=std,op,dev,asm-keccak,jemalloc,jemalloc-prof,tracy-allocator,serde-bincode-compat,serde,test-utils,arbitrary,bench,alloy-compat",
"--features=std,op,dev,asm-keccak,jemalloc,jemalloc-prof,tracy-allocator,serde-bincode-compat,serde,test-utils,arbitrary,bench,alloy-compat,min-error-logs,min-warn-logs,min-info-logs,min-debug-logs,min-trace-logs,otlp,js-tracer,portable,keccak-cache-global",
# Do not try to add a new section to `[features]` of `A` only because `B` exposes that feature. There are edge-cases where this is still needed, but we can add them manually.
"--left-side-feature-missing=ignore",
# Ignore the case that `A` it outside of the workspace. Otherwise it will report errors in external dependencies that we have no influence on.

View File

@@ -4,6 +4,7 @@
# include source files
!/bin
!/crates
!/pkg
!/testing
!book.toml
!Cargo.lock
@@ -11,6 +12,7 @@
!Cross.toml
!deny.toml
!Makefile
!README.md
# include for vergen constants
!/.git

2
.gitattributes vendored
View File

@@ -2,3 +2,5 @@ book/cli/**/*.md linguist-vendored
book/cli/cli.md -linguist-vendored
crates/storage/libmdbx-rs/mdbx-sys/libmdbx/** linguist-vendored
bun.lock linguist-language=JSON-with-Comments

55
.github/CODEOWNERS vendored
View File

@@ -1,50 +1,45 @@
* @gakonst
bin/ @onbjerg
crates/blockchain-tree/ @rakita @rkrasiuk @mattsse @Rjected
crates/blockchain-tree-api/ @rakita @rkrasiuk @mattsse @Rjected
crates/blockchain-tree-api/ @rakita @mattsse @Rjected
crates/blockchain-tree/ @rakita @mattsse @Rjected
crates/chain-state/ @fgimenez @mattsse
crates/chainspec/ @Rjected @joshieDo @mattsse
crates/chain-state/ @fgimenez @mattsse @rkrasiuk
crates/cli/ @onbjerg @mattsse
crates/config/ @onbjerg
crates/consensus/ @rkrasiuk @mattsse @Rjected
crates/engine @rkrasiuk @mattsse @Rjected
crates/e2e-test-utils/ @mattsse @Rjected
crates/engine/ @rkrasiuk @mattsse @Rjected @fgimenez
crates/cli/ @mattsse
crates/consensus/ @mattsse @Rjected
crates/e2e-test-utils/ @mattsse @Rjected @klkvr @fgimenez
crates/engine/ @mattsse @Rjected @fgimenez @mediocregopher @yongkangc
crates/era/ @mattsse @RomanHodulak
crates/errors/ @mattsse
crates/era/ @mattsse
crates/ethereum/ @mattsse @Rjected
crates/ethereum-forks/ @mattsse @Rjected
crates/ethereum/ @mattsse @Rjected
crates/etl/ @joshieDo @shekhirin
crates/evm/ @rakita @mattsse @Rjected
crates/exex/ @onbjerg @shekhirin
crates/fs-util/ @onbjerg
crates/metrics/ @onbjerg
crates/exex/ @shekhirin
crates/net/ @mattsse @Rjected
crates/net/downloaders/ @onbjerg @rkrasiuk
crates/node/ @mattsse @Rjected @onbjerg @klkvr
crates/net/downloaders/ @Rjected
crates/node/ @mattsse @Rjected @klkvr
crates/optimism/ @mattsse @Rjected @fgimenez
crates/payload/ @mattsse @Rjected
crates/primitives-traits/ @Rjected @RomanHodulak @mattsse @klkvr
crates/primitives/ @Rjected @mattsse @klkvr
crates/primitives-traits/ @Rjected @joshieDo @mattsse @klkvr
crates/prune/ @shekhirin @joshieDo
crates/ress @shekhirin @Rjected
crates/revm/ @mattsse @rakita
crates/rpc/ @mattsse @Rjected
crates/stages/ @onbjerg @rkrasiuk @shekhirin
crates/rpc/ @mattsse @Rjected @RomanHodulak
crates/stages/ @shekhirin @mediocregopher
crates/static-file/ @joshieDo @shekhirin
crates/storage/codecs/ @joshieDo
crates/storage/db/ @joshieDo @rakita
crates/storage/db-api/ @joshieDo @rakita
crates/storage/db-common/ @Rjected @onbjerg
crates/storage/errors/ @rakita @onbjerg
crates/storage/db-common/ @Rjected
crates/storage/db/ @joshieDo @rakita
crates/storage/errors/ @rakita
crates/storage/libmdbx-rs/ @rakita @shekhirin
crates/storage/nippy-jar/ @joshieDo @shekhirin
crates/storage/provider/ @rakita @joshieDo @shekhirin
crates/storage/storage-api/ @joshieDo @rkrasiuk
crates/storage/storage-api/ @joshieDo
crates/tasks/ @mattsse
crates/tokio-util/ @fgimenez
crates/tracing/ @onbjerg
crates/transaction-pool/ @mattsse
crates/trie/ @rkrasiuk @Rjected @shekhirin
crates/ress @rkrasiuk
etc/ @Rjected @onbjerg @shekhirin
.github/ @onbjerg @gakonst @DaniPopes
crates/transaction-pool/ @mattsse @yongkangc
crates/trie/ @Rjected @shekhirin @mediocregopher
bin/reth-bench-compare/ @mediocregopher @shekhirin @yongkangc
etc/ @Rjected @shekhirin
.github/ @gakonst @DaniPopes

7
.github/actionlint.yaml vendored Normal file
View File

@@ -0,0 +1,7 @@
self-hosted-runner:
labels:
- depot-ubuntu-latest
- depot-ubuntu-latest-2
- depot-ubuntu-latest-4
- depot-ubuntu-latest-8
- depot-ubuntu-latest-16

View File

@@ -11,6 +11,7 @@ exclude_crates=(
# The following require investigation if they can be fixed
reth-basic-payload-builder
reth-bench
reth-bench-compare
reth-cli
reth-cli-commands
reth-cli-runner
@@ -40,6 +41,7 @@ exclude_crates=(
reth-node-events
reth-node-metrics
reth-optimism-cli
reth-optimism-flashblocks
reth-optimism-node
reth-optimism-payload-builder
reth-optimism-rpc
@@ -48,6 +50,8 @@ exclude_crates=(
reth-rpc-api
reth-rpc-api-testing-util
reth-rpc-builder
reth-rpc-convert
reth-rpc-e2e-tests
reth-rpc-engine-api
reth-rpc-eth-api
reth-rpc-eth-types
@@ -58,22 +62,26 @@ exclude_crates=(
reth-ress-provider
# The following are not supposed to be working
reth # all of the crates below
reth-storage-rpc-provider
reth-invalid-block-hooks # reth-provider
reth-libmdbx # mdbx
reth-mdbx-sys # mdbx
reth-payload-builder # reth-metrics
reth-provider # tokio
reth-prune # tokio
reth-prune-static-files # reth-provider
reth-stages-api # reth-provider, reth-prune
reth-static-file # tokio
reth-transaction-pool # c-kzg
reth-payload-util # reth-transaction-pool
reth-trie-parallel # tokio
reth-trie-sparse-parallel # rayon
reth-testing-utils
reth-optimism-txpool # reth-transaction-pool
reth-era-downloader # tokio
reth-era-utils # tokio
reth-tracing-otlp
reth-node-ethstats
)
# Array to hold the results

View File

@@ -11,7 +11,8 @@ go build .
# Run each hive command in the background for each simulator and wait
echo "Building images"
./hive -client reth --sim "ethereum/eest" --sim.buildarg fixtures=https://github.com/ethereum/execution-spec-tests/releases/download/v4.4.0/fixtures_develop.tar.gz --sim.buildarg branch=v4.4.0 -sim.timelimit 1s || true &
# TODO: test code has been moved from https://github.com/ethereum/execution-spec-tests to https://github.com/ethereum/execution-specs we need to pin eels branch with `--sim.buildarg branch=<release-branch-name>` once we have the fusaka release tagged on the new repo
./hive -client reth --sim "ethereum/eels" --sim.buildarg fixtures=https://github.com/ethereum/execution-spec-tests/releases/download/v5.3.0/fixtures_develop.tar.gz -sim.timelimit 1s || true &
./hive -client reth --sim "ethereum/engine" -sim.timelimit 1s || true &
./hive -client reth --sim "devp2p" -sim.timelimit 1s || true &
./hive -client reth --sim "ethereum/rpc-compat" -sim.timelimit 1s || true &
@@ -27,8 +28,8 @@ docker save hive/hiveproxy:latest -o ../hive_assets/hiveproxy.tar & saving_pids+
docker save hive/simulators/devp2p:latest -o ../hive_assets/devp2p.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/engine:latest -o ../hive_assets/engine.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/rpc-compat:latest -o ../hive_assets/rpc_compat.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/eest/consume-engine:latest -o ../hive_assets/eest_engine.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/eest/consume-rlp:latest -o ../hive_assets/eest_rlp.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/eels/consume-engine:latest -o ../hive_assets/eels_engine.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/eels/consume-rlp:latest -o ../hive_assets/eels_rlp.tar & saving_pids+=( $! )
docker save hive/simulators/smoke/genesis:latest -o ../hive_assets/smoke_genesis.tar & saving_pids+=( $! )
docker save hive/simulators/smoke/network:latest -o ../hive_assets/smoke_network.tar & saving_pids+=( $! )
docker save hive/simulators/ethereum/sync:latest -o ../hive_assets/ethereum_sync.tar & saving_pids+=( $! )

View File

@@ -6,16 +6,16 @@ rpc-compat:
- debug_getRawReceipts/get-block-n (reth)
- debug_getRawTransaction/get-invalid-hash (reth)
- eth_call/call-callenv (reth)
- eth_getStorageAt/get-storage-invalid-key-too-large (reth)
- eth_getStorageAt/get-storage-invalid-key (reth)
- eth_getTransactionReceipt/get-access-list (reth)
- eth_getTransactionReceipt/get-blob-tx (reth)
- eth_getTransactionReceipt/get-dynamic-fee (reth)
- eth_getTransactionReceipt/get-legacy-contract (reth)
- eth_getTransactionReceipt/get-legacy-input (reth)
- eth_getTransactionReceipt/get-legacy-receipt (reth)
# after https://github.com/paradigmxyz/reth/pull/16742 we start the node in
# syncing mode, the test expects syncing to be false on start
- eth_syncing/check-syncing (reth)
# no fix due to https://github.com/paradigmxyz/reth/issues/8732
engine-withdrawals:
- Withdrawals Fork On Genesis (Paris) (reth)
@@ -28,33 +28,47 @@ engine-withdrawals:
- Withdraw zero amount (Paris) (reth)
- Empty Withdrawals (Paris) (reth)
- Corrupted Block Hash Payload (INVALID) (Paris) (reth)
- Withdrawals Fork on Block 1 - 8 Block Re-Org NewPayload (Paris) (reth)
- Withdrawals Fork on Canonical Block 8 / Side Block 7 - 10 Block Re-Org (Paris) (reth)
engine-api: []
engine-api: [ ]
# no fix due to https://github.com/paradigmxyz/reth/issues/8732
engine-cancun:
- Invalid PayloadAttributes, Missing BeaconRoot, Syncing=True (Cancun) (reth)
- Invalid NewPayload, ExcessBlobGas, Syncing=True, EmptyTxs=False, DynFeeTxs=False (Cancun) (reth)
# the test fails with older versions of the code for which it passed before, probably related to changes
# in hive or its dependencies
- Blob Transaction Ordering, Multiple Clients (Cancun) (reth)
sync: []
sync: [ ]
# https://github.com/ethereum/hive/issues/1277
engine-auth:
- "JWT Authentication: No time drift, correct secret (Paris) (reth)"
- "JWT Authentication: Negative time drift, within limit, correct secret (Paris) (reth)"
- "JWT Authentication: Positive time drift, within limit, correct secret (Paris) (reth)"
engine-auth: [ ]
# 7702 test - no fix: its too expensive to check whether the storage is empty on each creation
# 6110 related tests - may start passing when fixtures improve
# 7002 related tests - post-fork test, should fix for spec compliance but not
# realistic on mainnet
# 7251 related tests - modified contract, not necessarily practical on mainnet,
# worth re-visiting when more of these related tests are passing
eest/consume-engine:
# EIP-7610 related tests (Revert creation in case of non-empty storage):
#
# tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_non_empty_storage
# The test artificially creates an empty account with storage, then tests EIP-7610's behavior.
# On mainnet, ~25 such accounts exist as contract addresses (derived from keccak(prefix, caller,
# nonce/salt), not from public keys). No private key exists for contract addresses. To trigger
# this with EIP-7702, you'd need to recover a private key from one of the already deployed contract addresses - mathematically impossible.
#
# tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_*
# Requires hash collision on create2 address to target already deployed accounts with storage.
# ~20-30 such accounts exist from before the state-clear EIP. Creating new accounts targeting
# these requires hash collision - mathematically impossible to trigger on mainnet.
# ref: https://github.com/ethereum/go-ethereum/pull/28666#issuecomment-1891997143
#
# System contract tests (already fixed and deployed):
#
# tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout and test_invalid_log_length
# System contract is already fixed and deployed; tests cover scenarios where contract is
# malformed which can't happen retroactively. No point in adding checks.
#
# tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment
# tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment
# Post-fork system contract deployment tests. Should fix for spec compliance but not realistic
# on mainnet as these contracts are already deployed at the correct addresses.
eels/consume-engine:
- tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_non_empty_storage[fork_Prague-blockchain_test_engine-zero_nonce]-reth
- tests/prague/eip7251_consolidations/test_modified_consolidation_contract.py::test_system_contract_errors[fork_Prague-blockchain_test_engine-system_contract_reaches_gas_limit-system_contract_0x0000bbddc7ce488642fb579f8b00f3a590007251]-reth
- tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth
- tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_amount_offset-value_zero]-reth
@@ -62,7 +76,6 @@ eest/consume-engine:
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_index_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_offset-value_zero]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_modified_withdrawal_contract.py::test_system_contract_errors[fork_Prague-blockchain_test_engine-system_contract_reaches_gas_limit-system_contract_0x00000961ef480eb55e80d19ad83579a64c007002]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_pubkey_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_size-value_zero]-reth
@@ -72,11 +85,76 @@ eest/consume-engine:
- tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_False]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_True]-reth
# the next test expects a concrete new format in the error message, there is no spec for this message, so it is ok to ignore
- tests/cancun/eip4844_blobs/test_blob_txs.py::test_blob_type_tx_pre_fork[fork_ShanghaiToCancunAtTime15k-blockchain_test_engine_from_state_test-one_blob_tx]-reth
# 7702 test - no fix: its too expensive to check whether the storage is empty on each creation
# rest of tests - see above
eest/consume-rlp:
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_amount_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_amount_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_index_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_index_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_pubkey_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_pubkey_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_signature_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_signature_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_withdrawal_credentials_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_withdrawal_credentials_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Osaka-blockchain_test_engine-slice_bytes_False]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Osaka-blockchain_test_engine-slice_bytes_True]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_engine_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_engine_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_1-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_2-blockchain_test_engine_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_0-blockchain_test_engine_from_state_test-non-empty-balance-correct-initcode]-reth
# Blob limit tests:
#
# tests/osaka/eip7594_peerdas/test_max_blob_per_tx.py::test_max_blobs_per_tx_fork_transition[fork_PragueToOsakaAtTime15k-blob_count_7-blockchain_test]
# this test inserts a chain via chain.rlp where the last block is invalid, but expects import to stop there, this doesn't work properly with our pipeline import approach hence the import fails when the invalid block is detected.
#. In other words, if this test fails, this means we're correctly rejecting the block.
#. The same test exists in the consume-engine simulator where it is passing as expected
eels/consume-rlp:
- tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_set_code_to_non_empty_storage[fork_Prague-blockchain_test-zero_nonce]-reth
- tests/prague/eip7251_consolidations/test_modified_consolidation_contract.py::test_system_contract_errors[fork_Prague-blockchain_test_engine-system_contract_reaches_gas_limit-system_contract_0x0000bbddc7ce488642fb579f8b00f3a590007251]-reth
- tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth
@@ -92,13 +170,74 @@ eest/consume-rlp:
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_signature_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Prague-blockchain_test_engine-log_argument_withdrawal_credentials_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_amount_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_amount_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_index_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_index_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_pubkey_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_pubkey_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_signature_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_signature_size-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_withdrawal_credentials_offset-value_zero]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_layout[fork_Osaka-blockchain_test_engine-log_argument_withdrawal_credentials_size-value_zero]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-nonzero_balance]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test_engine-deploy_after_fork-zero_balance]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_False]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Prague-blockchain_test_engine-slice_bytes_True]-reth
- tests/prague/eip7251_consolidations/test_modified_consolidation_contract.py::test_system_contract_errors[fork_Prague-blockchain_test-system_contract_reaches_gas_limit-system_contract_0x0000bbddc7ce488642fb579f8b00f3a590007251]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Osaka-blockchain_test_engine-slice_bytes_False]-reth
- tests/prague/eip6110_deposits/test_modified_contract.py::test_invalid_log_length[fork_Osaka-blockchain_test_engine-slice_bytes_True]-reth
- tests/osaka/eip7594_peerdas/test_max_blob_per_tx.py::test_max_blobs_per_tx_fork_transition[fork_PragueToOsakaAtTime15k-blob_count_7-blockchain_test]-reth
- tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-nonzero_balance]-reth
- tests/prague/eip7251_consolidations/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-zero_balance]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_modified_withdrawal_contract.py::test_system_contract_errors[fork_Prague-blockchain_test-system_contract_reaches_gas_limit-system_contract_0x00000961ef480eb55e80d19ad83579a64c007002]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-nonzero_balance]-reth
- tests/prague/eip7002_el_triggerable_withdrawals/test_contract_deployment.py::test_system_contract_deployment[fork_CancunToPragueAtTime15k-blockchain_test-deploy_after_fork-zero_balance]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_1-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_0-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_0-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_2-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_1-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_1-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_1-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_2-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_1-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_2-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_0-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_2-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_1-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Cancun-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Osaka-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Paris-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Prague-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_from_state_test-opcode_CREATE-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_0-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_opcode[fork_Shanghai-blockchain_test_from_state_test-opcode_CREATE2-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_1-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_2-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_1-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_2-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_1-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_2-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Osaka-tx_type_0-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_0-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_2-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Paris-tx_type_0-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_0-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Cancun-tx_type_0-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_2-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_1-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Prague-tx_type_2-blockchain_test_from_state_test-non-empty-balance-revert-initcode]-reth
- tests/paris/eip7610_create_collision/test_initcollision.py::test_init_collision_create_tx[fork_Shanghai-tx_type_0-blockchain_test_from_state_test-non-empty-balance-correct-initcode]-reth

36
.github/assets/hive/ignored_tests.yaml vendored Normal file
View File

@@ -0,0 +1,36 @@
# Ignored Tests Configuration
#
# This file contains tests that should be ignored for various reasons (flaky, known issues, etc).
# These tests will be IGNORED in the CI results - they won't cause the build to fail
# regardless of whether they pass or fail.
#
# Format
# test_suite:
# - "test name 1"
# - "test name 2"
#
# When a test should no longer be ignored, remove it from this list.
# flaky
engine-withdrawals:
- Withdrawals Fork on Block 1 - 8 Block Re-Org NewPayload (Paris) (reth)
- Withdrawals Fork on Block 8 - 10 Block Re-Org NewPayload (Paris) (reth)
- Withdrawals Fork on Canonical Block 8 / Side Block 7 - 10 Block Re-Org (Paris) (reth)
- Sync after 128 blocks - Withdrawals on Block 2 - Multiple Withdrawal Accounts (Paris) (reth)
engine-cancun:
- Transaction Re-Org, New Payload on Revert Back (Cancun) (reth)
- Transaction Re-Org, Re-Org to Different Block (Cancun) (reth)
- Transaction Re-Org, Re-Org Out (Cancun) (reth)
- Invalid Missing Ancestor ReOrg, StateRoot, EmptyTxs=False, Invalid P9 (Cancun) (reth)
- Multiple New Payloads Extending Canonical Chain, Wait for Canonical Payload (Cancun) (reth)
engine-api:
- Transaction Re-Org, Re-Org Out (Paris) (reth)
- Transaction Re-Org, Re-Org to Different Block (Paris) (reth)
- Transaction Re-Org, New Payload on Revert Back (Paris) (reth)
- Transaction Re-Org, Re-Org to Different Block (Paris) (reth)
- Invalid Missing Ancestor Syncing ReOrg, Transaction Nonce, EmptyTxs=False, CanonicalReOrg=False, Invalid P9 (Paris) (reth)
- Invalid Missing Ancestor Syncing ReOrg, Transaction Signature, EmptyTxs=False, CanonicalReOrg=True, Invalid P9 (Paris) (reth)
- Invalid Missing Ancestor Syncing ReOrg, Transaction Signature, EmptyTxs=False, CanonicalReOrg=False, Invalid P9 (Paris) (reth)
- Invalid Missing Ancestor ReOrg, StateRoot, EmptyTxs=True, Invalid P10 (Paris) (reth)
- Multiple New Payloads Extending Canonical Chain, Wait for Canonical Payload (Paris) (reth)
- Multiple New Payloads Extending Canonical Chain, Set Head to First Payload Received (Paris) (reth)

View File

@@ -11,8 +11,8 @@ IMAGES=(
"/tmp/smoke_genesis.tar"
"/tmp/smoke_network.tar"
"/tmp/ethereum_sync.tar"
"/tmp/eest_engine.tar"
"/tmp/eest_rlp.tar"
"/tmp/eels_engine.tar"
"/tmp/eels_rlp.tar"
"/tmp/reth_image.tar"
)

View File

@@ -7,6 +7,7 @@ import argparse
parser = argparse.ArgumentParser(description="Check for unexpected test results based on an exclusion list.")
parser.add_argument("report_json", help="Path to the hive report JSON file.")
parser.add_argument("--exclusion", required=True, help="Path to the exclusion YAML file.")
parser.add_argument("--ignored", required=True, help="Path to the ignored tests YAML file.")
args = parser.parse_args()
# Load hive JSON
@@ -18,13 +19,30 @@ with open(args.exclusion, 'r') as file:
exclusion_data = yaml.safe_load(file)
exclusions = exclusion_data.get(report['name'], [])
# Load ignored tests YAML
with open(args.ignored, 'r') as file:
ignored_data = yaml.safe_load(file)
ignored_tests = ignored_data.get(report['name'], [])
# Collect unexpected failures and passes
unexpected_failures = []
unexpected_passes = []
ignored_results = {'passed': [], 'failed': []}
for test in report['testCases'].values():
test_name = test['name']
test_pass = test['summaryResult']['pass']
# Check if this is an ignored test
if test_name in ignored_tests:
# Track ignored test results for informational purposes
if test_pass:
ignored_results['passed'].append(test_name)
else:
ignored_results['failed'].append(test_name)
continue # Skip this test - don't count it as unexpected
# Check against expected failures
if test_name in exclusions:
if test_pass:
unexpected_passes.append(test_name)
@@ -32,6 +50,19 @@ for test in report['testCases'].values():
if not test_pass:
unexpected_failures.append(test_name)
# Print summary of ignored tests if any were ignored
if ignored_results['passed'] or ignored_results['failed']:
print("Ignored Tests:")
if ignored_results['passed']:
print(f" Passed ({len(ignored_results['passed'])} tests):")
for test in ignored_results['passed']:
print(f" {test}")
if ignored_results['failed']:
print(f" Failed ({len(ignored_results['failed'])} tests):")
for test in ignored_results['failed']:
print(f" {test}")
print()
# Check if there are any unexpected failures or passes and exit with error
if unexpected_failures or unexpected_passes:
if unexpected_failures:

View File

@@ -7,7 +7,7 @@ sim="${1}"
limit="${2}"
run_hive() {
hive --sim "${sim}" --sim.limit "${limit}" --sim.parallelism 8 --client reth 2>&1 | tee /tmp/log || true
hive --sim "${sim}" --sim.limit "${limit}" --sim.parallelism 16 --client reth 2>&1 | tee /tmp/log || true
}
check_log() {

View File

@@ -4,7 +4,6 @@ ethereum_package:
el_extra_params:
- "--rpc.eth-proof-window=100"
cl_type: teku
cl_image: "consensys/teku:25.4.0"
network_params:
preset: minimal
genesis_delay: 5
@@ -19,12 +18,19 @@ ethereum_package:
}'
optimism_package:
chains:
- participants:
- el_type: op-geth
cl_type: op-node
- el_type: op-reth
cl_type: op-node
el_image: "ghcr.io/paradigmxyz/op-reth:kurtosis-ci"
chain0:
participants:
node0:
el:
type: op-geth
cl:
type: op-node
node1:
el:
type: op-reth
image: "ghcr.io/paradigmxyz/op-reth:kurtosis-ci"
cl:
type: op-node
network_params:
holocene_time_offset: 0
isthmus_time_offset: 0

View File

@@ -11,18 +11,19 @@ env:
CARGO_TERM_COLOR: always
BASELINE: base
SEED: reth
RUSTC_WRAPPER: "sccache"
name: bench
jobs:
codspeed:
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
submodules: true
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -33,7 +34,8 @@ jobs:
- name: Build the benchmark target(s)
run: ./.github/scripts/codspeed-build.sh
- name: Run the benchmarks
uses: CodSpeedHQ/action@v3
uses: CodSpeedHQ/action@v4
with:
run: cargo codspeed run --workspace
mode: instrumentation
token: ${{ secrets.CODSPEED_TOKEN }}

View File

@@ -7,115 +7,58 @@ on:
branches: [main]
pull_request:
branches: [main]
types: [opened, reopened, synchronize, closed]
merge_group:
env:
RUSTC_WRAPPER: "sccache"
jobs:
test:
runs-on: ubuntu-latest
name: test
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Install mdbook
run: |
mkdir mdbook
curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.14/mdbook-v0.4.14-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
echo $(pwd)/mdbook >> $GITHUB_PATH
- name: Install mdbook-template
run: |
mkdir mdbook-template
curl -sSL https://github.com/sgoudham/mdbook-template/releases/latest/download/mdbook-template-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook-template
echo $(pwd)/mdbook-template >> $GITHUB_PATH
- name: Run tests
run: mdbook test
lint:
runs-on: ubuntu-latest
name: lint
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Install mdbook-linkcheck
run: |
mkdir mdbook-linkcheck
curl -sSL -o mdbook-linkcheck.zip https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/latest/download/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip
unzip mdbook-linkcheck.zip -d ./mdbook-linkcheck
chmod +x $(pwd)/mdbook-linkcheck/mdbook-linkcheck
echo $(pwd)/mdbook-linkcheck >> $GITHUB_PATH
- name: Run linkcheck
run: mdbook-linkcheck --standalone
build:
runs-on: ubuntu-latest
timeout-minutes: 60
runs-on: depot-ubuntu-latest-8
timeout-minutes: 90
steps:
- uses: actions/checkout@v4
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
- name: Install mdbook
run: |
mkdir mdbook
curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.14/mdbook-v0.4.14-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook
echo $(pwd)/mdbook >> $GITHUB_PATH
- name: Checkout
uses: actions/checkout@v6
- name: Install mdbook-template
run: |
mkdir mdbook-template
curl -sSL https://github.com/sgoudham/mdbook-template/releases/latest/download/mdbook-template-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=./mdbook-template
echo $(pwd)/mdbook-template >> $GITHUB_PATH
- uses: Swatinem/rust-cache@v2
- name: Install bun
uses: oven-sh/setup-bun@v2
with:
cache-on-failure: true
bun-version: v1.2.23
- name: Build book
run: mdbook build
- name: Install Playwright browsers
# Required for rehype-mermaid to render Mermaid diagrams during build
run: |
cd docs/vocs/
bun i
npx playwright install --with-deps chromium
- name: Install Rust nightly
uses: dtolnay/rust-toolchain@nightly
- uses: mozilla-actions/sccache-action@v0.0.9
- name: Build docs
run: cargo docs --exclude "example-*"
env:
# Keep in sync with ./ci.yml:jobs.docs
RUSTDOCFLAGS: --cfg docsrs --show-type-layout --generate-link-to-definition --enable-index-page -Zunstable-options
run: cd docs/vocs && bash scripts/build-cargo-docs.sh
- name: Move docs to book folder
- name: Build Vocs
run: |
mv target/doc target/book/docs
cd docs/vocs/ && bun run build
echo "Vocs Build Complete"
- name: Archive artifact
shell: sh
run: |
chmod -c -R +rX "target/book" |
while read line; do
echo "::warning title=Invalid file permissions automatically fixed::$line"
done
tar \
--dereference --hard-dereference \
--directory "target/book" \
-cvf "$RUNNER_TEMP/artifact.tar" \
--exclude=.git \
--exclude=.github \
.
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-pages-artifact@v4
with:
name: github-pages
path: ${{ runner.temp }}/artifact.tar
retention-days: 1
if-no-files-found: error
path: "./docs/vocs/docs/dist"
deploy:
# Only deploy if a push to main
if: github.ref_name == 'main' && github.event_name == 'push'
runs-on: ubuntu-latest
needs: [test, lint, build]
needs: [build]
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:

View File

@@ -1,57 +0,0 @@
name: build release binaries
on:
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
jobs:
build:
name: build release
runs-on: ${{ matrix.configs.os }}
strategy:
matrix:
configs:
- target: x86_64-unknown-linux-gnu
os: ubuntu-24.04
profile: maxperf
- target: aarch64-unknown-linux-gnu
os: ubuntu-24.04
profile: maxperf
- target: x86_64-apple-darwin
os: macos-13
profile: maxperf
- target: aarch64-apple-darwin
os: macos-14
profile: maxperf
- target: x86_64-pc-windows-gnu
os: ubuntu-24.04
profile: maxperf
build:
- command: build
binary: reth
- command: op-build
binary: op-reth
steps:
- uses: actions/checkout@v4
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: ${{ matrix.configs.target }}
- name: Install cross main
id: cross_main
run: |
cargo install cross --git https://github.com/cross-rs/cross
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Apple M1 setup
if: matrix.configs.target == 'aarch64-apple-darwin'
run: |
echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV
echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV
- name: Build Reth
run: make PROFILE=${{ matrix.configs.profile }} ${{ matrix.build.command }}-${{ matrix.configs.target }}

View File

@@ -13,12 +13,12 @@ on:
env:
CARGO_TERM_COLOR: always
RUSTC_WRAPPER: "sccache"
name: compact-codec
jobs:
compact-codec:
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
strategy:
matrix:
bin:
@@ -27,11 +27,12 @@ jobs:
steps:
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Checkout base
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
ref: ${{ github.base_ref || 'main' }}
# On `main` branch, generates test vectors and serializes them to disk using `Compact`.
@@ -39,7 +40,7 @@ jobs:
run: |
${{ matrix.bin }} -- test-vectors compact --write
- name: Checkout PR
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
clean: false
# On incoming merge try to read and decode previously generated vectors with `Compact`

View File

@@ -33,7 +33,7 @@ jobs:
- name: 'Build and push the git-sha-tagged op-reth image'
command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME GIT_SHA=$GIT_SHA PROFILE=maxperf op-docker-build-push-git-sha'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2

View File

@@ -35,7 +35,7 @@ jobs:
- name: 'Build and push the nightly profiling op-reth image'
command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=profiling op-docker-build-push-nightly-profiling'
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Remove bloatware
uses: laverdet/remove-bloatware@v1.0.0
with:

73
.github/workflows/docker-tag-latest.yml vendored Normal file
View File

@@ -0,0 +1,73 @@
# Tag a specific Docker release version as latest
name: docker-tag-latest
on:
workflow_dispatch:
inputs:
version:
description: 'Release version to tag as latest (e.g., v1.8.4)'
required: true
type: string
tag_reth:
description: 'Tag reth image as latest'
required: false
type: boolean
default: true
tag_op_reth:
description: 'Tag op-reth image as latest'
required: false
type: boolean
default: false
env:
DOCKER_USERNAME: ${{ github.actor }}
jobs:
tag-reth-latest:
name: Tag reth as latest
runs-on: ubuntu-24.04
if: ${{ inputs.tag_reth }}
permissions:
packages: write
contents: read
steps:
- name: Log in to Docker
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin
- name: Pull reth release image
run: |
docker pull ghcr.io/${{ github.repository_owner }}/reth:${{ inputs.version }}
- name: Tag reth as latest
run: |
docker tag ghcr.io/${{ github.repository_owner }}/reth:${{ inputs.version }} ghcr.io/${{ github.repository_owner }}/reth:latest
- name: Push reth latest tag
run: |
docker push ghcr.io/${{ github.repository_owner }}/reth:latest
tag-op-reth-latest:
name: Tag op-reth as latest
runs-on: ubuntu-24.04
if: ${{ inputs.tag_op_reth }}
permissions:
packages: write
contents: read
steps:
- name: Log in to Docker
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin
- name: Pull op-reth release image
run: |
docker pull ghcr.io/${{ github.repository_owner }}/op-reth:${{ inputs.version }}
- name: Tag op-reth as latest
run: |
docker tag ghcr.io/${{ github.repository_owner }}/op-reth:${{ inputs.version }} ghcr.io/${{ github.repository_owner }}/op-reth:latest
- name: Push op-reth latest tag
run: |
docker push ghcr.io/${{ github.repository_owner }}/op-reth:latest

View File

@@ -8,7 +8,6 @@ on:
- v*
env:
REPO_NAME: ${{ github.repository_owner }}/reth
IMAGE_NAME: ${{ github.repository_owner }}/reth
OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth
CARGO_TERM_COLOR: always
@@ -17,8 +16,9 @@ env:
DOCKER_USERNAME: ${{ github.actor }}
jobs:
build:
name: build and push
build-rc:
if: contains(github.ref, '-rc')
name: build and push as release candidate
runs-on: ubuntu-24.04
permissions:
packages: write
@@ -27,16 +27,48 @@ jobs:
fail-fast: false
matrix:
build:
- name: 'Build and push reth image'
command: 'make PROFILE=maxperf docker-build-push'
- name: 'Build and push reth image, tag as "latest"'
command: 'make PROFILE=maxperf docker-build-push-latest'
- name: 'Build and push op-reth image'
command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push'
- name: 'Build and push op-reth image, tag as "latest"'
command: 'make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push-latest'
- name: "Build and push reth image"
command: "make IMAGE_NAME=$IMAGE_NAME DOCKER_IMAGE_NAME=$DOCKER_IMAGE_NAME PROFILE=maxperf docker-build-push"
- name: "Build and push op-reth image"
command: "make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push"
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Install cross main
id: cross_main
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Log in to Docker
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io --username ${DOCKER_USERNAME} --password-stdin
- name: Set up Docker builder
run: |
docker run --privileged --rm tonistiigi/binfmt --install arm64,amd64
docker buildx create --use --name cross-builder
- name: Build and push ${{ matrix.build.name }}
run: ${{ matrix.build.command }}
build:
if: ${{ !contains(github.ref, '-rc') }}
name: build and push as latest
runs-on: ubuntu-24.04
permissions:
packages: write
contents: read
strategy:
fail-fast: false
matrix:
build:
- name: "Build and push reth image"
command: "make IMAGE_NAME=$IMAGE_NAME DOCKER_IMAGE_NAME=$DOCKER_IMAGE_NAME PROFILE=maxperf docker-build-push-latest"
- name: "Build and push op-reth image"
command: "make IMAGE_NAME=$OP_IMAGE_NAME DOCKER_IMAGE_NAME=$OP_DOCKER_IMAGE_NAME PROFILE=maxperf op-docker-build-push-latest"
steps:
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2

46
.github/workflows/e2e.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
# Runs e2e tests using the testsuite framework
name: e2e
on:
pull_request:
merge_group:
push:
branches: [main]
env:
CARGO_TERM_COLOR: always
SEED: rustethereumethereumrust
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
test:
name: e2e-testsuite
runs-on: depot-ubuntu-latest-4
env:
RUST_BACKTRACE: 1
timeout-minutes: 90
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: taiki-e/install-action@nextest
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Run e2e tests
run: |
cargo nextest run \
--locked --features "asm-keccak" \
--workspace \
--exclude 'example-*' \
--exclude 'exex-subscription' \
--exclude 'reth-bench' \
--exclude 'ef-tests' \
--exclude 'op-reth' \
--exclude 'reth' \
-E 'binary(e2e_testsuite)'

21
.github/workflows/grafana.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: grafana
on:
pull_request:
merge_group:
push:
branches: [main]
jobs:
check-dashboard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Check for ${DS_PROMETHEUS} in overview.json
run: |
if grep -Fn '${DS_PROMETHEUS}' etc/grafana/dashboards/overview.json; then
echo "Error: overview.json contains '\${DS_PROMETHEUS}' placeholder"
echo "Please replace it with '\${datasource}'"
exit 1
fi
echo "✓ overview.json does not contain '\${DS_PROMETHEUS}' placeholder"

View File

@@ -24,32 +24,55 @@ jobs:
prepare-hive:
if: github.repository == 'paradigmxyz/reth'
timeout-minutes: 45
runs-on:
group: Reth
runs-on: depot-ubuntu-latest-16
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Checkout hive tests
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: ethereum/hive
ref: master
path: hivetests
- uses: actions/setup-go@v5
- name: Get hive commit hash
id: hive-commit
run: echo "hash=$(cd hivetests && git rev-parse HEAD)" >> $GITHUB_OUTPUT
- uses: actions/setup-go@v6
with:
go-version: "^1.13.1"
- run: go version
- name: Restore hive assets cache
id: cache-hive
uses: actions/cache@v5
with:
path: ./hive_assets
key: hive-assets-${{ steps.hive-commit.outputs.hash }}-${{ hashFiles('.github/assets/hive/build_simulators.sh') }}
- name: Build hive assets
if: steps.cache-hive.outputs.cache-hit != 'true'
run: .github/assets/hive/build_simulators.sh
- name: Load cached Docker images
if: steps.cache-hive.outputs.cache-hit == 'true'
run: |
cd hive_assets
for tar_file in *.tar; do
if [ -f "$tar_file" ]; then
echo "Loading $tar_file..."
docker load -i "$tar_file"
fi
done
# Make hive binary executable
chmod +x hive
- name: Upload hive assets
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: hive_assets
path: ./hive_assets
test:
timeout-minutes: 60
timeout-minutes: 120
strategy:
fail-fast: false
matrix:
@@ -113,57 +136,64 @@ jobs:
- debug_
# consume-engine
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/osaka.*
- sim: ethereum/eels/consume-engine
limit: .*tests/prague.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/cancun.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/shanghai.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/berlin.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/istanbul.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/homestead.*
- sim: ethereum/eest/consume-engine
- sim: ethereum/eels/consume-engine
limit: .*tests/frontier.*
- sim: ethereum/eels/consume-engine
limit: .*tests/paris.*
# consume-rlp
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/osaka.*
- sim: ethereum/eels/consume-rlp
limit: .*tests/prague.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/cancun.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/shanghai.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/berlin.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/istanbul.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/homestead.*
- sim: ethereum/eest/consume-rlp
- sim: ethereum/eels/consume-rlp
limit: .*tests/frontier.*
- sim: ethereum/eels/consume-rlp
limit: .*tests/paris.*
needs:
- prepare-reth
- prepare-hive
name: run ${{ matrix.scenario.sim }}${{ matrix.scenario.limit && format(' - {0}', matrix.scenario.limit) }}
runs-on:
group: Reth
runs-on: depot-ubuntu-latest-16
permissions:
issues: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download hive assets
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: hive_assets
path: /tmp
- name: Download reth image
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: artifacts
path: /tmp
@@ -177,7 +207,7 @@ jobs:
chmod +x /usr/local/bin/hive
- name: Checkout hive tests
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: ethereum/hive
ref: master
@@ -201,7 +231,7 @@ jobs:
- name: Parse hive output
run: |
find hivetests/workspace/logs -type f -name "*.json" ! -name "hive.json" | xargs -I {} python .github/assets/hive/parse.py {} --exclusion .github/assets/hive/expected_failures.yaml
find hivetests/workspace/logs -type f -name "*.json" ! -name "hive.json" | xargs -I {} python .github/assets/hive/parse.py {} --exclusion .github/assets/hive/expected_failures.yaml --ignored .github/assets/hive/ignored_tests.yaml
- name: Print simulator output
if: ${{ failure() }}
@@ -215,8 +245,7 @@ jobs:
notify-on-error:
needs: test
if: failure()
runs-on:
group: Reth
runs-on: ubuntu-latest
steps:
- name: Slack Webhook Action
uses: rtCamp/action-slack-notify@v2

View File

@@ -8,12 +8,13 @@ on:
push:
branches: [main]
schedule:
# Run once a day at 3:00 UTC
- cron: '0 3 * * *'
# Run once a day at 3:00 UTC
- cron: "0 3 * * *"
env:
CARGO_TERM_COLOR: always
SEED: rustethereumethereumrust
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -23,8 +24,7 @@ jobs:
test:
name: test / ${{ matrix.network }}
if: github.event_name != 'schedule'
runs-on:
group: Reth
runs-on: depot-ubuntu-latest-4
env:
RUST_BACKTRACE: 1
strategy:
@@ -32,12 +32,13 @@ jobs:
network: ["ethereum", "optimism"]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- name: Install Geth
run: .github/assets/install_geth.sh
- uses: taiki-e/install-action@nextest
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -47,7 +48,7 @@ jobs:
cargo nextest run \
--locked --features "asm-keccak ${{ matrix.network }}" \
--workspace --exclude ef-tests \
-E "kind(test)"
-E "kind(test) and not binary(e2e_testsuite)"
- if: matrix.network == 'optimism'
name: Run tests
run: |
@@ -66,17 +67,18 @@ jobs:
with:
jobs: ${{ toJSON(needs) }}
era-files:
era-files:
name: era1 file integration tests once a day
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@nextest
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: run era1 files integration tests
run: cargo nextest run --package reth-era --test it -- --ignored
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@nextest
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: run era1 files integration tests
run: cargo nextest run --release --package reth-era --test it -- --ignored

View File

@@ -9,7 +9,7 @@ on:
push:
tags:
- '*'
- "*"
env:
CARGO_TERM_COLOR: always
@@ -32,17 +32,16 @@ jobs:
strategy:
fail-fast: false
name: run kurtosis
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
needs:
- prepare-reth
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download reth image
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: artifacts
path: /tmp
@@ -64,8 +63,8 @@ jobs:
kurtosis engine start
kurtosis run --enclave op-devnet github.com/ethpandaops/optimism-package --args-file .github/assets/kurtosis_op_network_params.yaml
ENCLAVE_ID=$(curl http://127.0.0.1:9779/api/enclaves | jq --raw-output 'keys[0]')
GETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-1-op-geth-op-node-op-kurtosis".public_ports.rpc.number')
RETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-2-op-reth-op-node-op-kurtosis".public_ports.rpc.number')
GETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-node0-op-geth".public_ports.rpc.number')
RETH_PORT=$(curl "http://127.0.0.1:9779/api/enclaves/$ENCLAVE_ID/services" | jq '."op-el-2151908-node1-op-reth".public_ports.rpc.number')
echo "GETH_RPC=http://127.0.0.1:$GETH_PORT" >> $GITHUB_ENV
echo "RETH_RPC=http://127.0.0.1:$RETH_PORT" >> $GITHUB_ENV
@@ -83,12 +82,10 @@ jobs:
kurtosis service logs -a op-devnet op-cl-2151908-2-op-node-op-reth-op-kurtosis
exit 1
notify-on-error:
needs: test
if: failure()
runs-on:
group: Reth
runs-on: ubuntu-latest
steps:
- name: Slack Webhook Action
uses: rtCamp/action-slack-notify@v2

View File

@@ -9,7 +9,7 @@ on:
push:
tags:
- '*'
- "*"
env:
CARGO_TERM_COLOR: always
@@ -30,17 +30,16 @@ jobs:
strategy:
fail-fast: false
name: run kurtosis
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
needs:
- prepare-reth
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download reth image
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: artifacts
path: /tmp
@@ -54,13 +53,12 @@ jobs:
- name: Run kurtosis
uses: ethpandaops/kurtosis-assertoor-github-action@v1
with:
ethereum_package_args: '.github/assets/kurtosis_network_params.yaml'
ethereum_package_args: ".github/assets/kurtosis_network_params.yaml"
notify-on-error:
needs: test
if: failure()
runs-on:
group: Reth
runs-on: ubuntu-latest
steps:
- name: Slack Webhook Action
uses: rtCamp/action-slack-notify@v2

View File

@@ -11,12 +11,12 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Label PRs
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
const label_pr = require('./.github/assets/label_pr.js')

View File

@@ -12,7 +12,7 @@ jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Download actionlint
id: get_actionlint
run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)

View File

@@ -8,11 +8,12 @@ on:
env:
CARGO_TERM_COLOR: always
RUSTC_WRAPPER: "sccache"
jobs:
clippy-binaries:
name: clippy binaries / ${{ matrix.type }}
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
strategy:
matrix:
@@ -20,15 +21,13 @@ jobs:
- type: ethereum
args: --workspace --lib --examples --tests --benches --locked
features: "ethereum asm-keccak jemalloc jemalloc-prof min-error-logs min-warn-logs min-info-logs min-debug-logs min-trace-logs"
- type: book
args: --manifest-path book/sources/Cargo.toml --workspace --bins
features: ""
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@clippy
with:
components: clippy
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -43,14 +42,15 @@ jobs:
clippy:
name: clippy
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
with:
components: clippy
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -59,15 +59,16 @@ jobs:
RUSTFLAGS: -D warnings
wasm:
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: wasm32-wasip1
- uses: taiki-e/install-action@cargo-hack
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -78,15 +79,16 @@ jobs:
.github/assets/check_wasm.sh
riscv:
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: riscv32imac-unknown-none-elf
- uses: taiki-e/install-action@cargo-hack
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -95,21 +97,27 @@ jobs:
run: .github/assets/check_rv32imac.sh
crate-checks:
runs-on: ubuntu-latest
timeout-minutes: 30
name: crate-checks (${{ matrix.partition }}/${{ matrix.total_partitions }})
runs-on: depot-ubuntu-latest-4
strategy:
matrix:
partition: [1, 2, 3]
total_partitions: [3]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@cargo-hack
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- run: cargo hack check --workspace
- run: cargo hack check --workspace --partition ${{ matrix.partition }}/${{ matrix.total_partitions }}
msrv:
name: MSRV
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
strategy:
matrix:
@@ -117,11 +125,12 @@ jobs:
- binary: reth
- binary: op-reth
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.86" # MSRV
toolchain: "1.88" # MSRV
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -131,12 +140,13 @@ jobs:
docs:
name: docs
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest-4
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -148,27 +158,27 @@ jobs:
fmt:
name: fmt
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
with:
components: rustfmt
- uses: mozilla-actions/sccache-action@v0.0.9
- name: Run fmt
run: cargo fmt --all --check
- name: Run fmt on book sources
run: cargo fmt --manifest-path book/sources/Cargo.toml --all --check
udeps:
name: udeps
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -177,39 +187,39 @@ jobs:
book:
name: book
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@nightly
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- run: cargo build --bin reth --workspace --features ethereum
- run: cargo build --bin reth --workspace
- run: cargo build --bin op-reth --workspace
env:
RUSTFLAGS: -D warnings
- run: ./book/cli/update.sh target/debug/reth
- name: Check book changes
- run: ./docs/cli/update.sh target/debug/reth target/debug/op-reth
- name: Check docs changes
run: git diff --exit-code
codespell:
typos:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: codespell-project/actions-codespell@v2
with:
skip: "*.json"
- uses: actions/checkout@v6
- uses: crate-ci/typos@v1
check-toml:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Run dprint
uses: dprint/check@v2.2
uses: dprint/check@v2.3
with:
config-path: dprint.json
@@ -217,7 +227,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Check dashboard JSON with jq
uses: sergeysova/jq-action@v2
with:
@@ -227,45 +237,52 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- name: Ensure no arbitrary or proptest dependency on default build
run: cargo tree --package reth -e=features,no-dev | grep -Eq "arbitrary|proptest" && exit 1 || exit 0
# Checks that selected rates can compile with power set of features
# Checks that selected crates can compile with power set of features
features:
name: features
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@clippy
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: cargo install cargo-hack
uses: taiki-e/install-action@cargo-hack
- run: make check-features
- run: |
cargo hack check \
--package reth-codecs \
--package reth-primitives-traits \
--package reth-primitives \
--feature-powerset \
--depth 2
env:
RUSTFLAGS: -D warnings
# Check crates correctly propagate features
feature-propagation:
runs-on: ubuntu-latest
runs-on: depot-ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- name: fetch deps
run: |
# Eagerly pull dependencies
time cargo metadata --format-version=1 --locked > /dev/null
- name: run zepter
run: |
cargo install zepter -f --locked
zepter --version
time zepter run check
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: rui314/setup-mold@v1
- uses: taiki-e/cache-cargo-install-action@v2
with:
tool: zepter
- name: Eagerly pull dependencies
run: cargo metadata --format-version=1 --locked > /dev/null
- run: zepter run check
deny:
uses: ithacaxyz/ci/.github/workflows/deny.yml@main
@@ -283,7 +300,7 @@ jobs:
- fmt
- udeps
- book
- codespell
- typos
- grafana
- no-test-deps
- features

View File

@@ -21,7 +21,7 @@ jobs:
steps:
- name: Check title
id: lint_pr_title
uses: amannn/action-semantic-pull-request@v5
uses: amannn/action-semantic-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
@@ -30,6 +30,7 @@ jobs:
fix
chore
test
bench
perf
refactor
docs
@@ -55,23 +56,24 @@ jobs:
- `fix`: Patches a bug
- `chore`: General maintenance tasks or updates
- `test`: Adding new tests or modifying existing tests
- `bench`: Adding new benchmarks or modifying existing benchmarks
- `perf`: Performance improvements
- `refactor`: Changes to improve code structure
- `docs`: Documentation updates
- `ci`: Changes to CI/CD configurations
- `revert`: Reverts a previously merged PR
- `deps`: Updates dependencies
**Breaking Changes**
Breaking changes are noted by using an exclamation mark. For example:
- `feat!: changed the API`
- `chore(node)!: Removed unused public function`
**Help**
For more information, follow the guidelines here: https://www.conventionalcommits.org/en/v1.0.0/
- name: Remove Comment for Valid Title
if: steps.lint_pr_title.outcome == 'success'
uses: marocchino/sticky-pull-request-comment@v2

View File

@@ -26,10 +26,9 @@ jobs:
prepare-reth:
if: github.repository == 'paradigmxyz/reth'
timeout-minutes: 45
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- run: mkdir artifacts
- name: Set up Docker Buildx
@@ -51,7 +50,7 @@ jobs:
- name: Upload reth image
id: upload
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: artifacts
path: ./artifacts

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Update Homebrew formula
uses: dawidd6/action-homebrew-bump-formula@v4
uses: dawidd6/action-homebrew-bump-formula@v7
with:
token: ${{ secrets.HOMEBREW }}
no_fork: true

View File

@@ -1,11 +1,11 @@
# This workflow is for building and pushing reproducible Docker images for releases.
# This workflow is for building and pushing reproducible artifacts for releases
name: release-reproducible
on:
push:
tags:
- v*
workflow_run:
workflows: [release]
types: [completed]
env:
DOCKER_REPRODUCIBLE_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/reth-reproducible
@@ -13,23 +13,41 @@ env:
jobs:
extract-version:
name: extract version
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Extract version
run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_OUTPUT
- name: Extract version from triggering tag
id: extract_version
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Get the tag that points to the head SHA of the triggering workflow
TAG=$(gh api /repos/${{ github.repository }}/git/refs/tags \
--jq '.[] | select(.object.sha == "${{ github.event.workflow_run.head_sha }}") | .ref' \
| head -1 \
| sed 's|refs/tags/||')
if [ -z "$TAG" ]; then
echo "No tag found for SHA ${{ github.event.workflow_run.head_sha }}"
exit 1
fi
echo "VERSION=$TAG" >> $GITHUB_OUTPUT
outputs:
VERSION: ${{ steps.extract_version.outputs.VERSION }}
build-reproducible:
name: build and push reproducible image
name: build and push reproducible image and binaries
runs-on: ubuntu-latest
needs: extract-version
needs: [extract-version]
permissions:
packages: write
contents: read
contents: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
ref: ${{ needs.extract-version.outputs.VERSION }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -40,12 +58,37 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push reproducible image
- name: Extract Rust version
id: rust_version
run: |
RUST_TOOLCHAIN=$(rustc --version | cut -d' ' -f2)
echo "RUST_TOOLCHAIN=$RUST_TOOLCHAIN" >> $GITHUB_OUTPUT
- name: Build reproducible artifacts
uses: docker/build-push-action@v6
id: docker_build
with:
context: .
file: ./Dockerfile.reproducible
build-args: |
RUST_TOOLCHAIN=${{ steps.rust_version.outputs.RUST_TOOLCHAIN }}
VERSION=${{ needs.extract-version.outputs.VERSION }}
target: artifacts
outputs: type=local,dest=./docker-artifacts
cache-from: type=gha
cache-to: type=gha,mode=max
env:
DOCKER_BUILD_RECORD_UPLOAD: false
- name: Build and push final image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile.reproducible
push: true
build-args: |
RUST_TOOLCHAIN=${{ steps.rust_version.outputs.RUST_TOOLCHAIN }}
VERSION=${{ needs.extract-version.outputs.VERSION }}
tags: |
${{ env.DOCKER_REPRODUCIBLE_IMAGE_NAME }}:${{ needs.extract-version.outputs.VERSION }}
${{ env.DOCKER_REPRODUCIBLE_IMAGE_NAME }}:latest
@@ -54,3 +97,30 @@ jobs:
provenance: false
env:
DOCKER_BUILD_RECORD_UPLOAD: false
- name: Prepare artifacts from Docker build
run: |
mkdir reproducible-artifacts
cp docker-artifacts/reth reproducible-artifacts/reth-reproducible-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu
cp docker-artifacts/*.deb reproducible-artifacts/reth-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu-reproducible.deb
- name: Configure GPG and create artifacts
env:
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
run: |
export GPG_TTY=$(tty)
echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --batch --import
cd reproducible-artifacts
tar -czf reth-reproducible-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu.tar.gz reth-reproducible-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu --remove-files
echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab reth-reproducible-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu.tar.gz
echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab reth-${{ needs.extract-version.outputs.VERSION }}-x86_64-unknown-linux-gnu-reproducible.deb
- name: Upload reproducible artifacts to release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload ${{ needs.extract-version.outputs.VERSION }} \
reproducible-artifacts/*

View File

@@ -20,8 +20,9 @@ env:
OP_IMAGE_NAME: ${{ github.repository_owner }}/op-reth
REPRODUCIBLE_IMAGE_NAME: ${{ github.repository_owner }}/reth-reproducible
CARGO_TERM_COLOR: always
DOCKER_IMAGE_NAME_URL: ghcr.io/${{ github.repository_owner }}/reth
DOCKER_OP_IMAGE_NAME_URL: ghcr.io/${{ github.repository_owner }}/op-reth
DOCKER_IMAGE_NAME_URL: https://ghcr.io/${{ github.repository_owner }}/reth
DOCKER_OP_IMAGE_NAME_URL: https://ghcr.io/${{ github.repository_owner }}/op-reth
RUSTC_WRAPPER: "sccache"
jobs:
dry-run:
@@ -43,39 +44,69 @@ jobs:
outputs:
VERSION: ${{ steps.extract_version.outputs.VERSION }}
check-version:
name: check version
runs-on: ubuntu-latest
needs: extract-version
if: ${{ github.event.inputs.dry_run != 'true' }}
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- name: Verify crate version matches tag
# Check that the Cargo version starts with the tag,
# so that Cargo version 1.4.8 can be matched against both v1.4.8 and v1.4.8-rc.1
run: |
tag="${{ needs.extract-version.outputs.VERSION }}"
tag=${tag#v}
cargo_ver=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
[[ "$tag" == "$cargo_ver"* ]] || { echo "Tag $tag doesnt match the Cargo version $cargo_ver"; exit 1; }
build:
name: build release
runs-on: ${{ matrix.configs.os }}
needs: extract-version
continue-on-error: ${{ matrix.configs.allow_fail }}
strategy:
fail-fast: true
matrix:
configs:
- target: x86_64-unknown-linux-gnu
os: ubuntu-24.04
profile: maxperf
allow_fail: false
- target: aarch64-unknown-linux-gnu
os: ubuntu-24.04
profile: maxperf
allow_fail: false
- target: x86_64-apple-darwin
os: macos-13
os: macos-14
profile: maxperf
allow_fail: false
- target: aarch64-apple-darwin
os: macos-14
profile: maxperf
allow_fail: false
- target: x86_64-pc-windows-gnu
os: ubuntu-24.04
profile: maxperf
allow_fail: false
- target: riscv64gc-unknown-linux-gnu
os: ubuntu-24.04
profile: maxperf
allow_fail: true
build:
- command: build
binary: reth
- command: op-build
binary: op-reth
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: ${{ matrix.configs.target }}
- uses: mozilla-actions/sccache-action@v0.0.9
- name: Install cross main
id: cross_main
run: |
@@ -113,22 +144,22 @@ jobs:
- name: Upload artifact
if: ${{ github.event.inputs.dry_run != 'true' }}
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz
path: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz
- name: Upload signature
if: ${{ github.event.inputs.dry_run != 'true' }}
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz.asc
path: ${{ matrix.build.binary }}-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.configs.target }}.tar.gz.asc
draft-release:
name: draft release
needs: [build, extract-version]
runs-on: ubuntu-latest
needs: [build, extract-version]
if: ${{ github.event.inputs.dry_run != 'true' }}
env:
VERSION: ${{ needs.extract-version.outputs.VERSION }}
@@ -138,11 +169,11 @@ jobs:
steps:
# This is necessary for generating the changelog.
# It has to come before "Download Artifacts" or else it deletes the artifacts.
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
- name: Generate full changelog
id: changelog
run: |
@@ -156,6 +187,11 @@ jobs:
# The formatting here is borrowed from Lighthouse (which is borrowed from OpenEthereum):
# https://github.com/openethereum/openethereum/blob/6c2d392d867b058ff867c4373e40850ca3f96969/.github/workflows/build.yml
run: |
prerelease_flag=""
if [[ "${GITHUB_REF}" == *-rc* ]]; then
prerelease_flag="--prerelease"
fi
body=$(cat <<- "ENDBODY"
![image](https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-prod.png)
@@ -190,7 +226,7 @@ jobs:
| Payload Builders | <TODO> |
| Non-Payload Builders | <TODO> |
*See [Update Priorities](https://paradigmxyz.github.io/reth/installation/priorities.html) for more information about this table.*
*See [Update Priorities](https://reth.rs/installation/priorities) for more information about this table.*
## All Changes
@@ -198,7 +234,7 @@ jobs:
## Binaries
[See pre-built binaries documentation.](https://paradigmxyz.github.io/reth/installation/binaries.html)
[See pre-built binaries documentation.](https://reth.rs/installation/binaries)
The binaries are signed with the PGP key: `50FB 7CC5 5B2E 8AFA 59FE 03B7 AA5E D56A 7FBF 253E`
@@ -230,12 +266,12 @@ jobs:
assets+=("$asset/$asset")
done
tag_name="${{ env.VERSION }}"
echo "$body" | gh release create --draft -t "Reth $tag_name" -F "-" "$tag_name" "${assets[@]}"
echo "$body" | gh release create --draft $prerelease_flag -t "Reth $tag_name" -F "-" "$tag_name" "${assets[@]}"
dry-run-summary:
name: dry run summary
needs: [build, extract-version]
runs-on: ubuntu-latest
needs: [build, extract-version]
if: ${{ github.event.inputs.dry_run == 'true' }}
env:
VERSION: ${{ needs.extract-version.outputs.VERSION }}

View File

@@ -8,31 +8,73 @@ on:
jobs:
build:
name: build reproducible binaries
runs-on: ubuntu-latest
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- runner: ubuntu-latest
machine: machine-1
- runner: ubuntu-22.04
machine: machine-2
steps:
- uses: actions/checkout@v4
- uses: rui314/setup-mold@v1
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
target: x86_64-unknown-linux-gnu
- name: Install cross main
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build reproducible binary with Docker
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Install cargo-cache
RUST_TOOLCHAIN=$(rustc --version | cut -d' ' -f2)
docker build \
--build-arg "RUST_TOOLCHAIN=${RUST_TOOLCHAIN}" \
-f Dockerfile.reproducible -t reth:release \
--target artifacts \
--output type=local,dest=./target .
- name: Calculate SHA256
id: sha256
run: |
cargo install cargo-cache
- uses: Swatinem/rust-cache@v2
sha256sum target/reth > checksum.sha256
echo "Binaries SHA256 on ${{ matrix.machine }}: $(cat checksum.sha256)"
- name: Upload the hash
uses: actions/upload-artifact@v6
with:
cache-on-failure: true
- name: Build Reth
name: checksum-${{ matrix.machine }}
path: |
checksum.sha256
retention-days: 1
compare:
name: compare reproducible binaries
needs: build
runs-on: ubuntu-latest
steps:
- name: Download artifacts from machine-1
uses: actions/download-artifact@v7
with:
name: checksum-machine-1
path: machine-1/
- name: Download artifacts from machine-2
uses: actions/download-artifact@v7
with:
name: checksum-machine-2
path: machine-2/
- name: Compare SHA256 hashes
run: |
make build-reproducible
mv target/x86_64-unknown-linux-gnu/release/reth reth-build-1
- name: Clean cache
run: make clean && cargo cache -a
- name: Build Reth again
run: |
make build-reproducible
mv target/x86_64-unknown-linux-gnu/release/reth reth-build-2
- name: Compare binaries
run: cmp reth-build-1 reth-build-2
echo "=== SHA256 Comparison ==="
echo "Machine 1 hash:"
cat machine-1/checksum.sha256
echo "Machine 2 hash:"
cat machine-2/checksum.sha256
if cmp -s machine-1/checksum.sha256 machine-2/checksum.sha256; then
echo "✅ SUCCESS: Binaries are identical (reproducible build verified)"
else
echo "❌ FAILURE: Binaries differ (reproducible build failed)"
exit 1
fi

View File

@@ -12,6 +12,7 @@ env:
CARGO_TERM_COLOR: always
FROM_BLOCK: 0
TO_BLOCK: 50000
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -22,16 +23,16 @@ jobs:
name: stage-run-test
# Only run stage commands test in merge groups
if: github.event_name == 'merge_group'
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
env:
RUST_LOG: info,sync=error
RUST_BACKTRACE: 1
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true

View File

@@ -14,7 +14,7 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v9
- uses: actions/stale@v10
with:
days-before-stale: 21
days-before-close: 7

68
.github/workflows/sync-era.yml vendored Normal file
View File

@@ -0,0 +1,68 @@
# Runs sync tests with ERA stage enabled.
name: sync-era test
on:
workflow_dispatch:
schedule:
- cron: "0 */6 * * *"
env:
CARGO_TERM_COLOR: always
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
sync:
name: sync (${{ matrix.chain.bin }})
runs-on: depot-ubuntu-latest
env:
RUST_LOG: info,sync=error
RUST_BACKTRACE: 1
timeout-minutes: 60
strategy:
matrix:
chain:
- build: install
bin: reth
chain: mainnet
tip: "0x91c90676cab257a59cd956d7cb0bceb9b1a71d79755c23c7277a0697ccfaf8c4"
block: 100000
unwind-target: "0x52e0509d33a988ef807058e2980099ee3070187f7333aae12b64d4d675f34c5a"
- build: install-op
bin: op-reth
chain: base
tip: "0xbb9b85352c7ebca6ba8efc63bd66cecd038c92ec8ebd02e153a3e0b197e672b7"
block: 10000
unwind-target: "0x118a6e922a8c6cab221fc5adfe5056d2b72d58c6580e9c5629de55299e2cf8de"
steps:
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Build ${{ matrix.chain.bin }}
run: make ${{ matrix.chain.build }}
- name: Run sync with ERA enabled
run: |
${{ matrix.chain.bin }} node \
--chain ${{ matrix.chain.chain }} \
--debug.tip ${{ matrix.chain.tip }} \
--debug.max-block ${{ matrix.chain.block }} \
--debug.terminate \
--era.enable
- name: Verify the target block hash
run: |
${{ matrix.chain.bin }} db --chain ${{ matrix.chain.chain }} get static-file headers ${{ matrix.chain.block }} \
| grep ${{ matrix.chain.tip }}
- name: Run stage unwind for 100 blocks
run: |
${{ matrix.chain.bin }} stage unwind num-blocks 100 --chain ${{ matrix.chain.chain }}
- name: Run stage unwind to block hash
run: |
${{ matrix.chain.bin }} stage unwind to-block ${{ matrix.chain.unwind-target }} --chain ${{ matrix.chain.chain }}

View File

@@ -3,10 +3,13 @@
name: sync test
on:
merge_group:
workflow_dispatch:
schedule:
- cron: "0 */6 * * *"
env:
CARGO_TERM_COLOR: always
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -15,8 +18,7 @@ concurrency:
jobs:
sync:
name: sync (${{ matrix.chain.bin }})
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
env:
RUST_LOG: info,sync=error
RUST_BACKTRACE: 1
@@ -37,9 +39,10 @@ jobs:
block: 10000
unwind-target: "0x118a6e922a8c6cab221fc5adfe5056d2b72d58c6580e9c5629de55299e2cf8de"
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -61,4 +64,4 @@ jobs:
${{ matrix.chain.bin }} stage unwind num-blocks 100 --chain ${{ matrix.chain.chain }}
- name: Run stage unwind to block hash
run: |
${{ matrix.chain.bin }} stage unwind to-block ${{ matrix.chain.unwind-target }} --chain ${{ matrix.chain.chain }}
${{ matrix.chain.bin }} stage unwind to-block ${{ matrix.chain.unwind-target }} --chain ${{ matrix.chain.chain }}

View File

@@ -11,6 +11,7 @@ on:
env:
CARGO_TERM_COLOR: always
SEED: rustethereumethereumrust
RUSTC_WRAPPER: "sccache"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -19,8 +20,7 @@ concurrency:
jobs:
test:
name: test / ${{ matrix.type }} (${{ matrix.partition }}/${{ matrix.total_partitions }})
runs-on:
group: Reth
runs-on: depot-ubuntu-latest-4
env:
RUST_BACKTRACE: 1
strategy:
@@ -42,15 +42,12 @@ jobs:
args: --features "asm-keccak" --locked --exclude reth --exclude reth-bench --exclude "example-*" --exclude "reth-ethereum-*" --exclude "*-ethereum"
partition: 2
total_partitions: 2
- type: book
args: --manifest-path book/sources/Cargo.toml
partition: 1
total_partitions: 1
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -65,29 +62,38 @@ jobs:
${{ matrix.args }} --workspace \
--exclude ef-tests --no-tests=warn \
--partition hash:${{ matrix.partition }}/2 \
-E "!kind(test)"
-E "!kind(test) and not binary(e2e_testsuite)"
state:
name: Ethereum state tests
runs-on:
group: Reth
runs-on: depot-ubuntu-latest-4
env:
RUST_LOG: info,sync=error
RUST_BACKTRACE: 1
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Checkout ethereum/tests
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
repository: ethereum/tests
ref: 81862e4848585a438d64f911a19b3825f0f4cd95
path: testing/ef-tests/ethereum-tests
submodules: recursive
fetch-depth: 1
- name: Download & extract EEST fixtures (public)
shell: bash
env:
EEST_TESTS_TAG: v4.5.0
run: |
set -euo pipefail
mkdir -p testing/ef-tests/execution-spec-tests
URL="https://github.com/ethereum/execution-spec-tests/releases/download/${EEST_TESTS_TAG}/fixtures_stable.tar.gz"
curl -L "$URL" | tar -xz --strip-components=1 -C testing/ef-tests/execution-spec-tests
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: taiki-e/install-action@nextest
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -95,15 +101,15 @@ jobs:
doc:
name: doc tests
runs-on:
group: Reth
runs-on: depot-ubuntu-latest
env:
RUST_BACKTRACE: 1
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Install required tools
run: |
@@ -27,7 +27,7 @@ jobs:
./fetch_superchain_config.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@v8
with:
commit-message: "chore: update superchain config"
title: "chore: update superchain config"

View File

@@ -9,18 +9,22 @@ on:
branches: [main]
merge_group:
env:
RUSTC_WRAPPER: "sccache"
jobs:
check-reth:
runs-on: ubuntu-24.04
runs-on: depot-ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: x86_64-pc-windows-gnu
- uses: taiki-e/install-action@cross
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
@@ -30,16 +34,17 @@ jobs:
run: cargo check --target x86_64-pc-windows-gnu
check-op-reth:
runs-on: ubuntu-24.04
runs-on: depot-ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- uses: rui314/setup-mold@v1
- uses: dtolnay/rust-toolchain@stable
with:
target: x86_64-pc-windows-gnu
- uses: taiki-e/install-action@cross
- uses: mozilla-actions/sccache-action@v0.0.9
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true

16
.gitignore vendored
View File

@@ -54,5 +54,21 @@ rustc-ice-*
# Book sources should be able to build with the latest version
book/sources/Cargo.lock
# vocs node_modules
docs/vocs/node_modules
# Cargo chef recipe file
recipe.json
_
# broken links report
links-report.json
# Python cache
__pycache__/
*.py[cod]
*$py.class
# direnv
.envrc
.direnv/

393
CLAUDE.md Normal file
View File

@@ -0,0 +1,393 @@
# Reth Development Guide for AI Agents
This guide provides comprehensive instructions for AI agents working on the Reth codebase. It covers the architecture, development workflows, and critical guidelines for effective contributions.
## Project Overview
Reth is a high-performance Ethereum execution client written in Rust, focusing on modularity, performance, and contributor-friendliness. The codebase is organized into well-defined crates with clear boundaries and responsibilities.
## Architecture Overview
### Core Components
1. **Consensus (`crates/consensus/`)**: Validates blocks according to Ethereum consensus rules
2. **Storage (`crates/storage/`)**: Hybrid database using MDBX + static files for optimal performance
3. **Networking (`crates/net/`)**: P2P networking stack with discovery, sync, and transaction propagation
4. **RPC (`crates/rpc/`)**: JSON-RPC server supporting all standard Ethereum APIs
5. **Execution (`crates/evm/`, `crates/ethereum/`)**: Transaction execution and state transitions
6. **Pipeline (`crates/stages/`)**: Staged sync architecture for blockchain synchronization
7. **Trie (`crates/trie/`)**: Merkle Patricia Trie implementation with parallel state root computation
8. **Node Builder (`crates/node/`)**: High-level node orchestration and configuration
9 **The Consensus Engine (`crates/engine/`)**: Handles processing blocks received from the consensus layer with the Engine API (newPayload, forkchoiceUpdated)
### Key Design Principles
- **Modularity**: Each crate can be used as a standalone library
- **Performance**: Extensive use of parallelism, memory-mapped I/O, and optimized data structures
- **Extensibility**: Traits and generic types allow for different implementations (Ethereum, Optimism, etc.)
- **Type Safety**: Strong typing throughout with minimal use of dynamic dispatch
## Development Workflow
### Code Style and Standards
1. **Formatting**: Always use nightly rustfmt
```bash
cargo +nightly fmt --all
```
2. **Linting**: Run clippy with all features
```bash
RUSTFLAGS="-D warnings" cargo +nightly clippy --workspace --lib --examples --tests --benches --all-features --locked
```
3. **Testing**: Use nextest for faster test execution
```bash
cargo nextest run --workspace
```
### Common Contribution Types
Based on actual recent PRs, here are typical contribution patterns:
#### 1. Small Bug Fixes (1-10 lines)
Real example: Fixing beacon block root handling ([#16767](https://github.com/paradigmxyz/reth/pull/16767))
```rust
// Changed a single line to fix logic error
- parent_beacon_block_root: parent.parent_beacon_block_root(),
+ parent_beacon_block_root: parent.parent_beacon_block_root().map(|_| B256::ZERO),
```
#### 2. Integration with Upstream Changes
Real example: Integrating revm updates ([#16752](https://github.com/paradigmxyz/reth/pull/16752))
```rust
// Update code to use new APIs from dependencies
- if self.fork_tracker.is_shanghai_activated() {
- if let Err(err) = transaction.ensure_max_init_code_size(MAX_INIT_CODE_BYTE_SIZE) {
+ if let Some(init_code_size_limit) = self.fork_tracker.max_initcode_size() {
+ if let Err(err) = transaction.ensure_max_init_code_size(init_code_size_limit) {
```
#### 3. Adding Comprehensive Tests
Real example: ETH69 protocol tests ([#16759](https://github.com/paradigmxyz/reth/pull/16759))
```rust
#[tokio::test(flavor = "multi_thread")]
async fn test_eth69_peers_can_connect() {
// Create test network with specific protocol versions
let p0 = PeerConfig::with_protocols(NoopProvider::default(), Some(EthVersion::Eth69.into()));
// Test connection and version negotiation
}
```
#### 4. Making Components Generic
Real example: Making EthEvmConfig generic over chainspec ([#16758](https://github.com/paradigmxyz/reth/pull/16758))
```rust
// Before: Hardcoded to ChainSpec
- pub struct EthEvmConfig<EvmFactory = EthEvmFactory> {
- pub executor_factory: EthBlockExecutorFactory<RethReceiptBuilder, Arc<ChainSpec>, EvmFactory>,
// After: Generic over any chain spec type
+ pub struct EthEvmConfig<C = ChainSpec, EvmFactory = EthEvmFactory>
+ where
+ C: EthereumHardforks,
+ {
+ pub executor_factory: EthBlockExecutorFactory<RethReceiptBuilder, Arc<C>, EvmFactory>,
```
#### 5. Resource Management Improvements
Real example: ETL directory cleanup ([#16770](https://github.com/paradigmxyz/reth/pull/16770))
```rust
// Add cleanup logic on startup
+ if let Err(err) = fs::remove_dir_all(&etl_path) {
+ warn!(target: "reth::cli", ?etl_path, %err, "Failed to remove ETL path on launch");
+ }
```
#### 6. Feature Additions
Real example: Sharded mempool support ([#16756](https://github.com/paradigmxyz/reth/pull/16756))
```rust
// Add new filtering policies for transaction announcements
pub struct ShardedMempoolAnnouncementFilter<T> {
pub inner: T,
pub shard_bits: u8,
pub node_id: Option<B256>,
}
```
### Testing Guidelines
1. **Unit Tests**: Test individual functions and components
2. **Integration Tests**: Test interactions between components
3. **Benchmarks**: For performance-critical code
4. **Fuzz Tests**: For parsing and serialization code
5. **Property Tests**: For checking component correctness on a wide variety of inputs
Example test structure:
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_component_behavior() {
// Arrange
let component = Component::new();
// Act
let result = component.operation();
// Assert
assert_eq!(result, expected);
}
}
```
### Performance Considerations
1. **Avoid Allocations in Hot Paths**: Use references and borrowing
2. **Parallel Processing**: Use rayon for CPU-bound parallel work
3. **Async/Await**: Use tokio for I/O-bound operations
4. **File Operations**: Use `reth_fs_util` instead of `std::fs` for better error handling
### Common Pitfalls
1. **Don't Block Async Tasks**: Use `spawn_blocking` for CPU-intensive work or work with lots of blocking I/O
2. **Handle Errors Properly**: Use `?` operator and proper error types
### What to Avoid
Based on PR patterns, avoid:
1. **Large, sweeping changes**: Keep PRs focused and reviewable
2. **Mixing unrelated changes**: One logical change per PR
3. **Ignoring CI failures**: All checks must pass
4. **Incomplete implementations**: Finish features before submitting
5. **Modifying libmdbx sources**: Never modify files in `crates/storage/libmdbx-rs/mdbx-sys/libmdbx/` - this is vendored third-party code
### CI Requirements
Before submitting changes, ensure:
1. **Format Check**: `cargo +nightly fmt --all --check`
2. **Clippy**: No warnings with `RUSTFLAGS="-D warnings"`
3. **Tests Pass**: All unit and integration tests
4. **Documentation**: Update relevant docs and add doc comments with `cargo docs --document-private-items`
5. **Commit Messages**: Follow conventional format (feat:, fix:, chore:, etc.)
### Opening PRs against <https://github.com/paradigmxyz/reth>
Label PRs appropriately, first check the available labels and then apply the relevant ones:
* when changes are RPC related, add A-rpc label
* when changes are docs related, add C-docs label
* when changes are optimism related (e.g. new feature or exclusive changes to crates/optimism), add A-op-reth label
* ... and so on, check the available labels for more options.
* if being tasked to open a pr, ensure that all changes are properly formatted: `cargo +nightly fmt --all`
If changes in reth include changes to dependencies, run commands `zepter` and `make lint-toml` before finalizing the pr. Assume `zepter` binary is installed.
### Debugging Tips
1. **Logging**: Use `tracing` crate with appropriate levels
```rust
tracing::debug!(target: "reth::component", ?value, "description");
```
2. **Metrics**: Add metrics for monitoring
```rust
metrics::counter!("reth_component_operations").increment(1);
```
3. **Test Isolation**: Use separate test databases/directories
### Finding Where to Contribute
1. **Check Issues**: Look for issues labeled `good-first-issue` or `help-wanted`
2. **Review TODOs**: Search for `TODO` comments in the codebase
3. **Improve Tests**: Areas with low test coverage are good targets
4. **Documentation**: Improve code comments and documentation
5. **Performance**: Profile and optimize hot paths (with benchmarks)
### Common PR Patterns
#### Small, Focused Changes
Most PRs change only 1-5 files. Examples:
- Single-line bug fixes
- Adding a missing trait implementation
- Updating error messages
- Adding test cases for edge conditions
#### Integration Work
When dependencies update (especially revm), code needs updating:
- Check for breaking API changes
- Update to use new features (like EIP implementations)
- Ensure compatibility with new versions
#### Test Improvements
Tests often need expansion for:
- New protocol versions (ETH68, ETH69)
- Edge cases in state transitions
- Network behavior under specific conditions
- Concurrent operations
#### Making Code More Generic
Common refactoring pattern:
- Replace concrete types with generics
- Add trait bounds for flexibility
- Enable reuse across different chain types (Ethereum, Optimism)
#### When to Comment
Write comments that remain valuable after the PR is merged. Future readers won't have PR context - they only see the current code.
##### ✅ DO: Add Value
**Explain WHY and non-obvious behavior:**
```rust
// Process must handle allocations atomically to prevent race conditions
// between dealloc on drop and concurrent limit checks
unsafe impl GlobalAlloc for LimitedAllocator { ... }
// Binary search requires sorted input. Panics on unsorted slices.
fn find_index(items: &[Item], target: &Item) -> Option
// Timeout set to 5s to match EVM block processing limits
const TRACER_TIMEOUT: Duration = Duration::from_secs(5);
```
**Document constraints and assumptions:**
```rust
/// Returns heap size estimate.
///
/// Note: May undercount shared references (Rc/Arc). For precise
/// accounting, combine with an allocator-based approach.
fn deep_size_of(&self) -> usize
```
**Explain complex logic:**
```rust
// We reset limits at task start because tokio reuses threads in
// spawn_blocking pool. Without reset, second task inherits first
// task's allocation count and immediately hits limit.
THREAD_ALLOCATED.with(|allocated| allocated.set(0));
```
##### ❌ DON'T: Describe Changes
```rust
// ❌ BAD - Describes the change, not the code
// Changed from Vec to HashMap for O(1) lookups
// ✅ GOOD - Explains the decision
// HashMap provides O(1) symbol lookups during trace replay
```
```rust
// ❌ BAD - PR-specific context
// Fix for issue #234 where memory wasn't freed
// ✅ GOOD - Documents the actual behavior
// Explicitly drop allocations before limit check to ensure
// accurate accounting
```
```rust
// ❌ BAD - States the obvious
// Increment counter
counter += 1;
// ✅ GOOD - Explains non-obvious purpose
// Track allocations across all threads for global limit enforcement
GLOBAL_COUNTER.fetch_add(1, Ordering::SeqCst);
```
✅ **Comment when:**
- Non-obvious behavior or edge cases
- Performance trade-offs
- Safety requirements (unsafe blocks must always be documented)
- Limitations or gotchas
- Why simpler alternatives don't work
❌ **Don't comment when:**
- Code is self-explanatory
- Just restating the code in English
- Describing what changed in this PR
##### The Test: "Will this make sense in 6 months?"
Before adding a comment, ask: Would someone reading just the current code (no PR, no history) find this helpful?
### Example Contribution Workflow
Let's say you want to fix a bug where external IP resolution fails on startup:
1. **Create a branch**:
```bash
git checkout -b fix-external-ip-resolution
```
2. **Find the relevant code**:
```bash
# Search for IP resolution code
rg "external.*ip" --type rust
```
3. **Reason about the problem, when the problem is identified, make the fix**:
```rust
// In crates/net/discv4/src/lib.rs
pub fn resolve_external_ip() -> Option<IpAddr> {
// Add fallback mechanism
nat::external_ip()
.or_else(|| nat::external_ip_from_stun())
.or_else(|| Some(DEFAULT_IP))
}
```
4. **Add a test**:
```rust
#[test]
fn test_external_ip_fallback() {
// Test that resolution has proper fallbacks
}
```
5. **Run checks**:
```bash
cargo +nightly fmt --all
cargo clippy --all-features
cargo test -p reth-discv4
```
6. **Commit with clear message**:
```bash
git commit -m "fix: add fallback for external IP resolution
Previously, node startup could fail if external IP resolution
failed. This adds fallback mechanisms to ensure the node can
always start with a reasonable default."
```
## Quick Reference
### Essential Commands
```bash
# Format code
cargo +nightly fmt --all
# Run lints
RUSTFLAGS="-D warnings" cargo +nightly clippy --workspace --all-features --locked
# Run tests
cargo nextest run --workspace
# Run specific benchmark
cargo bench --bench bench_name
# Build optimized binary
cargo build --release --features "jemalloc asm-keccak"
# Check compilation for all features
cargo check --workspace --all-features
# Check documentation
cargo docs --document-private-items
```

View File

@@ -3,7 +3,7 @@
Thanks for your interest in improving Reth!
There are multiple opportunities to contribute at any level. It doesn't matter if you are just getting started with Rust
or are the most weathered expert, we can use your help.
or if you are already the most weathered expert, we can use your help.
**No contribution is too small and all contributions are valued.**
@@ -55,7 +55,7 @@ If you have reviewed existing documentation and still have questions, or you are
*opening a discussion**. This repository comes with a discussions board where you can also ask for help. Click the "
Discussions" tab at the top.
As Reth is still in heavy development, the documentation can be a bit scattered. The [Reth Book][reth-book] is our
As Reth is still in heavy development, the documentation can be a bit scattered. The [Reth Docs][reth-docs] is our
current best-effort attempt at keeping up-to-date information.
### Submitting a bug report
@@ -235,7 +235,7 @@ _Adapted from the [Foundry contributing guide][foundry-contributing]_.
[dev-tg]: https://t.me/paradigm_reth
[reth-book]: https://github.com/paradigmxyz/reth/tree/main/book
[reth-docs]: https://github.com/paradigmxyz/reth/tree/main/docs
[mcve]: https://stackoverflow.com/help/mcve

4612
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
[workspace.package]
version = "1.4.7"
edition = "2021"
rust-version = "1.86"
version = "1.9.3"
edition = "2024"
rust-version = "1.88"
license = "MIT OR Apache-2.0"
homepage = "https://paradigmxyz.github.io/reth"
repository = "https://github.com/paradigmxyz/reth"
@@ -10,7 +10,9 @@ exclude = [".github/"]
[workspace]
members = [
"bin/reth-bench/",
"bin/reth-bench-compare/",
"bin/reth/",
"crates/storage/rpc-provider/",
"crates/chain-state/",
"crates/chainspec/",
"crates/cli/cli/",
@@ -66,6 +68,7 @@ members = [
"crates/node/api/",
"crates/node/builder/",
"crates/node/core/",
"crates/node/ethstats",
"crates/node/events/",
"crates/node/metrics",
"crates/node/types",
@@ -74,6 +77,7 @@ members = [
"crates/optimism/cli",
"crates/optimism/consensus",
"crates/optimism/evm/",
"crates/optimism/flashblocks/",
"crates/optimism/hardforks/",
"crates/optimism/node/",
"crates/optimism/payload/",
@@ -90,6 +94,7 @@ members = [
"crates/payload/util/",
"crates/primitives-traits/",
"crates/primitives/",
"crates/prune/db",
"crates/prune/prune",
"crates/prune/types",
"crates/ress/protocol",
@@ -104,7 +109,8 @@ members = [
"crates/rpc/rpc-layer",
"crates/rpc/rpc-server-types/",
"crates/rpc/rpc-testing-util/",
"crates/rpc/rpc-types-compat/",
"crates/rpc/rpc-e2e-tests/",
"crates/rpc/rpc-convert/",
"crates/rpc/rpc/",
"crates/stages/api/",
"crates/stages/stages/",
@@ -133,6 +139,7 @@ members = [
"crates/trie/db",
"crates/trie/parallel/",
"crates/trie/sparse",
"crates/trie/sparse-parallel/",
"crates/trie/trie",
"examples/beacon-api-sidecar-fetcher/",
"examples/beacon-api-sse/",
@@ -141,21 +148,27 @@ members = [
"examples/custom-node/",
"examples/custom-engine-types/",
"examples/custom-evm/",
"examples/custom-hardforks/",
"examples/custom-inspector/",
"examples/custom-node-components/",
"examples/custom-payload-builder/",
"examples/custom-rlpx-subprotocol",
"examples/custom-rpc-middleware",
"examples/custom-node",
"examples/db-access",
"examples/engine-api-access",
"examples/exex-hello-world",
"examples/exex-subscription",
"examples/exex-test",
"examples/full-contract-state",
"examples/manual-p2p/",
"examples/network-txpool/",
"examples/network/",
"examples/network-proxy/",
"examples/node-builder-api/",
"examples/node-custom-rpc/",
"examples/node-event-hooks/",
"examples/op-db-access/",
"examples/polygon-p2p/",
"examples/rpc-db/",
"examples/precompile-cache/",
@@ -163,10 +176,11 @@ members = [
"examples/custom-beacon-withdrawals",
"testing/ef-tests/",
"testing/testing-utils",
"testing/runner",
"crates/tracing-otlp",
]
default-members = ["bin/reth"]
exclude = ["book/sources", "book/cli"]
exclude = ["docs/cli"]
# Explicitly set the resolver to version 2, which is the default for packages with edition >= 2021
# https://doc.rust-lang.org/edition-guide/rust-2021/default-cargo-resolver.html
@@ -178,6 +192,7 @@ rust.missing_docs = "warn"
rust.rust_2018_idioms = { level = "deny", priority = -1 }
rust.unreachable_pub = "warn"
rust.unused_must_use = "deny"
rust.rust_2024_incompatible_pat = "warn"
rustdoc.all = "warn"
# rust.unnameable-types = "warn"
@@ -314,12 +329,20 @@ inherits = "release"
lto = "fat"
codegen-units = 1
[profile.reproducible]
inherits = "release"
panic = "abort"
codegen-units = 1
incremental = false
[workspace.dependencies]
# reth
op-reth = { path = "crates/optimism/bin" }
reth = { path = "bin/reth" }
reth-storage-rpc-provider = { path = "crates/storage/rpc-provider" }
reth-basic-payload-builder = { path = "crates/payload/basic" }
reth-bench = { path = "bin/reth-bench" }
reth-bench-compare = { path = "bin/reth-bench-compare" }
reth-chain-state = { path = "crates/chain-state" }
reth-chainspec = { path = "crates/chainspec", default-features = false }
reth-cli = { path = "crates/cli/cli" }
@@ -353,11 +376,11 @@ reth-era-utils = { path = "crates/era-utils" }
reth-errors = { path = "crates/errors" }
reth-eth-wire = { path = "crates/net/eth-wire" }
reth-eth-wire-types = { path = "crates/net/eth-wire-types" }
reth-ethereum-cli = { path = "crates/ethereum/cli" }
reth-ethereum-payload-builder = { path = "crates/ethereum/payload" }
reth-ethereum-cli = { path = "crates/ethereum/cli", default-features = false }
reth-ethereum-consensus = { path = "crates/ethereum/consensus", default-features = false }
reth-ethereum-engine-primitives = { path = "crates/ethereum/engine-primitives", default-features = false }
reth-ethereum-forks = { path = "crates/ethereum/hardforks", default-features = false }
reth-ethereum-payload-builder = { path = "crates/ethereum/payload" }
reth-ethereum-primitives = { path = "crates/ethereum/primitives", default-features = false }
reth-ethereum = { path = "crates/ethereum/reth" }
reth-etl = { path = "crates/etl" }
@@ -387,13 +410,14 @@ reth-node-api = { path = "crates/node/api" }
reth-node-builder = { path = "crates/node/builder" }
reth-node-core = { path = "crates/node/core" }
reth-node-ethereum = { path = "crates/ethereum/node" }
reth-node-ethstats = { path = "crates/node/ethstats" }
reth-node-events = { path = "crates/node/events" }
reth-node-metrics = { path = "crates/node/metrics" }
reth-optimism-node = { path = "crates/optimism/node" }
reth-node-types = { path = "crates/node/types" }
reth-op = { path = "crates/optimism/reth", default-features = false }
reth-optimism-chainspec = { path = "crates/optimism/chainspec", default-features = false }
reth-optimism-cli = { path = "crates/optimism/cli" }
reth-optimism-cli = { path = "crates/optimism/cli", default-features = false }
reth-optimism-consensus = { path = "crates/optimism/consensus", default-features = false }
reth-optimism-forks = { path = "crates/optimism/hardforks", default-features = false }
reth-optimism-payload-builder = { path = "crates/optimism/payload" }
@@ -416,16 +440,18 @@ reth-rpc = { path = "crates/rpc/rpc" }
reth-rpc-api = { path = "crates/rpc/rpc-api" }
reth-rpc-api-testing-util = { path = "crates/rpc/rpc-testing-util" }
reth-rpc-builder = { path = "crates/rpc/rpc-builder" }
reth-rpc-e2e-tests = { path = "crates/rpc/rpc-e2e-tests" }
reth-rpc-engine-api = { path = "crates/rpc/rpc-engine-api" }
reth-rpc-eth-api = { path = "crates/rpc/rpc-eth-api" }
reth-rpc-eth-types = { path = "crates/rpc/rpc-eth-types", default-features = false }
reth-rpc-layer = { path = "crates/rpc/rpc-layer" }
reth-optimism-flashblocks = { path = "crates/optimism/flashblocks" }
reth-rpc-server-types = { path = "crates/rpc/rpc-server-types" }
reth-rpc-types-compat = { path = "crates/rpc/rpc-types-compat" }
reth-rpc-convert = { path = "crates/rpc/rpc-convert" }
reth-stages = { path = "crates/stages/stages" }
reth-stages-api = { path = "crates/stages/api" }
reth-stages-types = { path = "crates/stages/types", default-features = false }
reth-stateless = { path = "crates/stateless" }
reth-stateless = { path = "crates/stateless", default-features = false }
reth-static-file = { path = "crates/static-file/static-file" }
reth-static-file-types = { path = "crates/static-file/types", default-features = false }
reth-storage-api = { path = "crates/storage/storage-api", default-features = false }
@@ -433,91 +459,93 @@ reth-storage-errors = { path = "crates/storage/errors", default-features = false
reth-tasks = { path = "crates/tasks" }
reth-testing-utils = { path = "testing/testing-utils" }
reth-tokio-util = { path = "crates/tokio-util" }
reth-tracing = { path = "crates/tracing" }
reth-tracing = { path = "crates/tracing", default-features = false }
reth-tracing-otlp = { path = "crates/tracing-otlp" }
reth-transaction-pool = { path = "crates/transaction-pool" }
reth-trie = { path = "crates/trie/trie" }
reth-trie-common = { path = "crates/trie/common", default-features = false }
reth-trie-db = { path = "crates/trie/db" }
reth-trie-parallel = { path = "crates/trie/parallel" }
reth-trie-sparse = { path = "crates/trie/sparse", default-features = false }
reth-trie-sparse-parallel = { path = "crates/trie/sparse-parallel" }
reth-zstd-compressors = { path = "crates/storage/zstd-compressors", default-features = false }
reth-ress-protocol = { path = "crates/ress/protocol" }
reth-ress-provider = { path = "crates/ress/provider" }
# revm
revm = { version = "24.0.1", default-features = false }
revm-bytecode = { version = "4.0.0", default-features = false }
revm-database = { version = "4.0.0", default-features = false }
revm-state = { version = "4.0.0", default-features = false }
revm-primitives = { version = "19.0.0", default-features = false }
revm-interpreter = { version = "20.0.0", default-features = false }
revm-inspector = { version = "5.0.0", default-features = false }
revm-context = { version = "5.0.0", default-features = false }
revm-context-interface = { version = "5.0.0", default-features = false }
revm-database-interface = { version = "4.0.0", default-features = false }
op-revm = { version = "5.0.0", default-features = false }
revm-inspectors = "0.23.0"
revm = { version = "33.1.0", default-features = false }
revm-bytecode = { version = "7.1.1", default-features = false }
revm-database = { version = "9.0.5", default-features = false }
revm-state = { version = "8.1.1", default-features = false }
revm-primitives = { version = "21.0.2", default-features = false }
revm-interpreter = { version = "31.1.0", default-features = false }
revm-database-interface = { version = "8.0.5", default-features = false }
op-revm = { version = "14.1.0", default-features = false }
revm-inspectors = "0.33.2"
# eth
alloy-chains = { version = "0.2.0", default-features = false }
alloy-dyn-abi = "1.1.0"
alloy-chains = { version = "0.2.5", default-features = false }
alloy-dyn-abi = "1.4.1"
alloy-eip2124 = { version = "0.2.0", default-features = false }
alloy-evm = { version = "0.10", default-features = false }
alloy-primitives = { version = "1.1.0", default-features = false, features = ["map-foldhash"] }
alloy-eip7928 = { version = "0.1.0" }
alloy-evm = { version = "0.25.1", default-features = false }
alloy-primitives = { version = "1.5.0", default-features = false, features = ["map-foldhash"] }
alloy-rlp = { version = "0.3.10", default-features = false, features = ["core-net"] }
alloy-sol-macro = "1.1.0"
alloy-sol-types = { version = "1.1.0", default-features = false }
alloy-trie = { version = "0.8.1", default-features = false }
alloy-sol-macro = "1.5.0"
alloy-sol-types = { version = "1.5.0", default-features = false }
alloy-trie = { version = "0.9.1", default-features = false }
alloy-hardforks = "0.2.2"
alloy-hardforks = "0.4.5"
alloy-consensus = { version = "1.0.9", default-features = false }
alloy-contract = { version = "1.0.9", default-features = false }
alloy-eips = { version = "1.0.9", default-features = false }
alloy-genesis = { version = "1.0.9", default-features = false }
alloy-json-rpc = { version = "1.0.9", default-features = false }
alloy-network = { version = "1.0.9", default-features = false }
alloy-network-primitives = { version = "1.0.9", default-features = false }
alloy-provider = { version = "1.0.9", features = ["reqwest"], default-features = false }
alloy-pubsub = { version = "1.0.9", default-features = false }
alloy-rpc-client = { version = "1.0.9", default-features = false }
alloy-rpc-types = { version = "1.0.9", features = ["eth"], default-features = false }
alloy-rpc-types-admin = { version = "1.0.9", default-features = false }
alloy-rpc-types-anvil = { version = "1.0.9", default-features = false }
alloy-rpc-types-beacon = { version = "1.0.9", default-features = false }
alloy-rpc-types-debug = { version = "1.0.9", default-features = false }
alloy-rpc-types-engine = { version = "1.0.9", default-features = false }
alloy-rpc-types-eth = { version = "1.0.9", default-features = false }
alloy-rpc-types-mev = { version = "1.0.9", default-features = false }
alloy-rpc-types-trace = { version = "1.0.9", default-features = false }
alloy-rpc-types-txpool = { version = "1.0.9", default-features = false }
alloy-serde = { version = "1.0.9", default-features = false }
alloy-signer = { version = "1.0.9", default-features = false }
alloy-signer-local = { version = "1.0.9", default-features = false }
alloy-transport = { version = "1.0.9" }
alloy-transport-http = { version = "1.0.9", features = ["reqwest-rustls-tls"], default-features = false }
alloy-transport-ipc = { version = "1.0.9", default-features = false }
alloy-transport-ws = { version = "1.0.9", default-features = false }
alloy-consensus = { version = "1.1.3", default-features = false }
alloy-contract = { version = "1.1.3", default-features = false }
alloy-eips = { version = "1.1.3", default-features = false }
alloy-genesis = { version = "1.1.3", default-features = false }
alloy-json-rpc = { version = "1.1.3", default-features = false }
alloy-network = { version = "1.1.3", default-features = false }
alloy-network-primitives = { version = "1.1.3", default-features = false }
alloy-provider = { version = "1.1.3", features = ["reqwest", "debug-api"], default-features = false }
alloy-pubsub = { version = "1.1.3", default-features = false }
alloy-rpc-client = { version = "1.1.3", default-features = false }
alloy-rpc-types = { version = "1.1.3", features = ["eth"], default-features = false }
alloy-rpc-types-admin = { version = "1.1.3", default-features = false }
alloy-rpc-types-anvil = { version = "1.1.3", default-features = false }
alloy-rpc-types-beacon = { version = "1.1.3", default-features = false }
alloy-rpc-types-debug = { version = "1.1.3", default-features = false }
alloy-rpc-types-engine = { version = "1.1.3", default-features = false }
alloy-rpc-types-eth = { version = "1.1.3", default-features = false }
alloy-rpc-types-mev = { version = "1.1.3", default-features = false }
alloy-rpc-types-trace = { version = "1.1.3", default-features = false }
alloy-rpc-types-txpool = { version = "1.1.3", default-features = false }
alloy-serde = { version = "1.1.3", default-features = false }
alloy-signer = { version = "1.1.3", default-features = false }
alloy-signer-local = { version = "1.1.3", default-features = false }
alloy-transport = { version = "1.1.3" }
alloy-transport-http = { version = "1.1.3", features = ["reqwest-rustls-tls"], default-features = false }
alloy-transport-ipc = { version = "1.1.3", default-features = false }
alloy-transport-ws = { version = "1.1.3", default-features = false }
# op
alloy-op-evm = { version = "0.10.0", default-features = false }
alloy-op-hardforks = "0.2.2"
op-alloy-rpc-types = { version = "0.17.2", default-features = false }
op-alloy-rpc-types-engine = { version = "0.17.2", default-features = false }
op-alloy-network = { version = "0.17.2", default-features = false }
op-alloy-consensus = { version = "0.17.2", default-features = false }
op-alloy-rpc-jsonrpsee = { version = "0.17.2", default-features = false }
op-alloy-flz = { version = "0.13.0", default-features = false }
alloy-op-evm = { version = "0.25.0", default-features = false }
alloy-op-hardforks = "0.4.4"
op-alloy-rpc-types = { version = "0.23.1", default-features = false }
op-alloy-rpc-types-engine = { version = "0.23.1", default-features = false }
op-alloy-network = { version = "0.23.1", default-features = false }
op-alloy-consensus = { version = "0.23.1", default-features = false }
op-alloy-rpc-jsonrpsee = { version = "0.23.1", default-features = false }
op-alloy-flz = { version = "0.13.1", default-features = false }
# misc
either = { version = "1.15.0", default-features = false }
arrayvec = { version = "0.7.6", default-features = false }
aquamarine = "0.6"
auto_impl = "1"
backon = { version = "1.2", default-features = false, features = ["std-blocking-sleep", "tokio-sleep"] }
bincode = "1.3"
bitflags = "2.4"
blake3 = "1.5.5"
boyer-moore-magiclen = "0.2.16"
bytes = { version = "1.5", default-features = false }
brotli = "8"
cfg-if = "1.0"
clap = "4"
dashmap = "6.0"
@@ -526,7 +554,6 @@ dirs-next = "2.0.0"
dyn-clone = "1.0.17"
eyre = "0.6"
fdlimit = "0.3.0"
generic-array = "0.14"
humantime = "2.1"
humantime-serde = "1.1"
itertools = { version = "0.14", default-features = false }
@@ -534,7 +561,7 @@ linked_hash_set = "0.1"
lz4 = "1.28.1"
modular-bitfield = "0.11.2"
notify = { version = "8.0.0", default-features = false, features = ["macos_fsevent"] }
nybbles = { version = "0.3.0", default-features = false }
nybbles = { version = "0.4.2", default-features = false }
once_cell = { version = "1.19", default-features = false, features = ["critical-section"] }
parking_lot = "0.12"
paste = "1.0"
@@ -547,6 +574,7 @@ serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
serde_with = { version = "3", default-features = false, features = ["macros"] }
sha2 = { version = "0.10", default-features = false }
shellexpand = "3.0.0"
shlex = "1.3"
smallvec = "1"
strum = { version = "0.27", default-features = false }
strum_macros = "0.27"
@@ -559,8 +587,10 @@ url = { version = "2.3", default-features = false }
zstd = "0.13"
byteorder = "1"
mini-moka = "0.10"
moka = "0.12"
tar-no-std = { version = "0.3.2", default-features = false }
miniz_oxide = { version = "0.8.4", default-features = false }
chrono = "0.4.41"
# metrics
metrics = "0.24.0"
@@ -576,9 +606,11 @@ quote = "1.0"
# tokio
tokio = { version = "1.44.2", default-features = false }
tokio-stream = "0.1.11"
tokio-tungstenite = "0.26.2"
tokio-util = { version = "0.7.4", features = ["codec"] }
# async
async-compression = { version = "0.4", default-features = false }
async-stream = "0.3"
async-trait = "0.1.68"
futures = "0.3"
@@ -593,15 +625,15 @@ tower = "0.5"
tower-http = "0.6"
# p2p
discv5 = "0.9"
if-addrs = "0.13"
discv5 = "0.10"
if-addrs = "0.14"
# rpc
jsonrpsee = "0.25.1"
jsonrpsee-core = "0.25.1"
jsonrpsee-server = "0.25.1"
jsonrpsee-http-client = "0.25.1"
jsonrpsee-types = "0.25.1"
jsonrpsee = "0.26.0"
jsonrpsee-core = "0.26.0"
jsonrpsee-server = "0.26.0"
jsonrpsee-http-client = "0.26.0"
jsonrpsee-types = "0.26.0"
# http
http = "1.0"
@@ -618,16 +650,27 @@ secp256k1 = { version = "0.30", default-features = false, features = ["global-co
rand_08 = { package = "rand", version = "0.8" }
# for eip-4844
c-kzg = "2.1.1"
c-kzg = "2.1.5"
# config
toml = "0.8"
# rocksdb
rocksdb = { version = "0.24" }
# otlp obs
opentelemetry_sdk = "0.31"
opentelemetry = "0.31"
opentelemetry-otlp = "0.31"
opentelemetry-semantic-conventions = "0.31"
tracing-opentelemetry = "0.32"
# misc-testing
arbitrary = "1.3"
assert_matches = "1.5.0"
criterion = { package = "codspeed-criterion-compat", version = "2.7" }
proptest = "1.4"
insta = "1.41"
proptest = "1.7"
proptest-derive = "0.5"
similar-asserts = { version = "1.5.0", features = ["serde"] }
tempfile = "3.20"
@@ -645,24 +688,19 @@ tikv-jemallocator = "0.6"
tracy-client = "0.18.0"
snmalloc-rs = { version = "0.3.7", features = ["build_cc"] }
# TODO: When we build for a windows target on an ubuntu runner, crunchy tries to
# get the wrong path, update this when the workflow has been updated
#
# See: https://github.com/eira-fransham/crunchy/issues/13
crunchy = "=0.2.2"
aes = "0.8.1"
ahash = "0.8"
anyhow = "1.0"
bindgen = { version = "0.70", default-features = false }
bindgen = { version = "0.71", default-features = false }
block-padding = "0.3.2"
cc = "=1.2.15"
cipher = "0.4.3"
comfy-table = "7.0"
concat-kdf = "0.1.0"
convert_case = "0.7.0"
crossbeam-channel = "0.5.13"
crossterm = "0.28.0"
csv = "1.3.0"
ctrlc = "3.4"
ctr = "0.9.2"
data-encoding = "2"
delegate = "0.13"
@@ -700,43 +738,43 @@ visibility = "0.1.1"
walkdir = "2.3.3"
vergen-git2 = "1.0.5"
[patch.crates-io]
# alloy-consensus = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-contract = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-eips = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-genesis = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-json-rpc = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-network = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-network-primitives = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-provider = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-pubsub = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-client = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-admin = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-anvil = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-beacon = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-debug = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-engine = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-eth = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-mev = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-trace = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-rpc-types-txpool = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-serde = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-signer = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-signer-local = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-transport = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-transport-http = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-transport-ipc = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# alloy-transport-ws = { git = "https://github.com/alloy-rs/alloy", branch = "main" }
# networking
ipnet = "2.11"
# alloy-evm = { git = "https://github.com/alloy-rs/evm", branch = "main" }
# alloy-op-evm = { git = "https://github.com/alloy-rs/evm", branch = "main" }
#
# op-alloy-consensus = { git = "https://github.com/alloy-rs/op-alloy", rev = "ad607c1" }
# op-alloy-network = { git = "https://github.com/alloy-rs/op-alloy", rev = "ad607c1" }
# op-alloy-rpc-types = { git = "https://github.com/alloy-rs/op-alloy", rev = "ad607c1" }
# op-alloy-rpc-types-engine = { git = "https://github.com/alloy-rs/op-alloy", rev = "ad607c1" }
# op-alloy-rpc-jsonrpsee = { git = "https://github.com/alloy-rs/op-alloy", rev = "ad607c1" }
# [patch.crates-io]
# alloy-consensus = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-contract = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-eips = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-genesis = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-json-rpc = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-network = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-network-primitives = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-provider = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-pubsub = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-client = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-admin = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-anvil = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-beacon = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-debug = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-engine = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-eth = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-mev = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-trace = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-rpc-types-txpool = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-serde = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-signer = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-signer-local = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-transport = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-transport-http = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-transport-ipc = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# alloy-transport-ws = { git = "https://github.com/alloy-rs/alloy", rev = "3049f232fbb44d1909883e154eb38ec5962f53a3" }
# op-alloy-consensus = { git = "https://github.com/alloy-rs/op-alloy", rev = "a79d6fc" }
# op-alloy-network = { git = "https://github.com/alloy-rs/op-alloy", rev = "a79d6fc" }
# op-alloy-rpc-types = { git = "https://github.com/alloy-rs/op-alloy", rev = "a79d6fc" }
# op-alloy-rpc-types-engine = { git = "https://github.com/alloy-rs/op-alloy", rev = "a79d6fc" }
# op-alloy-rpc-jsonrpsee = { git = "https://github.com/alloy-rs/op-alloy", rev = "a79d6fc" }
#
# revm-inspectors = { git = "https://github.com/paradigmxyz/revm-inspectors", rev = "1207e33" }
#
@@ -745,3 +783,6 @@ vergen-git2 = "1.0.5"
# jsonrpsee-server = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" }
# jsonrpsee-http-client = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" }
# jsonrpsee-types = { git = "https://github.com/paradigmxyz/jsonrpsee", branch = "matt/make-rpc-service-pub" }
# alloy-evm = { git = "https://github.com/alloy-rs/evm", rev = "a69f0b45a6b0286e16072cb8399e02ce6ceca353" }
# alloy-op-evm = { git = "https://github.com/alloy-rs/evm", rev = "a69f0b45a6b0286e16072cb8399e02ce6ceca353" }

View File

@@ -24,5 +24,15 @@ pre-build = [
# Inspired by https://github.com/cross-rs/cross/blob/9e2298e17170655342d3248a9c8ac37ef92ba38f/docker/Dockerfile.x86_64-pc-windows-gnu#L51
dockerfile = "./Dockerfile.x86_64-pc-windows-gnu"
[target.riscv64gc-unknown-linux-gnu]
image = "ubuntu:24.04"
pre-build = [
"apt update",
"apt install --yes gcc gcc-riscv64-linux-gnu libclang-dev make",
]
env.passthrough = [
"CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER=riscv64-linux-gnu-gcc",
]
[build.env]
passthrough = ["JEMALLOC_SYS_WITH_LG_PAGE"]

View File

@@ -7,7 +7,7 @@ LABEL org.opencontainers.image.source=https://github.com/paradigmxyz/reth
LABEL org.opencontainers.image.licenses="MIT OR Apache-2.0"
# Install system dependencies
RUN apt-get update && apt-get -y upgrade && apt-get install -y libclang-dev pkg-config
RUN apt-get update && apt-get install -y libclang-dev pkg-config
# Builds a cargo-chef plan
FROM chef AS planner
@@ -18,7 +18,7 @@ FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
# Build profile, release by default
ARG BUILD_PROFILE=release
ARG BUILD_PROFILE=maxperf
ENV BUILD_PROFILE=$BUILD_PROFILE
# Extra Cargo flags
@@ -33,7 +33,7 @@ ENV FEATURES=$FEATURES
RUN cargo chef cook --profile $BUILD_PROFILE --features "$FEATURES" --recipe-path recipe.json
# Build application
COPY --exclude=.git --exclude=dist . .
COPY --exclude=dist . .
RUN cargo build --profile $BUILD_PROFILE --features "$FEATURES" --locked --bin reth
# ARG is not resolved in COPY so we have to hack around it by copying the

View File

@@ -1,20 +1,25 @@
# Use the Rust 1.86 image based on Debian Bookworm
FROM rust:1.86-bookworm AS builder
ARG RUST_TOOLCHAIN=1.89.0
FROM docker.io/rust:$RUST_TOOLCHAIN-trixie AS builder
# Install specific version of libclang-dev
RUN apt-get update && apt-get install -y libclang-dev=1:14.0-55.7~deb12u1
# Copy the project to the container
COPY ./ /app
ARG PROFILE
ARG VERSION
# Switch to snapshot repository to pin dependencies
RUN sed -i '/^# http/{N;s|^# \(http[^ ]*\)\nURIs: .*|# \1\nURIs: \1|}' /etc/apt/sources.list.d/debian.sources
RUN apt-get -o Acquire::Check-Valid-Until=false update && \
apt-get install -y \
libjemalloc-dev \
libclang-dev \
mold
WORKDIR /app
COPY . .
RUN RUSTFLAGS_REPRODUCIBLE_EXTRA="-Clink-arg=-fuse-ld=mold" make build-reth-reproducible && \
PROFILE=${PROFILE:-reproducible} VERSION=$VERSION make build-deb-x86_64-unknown-linux-gnu
# Build the project with the reproducible settings
RUN make build-reproducible
FROM scratch AS artifacts
COPY --from=builder /app/target/x86_64-unknown-linux-gnu/reproducible/reth /reth
COPY --from=builder /app/target/x86_64-unknown-linux-gnu/reproducible/*.deb /
RUN mv /app/target/x86_64-unknown-linux-gnu/release/reth /reth
# Create a minimal final image with just the binary
FROM gcr.io/distroless/cc-debian12:nonroot-6755e21ccd99ddead6edc8106ba03888cbeed41a
COPY --from=builder /reth /reth
FROM gcr.io/distroless/cc-debian13:nonroot-239cdd2c8a6b275b6a6f6ed1428c57de2fff3e50
COPY --from=artifacts /reth /reth
EXPOSE 30303 30303/udp 9001 8545 8546
ENTRYPOINT [ "/reth" ]

View File

@@ -17,7 +17,13 @@ RUN apt-get update && apt-get install --assume-yes --no-install-recommends git
RUN git clone https://github.com/cross-rs/cross /cross
WORKDIR /cross/docker
RUN git checkout 9e2298e17170655342d3248a9c8ac37ef92ba38f
RUN git checkout baf457efc2555225af47963475bd70e8d2f5993f
# xargo doesn't work with Rust 1.89 and higher: https://github.com/cross-rs/cross/issues/1701.
#
# When this PR https://github.com/cross-rs/cross/pull/1580 is merged,
# we can update the checkout above and remove this replacement.
RUN sed -i 's|sh rustup-init.sh -y --no-modify-path --profile minimal|sh rustup-init.sh -y --no-modify-path --profile minimal --default-toolchain=1.88.0|' xargo.sh
RUN cp common.sh lib.sh / && /common.sh
RUN cp cmake.sh / && /cmake.sh

View File

@@ -6,29 +6,32 @@ LABEL org.opencontainers.image.licenses="MIT OR Apache-2.0"
RUN apt-get update && apt-get -y upgrade && apt-get install -y libclang-dev pkg-config
# Builds a cargo-chef plan
FROM chef AS planner
COPY . .
RUN cargo chef prepare --recipe-path recipe.json
FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
COPY . .
ARG BUILD_PROFILE=release
ARG BUILD_PROFILE=maxperf
ENV BUILD_PROFILE=$BUILD_PROFILE
ARG RUSTFLAGS=""
ENV RUSTFLAGS="$RUSTFLAGS"
RUN cargo chef cook --profile $BUILD_PROFILE --recipe-path recipe.json --manifest-path /app/crates/optimism/bin/Cargo.toml
ARG FEATURES=""
ENV FEATURES=$FEATURES
RUN cargo chef cook --profile $BUILD_PROFILE --features "$FEATURES" --recipe-path recipe.json --manifest-path /app/crates/optimism/bin/Cargo.toml
COPY . .
RUN cargo build --profile $BUILD_PROFILE --bin op-reth --manifest-path /app/crates/optimism/bin/Cargo.toml
RUN cargo build --profile $BUILD_PROFILE --features "$FEATURES" --bin op-reth --manifest-path /app/crates/optimism/bin/Cargo.toml
RUN ls -la /app/target/$BUILD_PROFILE/op-reth
RUN cp /app/target/$BUILD_PROFILE/op-reth /app/op-reth
FROM ubuntu:22.04 AS runtime
FROM ubuntu AS runtime
RUN apt-get update && \
apt-get install -y ca-certificates libssl-dev pkg-config strace && \

View File

@@ -30,12 +30,12 @@
Opstack tries to be as close to the L1 engine API as much as possible. Isthmus (Prague equivalent) introduced the first
deviation from the L1 engine API with an additional field in the `ExecutionPayload`. For this reason the op engine API
has it's own server traits `OpEngineApi`.
has its own server traits `OpEngineApi`.
Adding a new versioned endpoint requires the same changes as for L1 just for the dedicated OP types.
### Hardforks
Opstack has dedicated hardkfors (e.g. Isthmus), that can be entirely opstack specific (e.g. Holocene) or can be an L1
Opstack has dedicated hardforks (e.g. Isthmus), that can be entirely opstack specific (e.g. Holocene) or can be an L1
equivalent hardfork. Since opstack sticks to the L1 header primitive, a new L1 equivalent hardfork also requires new
equivalent consensus checks. For this reason these `OpHardfork` must be mapped to L1 `EthereumHardfork`, for example:
`OpHardfork::Isthmus` corresponds to `EthereumHardfork::Prague`. These mappings must be defined in the `ChainSpec`.
`OpHardfork::Isthmus` corresponds to `EthereumHardfork::Prague`. These mappings must be defined in the `ChainSpec`.

107
Makefile
View File

@@ -30,6 +30,11 @@ EF_TESTS_TAG := v17.0
EF_TESTS_URL := https://github.com/ethereum/tests/archive/refs/tags/$(EF_TESTS_TAG).tar.gz
EF_TESTS_DIR := ./testing/ef-tests/ethereum-tests
# The release tag of https://github.com/ethereum/execution-spec-tests to use for EEST tests
EEST_TESTS_TAG := v4.5.0
EEST_TESTS_URL := https://github.com/ethereum/execution-spec-tests/releases/download/$(EEST_TESTS_TAG)/fixtures_stable.tar.gz
EEST_TESTS_DIR := ./testing/ef-tests/execution-spec-tests
# The docker image name
DOCKER_IMAGE_NAME ?= ghcr.io/paradigmxyz/reth
@@ -42,14 +47,14 @@ help: ## Display this help.
##@ Build
.PHONY: install
install: ## Build and install the reth binary under `~/.cargo/bin`.
install: ## Build and install the reth binary under `$(CARGO_HOME)/bin`.
cargo install --path bin/reth --bin reth --force --locked \
--features "$(FEATURES)" \
--profile "$(PROFILE)" \
$(CARGO_INSTALL_EXTRA_FLAGS)
.PHONY: install-op
install-op: ## Build and install the op-reth binary under `~/.cargo/bin`.
install-op: ## Build and install the op-reth binary under `$(CARGO_HOME)/bin`.
cargo install --path crates/optimism/bin --bin op-reth --force --locked \
--features "$(FEATURES)" \
--profile "$(PROFILE)" \
@@ -60,37 +65,31 @@ build: ## Build the reth binary into `target` directory.
cargo build --bin reth --features "$(FEATURES)" --profile "$(PROFILE)"
# Environment variables for reproducible builds
# Initialize RUSTFLAGS
RUST_BUILD_FLAGS =
# Enable static linking to ensure reproducibility across builds
RUST_BUILD_FLAGS += --C target-feature=+crt-static
# Set the linker to use static libgcc to ensure reproducibility across builds
RUST_BUILD_FLAGS += -C link-arg=-static-libgcc
# Remove build ID from the binary to ensure reproducibility across builds
RUST_BUILD_FLAGS += -C link-arg=-Wl,--build-id=none
# Remove metadata hash from symbol names to ensure reproducible builds
RUST_BUILD_FLAGS += -C metadata=''
# Set timestamp from last git commit for reproducible builds
SOURCE_DATE ?= $(shell git log -1 --pretty=%ct)
# Disable incremental compilation to avoid non-deterministic artifacts
CARGO_INCREMENTAL_VAL = 0
# Set C locale for consistent string handling and sorting
LOCALE_VAL = C
# Set UTC timezone for consistent time handling across builds
TZ_VAL = UTC
.PHONY: build-reproducible
build-reproducible: ## Build the reth binary into `target` directory with reproducible builds. Only works for x86_64-unknown-linux-gnu currently
# Extra RUSTFLAGS for reproducible builds. Can be overridden via the environment.
RUSTFLAGS_REPRODUCIBLE_EXTRA ?=
# `reproducible` only supports reth on x86_64-unknown-linux-gnu
build-%-reproducible:
@if [ "$*" != "reth" ]; then \
echo "Error: Reproducible builds are only supported for reth, not $*"; \
exit 1; \
fi
SOURCE_DATE_EPOCH=$(SOURCE_DATE) \
RUSTFLAGS="${RUST_BUILD_FLAGS} --remap-path-prefix $$(pwd)=." \
CARGO_INCREMENTAL=${CARGO_INCREMENTAL_VAL} \
LC_ALL=${LOCALE_VAL} \
TZ=${TZ_VAL} \
cargo build --bin reth --features "$(FEATURES)" --profile "release" --locked --target x86_64-unknown-linux-gnu
RUSTFLAGS="-C symbol-mangling-version=v0 -C strip=none -C link-arg=-Wl,--build-id=none -C metadata='' --remap-path-prefix $$(pwd)=. $(RUSTFLAGS_REPRODUCIBLE_EXTRA)" \
LC_ALL=C \
TZ=UTC \
JEMALLOC_OVERRIDE=/usr/lib/x86_64-linux-gnu/libjemalloc.a \
cargo build --bin reth --features "$(FEATURES) jemalloc-unprefixed" --profile "reproducible" --locked --target x86_64-unknown-linux-gnu
.PHONY: build-debug
build-debug: ## Build the reth binary into `target/debug` directory.
cargo build --bin reth --features "$(FEATURES)"
.PHONY: build-debug-op
build-debug-op: ## Build the op-reth binary into `target/debug` directory.
cargo build --bin op-reth --features "$(FEATURES)" --manifest-path crates/optimism/bin/Cargo.toml
.PHONY: build-op
build-op: ## Build the op-reth binary into `target` directory.
@@ -150,6 +149,22 @@ op-build-x86_64-apple-darwin:
op-build-aarch64-apple-darwin:
$(MAKE) op-build-native-aarch64-apple-darwin
build-deb-%:
@case "$*" in \
x86_64-unknown-linux-gnu|aarch64-unknown-linux-gnu|riscv64gc-unknown-linux-gnu) \
echo "Building debian package for $*"; \
;; \
*) \
echo "Error: Debian packages are only supported for x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, and riscv64gc-unknown-linux-gnu, not $*"; \
exit 1; \
;; \
esac
cargo install cargo-deb@3.6.0 --locked
cargo deb --profile $(PROFILE) --no-build --no-dbgsym --no-strip \
--target $* \
$(if $(VERSION),--deb-version "1~$(VERSION)") \
$(if $(VERSION),--output "target/$*/$(PROFILE)/reth-$(VERSION)-$*-$(PROFILE).deb")
# Create a `.tar.gz` containing a binary for a specific target.
define tarball_release_binary
cp $(CARGO_TARGET_DIR)/$(1)/$(PROFILE)/$(2) $(BIN_DIR)/$(2)
@@ -202,9 +217,18 @@ $(EF_TESTS_DIR):
tar -xzf ethereum-tests.tar.gz --strip-components=1 -C $(EF_TESTS_DIR)
rm ethereum-tests.tar.gz
# Downloads and unpacks EEST tests in the `$(EEST_TESTS_DIR)` directory.
#
# Requires `wget` and `tar`
$(EEST_TESTS_DIR):
mkdir $(EEST_TESTS_DIR)
wget $(EEST_TESTS_URL) -O execution-spec-tests.tar.gz
tar -xzf execution-spec-tests.tar.gz --strip-components=1 -C $(EEST_TESTS_DIR)
rm execution-spec-tests.tar.gz
.PHONY: ef-tests
ef-tests: $(EF_TESTS_DIR) ## Runs Ethereum Foundation tests.
cargo nextest run -p ef-tests --features ef-tests
ef-tests: $(EF_TESTS_DIR) $(EEST_TESTS_DIR) ## Runs Legacy and EEST tests.
cargo nextest run -p ef-tests --release --features ef-tests
##@ reth-bench
@@ -212,8 +236,8 @@ ef-tests: $(EF_TESTS_DIR) ## Runs Ethereum Foundation tests.
reth-bench: ## Build the reth-bench binary into the `target` directory.
cargo build --manifest-path bin/reth-bench/Cargo.toml --features "$(FEATURES)" --profile "$(PROFILE)"
.PHONY: install-reth-bech
install-reth-bench: ## Build and install the reth binary under `~/.cargo/bin`.
.PHONY: install-reth-bench
install-reth-bench: ## Build and install the reth binary under `$(CARGO_HOME)/bin`.
cargo install --path bin/reth-bench --bin reth-bench --force --locked \
--features "$(FEATURES)" \
--profile "$(PROFILE)"
@@ -366,9 +390,9 @@ db-tools: ## Compile MDBX debugging tools.
@echo "Run \"$(DB_TOOLS_DIR)/mdbx_chk\" for the MDBX db file integrity check."
.PHONY: update-book-cli
update-book-cli: build-debug ## Update book cli documentation.
update-book-cli: build-debug build-debug-op## Update book cli documentation.
@echo "Updating book cli doc..."
@./book/cli/update.sh $(CARGO_TARGET_DIR)/debug/reth
@./docs/cli/update.sh $(CARGO_TARGET_DIR)/debug/reth $(CARGO_TARGET_DIR)/debug/op-reth
.PHONY: profiling
profiling: ## Builds `reth` with optimisations, but also symbols.
@@ -415,12 +439,12 @@ clippy-op-dev:
--locked \
--all-features
lint-codespell: ensure-codespell
codespell --skip "*.json" --skip "./testing/ef-tests/ethereum-tests"
lint-typos: ensure-typos
typos
ensure-codespell:
@if ! command -v codespell &> /dev/null; then \
echo "codespell not found. Please install it by running the command `pip install codespell` or refer to the following link for more information: https://github.com/codespell-project/codespell" \
ensure-typos:
@if ! command -v typos &> /dev/null; then \
echo "typos not found. Please install it by running the command 'cargo install typos-cli' or refer to the following link for more information: https://github.com/crate-ci/typos"; \
exit 1; \
fi
@@ -439,14 +463,14 @@ lint-toml: ensure-dprint
ensure-dprint:
@if ! command -v dprint &> /dev/null; then \
echo "dprint not found. Please install it by running the command `cargo install --locked dprint` or refer to the following link for more information: https://github.com/dprint/dprint" \
echo "dprint not found. Please install it by running the command 'cargo install --locked dprint' or refer to the following link for more information: https://github.com/dprint/dprint"; \
exit 1; \
fi
lint:
make fmt && \
make clippy && \
make lint-codespell && \
make lint-typos && \
make lint-toml
clippy-fix:
@@ -497,10 +521,3 @@ pr:
make update-book-cli && \
cargo docs --document-private-items && \
make test
check-features:
cargo hack check \
--package reth-codecs \
--package reth-primitives-traits \
--package reth-primitives \
--feature-powerset

View File

@@ -10,7 +10,7 @@
![](./assets/reth-prod.png)
**[Install](https://paradigmxyz.github.io/reth/installation/installation.html)**
| [User Book](https://reth.rs)
| [User Docs](https://reth.rs)
| [Developer Docs](./docs)
| [Crate Docs](https://reth.rs/docs)
@@ -20,7 +20,7 @@
## What is Reth?
Reth (short for Rust Ethereum, [pronunciation](https://twitter.com/kelvinfichter/status/1597653609411268608)) is a new Ethereum full node implementation that is focused on being user-friendly, highly modular, as well as being fast and efficient. Reth is an Execution Layer (EL) and is compatible with all Ethereum Consensus Layer (CL) implementations that support the [Engine API](https://github.com/ethereum/execution-apis/tree/a0d03086564ab1838b462befbc083f873dcf0c0f/src/engine). It is originally built and driven forward by [Paradigm](https://paradigm.xyz/), and is licensed under the Apache and MIT licenses.
Reth (short for Rust Ethereum, [pronunciation](https://x.com/kelvinfichter/status/1597653609411268608)) is a new Ethereum full node implementation that is focused on being user-friendly, highly modular, as well as being fast and efficient. Reth is an Execution Layer (EL) and is compatible with all Ethereum Consensus Layer (CL) implementations that support the [Engine API](https://github.com/ethereum/execution-apis/tree/a0d03086564ab1838b462befbc083f873dcf0c0f/src/engine). It is originally built and driven forward by [Paradigm](https://paradigm.xyz/), and is licensed under the Apache and MIT licenses.
## Goals
@@ -29,7 +29,7 @@ As a full Ethereum node, Reth allows users to connect to the Ethereum network an
More concretely, our goals are:
1. **Modularity**: Every component of Reth is built to be used as a library: well-tested, heavily documented and benchmarked. We envision that developers will import the node's crates, mix and match, and innovate on top of them. Examples of such usage include but are not limited to spinning up standalone P2P networks, talking directly to a node's database, or "unbundling" the node into the components you need. To achieve that, we are licensing Reth under the Apache/MIT permissive license. You can learn more about the project's components [here](./docs/repo/layout.md).
2. **Performance**: Reth aims to be fast, so we used Rust and the [Erigon staged-sync](https://erigon.substack.com/p/erigon-stage-sync-and-control-flows) node architecture. We also use our Ethereum libraries (including [Alloy](https://github.com/alloy-rs/alloy/) and [revm](https://github.com/bluealloy/revm/)) which weve battle-tested and optimized via [Foundry](https://github.com/foundry-rs/foundry/).
2. **Performance**: Reth aims to be fast, so we use Rust and the [Erigon staged-sync](https://erigon.substack.com/p/erigon-stage-sync-and-control-flows) node architecture. We also use our Ethereum libraries (including [Alloy](https://github.com/alloy-rs/alloy/) and [revm](https://github.com/bluealloy/revm/)) which we've battle-tested and optimized via [Foundry](https://github.com/foundry-rs/foundry/).
3. **Free for anyone to use any way they want**: Reth is free open source software, built for the community, by the community. By licensing the software under the Apache/MIT license, we want developers to use it without being bound by business licenses, or having to think about the implications of GPL-like licenses.
4. **Client Diversity**: The Ethereum protocol becomes more antifragile when no node implementation dominates. This ensures that if there's a software bug, the network does not finalize a bad block. By building a new client, we hope to contribute to Ethereum's antifragility.
5. **Support as many EVM chains as possible**: We aspire that Reth can full-sync not only Ethereum, but also other chains like Optimism, Polygon, BNB Smart Chain, and more. If you're working on any of these projects, please reach out.
@@ -40,17 +40,18 @@ More concretely, our goals are:
Reth is production ready, and suitable for usage in mission-critical environments such as staking or high-uptime services. We also actively recommend professional node operators to switch to Reth in production for performance and cost reasons in use cases where high performance with great margins is required such as RPC, MEV, Indexing, Simulations, and P2P activities.
More historical context below:
* We released 1.0 "production-ready" stable Reth in June 2024.
* Reth completed an audit with [Sigma Prime](https://sigmaprime.io/), the developers of [Lighthouse](https://github.com/sigp/lighthouse), the Rust Consensus Layer implementation. Find it [here](./audit/sigma_prime_audit_v2.pdf).
* Revm (the EVM used in Reth) underwent an audit with [Guido Vranken](https://twitter.com/guidovranken) (#1 [Ethereum Bug Bounty](https://ethereum.org/en/bug-bounty)). We will publish the results soon.
* We released multiple iterative beta versions, up to [beta.9](https://github.com/paradigmxyz/reth/releases/tag/v0.2.0-beta.9) on Monday June 3rd 2024 the last beta release.
* We released [beta](https://github.com/paradigmxyz/reth/releases/tag/v0.2.0-beta.1) on Monday March 4th 2024, our first breaking change to the database model, providing faster query speed, smaller database footprint, and allowing "history" to be mounted on separate drives.
* We shipped iterative improvements until the last alpha release on February 28th 2024, [0.1.0-alpha.21](https://github.com/paradigmxyz/reth/releases/tag/v0.1.0-alpha.21).
* We [initially announced](https://www.paradigm.xyz/2023/06/reth-alpha) [0.1.0-alpha.1](https://github.com/paradigmxyz/reth/releases/tag/v0.1.0-alpha.1) in June 20th 2023.
- We released 1.0 "production-ready" stable Reth in June 2024.
- Reth completed an audit with [Sigma Prime](https://sigmaprime.io/), the developers of [Lighthouse](https://github.com/sigp/lighthouse), the Rust Consensus Layer implementation. Find it [here](./audit/sigma_prime_audit_v2.pdf).
- Revm (the EVM used in Reth) underwent an audit with [Guido Vranken](https://x.com/guidovranken) (#1 [Ethereum Bug Bounty](https://ethereum.org/en/bug-bounty)). We will publish the results soon.
- We released multiple iterative beta versions, up to [beta.9](https://github.com/paradigmxyz/reth/releases/tag/v0.2.0-beta.9) on Monday June 3, 2024,the last beta release.
- We released [beta](https://github.com/paradigmxyz/reth/releases/tag/v0.2.0-beta.1) on Monday March 4, 2024, our first breaking change to the database model, providing faster query speed, smaller database footprint, and allowing "history" to be mounted on separate drives.
- We shipped iterative improvements until the last alpha release on February 28, 2024, [0.1.0-alpha.21](https://github.com/paradigmxyz/reth/releases/tag/v0.1.0-alpha.21).
- We [initially announced](https://www.paradigm.xyz/2023/06/reth-alpha) [0.1.0-alpha.1](https://github.com/paradigmxyz/reth/releases/tag/v0.1.0-alpha.1) on June 20, 2023.
### Database compatibility
We do not have any breaking database changes since beta.1, and do not plan any in the near future.
We do not have any breaking database changes since beta.1, and we do not plan any in the near future.
Reth [v0.2.0-beta.1](https://github.com/paradigmxyz/reth/releases/tag/v0.2.0-beta.1) includes
a [set of breaking database changes](https://github.com/paradigmxyz/reth/pull/5191) that makes it impossible to use database files produced by earlier versions.
@@ -60,7 +61,7 @@ If you had a database produced by alpha versions of Reth, you need to drop it wi
## For Users
See the [Reth Book](https://paradigmxyz.github.io/reth) for instructions on how to install and run Reth.
See the [Reth documentation](https://reth.rs/) for instructions on how to install and run Reth.
## For Developers
@@ -68,7 +69,7 @@ See the [Reth Book](https://paradigmxyz.github.io/reth) for instructions on how
You can use individual crates of reth in your project.
The crate docs can be found [here](https://paradigmxyz.github.io/reth/docs).
The crate docs can be found [here](https://reth.rs/docs/).
For a general overview of the crates, see [Project Layout](./docs/repo/layout.md).
@@ -76,21 +77,20 @@ For a general overview of the crates, see [Project Layout](./docs/repo/layout.md
If you want to contribute, or follow along with contributor discussion, you can use our [main telegram](https://t.me/paradigm_reth) to chat with us about the development of Reth!
- Our contributor guidelines can be found in [`CONTRIBUTING.md`](./CONTRIBUTING.md).
- See our [contributor docs](./docs) for more information on the project. A good starting point is [Project Layout](./docs/repo/layout.md).
- Our contributor guidelines can be found in [`CONTRIBUTING.md`](./CONTRIBUTING.md).
- See our [contributor docs](./docs) for more information on the project. A good starting point is [Project Layout](./docs/repo/layout.md).
### Building and testing
<!--
When updating this, also update:
- clippy.toml
- Cargo.toml
- .github/workflows/lint.yml
-->
The Minimum Supported Rust Version (MSRV) of this project is [1.86.0](https://blog.rust-lang.org/2025/04/03/Rust-1.86.0/).
The Minimum Supported Rust Version (MSRV) of this project is [1.88.0](https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/).
See the book for detailed instructions on how to [build from source](https://paradigmxyz.github.io/reth/installation/source.html).
See the docs for detailed instructions on how to [build from source](https://reth.rs/installation/source/).
To fully test Reth, you will need to have [Geth installed](https://geth.ethereum.org/docs/getting-started/installing-geth), but it is possible to run a subset of tests without Geth.
@@ -119,13 +119,13 @@ Using `cargo test` to run tests may work fine, but this is not tested and does n
## Getting Help
If you have any questions, first see if the answer to your question can be found in the [book][book].
If you have any questions, first see if the answer to your question can be found in the [docs][book].
If the answer is not there:
- Join the [Telegram][tg-url] to get help, or
- Open a [discussion](https://github.com/paradigmxyz/reth/discussions/new) with your question, or
- Open an issue with [the bug](https://github.com/paradigmxyz/reth/issues/new?assignees=&labels=C-bug%2CS-needs-triage&projects=&template=bug.yml)
- Join the [Telegram][tg-url] to get help, or
- Open a [discussion](https://github.com/paradigmxyz/reth/discussions/new) with your question, or
- Open an issue with [the bug](https://github.com/paradigmxyz/reth/issues/new?assignees=&labels=C-bug%2CS-needs-triage&projects=&template=bug.yml)
## Security
@@ -137,13 +137,13 @@ Reth is a new implementation of the Ethereum protocol. In the process of develop
None of this would have been possible without them, so big shoutout to the teams below:
- [Geth](https://github.com/ethereum/go-ethereum/): We would like to express our heartfelt gratitude to the go-ethereum team for their outstanding contributions to Ethereum over the years. Their tireless efforts and dedication have helped to shape the Ethereum ecosystem and make it the vibrant and innovative community it is today. Thank you for your hard work and commitment to the project.
- [Erigon](https://github.com/ledgerwatch/erigon) (fka Turbo-Geth): Erigon pioneered the ["Staged Sync" architecture](https://erigon.substack.com/p/erigon-stage-sync-and-control-flows) that Reth is using, as well as [introduced MDBX](https://github.com/ledgerwatch/erigon/wiki/Choice-of-storage-engine) as the database of choice. We thank Erigon for pushing the state of the art research on the performance limits of Ethereum nodes.
- [Akula](https://github.com/akula-bft/akula/): Reth uses forks of the Apache versions of Akula's [MDBX Bindings](https://github.com/paradigmxyz/reth/pull/132), [FastRLP](https://github.com/paradigmxyz/reth/pull/63) and [ECIES](https://github.com/paradigmxyz/reth/pull/80) . Given that these packages were already released under the Apache License, and they implement standardized solutions, we decided not to reimplement them to iterate faster. We thank the Akula team for their contributions to the Rust Ethereum ecosystem and for publishing these packages.
- [Geth](https://github.com/ethereum/go-ethereum/): We would like to express our heartfelt gratitude to the go-ethereum team for their outstanding contributions to Ethereum over the years. Their tireless efforts and dedication have helped to shape the Ethereum ecosystem and make it the vibrant and innovative community it is today. Thank you for your hard work and commitment to the project.
- [Erigon](https://github.com/ledgerwatch/erigon) (fka Turbo-Geth): Erigon pioneered the ["Staged Sync" architecture](https://erigon.substack.com/p/erigon-stage-sync-and-control-flows) that Reth is using, as well as [introduced MDBX](https://github.com/ledgerwatch/erigon/wiki/Choice-of-storage-engine) as the database of choice. We thank Erigon for pushing the state of the art research on the performance limits of Ethereum nodes.
- [Akula](https://github.com/akula-bft/akula/): Reth uses forks of the Apache versions of Akula's [MDBX Bindings](https://github.com/paradigmxyz/reth/pull/132), [FastRLP](https://github.com/paradigmxyz/reth/pull/63) and [ECIES](https://github.com/paradigmxyz/reth/pull/80). Given that these packages were already released under the Apache License, and they implement standardized solutions, we decided not to reimplement them to iterate faster. We thank the Akula team for their contributions to the Rust Ethereum ecosystem and for publishing these packages.
## Warning
The `NippyJar` and `Compact` encoding formats and their implementations are designed for storing and retrieving data internally. They are not hardened to safely read potentially malicious data.
[book]: https://paradigmxyz.github.io/reth/
[book]: https://reth.rs/
[tg-url]: https://t.me/paradigm_reth

View File

@@ -0,0 +1,96 @@
[package]
name = "reth-bench-compare"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
homepage.workspace = true
repository.workspace = true
description = "Automated reth benchmark comparison between git references"
[lints]
workspace = true
[[bin]]
name = "reth-bench-compare"
path = "src/main.rs"
[dependencies]
# reth
reth-cli-runner.workspace = true
reth-cli-util.workspace = true
reth-node-core.workspace = true
reth-tracing.workspace = true
reth-chainspec.workspace = true
# alloy
alloy-provider = { workspace = true, features = ["reqwest-rustls-tls"], default-features = false }
alloy-rpc-types-eth.workspace = true
alloy-primitives.workspace = true
# CLI and argument parsing
clap = { workspace = true, features = ["derive", "env"] }
eyre.workspace = true
# Async runtime
tokio = { workspace = true, features = ["full"] }
tracing.workspace = true
# Serialization
serde = { workspace = true, features = ["derive"] }
serde_json.workspace = true
# Time handling
chrono = { workspace = true, features = ["serde"] }
# Path manipulation
shellexpand.workspace = true
# CSV handling
csv.workspace = true
# Process management
ctrlc.workspace = true
shlex.workspace = true
[target.'cfg(unix)'.dependencies]
nix = { version = "0.29", features = ["signal", "process"] }
[features]
default = ["jemalloc"]
asm-keccak = [
"reth-node-core/asm-keccak",
"alloy-primitives/asm-keccak",
]
jemalloc = [
"reth-cli-util/jemalloc",
"reth-node-core/jemalloc",
]
jemalloc-prof = ["reth-cli-util/jemalloc-prof"]
tracy-allocator = ["reth-cli-util/tracy-allocator"]
min-error-logs = [
"tracing/release_max_level_error",
"reth-node-core/min-error-logs",
]
min-warn-logs = [
"tracing/release_max_level_warn",
"reth-node-core/min-warn-logs",
]
min-info-logs = [
"tracing/release_max_level_info",
"reth-node-core/min-info-logs",
]
min-debug-logs = [
"tracing/release_max_level_debug",
"reth-node-core/min-debug-logs",
]
min-trace-logs = [
"tracing/release_max_level_trace",
"reth-node-core/min-trace-logs",
]
# no-op feature flag for switching between the `optimism` and default functionality in CI matrices
ethereum = []

View File

@@ -0,0 +1,298 @@
//! Benchmark execution using reth-bench.
use crate::cli::Args;
use eyre::{eyre, Result, WrapErr};
use std::{
path::Path,
sync::{Arc, Mutex},
};
use tokio::{
fs::File as AsyncFile,
io::{AsyncBufReadExt, AsyncWriteExt, BufReader},
process::Command,
};
use tracing::{debug, error, info, warn};
/// Manages benchmark execution using reth-bench
pub(crate) struct BenchmarkRunner {
rpc_url: String,
jwt_secret: String,
wait_time: Option<String>,
warmup_blocks: u64,
}
impl BenchmarkRunner {
/// Create a new `BenchmarkRunner` from CLI arguments
pub(crate) fn new(args: &Args) -> Self {
Self {
rpc_url: args.get_rpc_url(),
jwt_secret: args.jwt_secret_path().to_string_lossy().to_string(),
wait_time: args.wait_time.clone(),
warmup_blocks: args.get_warmup_blocks(),
}
}
/// Clear filesystem caches (page cache, dentries, and inodes)
pub(crate) async fn clear_fs_caches() -> Result<()> {
info!("Clearing filesystem caches...");
// First sync to ensure all pending writes are flushed
let sync_output =
Command::new("sync").output().await.wrap_err("Failed to execute sync command")?;
if !sync_output.status.success() {
return Err(eyre!("sync command failed"));
}
// Drop caches - requires sudo/root permissions
// 3 = drop pagecache, dentries, and inodes
let drop_caches_cmd = Command::new("sudo")
.args(["-n", "sh", "-c", "echo 3 > /proc/sys/vm/drop_caches"])
.output()
.await;
match drop_caches_cmd {
Ok(output) if output.status.success() => {
info!("Successfully cleared filesystem caches");
Ok(())
}
Ok(output) => {
let stderr = String::from_utf8_lossy(&output.stderr);
if stderr.contains("sudo: a password is required") {
warn!("Unable to clear filesystem caches: sudo password required");
warn!(
"For optimal benchmarking, configure passwordless sudo for cache clearing:"
);
warn!(" echo '$USER ALL=(ALL) NOPASSWD: /bin/sh -c echo\\\\ [0-9]\\\\ \\\\>\\\\ /proc/sys/vm/drop_caches' | sudo tee /etc/sudoers.d/drop_caches");
Ok(())
} else {
Err(eyre!("Failed to clear filesystem caches: {}", stderr))
}
}
Err(e) => {
warn!("Unable to clear filesystem caches: {}", e);
Ok(())
}
}
}
/// Run a warmup benchmark for cache warming
pub(crate) async fn run_warmup(&self, from_block: u64) -> Result<()> {
let to_block = from_block + self.warmup_blocks;
info!(
"Running warmup benchmark from block {} to {} ({} blocks)",
from_block, to_block, self.warmup_blocks
);
// Build the reth-bench command for warmup (no output flag)
let mut cmd = Command::new("reth-bench");
cmd.args([
"new-payload-fcu",
"--rpc-url",
&self.rpc_url,
"--jwt-secret",
&self.jwt_secret,
"--from",
&from_block.to_string(),
"--to",
&to_block.to_string(),
]);
// Add wait-time argument if provided
if let Some(ref wait_time) = self.wait_time {
cmd.args(["--wait-time", wait_time]);
}
cmd.env("RUST_LOG_STYLE", "never")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.kill_on_drop(true);
// Set process group for consistent signal handling
#[cfg(unix)]
{
cmd.process_group(0);
}
debug!("Executing warmup reth-bench command: {:?}", cmd);
// Execute the warmup benchmark
let mut child = cmd.spawn().wrap_err("Failed to start warmup reth-bench process")?;
// Stream output at debug level
if let Some(stdout) = child.stdout.take() {
tokio::spawn(async move {
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[WARMUP] {}", line);
}
});
}
if let Some(stderr) = child.stderr.take() {
tokio::spawn(async move {
let reader = BufReader::new(stderr);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[WARMUP] {}", line);
}
});
}
let status = child.wait().await.wrap_err("Failed to wait for warmup reth-bench")?;
if !status.success() {
return Err(eyre!("Warmup reth-bench failed with exit code: {:?}", status.code()));
}
info!("Warmup completed successfully");
Ok(())
}
/// Run a benchmark for the specified block range
pub(crate) async fn run_benchmark(
&self,
from_block: u64,
to_block: u64,
output_dir: &Path,
) -> Result<()> {
info!(
"Running benchmark from block {} to {} (output: {:?})",
from_block, to_block, output_dir
);
// Ensure output directory exists
std::fs::create_dir_all(output_dir)
.wrap_err_with(|| format!("Failed to create output directory: {output_dir:?}"))?;
// Create log file path for reth-bench output
let log_file_path = output_dir.join("reth_bench.log");
info!("reth-bench logs will be saved to: {:?}", log_file_path);
// Build the reth-bench command
let mut cmd = Command::new("reth-bench");
cmd.args([
"new-payload-fcu",
"--rpc-url",
&self.rpc_url,
"--jwt-secret",
&self.jwt_secret,
"--from",
&from_block.to_string(),
"--to",
&to_block.to_string(),
"--output",
&output_dir.to_string_lossy(),
]);
// Add wait-time argument if provided
if let Some(ref wait_time) = self.wait_time {
cmd.args(["--wait-time", wait_time]);
}
cmd.env("RUST_LOG_STYLE", "never")
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.kill_on_drop(true);
// Set process group for consistent signal handling
#[cfg(unix)]
{
cmd.process_group(0);
}
// Debug log the command
debug!("Executing reth-bench command: {:?}", cmd);
// Execute the benchmark
let mut child = cmd.spawn().wrap_err("Failed to start reth-bench process")?;
// Capture stdout and stderr for error reporting
let stdout_lines = Arc::new(Mutex::new(Vec::new()));
let stderr_lines = Arc::new(Mutex::new(Vec::new()));
// Stream stdout with prefix at debug level, capture for error reporting, and write to log
// file
if let Some(stdout) = child.stdout.take() {
let stdout_lines_clone = stdout_lines.clone();
let log_file = AsyncFile::create(&log_file_path)
.await
.wrap_err(format!("Failed to create log file: {:?}", log_file_path))?;
tokio::spawn(async move {
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
let mut log_file = log_file;
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH-BENCH] {}", line);
if let Ok(mut captured) = stdout_lines_clone.lock() {
captured.push(line.clone());
}
// Write to log file (reth-bench output already has timestamps if needed)
let log_line = format!("{}\n", line);
if let Err(e) = log_file.write_all(log_line.as_bytes()).await {
debug!("Failed to write to log file: {}", e);
}
}
});
}
// Stream stderr with prefix at debug level, capture for error reporting, and write to log
// file
if let Some(stderr) = child.stderr.take() {
let stderr_lines_clone = stderr_lines.clone();
let log_file = AsyncFile::options()
.create(true)
.append(true)
.open(&log_file_path)
.await
.wrap_err(format!("Failed to open log file for stderr: {:?}", log_file_path))?;
tokio::spawn(async move {
let reader = BufReader::new(stderr);
let mut lines = reader.lines();
let mut log_file = log_file;
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH-BENCH] {}", line);
if let Ok(mut captured) = stderr_lines_clone.lock() {
captured.push(line.clone());
}
// Write to log file (reth-bench output already has timestamps if needed)
let log_line = format!("{}\n", line);
if let Err(e) = log_file.write_all(log_line.as_bytes()).await {
debug!("Failed to write to log file: {}", e);
}
}
});
}
let status = child.wait().await.wrap_err("Failed to wait for reth-bench")?;
if !status.success() {
// Print all captured output when command fails
error!("reth-bench failed with exit code: {:?}", status.code());
if let Ok(stdout) = stdout_lines.lock() &&
!stdout.is_empty()
{
error!("reth-bench stdout:");
for line in stdout.iter() {
error!(" {}", line);
}
}
if let Ok(stderr) = stderr_lines.lock() &&
!stderr.is_empty()
{
error!("reth-bench stderr:");
for line in stderr.iter() {
error!(" {}", line);
}
}
return Err(eyre!("reth-bench failed with exit code: {:?}", status.code()));
}
info!("Benchmark completed");
Ok(())
}
}

View File

@@ -0,0 +1,945 @@
//! CLI argument parsing and main command orchestration.
use alloy_provider::{Provider, ProviderBuilder};
use clap::Parser;
use eyre::{eyre, Result, WrapErr};
use reth_chainspec::Chain;
use reth_cli_runner::CliContext;
use reth_node_core::args::{DatadirArgs, LogArgs, TraceArgs};
use reth_tracing::FileWorkerGuard;
use std::{net::TcpListener, path::PathBuf, str::FromStr};
use tokio::process::Command;
use tracing::{debug, info, warn};
use crate::{
benchmark::BenchmarkRunner, comparison::ComparisonGenerator, compilation::CompilationManager,
git::GitManager, node::NodeManager,
};
/// Target for disabling the --debug.startup-sync-state-idle flag
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum DisableStartupSyncStateIdle {
/// Disable for baseline and warmup runs
Baseline,
/// Disable for feature runs only
Feature,
/// Disable for all runs
All,
}
impl FromStr for DisableStartupSyncStateIdle {
type Err = String;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"baseline" => Ok(Self::Baseline),
"feature" => Ok(Self::Feature),
"all" => Ok(Self::All),
_ => Err(format!("Invalid value '{}'. Expected 'baseline', 'feature', or 'all'", s)),
}
}
}
impl std::fmt::Display for DisableStartupSyncStateIdle {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Baseline => write!(f, "baseline"),
Self::Feature => write!(f, "feature"),
Self::All => write!(f, "all"),
}
}
}
/// Automated reth benchmark comparison between git references
#[derive(Debug, Parser)]
#[command(
name = "reth-bench-compare",
about = "Compare reth performance between two git references (branches or tags)",
version
)]
pub(crate) struct Args {
/// Git reference (branch or tag) to use as baseline for comparison
#[arg(long, value_name = "REF")]
pub baseline_ref: String,
/// Git reference (branch or tag) to compare against the baseline
#[arg(long, value_name = "REF")]
pub feature_ref: String,
#[command(flatten)]
pub datadir: DatadirArgs,
/// Number of blocks to benchmark
#[arg(long, value_name = "N", default_value = "100")]
pub blocks: u64,
/// RPC endpoint for fetching block data
#[arg(long, value_name = "URL")]
pub rpc_url: Option<String>,
/// JWT secret file path
///
/// If not provided, defaults to `<datadir>/<chain>/jwt.hex`.
/// If the file doesn't exist, it will be created automatically.
#[arg(long, value_name = "PATH")]
pub jwt_secret: Option<PathBuf>,
/// Output directory for benchmark results
#[arg(long, value_name = "PATH", default_value = "./reth-bench-compare")]
pub output_dir: String,
/// Skip git branch validation (useful for testing)
#[arg(long)]
pub skip_git_validation: bool,
/// Port for reth metrics endpoint
#[arg(long, value_name = "PORT", default_value = "5005")]
pub metrics_port: u16,
/// The chain this node is running.
///
/// Possible values are either a built-in chain name or numeric chain ID.
#[arg(long, value_name = "CHAIN", default_value = "mainnet", required = false)]
pub chain: Chain,
/// Run reth binary with sudo (for elevated privileges)
#[arg(long)]
pub sudo: bool,
/// Generate comparison charts using Python script
#[arg(long)]
pub draw: bool,
/// Enable CPU profiling with samply during benchmark runs
#[arg(long)]
pub profile: bool,
/// Wait time between engine API calls (passed to reth-bench)
#[arg(long, value_name = "DURATION")]
pub wait_time: Option<String>,
/// Number of blocks to run for cache warmup after clearing caches.
/// If not specified, defaults to the same as --blocks
#[arg(long, value_name = "N")]
pub warmup_blocks: Option<u64>,
/// Disable filesystem cache clearing before warmup phase.
/// By default, filesystem caches are cleared before warmup to ensure consistent benchmarks.
#[arg(long)]
pub no_clear_cache: bool,
#[command(flatten)]
pub logs: LogArgs,
#[command(flatten)]
pub traces: TraceArgs,
/// Maximum queue size for OTLP Batch Span Processor (traces).
/// Higher values prevent trace drops when benchmarking many blocks.
#[arg(
long,
value_name = "OTLP_BUFFER_SIZE",
default_value = "32768",
help_heading = "Tracing"
)]
pub otlp_max_queue_size: usize,
/// Additional arguments to pass to baseline reth node command
///
/// Example: `--baseline-args "--debug.tip 0xabc..."`
#[arg(long, value_name = "ARGS")]
pub baseline_args: Option<String>,
/// Additional arguments to pass to feature reth node command
///
/// Example: `--feature-args "--debug.tip 0xdef..."`
#[arg(long, value_name = "ARGS")]
pub feature_args: Option<String>,
/// Additional arguments to pass to reth node command (applied to both baseline and feature)
///
/// All arguments after `--` will be passed directly to the reth node command.
/// Example: `reth-bench-compare --baseline-ref main --feature-ref pr/123 -- --debug.tip
/// 0xabc...`
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub reth_args: Vec<String>,
/// Comma-separated list of features to enable during reth compilation
///
/// Example: `jemalloc,asm-keccak`
#[arg(long, value_name = "FEATURES", default_value = "jemalloc,asm-keccak")]
pub features: String,
/// Disable automatic --debug.startup-sync-state-idle flag for specific runs.
/// Can be "baseline", "feature", or "all".
/// By default, the flag is passed to warmup, baseline, and feature runs.
/// When "baseline" is specified, the flag is NOT passed to warmup OR baseline.
/// When "feature" is specified, the flag is NOT passed to feature.
/// When "all" is specified, the flag is NOT passed to any run.
#[arg(long, value_name = "TARGET")]
pub disable_startup_sync_state_idle: Option<DisableStartupSyncStateIdle>,
}
impl Args {
/// Initializes tracing with the configured options.
pub(crate) fn init_tracing(&self) -> Result<Option<FileWorkerGuard>> {
let guard = self.logs.init_tracing()?;
Ok(guard)
}
/// Build additional arguments for a specific ref type, conditionally including
/// --debug.startup-sync-state-idle based on the configuration
pub(crate) fn build_additional_args(
&self,
ref_type: &str,
base_args_str: Option<&String>,
) -> Vec<String> {
// Parse the base arguments string if provided
let mut args = base_args_str.map(|s| parse_args_string(s)).unwrap_or_default();
// Determine if we should add the --debug.startup-sync-state-idle flag
let should_add_flag = match self.disable_startup_sync_state_idle {
None => true, // By default, add the flag
Some(DisableStartupSyncStateIdle::All) => false,
Some(DisableStartupSyncStateIdle::Baseline) => {
ref_type != "baseline" && ref_type != "warmup"
}
Some(DisableStartupSyncStateIdle::Feature) => ref_type != "feature",
};
if should_add_flag {
args.push("--debug.startup-sync-state-idle".to_string());
debug!("Adding --debug.startup-sync-state-idle flag for ref_type: {}", ref_type);
} else {
debug!("Skipping --debug.startup-sync-state-idle flag for ref_type: {}", ref_type);
}
args
}
/// Get the default RPC URL for a given chain
const fn get_default_rpc_url(chain: &Chain) -> &'static str {
match chain.id() {
8453 => "https://base-mainnet.rpc.ithaca.xyz", // base
84532 => "https://base-sepolia.rpc.ithaca.xyz", // base-sepolia
27082 => "https://rpc.hoodi.ethpandaops.io", // hoodi
_ => "https://reth-ethereum.ithaca.xyz/rpc", // mainnet and fallback
}
}
/// Get the RPC URL, using chain-specific default if not provided
pub(crate) fn get_rpc_url(&self) -> String {
self.rpc_url.clone().unwrap_or_else(|| Self::get_default_rpc_url(&self.chain).to_string())
}
/// Get the JWT secret path - either provided or derived from datadir
pub(crate) fn jwt_secret_path(&self) -> PathBuf {
match &self.jwt_secret {
Some(path) => {
let jwt_secret_str = path.to_string_lossy();
let expanded = shellexpand::tilde(&jwt_secret_str);
PathBuf::from(expanded.as_ref())
}
None => {
// Use the same logic as reth: <datadir>/<chain>/jwt.hex
let chain_path = self.datadir.clone().resolve_datadir(self.chain);
chain_path.jwt()
}
}
}
/// Get the resolved datadir path using the chain
pub(crate) fn datadir_path(&self) -> PathBuf {
let chain_path = self.datadir.clone().resolve_datadir(self.chain);
chain_path.data_dir().to_path_buf()
}
/// Get the expanded output directory path
pub(crate) fn output_dir_path(&self) -> PathBuf {
let expanded = shellexpand::tilde(&self.output_dir);
PathBuf::from(expanded.as_ref())
}
/// Get the effective warmup blocks value - either specified or defaults to blocks
pub(crate) fn get_warmup_blocks(&self) -> u64 {
self.warmup_blocks.unwrap_or(self.blocks)
}
}
/// Validate that the RPC endpoint chain ID matches the specified chain
async fn validate_rpc_chain_id(rpc_url: &str, expected_chain: &Chain) -> Result<()> {
// Create Alloy provider
let url = rpc_url.parse().map_err(|e| eyre!("Invalid RPC URL '{}': {}", rpc_url, e))?;
let provider = ProviderBuilder::new().connect_http(url);
// Query chain ID using Alloy
let rpc_chain_id = provider
.get_chain_id()
.await
.map_err(|e| eyre!("Failed to get chain ID from RPC endpoint {}: {:?}", rpc_url, e))?;
let expected_chain_id = expected_chain.id();
if rpc_chain_id != expected_chain_id {
return Err(eyre!(
"RPC endpoint chain ID mismatch!\n\
Expected: {} (chain: {})\n\
Found: {} at RPC endpoint: {}\n\n\
Please use an RPC endpoint for the correct network or change the --chain argument.",
expected_chain_id,
expected_chain,
rpc_chain_id,
rpc_url
));
}
info!("Validated RPC endpoint chain ID");
Ok(())
}
/// Main comparison workflow execution
pub(crate) async fn run_comparison(args: Args, _ctx: CliContext) -> Result<()> {
// Create a new process group for this process and all its children
#[cfg(unix)]
{
use nix::unistd::{getpid, setpgid};
if let Err(e) = setpgid(getpid(), getpid()) {
warn!("Failed to create process group: {e}");
}
}
info!(
"Starting benchmark comparison between '{}' and '{}'",
args.baseline_ref, args.feature_ref
);
if args.sudo {
info!("Running in sudo mode - reth commands will use elevated privileges");
}
// Initialize Git manager
let git_manager = GitManager::new()?;
// Fetch all branches, tags, and commits
git_manager.fetch_all()?;
// Initialize compilation manager
let output_dir = args.output_dir_path();
let compilation_manager = CompilationManager::new(
git_manager.repo_root().to_string(),
output_dir.clone(),
git_manager.clone(),
args.features.clone(),
)?;
// Initialize node manager
let mut node_manager = NodeManager::new(&args);
let benchmark_runner = BenchmarkRunner::new(&args);
let mut comparison_generator = ComparisonGenerator::new(&args);
// Set the comparison directory in node manager to align with results directory
node_manager.set_comparison_dir(comparison_generator.get_output_dir());
// Store original git state for restoration
let original_ref = git_manager.get_current_ref()?;
info!("Current git reference: {}", original_ref);
// Validate git state
if !args.skip_git_validation {
git_manager.validate_clean_state()?;
git_manager.validate_refs(&[&args.baseline_ref, &args.feature_ref])?;
}
// Validate RPC endpoint chain ID matches the specified chain
let rpc_url = args.get_rpc_url();
validate_rpc_chain_id(&rpc_url, &args.chain).await?;
// Setup signal handling for cleanup
let git_manager_cleanup = git_manager.clone();
let original_ref_cleanup = original_ref.clone();
ctrlc::set_handler(move || {
eprintln!("Received interrupt signal, cleaning up...");
// Send SIGTERM to entire process group to ensure all children exit
#[cfg(unix)]
{
use nix::{
sys::signal::{kill, Signal},
unistd::Pid,
};
// Send SIGTERM to our process group (negative PID = process group)
let current_pid = std::process::id() as i32;
let pgid = Pid::from_raw(-current_pid);
if let Err(e) = kill(pgid, Signal::SIGTERM) {
eprintln!("Failed to send SIGTERM to process group: {e}");
}
}
// Give a moment for any ongoing git operations to complete
std::thread::sleep(std::time::Duration::from_millis(200));
if let Err(e) = git_manager_cleanup.switch_ref(&original_ref_cleanup) {
eprintln!("Failed to restore original git reference: {e}");
eprintln!("You may need to manually run: git checkout {original_ref_cleanup}");
}
std::process::exit(1);
})?;
let result = run_benchmark_workflow(
&git_manager,
&compilation_manager,
&mut node_manager,
&benchmark_runner,
&mut comparison_generator,
&args,
)
.await;
// Always restore original git reference
info!("Restoring original git reference: {}", original_ref);
git_manager.switch_ref(&original_ref)?;
// Handle any errors from the workflow
result?;
Ok(())
}
/// Parse a string of arguments into a vector of strings
fn parse_args_string(args_str: &str) -> Vec<String> {
shlex::split(args_str).unwrap_or_else(|| {
// Fallback to simple whitespace splitting if shlex fails
args_str.split_whitespace().map(|s| s.to_string()).collect()
})
}
/// Run compilation phase for both baseline and feature binaries
async fn run_compilation_phase(
git_manager: &GitManager,
compilation_manager: &CompilationManager,
args: &Args,
is_optimism: bool,
) -> Result<(String, String)> {
info!("=== Running compilation phase ===");
// Ensure required tools are available (only need to check once)
compilation_manager.ensure_reth_bench_available()?;
if args.profile {
compilation_manager.ensure_samply_available()?;
}
let refs = [&args.baseline_ref, &args.feature_ref];
let ref_types = ["baseline", "feature"];
// First, resolve all refs to commits using a HashMap to avoid race conditions where a ref is
// pushed to mid-run.
let mut ref_commits = std::collections::HashMap::new();
for &git_ref in &refs {
if !ref_commits.contains_key(git_ref) {
git_manager.switch_ref(git_ref)?;
let commit = git_manager.get_current_commit()?;
ref_commits.insert(git_ref.clone(), commit);
info!("Reference {} resolves to commit: {}", git_ref, &ref_commits[git_ref][..8]);
}
}
// Now compile each ref using the resolved commits
for (i, &git_ref) in refs.iter().enumerate() {
let ref_type = ref_types[i];
let commit = &ref_commits[git_ref];
info!(
"Compiling {} binary for reference: {} (commit: {})",
ref_type,
git_ref,
&commit[..8]
);
// Switch to target reference
git_manager.switch_ref(git_ref)?;
// Compile reth (with caching)
compilation_manager.compile_reth(commit, is_optimism)?;
info!("Completed compilation for {} reference", ref_type);
}
let baseline_commit = ref_commits[&args.baseline_ref].clone();
let feature_commit = ref_commits[&args.feature_ref].clone();
info!("Compilation phase completed");
Ok((baseline_commit, feature_commit))
}
/// Run warmup phase to warm up caches before benchmarking
async fn run_warmup_phase(
git_manager: &GitManager,
compilation_manager: &CompilationManager,
node_manager: &mut NodeManager,
benchmark_runner: &BenchmarkRunner,
args: &Args,
is_optimism: bool,
baseline_commit: &str,
) -> Result<()> {
info!("=== Running warmup phase ===");
// Use baseline for warmup
let warmup_ref = &args.baseline_ref;
// Switch to baseline reference
git_manager.switch_ref(warmup_ref)?;
// Get the cached binary path for baseline (should already be compiled)
let binary_path =
compilation_manager.get_cached_binary_path_for_commit(baseline_commit, is_optimism);
// Verify the cached binary exists
if !binary_path.exists() {
return Err(eyre!(
"Cached baseline binary not found at {:?}. Compilation phase should have created it.",
binary_path
));
}
info!("Using cached baseline binary for warmup (commit: {})", &baseline_commit[..8]);
// Build additional args with conditional --debug.startup-sync-state-idle flag
let additional_args = args.build_additional_args("warmup", args.baseline_args.as_ref());
// Start reth node for warmup (command is not stored for warmup phase)
let (mut node_process, _warmup_command) =
node_manager.start_node(&binary_path, warmup_ref, "warmup", &additional_args).await?;
// Wait for node to be ready and get its current tip
let current_tip = node_manager.wait_for_node_ready_and_get_tip().await?;
info!("Warmup node is ready at tip: {}", current_tip);
// Store the tip we'll unwind back to
let original_tip = current_tip;
// Clear filesystem caches before warmup run only (unless disabled)
if args.no_clear_cache {
info!("Skipping filesystem cache clearing (--no-clear-cache flag set)");
} else {
BenchmarkRunner::clear_fs_caches().await?;
}
// Run warmup to warm up caches
benchmark_runner.run_warmup(current_tip).await?;
// Stop node before unwinding (node must be stopped to release database lock)
node_manager.stop_node(&mut node_process).await?;
// Unwind back to starting block after warmup
node_manager.unwind_to_block(original_tip).await?;
info!("Warmup phase completed");
Ok(())
}
/// Execute the complete benchmark workflow for both branches
async fn run_benchmark_workflow(
git_manager: &GitManager,
compilation_manager: &CompilationManager,
node_manager: &mut NodeManager,
benchmark_runner: &BenchmarkRunner,
comparison_generator: &mut ComparisonGenerator,
args: &Args,
) -> Result<()> {
// Detect if this is an Optimism chain once at the beginning
let rpc_url = args.get_rpc_url();
let is_optimism = compilation_manager.detect_optimism_chain(&rpc_url).await?;
// Run compilation phase for both binaries
let (baseline_commit, feature_commit) =
run_compilation_phase(git_manager, compilation_manager, args, is_optimism).await?;
// Run warmup phase before benchmarking (skip if warmup_blocks is 0)
if args.get_warmup_blocks() > 0 {
run_warmup_phase(
git_manager,
compilation_manager,
node_manager,
benchmark_runner,
args,
is_optimism,
&baseline_commit,
)
.await?;
} else {
info!("Skipping warmup phase (warmup_blocks is 0)");
}
let refs = [&args.baseline_ref, &args.feature_ref];
let ref_types = ["baseline", "feature"];
let commits = [&baseline_commit, &feature_commit];
for (i, &git_ref) in refs.iter().enumerate() {
let ref_type = ref_types[i];
let commit = commits[i];
info!("=== Processing {} reference: {} ===", ref_type, git_ref);
// Switch to target reference
git_manager.switch_ref(git_ref)?;
// Get the cached binary path for this git reference (should already be compiled)
let binary_path =
compilation_manager.get_cached_binary_path_for_commit(commit, is_optimism);
// Verify the cached binary exists
if !binary_path.exists() {
return Err(eyre!(
"Cached {} binary not found at {:?}. Compilation phase should have created it.",
ref_type,
binary_path
));
}
info!("Using cached {} binary (commit: {})", ref_type, &commit[..8]);
// Get reference-specific base arguments string
let base_args_str = match ref_type {
"baseline" => args.baseline_args.as_ref(),
"feature" => args.feature_args.as_ref(),
_ => None,
};
// Build additional args with conditional --debug.startup-sync-state-idle flag
let additional_args = args.build_additional_args(ref_type, base_args_str);
// Start reth node and capture the command for reporting
let (mut node_process, reth_command) =
node_manager.start_node(&binary_path, git_ref, ref_type, &additional_args).await?;
// Wait for node to be ready and get its current tip (wherever it is)
let current_tip = node_manager.wait_for_node_ready_and_get_tip().await?;
info!("Node is ready at tip: {}", current_tip);
// Store the tip we'll unwind back to
let original_tip = current_tip;
// Calculate benchmark range
// Note: reth-bench has an off-by-one error where it consumes the first block
// of the range, so we add 1 to compensate and get exactly args.blocks blocks
let from_block = original_tip;
let to_block = original_tip + args.blocks;
// Run benchmark
let output_dir = comparison_generator.get_ref_output_dir(ref_type);
// Capture start timestamp for the benchmark run
let benchmark_start = chrono::Utc::now();
// Run benchmark (comparison logic is handled separately by ComparisonGenerator)
benchmark_runner.run_benchmark(from_block, to_block, &output_dir).await?;
// Capture end timestamp for the benchmark run
let benchmark_end = chrono::Utc::now();
// Stop node
node_manager.stop_node(&mut node_process).await?;
// Unwind back to original tip
node_manager.unwind_to_block(original_tip).await?;
// Store results for comparison
comparison_generator.add_ref_results(ref_type, &output_dir)?;
// Set the benchmark run timestamps and reth command
comparison_generator.set_ref_timestamps(ref_type, benchmark_start, benchmark_end)?;
comparison_generator.set_ref_command(ref_type, reth_command)?;
info!("Completed {} reference benchmark", ref_type);
}
// Generate comparison report
comparison_generator.generate_comparison_report().await?;
// Generate charts if requested
if args.draw {
generate_comparison_charts(comparison_generator).await?;
}
// Start samply servers if profiling was enabled
if args.profile {
start_samply_servers(args).await?;
}
Ok(())
}
/// Generate comparison charts using the Python script
async fn generate_comparison_charts(comparison_generator: &ComparisonGenerator) -> Result<()> {
info!("Generating comparison charts with Python script...");
let baseline_output_dir = comparison_generator.get_ref_output_dir("baseline");
let feature_output_dir = comparison_generator.get_ref_output_dir("feature");
let baseline_csv = baseline_output_dir.join("combined_latency.csv");
let feature_csv = feature_output_dir.join("combined_latency.csv");
// Check if CSV files exist
if !baseline_csv.exists() {
return Err(eyre!("Baseline CSV not found: {:?}", baseline_csv));
}
if !feature_csv.exists() {
return Err(eyre!("Feature CSV not found: {:?}", feature_csv));
}
let output_dir = comparison_generator.get_output_dir();
let chart_output = output_dir.join("latency_comparison.png");
let script_path = "bin/reth-bench/scripts/compare_newpayload_latency.py";
info!("Running Python comparison script with uv...");
let mut cmd = Command::new("uv");
cmd.args([
"run",
script_path,
&baseline_csv.to_string_lossy(),
&feature_csv.to_string_lossy(),
"-o",
&chart_output.to_string_lossy(),
]);
// Set process group for consistent signal handling
#[cfg(unix)]
{
cmd.process_group(0);
}
let output = cmd.output().await.map_err(|e| {
eyre!("Failed to execute Python script with uv: {}. Make sure uv is installed.", e)
})?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
return Err(eyre!(
"Python script failed with exit code {:?}:\nstdout: {}\nstderr: {}",
output.status.code(),
stdout,
stderr
));
}
let stdout = String::from_utf8_lossy(&output.stdout);
if !stdout.trim().is_empty() {
info!("Python script output:\n{}", stdout);
}
info!("Comparison chart generated: {:?}", chart_output);
Ok(())
}
/// Start samply servers for viewing profiles
async fn start_samply_servers(args: &Args) -> Result<()> {
info!("Starting samply servers for profile viewing...");
let output_dir = args.output_dir_path();
let profiles_dir = output_dir.join("profiles");
// Build profile paths
let baseline_profile = profiles_dir.join("baseline.json.gz");
let feature_profile = profiles_dir.join("feature.json.gz");
// Check if profiles exist
if !baseline_profile.exists() {
warn!("Baseline profile not found: {:?}", baseline_profile);
return Ok(());
}
if !feature_profile.exists() {
warn!("Feature profile not found: {:?}", feature_profile);
return Ok(());
}
// Find two consecutive available ports starting from 3000
let (baseline_port, feature_port) = find_consecutive_ports(3000)?;
info!("Found available ports: {} and {}", baseline_port, feature_port);
// Get samply path
let samply_path = get_samply_path().await?;
// Start baseline server
info!("Starting samply server for baseline '{}' on port {}", args.baseline_ref, baseline_port);
let mut baseline_cmd = Command::new(&samply_path);
baseline_cmd
.args(["load", "--port", &baseline_port.to_string(), &baseline_profile.to_string_lossy()])
.kill_on_drop(true);
// Set process group for consistent signal handling
#[cfg(unix)]
{
baseline_cmd.process_group(0);
}
// Conditionally pipe output based on log level
if tracing::enabled!(tracing::Level::DEBUG) {
baseline_cmd.stdout(std::process::Stdio::piped()).stderr(std::process::Stdio::piped());
} else {
baseline_cmd.stdout(std::process::Stdio::null()).stderr(std::process::Stdio::null());
}
// Debug log the command
debug!("Executing samply load command: {:?}", baseline_cmd);
let mut baseline_child =
baseline_cmd.spawn().wrap_err("Failed to start samply server for baseline")?;
// Stream baseline samply output if debug logging is enabled
if tracing::enabled!(tracing::Level::DEBUG) {
if let Some(stdout) = baseline_child.stdout.take() {
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[SAMPLY-BASELINE] {}", line);
}
});
}
if let Some(stderr) = baseline_child.stderr.take() {
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let reader = BufReader::new(stderr);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[SAMPLY-BASELINE] {}", line);
}
});
}
}
// Start feature server
info!("Starting samply server for feature '{}' on port {}", args.feature_ref, feature_port);
let mut feature_cmd = Command::new(&samply_path);
feature_cmd
.args(["load", "--port", &feature_port.to_string(), &feature_profile.to_string_lossy()])
.kill_on_drop(true);
// Set process group for consistent signal handling
#[cfg(unix)]
{
feature_cmd.process_group(0);
}
// Conditionally pipe output based on log level
if tracing::enabled!(tracing::Level::DEBUG) {
feature_cmd.stdout(std::process::Stdio::piped()).stderr(std::process::Stdio::piped());
} else {
feature_cmd.stdout(std::process::Stdio::null()).stderr(std::process::Stdio::null());
}
// Debug log the command
debug!("Executing samply load command: {:?}", feature_cmd);
let mut feature_child =
feature_cmd.spawn().wrap_err("Failed to start samply server for feature")?;
// Stream feature samply output if debug logging is enabled
if tracing::enabled!(tracing::Level::DEBUG) {
if let Some(stdout) = feature_child.stdout.take() {
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let reader = BufReader::new(stdout);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[SAMPLY-FEATURE] {}", line);
}
});
}
if let Some(stderr) = feature_child.stderr.take() {
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let reader = BufReader::new(stderr);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[SAMPLY-FEATURE] {}", line);
}
});
}
}
// Give servers time to start
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
// Print access information
println!("\n=== SAMPLY PROFILE SERVERS STARTED ===");
println!("Baseline '{}': http://127.0.0.1:{}", args.baseline_ref, baseline_port);
println!("Feature '{}': http://127.0.0.1:{}", args.feature_ref, feature_port);
println!("\nOpen the URLs in your browser to view the profiles.");
println!("Press Ctrl+C to stop the servers and exit.");
println!("=========================================\n");
// Wait for Ctrl+C or process termination
let ctrl_c = tokio::signal::ctrl_c();
let baseline_wait = baseline_child.wait();
let feature_wait = feature_child.wait();
tokio::select! {
_ = ctrl_c => {
info!("Received Ctrl+C, shutting down samply servers...");
}
result = baseline_wait => {
match result {
Ok(status) => info!("Baseline samply server exited with status: {}", status),
Err(e) => warn!("Baseline samply server error: {}", e),
}
}
result = feature_wait => {
match result {
Ok(status) => info!("Feature samply server exited with status: {}", status),
Err(e) => warn!("Feature samply server error: {}", e),
}
}
}
// Ensure both processes are terminated
let _ = baseline_child.kill().await;
let _ = feature_child.kill().await;
info!("Samply servers stopped.");
Ok(())
}
/// Find two consecutive available ports starting from the given port
fn find_consecutive_ports(start_port: u16) -> Result<(u16, u16)> {
for port in start_port..=65533 {
// Check if both port and port+1 are available
if is_port_available(port) && is_port_available(port + 1) {
return Ok((port, port + 1));
}
}
Err(eyre!("Could not find two consecutive available ports starting from {}", start_port))
}
/// Check if a port is available by attempting to bind to it
fn is_port_available(port: u16) -> bool {
TcpListener::bind(("127.0.0.1", port)).is_ok()
}
/// Get the absolute path to samply using 'which' command
async fn get_samply_path() -> Result<String> {
let output = Command::new("which")
.arg("samply")
.output()
.await
.wrap_err("Failed to execute 'which samply' command")?;
if !output.status.success() {
return Err(eyre!("samply not found in PATH"));
}
let samply_path = String::from_utf8(output.stdout)
.wrap_err("samply path is not valid UTF-8")?
.trim()
.to_string();
if samply_path.is_empty() {
return Err(eyre!("which samply returned empty path"));
}
Ok(samply_path)
}

View File

@@ -0,0 +1,710 @@
//! Results comparison and report generation.
use crate::cli::Args;
use chrono::{DateTime, Utc};
use csv::Reader;
use eyre::{eyre, Result, WrapErr};
use serde::{Deserialize, Serialize};
use std::{
cmp::Ordering,
collections::HashMap,
fs,
path::{Path, PathBuf},
};
use tracing::{info, warn};
/// Manages comparison between baseline and feature reference results
pub(crate) struct ComparisonGenerator {
output_dir: PathBuf,
timestamp: String,
baseline_ref_name: String,
feature_ref_name: String,
baseline_results: Option<BenchmarkResults>,
feature_results: Option<BenchmarkResults>,
baseline_command: Option<String>,
feature_command: Option<String>,
}
/// Represents the results from a single benchmark run
#[derive(Debug, Clone)]
pub(crate) struct BenchmarkResults {
pub ref_name: String,
pub combined_latency_data: Vec<CombinedLatencyRow>,
pub summary: BenchmarkSummary,
pub start_timestamp: Option<DateTime<Utc>>,
pub end_timestamp: Option<DateTime<Utc>>,
}
/// Combined latency CSV row structure
#[derive(Debug, Clone, Deserialize, Serialize)]
pub(crate) struct CombinedLatencyRow {
pub block_number: u64,
pub transaction_count: u64,
pub gas_used: u64,
pub new_payload_latency: u128,
}
/// Total gas CSV row structure
#[derive(Debug, Clone, Deserialize, Serialize)]
pub(crate) struct TotalGasRow {
pub block_number: u64,
pub transaction_count: u64,
pub gas_used: u64,
pub time: u128,
}
/// Summary statistics for a benchmark run.
///
/// Latencies are derived from per-block `engine_newPayload` timings (converted from µs to ms):
/// - `mean_new_payload_latency_ms`: arithmetic mean latency across blocks.
/// - `median_new_payload_latency_ms`: p50 latency across blocks.
/// - `p90_new_payload_latency_ms` / `p99_new_payload_latency_ms`: tail latencies across blocks.
#[derive(Debug, Clone, Serialize)]
pub(crate) struct BenchmarkSummary {
pub total_blocks: u64,
pub total_gas_used: u64,
pub total_duration_ms: u128,
pub mean_new_payload_latency_ms: f64,
pub median_new_payload_latency_ms: f64,
pub p90_new_payload_latency_ms: f64,
pub p99_new_payload_latency_ms: f64,
pub gas_per_second: f64,
pub blocks_per_second: f64,
pub min_block_number: u64,
pub max_block_number: u64,
}
/// Comparison report between two benchmark runs
#[derive(Debug, Serialize)]
pub(crate) struct ComparisonReport {
pub timestamp: String,
pub baseline: RefInfo,
pub feature: RefInfo,
pub comparison_summary: ComparisonSummary,
pub per_block_comparisons: Vec<BlockComparison>,
}
/// Information about a reference in the comparison
#[derive(Debug, Serialize)]
pub(crate) struct RefInfo {
pub ref_name: String,
pub summary: BenchmarkSummary,
pub start_timestamp: Option<DateTime<Utc>>,
pub end_timestamp: Option<DateTime<Utc>>,
pub reth_command: Option<String>,
}
/// Summary of the comparison between references.
///
/// Percent deltas are `(feature - baseline) / baseline * 100`:
/// - `new_payload_latency_p50_change_percent` / p90 / p99: percent changes of the respective
/// per-block percentiles.
/// - `per_block_latency_change_mean_percent` / `per_block_latency_change_median_percent` are the
/// mean and median of per-block percent deltas (feature vs baseline), capturing block-level
/// drift.
/// - `per_block_latency_change_std_dev_percent`: standard deviation of per-block percent changes,
/// measuring consistency of performance changes across blocks.
/// - `new_payload_total_latency_change_percent` is the percent change of the total newPayload time
/// across the run.
///
/// Positive means slower/higher; negative means faster/lower.
#[derive(Debug, Serialize)]
pub(crate) struct ComparisonSummary {
pub per_block_latency_change_mean_percent: f64,
pub per_block_latency_change_median_percent: f64,
pub per_block_latency_change_std_dev_percent: f64,
pub new_payload_total_latency_change_percent: f64,
pub new_payload_latency_p50_change_percent: f64,
pub new_payload_latency_p90_change_percent: f64,
pub new_payload_latency_p99_change_percent: f64,
pub gas_per_second_change_percent: f64,
pub blocks_per_second_change_percent: f64,
}
/// Per-block comparison data
#[derive(Debug, Serialize)]
pub(crate) struct BlockComparison {
pub block_number: u64,
pub transaction_count: u64,
pub gas_used: u64,
pub baseline_new_payload_latency: u128,
pub feature_new_payload_latency: u128,
pub new_payload_latency_change_percent: f64,
}
impl ComparisonGenerator {
/// Create a new comparison generator
pub(crate) fn new(args: &Args) -> Self {
let now: DateTime<Utc> = Utc::now();
let timestamp = now.format("%Y%m%d_%H%M%S").to_string();
Self {
output_dir: args.output_dir_path(),
timestamp,
baseline_ref_name: args.baseline_ref.clone(),
feature_ref_name: args.feature_ref.clone(),
baseline_results: None,
feature_results: None,
baseline_command: None,
feature_command: None,
}
}
/// Get the output directory for a specific reference
pub(crate) fn get_ref_output_dir(&self, ref_type: &str) -> PathBuf {
self.output_dir.join("results").join(&self.timestamp).join(ref_type)
}
/// Get the main output directory for this comparison run
pub(crate) fn get_output_dir(&self) -> PathBuf {
self.output_dir.join("results").join(&self.timestamp)
}
/// Add benchmark results for a reference
pub(crate) fn add_ref_results(&mut self, ref_type: &str, output_path: &Path) -> Result<()> {
let ref_name = match ref_type {
"baseline" => &self.baseline_ref_name,
"feature" => &self.feature_ref_name,
_ => return Err(eyre!("Unknown reference type: {}", ref_type)),
};
let results = self.load_benchmark_results(ref_name, output_path)?;
match ref_type {
"baseline" => self.baseline_results = Some(results),
"feature" => self.feature_results = Some(results),
_ => return Err(eyre!("Unknown reference type: {}", ref_type)),
}
info!("Loaded benchmark results for {} reference", ref_type);
Ok(())
}
/// Set the benchmark run timestamps for a reference
pub(crate) fn set_ref_timestamps(
&mut self,
ref_type: &str,
start: DateTime<Utc>,
end: DateTime<Utc>,
) -> Result<()> {
match ref_type {
"baseline" => {
if let Some(ref mut results) = self.baseline_results {
results.start_timestamp = Some(start);
results.end_timestamp = Some(end);
} else {
return Err(eyre!("Baseline results not loaded yet"));
}
}
"feature" => {
if let Some(ref mut results) = self.feature_results {
results.start_timestamp = Some(start);
results.end_timestamp = Some(end);
} else {
return Err(eyre!("Feature results not loaded yet"));
}
}
_ => return Err(eyre!("Unknown reference type: {}", ref_type)),
}
Ok(())
}
/// Set the reth command for a reference
pub(crate) fn set_ref_command(&mut self, ref_type: &str, command: String) -> Result<()> {
match ref_type {
"baseline" => {
self.baseline_command = Some(command);
}
"feature" => {
self.feature_command = Some(command);
}
_ => return Err(eyre!("Unknown reference type: {}", ref_type)),
}
Ok(())
}
/// Generate the final comparison report
pub(crate) async fn generate_comparison_report(&self) -> Result<()> {
info!("Generating comparison report...");
let baseline =
self.baseline_results.as_ref().ok_or_else(|| eyre!("Baseline results not loaded"))?;
let feature =
self.feature_results.as_ref().ok_or_else(|| eyre!("Feature results not loaded"))?;
let per_block_comparisons = self.calculate_per_block_comparisons(baseline, feature)?;
let comparison_summary = self.calculate_comparison_summary(
&baseline.summary,
&feature.summary,
&per_block_comparisons,
)?;
let report = ComparisonReport {
timestamp: self.timestamp.clone(),
baseline: RefInfo {
ref_name: baseline.ref_name.clone(),
summary: baseline.summary.clone(),
start_timestamp: baseline.start_timestamp,
end_timestamp: baseline.end_timestamp,
reth_command: self.baseline_command.clone(),
},
feature: RefInfo {
ref_name: feature.ref_name.clone(),
summary: feature.summary.clone(),
start_timestamp: feature.start_timestamp,
end_timestamp: feature.end_timestamp,
reth_command: self.feature_command.clone(),
},
comparison_summary,
per_block_comparisons,
};
// Write reports
self.write_comparison_reports(&report).await?;
// Print summary to console
self.print_comparison_summary(&report);
Ok(())
}
/// Load benchmark results from CSV files
fn load_benchmark_results(
&self,
ref_name: &str,
output_path: &Path,
) -> Result<BenchmarkResults> {
let combined_latency_path = output_path.join("combined_latency.csv");
let total_gas_path = output_path.join("total_gas.csv");
let combined_latency_data = self.load_combined_latency_csv(&combined_latency_path)?;
let total_gas_data = self.load_total_gas_csv(&total_gas_path)?;
let summary = self.calculate_summary(&combined_latency_data, &total_gas_data)?;
Ok(BenchmarkResults {
ref_name: ref_name.to_string(),
combined_latency_data,
summary,
start_timestamp: None,
end_timestamp: None,
})
}
/// Load combined latency CSV data
fn load_combined_latency_csv(&self, path: &Path) -> Result<Vec<CombinedLatencyRow>> {
let mut reader = Reader::from_path(path)
.wrap_err_with(|| format!("Failed to open combined latency CSV: {path:?}"))?;
let mut rows = Vec::new();
for result in reader.deserialize() {
let row: CombinedLatencyRow = result
.wrap_err_with(|| format!("Failed to parse combined latency row in {path:?}"))?;
rows.push(row);
}
if rows.is_empty() {
return Err(eyre!("No data found in combined latency CSV: {:?}", path));
}
Ok(rows)
}
/// Load total gas CSV data
fn load_total_gas_csv(&self, path: &Path) -> Result<Vec<TotalGasRow>> {
let mut reader = Reader::from_path(path)
.wrap_err_with(|| format!("Failed to open total gas CSV: {path:?}"))?;
let mut rows = Vec::new();
for result in reader.deserialize() {
let row: TotalGasRow =
result.wrap_err_with(|| format!("Failed to parse total gas row in {path:?}"))?;
rows.push(row);
}
if rows.is_empty() {
return Err(eyre!("No data found in total gas CSV: {:?}", path));
}
Ok(rows)
}
/// Calculate summary statistics for a benchmark run.
///
/// Computes latency statistics from per-block `new_payload_latency` values in `combined_data`
/// (converting from µs to ms), and throughput metrics using the total run duration from
/// `total_gas_data`. Percentiles (p50/p90/p99) use linear interpolation on sorted latencies.
fn calculate_summary(
&self,
combined_data: &[CombinedLatencyRow],
total_gas_data: &[TotalGasRow],
) -> Result<BenchmarkSummary> {
if combined_data.is_empty() || total_gas_data.is_empty() {
return Err(eyre!("Cannot calculate summary for empty data"));
}
let total_blocks = combined_data.len() as u64;
let total_gas_used: u64 = combined_data.iter().map(|r| r.gas_used).sum();
let total_duration_ms = total_gas_data.last().unwrap().time / 1000; // Convert microseconds to milliseconds
let latencies_ms: Vec<f64> =
combined_data.iter().map(|r| r.new_payload_latency as f64 / 1000.0).collect();
let mean_new_payload_latency_ms: f64 =
latencies_ms.iter().sum::<f64>() / total_blocks as f64;
let mut sorted_latencies_ms = latencies_ms;
sorted_latencies_ms.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));
let median_new_payload_latency_ms = percentile(&sorted_latencies_ms, 0.5);
let p90_new_payload_latency_ms = percentile(&sorted_latencies_ms, 0.9);
let p99_new_payload_latency_ms = percentile(&sorted_latencies_ms, 0.99);
let total_duration_seconds = total_duration_ms as f64 / 1000.0;
let gas_per_second = if total_duration_seconds > f64::EPSILON {
total_gas_used as f64 / total_duration_seconds
} else {
0.0
};
let blocks_per_second = if total_duration_seconds > f64::EPSILON {
total_blocks as f64 / total_duration_seconds
} else {
0.0
};
let min_block_number = combined_data.first().unwrap().block_number;
let max_block_number = combined_data.last().unwrap().block_number;
Ok(BenchmarkSummary {
total_blocks,
total_gas_used,
total_duration_ms,
mean_new_payload_latency_ms,
median_new_payload_latency_ms,
p90_new_payload_latency_ms,
p99_new_payload_latency_ms,
gas_per_second,
blocks_per_second,
min_block_number,
max_block_number,
})
}
/// Calculate comparison summary between baseline and feature
fn calculate_comparison_summary(
&self,
baseline: &BenchmarkSummary,
feature: &BenchmarkSummary,
per_block_comparisons: &[BlockComparison],
) -> Result<ComparisonSummary> {
let calc_percent_change = |baseline: f64, feature: f64| -> f64 {
if baseline.abs() > f64::EPSILON {
((feature - baseline) / baseline) * 100.0
} else {
0.0
}
};
// Calculate per-block statistics. "Per-block" means: for each block, compute the percent
// change (feature - baseline) / baseline * 100, then calculate statistics across those
// per-block percent changes. This captures how consistently the feature performs relative
// to baseline across all blocks.
let per_block_percent_changes: Vec<f64> =
per_block_comparisons.iter().map(|c| c.new_payload_latency_change_percent).collect();
let per_block_latency_change_mean_percent = if per_block_percent_changes.is_empty() {
0.0
} else {
per_block_percent_changes.iter().sum::<f64>() / per_block_percent_changes.len() as f64
};
let per_block_latency_change_median_percent = if per_block_percent_changes.is_empty() {
0.0
} else {
let mut sorted = per_block_percent_changes.clone();
sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal));
percentile(&sorted, 0.5)
};
let per_block_latency_change_std_dev_percent =
calculate_std_dev(&per_block_percent_changes, per_block_latency_change_mean_percent);
let baseline_total_latency_ms =
baseline.mean_new_payload_latency_ms * baseline.total_blocks as f64;
let feature_total_latency_ms =
feature.mean_new_payload_latency_ms * feature.total_blocks as f64;
let new_payload_total_latency_change_percent =
calc_percent_change(baseline_total_latency_ms, feature_total_latency_ms);
Ok(ComparisonSummary {
per_block_latency_change_mean_percent,
per_block_latency_change_median_percent,
per_block_latency_change_std_dev_percent,
new_payload_total_latency_change_percent,
new_payload_latency_p50_change_percent: calc_percent_change(
baseline.median_new_payload_latency_ms,
feature.median_new_payload_latency_ms,
),
new_payload_latency_p90_change_percent: calc_percent_change(
baseline.p90_new_payload_latency_ms,
feature.p90_new_payload_latency_ms,
),
new_payload_latency_p99_change_percent: calc_percent_change(
baseline.p99_new_payload_latency_ms,
feature.p99_new_payload_latency_ms,
),
gas_per_second_change_percent: calc_percent_change(
baseline.gas_per_second,
feature.gas_per_second,
),
blocks_per_second_change_percent: calc_percent_change(
baseline.blocks_per_second,
feature.blocks_per_second,
),
})
}
/// Calculate per-block comparisons
fn calculate_per_block_comparisons(
&self,
baseline: &BenchmarkResults,
feature: &BenchmarkResults,
) -> Result<Vec<BlockComparison>> {
let mut baseline_map: HashMap<u64, &CombinedLatencyRow> = HashMap::new();
for row in &baseline.combined_latency_data {
baseline_map.insert(row.block_number, row);
}
let mut comparisons = Vec::new();
for feature_row in &feature.combined_latency_data {
if let Some(baseline_row) = baseline_map.get(&feature_row.block_number) {
let calc_percent_change = |baseline: u128, feature: u128| -> f64 {
if baseline > 0 {
((feature as f64 - baseline as f64) / baseline as f64) * 100.0
} else {
0.0
}
};
let comparison = BlockComparison {
block_number: feature_row.block_number,
transaction_count: feature_row.transaction_count,
gas_used: feature_row.gas_used,
baseline_new_payload_latency: baseline_row.new_payload_latency,
feature_new_payload_latency: feature_row.new_payload_latency,
new_payload_latency_change_percent: calc_percent_change(
baseline_row.new_payload_latency,
feature_row.new_payload_latency,
),
};
comparisons.push(comparison);
} else {
warn!("Block {} not found in baseline data", feature_row.block_number);
}
}
Ok(comparisons)
}
/// Write comparison reports to files
async fn write_comparison_reports(&self, report: &ComparisonReport) -> Result<()> {
let report_dir = self.output_dir.join("results").join(&self.timestamp);
fs::create_dir_all(&report_dir)
.wrap_err_with(|| format!("Failed to create report directory: {report_dir:?}"))?;
// Write JSON report
let json_path = report_dir.join("comparison_report.json");
let json_content = serde_json::to_string_pretty(report)
.wrap_err("Failed to serialize comparison report to JSON")?;
fs::write(&json_path, json_content)
.wrap_err_with(|| format!("Failed to write JSON report: {json_path:?}"))?;
// Write CSV report for per-block comparisons
let csv_path = report_dir.join("per_block_comparison.csv");
let mut writer = csv::Writer::from_path(&csv_path)
.wrap_err_with(|| format!("Failed to create CSV writer: {csv_path:?}"))?;
for comparison in &report.per_block_comparisons {
writer.serialize(comparison).wrap_err("Failed to write comparison row to CSV")?;
}
writer.flush().wrap_err("Failed to flush CSV writer")?;
info!("Comparison reports written to: {:?}", report_dir);
Ok(())
}
/// Print comparison summary to console
fn print_comparison_summary(&self, report: &ComparisonReport) {
// Parse and format timestamp nicely
let formatted_timestamp = if let Ok(dt) = chrono::DateTime::parse_from_str(
&format!("{} +0000", report.timestamp.replace('_', " ")),
"%Y%m%d %H%M%S %z",
) {
dt.format("%Y-%m-%d %H:%M:%S UTC").to_string()
} else {
// Fallback to original if parsing fails
report.timestamp.clone()
};
println!("\n=== BENCHMARK COMPARISON SUMMARY ===");
println!("Timestamp: {formatted_timestamp}");
println!("Baseline: {}", report.baseline.ref_name);
println!("Feature: {}", report.feature.ref_name);
println!();
let summary = &report.comparison_summary;
println!("Performance Changes:");
println!(
" NewPayload Latency per-block mean change: {:+.2}%",
summary.per_block_latency_change_mean_percent
);
println!(
" NewPayload Latency per-block median change: {:+.2}%",
summary.per_block_latency_change_median_percent
);
println!(
" NewPayload Latency per-block std dev: {:.2}%",
summary.per_block_latency_change_std_dev_percent
);
println!(
" Total newPayload time change: {:+.2}%",
summary.new_payload_total_latency_change_percent
);
println!(
" NewPayload Latency p50: {:+.2}%",
summary.new_payload_latency_p50_change_percent
);
println!(
" NewPayload Latency p90: {:+.2}%",
summary.new_payload_latency_p90_change_percent
);
println!(
" NewPayload Latency p99: {:+.2}%",
summary.new_payload_latency_p99_change_percent
);
println!(
" Gas/Second: {:+.2}%",
summary.gas_per_second_change_percent
);
println!(
" Blocks/Second: {:+.2}%",
summary.blocks_per_second_change_percent
);
println!();
println!("Baseline Summary:");
let baseline = &report.baseline.summary;
println!(
" Blocks: {} (blocks {} to {}), Gas: {}, Duration: {:.2}s",
baseline.total_blocks,
baseline.min_block_number,
baseline.max_block_number,
baseline.total_gas_used,
baseline.total_duration_ms as f64 / 1000.0
);
println!(" NewPayload latency (ms):");
println!(
" mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}",
baseline.mean_new_payload_latency_ms,
baseline.median_new_payload_latency_ms,
baseline.p90_new_payload_latency_ms,
baseline.p99_new_payload_latency_ms
);
if let (Some(start), Some(end)) =
(&report.baseline.start_timestamp, &report.baseline.end_timestamp)
{
println!(
" Started: {}, Ended: {}",
start.format("%Y-%m-%d %H:%M:%S UTC"),
end.format("%Y-%m-%d %H:%M:%S UTC")
);
}
if let Some(ref cmd) = report.baseline.reth_command {
println!(" Command: {}", cmd);
}
println!();
println!("Feature Summary:");
let feature = &report.feature.summary;
println!(
" Blocks: {} (blocks {} to {}), Gas: {}, Duration: {:.2}s",
feature.total_blocks,
feature.min_block_number,
feature.max_block_number,
feature.total_gas_used,
feature.total_duration_ms as f64 / 1000.0
);
println!(" NewPayload latency (ms):");
println!(
" mean: {:.2}, p50: {:.2}, p90: {:.2}, p99: {:.2}",
feature.mean_new_payload_latency_ms,
feature.median_new_payload_latency_ms,
feature.p90_new_payload_latency_ms,
feature.p99_new_payload_latency_ms
);
if let (Some(start), Some(end)) =
(&report.feature.start_timestamp, &report.feature.end_timestamp)
{
println!(
" Started: {}, Ended: {}",
start.format("%Y-%m-%d %H:%M:%S UTC"),
end.format("%Y-%m-%d %H:%M:%S UTC")
);
}
if let Some(ref cmd) = report.feature.reth_command {
println!(" Command: {}", cmd);
}
println!();
}
}
/// Calculate standard deviation from a set of values and their mean.
///
/// Computes the population standard deviation using the formula:
/// `sqrt(sum((x - mean)²) / n)`
///
/// Returns 0.0 for empty input.
fn calculate_std_dev(values: &[f64], mean: f64) -> f64 {
if values.is_empty() {
return 0.0;
}
let variance = values
.iter()
.map(|x| {
let diff = x - mean;
diff * diff
})
.sum::<f64>() /
values.len() as f64;
variance.sqrt()
}
/// Calculate percentile using linear interpolation on a sorted slice.
///
/// Computes `rank = percentile × (n - 1)` where n is the array length. If the rank falls
/// between two indices, linearly interpolates between those values. For example, with 100 values,
/// p90 computes rank = 0.9 × 99 = 89.1, then returns `values[89] × 0.9 + values[90] × 0.1`.
///
/// Returns 0.0 for empty input.
fn percentile(sorted_values: &[f64], percentile: f64) -> f64 {
if sorted_values.is_empty() {
return 0.0;
}
let clamped = percentile.clamp(0.0, 1.0);
let max_index = sorted_values.len() - 1;
let rank = clamped * max_index as f64;
let lower = rank.floor() as usize;
let upper = rank.ceil() as usize;
if lower == upper {
sorted_values[lower]
} else {
let weight = rank - lower as f64;
sorted_values[lower].mul_add(1.0 - weight, sorted_values[upper] * weight)
}
}

View File

@@ -0,0 +1,354 @@
//! Compilation operations for reth and reth-bench.
use crate::git::GitManager;
use alloy_primitives::address;
use alloy_provider::{Provider, ProviderBuilder};
use eyre::{eyre, Result, WrapErr};
use std::{fs, path::PathBuf, process::Command};
use tracing::{debug, error, info, warn};
/// Manages compilation operations for reth components
#[derive(Debug)]
pub(crate) struct CompilationManager {
repo_root: String,
output_dir: PathBuf,
git_manager: GitManager,
features: String,
}
impl CompilationManager {
/// Create a new `CompilationManager`
pub(crate) const fn new(
repo_root: String,
output_dir: PathBuf,
git_manager: GitManager,
features: String,
) -> Result<Self> {
Ok(Self { repo_root, output_dir, git_manager, features })
}
/// Detect if the RPC endpoint is an Optimism chain
pub(crate) async fn detect_optimism_chain(&self, rpc_url: &str) -> Result<bool> {
info!("Detecting chain type from RPC endpoint...");
// Create Alloy provider
let url = rpc_url.parse().map_err(|e| eyre!("Invalid RPC URL '{}': {}", rpc_url, e))?;
let provider = ProviderBuilder::new().connect_http(url);
// Check for Optimism predeploy at address 0x420000000000000000000000000000000000000F
let is_optimism = !provider
.get_code_at(address!("0x420000000000000000000000000000000000000F"))
.await?
.is_empty();
if is_optimism {
info!("Detected Optimism chain");
} else {
info!("Detected Ethereum chain");
}
Ok(is_optimism)
}
/// Get the path to the cached binary using explicit commit hash
pub(crate) fn get_cached_binary_path_for_commit(
&self,
commit: &str,
is_optimism: bool,
) -> PathBuf {
let identifier = &commit[..8]; // Use first 8 chars of commit
let binary_name = if is_optimism {
format!("op-reth_{}", identifier)
} else {
format!("reth_{}", identifier)
};
self.output_dir.join("bin").join(binary_name)
}
/// Compile reth using cargo build and cache the binary
pub(crate) fn compile_reth(&self, commit: &str, is_optimism: bool) -> Result<()> {
// Validate that current git commit matches the expected commit
let current_commit = self.git_manager.get_current_commit()?;
if current_commit != commit {
return Err(eyre!(
"Git commit mismatch! Expected: {}, but currently at: {}",
&commit[..8],
&current_commit[..8]
));
}
let cached_path = self.get_cached_binary_path_for_commit(commit, is_optimism);
// Check if cached binary already exists (since path contains commit hash, it's valid)
if cached_path.exists() {
info!("Using cached binary (commit: {})", &commit[..8]);
return Ok(());
}
info!("No cached binary found, compiling (commit: {})...", &commit[..8]);
let binary_name = if is_optimism { "op-reth" } else { "reth" };
info!(
"Compiling {} with profiling configuration (commit: {})...",
binary_name,
&commit[..8]
);
let mut cmd = Command::new("cargo");
cmd.arg("build").arg("--profile").arg("profiling");
// Add features
cmd.arg("--features").arg(&self.features);
info!("Using features: {}", self.features);
// Add bin-specific arguments for optimism
if is_optimism {
cmd.arg("--bin")
.arg("op-reth")
.arg("--manifest-path")
.arg("crates/optimism/bin/Cargo.toml");
}
cmd.current_dir(&self.repo_root);
// Set RUSTFLAGS for native CPU optimization
cmd.env("RUSTFLAGS", "-C target-cpu=native");
// Debug log the command
debug!("Executing cargo command: {:?}", cmd);
let output = cmd.output().wrap_err("Failed to execute cargo build command")?;
// Print stdout and stderr with prefixes at debug level
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
for line in stdout.lines() {
if !line.trim().is_empty() {
debug!("[CARGO] {}", line);
}
}
for line in stderr.lines() {
if !line.trim().is_empty() {
debug!("[CARGO] {}", line);
}
}
if !output.status.success() {
// Print all output when compilation fails
error!("Cargo build failed with exit code: {:?}", output.status.code());
if !stdout.trim().is_empty() {
error!("Cargo stdout:");
for line in stdout.lines() {
error!(" {}", line);
}
}
if !stderr.trim().is_empty() {
error!("Cargo stderr:");
for line in stderr.lines() {
error!(" {}", line);
}
}
return Err(eyre!("Compilation failed with exit code: {:?}", output.status.code()));
}
info!("{} compilation completed", binary_name);
// Copy the compiled binary to cache
let source_path =
PathBuf::from(&self.repo_root).join(format!("target/profiling/{}", binary_name));
if !source_path.exists() {
return Err(eyre!("Compiled binary not found at {:?}", source_path));
}
// Create bin directory if it doesn't exist
let bin_dir = self.output_dir.join("bin");
fs::create_dir_all(&bin_dir).wrap_err("Failed to create bin directory")?;
// Copy binary to cache
fs::copy(&source_path, &cached_path).wrap_err("Failed to copy binary to cache")?;
// Make the cached binary executable
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
let mut perms = fs::metadata(&cached_path)?.permissions();
perms.set_mode(0o755);
fs::set_permissions(&cached_path, perms)?;
}
info!("Cached compiled binary at: {:?}", cached_path);
Ok(())
}
/// Check if reth-bench is available in PATH
pub(crate) fn is_reth_bench_available(&self) -> bool {
match Command::new("which").arg("reth-bench").output() {
Ok(output) => {
if output.status.success() {
let path = String::from_utf8_lossy(&output.stdout);
info!("Found reth-bench: {}", path.trim());
true
} else {
false
}
}
Err(_) => false,
}
}
/// Check if samply is available in PATH
pub(crate) fn is_samply_available(&self) -> bool {
match Command::new("which").arg("samply").output() {
Ok(output) => {
if output.status.success() {
let path = String::from_utf8_lossy(&output.stdout);
info!("Found samply: {}", path.trim());
true
} else {
false
}
}
Err(_) => false,
}
}
/// Install samply using cargo
pub(crate) fn install_samply(&self) -> Result<()> {
info!("Installing samply via cargo...");
let mut cmd = Command::new("cargo");
cmd.args(["install", "--locked", "samply"]);
// Debug log the command
debug!("Executing cargo command: {:?}", cmd);
let output = cmd.output().wrap_err("Failed to execute cargo install samply command")?;
// Print stdout and stderr with prefixes at debug level
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
for line in stdout.lines() {
if !line.trim().is_empty() {
debug!("[CARGO-SAMPLY] {}", line);
}
}
for line in stderr.lines() {
if !line.trim().is_empty() {
debug!("[CARGO-SAMPLY] {}", line);
}
}
if !output.status.success() {
// Print all output when installation fails
error!("Cargo install samply failed with exit code: {:?}", output.status.code());
if !stdout.trim().is_empty() {
error!("Cargo stdout:");
for line in stdout.lines() {
error!(" {}", line);
}
}
if !stderr.trim().is_empty() {
error!("Cargo stderr:");
for line in stderr.lines() {
error!(" {}", line);
}
}
return Err(eyre!(
"samply installation failed with exit code: {:?}",
output.status.code()
));
}
info!("Samply installation completed");
Ok(())
}
/// Ensure samply is available, installing if necessary
pub(crate) fn ensure_samply_available(&self) -> Result<()> {
if self.is_samply_available() {
Ok(())
} else {
warn!("samply not found in PATH, installing...");
self.install_samply()
}
}
/// Ensure reth-bench is available, compiling if necessary
pub(crate) fn ensure_reth_bench_available(&self) -> Result<()> {
if self.is_reth_bench_available() {
Ok(())
} else {
warn!("reth-bench not found in PATH, compiling and installing...");
self.compile_reth_bench()
}
}
/// Compile and install reth-bench using `make install-reth-bench`
pub(crate) fn compile_reth_bench(&self) -> Result<()> {
info!("Compiling and installing reth-bench...");
let mut cmd = Command::new("make");
cmd.arg("install-reth-bench").current_dir(&self.repo_root);
// Debug log the command
debug!("Executing make command: {:?}", cmd);
let output = cmd.output().wrap_err("Failed to execute make install-reth-bench command")?;
// Print stdout and stderr with prefixes at debug level
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
for line in stdout.lines() {
if !line.trim().is_empty() {
debug!("[MAKE-BENCH] {}", line);
}
}
for line in stderr.lines() {
if !line.trim().is_empty() {
debug!("[MAKE-BENCH] {}", line);
}
}
if !output.status.success() {
// Print all output when compilation fails
error!("Make install-reth-bench failed with exit code: {:?}", output.status.code());
if !stdout.trim().is_empty() {
error!("Make stdout:");
for line in stdout.lines() {
error!(" {}", line);
}
}
if !stderr.trim().is_empty() {
error!("Make stderr:");
for line in stderr.lines() {
error!(" {}", line);
}
}
return Err(eyre!(
"reth-bench compilation failed with exit code: {:?}",
output.status.code()
));
}
info!("Reth-bench compilation completed");
Ok(())
}
}

View File

@@ -0,0 +1,328 @@
//! Git operations for branch management.
use eyre::{eyre, Result, WrapErr};
use std::process::Command;
use tracing::{info, warn};
/// Manages git operations for branch switching
#[derive(Debug, Clone)]
pub(crate) struct GitManager {
repo_root: String,
}
impl GitManager {
/// Create a new `GitManager`, detecting the repository root
pub(crate) fn new() -> Result<Self> {
let output = Command::new("git")
.args(["rev-parse", "--show-toplevel"])
.output()
.wrap_err("Failed to execute git command - is git installed?")?;
if !output.status.success() {
return Err(eyre!("Not in a git repository or git command failed"));
}
let repo_root = String::from_utf8(output.stdout)
.wrap_err("Git output is not valid UTF-8")?
.trim()
.to_string();
let manager = Self { repo_root };
info!(
"Detected git repository at: {}, current reference: {}",
manager.repo_root(),
manager.get_current_ref()?
);
Ok(manager)
}
/// Get the current git branch name
pub(crate) fn get_current_branch(&self) -> Result<String> {
let output = Command::new("git")
.args(["branch", "--show-current"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to get current branch")?;
if !output.status.success() {
return Err(eyre!("Failed to determine current branch"));
}
let branch = String::from_utf8(output.stdout)
.wrap_err("Branch name is not valid UTF-8")?
.trim()
.to_string();
if branch.is_empty() {
return Err(eyre!("Not on a named branch (detached HEAD?)"));
}
Ok(branch)
}
/// Get the current git reference (branch name, tag, or commit hash)
pub(crate) fn get_current_ref(&self) -> Result<String> {
// First try to get branch name
if let Ok(branch) = self.get_current_branch() {
return Ok(branch);
}
// If not on a branch, check if we're on a tag
let tag_output = Command::new("git")
.args(["describe", "--exact-match", "--tags", "HEAD"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to check for tag")?;
if tag_output.status.success() {
let tag = String::from_utf8(tag_output.stdout)
.wrap_err("Tag name is not valid UTF-8")?
.trim()
.to_string();
return Ok(tag);
}
// If not on a branch or tag, return the commit hash
let commit_output = Command::new("git")
.args(["rev-parse", "HEAD"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to get current commit")?;
if !commit_output.status.success() {
return Err(eyre!("Failed to get current commit hash"));
}
let commit_hash = String::from_utf8(commit_output.stdout)
.wrap_err("Commit hash is not valid UTF-8")?
.trim()
.to_string();
Ok(commit_hash)
}
/// Check if the git working directory has uncommitted changes to tracked files
pub(crate) fn validate_clean_state(&self) -> Result<()> {
let output = Command::new("git")
.args(["status", "--porcelain"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to check git status")?;
if !output.status.success() {
return Err(eyre!("Git status command failed"));
}
let status_output =
String::from_utf8(output.stdout).wrap_err("Git status output is not valid UTF-8")?;
// Check for uncommitted changes to tracked files
// Status codes: M = modified, A = added, D = deleted, R = renamed, C = copied, U = updated
// ?? = untracked files (we want to ignore these)
let has_uncommitted_changes = status_output.lines().any(|line| {
if line.len() >= 2 {
let status = &line[0..2];
// Ignore untracked files (??) and ignored files (!!)
!matches!(status, "??" | "!!")
} else {
false
}
});
if has_uncommitted_changes {
warn!("Git working directory has uncommitted changes to tracked files:");
for line in status_output.lines() {
if line.len() >= 2 && !matches!(&line[0..2], "??" | "!!") {
warn!(" {}", line);
}
}
return Err(eyre!(
"Git working directory has uncommitted changes to tracked files. Please commit or stash changes before running benchmark comparison."
));
}
// Check if there are untracked files and log them as info
let untracked_files: Vec<&str> =
status_output.lines().filter(|line| line.starts_with("??")).collect();
if !untracked_files.is_empty() {
info!(
"Git working directory has {} untracked files (this is OK)",
untracked_files.len()
);
}
info!("Git working directory is clean (no uncommitted changes to tracked files)");
Ok(())
}
/// Fetch all refs from remote to ensure we have latest branches and tags
pub(crate) fn fetch_all(&self) -> Result<()> {
let output = Command::new("git")
.args(["fetch", "--all", "--tags", "--quiet", "--force"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to fetch latest refs")?;
if output.status.success() {
info!("Fetched latest refs");
} else {
let stderr = String::from_utf8_lossy(&output.stderr);
// Only warn if there's actual error content, not just fetch progress
if !stderr.trim().is_empty() && !stderr.contains("-> origin/") {
warn!("Git fetch encountered issues (continuing anyway): {}", stderr);
}
}
Ok(())
}
/// Validate that the specified git references exist (branches, tags, or commits)
pub(crate) fn validate_refs(&self, refs: &[&str]) -> Result<()> {
for &git_ref in refs {
// Try to resolve the ref similar to `git checkout` by peeling to a commit.
// First try the ref as-is with ^{commit}, then fall back to origin/{ref}^{commit}.
let as_is = format!("{git_ref}^{{commit}}");
let ref_check = Command::new("git")
.args(["rev-parse", "--verify", &as_is])
.current_dir(&self.repo_root)
.output();
let found = if let Ok(output) = ref_check &&
output.status.success()
{
info!("Validated reference exists: {}", git_ref);
true
} else {
// Try remote-only branches via origin/{ref}
let origin_ref = format!("origin/{git_ref}^{{commit}}");
let origin_check = Command::new("git")
.args(["rev-parse", "--verify", &origin_ref])
.current_dir(&self.repo_root)
.output();
if let Ok(output) = origin_check &&
output.status.success()
{
info!("Validated remote reference exists: origin/{}", git_ref);
true
} else {
false
}
};
if !found {
return Err(eyre!(
"Git reference '{}' does not exist as branch, tag, or commit (tried '{}' and 'origin/{}^{{commit}}')",
git_ref,
format!("{git_ref}^{{commit}}"),
git_ref,
));
}
}
Ok(())
}
/// Switch to the specified git reference (branch, tag, or commit)
pub(crate) fn switch_ref(&self, git_ref: &str) -> Result<()> {
// First checkout the reference
let output = Command::new("git")
.args(["checkout", git_ref])
.current_dir(&self.repo_root)
.output()
.wrap_err_with(|| format!("Failed to switch to reference '{git_ref}'"))?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
return Err(eyre!("Failed to switch to reference '{}': {}", git_ref, stderr));
}
// Check if this is a branch that tracks a remote and pull latest changes
let is_branch = Command::new("git")
.args(["show-ref", "--verify", "--quiet", &format!("refs/heads/{git_ref}")])
.current_dir(&self.repo_root)
.status()
.map(|s| s.success())
.unwrap_or(false);
if is_branch {
// Check if the branch tracks a remote
let tracking_output = Command::new("git")
.args([
"rev-parse",
"--abbrev-ref",
"--symbolic-full-name",
&format!("{git_ref}@{{upstream}}"),
])
.current_dir(&self.repo_root)
.output();
if let Ok(output) = tracking_output &&
output.status.success()
{
let upstream = String::from_utf8_lossy(&output.stdout).trim().to_string();
if !upstream.is_empty() && upstream != format!("{git_ref}@{{upstream}}") {
// Branch tracks a remote, pull latest changes
info!("Pulling latest changes for branch: {}", git_ref);
let pull_output = Command::new("git")
.args(["pull", "--ff-only"])
.current_dir(&self.repo_root)
.output()
.wrap_err_with(|| {
format!("Failed to pull latest changes for branch '{git_ref}'")
})?;
if pull_output.status.success() {
info!("Successfully pulled latest changes for branch: {}", git_ref);
} else {
let stderr = String::from_utf8_lossy(&pull_output.stderr);
warn!("Failed to pull latest changes for branch '{}': {}", git_ref, stderr);
// Continue anyway, we'll use whatever version we have
}
}
}
}
// Verify the checkout succeeded by checking the current commit
let current_commit_output = Command::new("git")
.args(["rev-parse", "HEAD"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to get current commit")?;
if !current_commit_output.status.success() {
return Err(eyre!("Failed to verify git checkout"));
}
info!("Switched to reference: {}", git_ref);
Ok(())
}
/// Get the current commit hash
pub(crate) fn get_current_commit(&self) -> Result<String> {
let output = Command::new("git")
.args(["rev-parse", "HEAD"])
.current_dir(&self.repo_root)
.output()
.wrap_err("Failed to get current commit")?;
if !output.status.success() {
return Err(eyre!("Failed to get current commit hash"));
}
let commit_hash = String::from_utf8(output.stdout)
.wrap_err("Commit hash is not valid UTF-8")?
.trim()
.to_string();
Ok(commit_hash)
}
/// Get the repository root path
pub(crate) fn repo_root(&self) -> &str {
&self.repo_root
}
}

View File

@@ -0,0 +1,45 @@
//! # reth-bench-compare
//!
//! Automated tool for comparing reth performance between two git branches.
//! This tool automates the complete workflow of compiling, running, and benchmarking
//! reth on different branches to provide meaningful performance comparisons.
#![doc(
html_logo_url = "https://raw.githubusercontent.com/paradigmxyz/reth/main/assets/reth-docs.png",
html_favicon_url = "https://avatars0.githubusercontent.com/u/97369466?s=256",
issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
)]
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
#[global_allocator]
static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator();
mod benchmark;
mod cli;
mod comparison;
mod compilation;
mod git;
mod node;
use clap::Parser;
use cli::{run_comparison, Args};
use eyre::Result;
use reth_cli_runner::CliRunner;
fn main() -> Result<()> {
// Enable backtraces unless a RUST_BACKTRACE value has already been explicitly provided.
if std::env::var_os("RUST_BACKTRACE").is_none() {
unsafe {
std::env::set_var("RUST_BACKTRACE", "1");
}
}
let args = Args::parse();
// Initialize tracing
let _guard = args.init_tracing()?;
// Run until either exit or sigint or sigterm
let runner = CliRunner::try_default_runtime()?;
runner.run_command_until_exit(|ctx| run_comparison(args, ctx))
}

View File

@@ -0,0 +1,554 @@
//! Node management for starting, stopping, and controlling reth instances.
use crate::cli::Args;
use alloy_provider::{Provider, ProviderBuilder};
use alloy_rpc_types_eth::SyncStatus;
use eyre::{eyre, OptionExt, Result, WrapErr};
#[cfg(unix)]
use nix::sys::signal::{killpg, Signal};
#[cfg(unix)]
use nix::unistd::Pid;
use reth_chainspec::Chain;
use std::{fs, path::PathBuf, time::Duration};
use tokio::{
fs::File as AsyncFile,
io::{AsyncBufReadExt, AsyncWriteExt, BufReader as AsyncBufReader},
process::Command,
time::{sleep, timeout},
};
use tracing::{debug, info, warn};
/// Manages reth node lifecycle and operations
pub(crate) struct NodeManager {
datadir: Option<String>,
metrics_port: u16,
chain: Chain,
use_sudo: bool,
binary_path: Option<std::path::PathBuf>,
enable_profiling: bool,
output_dir: PathBuf,
additional_reth_args: Vec<String>,
comparison_dir: Option<PathBuf>,
tracing_endpoint: Option<String>,
otlp_max_queue_size: usize,
}
impl NodeManager {
/// Create a new `NodeManager` with configuration from CLI args
pub(crate) fn new(args: &Args) -> Self {
Self {
datadir: Some(args.datadir_path().to_string_lossy().to_string()),
metrics_port: args.metrics_port,
chain: args.chain,
use_sudo: args.sudo,
binary_path: None,
enable_profiling: args.profile,
output_dir: args.output_dir_path(),
// Filter out empty strings to prevent invalid arguments being passed to reth node
additional_reth_args: args
.reth_args
.iter()
.filter(|s| !s.is_empty())
.cloned()
.collect(),
comparison_dir: None,
tracing_endpoint: args.traces.otlp.as_ref().map(|u| u.to_string()),
otlp_max_queue_size: args.otlp_max_queue_size,
}
}
/// Set the comparison directory path for logging
pub(crate) fn set_comparison_dir(&mut self, dir: PathBuf) {
self.comparison_dir = Some(dir);
}
/// Get the log file path for a given reference type
fn get_log_file_path(&self, ref_type: &str) -> Result<PathBuf> {
let comparison_dir = self
.comparison_dir
.as_ref()
.ok_or_eyre("Comparison directory not set. Call set_comparison_dir first.")?;
// The comparison directory already contains the full path to results/<timestamp>
let log_dir = comparison_dir.join(ref_type);
// Create the directory if it doesn't exist
fs::create_dir_all(&log_dir)
.wrap_err(format!("Failed to create log directory: {:?}", log_dir))?;
let log_file = log_dir.join("reth_node.log");
Ok(log_file)
}
/// Get the perf event max sample rate from the system, capped at 10000
fn get_perf_sample_rate(&self) -> Option<String> {
let perf_rate_file = "/proc/sys/kernel/perf_event_max_sample_rate";
if let Ok(content) = fs::read_to_string(perf_rate_file) {
let rate_str = content.trim();
if !rate_str.is_empty() {
if let Ok(system_rate) = rate_str.parse::<u32>() {
let capped_rate = std::cmp::min(system_rate, 10000);
info!(
"Detected perf_event_max_sample_rate: {}, using: {}",
system_rate, capped_rate
);
return Some(capped_rate.to_string());
}
warn!("Failed to parse perf_event_max_sample_rate: {}", rate_str);
}
}
None
}
/// Get the absolute path to samply using 'which' command
async fn get_samply_path(&self) -> Result<String> {
let output = Command::new("which")
.arg("samply")
.output()
.await
.wrap_err("Failed to execute 'which samply' command")?;
if !output.status.success() {
return Err(eyre!("samply not found in PATH"));
}
let samply_path = String::from_utf8(output.stdout)
.wrap_err("samply path is not valid UTF-8")?
.trim()
.to_string();
if samply_path.is_empty() {
return Err(eyre!("which samply returned empty path"));
}
Ok(samply_path)
}
/// Build reth arguments as a vector of strings
fn build_reth_args(
&self,
binary_path_str: &str,
additional_args: &[String],
ref_type: &str,
) -> (Vec<String>, String) {
let mut reth_args = vec![binary_path_str.to_string(), "node".to_string()];
// Add chain argument (skip for mainnet as it's the default)
let chain_str = self.chain.to_string();
if chain_str != "mainnet" {
reth_args.extend_from_slice(&["--chain".to_string(), chain_str.clone()]);
}
// Add datadir if specified
if let Some(ref datadir) = self.datadir {
reth_args.extend_from_slice(&["--datadir".to_string(), datadir.clone()]);
}
// Add reth-specific arguments
let metrics_arg = format!("0.0.0.0:{}", self.metrics_port);
reth_args.extend_from_slice(&[
"--engine.accept-execution-requests-hash".to_string(),
"--metrics".to_string(),
metrics_arg,
"--http".to_string(),
"--http.api".to_string(),
"eth".to_string(),
"--disable-discovery".to_string(),
"--trusted-only".to_string(),
]);
// Add tracing arguments if OTLP endpoint is configured
if let Some(ref endpoint) = self.tracing_endpoint {
info!("Enabling OTLP tracing export to: {} (service: reth-{})", endpoint, ref_type);
// Endpoint requires equals per clap settings in reth
reth_args.push(format!("--tracing-otlp={}", endpoint));
}
// Add any additional arguments passed via command line (common to both baseline and
// feature)
reth_args.extend_from_slice(&self.additional_reth_args);
// Add reference-specific additional arguments
reth_args.extend_from_slice(additional_args);
(reth_args, chain_str)
}
/// Create a command for profiling mode
async fn create_profiling_command(
&self,
ref_type: &str,
reth_args: &[String],
) -> Result<Command> {
// Create profiles directory if it doesn't exist
let profile_dir = self.output_dir.join("profiles");
fs::create_dir_all(&profile_dir).wrap_err("Failed to create profiles directory")?;
let profile_path = profile_dir.join(format!("{}.json.gz", ref_type));
info!("Starting reth node with samply profiling...");
info!("Profile output: {:?}", profile_path);
// Get absolute path to samply
let samply_path = self.get_samply_path().await?;
let mut cmd = if self.use_sudo {
let mut sudo_cmd = Command::new("sudo");
sudo_cmd.arg(&samply_path);
sudo_cmd
} else {
Command::new(&samply_path)
};
// Add samply arguments
cmd.args(["record", "--save-only", "-o", &profile_path.to_string_lossy()]);
// Add rate argument if available
if let Some(rate) = self.get_perf_sample_rate() {
cmd.args(["--rate", &rate]);
}
// Add separator and complete reth command
cmd.arg("--");
cmd.args(reth_args);
// Set environment variable to disable log styling
cmd.env("RUST_LOG_STYLE", "never");
Ok(cmd)
}
/// Create a command for direct reth execution
fn create_direct_command(&self, reth_args: &[String]) -> Command {
let binary_path = &reth_args[0];
let mut cmd = if self.use_sudo {
info!("Starting reth node with sudo...");
let mut sudo_cmd = Command::new("sudo");
sudo_cmd.args(reth_args);
sudo_cmd
} else {
info!("Starting reth node...");
let mut reth_cmd = Command::new(binary_path);
reth_cmd.args(&reth_args[1..]); // Skip the binary path since it's the command
reth_cmd
};
// Set environment variable to disable log styling
cmd.env("RUST_LOG_STYLE", "never");
cmd
}
/// Start a reth node using the specified binary path and return the process handle
/// along with the formatted reth command string for reporting.
pub(crate) async fn start_node(
&mut self,
binary_path: &std::path::Path,
_git_ref: &str,
ref_type: &str,
additional_args: &[String],
) -> Result<(tokio::process::Child, String)> {
// Store the binary path for later use (e.g., in unwind_to_block)
self.binary_path = Some(binary_path.to_path_buf());
let binary_path_str = binary_path.to_string_lossy();
let (reth_args, _) = self.build_reth_args(&binary_path_str, additional_args, ref_type);
// Format the reth command string for reporting
let reth_command = shlex::try_join(reth_args.iter().map(|s| s.as_str()))
.wrap_err("Failed to format reth command string")?;
// Log additional arguments if any
if !self.additional_reth_args.is_empty() {
info!("Using common additional reth arguments: {:?}", self.additional_reth_args);
}
if !additional_args.is_empty() {
info!("Using reference-specific additional reth arguments: {:?}", additional_args);
}
let mut cmd = if self.enable_profiling {
self.create_profiling_command(ref_type, &reth_args).await?
} else {
self.create_direct_command(&reth_args)
};
// Set process group for better signal handling
#[cfg(unix)]
{
cmd.process_group(0);
}
// Set high queue size to prevent trace dropping during benchmarks
if self.tracing_endpoint.is_some() {
cmd.env("OTEL_BSP_MAX_QUEUE_SIZE", self.otlp_max_queue_size.to_string()); // Traces
cmd.env("OTEL_BLRP_MAX_QUEUE_SIZE", "10000"); // Logs
// Set service name to differentiate baseline vs feature runs in Jaeger
cmd.env("OTEL_SERVICE_NAME", format!("reth-{}", ref_type));
}
debug!("Executing reth command: {cmd:?}");
let mut child = cmd
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.kill_on_drop(true) // Kill on drop so that on Ctrl-C for parent process we stop all child processes
.spawn()
.wrap_err("Failed to start reth node")?;
info!(
"Reth node started with PID: {:?} (binary: {})",
child.id().ok_or_eyre("Reth node is not running")?,
binary_path_str
);
// Prepare log file path
let log_file_path = self.get_log_file_path(ref_type)?;
info!("Reth node logs will be saved to: {:?}", log_file_path);
// Stream stdout and stderr with prefixes at debug level and to log file
if let Some(stdout) = child.stdout.take() {
let log_file = AsyncFile::create(&log_file_path)
.await
.wrap_err(format!("Failed to create log file: {:?}", log_file_path))?;
tokio::spawn(async move {
let reader = AsyncBufReader::new(stdout);
let mut lines = reader.lines();
let mut log_file = log_file;
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH] {}", line);
// Write to log file (reth already includes timestamps)
let log_line = format!("{}\n", line);
if let Err(e) = log_file.write_all(log_line.as_bytes()).await {
debug!("Failed to write to log file: {}", e);
}
}
});
}
if let Some(stderr) = child.stderr.take() {
let log_file = AsyncFile::options()
.create(true)
.append(true)
.open(&log_file_path)
.await
.wrap_err(format!("Failed to open log file for stderr: {:?}", log_file_path))?;
tokio::spawn(async move {
let reader = AsyncBufReader::new(stderr);
let mut lines = reader.lines();
let mut log_file = log_file;
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH] {}", line);
// Write to log file (reth already includes timestamps)
let log_line = format!("{}\n", line);
if let Err(e) = log_file.write_all(log_line.as_bytes()).await {
debug!("Failed to write to log file: {}", e);
}
}
});
}
// Give the node a moment to start up
sleep(Duration::from_secs(5)).await;
Ok((child, reth_command))
}
/// Wait for the node to be ready and return its current tip
pub(crate) async fn wait_for_node_ready_and_get_tip(&self) -> Result<u64> {
info!("Waiting for node to be ready and synced...");
let max_wait = Duration::from_secs(120); // 2 minutes to allow for sync
let check_interval = Duration::from_secs(2);
let rpc_url = "http://localhost:8545";
// Create Alloy provider
let url = rpc_url.parse().map_err(|e| eyre!("Invalid RPC URL '{}': {}", rpc_url, e))?;
let provider = ProviderBuilder::new().connect_http(url);
timeout(max_wait, async {
loop {
// First check if RPC is up and node is not syncing
match provider.syncing().await {
Ok(sync_result) => {
match sync_result {
SyncStatus::Info(sync_info) => {
debug!("Node is still syncing {sync_info:?}, waiting...");
}
_ => {
// Node is not syncing, now get the tip
match provider.get_block_number().await {
Ok(tip) => {
info!("Node is ready and not syncing at block: {}", tip);
return Ok(tip);
}
Err(e) => {
debug!("Failed to get block number: {}", e);
}
}
}
}
}
Err(e) => {
debug!("Node RPC not ready yet or failed to check sync status: {}", e);
}
}
sleep(check_interval).await;
}
})
.await
.wrap_err("Timed out waiting for node to be ready and synced")?
}
/// Stop the reth node gracefully
pub(crate) async fn stop_node(&self, child: &mut tokio::process::Child) -> Result<()> {
let pid = child.id().expect("Child process ID should be available");
// Check if the process has already exited
match child.try_wait() {
Ok(Some(status)) => {
info!("Reth node (PID: {}) has already exited with status: {:?}", pid, status);
return Ok(());
}
Ok(None) => {
// Process is still running, proceed to stop it
info!("Stopping process gracefully with SIGINT (PID: {})...", pid);
}
Err(e) => {
return Err(eyre!("Failed to check process status: {}", e));
}
}
#[cfg(unix)]
{
// Send SIGINT to process group to mimic Ctrl-C behavior
let nix_pgid = Pid::from_raw(pid as i32);
match killpg(nix_pgid, Signal::SIGINT) {
Ok(()) => {}
Err(nix::errno::Errno::ESRCH) => {
info!("Process group {} has already exited", pid);
}
Err(e) => {
return Err(eyre!("Failed to send SIGINT to process group {}: {}", pid, e));
}
}
}
#[cfg(not(unix))]
{
// On non-Unix systems, fall back to using external kill command
let output = Command::new("taskkill")
.args(["/PID", &pid.to_string(), "/F"])
.output()
.await
.wrap_err("Failed to execute taskkill command")?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
// Check if the error is because the process doesn't exist
if stderr.contains("not found") || stderr.contains("not exist") {
info!("Process {} has already exited", pid);
} else {
return Err(eyre!("Failed to kill process {}: {}", pid, stderr));
}
}
}
// Wait for the process to exit
match child.wait().await {
Ok(status) => {
info!("Reth node (PID: {}) exited with status: {:?}", pid, status);
}
Err(e) => {
// If we get an error here, it might be because the process already exited
debug!("Error waiting for process exit (may have already exited): {}", e);
}
}
Ok(())
}
/// Unwind the node to a specific block
pub(crate) async fn unwind_to_block(&self, block_number: u64) -> Result<()> {
if self.use_sudo {
info!("Unwinding node to block: {} (with sudo)", block_number);
} else {
info!("Unwinding node to block: {}", block_number);
}
// Use the binary path from the last start_node call, or fallback to default
let binary_path = self
.binary_path
.as_ref()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_else(|| "./target/profiling/reth".to_string());
let mut cmd = if self.use_sudo {
let mut sudo_cmd = Command::new("sudo");
sudo_cmd.args([&binary_path, "stage", "unwind"]);
sudo_cmd
} else {
let mut reth_cmd = Command::new(&binary_path);
reth_cmd.args(["stage", "unwind"]);
reth_cmd
};
// Add chain argument (skip for mainnet as it's the default)
let chain_str = self.chain.to_string();
if chain_str != "mainnet" {
cmd.args(["--chain", &chain_str]);
}
// Add datadir if specified
if let Some(ref datadir) = self.datadir {
cmd.args(["--datadir", datadir]);
}
cmd.args(["to-block", &block_number.to_string()]);
// Set environment variable to disable log styling
cmd.env("RUST_LOG_STYLE", "never");
// Debug log the command
debug!("Executing reth unwind command: {:?}", cmd);
let mut child = cmd
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.spawn()
.wrap_err("Failed to start unwind command")?;
// Stream stdout and stderr with prefixes in real-time
if let Some(stdout) = child.stdout.take() {
tokio::spawn(async move {
let reader = AsyncBufReader::new(stdout);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH-UNWIND] {}", line);
}
});
}
if let Some(stderr) = child.stderr.take() {
tokio::spawn(async move {
let reader = AsyncBufReader::new(stderr);
let mut lines = reader.lines();
while let Ok(Some(line)) = lines.next_line().await {
debug!("[RETH-UNWIND] {}", line);
}
});
}
// Wait for the command to complete
let status = child.wait().await.wrap_err("Failed to wait for unwind command")?;
if !status.success() {
return Err(eyre!("Unwind command failed with exit code: {:?}", status.code()));
}
info!("Unwound to block: {}", block_number);
Ok(())
}
}

View File

@@ -35,6 +35,7 @@ alloy-transport-ipc.workspace = true
alloy-transport-ws.workspace = true
alloy-transport.workspace = true
op-alloy-consensus = { workspace = true, features = ["alloy-compat"] }
op-alloy-rpc-types-engine = { workspace = true, features = ["serde"] }
# reqwest
reqwest = { workspace = true, default-features = false, features = ["rustls-tls-native-roots"] }
@@ -64,7 +65,6 @@ humantime.workspace = true
csv.workspace = true
[dev-dependencies]
reth-tracing.workspace = true
[features]
default = ["jemalloc"]
@@ -81,11 +81,26 @@ jemalloc = [
jemalloc-prof = ["reth-cli-util/jemalloc-prof"]
tracy-allocator = ["reth-cli-util/tracy-allocator"]
min-error-logs = ["tracing/release_max_level_error"]
min-warn-logs = ["tracing/release_max_level_warn"]
min-info-logs = ["tracing/release_max_level_info"]
min-debug-logs = ["tracing/release_max_level_debug"]
min-trace-logs = ["tracing/release_max_level_trace"]
min-error-logs = [
"tracing/release_max_level_error",
"reth-node-core/min-error-logs",
]
min-warn-logs = [
"tracing/release_max_level_warn",
"reth-node-core/min-warn-logs",
]
min-info-logs = [
"tracing/release_max_level_info",
"reth-node-core/min-info-logs",
]
min-debug-logs = [
"tracing/release_max_level_debug",
"reth-node-core/min-debug-logs",
]
min-trace-logs = [
"tracing/release_max_level_trace",
"reth-node-core/min-trace-logs",
]
# no-op feature flag for switching between the `optimism` and default functionality in CI matrices
ethereum = []

View File

@@ -49,7 +49,7 @@ reth stage unwind to-block 21000000
The following `reth-bench` command would then start the benchmark at block 21,000,000:
```bash
reth-bench new-payload-fcu --rpc-url <rpc-url> --from 21000000 --to <end_block> --jwtsecret <jwt_file_path>
reth-bench new-payload-fcu --rpc-url <rpc-url> --from 21000000 --to <end_block> --jwt-secret <jwt_file_path>
```
Finally, make sure that reth is built using a build profile suitable for what you are trying to measure.
@@ -84,7 +84,7 @@ samply record -p 3001 target/profiling/reth node --metrics localhost:9001 --auth
```
```bash
reth-bench new-payload-fcu --rpc-url <rpc-url> --from <start_block> --to <end_block> --jwtsecret <jwt_file_path>
reth-bench new-payload-fcu --rpc-url <rpc-url> --from <start_block> --to <end_block> --jwt-secret <jwt_file_path>
```
Replace `<start_block>`, `<end_block>`, and `<jwt_file_path>` with the appropriate values for your testing environment. `<rpc-url>` should be the URL of an RPC endpoint that can provide the blocks that will be used during the execution.
@@ -92,6 +92,18 @@ This should NOT be the node that is being used for the benchmark. The node behin
the benchmark. The node being benchmarked will not have these blocks.
Note that this assumes that the benchmark node's engine API is running on `http://127.0.0.1:8551`, which is set as a default value in `reth-bench`. To configure this value, use the `--engine-rpc-url` flag.
#### Using the `--advance` argument
The `--advance` argument allows you to benchmark a relative number of blocks from the current head, without manually specifying `--from` and `--to`.
```bash
# Benchmark the next 10 blocks from the current head
reth-bench new-payload-fcu --advance 10 --jwt-secret <jwt_file_path> --rpc-url <rpc-url>
# Benchmark the next 50 blocks with a different subcommand
reth-bench new-payload-only --advance 50 --jwt-secret <jwt_file_path> --rpc-url <rpc-url>
```
### Observe Outputs
After running the command, `reth-bench` will output benchmark results, showing processing speeds and gas usage, which are useful metrics for analyzing the node's performance.
@@ -131,5 +143,5 @@ To reproduce the benchmark, first re-set the node to the block that the benchmar
- **RPC Configuration**: The RPC endpoints should be accessible and configured correctly, specifically the RPC endpoint must support `eth_getBlockByNumber` and support fetching full transactions. The benchmark will make one RPC query per block as fast as possible, so ensure the RPC endpoint does not rate limit or block requests after a certain volume.
- **Reproducibility**: Ensure that the node is at the same state before attempting to retry a benchmark. The `new-payload-fcu` command specifically will commit to the database, so the node must be rolled back using `reth stage unwind` to reproducibly retry benchmarks.
- **Profiling tools**: If you are collecting CPU profiles, tools like [`samply`](https://github.com/mstange/samply) and [`perf`](https://perf.wiki.kernel.org/index.php/Main_Page) can be useful for analyzing node performance.
- **Benchmark Data**: `reth-bench` additionally contains a `--benchmark.output` flag, which will output gas used benchmarks across the benchmark range in CSV format. This may be useful for further data analysis.
- **Benchmark Data**: `reth-bench` additionally contains a `--output` flag, which will output gas used benchmarks across the benchmark range in CSV format. This may be useful for further data analysis.
- **Platform Information**: To ensure accurate and reproducible benchmarking, document the platform details, including hardware specifications, OS version, and any other relevant information before publishing any benchmarks.

View File

@@ -0,0 +1,384 @@
#!/usr/bin/env -S uv run
# /// script
# requires-python = ">=3.8"
# dependencies = [
# "pandas",
# "matplotlib",
# "numpy",
# ]
# ///
# A simple script which plots graphs comparing two combined_latency.csv files
# output by reth-bench. The graphs which are plotted are:
#
# - A histogram of the percent change between latencies, bucketed by 1%
# increments.
#
# - A simple line graph plotting the latencies of the two files against each
# other.
#
# - A gas per second (gas/s) chart showing throughput over time.
import argparse
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import sys
import os
from matplotlib.ticker import FuncFormatter
def get_output_filename(base_path, suffix=None):
"""Generate output filename with optional suffix."""
if suffix is None:
return base_path
# Split the base path into directory, name, and extension
dir_name = os.path.dirname(base_path)
base_name = os.path.basename(base_path)
name, ext = os.path.splitext(base_name)
# Create new filename with suffix
new_name = f"{name}_{suffix}{ext}"
return os.path.join(dir_name, new_name) if dir_name else new_name
def format_gas_units(value, pos):
"""Format gas values with appropriate units (gas, Kgas, Mgas, Ggas, Tgas)."""
if value == 0:
return '0'
# Define unit thresholds and labels
units = [
(1e12, 'Tgas'), # Teragas
(1e9, 'Ggas'), # Gigagas
(1e6, 'Mgas'), # Megagas
(1e3, 'Kgas'), # Kilogas
(1, 'gas') # gas
]
abs_value = abs(value)
for threshold, unit in units:
if abs_value >= threshold:
scaled_value = value / threshold
# Format with appropriate precision
if scaled_value >= 100:
return f'{scaled_value:.0f}{unit}/s'
elif scaled_value >= 10:
return f'{scaled_value:.1f}{unit}/s'
else:
return f'{scaled_value:.2f}{unit}/s'
return f'{value:.0f}gas/s'
def moving_average(data, window_size):
"""Calculate moving average with given window size."""
if window_size <= 1:
return data
# Use pandas for efficient rolling mean calculation
series = pd.Series(data)
return series.rolling(window=window_size, center=True, min_periods=1).mean().values
def main():
parser = argparse.ArgumentParser(description='Generate histogram of total_latency percent differences between two CSV files')
parser.add_argument('baseline_csv', help='First CSV file, used as the baseline/control')
parser.add_argument('comparison_csv', help='Second CSV file, which is being compared to the baseline')
parser.add_argument('-o', '--output', default='latency.png', help='Output image file (default: latency.png)')
parser.add_argument('--graphs', default='all', help='Comma-separated list of graphs to plot: histogram, line, gas, all (default: all)')
parser.add_argument('--average', type=int, metavar='N', help='Apply moving average over N blocks to smooth line and gas charts')
parser.add_argument('--separate', action='store_true', help='Output each chart as a separate file')
args = parser.parse_args()
# Parse graph selection
if args.graphs.lower() == 'all':
selected_graphs = {'histogram', 'line', 'gas'}
else:
selected_graphs = set(graph.strip().lower() for graph in args.graphs.split(','))
valid_graphs = {'histogram', 'line', 'gas'}
invalid_graphs = selected_graphs - valid_graphs
if invalid_graphs:
print(f"Error: Invalid graph types: {', '.join(invalid_graphs)}. Valid options are: histogram, line, gas, all", file=sys.stderr)
sys.exit(1)
try:
df1 = pd.read_csv(args.baseline_csv)
df2 = pd.read_csv(args.comparison_csv)
except FileNotFoundError as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"Error reading CSV files: {e}", file=sys.stderr)
sys.exit(1)
if 'total_latency' not in df1.columns:
print(f"Error: 'total_latency' column not found in {args.baseline_csv}", file=sys.stderr)
sys.exit(1)
if 'total_latency' not in df2.columns:
print(f"Error: 'total_latency' column not found in {args.comparison_csv}", file=sys.stderr)
sys.exit(1)
# Check for gas_used column if gas graph is selected
if 'gas' in selected_graphs:
if 'gas_used' not in df1.columns:
print(f"Error: 'gas_used' column not found in {args.baseline_csv} (required for gas graph)", file=sys.stderr)
sys.exit(1)
if 'gas_used' not in df2.columns:
print(f"Error: 'gas_used' column not found in {args.comparison_csv} (required for gas graph)", file=sys.stderr)
sys.exit(1)
if len(df1) != len(df2):
print("Warning: CSV files have different number of rows. Using minimum length.", file=sys.stderr)
min_len = min(len(df1), len(df2))
df1 = df1.head(min_len)
df2 = df2.head(min_len)
# Convert from microseconds to milliseconds for better readability
latency1 = df1['total_latency'].values / 1000.0
latency2 = df2['total_latency'].values / 1000.0
# Handle division by zero
with np.errstate(divide='ignore', invalid='ignore'):
percent_diff = ((latency2 - latency1) / latency1) * 100
# Remove infinite and NaN values
percent_diff = percent_diff[np.isfinite(percent_diff)]
if len(percent_diff) == 0:
print("Error: No valid percent differences could be calculated", file=sys.stderr)
sys.exit(1)
# Calculate statistics once for use in graphs and output
mean_diff = np.mean(percent_diff)
median_diff = np.median(percent_diff)
# Determine number of subplots and create figure
num_plots = len(selected_graphs)
if num_plots == 0:
print("Error: No valid graphs selected", file=sys.stderr)
sys.exit(1)
# Store output filenames
output_files = []
if args.separate:
# We'll create individual figures for each graph
pass
else:
# Create combined figure
if num_plots == 1:
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
axes = [ax]
else:
fig, axes = plt.subplots(num_plots, 1, figsize=(12, 6 * num_plots))
plot_idx = 0
# Plot histogram if selected
if 'histogram' in selected_graphs:
if args.separate:
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
else:
ax = axes[plot_idx]
min_diff = np.floor(percent_diff.min())
max_diff = np.ceil(percent_diff.max())
# Create histogram with 1% buckets
bins = np.arange(min_diff, max_diff + 1, 1)
ax.hist(percent_diff, bins=bins, edgecolor='black', alpha=0.7)
ax.set_xlabel('Percent Difference (%)')
ax.set_ylabel('Number of Blocks')
ax.set_title(f'Total Latency Percent Difference Histogram\n({args.baseline_csv} vs {args.comparison_csv})')
ax.grid(True, alpha=0.3)
# Add statistics to the histogram
ax.axvline(mean_diff, color='red', linestyle='--', label=f'Mean: {mean_diff:.2f}%')
ax.axvline(median_diff, color='orange', linestyle='--', label=f'Median: {median_diff:.2f}%')
ax.legend()
if args.separate:
plt.tight_layout()
output_file = get_output_filename(args.output, 'histogram')
plt.savefig(output_file, dpi=300, bbox_inches='tight')
output_files.append(output_file)
plt.close(fig)
else:
plot_idx += 1
# Plot line graph if selected
if 'line' in selected_graphs:
if args.separate:
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
else:
ax = axes[plot_idx]
# Determine comparison color based on median change. The median being
# negative means processing time got faster, so that becomes green.
comparison_color = 'green' if median_diff < 0 else 'red'
# Apply moving average if requested
plot_latency1 = latency1[:len(percent_diff)]
plot_latency2 = latency2[:len(percent_diff)]
if args.average:
plot_latency1 = moving_average(plot_latency1, args.average)
plot_latency2 = moving_average(plot_latency2, args.average)
if 'block_number' in df1.columns and 'block_number' in df2.columns:
block_numbers = df1['block_number'].values[:len(percent_diff)]
ax.plot(block_numbers, plot_latency1, 'orange', alpha=0.7, label=f'Baseline ({args.baseline_csv})')
ax.plot(block_numbers, plot_latency2, comparison_color, alpha=0.7, label=f'Comparison ({args.comparison_csv})')
ax.set_xlabel('Block Number')
ax.set_ylabel('Total Latency (ms)')
title = 'Total Latency vs Block Number'
if args.average:
title += f' ({args.average}-block moving average)'
ax.set_title(title)
ax.grid(True, alpha=0.3)
ax.legend()
else:
# If no block_number column, use index
indices = np.arange(len(percent_diff))
ax.plot(indices, plot_latency1, 'orange', alpha=0.7, label=f'Baseline ({args.baseline_csv})')
ax.plot(indices, plot_latency2, comparison_color, alpha=0.7, label=f'Comparison ({args.comparison_csv})')
ax.set_xlabel('Block Index')
ax.set_ylabel('Total Latency (ms)')
title = 'Total Latency vs Block Index'
if args.average:
title += f' ({args.average}-block moving average)'
ax.set_title(title)
ax.grid(True, alpha=0.3)
ax.legend()
if args.separate:
plt.tight_layout()
output_file = get_output_filename(args.output, 'line')
plt.savefig(output_file, dpi=300, bbox_inches='tight')
output_files.append(output_file)
plt.close(fig)
else:
plot_idx += 1
# Plot gas/s graph if selected
if 'gas' in selected_graphs:
if args.separate:
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
else:
ax = axes[plot_idx]
# Calculate gas per second (gas/s)
# latency is in microseconds, so convert to seconds for gas/s calculation
gas1 = df1['gas_used'].values[:len(percent_diff)]
gas2 = df2['gas_used'].values[:len(percent_diff)]
# Convert latency from microseconds to seconds
latency1_sec = df1['total_latency'].values[:len(percent_diff)] / 1_000_000.0
latency2_sec = df2['total_latency'].values[:len(percent_diff)] / 1_000_000.0
# Calculate gas per second
gas_per_sec1 = gas1 / latency1_sec
gas_per_sec2 = gas2 / latency2_sec
# Store original values for statistics before averaging
original_gas_per_sec1 = gas_per_sec1.copy()
original_gas_per_sec2 = gas_per_sec2.copy()
# Apply moving average if requested
if args.average:
gas_per_sec1 = moving_average(gas_per_sec1, args.average)
gas_per_sec2 = moving_average(gas_per_sec2, args.average)
# Calculate median gas/s for color determination (use original values)
median_gas_per_sec1 = np.median(original_gas_per_sec1)
median_gas_per_sec2 = np.median(original_gas_per_sec2)
comparison_color = 'green' if median_gas_per_sec2 > median_gas_per_sec1 else 'red'
if 'block_number' in df1.columns and 'block_number' in df2.columns:
block_numbers = df1['block_number'].values[:len(percent_diff)]
ax.plot(block_numbers, gas_per_sec1, 'orange', alpha=0.7, label=f'Baseline ({args.baseline_csv})')
ax.plot(block_numbers, gas_per_sec2, comparison_color, alpha=0.7, label=f'Comparison ({args.comparison_csv})')
ax.set_xlabel('Block Number')
ax.set_ylabel('Gas Throughput')
title = 'Gas Throughput vs Block Number'
if args.average:
title += f' ({args.average}-block moving average)'
ax.set_title(title)
ax.grid(True, alpha=0.3)
ax.legend()
# Format Y-axis with gas units
formatter = FuncFormatter(format_gas_units)
ax.yaxis.set_major_formatter(formatter)
else:
# If no block_number column, use index
indices = np.arange(len(percent_diff))
ax.plot(indices, gas_per_sec1, 'orange', alpha=0.7, label=f'Baseline ({args.baseline_csv})')
ax.plot(indices, gas_per_sec2, comparison_color, alpha=0.7, label=f'Comparison ({args.comparison_csv})')
ax.set_xlabel('Block Index')
ax.set_ylabel('Gas Throughput')
title = 'Gas Throughput vs Block Index'
if args.average:
title += f' ({args.average}-block moving average)'
ax.set_title(title)
ax.grid(True, alpha=0.3)
ax.legend()
# Format Y-axis with gas units
formatter = FuncFormatter(format_gas_units)
ax.yaxis.set_major_formatter(formatter)
if args.separate:
plt.tight_layout()
output_file = get_output_filename(args.output, 'gas')
plt.savefig(output_file, dpi=300, bbox_inches='tight')
output_files.append(output_file)
plt.close(fig)
else:
plot_idx += 1
# Save combined figure if not using separate files
if not args.separate:
plt.tight_layout()
plt.savefig(args.output, dpi=300, bbox_inches='tight')
output_files.append(args.output)
# Create graph type description for output message
graph_types = []
if 'histogram' in selected_graphs:
graph_types.append('histogram')
if 'line' in selected_graphs:
graph_types.append('latency graph')
if 'gas' in selected_graphs:
graph_types.append('gas/s graph')
graph_desc = ' and '.join(graph_types)
# Print output file(s) information
if args.separate:
print(f"Saved {len(output_files)} separate files:")
for output_file in output_files:
print(f" - {output_file}")
else:
print(f"{graph_desc.capitalize()} saved to {args.output}")
# Always print statistics
print(f"\nStatistics:")
print(f"Mean percent difference: {mean_diff:.2f}%")
print(f"Median percent difference: {median_diff:.2f}%")
print(f"Standard deviation: {np.std(percent_diff):.2f}%")
print(f"Min: {percent_diff.min():.2f}%")
print(f"Max: {percent_diff.max():.2f}%")
print(f"Total blocks analyzed: {len(percent_diff)}")
# Print gas/s statistics if gas data is available
if 'gas' in selected_graphs:
# Use original values for statistics (not averaged)
print(f"\nGas/s Statistics:")
print(f"Baseline median gas/s: {median_gas_per_sec1:,.0f}")
print(f"Comparison median gas/s: {median_gas_per_sec2:,.0f}")
gas_diff_percent = ((median_gas_per_sec2 - median_gas_per_sec1) / median_gas_per_sec1) * 100
print(f"Gas/s percent change: {gas_diff_percent:+.2f}%")
if __name__ == '__main__':
main()

View File

@@ -3,9 +3,11 @@
use crate::{authenticated_transport::AuthenticatedTransportConnect, bench_mode::BenchMode};
use alloy_eips::BlockNumberOrTag;
use alloy_primitives::address;
use alloy_provider::{network::AnyNetwork, Provider, RootProvider};
use alloy_rpc_client::ClientBuilder;
use alloy_rpc_types_engine::JwtSecret;
use alloy_transport::layers::RetryBackoffLayer;
use reqwest::Url;
use reth_node_core::args::BenchmarkArgs;
use tracing::info;
@@ -25,6 +27,8 @@ pub(crate) struct BenchContext {
pub(crate) benchmark_mode: BenchMode,
/// The next block to fetch.
pub(crate) next_block: u64,
/// Whether the chain is an OP rollup.
pub(crate) is_optimism: bool,
}
impl BenchContext {
@@ -33,26 +37,35 @@ impl BenchContext {
pub(crate) async fn new(bench_args: &BenchmarkArgs, rpc_url: String) -> eyre::Result<Self> {
info!("Running benchmark using data from RPC URL: {}", rpc_url);
// Ensure that output directory is a directory
// Ensure that output directory exists and is a directory
if let Some(output) = &bench_args.output {
if output.is_file() {
return Err(eyre::eyre!("Output path must be a directory"));
}
// Create the directory if it doesn't exist
if !output.exists() {
std::fs::create_dir_all(output)?;
info!("Created output directory: {:?}", output);
}
}
// set up alloy client for blocks
let client = ClientBuilder::default().http(rpc_url.parse()?);
let client = ClientBuilder::default()
.layer(RetryBackoffLayer::new(10, 800, u64::MAX))
.http(rpc_url.parse()?);
let block_provider = RootProvider::<AnyNetwork>::new(client);
// If neither `--from` nor `--to` are provided, we will run the benchmark continuously,
// starting at the latest block.
let mut benchmark_mode = BenchMode::new(bench_args.from, bench_args.to)?;
// Check if this is an OP chain by checking code at a predeploy address.
let is_optimism = !block_provider
.get_code_at(address!("0x420000000000000000000000000000000000000F"))
.await?
.is_empty();
// construct the authenticated provider
let auth_jwt = bench_args
.auth_jwtsecret
.clone()
.ok_or_else(|| eyre::eyre!("--jwtsecret must be provided for authenticated RPC"))?;
.ok_or_else(|| eyre::eyre!("--jwt-secret must be provided for authenticated RPC"))?;
// fetch jwt from file
//
@@ -69,6 +82,31 @@ impl BenchContext {
let client = ClientBuilder::default().connect_with(auth_transport).await?;
let auth_provider = RootProvider::<AnyNetwork>::new(client);
// Computes the block range for the benchmark.
//
// - If `--advance` is provided, fetches the latest block and sets:
// - `from = head + 1`
// - `to = head + advance`
// - Otherwise, uses the values from `--from` and `--to`.
let (from, to) = if let Some(advance) = bench_args.advance {
if advance == 0 {
return Err(eyre::eyre!("--advance must be greater than 0"));
}
let head_block = auth_provider
.get_block_by_number(BlockNumberOrTag::Latest)
.await?
.ok_or_else(|| eyre::eyre!("Failed to fetch latest block for --advance"))?;
let head_number = head_block.header.number;
(Some(head_number), Some(head_number + advance))
} else {
(bench_args.from, bench_args.to)
};
// If neither `--from` nor `--to` are provided, we will run the benchmark continuously,
// starting at the latest block.
let mut benchmark_mode = BenchMode::new(from, to)?;
let first_block = match benchmark_mode {
BenchMode::Continuous => {
// fetch Latest block
@@ -94,6 +132,6 @@ impl BenchContext {
};
let next_block = first_block.header.number + 1;
Ok(Self { auth_provider, block_provider, benchmark_mode, next_block })
Ok(Self { auth_provider, block_provider, benchmark_mode, next_block, is_optimism })
}
}

View File

@@ -38,7 +38,7 @@ pub enum Subcommands {
///
/// One powerful use case is pairing this command with the `cast block` command, for example:
///
/// `cast block latest--full --json | reth-bench send-payload --rpc-url localhost:5000
/// `cast block latest --full --json | reth-bench send-payload --rpc-url localhost:5000
/// --jwt-secret $(cat ~/.local/share/reth/mainnet/jwt.hex)`
SendPayload(send_payload::Command),
}

View File

@@ -9,12 +9,13 @@ use crate::{
GAS_OUTPUT_SUFFIX,
},
},
valid_payload::{call_forkchoice_updated, call_new_payload},
valid_payload::{block_to_new_payload, call_forkchoice_updated, call_new_payload},
};
use alloy_provider::Provider;
use alloy_rpc_types_engine::{ExecutionPayload, ForkchoiceState};
use alloy_rpc_types_engine::ForkchoiceState;
use clap::Parser;
use csv::Writer;
use eyre::{Context, OptionExt};
use humantime::parse_duration;
use reth_cli_runner::CliContext;
use reth_node_core::args::BenchmarkArgs;
@@ -29,8 +30,18 @@ pub struct Command {
rpc_url: String,
/// How long to wait after a forkchoice update before sending the next payload.
#[arg(long, value_name = "WAIT_TIME", value_parser = parse_duration, verbatim_doc_comment)]
wait_time: Option<Duration>,
#[arg(long, value_name = "WAIT_TIME", value_parser = parse_duration, default_value = "250ms", verbatim_doc_comment)]
wait_time: Duration,
/// The size of the block buffer (channel capacity) for prefetching blocks from the RPC
/// endpoint.
#[arg(
long = "rpc-block-buffer-size",
value_name = "RPC_BLOCK_BUFFER_SIZE",
default_value = "20",
verbatim_doc_comment
)]
rpc_block_buffer_size: usize,
#[command(flatten)]
benchmark: BenchmarkArgs,
@@ -39,57 +50,63 @@ pub struct Command {
impl Command {
/// Execute `benchmark new-payload-fcu` command
pub async fn execute(self, _ctx: CliContext) -> eyre::Result<()> {
let BenchContext { benchmark_mode, block_provider, auth_provider, mut next_block } =
BenchContext::new(&self.benchmark, self.rpc_url).await?;
let BenchContext {
benchmark_mode,
block_provider,
auth_provider,
mut next_block,
is_optimism,
} = BenchContext::new(&self.benchmark, self.rpc_url).await?;
let buffer_size = self.rpc_block_buffer_size;
// Use a oneshot channel to propagate errors from the spawned task
let (error_sender, mut error_receiver) = tokio::sync::oneshot::channel();
let (sender, mut receiver) = tokio::sync::mpsc::channel(buffer_size);
let (sender, mut receiver) = tokio::sync::mpsc::channel(1000);
tokio::task::spawn(async move {
while benchmark_mode.contains(next_block) {
let block_res = block_provider.get_block_by_number(next_block.into()).full().await;
let block = block_res.unwrap().unwrap();
let block_res = block_provider
.get_block_by_number(next_block.into())
.full()
.await
.wrap_err_with(|| format!("Failed to fetch block by number {next_block}"));
let block = match block_res.and_then(|opt| opt.ok_or_eyre("Block not found")) {
Ok(block) => block,
Err(e) => {
tracing::error!("Failed to fetch block {next_block}: {e}");
let _ = error_sender.send(e);
break;
}
};
let block = block
.into_inner()
.map_header(|header| header.map(|h| h.into_header_with_defaults()))
.try_map_transactions(|tx| {
// try to convert unknowns into op type so that we can also support optimism
tx.try_into_either::<op_alloy_consensus::OpTxEnvelope>()
})
.unwrap()
.into_consensus();
let head_block_hash = block.header.hash;
let safe_block_hash = block_provider
.get_block_by_number(block.header.number.saturating_sub(32).into());
let blob_versioned_hashes =
block.body.blob_versioned_hashes_iter().copied().collect::<Vec<_>>();
// Convert to execution payload
let (payload, sidecar) = ExecutionPayload::from_block_slow(&block);
let header = block.header;
let head_block_hash = payload.block_hash();
let safe_block_hash =
block_provider.get_block_by_number(header.number.saturating_sub(32).into());
let finalized_block_hash =
block_provider.get_block_by_number(header.number.saturating_sub(64).into());
let finalized_block_hash = block_provider
.get_block_by_number(block.header.number.saturating_sub(64).into());
let (safe, finalized) = tokio::join!(safe_block_hash, finalized_block_hash,);
let safe_block_hash = safe.unwrap().expect("finalized block exists").header.hash;
let finalized_block_hash =
finalized.unwrap().expect("finalized block exists").header.hash;
let safe_block_hash = match safe {
Ok(Some(block)) => block.header.hash,
Ok(None) | Err(_) => head_block_hash,
};
let finalized_block_hash = match finalized {
Ok(Some(block)) => block.header.hash,
Ok(None) | Err(_) => head_block_hash,
};
next_block += 1;
sender
.send((
header,
blob_versioned_hashes,
payload,
sidecar,
head_block_hash,
safe_block_hash,
finalized_block_hash,
))
if let Err(e) = sender
.send((block, head_block_hash, safe_block_hash, finalized_block_hash))
.await
.unwrap();
{
tracing::error!("Failed to send block data: {e}");
break;
}
}
});
@@ -98,15 +115,16 @@ impl Command {
let total_benchmark_duration = Instant::now();
let mut total_wait_time = Duration::ZERO;
while let Some((header, versioned_hashes, payload, sidecar, head, safe, finalized)) = {
while let Some((block, head, safe, finalized)) = {
let wait_start = Instant::now();
let result = receiver.recv().await;
total_wait_time += wait_start.elapsed();
result
} {
// just put gas used here
let gas_used = header.gas_used;
let block_number = header.number;
let gas_used = block.header.gas_used;
let block_number = block.header.number;
let transaction_count = block.transactions.len() as u64;
debug!(target: "reth-bench", ?block_number, "Sending payload",);
@@ -117,26 +135,24 @@ impl Command {
finalized_block_hash: finalized,
};
let (version, params) = block_to_new_payload(block, is_optimism)?;
let start = Instant::now();
let message_version = call_new_payload(
&auth_provider,
payload,
sidecar,
header.parent_beacon_block_root,
versioned_hashes,
)
.await?;
call_new_payload(&auth_provider, version, params).await?;
let new_payload_result = NewPayloadResult { gas_used, latency: start.elapsed() };
call_forkchoice_updated(&auth_provider, message_version, forkchoice_state, None)
.await?;
call_forkchoice_updated(&auth_provider, version, forkchoice_state, None).await?;
// calculate the total duration and the fcu latency, record
let total_latency = start.elapsed();
let fcu_latency = total_latency - new_payload_result.latency;
let combined_result =
CombinedResult { block_number, new_payload_result, fcu_latency, total_latency };
let combined_result = CombinedResult {
block_number,
transaction_count,
new_payload_result,
fcu_latency,
total_latency,
};
// current duration since the start of the benchmark minus the time
// waiting for blocks
@@ -145,16 +161,20 @@ impl Command {
// convert gas used to gigagas, then compute gigagas per second
info!(%combined_result);
// wait if we need to
if let Some(wait_time) = self.wait_time {
tokio::time::sleep(wait_time).await;
}
// wait before sending the next payload
tokio::time::sleep(self.wait_time).await;
// record the current result
let gas_row = TotalGasRow { block_number, gas_used, time: current_duration };
let gas_row =
TotalGasRow { block_number, transaction_count, gas_used, time: current_duration };
results.push((gas_row, combined_result));
}
// Check if the spawned task encountered an error
if let Ok(error) = error_receiver.try_recv() {
return Err(error);
}
let (gas_output_results, combined_results): (_, Vec<CombinedResult>) =
results.into_iter().unzip();
@@ -182,7 +202,7 @@ impl Command {
}
// accumulate the results and calculate the overall Ggas/s
let gas_output = TotalGasOutput::new(gas_output_results);
let gas_output = TotalGasOutput::new(gas_output_results)?;
info!(
total_duration=?gas_output.total_duration,
total_gas_used=?gas_output.total_gas_used,

View File

@@ -8,12 +8,12 @@ use crate::{
NEW_PAYLOAD_OUTPUT_SUFFIX,
},
},
valid_payload::call_new_payload,
valid_payload::{block_to_new_payload, call_new_payload},
};
use alloy_provider::Provider;
use alloy_rpc_types_engine::ExecutionPayload;
use clap::Parser;
use csv::Writer;
use eyre::{Context, OptionExt};
use reth_cli_runner::CliContext;
use reth_node_core::args::BenchmarkArgs;
use std::time::{Duration, Instant};
@@ -26,6 +26,16 @@ pub struct Command {
#[arg(long, value_name = "RPC_URL", verbatim_doc_comment)]
rpc_url: String,
/// The size of the block buffer (channel capacity) for prefetching blocks from the RPC
/// endpoint.
#[arg(
long = "rpc-block-buffer-size",
value_name = "RPC_BLOCK_BUFFER_SIZE",
default_value = "20",
verbatim_doc_comment
)]
rpc_block_buffer_size: usize,
#[command(flatten)]
benchmark: BenchmarkArgs,
}
@@ -33,29 +43,41 @@ pub struct Command {
impl Command {
/// Execute `benchmark new-payload-only` command
pub async fn execute(self, _ctx: CliContext) -> eyre::Result<()> {
let BenchContext { benchmark_mode, block_provider, auth_provider, mut next_block } =
BenchContext::new(&self.benchmark, self.rpc_url).await?;
let BenchContext {
benchmark_mode,
block_provider,
auth_provider,
mut next_block,
is_optimism,
} = BenchContext::new(&self.benchmark, self.rpc_url).await?;
let buffer_size = self.rpc_block_buffer_size;
// Use a oneshot channel to propagate errors from the spawned task
let (error_sender, mut error_receiver) = tokio::sync::oneshot::channel();
let (sender, mut receiver) = tokio::sync::mpsc::channel(buffer_size);
let (sender, mut receiver) = tokio::sync::mpsc::channel(1000);
tokio::task::spawn(async move {
while benchmark_mode.contains(next_block) {
let block_res = block_provider.get_block_by_number(next_block.into()).full().await;
let block = block_res.unwrap().unwrap();
let block = block
.into_inner()
.map_header(|header| header.map(|h| h.into_header_with_defaults()))
.try_map_transactions(|tx| {
tx.try_into_either::<op_alloy_consensus::OpTxEnvelope>()
})
.unwrap()
.into_consensus();
let blob_versioned_hashes =
block.body.blob_versioned_hashes_iter().copied().collect::<Vec<_>>();
let (payload, sidecar) = ExecutionPayload::from_block_slow(&block);
let block_res = block_provider
.get_block_by_number(next_block.into())
.full()
.await
.wrap_err_with(|| format!("Failed to fetch block by number {next_block}"));
let block = match block_res.and_then(|opt| opt.ok_or_eyre("Block not found")) {
Ok(block) => block,
Err(e) => {
tracing::error!("Failed to fetch block {next_block}: {e}");
let _ = error_sender.send(e);
break;
}
};
next_block += 1;
sender.send((block.header, blob_versioned_hashes, payload, sidecar)).await.unwrap();
if let Err(e) = sender.send(block).await {
tracing::error!("Failed to send block data: {e}");
break;
}
}
});
@@ -64,32 +86,26 @@ impl Command {
let total_benchmark_duration = Instant::now();
let mut total_wait_time = Duration::ZERO;
while let Some((header, versioned_hashes, payload, sidecar)) = {
while let Some(block) = {
let wait_start = Instant::now();
let result = receiver.recv().await;
total_wait_time += wait_start.elapsed();
result
} {
// just put gas used here
let gas_used = header.gas_used;
let block_number = payload.block_number();
let block_number = block.header.number;
let transaction_count = block.transactions.len() as u64;
let gas_used = block.header.gas_used;
debug!(
target: "reth-bench",
number=?header.number,
number=?block.header.number,
"Sending payload to engine",
);
let (version, params) = block_to_new_payload(block, is_optimism)?;
let start = Instant::now();
call_new_payload(
&auth_provider,
payload,
sidecar,
header.parent_beacon_block_root,
versioned_hashes,
)
.await?;
call_new_payload(&auth_provider, version, params).await?;
let new_payload_result = NewPayloadResult { gas_used, latency: start.elapsed() };
info!(%new_payload_result);
@@ -99,10 +115,16 @@ impl Command {
let current_duration = total_benchmark_duration.elapsed() - total_wait_time;
// record the current result
let row = TotalGasRow { block_number, gas_used, time: current_duration };
let row =
TotalGasRow { block_number, transaction_count, gas_used, time: current_duration };
results.push((row, new_payload_result));
}
// Check if the spawned task encountered an error
if let Ok(error) = error_receiver.try_recv() {
return Err(error);
}
let (gas_output_results, new_payload_results): (_, Vec<NewPayloadResult>) =
results.into_iter().unzip();
@@ -130,7 +152,7 @@ impl Command {
}
// accumulate the results and calculate the overall Ggas/s
let gas_output = TotalGasOutput::new(gas_output_results);
let gas_output = TotalGasOutput::new(gas_output_results)?;
info!(
total_duration=?gas_output.total_duration,
total_gas_used=?gas_output.total_gas_used,

View File

@@ -1,6 +1,7 @@
//! Contains various benchmark output formats, either for logging or for
//! serialization to / from files.
use eyre::OptionExt;
use reth_primitives_traits::constants::GIGAGAS;
use serde::{ser::SerializeStruct, Serialize};
use std::time::Duration;
@@ -52,7 +53,7 @@ impl Serialize for NewPayloadResult {
{
// convert the time to microseconds
let time = self.latency.as_micros();
let mut state = serializer.serialize_struct("NewPayloadResult", 3)?;
let mut state = serializer.serialize_struct("NewPayloadResult", 2)?;
state.serialize_field("gas_used", &self.gas_used)?;
state.serialize_field("latency", &time)?;
state.end()
@@ -66,6 +67,8 @@ impl Serialize for NewPayloadResult {
pub(crate) struct CombinedResult {
/// The block number of the block being processed.
pub(crate) block_number: u64,
/// The number of transactions in the block.
pub(crate) transaction_count: u64,
/// The `newPayload` result.
pub(crate) new_payload_result: NewPayloadResult,
/// The latency of the `forkchoiceUpdated` call.
@@ -107,10 +110,11 @@ impl Serialize for CombinedResult {
let fcu_latency = self.fcu_latency.as_micros();
let new_payload_latency = self.new_payload_result.latency.as_micros();
let total_latency = self.total_latency.as_micros();
let mut state = serializer.serialize_struct("CombinedResult", 5)?;
let mut state = serializer.serialize_struct("CombinedResult", 6)?;
// flatten the new payload result because this is meant for CSV writing
state.serialize_field("block_number", &self.block_number)?;
state.serialize_field("transaction_count", &self.transaction_count)?;
state.serialize_field("gas_used", &self.new_payload_result.gas_used)?;
state.serialize_field("new_payload_latency", &new_payload_latency)?;
state.serialize_field("fcu_latency", &fcu_latency)?;
@@ -124,6 +128,8 @@ impl Serialize for CombinedResult {
pub(crate) struct TotalGasRow {
/// The block number of the block being processed.
pub(crate) block_number: u64,
/// The number of transactions in the block.
pub(crate) transaction_count: u64,
/// The total gas used in the block.
pub(crate) gas_used: u64,
/// Time since the start of the benchmark.
@@ -145,15 +151,14 @@ pub(crate) struct TotalGasOutput {
impl TotalGasOutput {
/// Create a new [`TotalGasOutput`] from a list of [`TotalGasRow`].
pub(crate) fn new(rows: Vec<TotalGasRow>) -> Self {
pub(crate) fn new(rows: Vec<TotalGasRow>) -> eyre::Result<Self> {
// the duration is obtained from the last row
let total_duration =
rows.last().map(|row| row.time).expect("the row has at least one element");
let total_duration = rows.last().map(|row| row.time).ok_or_eyre("empty results")?;
let blocks_processed = rows.len() as u64;
let total_gas_used: u64 = rows.into_iter().map(|row| row.gas_used).sum();
let total_gas_per_second = total_gas_used as f64 / total_duration.as_secs_f64();
Self { total_gas_used, total_duration, total_gas_per_second, blocks_processed }
Ok(Self { total_gas_used, total_duration, total_gas_per_second, blocks_processed })
}
/// Return the total gigagas per second.
@@ -172,8 +177,9 @@ impl Serialize for TotalGasRow {
{
// convert the time to microseconds
let time = self.time.as_micros();
let mut state = serializer.serialize_struct("TotalGasRow", 3)?;
let mut state = serializer.serialize_struct("TotalGasRow", 4)?;
state.serialize_field("block_number", &self.block_number)?;
state.serialize_field("transaction_count", &self.transaction_count)?;
state.serialize_field("gas_used", &self.gas_used)?;
state.serialize_field("time", &time)?;
state.end()
@@ -188,7 +194,12 @@ mod tests {
#[test]
fn test_write_total_gas_row_csv() {
let row = TotalGasRow { block_number: 1, gas_used: 1_000, time: Duration::from_secs(1) };
let row = TotalGasRow {
block_number: 1,
transaction_count: 10,
gas_used: 1_000,
time: Duration::from_secs(1),
};
let mut writer = Writer::from_writer(vec![]);
writer.serialize(row).unwrap();
@@ -198,11 +209,11 @@ mod tests {
let mut result = result.as_slice().lines();
// assert header
let expected_first_line = "block_number,gas_used,time";
let expected_first_line = "block_number,transaction_count,gas_used,time";
let first_line = result.next().unwrap().unwrap();
assert_eq!(first_line, expected_first_line);
let expected_second_line = "1,1000,1000000";
let expected_second_line = "1,10,1000,1000000";
let second_line = result.next().unwrap().unwrap();
assert_eq!(second_line, expected_second_line);
}

View File

@@ -9,7 +9,7 @@
issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
)]
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
#![cfg_attr(docsrs, feature(doc_cfg))]
#[global_allocator]
static ALLOC: reth_cli_util::allocator::Allocator = reth_cli_util::allocator::new_allocator();
@@ -26,7 +26,9 @@ use reth_cli_runner::CliRunner;
fn main() {
// Enable backtraces unless a RUST_BACKTRACE value has already been explicitly provided.
if std::env::var_os("RUST_BACKTRACE").is_none() {
std::env::set_var("RUST_BACKTRACE", "1");
unsafe {
std::env::set_var("RUST_BACKTRACE", "1");
}
}
// Run until either exit or sigint or sigterm

View File

@@ -2,53 +2,20 @@
//! response. This is useful for benchmarking, as it allows us to wait for a payload to be valid
//! before sending additional calls.
use alloy_eips::eip7685::RequestsOrHash;
use alloy_primitives::B256;
use alloy_provider::{ext::EngineApi, Network, Provider};
use alloy_eips::eip7685::Requests;
use alloy_provider::{ext::EngineApi, network::AnyRpcBlock, Network, Provider};
use alloy_rpc_types_engine::{
ExecutionPayload, ExecutionPayloadInputV2, ExecutionPayloadSidecar, ExecutionPayloadV1,
ExecutionPayloadV3, ForkchoiceState, ForkchoiceUpdated, PayloadAttributes, PayloadStatus,
ExecutionPayload, ExecutionPayloadInputV2, ForkchoiceState, ForkchoiceUpdated,
PayloadAttributes, PayloadStatus,
};
use alloy_transport::TransportResult;
use op_alloy_rpc_types_engine::OpExecutionPayloadV4;
use reth_node_api::EngineApiMessageVersion;
use tracing::error;
/// An extension trait for providers that implement the engine API, to wait for a VALID response.
#[async_trait::async_trait]
pub trait EngineApiValidWaitExt<N>: Send + Sync {
/// Calls `engine_newPayloadV1` with the given [`ExecutionPayloadV1`], and waits until the
/// response is VALID.
async fn new_payload_v1_wait(
&self,
payload: ExecutionPayloadV1,
) -> TransportResult<PayloadStatus>;
/// Calls `engine_newPayloadV2` with the given [`ExecutionPayloadInputV2`], and waits until the
/// response is VALID.
async fn new_payload_v2_wait(
&self,
payload: ExecutionPayloadInputV2,
) -> TransportResult<PayloadStatus>;
/// Calls `engine_newPayloadV3` with the given [`ExecutionPayloadV3`], parent beacon block root,
/// and versioned hashes, and waits until the response is VALID.
async fn new_payload_v3_wait(
&self,
payload: ExecutionPayloadV3,
versioned_hashes: Vec<B256>,
parent_beacon_block_root: B256,
) -> TransportResult<PayloadStatus>;
/// Calls `engine_newPayloadV4` with the given [`ExecutionPayloadV3`], parent beacon block root,
/// versioned hashes, and requests hash, and waits until the response is VALID.
async fn new_payload_v4_wait(
&self,
payload: ExecutionPayloadV3,
versioned_hashes: Vec<B256>,
parent_beacon_block_root: B256,
requests_hash: B256,
) -> TransportResult<PayloadStatus>;
/// Calls `engine_forkChoiceUpdatedV1` with the given [`ForkchoiceState`] and optional
/// [`PayloadAttributes`], and waits until the response is VALID.
async fn fork_choice_updated_v1_wait(
@@ -80,122 +47,6 @@ where
N: Network,
P: Provider<N> + EngineApi<N>,
{
async fn new_payload_v1_wait(
&self,
payload: ExecutionPayloadV1,
) -> TransportResult<PayloadStatus> {
let mut status = self.new_payload_v1(payload.clone()).await?;
while !status.is_valid() {
if status.is_invalid() {
error!(?status, ?payload, "Invalid newPayloadV1",);
panic!("Invalid newPayloadV1: {status:?}");
}
status = self.new_payload_v1(payload.clone()).await?;
}
Ok(status)
}
async fn new_payload_v2_wait(
&self,
payload: ExecutionPayloadInputV2,
) -> TransportResult<PayloadStatus> {
let mut status = self.new_payload_v2(payload.clone()).await?;
while !status.is_valid() {
if status.is_invalid() {
error!(?status, ?payload, "Invalid newPayloadV2",);
panic!("Invalid newPayloadV2: {status:?}");
}
status = self.new_payload_v2(payload.clone()).await?;
}
Ok(status)
}
async fn new_payload_v3_wait(
&self,
payload: ExecutionPayloadV3,
versioned_hashes: Vec<B256>,
parent_beacon_block_root: B256,
) -> TransportResult<PayloadStatus> {
let mut status = self
.new_payload_v3(payload.clone(), versioned_hashes.clone(), parent_beacon_block_root)
.await?;
while !status.is_valid() {
if status.is_invalid() {
error!(
?status,
?payload,
?versioned_hashes,
?parent_beacon_block_root,
"Invalid newPayloadV3",
);
panic!("Invalid newPayloadV3: {status:?}");
}
if status.is_syncing() {
return Err(alloy_json_rpc::RpcError::UnsupportedFeature(
"invalid range: no canonical state found for parent of requested block",
))
}
status = self
.new_payload_v3(payload.clone(), versioned_hashes.clone(), parent_beacon_block_root)
.await?;
}
Ok(status)
}
async fn new_payload_v4_wait(
&self,
payload: ExecutionPayloadV3,
versioned_hashes: Vec<B256>,
parent_beacon_block_root: B256,
requests_hash: B256,
) -> TransportResult<PayloadStatus> {
// We cannot use `self.new_payload_v4` because it does not support sending
// `RequestsOrHash::Hash`
let mut status: PayloadStatus = self
.client()
.request(
"engine_newPayloadV4",
(
payload.clone(),
versioned_hashes.clone(),
parent_beacon_block_root,
RequestsOrHash::Hash(requests_hash),
),
)
.await?;
while !status.is_valid() {
if status.is_invalid() {
error!(
?status,
?payload,
?versioned_hashes,
?parent_beacon_block_root,
"Invalid newPayloadV4",
);
panic!("Invalid newPayloadV4: {status:?}");
}
if status.is_syncing() {
return Err(alloy_json_rpc::RpcError::UnsupportedFeature(
"invalid range: no canonical state found for parent of requested block",
))
}
status = self
.client()
.request(
"engine_newPayloadV4",
(
payload.clone(),
versioned_hashes.clone(),
parent_beacon_block_root,
RequestsOrHash::Hash(requests_hash),
),
)
.await?;
}
Ok(status)
}
async fn fork_choice_updated_v1_wait(
&self,
fork_choice_state: ForkchoiceState,
@@ -282,39 +133,60 @@ where
}
}
/// Calls the correct `engine_newPayload` method depending on the given [`ExecutionPayload`] and its
/// versioned variant. Returns the [`EngineApiMessageVersion`] depending on the payload's version.
///
/// # Panics
/// If the given payload is a V3 payload, but a parent beacon block root is provided as `None`.
pub(crate) async fn call_new_payload<N, P: EngineApiValidWaitExt<N>>(
provider: P,
payload: ExecutionPayload,
sidecar: ExecutionPayloadSidecar,
parent_beacon_block_root: Option<B256>,
versioned_hashes: Vec<B256>,
) -> TransportResult<EngineApiMessageVersion> {
match payload {
ExecutionPayload::V3(payload) => {
// We expect the caller to provide `parent_beacon_block_root` for V3 payloads.
let parent_beacon_block_root = parent_beacon_block_root
.expect("parent_beacon_block_root is required for V3 payloads and higher");
pub(crate) fn block_to_new_payload(
block: AnyRpcBlock,
is_optimism: bool,
) -> eyre::Result<(EngineApiMessageVersion, serde_json::Value)> {
let block = block
.into_inner()
.map_header(|header| header.map(|h| h.into_header_with_defaults()))
.try_map_transactions(|tx| {
// try to convert unknowns into op type so that we can also support optimism
tx.try_into_either::<op_alloy_consensus::OpTxEnvelope>()
})?
.into_consensus();
if let Some(requests_hash) = sidecar.requests_hash() {
provider
.new_payload_v4_wait(
payload,
versioned_hashes,
parent_beacon_block_root,
requests_hash,
// Convert to execution payload
let (payload, sidecar) = ExecutionPayload::from_block_slow(&block);
let (version, params) = match payload {
ExecutionPayload::V3(payload) => {
let cancun = sidecar.cancun().unwrap();
if let Some(prague) = sidecar.prague() {
if is_optimism {
(
EngineApiMessageVersion::V4,
serde_json::to_value((
OpExecutionPayloadV4 {
payload_inner: payload,
withdrawals_root: block.withdrawals_root.unwrap(),
},
cancun.versioned_hashes.clone(),
cancun.parent_beacon_block_root,
Requests::default(),
))?,
)
.await?;
Ok(EngineApiMessageVersion::V4)
} else {
(
EngineApiMessageVersion::V4,
serde_json::to_value((
payload,
cancun.versioned_hashes.clone(),
cancun.parent_beacon_block_root,
prague.requests.requests_hash(),
))?,
)
}
} else {
provider
.new_payload_v3_wait(payload, versioned_hashes, parent_beacon_block_root)
.await?;
Ok(EngineApiMessageVersion::V3)
(
EngineApiMessageVersion::V3,
serde_json::to_value((
payload,
cancun.versioned_hashes.clone(),
cancun.parent_beacon_block_root,
))?,
)
}
}
ExecutionPayload::V2(payload) => {
@@ -323,16 +195,43 @@ pub(crate) async fn call_new_payload<N, P: EngineApiValidWaitExt<N>>(
withdrawals: Some(payload.withdrawals),
};
provider.new_payload_v2_wait(input).await?;
Ok(EngineApiMessageVersion::V2)
(EngineApiMessageVersion::V2, serde_json::to_value((input,))?)
}
ExecutionPayload::V1(payload) => {
provider.new_payload_v1_wait(payload).await?;
Ok(EngineApiMessageVersion::V1)
(EngineApiMessageVersion::V1, serde_json::to_value((payload,))?)
}
};
Ok((version, params))
}
/// Calls the correct `engine_newPayload` method depending on the given [`ExecutionPayload`] and its
/// versioned variant. Returns the [`EngineApiMessageVersion`] depending on the payload's version.
///
/// # Panics
/// If the given payload is a V3 payload, but a parent beacon block root is provided as `None`.
pub(crate) async fn call_new_payload<N: Network, P: Provider<N>>(
provider: P,
version: EngineApiMessageVersion,
params: serde_json::Value,
) -> TransportResult<()> {
let method = version.method_name();
let mut status: PayloadStatus = provider.client().request(method, &params).await?;
while !status.is_valid() {
if status.is_invalid() {
error!(?status, ?params, "Invalid {method}",);
panic!("Invalid {method}: {status:?}");
}
if status.is_syncing() {
return Err(alloy_json_rpc::RpcError::UnsupportedFeature(
"invalid range: no canonical state found for parent of requested block",
))
}
status = provider.client().request(method, &params).await?;
}
Ok(())
}
/// Calls the correct `engine_forkchoiceUpdated` method depending on the given

View File

@@ -9,6 +9,20 @@ repository.workspace = true
description = "Reth node implementation"
default-run = "reth"
[package.metadata.deb]
maintainer = "reth team"
depends = "$auto"
section = "network"
priority = "optional"
maintainer-scripts = "../../pkg/reth/debian/"
assets = [
"$auto",
["../../README.md", "usr/share/doc/reth/", "644"],
["../../LICENSE-APACHE", "usr/share/doc/reth/", "644"],
["../../LICENSE-MIT", "usr/share/doc/reth/", "644"],
]
systemd-units = { enable = false, start = false, unit-name = "reth", unit-scripts = "../../pkg/reth/debian" }
[lints]
workspace = true
@@ -27,7 +41,7 @@ reth-cli-util.workspace = true
reth-consensus-common.workspace = true
reth-rpc-builder.workspace = true
reth-rpc.workspace = true
reth-rpc-types-compat.workspace = true
reth-rpc-convert.workspace = true
reth-rpc-api = { workspace = true, features = ["client"] }
reth-rpc-eth-types.workspace = true
reth-rpc-server-types.workspace = true
@@ -40,7 +54,7 @@ reth-node-api.workspace = true
reth-node-core.workspace = true
reth-ethereum-payload-builder.workspace = true
reth-ethereum-primitives.workspace = true
reth-node-ethereum = { workspace = true, features = ["js-tracer"] }
reth-node-ethereum.workspace = true
reth-node-builder.workspace = true
reth-node-metrics.workspace = true
reth-consensus.workspace = true
@@ -64,11 +78,21 @@ eyre.workspace = true
[dev-dependencies]
backon.workspace = true
similar-asserts.workspace = true
tempfile.workspace = true
[features]
default = ["jemalloc", "reth-revm/portable"]
default = ["jemalloc", "otlp", "reth-revm/portable", "js-tracer", "keccak-cache-global", "asm-keccak"]
otlp = [
"reth-ethereum-cli/otlp",
"reth-node-core/otlp",
]
js-tracer = [
"reth-node-builder/js-tracer",
"reth-node-ethereum/js-tracer",
"reth-rpc/js-tracer",
"reth-rpc-eth-types/js-tracer",
]
dev = ["reth-ethereum-cli/dev"]
@@ -76,8 +100,11 @@ asm-keccak = [
"reth-node-core/asm-keccak",
"reth-primitives/asm-keccak",
"reth-ethereum-cli/asm-keccak",
"reth-node-ethereum/asm-keccak",
]
keccak-cache-global = [
"reth-node-ethereum/keccak-cache-global",
]
jemalloc = [
"reth-cli-util/jemalloc",
"reth-node-core/jemalloc",
@@ -89,6 +116,12 @@ jemalloc-prof = [
"reth-cli-util/jemalloc-prof",
"reth-ethereum-cli/jemalloc-prof",
]
jemalloc-unprefixed = [
"reth-cli-util/jemalloc-unprefixed",
"reth-node-core/jemalloc",
"reth-node-metrics/jemalloc",
"reth-ethereum-cli/jemalloc",
]
tracy-allocator = [
"reth-cli-util/tracy-allocator",
"reth-ethereum-cli/tracy-allocator",
@@ -109,22 +142,27 @@ snmalloc-native = [
min-error-logs = [
"tracing/release_max_level_error",
"reth-ethereum-cli/min-error-logs",
"reth-node-core/min-error-logs",
]
min-warn-logs = [
"tracing/release_max_level_warn",
"reth-ethereum-cli/min-warn-logs",
"reth-node-core/min-warn-logs",
]
min-info-logs = [
"tracing/release_max_level_info",
"reth-ethereum-cli/min-info-logs",
"reth-node-core/min-info-logs",
]
min-debug-logs = [
"tracing/release_max_level_debug",
"reth-ethereum-cli/min-debug-logs",
"reth-node-core/min-debug-logs",
]
min-trace-logs = [
"tracing/release_max_level_trace",
"reth-ethereum-cli/min-trace-logs",
"reth-node-core/min-trace-logs",
]
[[bin]]

View File

@@ -25,7 +25,7 @@
issue_tracker_base_url = "https://github.com/paradigmxyz/reth/issues/"
)]
#![cfg_attr(not(test), warn(unused_crate_dependencies))]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod cli;
@@ -175,9 +175,9 @@ pub mod rpc {
pub use reth_rpc_server_types::result::*;
}
/// Re-exported from `reth_rpc_types_compat`.
/// Re-exported from `reth_rpc_convert`.
pub mod compat {
pub use reth_rpc_types_compat::*;
pub use reth_rpc_convert::*;
}
}

View File

@@ -2,7 +2,7 @@ use reth_ethereum_primitives::EthPrimitives;
use reth_evm::ConfigureEvm;
use reth_network::{protocol::IntoRlpxSubProtocol, NetworkProtocols};
use reth_network_api::FullNetwork;
use reth_node_api::BeaconConsensusEngineEvent;
use reth_node_api::ConsensusEngineEvent;
use reth_node_core::args::RessArgs;
use reth_provider::providers::{BlockchainProvider, ProviderNodeTypes};
use reth_ress_protocol::{NodeType, ProtocolState, RessProtocolHandler};
@@ -19,7 +19,7 @@ pub fn install_ress_subprotocol<P, E, N>(
evm_config: E,
network: N,
task_executor: TaskExecutor,
engine_events: EventStream<BeaconConsensusEngineEvent<EthPrimitives>>,
engine_events: EventStream<ConsensusEngineEvent<EthPrimitives>>,
) -> eyre::Result<()>
where
P: ProviderNodeTypes<Primitives = EthPrimitives>,

View File

@@ -1,84 +0,0 @@
# Reth Book
- [Introduction](./intro.md)
- [Installation](./installation/installation.md)
- [Pre-Built Binaries](./installation/binaries.md)
- [Docker](./installation/docker.md)
- [Build from Source](./installation/source.md)
- [Build for ARM devices](./installation/build-for-arm-devices.md)
- [Update Priorities](./installation/priorities.md)
- [Run a Node](./run/run-a-node.md)
- [Mainnet or official testnets](./run/mainnet.md)
- [OP Stack](./run/optimism.md)
- [Run an OP Mainnet Node](./run/sync-op-mainnet.md)
- [Private testnet](./run/private-testnet.md)
- [Metrics](./run/observability.md)
- [Configuring Reth](./run/config.md)
- [Transaction types](./run/transactions.md)
- [Pruning & Full Node](./run/pruning.md)
- [Ports](./run/ports.md)
- [Troubleshooting](./run/troubleshooting.md)
- [Interacting with Reth over JSON-RPC](./jsonrpc/intro.md)
- [eth](./jsonrpc/eth.md)
- [web3](./jsonrpc/web3.md)
- [net](./jsonrpc/net.md)
- [txpool](./jsonrpc/txpool.md)
- [debug](./jsonrpc/debug.md)
- [trace](./jsonrpc/trace.md)
- [admin](./jsonrpc/admin.md)
- [rpc](./jsonrpc/rpc.md)
- [CLI Reference](./cli/cli.md) <!-- CLI_REFERENCE START -->
- [`reth`](./cli/reth.md)
- [`reth node`](./cli/reth/node.md)
- [`reth init`](./cli/reth/init.md)
- [`reth init-state`](./cli/reth/init-state.md)
- [`reth import`](./cli/reth/import.md)
- [`reth import-era`](./cli/reth/import-era.md)
- [`reth dump-genesis`](./cli/reth/dump-genesis.md)
- [`reth db`](./cli/reth/db.md)
- [`reth db stats`](./cli/reth/db/stats.md)
- [`reth db list`](./cli/reth/db/list.md)
- [`reth db checksum`](./cli/reth/db/checksum.md)
- [`reth db diff`](./cli/reth/db/diff.md)
- [`reth db get`](./cli/reth/db/get.md)
- [`reth db get mdbx`](./cli/reth/db/get/mdbx.md)
- [`reth db get static-file`](./cli/reth/db/get/static-file.md)
- [`reth db drop`](./cli/reth/db/drop.md)
- [`reth db clear`](./cli/reth/db/clear.md)
- [`reth db clear mdbx`](./cli/reth/db/clear/mdbx.md)
- [`reth db clear static-file`](./cli/reth/db/clear/static-file.md)
- [`reth db version`](./cli/reth/db/version.md)
- [`reth db path`](./cli/reth/db/path.md)
- [`reth download`](./cli/reth/download.md)
- [`reth stage`](./cli/reth/stage.md)
- [`reth stage run`](./cli/reth/stage/run.md)
- [`reth stage drop`](./cli/reth/stage/drop.md)
- [`reth stage dump`](./cli/reth/stage/dump.md)
- [`reth stage dump execution`](./cli/reth/stage/dump/execution.md)
- [`reth stage dump storage-hashing`](./cli/reth/stage/dump/storage-hashing.md)
- [`reth stage dump account-hashing`](./cli/reth/stage/dump/account-hashing.md)
- [`reth stage dump merkle`](./cli/reth/stage/dump/merkle.md)
- [`reth stage unwind`](./cli/reth/stage/unwind.md)
- [`reth stage unwind to-block`](./cli/reth/stage/unwind/to-block.md)
- [`reth stage unwind num-blocks`](./cli/reth/stage/unwind/num-blocks.md)
- [`reth p2p`](./cli/reth/p2p.md)
- [`reth p2p header`](./cli/reth/p2p/header.md)
- [`reth p2p body`](./cli/reth/p2p/body.md)
- [`reth p2p rlpx`](./cli/reth/p2p/rlpx.md)
- [`reth p2p rlpx ping`](./cli/reth/p2p/rlpx/ping.md)
- [`reth config`](./cli/reth/config.md)
- [`reth debug`](./cli/reth/debug.md)
- [`reth debug execution`](./cli/reth/debug/execution.md)
- [`reth debug merkle`](./cli/reth/debug/merkle.md)
- [`reth debug in-memory-merkle`](./cli/reth/debug/in-memory-merkle.md)
- [`reth debug build-block`](./cli/reth/debug/build-block.md)
- [`reth recover`](./cli/reth/recover.md)
- [`reth recover storage-tries`](./cli/reth/recover/storage-tries.md)
- [`reth prune`](./cli/reth/prune.md)
- [Developers](./developers/developers.md) <!-- CLI_REFERENCE END -->
- [Execution Extensions](./developers/exex/exex.md)
- [How do ExExes work?](./developers/exex/how-it-works.md)
- [Hello World](./developers/exex/hello-world.md)
- [Tracking State](./developers/exex/tracking-state.md)
- [Remote](./developers/exex/remote.md)
- [Contribute](./developers/contribute.md)

47
book/cli/SUMMARY.md vendored
View File

@@ -1,47 +0,0 @@
- [`reth`](./reth.md)
- [`reth node`](./reth/node.md)
- [`reth init`](./reth/init.md)
- [`reth init-state`](./reth/init-state.md)
- [`reth import`](./reth/import.md)
- [`reth import-era`](./reth/import-era.md)
- [`reth dump-genesis`](./reth/dump-genesis.md)
- [`reth db`](./reth/db.md)
- [`reth db stats`](./reth/db/stats.md)
- [`reth db list`](./reth/db/list.md)
- [`reth db checksum`](./reth/db/checksum.md)
- [`reth db diff`](./reth/db/diff.md)
- [`reth db get`](./reth/db/get.md)
- [`reth db get mdbx`](./reth/db/get/mdbx.md)
- [`reth db get static-file`](./reth/db/get/static-file.md)
- [`reth db drop`](./reth/db/drop.md)
- [`reth db clear`](./reth/db/clear.md)
- [`reth db clear mdbx`](./reth/db/clear/mdbx.md)
- [`reth db clear static-file`](./reth/db/clear/static-file.md)
- [`reth db version`](./reth/db/version.md)
- [`reth db path`](./reth/db/path.md)
- [`reth download`](./reth/download.md)
- [`reth stage`](./reth/stage.md)
- [`reth stage run`](./reth/stage/run.md)
- [`reth stage drop`](./reth/stage/drop.md)
- [`reth stage dump`](./reth/stage/dump.md)
- [`reth stage dump execution`](./reth/stage/dump/execution.md)
- [`reth stage dump storage-hashing`](./reth/stage/dump/storage-hashing.md)
- [`reth stage dump account-hashing`](./reth/stage/dump/account-hashing.md)
- [`reth stage dump merkle`](./reth/stage/dump/merkle.md)
- [`reth stage unwind`](./reth/stage/unwind.md)
- [`reth stage unwind to-block`](./reth/stage/unwind/to-block.md)
- [`reth stage unwind num-blocks`](./reth/stage/unwind/num-blocks.md)
- [`reth p2p`](./reth/p2p.md)
- [`reth p2p header`](./reth/p2p/header.md)
- [`reth p2p body`](./reth/p2p/body.md)
- [`reth p2p rlpx`](./reth/p2p/rlpx.md)
- [`reth p2p rlpx ping`](./reth/p2p/rlpx/ping.md)
- [`reth config`](./reth/config.md)
- [`reth debug`](./reth/debug.md)
- [`reth debug execution`](./reth/debug/execution.md)
- [`reth debug merkle`](./reth/debug/merkle.md)
- [`reth debug in-memory-merkle`](./reth/debug/in-memory-merkle.md)
- [`reth debug build-block`](./reth/debug/build-block.md)
- [`reth recover`](./reth/recover.md)
- [`reth recover storage-tries`](./reth/recover/storage-tries.md)
- [`reth prune`](./reth/prune.md)

View File

@@ -1,374 +0,0 @@
#!/usr/bin/env -S cargo +nightly -Zscript
---
[package]
edition = "2021"
[dependencies]
clap = { version = "4", features = ["derive"] }
pathdiff = "0.2"
regex = "1"
---
use clap::Parser;
use regex::Regex;
use std::borrow::Cow;
use std::fs::{self, File};
use std::io::{self, Write};
use std::iter::once;
use std::path::{Path, PathBuf};
use std::process::{Command, Stdio};
use std::str;
use std::sync::LazyLock;
use std::{fmt, process};
const SECTION_START: &str = "<!-- CLI_REFERENCE START -->";
const SECTION_END: &str = "<!-- CLI_REFERENCE END -->";
const README: &str = r#"# CLI Reference
<!-- Generated by scripts/gen_output/help.rs -->
Automatically-generated CLI reference from `--help` output.
{{#include ./SUMMARY.md}}
"#;
const TRIM_LINE_END_MARKDOWN: bool = true;
/// Lazy static regex to avoid recompiling the same regex pattern multiple times.
macro_rules! regex {
($re:expr) => {{
static RE: LazyLock<Regex> =
LazyLock::new(|| Regex::new($re).expect("Failed to compile regex pattern"));
&*RE
}};
}
/// Generate markdown files from help output of commands
#[derive(Parser, Debug)]
#[command(about, long_about = None)]
struct Args {
/// Root directory
#[arg(long, default_value_t = String::from("."))]
root_dir: String,
/// Indentation for the root SUMMARY.md file
#[arg(long, default_value_t = 2)]
root_indentation: usize,
/// Output directory
#[arg(long)]
out_dir: PathBuf,
/// Whether to add a README.md file
#[arg(long)]
readme: bool,
/// Whether to update the root SUMMARY.md file
#[arg(long)]
root_summary: bool,
/// Print verbose output
#[arg(short, long)]
verbose: bool,
/// Commands to generate markdown for.
#[arg(required = true, num_args = 1..)]
commands: Vec<PathBuf>,
}
fn write_file(file_path: &Path, content: &str) -> io::Result<()> {
let content = if TRIM_LINE_END_MARKDOWN {
content
.lines()
.map(|line| line.trim_end())
.collect::<Vec<_>>()
.join("\n")
} else {
content.to_string()
};
fs::write(file_path, content)
}
fn main() -> io::Result<()> {
let args = Args::parse();
debug_assert!(args.commands.len() >= 1);
let out_dir = args.out_dir;
fs::create_dir_all(&out_dir)?;
let mut todo_iter: Vec<Cmd> = args
.commands
.iter()
.rev() // reverse to keep the order (pop)
.map(Cmd::new)
.collect();
let mut output = Vec::new();
// Iterate over all commands and their subcommands.
while let Some(cmd) = todo_iter.pop() {
let (new_subcmds, stdout) = get_entry(&cmd)?;
if args.verbose && !new_subcmds.is_empty() {
println!(
"Found subcommands for \"{}\": {:?}",
cmd.command_name(),
new_subcmds
);
}
// Add new subcommands to todo_iter (so that they are processed in the correct order).
for subcmd in new_subcmds.into_iter().rev() {
let new_subcmds: Vec<_> = cmd
.subcommands
.iter()
.cloned()
.chain(once(subcmd))
.collect();
todo_iter.push(Cmd {
cmd: cmd.cmd,
subcommands: new_subcmds,
});
}
output.push((cmd, stdout));
}
// Generate markdown files.
for (cmd, stdout) in &output {
cmd_markdown(&out_dir, cmd, stdout)?;
}
// Generate SUMMARY.md.
let summary: String = output
.iter()
.map(|(cmd, _)| cmd_summary(None, cmd, 0))
.chain(once("\n".to_string()))
.collect();
write_file(&out_dir.clone().join("SUMMARY.md"), &summary)?;
// Generate README.md.
if args.readme {
let path = &out_dir.join("README.md");
if args.verbose {
println!("Writing README.md to \"{}\"", path.to_string_lossy());
}
write_file(path, README)?;
}
// Generate root SUMMARY.md.
if args.root_summary {
let root_summary: String = output
.iter()
.map(|(cmd, _)| {
let root_path = pathdiff::diff_paths(&out_dir, &args.root_dir);
cmd_summary(root_path, cmd, args.root_indentation)
})
.collect();
let path = Path::new(args.root_dir.as_str());
if args.verbose {
println!("Updating root summary in \"{}\"", path.to_string_lossy());
}
update_root_summary(path, &root_summary)?;
}
Ok(())
}
/// Returns the subcommands and help output for a command.
fn get_entry(cmd: &Cmd) -> io::Result<(Vec<String>, String)> {
let output = Command::new(cmd.cmd)
.args(&cmd.subcommands)
.arg("--help")
.env("NO_COLOR", "1")
.env("COLUMNS", "100")
.env("LINES", "10000")
.stdout(Stdio::piped())
.output()?;
if !output.status.success() {
let stderr = str::from_utf8(&output.stderr).unwrap_or("Failed to parse stderr as UTF-8");
return Err(io::Error::new(
io::ErrorKind::Other,
format!("Command \"{}\" failed:\n{}", cmd, stderr),
));
}
let stdout = str::from_utf8(&output.stdout)
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?
.to_string();
// Parse subcommands from the help output
let subcmds = parse_sub_commands(&stdout);
Ok((subcmds, stdout))
}
/// Returns a list of subcommands from the help output of a command.
fn parse_sub_commands(s: &str) -> Vec<String> {
// This regex matches lines starting with two spaces, followed by the subcommand name.
let re = regex!(r"^ (\S+)");
s.split("Commands:")
.nth(1) // Get the part after "Commands:"
.map(|commands_section| {
commands_section
.lines()
.take_while(|line| !line.starts_with("Options:") && !line.starts_with("Arguments:"))
.filter_map(|line| {
re.captures(line)
.and_then(|cap| cap.get(1).map(|m| m.as_str().to_string()))
})
.filter(|cmd| cmd != "help")
.map(String::from)
.collect()
})
.unwrap_or_default() // Return an empty Vec if "Commands:" was not found
}
/// Writes the markdown for a command to out_dir.
fn cmd_markdown(out_dir: &Path, cmd: &Cmd, stdout: &str) -> io::Result<()> {
let out = format!("# {}\n\n{}", cmd, help_markdown(cmd, stdout));
let out_path = out_dir.join(cmd.to_string().replace(" ", "/"));
fs::create_dir_all(out_path.parent().unwrap())?;
write_file(&out_path.with_extension("md"), &out)?;
Ok(())
}
/// Returns the markdown for a command's help output.
fn help_markdown(cmd: &Cmd, stdout: &str) -> String {
let (description, s) = parse_description(stdout);
format!(
"{}\n\n```bash\n$ {} --help\n```\n```txt\n{}\n```",
description,
cmd,
preprocess_help(s.trim())
)
}
/// Splits the help output into a description and the rest.
fn parse_description(s: &str) -> (&str, &str) {
match s.find("Usage:") {
Some(idx) => {
let description = s[..idx].trim().lines().next().unwrap_or("");
(description, &s[idx..])
}
None => ("", s),
}
}
/// Returns the summary for a command and its subcommands.
fn cmd_summary(md_root: Option<PathBuf>, cmd: &Cmd, indent: usize) -> String {
let cmd_s = cmd.to_string();
let cmd_path = cmd_s.replace(" ", "/");
let full_cmd_path = match md_root {
None => cmd_path,
Some(md_root) => format!("{}/{}", md_root.to_string_lossy(), cmd_path),
};
let indent_string = " ".repeat(indent + (cmd.subcommands.len() * 2));
format!("{}- [`{}`](./{}.md)\n", indent_string, cmd_s, full_cmd_path)
}
/// Replaces the CLI_REFERENCE section in the root SUMMARY.md file.
fn update_root_summary(root_dir: &Path, root_summary: &str) -> io::Result<()> {
let summary_file = root_dir.join("SUMMARY.md");
let original_summary_content = fs::read_to_string(&summary_file)?;
let section_re = regex!(&format!(r"(?s)\s*{SECTION_START}.*?{SECTION_END}"));
if !section_re.is_match(&original_summary_content) {
eprintln!(
"Could not find CLI_REFERENCE section in {}. Please add the following section to the file:\n{}\n... CLI Reference goes here ...\n\n{}",
summary_file.display(),
SECTION_START,
SECTION_END
);
process::exit(1);
}
let section_end_re = regex!(&format!(r".*{SECTION_END}"));
let last_line = section_end_re
.find(&original_summary_content)
.map(|m| m.as_str().to_string())
.expect("Could not extract last line of CLI_REFERENCE section");
let root_summary_s = root_summary.trim_end().replace("\n\n", "\n");
let replace_with = format!(" {}\n{}\n{}", SECTION_START, root_summary_s, last_line);
let new_root_summary = section_re
.replace(&original_summary_content, replace_with.as_str())
.to_string();
let mut root_summary_file = File::create(&summary_file)?;
root_summary_file.write_all(new_root_summary.as_bytes())
}
/// Preprocesses the help output of a command.
fn preprocess_help(s: &str) -> Cow<'_, str> {
static REPLACEMENTS: LazyLock<Vec<(Regex, &str)>> = LazyLock::new(|| {
let patterns: &[(&str, &str)] = &[
// Remove the user-specific paths.
(r"default: /.*/reth", "default: <CACHE_DIR>"),
// Remove the commit SHA and target architecture triple or fourth
// rustup available targets:
// aarch64-apple-darwin
// x86_64-unknown-linux-gnu
// x86_64-pc-windows-gnu
(
r"default: reth/.*-[0-9A-Fa-f]{6,10}/([_\w]+)-(\w+)-(\w+)(-\w+)?",
"default: reth/<VERSION>-<SHA>/<ARCH>",
),
// Remove the OS
(r"default: reth/.*/\w+", "default: reth/<VERSION>/<OS>"),
// Remove rpc.max-tracing-requests default value
(
r"(rpc.max-tracing-requests <COUNT>\n.*\n.*\n.*\n.*\n.*)\[default: \d+\]",
r"$1[default: <NUM CPU CORES-2>]",
),
];
patterns
.iter()
.map(|&(re, replace_with)| (Regex::new(re).expect(re), replace_with))
.collect()
});
let mut s = Cow::Borrowed(s);
for (re, replacement) in REPLACEMENTS.iter() {
if let Cow::Owned(result) = re.replace_all(&s, *replacement) {
s = Cow::Owned(result);
}
}
s
}
#[derive(Hash, Debug, PartialEq, Eq)]
struct Cmd<'a> {
/// path to binary (e.g. ./target/debug/reth)
cmd: &'a Path,
/// subcommands (e.g. [db, stats])
subcommands: Vec<String>,
}
impl<'a> Cmd<'a> {
fn command_name(&self) -> &str {
self.cmd
.file_name()
.and_then(|os_str| os_str.to_str())
.expect("Expect valid command")
}
fn new(cmd: &'a PathBuf) -> Self {
Self {
cmd,
subcommands: Vec::new(),
}
}
}
impl<'a> fmt::Display for Cmd<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.command_name())?;
if !self.subcommands.is_empty() {
write!(f, " {}", self.subcommands.join(" "))?;
}
Ok(())
}
}

158
book/cli/reth/db.md vendored
View File

@@ -1,158 +0,0 @@
# reth db
Database debugging utilities
```bash
$ reth db --help
```
```txt
Usage: reth db [OPTIONS] <COMMAND>
Commands:
stats Lists all the tables, their entry count and their size
list Lists the contents of a table
checksum Calculates the content checksum of a table
diff Create a diff between two database tables or two entire databases
get Gets the content of a table for the given key
drop Deletes all database entries
clear Deletes all table entries
version Lists current and local database versions
path Returns the full database path
help Print this message or the help of the given subcommand(s)
Options:
-h, --help
Print help (see a summary with '-h')
Datadir:
--datadir <DATA_DIR>
The path to the data dir for all reth files and subdirectories.
Defaults to the OS-specific data directory:
- Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/`
- Windows: `{FOLDERID_RoamingAppData}/reth/`
- macOS: `$HOME/Library/Application Support/reth/`
[default: default]
--datadir.static-files <PATH>
The absolute path to store static files in.
--config <FILE>
The path to the configuration file to use
--chain <CHAIN_OR_PATH>
The chain this node is running.
Possible values are either a built-in chain or the path to a chain specification file.
Built-in chains:
mainnet, sepolia, holesky, hoodi, dev
[default: mainnet]
Database:
--db.log-level <LOG_LEVEL>
Database logging level. Levels higher than "notice" require a debug build
Possible values:
- fatal: Enables logging for critical conditions, i.e. assertion failures
- error: Enables logging for error conditions
- warn: Enables logging for warning conditions
- notice: Enables logging for normal but significant condition
- verbose: Enables logging for verbose informational
- debug: Enables logging for debug-level messages
- trace: Enables logging for trace debug-level messages
- extra: Enables logging for extra debug-level messages
--db.exclusive <EXCLUSIVE>
Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume
[possible values: true, false]
--db.max-size <MAX_SIZE>
Maximum database size (e.g., 4TB, 8MB)
--db.growth-step <GROWTH_STEP>
Database growth step (e.g., 4GB, 4KB)
--db.read-transaction-timeout <READ_TRANSACTION_TIMEOUT>
Read transaction timeout in seconds, 0 means no timeout
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,98 +0,0 @@
# reth debug
Various debug routines
```bash
$ reth debug --help
```
```txt
Usage: reth debug [OPTIONS] <COMMAND>
Commands:
execution Debug the roundtrip execution of blocks as well as the generated data
merkle Debug the clean & incremental state root calculations
in-memory-merkle Debug in-memory state root calculation
build-block Debug block building
help Print this message or the help of the given subcommand(s)
Options:
-h, --help
Print help (see a summary with '-h')
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,332 +0,0 @@
# reth debug replay-engine
Debug engine API by replaying stored messages
```bash
$ reth debug replay-engine --help
```
```txt
Usage: reth debug replay-engine [OPTIONS] --engine-api-store <PATH>
Options:
--instance <INSTANCE>
Add a new instance of a node.
Configures the ports of the node to avoid conflicts with the defaults. This is useful for running multiple nodes on the same machine.
Max number of instances is 200. It is chosen in a way so that it's not possible to have port numbers that conflict with each other.
Changes to the following port numbers: - `DISCOVERY_PORT`: default + `instance` - 1 - `AUTH_PORT`: default + `instance` * 100 - 100 - `HTTP_RPC_PORT`: default - `instance` + 1 - `WS_RPC_PORT`: default + `instance` * 2 - 2
[default: 1]
-h, --help
Print help (see a summary with '-h')
Datadir:
--datadir <DATA_DIR>
The path to the data dir for all reth files and subdirectories.
Defaults to the OS-specific data directory:
- Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/`
- Windows: `{FOLDERID_RoamingAppData}/reth/`
- macOS: `$HOME/Library/Application Support/reth/`
[default: default]
--datadir.static-files <PATH>
The absolute path to store static files in.
--config <FILE>
The path to the configuration file to use
--chain <CHAIN_OR_PATH>
The chain this node is running.
Possible values are either a built-in chain or the path to a chain specification file.
Built-in chains:
mainnet, sepolia, holesky, dev
[default: mainnet]
Database:
--db.log-level <LOG_LEVEL>
Database logging level. Levels higher than "notice" require a debug build
Possible values:
- fatal: Enables logging for critical conditions, i.e. assertion failures
- error: Enables logging for error conditions
- warn: Enables logging for warning conditions
- notice: Enables logging for normal but significant condition
- verbose: Enables logging for verbose informational
- debug: Enables logging for debug-level messages
- trace: Enables logging for trace debug-level messages
- extra: Enables logging for extra debug-level messages
--db.exclusive <EXCLUSIVE>
Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume
[possible values: true, false]
--db.max-size <MAX_SIZE>
Maximum database size (e.g., 4TB, 8MB)
--db.growth-step <GROWTH_STEP>
Database growth step (e.g., 4GB, 4KB)
--db.read-transaction-timeout <READ_TRANSACTION_TIMEOUT>
Read transaction timeout in seconds, 0 means no timeout
Networking:
-d, --disable-discovery
Disable the discovery service
--disable-dns-discovery
Disable the DNS discovery
--disable-discv4-discovery
Disable Discv4 discovery
--enable-discv5-discovery
Enable Discv5 discovery
--disable-nat
Disable Nat discovery
--discovery.addr <DISCOVERY_ADDR>
The UDP address to use for devp2p peer discovery version 4
[default: 0.0.0.0]
--discovery.port <DISCOVERY_PORT>
The UDP port to use for devp2p peer discovery version 4
[default: 30303]
--discovery.v5.addr <DISCOVERY_V5_ADDR>
The UDP IPv4 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv4
--discovery.v5.addr.ipv6 <DISCOVERY_V5_ADDR_IPV6>
The UDP IPv6 address to use for devp2p peer discovery version 5. Overwritten by `RLPx` address, if it's also IPv6
--discovery.v5.port <DISCOVERY_V5_PORT>
The UDP IPv4 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv4, or `--discovery.v5.addr` is set
[default: 9200]
--discovery.v5.port.ipv6 <DISCOVERY_V5_PORT_IPV6>
The UDP IPv6 port to use for devp2p peer discovery version 5. Not used unless `--addr` is IPv6, or `--discovery.addr.ipv6` is set
[default: 9200]
--discovery.v5.lookup-interval <DISCOVERY_V5_LOOKUP_INTERVAL>
The interval in seconds at which to carry out periodic lookup queries, for the whole run of the program
[default: 20]
--discovery.v5.bootstrap.lookup-interval <DISCOVERY_V5_BOOTSTRAP_LOOKUP_INTERVAL>
The interval in seconds at which to carry out boost lookup queries, for a fixed number of times, at bootstrap
[default: 5]
--discovery.v5.bootstrap.lookup-countdown <DISCOVERY_V5_BOOTSTRAP_LOOKUP_COUNTDOWN>
The number of times to carry out boost lookup queries at bootstrap
[default: 200]
--trusted-peers <TRUSTED_PEERS>
Comma separated enode URLs of trusted peers for P2P connections.
--trusted-peers enode://abcd@192.168.0.1:30303
--trusted-only
Connect to or accept from trusted peers only
--bootnodes <BOOTNODES>
Comma separated enode URLs for P2P discovery bootstrap.
Will fall back to a network-specific default if not specified.
--dns-retries <DNS_RETRIES>
Amount of DNS resolution requests retries to perform when peering
[default: 0]
--peers-file <FILE>
The path to the known peers file. Connected peers are dumped to this file on nodes
shutdown, and read on startup. Cannot be used with `--no-persist-peers`.
--identity <IDENTITY>
Custom node identity
[default: reth/<VERSION>-<SHA>/<ARCH>]
--p2p-secret-key <PATH>
Secret key to use for this node.
This will also deterministically set the peer ID. If not specified, it will be set in the data dir for the chain being used.
--no-persist-peers
Do not persist peers.
--nat <NAT>
NAT resolution method (any|none|upnp|publicip|extip:\<IP\>)
[default: any]
--addr <ADDR>
Network listening address
[default: 0.0.0.0]
--port <PORT>
Network listening port
[default: 30303]
--max-outbound-peers <MAX_OUTBOUND_PEERS>
Maximum number of outbound requests. default: 100
--max-inbound-peers <MAX_INBOUND_PEERS>
Maximum number of inbound requests. default: 30
--max-tx-reqs <COUNT>
Max concurrent `GetPooledTransactions` requests.
[default: 130]
--max-tx-reqs-peer <COUNT>
Max concurrent `GetPooledTransactions` requests per peer.
[default: 1]
--max-seen-tx-history <COUNT>
Max number of seen transactions to remember per peer.
Default is 320 transaction hashes.
[default: 320]
--max-pending-imports <COUNT>
Max number of transactions to import concurrently.
[default: 4096]
--pooled-tx-response-soft-limit <BYTES>
Experimental, for usage in research. Sets the max accumulated byte size of transactions
to pack in one response.
Spec'd at 2MiB.
[default: 2097152]
--pooled-tx-pack-soft-limit <BYTES>
Experimental, for usage in research. Sets the max accumulated byte size of transactions to
request in one request.
Since `RLPx` protocol version 68, the byte size of a transaction is shared as metadata in a
transaction announcement (see `RLPx` specs). This allows a node to request a specific size
response.
By default, nodes request only 128 KiB worth of transactions, but should a peer request
more, up to 2 MiB, a node will answer with more than 128 KiB.
Default is 128 KiB.
[default: 131072]
--max-tx-pending-fetch <COUNT>
Max capacity of cache of hashes for transactions pending fetch.
[default: 25600]
--net-if.experimental <IF_NAME>
Name of network interface used to communicate with peers.
If flag is set, but no value is passed, the default interface for docker `eth0` is tried.
--engine-api-store <PATH>
The path to read engine API messages from
--interval <INTERVAL>
The number of milliseconds between Engine API messages
[default: 1000]
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,133 +0,0 @@
# op-reth import-receipts-op
This imports non-standard RLP encoded receipts from a file.
The supported RLP encoding, is the non-standard encoding used
for receipt export in <https://github.com/testinprod-io/op-geth/pull/1>.
Supports import of OVM receipts from the Bedrock datadir.
```bash
$ op-reth import-receipts-op --help
Usage: op-reth import-receipts-op [OPTIONS] <IMPORT_PATH>
Options:
--datadir <DATA_DIR>
The path to the data dir for all reth files and subdirectories.
Defaults to the OS-specific data directory:
- Linux: `$XDG_DATA_HOME/reth/` or `$HOME/.local/share/reth/`
- Windows: `{FOLDERID_RoamingAppData}/reth/`
- macOS: `$HOME/Library/Application Support/reth/`
[default: default]
--chunk-len <CHUNK_LEN>
Chunk byte length to read from file.
[default: 1GB]
-h, --help
Print help (see a summary with '-h')
Database:
--db.log-level <LOG_LEVEL>
Database logging level. Levels higher than "notice" require a debug build
Possible values:
- fatal: Enables logging for critical conditions, i.e. assertion failures
- error: Enables logging for error conditions
- warn: Enables logging for warning conditions
- notice: Enables logging for normal but significant condition
- verbose: Enables logging for verbose informational
- debug: Enables logging for debug-level messages
- trace: Enables logging for trace debug-level messages
- extra: Enables logging for extra debug-level messages
--db.exclusive <EXCLUSIVE>
Open environment in exclusive/monopolistic mode. Makes it possible to open a database on an NFS volume
[possible values: true, false]
<IMPORT_PATH>
The path to a receipts file for import. File must use `OpGethReceiptFileCodec` (used for
exporting OP chain segment below Bedrock block via testinprod/op-geth).
<https://github.com/testinprod-io/op-geth/pull/1>
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,95 +0,0 @@
# reth p2p body
Download block body
```bash
$ reth p2p body --help
```
```txt
Usage: reth p2p body [OPTIONS] <ID>
Arguments:
<ID>
The block number or hash
Options:
-h, --help
Print help (see a summary with '-h')
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,95 +0,0 @@
# reth p2p header
Download block header
```bash
$ reth p2p header --help
```
```txt
Usage: reth p2p header [OPTIONS] <ID>
Arguments:
<ID>
The header number or hash
Options:
-h, --help
Print help (see a summary with '-h')
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,95 +0,0 @@
# reth recover
Scripts for node recovery
```bash
$ reth recover --help
```
```txt
Usage: reth recover [OPTIONS] <COMMAND>
Commands:
storage-tries Recover the node by deleting dangling storage tries
help Print this message or the help of the given subcommand(s)
Options:
-h, --help
Print help (see a summary with '-h')
Logging:
--log.stdout.format <FORMAT>
The format to use for logs written to stdout
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.stdout.filter <FILTER>
The filter to use for logs written to stdout
[default: ]
--log.file.format <FORMAT>
The format to use for logs written to the log file
[default: terminal]
Possible values:
- json: Represents JSON formatting for logs. This format outputs log records as JSON objects, making it suitable for structured logging
- log-fmt: Represents logfmt (key=value) formatting for logs. This format is concise and human-readable, typically used in command-line applications
- terminal: Represents terminal-friendly formatting for logs
--log.file.filter <FILTER>
The filter to use for logs written to the log file
[default: debug]
--log.file.directory <PATH>
The path to put log files in
[default: <CACHE_DIR>/logs]
--log.file.max-size <SIZE>
The maximum size (in MB) of one log file
[default: 200]
--log.file.max-files <COUNT>
The maximum amount of log files that will be stored. If set to 0, background file logging is disabled
[default: 5]
--log.journald
Write logs to journald
--log.journald.filter <FILTER>
The filter to use for logs written to journald
[default: error]
--color <COLOR>
Sets whether or not the formatter emits ANSI terminal escape codes for colors and other text formatting
[default: always]
Possible values:
- always: Colors on
- auto: Colors on
- never: Colors off
Display:
-v, --verbosity...
Set the minimum log level.
-v Errors
-vv Warnings
-vvv Info
-vvvv Debug
-vvvvv Traces (warning: very verbose!)
-q, --quiet
Silence all log output
```

View File

@@ -1,16 +0,0 @@
#!/usr/bin/env bash
set -eo pipefail
BOOK_ROOT="$(dirname "$(dirname "$0")")"
RETH=${1:-"$(dirname "$BOOK_ROOT")/target/debug/reth"}
cmd=(
"$(dirname "$0")/help.rs"
--root-dir "$BOOK_ROOT/"
--root-indentation 2
--root-summary
--out-dir "$BOOK_ROOT/cli/"
"$RETH"
)
echo "Running: $" "${cmd[*]}"
"${cmd[@]}"

View File

@@ -1,9 +0,0 @@
# Contribute
<!-- TODO: Add various debugging tips and tricks we use, ways to configure logging, unwinding a node etc. -->
Reth has docs specifically geared for developers and contributors, including documentation on the structure and architecture of reth, the general workflow we employ, and other useful tips.
You can find these docs [here](https://github.com/paradigmxyz/reth/tree/main/docs).
Check out our contributing guidelines [here](https://github.com/paradigmxyz/reth/blob/main/CONTRIBUTING.md).

View File

@@ -1,3 +0,0 @@
# Developers
Reth is composed of several crates that can be used in standalone projects. If you are interested in using one or more of the crates, you can get an overview of them in the [developer docs](https://github.com/paradigmxyz/reth/tree/main/docs), or take a look at the [crate docs](https://paradigmxyz.github.io/reth/docs).

View File

@@ -1,31 +0,0 @@
# Execution Extensions (ExEx)
## What are Execution Extensions?
Execution Extensions (or ExExes, for short) allow developers to build their own infrastructure that relies on Reth
as a base for driving the chain (be it [Ethereum](../../run/mainnet.md) or [OP Stack](../../run/optimism.md)) forward.
An Execution Extension is a task that derives its state from changes in Reth's state.
Some examples of such state derivations are rollups, bridges, and indexers.
They are called Execution Extensions because the main trigger for them is the execution of new blocks (or reorgs of old blocks)
initiated by Reth.
Read more about things you can build with Execution Extensions in the [Paradigm blog](https://www.paradigm.xyz/2024/05/reth-exex).
## What Execution Extensions are not
Execution Extensions are not separate processes that connect to the main Reth node process.
Instead, ExExes are compiled into the same binary as Reth, and run alongside it, using shared memory for communication.
If you want to build an Execution Extension that sends data into a separate process, check out the [Remote](./remote.md) chapter.
## How do I build an Execution Extension?
Let's dive into how to build our own ExEx from scratch, add tests for it,
and run it on the Holesky testnet.
1. [How do ExExes work?](./how-it-works.md)
1. [Hello World](./hello-world.md)
1. [Tracking State](./tracking-state.md)
1. [Remote](./remote.md)

View File

@@ -1,26 +0,0 @@
# How do ExExes work?
ExExes are just [Futures](https://doc.rust-lang.org/std/future/trait.Future.html) that run indefinitely alongside Reth
as simple as that.
An ExEx is usually driven by and acts on new notifications about chain commits, reverts, and reorgs, but it can span beyond that.
They are installed into the node by using the [node builder](https://reth.rs/docs/reth/builder/struct.NodeBuilder.html).
Reth manages the lifecycle of all ExExes, including:
- Polling ExEx futures
- Sending [notifications](https://reth.rs/docs/reth_exex/enum.ExExNotification.html) about new chain, reverts,
and reorgs from historical and live sync
- Processing [events](https://reth.rs/docs/reth_exex/enum.ExExEvent.html) emitted by ExExes
- Pruning (in case of a full or pruned node) only the data that has been processed by all ExExes
- Shutting ExExes down when the node is shut down
## Pruning
Pruning deserves a special mention here.
ExExes **SHOULD** emit an [`ExExEvent::FinishedHeight`](https://reth.rs/docs/reth_exex/enum.ExExEvent.html#variant.FinishedHeight)
event to signify what blocks have been processed. This event is used by Reth to determine what state can be pruned.
An ExEx will only receive notifications for block numbers greater than the block in the most recently emitted `FinishedHeight` event.
To clarify: if an ExEx emits `ExExEvent::FinishedHeight` for `block #0` it will receive notifications for any `block_number > 0`.

View File

@@ -1,18 +0,0 @@
# Update Priorities
When publishing releases, reth will include an "Update Priority" section in the release notes, in the same manner Lighthouse does.
The "Update Priority" section will include a table which may appear like so:
| User Class | Priority |
|----------------------|-----------------|
| Payload Builders | Medium Priority |
| Non-Payload Builders | Low Priority |
To understand this table, the following terms are important:
- *Payload builders* are those who use reth to build and validate payloads.
- *Non-payload builders* are those who run reth for other purposes (e.g., data analysis, RPC or applications).
- *High priority* updates should be completed as soon as possible (e.g., hours or days).
- *Medium priority* updates should be completed at the next convenience (e.g., days or a week).
- *Low priority* updates should be completed in the next routine update cycle (e.g., two weeks).

View File

@@ -1,101 +0,0 @@
# `debug` Namespace
The `debug` API provides several methods to inspect the Ethereum state, including Geth-style traces.
## `debug_getRawHeader`
Returns an RLP-encoded header.
| Client | Method invocation |
|--------|-------------------------------------------------------|
| RPC | `{"method": "debug_getRawHeader", "params": [block]}` |
## `debug_getRawBlock`
Retrieves and returns the RLP encoded block by number, hash or tag.
| Client | Method invocation |
|--------|------------------------------------------------------|
| RPC | `{"method": "debug_getRawBlock", "params": [block]}` |
## `debug_getRawTransaction`
Returns an EIP-2718 binary-encoded transaction.
| Client | Method invocation |
|--------|--------------------------------------------------------------|
| RPC | `{"method": "debug_getRawTransaction", "params": [tx_hash]}` |
## `debug_getRawReceipts`
Returns an array of EIP-2718 binary-encoded receipts.
| Client | Method invocation |
|--------|---------------------------------------------------------|
| RPC | `{"method": "debug_getRawReceipts", "params": [block]}` |
## `debug_getBadBlocks`
Returns an array of recent bad blocks that the client has seen on the network.
| Client | Method invocation |
|--------|--------------------------------------------------|
| RPC | `{"method": "debug_getBadBlocks", "params": []}` |
## `debug_traceChain`
Returns the structured logs created during the execution of EVM between two blocks (excluding start) as a JSON object.
| Client | Method invocation |
|--------|----------------------------------------------------------------------|
| RPC | `{"method": "debug_traceChain", "params": [start_block, end_block]}` |
## `debug_traceBlock`
The `debug_traceBlock` method will return a full stack trace of all invoked opcodes of all transaction that were included in this block.
This expects an RLP-encoded block.
> **Note**
>
> The parent of this block must be present, or it will fail.
| Client | Method invocation |
|--------|---------------------------------------------------------|
| RPC | `{"method": "debug_traceBlock", "params": [rlp, opts]}` |
## `debug_traceBlockByHash`
Similar to [`debug_traceBlock`](#debug_traceblock), `debug_traceBlockByHash` accepts a block hash and will replay the block that is already present in the database.
| Client | Method invocation |
|--------|----------------------------------------------------------------------|
| RPC | `{"method": "debug_traceBlockByHash", "params": [block_hash, opts]}` |
## `debug_traceBlockByNumber`
Similar to [`debug_traceBlockByHash`](#debug_traceblockbyhash), `debug_traceBlockByNumber` accepts a block number and will replay the block that is already present in the database.
| Client | Method invocation |
|--------|--------------------------------------------------------------------------|
| RPC | `{"method": "debug_traceBlockByNumber", "params": [block_number, opts]}` |
## `debug_traceTransaction`
The `debug_traceTransaction` debugging method will attempt to run the transaction in the exact same manner as it was executed on the network. It will replay any transaction that may have been executed prior to this one before it will finally attempt to execute the transaction that corresponds to the given hash.
| Client | Method invocation |
|--------|-------------------------------------------------------------|
| RPC | `{"method": "debug_traceTransaction", "params": [tx_hash, opts]}` |
## `debug_traceCall`
The `debug_traceCall` method lets you run an `eth_call` within the context of the given block execution using the final state of parent block as the base.
The first argument (just as in `eth_call`) is a transaction request.
The block can optionally be specified either by hash or by number as the second argument.
| Client | Method invocation |
|--------|-----------------------------------------------------------------------|
| RPC | `{"method": "debug_traceCall", "params": [call, block_number, opts]}` |

View File

@@ -1,96 +0,0 @@
# Running Reth on Ethereum Mainnet or testnets
Reth is an [_execution client_](https://ethereum.org/en/developers/docs/nodes-and-clients/#execution-clients). After Ethereum's transition to Proof of Stake (aka the Merge) it became required to run a [_consensus client_](https://ethereum.org/en/developers/docs/nodes-and-clients/#consensus-clients) along your execution client in order to sync into any "post-Merge" network. This is because the Ethereum execution layer now outsources consensus to a separate component, known as the consensus client.
Consensus clients decide what blocks are part of the chain, while execution clients only validate that transactions and blocks are valid in themselves and with respect to the world state. In other words, execution clients execute blocks and transactions and check their validity, while consensus clients determine which valid blocks should be part of the chain. Therefore, running a consensus client in parallel with the execution client is necessary to ensure synchronization and participation in the network.
By running both an execution client like Reth and a consensus client, such as Lighthouse 🦀 (which we will assume for this guide), you can effectively contribute to the Ethereum network and participate in the consensus process, even if you don't intend to run validators.
| Client | Role |
|-------------|--------------------------------------------------|
| Execution | Validates transactions and blocks |
| | (checks their validity and global state) |
| Consensus | Determines which blocks are part of the chain |
| | (makes consensus decisions) |
## Running the Reth Node
First, ensure that you have Reth installed by following the [installation instructions][installation].
Now, to start the archive node, run:
```bash
reth node
```
And to start the full node, run:
```bash
reth node --full
```
On differences between archive and full nodes, see [Pruning & Full Node](./pruning.md#basic-concepts) section.
> Note that these commands will not open any HTTP/WS ports by default. You can change this by adding the `--http`, `--ws` flags, respectively and using the `--http.api` and `--ws.api` flags to enable various [JSON-RPC APIs](../jsonrpc/intro.md). For more commands, see the [`reth node` CLI reference](../cli/reth/node.md).
The EL <> CL communication happens over the [Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md), which is by default exposed at `http://localhost:8551`. The connection is authenticated over JWT using a JWT secret which is auto-generated by Reth and placed in a file called `jwt.hex` in the data directory, which on Linux by default is `$HOME/.local/share/reth/` (`/Users/<NAME>/Library/Application Support/reth/mainnet/jwt.hex` in Mac).
You can override this path using the `--authrpc.jwtsecret` option. You MUST use the same JWT secret in BOTH Reth and the chosen Consensus Layer. If you want to override the address or port, you can use the `--authrpc.addr` and `--authrpc.port` options, respectively.
So one might do:
```bash
reth node \
--authrpc.jwtsecret /path/to/secret \
--authrpc.addr 127.0.0.1 \
--authrpc.port 8551
```
At this point, our Reth node has started discovery, and even discovered some new peers. But it will not start syncing until you spin up the consensus layer!
## Running the Consensus Layer
First, make sure you have Lighthouse installed. Sigma Prime provides excellent [installation](https://lighthouse-book.sigmaprime.io/installation.html) and [node operation](https://lighthouse-book.sigmaprime.io/run_a_node.html) instructions.
Assuming you have done that, run:
```bash
lighthouse bn \
--checkpoint-sync-url https://mainnet.checkpoint.sigp.io \
--execution-endpoint http://localhost:8551 \
--execution-jwt /path/to/secret
```
If you don't intend on running validators on your node you can add:
``` bash
--disable-deposit-contract-sync
```
The `--checkpoint-sync-url` argument value can be replaced with any checkpoint sync endpoint from a [community maintained list](https://eth-clients.github.io/checkpoint-sync-endpoints/#mainnet).
Your Reth node should start receiving "fork choice updated" messages, and begin syncing the chain.
## Verify the chain is growing
You can easily verify that by inspecting the logs, and seeing that headers are arriving in Reth. Sit back now and wait for the stages to run!
In the meantime, consider setting up [observability](./observability.md) to monitor your node's health or [test the JSON RPC API](../jsonrpc/intro.md).
<!-- TODO: Add more logs to help node operators debug any weird CL to EL messages! -->
[installation]: ./../installation/installation.md
[docs]: https://github.com/paradigmxyz/reth/tree/main/docs
[metrics]: https://github.com/paradigmxyz/reth/blob/main/docs/design/metrics.md#current-metrics
## Running without a Consensus Layer
We provide a method for running Reth without a Consensus Layer via the `--debug.tip <HASH>` parameter. If you provide that to your node, it will simulate sending an `engine_forkchoiceUpdated` message _once_ and will trigger syncing to the provided block hash. This is useful for testing and debugging purposes, but in order to have a node that can keep up with the tip you'll need to run a CL alongside it. At the moment we have no plans of including a Consensus Layer implementation in Reth, and we are open to including light clients other methods of syncing like importing Lighthouse as a library.
## Running with Etherscan as Block Source
You can use `--debug.etherscan` to run Reth with a fake consensus client that advances the chain using recent blocks on Etherscan. This requires an Etherscan API key (set via `ETHERSCAN_API_KEY` environment variable). Optionally, specify a custom API URL with `--debug.etherscan <URL>`.
Example:
```bash
export ETHERSCAN_API_KEY=your_api_key_here
reth node --debug.etherscan
```

View File

@@ -1,38 +0,0 @@
# Ports
This section provides essential information about the ports used by the system, their primary purposes, and recommendations for exposure settings.
## Peering Ports
- **Port:** 30303
- **Protocol:** TCP and UDP
- **Purpose:** Peering with other nodes for synchronization of blockchain data. Nodes communicate through this port to maintain network consensus and share updated information.
- **Exposure Recommendation:** This port should be exposed to enable seamless interaction and synchronization with other nodes in the network.
## Metrics Port
- **Port:** 9001
- **Protocol:** TCP
- **Purpose:** This port is designated for serving metrics related to the system's performance and operation. It allows internal monitoring and data collection for analysis.
- **Exposure Recommendation:** By default, this port should not be exposed to the public. It is intended for internal monitoring and analysis purposes.
## HTTP RPC Port
- **Port:** 8545
- **Protocol:** TCP
- **Purpose:** Port 8545 provides an HTTP-based Remote Procedure Call (RPC) interface. It enables external applications to interact with the blockchain by sending requests over HTTP.
- **Exposure Recommendation:** Similar to the metrics port, exposing this port to the public is not recommended by default due to security considerations.
## WS RPC Port
- **Port:** 8546
- **Protocol:** TCP
- **Purpose:** Port 8546 offers a WebSocket-based Remote Procedure Call (RPC) interface. It allows real-time communication between external applications and the blockchain.
- **Exposure Recommendation:** As with the HTTP RPC port, the WS RPC port should not be exposed by default for security reasons.
## Engine API Port
- **Port:** 8551
- **Protocol:** TCP
- **Purpose:** Port 8551 facilitates communication between specific components, such as "reth" and "CL" (assuming their definitions are understood within the context of the system). It enables essential internal processes.
- **Exposure Recommendation:** This port is not meant to be exposed to the public by default. It should be reserved for internal communication between vital components of the system.

View File

@@ -1,15 +0,0 @@
# Run a Node
Congratulations, now that you have installed Reth, it's time to run it!
In this chapter we'll go through a few different topics you'll encounter when running Reth, including:
1. [Running on mainnet or official testnets](./mainnet.md)
1. [Running on OP Stack chains](./optimism.md)
1. [Logs and Observability](./observability.md)
1. [Configuring reth.toml](./config.md)
1. [Transaction types](./transactions.md)
1. [Pruning & Full Node](./pruning.md)
1. [Ports](./ports.md)
1. [Troubleshooting](./troubleshooting.md)
In the future, we also intend to support the [OP Stack](https://docs.optimism.io/get-started/superchain), which will allow you to run Reth as a Layer 2 client. More there soon!

View File

@@ -1,211 +0,0 @@
# Troubleshooting
This page tries to answer how to deal with the most popular issues.
- [Troubleshooting](#troubleshooting)
- [Database](#database)
- [Docker](#docker)
- [Error code 13](#error-code-13)
- [Slow database inserts and updates](#slow-database-inserts-and-updates)
- [Compact the database](#compact-the-database)
- [Re-sync from scratch](#re-sync-from-scratch)
- [Database write error](#database-write-error)
- [Concurrent database access error (using containers/Docker)](#concurrent-database-access-error-using-containersdocker)
- [Hardware Performance Testing](#hardware-performance-testing)
- [Disk Speed Testing with IOzone](#disk-speed-testing-with-iozone)
## Database
### Docker
Externally accessing a `datadir` inside a named docker volume will usually come with folder/file ownership/permissions issues.
**It is not recommended** to use the path to the named volume as it will trigger an error code 13. `RETH_DB_PATH: /var/lib/docker/volumes/named_volume/_data/eth/db cargo r --examples db-access --path ` is **DISCOURAGED** and a mounted volume with the right permissions should be used instead.
### Error code 13
`the environment opened in read-only code: 13`
Externally accessing a database in a read-only folder is not supported, **UNLESS** there's no `mdbx.lck` present, and it's called with `exclusive` on calling `open_db_read_only`. Meaning that there's no node syncing concurrently.
If the error persists, ensure that you have the right `rx` permissions on the `datadir` **and its parent** folders. Eg. the following command should succeed:
```bash,ignore
stat /full/path/datadir
```
### Slow database inserts and updates
If you're:
1. Running behind the tip
2. Have slow canonical commit time according to the `Canonical Commit Latency Time` chart on [Grafana dashboard](./observability.md#prometheus--grafana) (more than 2-3 seconds)
3. Seeing warnings in your logs such as
```console
2023-11-08T15:17:24.789731Z WARN providers::db: Transaction insertion took too long block_number=18528075 tx_num=2150227643 hash=0xb7de1d6620efbdd3aa8547c47a0ff09a7fd3e48ba3fd2c53ce94c6683ed66e7c elapsed=6.793759034s
```
then most likely you're experiencing issues with the [database freelist](https://github.com/paradigmxyz/reth/issues/5228).
To confirm it, check if the values on the `Freelist` chart on [Grafana dashboard](./observability.md#prometheus--grafana)
is greater than 10M.
Currently, there are two main ways to fix this issue.
#### Compact the database
It will take around 5-6 hours and require **additional** disk space located on the same or different drive
equal to the [freshly synced node](../installation/installation.md#hardware-requirements).
1. Clone Reth
```bash
git clone https://github.com/paradigmxyz/reth
cd reth
```
2. Build database debug tools
```bash
make db-tools
```
3. Run compaction (this step will take 5-6 hours, depending on the I/O speed)
```bash
./db-tools/mdbx_copy -c $(reth db path) reth_compact.dat
```
4. Stop Reth
5. Backup original database
```bash
mv $(reth db path)/mdbx.dat reth_old.dat
```
6. Move compacted database in place of the original database
```bash
mv reth_compact.dat $(reth db path)/mdbx.dat
```
7. Start Reth
8. Confirm that the values on the `Freelist` chart are near zero and the values on the `Canonical Commit Latency Time` chart
is less than 1 second.
9. Delete original database
```bash
rm reth_old.dat
```
#### Re-sync from scratch
It will take the same time as initial sync.
1. Stop Reth
2. Drop the database using [`reth db drop`](../cli/reth/db/drop.md)
3. Start reth
### Database write error
If you encounter an irrecoverable database-related errors, in most of the cases it's related to the RAM/NVMe/SSD you use. For example:
```console
Error: A stage encountered an irrecoverable error.
Caused by:
0: An internal database error occurred: Database write error code: -30796
1: Database write error code: -30796
```
or
```console
Error: A stage encountered an irrecoverable error.
Caused by:
0: An internal database error occurred: Database read error code: -30797
1: Database read error code: -30797
```
1. Check your memory health: use [memtest86+](https://www.memtest.org/) or [memtester](https://linux.die.net/man/8/memtester). If your memory is faulty, it's better to resync the node on different hardware.
2. Check database integrity:
```bash
git clone https://github.com/paradigmxyz/reth
cd reth
make db-tools
./db-tools/mdbx_chk $(reth db path)/mdbx.dat | tee mdbx_chk.log
```
If `mdbx_chk` has detected any errors, please [open an issue](https://github.com/paradigmxyz/reth/issues) and post the output from the `mdbx_chk.log` file.
### Concurrent database access error (using containers/Docker)
If you encounter an error while accessing the database from multiple processes and you are using multiple containers or a mix of host and container(s), it is possible the error is related to `PID` namespaces. You might see one of the following error messages.
```console
mdbx:0: panic: Assertion `osal_rdt_unlock() failed: err 1' failed.
```
or
```console
pthread_mutex_lock.c:438: __pthread_mutex_lock_full: Assertion `e != ESRCH || !robust' failed
```
If you are using Docker, a possible solution is to run all database-accessing containers with `--pid=host` flag.
For more information, check out the `Containers` section in the [libmdbx README](https://github.com/erthink/libmdbx#containers).
## Hardware Performance Testing
If you're experiencing degraded performance, it may be related to hardware issues. Below are some tools and tests you can run to evaluate your hardware performance.
If your hardware performance is significantly lower than these reference numbers, it may explain degraded node performance. Consider upgrading your hardware or investigating potential issues with your current setup.
### Disk Speed Testing with [IOzone](https://linux.die.net/man/1/iozone)
1. Test disk speed:
```bash
iozone -e -t1 -i0 -i2 -r1k -s1g /tmp
```
Reference numbers (on Latitude c3.large.x86):
```console
Children see throughput for 1 initial writers = 907733.81 kB/sec
Parent sees throughput for 1 initial writers = 907239.68 kB/sec
Children see throughput for 1 rewriters = 1765222.62 kB/sec
Parent sees throughput for 1 rewriters = 1763433.35 kB/sec
Children see throughput for 1 random readers = 1557497.38 kB/sec
Parent sees throughput for 1 random readers = 1554846.58 kB/sec
Children see throughput for 1 random writers = 984428.69 kB/sec
Parent sees throughput for 1 random writers = 983476.67 kB/sec
```
2. Test disk speed with memory-mapped files:
```bash
iozone -B -G -e -t1 -i0 -i2 -r1k -s1g /tmp
```
Reference numbers (on Latitude c3.large.x86):
```console
Children see throughput for 1 initial writers = 56471.06 kB/sec
Parent sees throughput for 1 initial writers = 56365.14 kB/sec
Children see throughput for 1 rewriters = 241650.69 kB/sec
Parent sees throughput for 1 rewriters = 239067.96 kB/sec
Children see throughput for 1 random readers = 6833161.00 kB/sec
Parent sees throughput for 1 random readers = 5597659.65 kB/sec
Children see throughput for 1 random writers = 220248.53 kB/sec
Parent sees throughput for 1 random writers = 219112.26 kB/sec
```
### RAM Speed and Health Testing
1. Check RAM speed with [lshw](https://linux.die.net/man/1/lshw):
```bash
sudo lshw -short -C memory
```
Look for the frequency in the output. Reference output:
```console
H/W path Device Class Description
================================================================
/0/24/0 memory 64GiB DIMM DDR4 Synchronous Registered (Buffered) 3200 MHz (0.3 ns)
/0/24/1 memory 64GiB DIMM DDR4 Synchronous Registered (Buffered) 3200 MHz (0.3 ns)
...
```
2. Test RAM health with [memtester](https://linux.die.net/man/8/memtester):
```bash
sudo memtester 10G
```
This will take a while. You can test with a smaller amount first:
```bash
sudo memtester 1G 1
```
All checks should report "ok".

Some files were not shown because too many files have changed in this diff Show More