Skip to content

chore: remove merge transition code - #8680

Merged
twoeths merged 23 commits into
unstablefrom
nflaig/remove-merge-transition
Dec 12, 2025
Merged

chore: remove merge transition code#8680
twoeths merged 23 commits into
unstablefrom
nflaig/remove-merge-transition

Conversation

@nflaig

@nflaig nflaig commented Dec 10, 2025

Copy link
Copy Markdown
Member

Motiviation

All networks have completed the merge transition and most execution clients no longer support pre-merge so it's not even possible anymore to run a network from a genesis before bellatrix, unless you keep it to phase0/altair only, which still works after this PR is merged.

This code is effectively tech debt, no longer exercised and just gets in the way when doing refactors.

Description

Removes all code related to performing the merge transition. Running the node pre-merge (CL only mode) is still possible and syncing still works. Also removed a few CLI flags we added for the merge specifically, those shouldn't be used anymore. Spec constants like TERMINAL_TOTAL_DIFFICULTY are kept for spec compliance and ssz types (like PowBlock) as well. I had to disable a few spec tests related to handling the merge block since those code paths are removed.

Closes #8661

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @nflaig, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request performs a significant cleanup by eliminating all code, configurations, and tests pertaining to the Ethereum Merge transition. Since the network has successfully transitioned to Proof-of-Stake, the complex logic required to manage the PoW-to-PoS switch is no longer necessary. This change simplifies the codebase, reduces maintenance overhead, and removes obsolete features, ensuring the client focuses solely on post-Merge operations.

Highlights

  • Codebase Cleanup: All code, configurations, and test infrastructure related to the Ethereum Merge transition (Proof-of-Work to Proof-of-Stake) have been removed. This includes logic for tracking the terminal PoW block, handling optimistic sync during the merge, and associated metrics.
  • Dependency Simplification: The Eth1MergeBlockTracker class and its related interfaces, which were responsible for Eth1 chain interactions specific to the Merge, have been entirely eliminated, simplifying the Eth1 integration layer.
  • Monitoring and Testing Refinement: Prometheus metrics and Grafana dashboard panels that monitored merge-specific events have been removed or updated. Numerous test files and scripts simulating the merge transition have also been deleted or refactored.
  • Configuration Streamlining: Obsolete command-line interface options and internal configuration parameters pertaining to terminal PoW difficulty, block hash overrides, and optimistic sync slots have been removed.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/test-sim-merge.yml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request is a comprehensive cleanup of code related to the Ethereum merge transition. It successfully removes a significant amount of obsolete logic, including the Eth1MergeBlockTracker, pre-merge conditional paths in block verification and production, and merge-specific test infrastructure. The changes span across application logic, tests, metrics, and configuration, resulting in a much simpler and more maintainable codebase that is purely focused on the post-merge state of the chain. The refactoring is well-executed and consistent throughout the project. I have reviewed the changes and found no issues.

@github-actions

github-actions Bot commented Dec 10, 2025

Copy link
Copy Markdown
Contributor

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: 3a2a276 Previous: f231d7e Ratio
500 bytes - uncompress - snappyjs 2.0637 us/op 14.063 us/op 0.15
Full benchmark results
Benchmark suite Current: 3a2a276 Previous: f231d7e Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0450 ms/op 1.2034 ms/op 0.87
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 38.588 us/op 37.315 us/op 1.03
BLS verify - blst 1.4316 ms/op 729.87 us/op 1.96
BLS verifyMultipleSignatures 3 - blst 1.2777 ms/op 1.1651 ms/op 1.10
BLS verifyMultipleSignatures 8 - blst 2.0594 ms/op 1.6261 ms/op 1.27
BLS verifyMultipleSignatures 32 - blst 5.7176 ms/op 4.7787 ms/op 1.20
BLS verifyMultipleSignatures 64 - blst 10.814 ms/op 8.9534 ms/op 1.21
BLS verifyMultipleSignatures 128 - blst 17.325 ms/op 17.000 ms/op 1.02
BLS deserializing 10000 signatures 696.21 ms/op 683.45 ms/op 1.02
BLS deserializing 100000 signatures 6.9387 s/op 6.8520 s/op 1.01
BLS verifyMultipleSignatures - same message - 3 - blst 846.97 us/op 912.50 us/op 0.93
BLS verifyMultipleSignatures - same message - 8 - blst 1.0246 ms/op 1.0429 ms/op 0.98
BLS verifyMultipleSignatures - same message - 32 - blst 1.6883 ms/op 1.6991 ms/op 0.99
BLS verifyMultipleSignatures - same message - 64 - blst 2.6161 ms/op 2.6115 ms/op 1.00
BLS verifyMultipleSignatures - same message - 128 - blst 4.4136 ms/op 4.3746 ms/op 1.01
BLS aggregatePubkeys 32 - blst 21.904 us/op 19.445 us/op 1.13
BLS aggregatePubkeys 128 - blst 70.397 us/op 69.426 us/op 1.01
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 49.078 ms/op 41.835 ms/op 1.17
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 39.340 ms/op 37.041 ms/op 1.06
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 34.248 ms/op 31.311 ms/op 1.09
getSlashingsAndExits - default max 78.072 us/op 69.582 us/op 1.12
getSlashingsAndExits - 2k 331.75 us/op 315.02 us/op 1.05
isKnown best case - 1 super set check 206.00 ns/op 204.00 ns/op 1.01
isKnown normal case - 2 super set checks 199.00 ns/op 202.00 ns/op 0.99
isKnown worse case - 16 super set checks 199.00 ns/op 200.00 ns/op 0.99
InMemoryCheckpointStateCache - add get delete 2.4340 us/op 2.3160 us/op 1.05
validate api signedAggregateAndProof - struct 1.3958 ms/op 1.3750 ms/op 1.02
validate gossip signedAggregateAndProof - struct 2.5753 ms/op 1.3643 ms/op 1.89
batch validate gossip attestation - vc 640000 - chunk 32 117.29 us/op 114.60 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 64 103.49 us/op 101.43 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 128 96.498 us/op 96.607 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 256 91.724 us/op 90.238 us/op 1.02
pickEth1Vote - no votes 964.04 us/op 954.00 us/op 1.01
pickEth1Vote - max votes 5.2482 ms/op 4.9280 ms/op 1.06
pickEth1Vote - Eth1Data hashTreeRoot value x2048 10.430 ms/op 9.8776 ms/op 1.06
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 13.844 ms/op 13.440 ms/op 1.03
pickEth1Vote - Eth1Data fastSerialize value x2048 392.49 us/op 413.06 us/op 0.95
pickEth1Vote - Eth1Data fastSerialize tree x2048 2.4042 ms/op 2.4184 ms/op 0.99
bytes32 toHexString 345.00 ns/op 363.00 ns/op 0.95
bytes32 Buffer.toString(hex) 235.00 ns/op 224.00 ns/op 1.05
bytes32 Buffer.toString(hex) from Uint8Array 321.00 ns/op 303.00 ns/op 1.06
bytes32 Buffer.toString(hex) + 0x 237.00 ns/op 226.00 ns/op 1.05
Object access 1 prop 0.11100 ns/op 0.11800 ns/op 0.94
Map access 1 prop 0.12700 ns/op 0.11600 ns/op 1.09
Object get x1000 5.3150 ns/op 5.2090 ns/op 1.02
Map get x1000 0.36700 ns/op 0.37300 ns/op 0.98
Object set x1000 28.288 ns/op 28.468 ns/op 0.99
Map set x1000 19.777 ns/op 20.348 ns/op 0.97
Return object 10000 times 0.23350 ns/op 0.22960 ns/op 1.02
Throw Error 10000 times 4.1322 us/op 3.9521 us/op 1.05
toHex 129.92 ns/op 124.64 ns/op 1.04
Buffer.from 122.10 ns/op 115.40 ns/op 1.06
shared Buffer 85.346 ns/op 78.096 ns/op 1.09
fastMsgIdFn sha256 / 200 bytes 1.8460 us/op 1.8190 us/op 1.01
fastMsgIdFn h32 xxhash / 200 bytes 231.00 ns/op 194.00 ns/op 1.19
fastMsgIdFn h64 xxhash / 200 bytes 301.00 ns/op 254.00 ns/op 1.19
fastMsgIdFn sha256 / 1000 bytes 6.0180 us/op 5.9770 us/op 1.01
fastMsgIdFn h32 xxhash / 1000 bytes 285.00 ns/op 287.00 ns/op 0.99
fastMsgIdFn h64 xxhash / 1000 bytes 297.00 ns/op 303.00 ns/op 0.98
fastMsgIdFn sha256 / 10000 bytes 52.075 us/op 52.016 us/op 1.00
fastMsgIdFn h32 xxhash / 10000 bytes 1.3650 us/op 1.3610 us/op 1.00
fastMsgIdFn h64 xxhash / 10000 bytes 895.00 ns/op 882.00 ns/op 1.01
100 bytes - compress - snappyjs 1.1916 us/op 1.2302 us/op 0.97
100 bytes - compress - snappy 1.1556 us/op 1.1597 us/op 1.00
100 bytes - compress - snappy-wasm 653.75 ns/op 1.0540 us/op 0.62
100 bytes - compress - snappy-wasm - prealloc 1.1775 us/op 2.0620 us/op 0.57
200 bytes - compress - snappyjs 1.6400 us/op 1.5642 us/op 1.05
200 bytes - compress - snappy 1.3830 us/op 1.7064 us/op 0.81
200 bytes - compress - snappy-wasm 829.46 ns/op 797.38 ns/op 1.04
200 bytes - compress - snappy-wasm - prealloc 1.0997 us/op 1.8737 us/op 0.59
300 bytes - compress - snappyjs 1.8056 us/op 2.0973 us/op 0.86
300 bytes - compress - snappy 1.4394 us/op 1.6341 us/op 0.88
300 bytes - compress - snappy-wasm 1.0846 us/op 838.69 ns/op 1.29
300 bytes - compress - snappy-wasm - prealloc 1.2455 us/op 1.5361 us/op 0.81
400 bytes - compress - snappyjs 2.3322 us/op 2.9146 us/op 0.80
400 bytes - compress - snappy 1.5016 us/op 2.1167 us/op 0.71
400 bytes - compress - snappy-wasm 1.0502 us/op 921.20 ns/op 1.14
400 bytes - compress - snappy-wasm - prealloc 1.6578 us/op 1.7906 us/op 0.93
500 bytes - compress - snappyjs 2.4333 us/op 3.0421 us/op 0.80
500 bytes - compress - snappy 1.4718 us/op 1.5131 us/op 0.97
500 bytes - compress - snappy-wasm 976.25 ns/op 1.0267 us/op 0.95
500 bytes - compress - snappy-wasm - prealloc 1.8380 us/op 1.1828 us/op 1.55
1000 bytes - compress - snappyjs 4.8560 us/op 4.5352 us/op 1.07
1000 bytes - compress - snappy 1.8184 us/op 1.9046 us/op 0.95
1000 bytes - compress - snappy-wasm 1.7268 us/op 1.5952 us/op 1.08
1000 bytes - compress - snappy-wasm - prealloc 2.1166 us/op 1.9728 us/op 1.07
10000 bytes - compress - snappyjs 26.219 us/op 25.216 us/op 1.04
10000 bytes - compress - snappy 36.043 us/op 25.417 us/op 1.42
10000 bytes - compress - snappy-wasm 21.544 us/op 19.911 us/op 1.08
10000 bytes - compress - snappy-wasm - prealloc 34.800 us/op 30.652 us/op 1.14
100 bytes - uncompress - snappyjs 724.24 ns/op 813.72 ns/op 0.89
100 bytes - uncompress - snappy 1.1822 us/op 1.2043 us/op 0.98
100 bytes - uncompress - snappy-wasm 672.10 ns/op 637.91 ns/op 1.05
100 bytes - uncompress - snappy-wasm - prealloc 830.79 ns/op 826.59 ns/op 1.01
200 bytes - uncompress - snappyjs 977.82 ns/op 1.2716 us/op 0.77
200 bytes - uncompress - snappy 1.3275 us/op 1.2696 us/op 1.05
200 bytes - uncompress - snappy-wasm 1.2964 us/op 1.4461 us/op 0.90
200 bytes - uncompress - snappy-wasm - prealloc 963.24 ns/op 1.6576 us/op 0.58
300 bytes - uncompress - snappyjs 1.5701 us/op 977.78 ns/op 1.61
300 bytes - uncompress - snappy 1.6308 us/op 1.3007 us/op 1.25
300 bytes - uncompress - snappy-wasm 822.26 ns/op 723.14 ns/op 1.14
300 bytes - uncompress - snappy-wasm - prealloc 1.3731 us/op 1.0774 us/op 1.27
400 bytes - uncompress - snappyjs 1.2130 us/op 1.1856 us/op 1.02
400 bytes - uncompress - snappy 1.6872 us/op 1.5433 us/op 1.09
400 bytes - uncompress - snappy-wasm 1.0827 us/op 1.0066 us/op 1.08
400 bytes - uncompress - snappy-wasm - prealloc 1.1983 us/op 1.2529 us/op 0.96
500 bytes - uncompress - snappyjs 2.0637 us/op 14.063 us/op 0.15
500 bytes - uncompress - snappy 1.4227 us/op 1.5367 us/op 0.93
500 bytes - uncompress - snappy-wasm 1.3003 us/op 957.80 ns/op 1.36
500 bytes - uncompress - snappy-wasm - prealloc 1.2217 us/op 1.4693 us/op 0.83
1000 bytes - uncompress - snappyjs 2.4357 us/op 2.6582 us/op 0.92
1000 bytes - uncompress - snappy 1.5097 us/op 1.7085 us/op 0.88
1000 bytes - uncompress - snappy-wasm 1.1803 us/op 1.1318 us/op 1.04
1000 bytes - uncompress - snappy-wasm - prealloc 1.1515 us/op 1.8794 us/op 0.61
10000 bytes - uncompress - snappyjs 25.685 us/op 20.587 us/op 1.25
10000 bytes - uncompress - snappy 22.016 us/op 23.975 us/op 0.92
10000 bytes - uncompress - snappy-wasm 17.350 us/op 17.464 us/op 0.99
10000 bytes - uncompress - snappy-wasm - prealloc 17.667 us/op 20.606 us/op 0.86
send data - 1000 256B messages 13.745 ms/op 16.811 ms/op 0.82
send data - 1000 512B messages 16.661 ms/op 18.603 ms/op 0.90
send data - 1000 1024B messages 22.221 ms/op 25.013 ms/op 0.89
send data - 1000 1200B messages 26.161 ms/op 26.541 ms/op 0.99
send data - 1000 2048B messages 26.033 ms/op 35.485 ms/op 0.73
send data - 1000 4096B messages 36.627 ms/op 39.453 ms/op 0.93
send data - 1000 16384B messages 105.20 ms/op 102.62 ms/op 1.03
send data - 1000 65536B messages 218.30 ms/op 331.83 ms/op 0.66
enrSubnets - fastDeserialize 64 bits 870.00 ns/op 903.00 ns/op 0.96
enrSubnets - ssz BitVector 64 bits 395.00 ns/op 343.00 ns/op 1.15
enrSubnets - fastDeserialize 4 bits 165.00 ns/op 130.00 ns/op 1.27
enrSubnets - ssz BitVector 4 bits 352.00 ns/op 344.00 ns/op 1.02
prioritizePeers score -10:0 att 32-0.1 sync 2-0 232.29 us/op 228.36 us/op 1.02
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 262.83 us/op 257.65 us/op 1.02
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 396.75 us/op 373.16 us/op 1.06
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 765.70 us/op 712.67 us/op 1.07
prioritizePeers score 0:0 att 64-1 sync 4-1 940.20 us/op 850.63 us/op 1.11
array of 16000 items push then shift 1.6131 us/op 1.6360 us/op 0.99
LinkedList of 16000 items push then shift 7.4350 ns/op 7.5780 ns/op 0.98
array of 16000 items push then pop 80.709 ns/op 77.288 ns/op 1.04
LinkedList of 16000 items push then pop 7.1790 ns/op 7.3700 ns/op 0.97
array of 24000 items push then shift 2.4133 us/op 2.4130 us/op 1.00
LinkedList of 24000 items push then shift 7.5360 ns/op 7.8230 ns/op 0.96
array of 24000 items push then pop 109.60 ns/op 110.65 ns/op 0.99
LinkedList of 24000 items push then pop 7.1140 ns/op 7.4570 ns/op 0.95
intersect bitArray bitLen 8 5.6570 ns/op 5.7720 ns/op 0.98
intersect array and set length 8 33.744 ns/op 39.479 ns/op 0.85
intersect bitArray bitLen 128 28.911 ns/op 27.871 ns/op 1.04
intersect array and set length 128 543.58 ns/op 704.13 ns/op 0.77
bitArray.getTrueBitIndexes() bitLen 128 1.1890 us/op 1.0230 us/op 1.16
bitArray.getTrueBitIndexes() bitLen 248 2.1790 us/op 1.8040 us/op 1.21
bitArray.getTrueBitIndexes() bitLen 512 3.7520 us/op 3.9000 us/op 0.96
Full columns - reconstruct all 6 blobs 274.09 us/op 280.27 us/op 0.98
Full columns - reconstruct half of the blobs out of 6 120.92 us/op 112.61 us/op 1.07
Full columns - reconstruct single blob out of 6 31.916 us/op 42.545 us/op 0.75
Half columns - reconstruct all 6 blobs 268.01 ms/op 281.12 ms/op 0.95
Half columns - reconstruct half of the blobs out of 6 135.19 ms/op 142.19 ms/op 0.95
Half columns - reconstruct single blob out of 6 50.286 ms/op 55.899 ms/op 0.90
Full columns - reconstruct all 10 blobs 422.04 us/op 366.25 us/op 1.15
Full columns - reconstruct half of the blobs out of 10 155.63 us/op 157.54 us/op 0.99
Full columns - reconstruct single blob out of 10 31.731 us/op 32.837 us/op 0.97
Half columns - reconstruct all 10 blobs 442.54 ms/op 461.37 ms/op 0.96
Half columns - reconstruct half of the blobs out of 10 225.92 ms/op 234.04 ms/op 0.97
Half columns - reconstruct single blob out of 10 50.395 ms/op 51.742 ms/op 0.97
Full columns - reconstruct all 20 blobs 539.20 us/op 835.89 us/op 0.65
Full columns - reconstruct half of the blobs out of 20 290.59 us/op 310.73 us/op 0.94
Full columns - reconstruct single blob out of 20 31.584 us/op 33.282 us/op 0.95
Half columns - reconstruct all 20 blobs 888.82 ms/op 931.72 ms/op 0.95
Half columns - reconstruct half of the blobs out of 20 453.13 ms/op 465.94 ms/op 0.97
Half columns - reconstruct single blob out of 20 49.433 ms/op 52.359 ms/op 0.94
Set add up to 64 items then delete first 2.0168 us/op 2.4873 us/op 0.81
OrderedSet add up to 64 items then delete first 3.0162 us/op 3.5360 us/op 0.85
Set add up to 64 items then delete last 2.3128 us/op 2.5104 us/op 0.92
OrderedSet add up to 64 items then delete last 3.3146 us/op 3.9519 us/op 0.84
Set add up to 64 items then delete middle 2.3302 us/op 2.5840 us/op 0.90
OrderedSet add up to 64 items then delete middle 4.8912 us/op 5.5092 us/op 0.89
Set add up to 128 items then delete first 4.7980 us/op 5.2764 us/op 0.91
OrderedSet add up to 128 items then delete first 7.2003 us/op 7.6263 us/op 0.94
Set add up to 128 items then delete last 4.6334 us/op 5.2469 us/op 0.88
OrderedSet add up to 128 items then delete last 6.8258 us/op 7.4487 us/op 0.92
Set add up to 128 items then delete middle 4.4847 us/op 4.8648 us/op 0.92
OrderedSet add up to 128 items then delete middle 13.266 us/op 14.009 us/op 0.95
Set add up to 256 items then delete first 10.103 us/op 9.9028 us/op 1.02
OrderedSet add up to 256 items then delete first 15.116 us/op 14.783 us/op 1.02
Set add up to 256 items then delete last 9.4929 us/op 9.7239 us/op 0.98
OrderedSet add up to 256 items then delete last 14.224 us/op 14.901 us/op 0.95
Set add up to 256 items then delete middle 9.3756 us/op 9.7033 us/op 0.97
OrderedSet add up to 256 items then delete middle 40.604 us/op 42.112 us/op 0.96
pass gossip attestations to forkchoice per slot 2.4841 ms/op 2.6274 ms/op 0.95
forkChoice updateHead vc 100000 bc 64 eq 0 467.10 us/op 476.08 us/op 0.98
forkChoice updateHead vc 600000 bc 64 eq 0 2.7812 ms/op 2.8255 ms/op 0.98
forkChoice updateHead vc 1000000 bc 64 eq 0 4.6449 ms/op 4.8721 ms/op 0.95
forkChoice updateHead vc 600000 bc 320 eq 0 2.7901 ms/op 2.9013 ms/op 0.96
forkChoice updateHead vc 600000 bc 1200 eq 0 2.8168 ms/op 3.0730 ms/op 0.92
forkChoice updateHead vc 600000 bc 7200 eq 0 3.1376 ms/op 3.2320 ms/op 0.97
forkChoice updateHead vc 600000 bc 64 eq 1000 3.3265 ms/op 3.4351 ms/op 0.97
forkChoice updateHead vc 600000 bc 64 eq 10000 3.4347 ms/op 3.5880 ms/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 300000 8.7978 ms/op 9.4176 ms/op 0.93
computeDeltas 1400000 validators 0% inactive 14.198 ms/op 14.801 ms/op 0.96
computeDeltas 1400000 validators 10% inactive 13.429 ms/op 13.762 ms/op 0.98
computeDeltas 1400000 validators 20% inactive 12.564 ms/op 12.846 ms/op 0.98
computeDeltas 1400000 validators 50% inactive 9.7903 ms/op 9.8162 ms/op 1.00
computeDeltas 2100000 validators 0% inactive 21.995 ms/op 22.095 ms/op 1.00
computeDeltas 2100000 validators 10% inactive 28.078 ms/op 22.710 ms/op 1.24
computeDeltas 2100000 validators 20% inactive 19.233 ms/op 19.163 ms/op 1.00
computeDeltas 2100000 validators 50% inactive 14.831 ms/op 14.942 ms/op 0.99
altair processAttestation - 250000 vs - 7PWei normalcase 2.0381 ms/op 1.9035 ms/op 1.07
altair processAttestation - 250000 vs - 7PWei worstcase 2.8460 ms/op 2.8730 ms/op 0.99
altair processAttestation - setStatus - 1/6 committees join 119.85 us/op 119.14 us/op 1.01
altair processAttestation - setStatus - 1/3 committees join 234.11 us/op 228.46 us/op 1.02
altair processAttestation - setStatus - 1/2 committees join 327.30 us/op 317.91 us/op 1.03
altair processAttestation - setStatus - 2/3 committees join 423.09 us/op 415.12 us/op 1.02
altair processAttestation - setStatus - 4/5 committees join 568.74 us/op 569.17 us/op 1.00
altair processAttestation - setStatus - 100% committees join 686.09 us/op 672.02 us/op 1.02
altair processBlock - 250000 vs - 7PWei normalcase 3.6335 ms/op 4.3592 ms/op 0.83
altair processBlock - 250000 vs - 7PWei normalcase hashState 18.916 ms/op 17.051 ms/op 1.11
altair processBlock - 250000 vs - 7PWei worstcase 28.650 ms/op 22.541 ms/op 1.27
altair processBlock - 250000 vs - 7PWei worstcase hashState 58.467 ms/op 55.637 ms/op 1.05
phase0 processBlock - 250000 vs - 7PWei normalcase 2.8194 ms/op 1.6430 ms/op 1.72
phase0 processBlock - 250000 vs - 7PWei worstcase 31.112 ms/op 19.273 ms/op 1.61
altair processEth1Data - 250000 vs - 7PWei normalcase 342.73 us/op 362.79 us/op 0.94
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 11.575 us/op 7.5900 us/op 1.53
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 59.551 us/op 42.018 us/op 1.42
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 12.929 us/op 11.748 us/op 1.10
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 10.639 us/op 7.2050 us/op 1.48
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 245.39 us/op 156.57 us/op 1.57
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 2.6457 ms/op 1.9310 ms/op 1.37
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.3470 ms/op 2.4487 ms/op 0.96
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.3289 ms/op 2.4620 ms/op 0.95
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.5552 ms/op 4.7689 ms/op 0.96
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.3752 ms/op 2.7184 ms/op 0.87
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.7128 ms/op 4.9196 ms/op 0.96
Tree 40 250000 create 385.22 ms/op 358.15 ms/op 1.08
Tree 40 250000 get(125000) 125.62 ns/op 123.27 ns/op 1.02
Tree 40 250000 set(125000) 1.2300 us/op 1.2233 us/op 1.01
Tree 40 250000 toArray() 13.641 ms/op 13.343 ms/op 1.02
Tree 40 250000 iterate all - toArray() + loop 13.376 ms/op 13.265 ms/op 1.01
Tree 40 250000 iterate all - get(i) 44.533 ms/op 41.824 ms/op 1.06
Array 250000 create 2.5732 ms/op 2.5472 ms/op 1.01
Array 250000 clone - spread 841.37 us/op 823.78 us/op 1.02
Array 250000 get(125000) 0.34700 ns/op 0.35200 ns/op 0.99
Array 250000 set(125000) 0.34900 ns/op 0.35700 ns/op 0.98
Array 250000 iterate all - loop 62.807 us/op 61.581 us/op 1.02
phase0 afterProcessEpoch - 250000 vs - 7PWei 41.899 ms/op 41.661 ms/op 1.01
Array.fill - length 1000000 2.8934 ms/op 2.8354 ms/op 1.02
Array push - length 1000000 12.259 ms/op 10.187 ms/op 1.20
Array.get 0.22090 ns/op 0.21900 ns/op 1.01
Uint8Array.get 0.22350 ns/op 0.22117 ns/op 1.01
phase0 beforeProcessEpoch - 250000 vs - 7PWei 14.009 ms/op 18.114 ms/op 0.77
altair processEpoch - mainnet_e81889 266.13 ms/op 268.05 ms/op 0.99
mainnet_e81889 - altair beforeProcessEpoch 17.617 ms/op 16.057 ms/op 1.10
mainnet_e81889 - altair processJustificationAndFinalization 5.3280 us/op 5.4470 us/op 0.98
mainnet_e81889 - altair processInactivityUpdates 3.7745 ms/op 3.8312 ms/op 0.99
mainnet_e81889 - altair processRewardsAndPenalties 18.907 ms/op 17.966 ms/op 1.05
mainnet_e81889 - altair processRegistryUpdates 633.00 ns/op 642.00 ns/op 0.99
mainnet_e81889 - altair processSlashings 166.00 ns/op 166.00 ns/op 1.00
mainnet_e81889 - altair processEth1DataReset 173.00 ns/op 164.00 ns/op 1.05
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.6608 ms/op 1.9107 ms/op 0.87
mainnet_e81889 - altair processSlashingsReset 795.00 ns/op 815.00 ns/op 0.98
mainnet_e81889 - altair processRandaoMixesReset 1.2840 us/op 1.0660 us/op 1.20
mainnet_e81889 - altair processHistoricalRootsUpdate 172.00 ns/op 163.00 ns/op 1.06
mainnet_e81889 - altair processParticipationFlagUpdates 488.00 ns/op 508.00 ns/op 0.96
mainnet_e81889 - altair processSyncCommitteeUpdates 125.00 ns/op 131.00 ns/op 0.95
mainnet_e81889 - altair afterProcessEpoch 43.736 ms/op 43.934 ms/op 1.00
capella processEpoch - mainnet_e217614 798.68 ms/op 806.89 ms/op 0.99
mainnet_e217614 - capella beforeProcessEpoch 57.517 ms/op 60.312 ms/op 0.95
mainnet_e217614 - capella processJustificationAndFinalization 5.5150 us/op 5.9960 us/op 0.92
mainnet_e217614 - capella processInactivityUpdates 14.469 ms/op 15.764 ms/op 0.92
mainnet_e217614 - capella processRewardsAndPenalties 98.692 ms/op 103.73 ms/op 0.95
mainnet_e217614 - capella processRegistryUpdates 6.2150 us/op 6.4300 us/op 0.97
mainnet_e217614 - capella processSlashings 162.00 ns/op 168.00 ns/op 0.96
mainnet_e217614 - capella processEth1DataReset 199.00 ns/op 164.00 ns/op 1.21
mainnet_e217614 - capella processEffectiveBalanceUpdates 11.447 ms/op 17.396 ms/op 0.66
mainnet_e217614 - capella processSlashingsReset 984.00 ns/op 814.00 ns/op 1.21
mainnet_e217614 - capella processRandaoMixesReset 1.2360 us/op 1.1670 us/op 1.06
mainnet_e217614 - capella processHistoricalRootsUpdate 160.00 ns/op 165.00 ns/op 0.97
mainnet_e217614 - capella processParticipationFlagUpdates 490.00 ns/op 525.00 ns/op 0.93
mainnet_e217614 - capella afterProcessEpoch 113.97 ms/op 117.83 ms/op 0.97
phase0 processEpoch - mainnet_e58758 264.03 ms/op 237.84 ms/op 1.11
mainnet_e58758 - phase0 beforeProcessEpoch 48.771 ms/op 53.307 ms/op 0.91
mainnet_e58758 - phase0 processJustificationAndFinalization 6.5440 us/op 5.6840 us/op 1.15
mainnet_e58758 - phase0 processRewardsAndPenalties 21.018 ms/op 18.338 ms/op 1.15
mainnet_e58758 - phase0 processRegistryUpdates 3.4460 us/op 3.0680 us/op 1.12
mainnet_e58758 - phase0 processSlashings 199.00 ns/op 220.00 ns/op 0.90
mainnet_e58758 - phase0 processEth1DataReset 174.00 ns/op 170.00 ns/op 1.02
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 935.03 us/op 945.01 us/op 0.99
mainnet_e58758 - phase0 processSlashingsReset 944.00 ns/op 1.0250 us/op 0.92
mainnet_e58758 - phase0 processRandaoMixesReset 1.4970 us/op 1.1740 us/op 1.28
mainnet_e58758 - phase0 processHistoricalRootsUpdate 174.00 ns/op 187.00 ns/op 0.93
mainnet_e58758 - phase0 processParticipationRecordUpdates 822.00 ns/op 923.00 ns/op 0.89
mainnet_e58758 - phase0 afterProcessEpoch 35.383 ms/op 37.304 ms/op 0.95
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.8882 ms/op 1.8972 ms/op 1.00
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.0612 ms/op 1.6799 ms/op 1.23
altair processInactivityUpdates - 250000 normalcase 12.522 ms/op 16.072 ms/op 0.78
altair processInactivityUpdates - 250000 worstcase 13.464 ms/op 15.423 ms/op 0.87
phase0 processRegistryUpdates - 250000 normalcase 4.8500 us/op 5.8000 us/op 0.84
phase0 processRegistryUpdates - 250000 badcase_full_deposits 298.86 us/op 441.57 us/op 0.68
phase0 processRegistryUpdates - 250000 worstcase 0.5 78.787 ms/op 82.933 ms/op 0.95
altair processRewardsAndPenalties - 250000 normalcase 17.395 ms/op 18.070 ms/op 0.96
altair processRewardsAndPenalties - 250000 worstcase 22.058 ms/op 16.914 ms/op 1.30
phase0 getAttestationDeltas - 250000 normalcase 6.7572 ms/op 6.1618 ms/op 1.10
phase0 getAttestationDeltas - 250000 worstcase 6.9423 ms/op 6.2697 ms/op 1.11
phase0 processSlashings - 250000 worstcase 86.018 us/op 129.04 us/op 0.67
altair processSyncCommitteeUpdates - 250000 10.942 ms/op 13.781 ms/op 0.79
BeaconState.hashTreeRoot - No change 204.00 ns/op 199.00 ns/op 1.03
BeaconState.hashTreeRoot - 1 full validator 94.144 us/op 89.161 us/op 1.06
BeaconState.hashTreeRoot - 32 full validator 1.0552 ms/op 1.0777 ms/op 0.98
BeaconState.hashTreeRoot - 512 full validator 7.9589 ms/op 9.3041 ms/op 0.86
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 107.51 us/op 128.13 us/op 0.84
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.8759 ms/op 1.7932 ms/op 1.05
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 18.365 ms/op 19.563 ms/op 0.94
BeaconState.hashTreeRoot - 1 balances 94.173 us/op 88.679 us/op 1.06
BeaconState.hashTreeRoot - 32 balances 883.45 us/op 901.37 us/op 0.98
BeaconState.hashTreeRoot - 512 balances 6.5863 ms/op 7.0889 ms/op 0.93
BeaconState.hashTreeRoot - 250000 balances 196.27 ms/op 203.78 ms/op 0.96
aggregationBits - 2048 els - zipIndexesInBitList 21.281 us/op 22.550 us/op 0.94
regular array get 100000 times 25.151 us/op 25.790 us/op 0.98
wrappedArray get 100000 times 25.152 us/op 25.690 us/op 0.98
arrayWithProxy get 100000 times 13.812 ms/op 18.859 ms/op 0.73
ssz.Root.equals 23.858 ns/op 24.552 ns/op 0.97
byteArrayEquals 23.348 ns/op 23.865 ns/op 0.98
Buffer.compare 10.162 ns/op 10.256 ns/op 0.99
processSlot - 1 slots 11.494 us/op 10.505 us/op 1.09
processSlot - 32 slots 2.2590 ms/op 2.1815 ms/op 1.04
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 4.5711 ms/op 5.9865 ms/op 0.76
getCommitteeAssignments - req 1 vs - 250000 vc 1.8585 ms/op 1.9788 ms/op 0.94
getCommitteeAssignments - req 100 vs - 250000 vc 3.7706 ms/op 3.8445 ms/op 0.98
getCommitteeAssignments - req 1000 vs - 250000 vc 4.0249 ms/op 4.1177 ms/op 0.98
findModifiedValidators - 10000 modified validators 384.83 ms/op 714.20 ms/op 0.54
findModifiedValidators - 1000 modified validators 387.67 ms/op 437.04 ms/op 0.89
findModifiedValidators - 100 modified validators 278.48 ms/op 358.08 ms/op 0.78
findModifiedValidators - 10 modified validators 130.61 ms/op 245.83 ms/op 0.53
findModifiedValidators - 1 modified validators 164.32 ms/op 280.95 ms/op 0.58
findModifiedValidators - no difference 165.13 ms/op 156.32 ms/op 1.06
migrate state 1500000 validators, 3400 modified, 2000 new 1.0481 s/op 1.2415 s/op 0.84
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.6800 ns/op 4.4300 ns/op 1.06
state getBlockRootAtSlot - 250000 vs - 7PWei 537.02 ns/op 666.73 ns/op 0.81
computeProposerIndex 100000 validators 1.5846 ms/op 1.6533 ms/op 0.96
getNextSyncCommitteeIndices 1000 validators 119.50 ms/op 136.06 ms/op 0.88
getNextSyncCommitteeIndices 10000 validators 119.19 ms/op 134.18 ms/op 0.89
getNextSyncCommitteeIndices 100000 validators 118.69 ms/op 130.53 ms/op 0.91
computeProposers - vc 250000 661.26 us/op 709.69 us/op 0.93
computeEpochShuffling - vc 250000 42.154 ms/op 42.324 ms/op 1.00
getNextSyncCommittee - vc 250000 10.855 ms/op 11.875 ms/op 0.91
nodejs block root to RootHex using toHex 137.68 ns/op 149.59 ns/op 0.92
nodejs block root to RootHex using toRootHex 88.696 ns/op 91.661 ns/op 0.97
nodejs fromHex(blob) 189.97 us/op 513.36 us/op 0.37
nodejs fromHexInto(blob) 713.43 us/op 720.31 us/op 0.99
nodejs block root to RootHex using the deprecated toHexString 581.67 ns/op 592.09 ns/op 0.98
browser block root to RootHex using toHex 281.67 ns/op 302.43 ns/op 0.93
browser block root to RootHex using toRootHex 157.63 ns/op 160.83 ns/op 0.98
browser fromHex(blob) 1.1926 ms/op 1.2589 ms/op 0.95
browser fromHexInto(blob) 716.93 us/op 723.36 us/op 0.99
browser block root to RootHex using the deprecated toHexString 409.86 ns/op 440.94 ns/op 0.93

by benchmarkbot/action

@nflaig
nflaig marked this pull request as ready for review December 10, 2025 19:57
@nflaig
nflaig requested a review from a team as a code owner December 10, 2025 19:57
export const paramsOptions: CliCommandOptions<IParamsArgs> = {
...paramsOptionsByName,

"terminal-total-difficulty-override": {

@nflaig nflaig Dec 11, 2025

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't expect anyone is still setting these flags, but if we wanna be extra careful could keep them around

if (
fork >= ForkSeq.bellatrix &&
fork < ForkSeq.gloas &&
isExecutionEnabled(state as CachedBeaconStateBellatrix, block)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removing this check might cause issues syncing through bellatrix, but really not sure we wanna support that anymore as it's outside of weak subjectivity period and not safe anyways

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as suspected this is an issue when trying to sync from genesis

debug: Block error slot=4636672, code=BLOCK_ERROR_BEACON_CHAIN_ERROR, error=Invalid execution payload random 0x0000000000000000000000000000000000000000000000000000000000000000 expected=0xa43ac70cdc82b95f90d74a03f08eb2df5adf46c7f5ccd44a62a9a3c4e8d8cc48
Dec 16 16:42:49 feat4-mainnet-hzax41 beacon_run.sh[144288]: Error: Invalid execution payload random 0x0000000000000000000000000000000000000000000000000000000000000000 expected=0xa43ac70cdc82b95f90d74a03f08eb2df5adf46c7f5ccd44a62a9a3c4e8d8cc48

if we wanna be able to still do that we would need to restore isExecutionEnabled which would be doable, we can still remove most the code as done in this PR

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#8700 to keep supporting genesis sync

@wemeetagain wemeetagain left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@twoeths
twoeths merged commit 889b1c4 into unstable Dec 12, 2025
30 of 34 checks passed
@twoeths
twoeths deleted the nflaig/remove-merge-transition branch December 12, 2025 03:18
@codecov

codecov Bot commented Dec 12, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.12%. Comparing base (34d4b73) to head (4a408c9).
⚠️ Report is 2 commits behind head on unstable.

Additional details and impacted files
@@             Coverage Diff              @@
##           unstable    #8680      +/-   ##
============================================
+ Coverage     52.04%   52.12%   +0.07%     
============================================
  Files           848      848              
  Lines         65734    65335     -399     
  Branches       4807     4789      -18     
============================================
- Hits          34214    34055     -159     
+ Misses        31451    31211     -240     
  Partials         69       69              
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

wemeetagain pushed a commit that referenced this pull request Dec 18, 2025
**Motivation**

As noted in
#8680 (comment)
we cannot sync through bellatrix anymore. While I don't think it's a big
deal it's simple enough to keep that functionality as that code is
pretty isolated and won't get in our way during refactors and with gloas
won't be part of the block processing pipeline anymore due to
block/payload separation.


**Description**

Restore code required to perform sync through bellatrix
- re-added `isExecutionEnabled()` and `isMergeTransitionComplete()`
checks during block processing
- enabled some spec tests again that were previously skipped
- mostly copied original code removed in
[#8680](#8680) but cleaned up
some comments and simplified a bit
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.39.0 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Remove merge transition code

3 participants