lodestar icon indicating copy to clipboard operation
lodestar copied to clipboard

feat: implement ePBS gossip topics

Open ensi321 opened this issue 1 month ago • 4 comments

  • Add new gossip topics
  • Add gossip validation for each new topic
  • Handle gossip payload attestation message
  • Add PayloadAttestationPool
  • Update gossip validation for beacon_aggregate_and_proof and beacon_block

TODOS:

  • Properly handle gossip bids (Pending trustless payment discussion, not needed for devnet-0)
  • Add bid pool (Pending trustless payment discussion, not needed for devnet-0)
  • Handle gossip execution payload (Will do in another PR, when updating fork choice)
  • All req/resp
  • Updating DataColumnSidecar handling

ensi321 avatar Nov 17 '25 19:11 ensi321

Summary of Changes

Hello @ensi321, I'm Gemini Code Assist[^1]! 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 lays the groundwork for implementing the ePBS (enshrined Proposer-Builder Separation) networking specification, likely for an upcoming Ethereum fork referred to as "Gloas." It introduces new data structures and validation rules for execution payload bids, envelopes, and payload attestations, and integrates these new message types into the beacon node's gossip network for propagation and processing. This is a Work In Progress, building upon a previous PR.

Highlights

  • New Error Definitions for ePBS: Introduced specific error codes and types for ExecutionPayloadBid, ExecutionPayloadEnvelope, and PayloadAttestation to support the new ePBS networking specification.
  • Attestation Validation Updates: Modified existing attestation validation logic in aggregateAndProof.ts and attestation.ts to incorporate "Gloas" fork-specific rules, particularly concerning attestation.data.index values.
  • Block Validation Adjustments: Updated block validation in block.ts to conditionally apply existing checks (e.g., blobKzgCommitments length, execution payload timestamp) based on the "Gloas" fork, indicating a new phase in block processing.
  • New ePBS Validation Functions: Added dedicated validation functions for ExecutionPayloadBid, ExecutionPayloadEnvelope, and PayloadAttestationMessage to ensure compliance with the ePBS specification.
  • Gossip Network Integration: Expanded the gossip network interface and handlers to support new message types (execution_payload, payload_attestation_message, execution_payload_bid), enabling the beacon node to process ePBS-related gossip.
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 :thumbsup: and :thumbsdown: 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.

[^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[bot] avatar Nov 17 '25 19:11 gemini-code-assist[bot]

[!WARNING] Gemini encountered an error creating the review. You can try again by commenting /gemini review.

gemini-code-assist[bot] avatar Nov 17 '25 19:11 gemini-code-assist[bot]

/gemini review

ensi321 avatar Dec 09 '25 07:12 ensi321

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: d2b663b4c283ec90befeaeb7430c2ea1e4b0bafa Previous: f231d7e8ff94f5728857fc263cc98ba16c87a880 Ratio
500 bytes - uncompress - snappyjs 1.6167 us/op 14.063 us/op 0.11
Full benchmark results
Benchmark suite Current: d2b663b4c283ec90befeaeb7430c2ea1e4b0bafa Previous: f231d7e8ff94f5728857fc263cc98ba16c87a880 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0687 ms/op 1.2034 ms/op 0.89
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 36.605 us/op 37.315 us/op 0.98
BLS verify - blst 807.13 us/op 729.87 us/op 1.11
BLS verifyMultipleSignatures 3 - blst 1.1256 ms/op 1.1651 ms/op 0.97
BLS verifyMultipleSignatures 8 - blst 1.6044 ms/op 1.6261 ms/op 0.99
BLS verifyMultipleSignatures 32 - blst 4.8220 ms/op 4.7787 ms/op 1.01
BLS verifyMultipleSignatures 64 - blst 8.8668 ms/op 8.9534 ms/op 0.99
BLS verifyMultipleSignatures 128 - blst 17.013 ms/op 17.000 ms/op 1.00
BLS deserializing 10000 signatures 674.00 ms/op 683.45 ms/op 0.99
BLS deserializing 100000 signatures 6.7302 s/op 6.8520 s/op 0.98
BLS verifyMultipleSignatures - same message - 3 - blst 816.43 us/op 912.50 us/op 0.89
BLS verifyMultipleSignatures - same message - 8 - blst 980.45 us/op 1.0429 ms/op 0.94
BLS verifyMultipleSignatures - same message - 32 - blst 1.7170 ms/op 1.6991 ms/op 1.01
BLS verifyMultipleSignatures - same message - 64 - blst 2.5513 ms/op 2.6115 ms/op 0.98
BLS verifyMultipleSignatures - same message - 128 - blst 4.2665 ms/op 4.3746 ms/op 0.98
BLS aggregatePubkeys 32 - blst 19.053 us/op 19.445 us/op 0.98
BLS aggregatePubkeys 128 - blst 68.503 us/op 69.426 us/op 0.99
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 38.999 ms/op 41.835 ms/op 0.93
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 35.963 ms/op 37.041 ms/op 0.97
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 31.759 ms/op 31.311 ms/op 1.01
getSlashingsAndExits - default max 67.574 us/op 69.582 us/op 0.97
getSlashingsAndExits - 2k 310.07 us/op 315.02 us/op 0.98
isKnown best case - 1 super set check 195.00 ns/op 204.00 ns/op 0.96
isKnown normal case - 2 super set checks 195.00 ns/op 202.00 ns/op 0.97
isKnown worse case - 16 super set checks 194.00 ns/op 200.00 ns/op 0.97
InMemoryCheckpointStateCache - add get delete 2.2210 us/op 2.3160 us/op 0.96
validate api signedAggregateAndProof - struct 1.3124 ms/op 1.3750 ms/op 0.95
validate gossip signedAggregateAndProof - struct 1.2977 ms/op 1.3643 ms/op 0.95
batch validate gossip attestation - vc 640000 - chunk 32 109.77 us/op 114.60 us/op 0.96
batch validate gossip attestation - vc 640000 - chunk 64 94.955 us/op 101.43 us/op 0.94
batch validate gossip attestation - vc 640000 - chunk 128 88.131 us/op 96.607 us/op 0.91
batch validate gossip attestation - vc 640000 - chunk 256 84.232 us/op 90.238 us/op 0.93
pickEth1Vote - no votes 916.22 us/op 954.00 us/op 0.96
pickEth1Vote - max votes 4.5219 ms/op 4.9280 ms/op 0.92
pickEth1Vote - Eth1Data hashTreeRoot value x2048 8.5989 ms/op 9.8776 ms/op 0.87
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 12.646 ms/op 13.440 ms/op 0.94
pickEth1Vote - Eth1Data fastSerialize value x2048 372.87 us/op 413.06 us/op 0.90
pickEth1Vote - Eth1Data fastSerialize tree x2048 2.7283 ms/op 2.4184 ms/op 1.13
bytes32 toHexString 339.00 ns/op 363.00 ns/op 0.93
bytes32 Buffer.toString(hex) 232.00 ns/op 224.00 ns/op 1.04
bytes32 Buffer.toString(hex) from Uint8Array 314.00 ns/op 303.00 ns/op 1.04
bytes32 Buffer.toString(hex) + 0x 237.00 ns/op 226.00 ns/op 1.05
Object access 1 prop 0.11200 ns/op 0.11800 ns/op 0.95
Map access 1 prop 0.11500 ns/op 0.11600 ns/op 0.99
Object get x1000 5.2200 ns/op 5.2090 ns/op 1.00
Map get x1000 0.35600 ns/op 0.37300 ns/op 0.95
Object set x1000 28.001 ns/op 28.468 ns/op 0.98
Map set x1000 19.103 ns/op 20.348 ns/op 0.94
Return object 10000 times 0.22340 ns/op 0.22960 ns/op 0.97
Throw Error 10000 times 3.7562 us/op 3.9521 us/op 0.95
toHex 134.19 ns/op 124.64 ns/op 1.08
Buffer.from 112.61 ns/op 115.40 ns/op 0.98
shared Buffer 78.157 ns/op 78.096 ns/op 1.00
fastMsgIdFn sha256 / 200 bytes 1.7650 us/op 1.8190 us/op 0.97
fastMsgIdFn h32 xxhash / 200 bytes 184.00 ns/op 194.00 ns/op 0.95
fastMsgIdFn h64 xxhash / 200 bytes 234.00 ns/op 254.00 ns/op 0.92
fastMsgIdFn sha256 / 1000 bytes 5.5720 us/op 5.9770 us/op 0.93
fastMsgIdFn h32 xxhash / 1000 bytes 276.00 ns/op 287.00 ns/op 0.96
fastMsgIdFn h64 xxhash / 1000 bytes 289.00 ns/op 303.00 ns/op 0.95
fastMsgIdFn sha256 / 10000 bytes 49.033 us/op 52.016 us/op 0.94
fastMsgIdFn h32 xxhash / 10000 bytes 1.3230 us/op 1.3610 us/op 0.97
fastMsgIdFn h64 xxhash / 10000 bytes 893.00 ns/op 882.00 ns/op 1.01
100 bytes - compress - snappyjs 1.1304 us/op 1.2302 us/op 0.92
100 bytes - compress - snappy 1.2204 us/op 1.1597 us/op 1.05
100 bytes - compress - snappy-wasm 735.08 ns/op 1.0540 us/op 0.70
100 bytes - compress - snappy-wasm - prealloc 1.9059 us/op 2.0620 us/op 0.92
200 bytes - compress - snappyjs 1.8142 us/op 1.5642 us/op 1.16
200 bytes - compress - snappy 1.3365 us/op 1.7064 us/op 0.78
200 bytes - compress - snappy-wasm 1.0292 us/op 797.38 ns/op 1.29
200 bytes - compress - snappy-wasm - prealloc 1.5517 us/op 1.8737 us/op 0.83
300 bytes - compress - snappyjs 1.8804 us/op 2.0973 us/op 0.90
300 bytes - compress - snappy 2.4499 us/op 1.6341 us/op 1.50
300 bytes - compress - snappy-wasm 1.0785 us/op 838.69 ns/op 1.29
300 bytes - compress - snappy-wasm - prealloc 1.4059 us/op 1.5361 us/op 0.92
400 bytes - compress - snappyjs 2.1085 us/op 2.9146 us/op 0.72
400 bytes - compress - snappy 1.4711 us/op 2.1167 us/op 0.69
400 bytes - compress - snappy-wasm 1.1092 us/op 921.20 ns/op 1.20
400 bytes - compress - snappy-wasm - prealloc 1.8174 us/op 1.7906 us/op 1.01
500 bytes - compress - snappyjs 2.8024 us/op 3.0421 us/op 0.92
500 bytes - compress - snappy 1.4394 us/op 1.5131 us/op 0.95
500 bytes - compress - snappy-wasm 1.2255 us/op 1.0267 us/op 1.19
500 bytes - compress - snappy-wasm - prealloc 1.4380 us/op 1.1828 us/op 1.22
1000 bytes - compress - snappyjs 5.1893 us/op 4.5352 us/op 1.14
1000 bytes - compress - snappy 1.9849 us/op 1.9046 us/op 1.04
1000 bytes - compress - snappy-wasm 1.6950 us/op 1.5952 us/op 1.06
1000 bytes - compress - snappy-wasm - prealloc 2.2142 us/op 1.9728 us/op 1.12
10000 bytes - compress - snappyjs 27.426 us/op 25.216 us/op 1.09
10000 bytes - compress - snappy 27.302 us/op 25.417 us/op 1.07
10000 bytes - compress - snappy-wasm 15.853 us/op 19.911 us/op 0.80
10000 bytes - compress - snappy-wasm - prealloc 14.205 us/op 30.652 us/op 0.46
100 bytes - uncompress - snappyjs 756.37 ns/op 813.72 ns/op 0.93
100 bytes - uncompress - snappy 1.0827 us/op 1.2043 us/op 0.90
100 bytes - uncompress - snappy-wasm 639.07 ns/op 637.91 ns/op 1.00
100 bytes - uncompress - snappy-wasm - prealloc 839.21 ns/op 826.59 ns/op 1.02
200 bytes - uncompress - snappyjs 905.92 ns/op 1.2716 us/op 0.71
200 bytes - uncompress - snappy 1.5349 us/op 1.2696 us/op 1.21
200 bytes - uncompress - snappy-wasm 1.2441 us/op 1.4461 us/op 0.86
200 bytes - uncompress - snappy-wasm - prealloc 1.5063 us/op 1.6576 us/op 0.91
300 bytes - uncompress - snappyjs 982.80 ns/op 977.78 ns/op 1.01
300 bytes - uncompress - snappy 1.9620 us/op 1.3007 us/op 1.51
300 bytes - uncompress - snappy-wasm 943.74 ns/op 723.14 ns/op 1.31
300 bytes - uncompress - snappy-wasm - prealloc 1.1915 us/op 1.0774 us/op 1.11
400 bytes - uncompress - snappyjs 2.4199 us/op 1.1856 us/op 2.04
400 bytes - uncompress - snappy 1.7973 us/op 1.5433 us/op 1.16
400 bytes - uncompress - snappy-wasm 1.1053 us/op 1.0066 us/op 1.10
400 bytes - uncompress - snappy-wasm - prealloc 1.2112 us/op 1.2529 us/op 0.97
500 bytes - uncompress - snappyjs 1.6167 us/op 14.063 us/op 0.11
500 bytes - uncompress - snappy 1.2854 us/op 1.5367 us/op 0.84
500 bytes - uncompress - snappy-wasm 992.59 ns/op 957.80 ns/op 1.04
500 bytes - uncompress - snappy-wasm - prealloc 1.0360 us/op 1.4693 us/op 0.71
1000 bytes - uncompress - snappyjs 2.0476 us/op 2.6582 us/op 0.77
1000 bytes - uncompress - snappy 1.6243 us/op 1.7085 us/op 0.95
1000 bytes - uncompress - snappy-wasm 1.3911 us/op 1.1318 us/op 1.23
1000 bytes - uncompress - snappy-wasm - prealloc 1.6056 us/op 1.8794 us/op 0.85
10000 bytes - uncompress - snappyjs 23.522 us/op 20.587 us/op 1.14
10000 bytes - uncompress - snappy 24.705 us/op 23.975 us/op 1.03
10000 bytes - uncompress - snappy-wasm 20.863 us/op 17.464 us/op 1.19
10000 bytes - uncompress - snappy-wasm - prealloc 19.641 us/op 20.606 us/op 0.95
send data - 1000 256B messages 15.861 ms/op 16.811 ms/op 0.94
send data - 1000 512B messages 16.166 ms/op 18.603 ms/op 0.87
send data - 1000 1024B messages 23.122 ms/op 25.013 ms/op 0.92
send data - 1000 1200B messages 28.412 ms/op 26.541 ms/op 1.07
send data - 1000 2048B messages 30.378 ms/op 35.485 ms/op 0.86
send data - 1000 4096B messages 36.149 ms/op 39.453 ms/op 0.92
send data - 1000 16384B messages 117.19 ms/op 102.62 ms/op 1.14
send data - 1000 65536B messages 285.62 ms/op 331.83 ms/op 0.86
enrSubnets - fastDeserialize 64 bits 869.00 ns/op 903.00 ns/op 0.96
enrSubnets - ssz BitVector 64 bits 327.00 ns/op 343.00 ns/op 0.95
enrSubnets - fastDeserialize 4 bits 132.00 ns/op 130.00 ns/op 1.02
enrSubnets - ssz BitVector 4 bits 335.00 ns/op 344.00 ns/op 0.97
prioritizePeers score -10:0 att 32-0.1 sync 2-0 228.14 us/op 228.36 us/op 1.00
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 258.48 us/op 257.65 us/op 1.00
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 365.46 us/op 373.16 us/op 0.98
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 686.36 us/op 712.67 us/op 0.96
prioritizePeers score 0:0 att 64-1 sync 4-1 829.27 us/op 850.63 us/op 0.97
array of 16000 items push then shift 1.6266 us/op 1.6360 us/op 0.99
LinkedList of 16000 items push then shift 8.6020 ns/op 7.5780 ns/op 1.14
array of 16000 items push then pop 75.481 ns/op 77.288 ns/op 0.98
LinkedList of 16000 items push then pop 7.1900 ns/op 7.3700 ns/op 0.98
array of 24000 items push then shift 2.3433 us/op 2.4130 us/op 0.97
LinkedList of 24000 items push then shift 7.3570 ns/op 7.8230 ns/op 0.94
array of 24000 items push then pop 104.30 ns/op 110.65 ns/op 0.94
LinkedList of 24000 items push then pop 7.0620 ns/op 7.4570 ns/op 0.95
intersect bitArray bitLen 8 5.5370 ns/op 5.7720 ns/op 0.96
intersect array and set length 8 32.622 ns/op 39.479 ns/op 0.83
intersect bitArray bitLen 128 27.931 ns/op 27.871 ns/op 1.00
intersect array and set length 128 529.20 ns/op 704.13 ns/op 0.75
bitArray.getTrueBitIndexes() bitLen 128 1.0120 us/op 1.0230 us/op 0.99
bitArray.getTrueBitIndexes() bitLen 248 1.7980 us/op 1.8040 us/op 1.00
bitArray.getTrueBitIndexes() bitLen 512 3.6870 us/op 3.9000 us/op 0.95
Full columns - reconstruct all 6 blobs 362.05 us/op 280.27 us/op 1.29
Full columns - reconstruct half of the blobs out of 6 91.036 us/op 112.61 us/op 0.81
Full columns - reconstruct single blob out of 6 31.535 us/op 42.545 us/op 0.74
Half columns - reconstruct all 6 blobs 267.51 ms/op 281.12 ms/op 0.95
Half columns - reconstruct half of the blobs out of 6 131.38 ms/op 142.19 ms/op 0.92
Half columns - reconstruct single blob out of 6 48.798 ms/op 55.899 ms/op 0.87
Full columns - reconstruct all 10 blobs 276.15 us/op 366.25 us/op 0.75
Full columns - reconstruct half of the blobs out of 10 137.86 us/op 157.54 us/op 0.88
Full columns - reconstruct single blob out of 10 30.520 us/op 32.837 us/op 0.93
Half columns - reconstruct all 10 blobs 435.50 ms/op 461.37 ms/op 0.94
Half columns - reconstruct half of the blobs out of 10 222.00 ms/op 234.04 ms/op 0.95
Half columns - reconstruct single blob out of 10 49.182 ms/op 51.742 ms/op 0.95
Full columns - reconstruct all 20 blobs 552.64 us/op 835.89 us/op 0.66
Full columns - reconstruct half of the blobs out of 20 263.18 us/op 310.73 us/op 0.85
Full columns - reconstruct single blob out of 20 31.667 us/op 33.282 us/op 0.95
Half columns - reconstruct all 20 blobs 869.66 ms/op 931.72 ms/op 0.93
Half columns - reconstruct half of the blobs out of 20 428.15 ms/op 465.94 ms/op 0.92
Half columns - reconstruct single blob out of 20 49.382 ms/op 52.359 ms/op 0.94
Set add up to 64 items then delete first 1.9625 us/op 2.4873 us/op 0.79
OrderedSet add up to 64 items then delete first 2.9146 us/op 3.5360 us/op 0.82
Set add up to 64 items then delete last 2.1980 us/op 2.5104 us/op 0.88
OrderedSet add up to 64 items then delete last 3.1860 us/op 3.9519 us/op 0.81
Set add up to 64 items then delete middle 2.2259 us/op 2.5840 us/op 0.86
OrderedSet add up to 64 items then delete middle 4.6869 us/op 5.5092 us/op 0.85
Set add up to 128 items then delete first 4.6959 us/op 5.2764 us/op 0.89
OrderedSet add up to 128 items then delete first 6.8728 us/op 7.6263 us/op 0.90
Set add up to 128 items then delete last 4.4795 us/op 5.2469 us/op 0.85
OrderedSet add up to 128 items then delete last 6.4442 us/op 7.4487 us/op 0.87
Set add up to 128 items then delete middle 4.3948 us/op 4.8648 us/op 0.90
OrderedSet add up to 128 items then delete middle 12.610 us/op 14.009 us/op 0.90
Set add up to 256 items then delete first 9.7154 us/op 9.9028 us/op 0.98
OrderedSet add up to 256 items then delete first 14.584 us/op 14.783 us/op 0.99
Set add up to 256 items then delete last 9.0416 us/op 9.7239 us/op 0.93
OrderedSet add up to 256 items then delete last 13.510 us/op 14.901 us/op 0.91
Set add up to 256 items then delete middle 8.8116 us/op 9.7033 us/op 0.91
OrderedSet add up to 256 items then delete middle 38.699 us/op 42.112 us/op 0.92
pass gossip attestations to forkchoice per slot 2.4312 ms/op 2.6274 ms/op 0.93
forkChoice updateHead vc 100000 bc 64 eq 0 455.43 us/op 476.08 us/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 0 2.7040 ms/op 2.8255 ms/op 0.96
forkChoice updateHead vc 1000000 bc 64 eq 0 4.6057 ms/op 4.8721 ms/op 0.95
forkChoice updateHead vc 600000 bc 320 eq 0 2.7731 ms/op 2.9013 ms/op 0.96
forkChoice updateHead vc 600000 bc 1200 eq 0 2.8038 ms/op 3.0730 ms/op 0.91
forkChoice updateHead vc 600000 bc 7200 eq 0 3.0941 ms/op 3.2320 ms/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 1000 3.2991 ms/op 3.4351 ms/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 10000 3.4275 ms/op 3.5880 ms/op 0.96
forkChoice updateHead vc 600000 bc 64 eq 300000 8.2855 ms/op 9.4176 ms/op 0.88
computeDeltas 1400000 validators 0% inactive 14.097 ms/op 14.801 ms/op 0.95
computeDeltas 1400000 validators 10% inactive 13.177 ms/op 13.762 ms/op 0.96
computeDeltas 1400000 validators 20% inactive 12.289 ms/op 12.846 ms/op 0.96
computeDeltas 1400000 validators 50% inactive 9.4889 ms/op 9.8162 ms/op 0.97
computeDeltas 2100000 validators 0% inactive 21.159 ms/op 22.095 ms/op 0.96
computeDeltas 2100000 validators 10% inactive 21.875 ms/op 22.710 ms/op 0.96
computeDeltas 2100000 validators 20% inactive 18.410 ms/op 19.163 ms/op 0.96
computeDeltas 2100000 validators 50% inactive 14.256 ms/op 14.942 ms/op 0.95
altair processAttestation - 250000 vs - 7PWei normalcase 1.8369 ms/op 1.9035 ms/op 0.96
altair processAttestation - 250000 vs - 7PWei worstcase 2.7682 ms/op 2.8730 ms/op 0.96
altair processAttestation - setStatus - 1/6 committees join 119.09 us/op 119.14 us/op 1.00
altair processAttestation - setStatus - 1/3 committees join 235.74 us/op 228.46 us/op 1.03
altair processAttestation - setStatus - 1/2 committees join 325.25 us/op 317.91 us/op 1.02
altair processAttestation - setStatus - 2/3 committees join 413.65 us/op 415.12 us/op 1.00
altair processAttestation - setStatus - 4/5 committees join 573.48 us/op 569.17 us/op 1.01
altair processAttestation - setStatus - 100% committees join 676.17 us/op 672.02 us/op 1.01
altair processBlock - 250000 vs - 7PWei normalcase 3.6537 ms/op 4.3592 ms/op 0.84
altair processBlock - 250000 vs - 7PWei normalcase hashState 15.657 ms/op 17.051 ms/op 0.92
altair processBlock - 250000 vs - 7PWei worstcase 22.469 ms/op 22.541 ms/op 1.00
altair processBlock - 250000 vs - 7PWei worstcase hashState 55.327 ms/op 55.637 ms/op 0.99
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4263 ms/op 1.6430 ms/op 0.87
phase0 processBlock - 250000 vs - 7PWei worstcase 18.436 ms/op 19.273 ms/op 0.96
altair processEth1Data - 250000 vs - 7PWei normalcase 353.86 us/op 362.79 us/op 0.98
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 6.8610 us/op 7.5900 us/op 0.90
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 36.724 us/op 42.018 us/op 0.87
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 10.309 us/op 11.748 us/op 0.88
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 6.3440 us/op 7.2050 us/op 0.88
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 136.54 us/op 156.57 us/op 0.87
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 1.9204 ms/op 1.9310 ms/op 0.99
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.4246 ms/op 2.4487 ms/op 0.99
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.3823 ms/op 2.4620 ms/op 0.97
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.3605 ms/op 4.7689 ms/op 0.91
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.4123 ms/op 2.7184 ms/op 0.89
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.7726 ms/op 4.9196 ms/op 0.97
Tree 40 250000 create 360.45 ms/op 358.15 ms/op 1.01
Tree 40 250000 get(125000) 126.08 ns/op 123.27 ns/op 1.02
Tree 40 250000 set(125000) 1.1980 us/op 1.2233 us/op 0.98
Tree 40 250000 toArray() 12.415 ms/op 13.343 ms/op 0.93
Tree 40 250000 iterate all - toArray() + loop 12.478 ms/op 13.265 ms/op 0.94
Tree 40 250000 iterate all - get(i) 41.119 ms/op 41.824 ms/op 0.98
Array 250000 create 2.4573 ms/op 2.5472 ms/op 0.96
Array 250000 clone - spread 788.54 us/op 823.78 us/op 0.96
Array 250000 get(125000) 0.34100 ns/op 0.35200 ns/op 0.97
Array 250000 set(125000) 0.35900 ns/op 0.35700 ns/op 1.01
Array 250000 iterate all - loop 60.384 us/op 61.581 us/op 0.98
phase0 afterProcessEpoch - 250000 vs - 7PWei 40.768 ms/op 41.661 ms/op 0.98
Array.fill - length 1000000 4.7417 ms/op 2.8354 ms/op 1.67
Array push - length 1000000 14.624 ms/op 10.187 ms/op 1.44
Array.get 0.20827 ns/op 0.21900 ns/op 0.95
Uint8Array.get 0.21995 ns/op 0.22117 ns/op 0.99
phase0 beforeProcessEpoch - 250000 vs - 7PWei 19.789 ms/op 18.114 ms/op 1.09
altair processEpoch - mainnet_e81889 241.90 ms/op 268.05 ms/op 0.90
mainnet_e81889 - altair beforeProcessEpoch 16.448 ms/op 16.057 ms/op 1.02
mainnet_e81889 - altair processJustificationAndFinalization 5.4050 us/op 5.4470 us/op 0.99
mainnet_e81889 - altair processInactivityUpdates 3.6566 ms/op 3.8312 ms/op 0.95
mainnet_e81889 - altair processRewardsAndPenalties 17.570 ms/op 17.966 ms/op 0.98
mainnet_e81889 - altair processRegistryUpdates 635.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 164.00 ns/op 164.00 ns/op 1.00
mainnet_e81889 - altair processEffectiveBalanceUpdates 2.0353 ms/op 1.9107 ms/op 1.07
mainnet_e81889 - altair processSlashingsReset 787.00 ns/op 815.00 ns/op 0.97
mainnet_e81889 - altair processRandaoMixesReset 1.0490 us/op 1.0660 us/op 0.98
mainnet_e81889 - altair processHistoricalRootsUpdate 167.00 ns/op 163.00 ns/op 1.02
mainnet_e81889 - altair processParticipationFlagUpdates 496.00 ns/op 508.00 ns/op 0.98
mainnet_e81889 - altair processSyncCommitteeUpdates 132.00 ns/op 131.00 ns/op 1.01
mainnet_e81889 - altair afterProcessEpoch 41.907 ms/op 43.934 ms/op 0.95
capella processEpoch - mainnet_e217614 750.53 ms/op 806.89 ms/op 0.93
mainnet_e217614 - capella beforeProcessEpoch 58.725 ms/op 60.312 ms/op 0.97
mainnet_e217614 - capella processJustificationAndFinalization 6.2390 us/op 5.9960 us/op 1.04
mainnet_e217614 - capella processInactivityUpdates 15.328 ms/op 15.764 ms/op 0.97
mainnet_e217614 - capella processRewardsAndPenalties 97.539 ms/op 103.73 ms/op 0.94
mainnet_e217614 - capella processRegistryUpdates 6.0600 us/op 6.4300 us/op 0.94
mainnet_e217614 - capella processSlashings 157.00 ns/op 168.00 ns/op 0.93
mainnet_e217614 - capella processEth1DataReset 151.00 ns/op 164.00 ns/op 0.92
mainnet_e217614 - capella processEffectiveBalanceUpdates 12.008 ms/op 17.396 ms/op 0.69
mainnet_e217614 - capella processSlashingsReset 767.00 ns/op 814.00 ns/op 0.94
mainnet_e217614 - capella processRandaoMixesReset 1.0540 us/op 1.1670 us/op 0.90
mainnet_e217614 - capella processHistoricalRootsUpdate 155.00 ns/op 165.00 ns/op 0.94
mainnet_e217614 - capella processParticipationFlagUpdates 498.00 ns/op 525.00 ns/op 0.95
mainnet_e217614 - capella afterProcessEpoch 111.90 ms/op 117.83 ms/op 0.95
phase0 processEpoch - mainnet_e58758 237.95 ms/op 237.84 ms/op 1.00
mainnet_e58758 - phase0 beforeProcessEpoch 48.968 ms/op 53.307 ms/op 0.92
mainnet_e58758 - phase0 processJustificationAndFinalization 5.6930 us/op 5.6840 us/op 1.00
mainnet_e58758 - phase0 processRewardsAndPenalties 38.370 ms/op 18.338 ms/op 2.09
mainnet_e58758 - phase0 processRegistryUpdates 3.0640 us/op 3.0680 us/op 1.00
mainnet_e58758 - phase0 processSlashings 164.00 ns/op 220.00 ns/op 0.75
mainnet_e58758 - phase0 processEth1DataReset 160.00 ns/op 170.00 ns/op 0.94
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.1002 ms/op 945.01 us/op 1.16
mainnet_e58758 - phase0 processSlashingsReset 863.00 ns/op 1.0250 us/op 0.84
mainnet_e58758 - phase0 processRandaoMixesReset 1.4740 us/op 1.1740 us/op 1.26
mainnet_e58758 - phase0 processHistoricalRootsUpdate 162.00 ns/op 187.00 ns/op 0.87
mainnet_e58758 - phase0 processParticipationRecordUpdates 844.00 ns/op 923.00 ns/op 0.91
mainnet_e58758 - phase0 afterProcessEpoch 34.945 ms/op 37.304 ms/op 0.94
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.7253 ms/op 1.8972 ms/op 0.91
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5422 ms/op 1.6799 ms/op 0.92
altair processInactivityUpdates - 250000 normalcase 13.085 ms/op 16.072 ms/op 0.81
altair processInactivityUpdates - 250000 worstcase 12.336 ms/op 15.423 ms/op 0.80
phase0 processRegistryUpdates - 250000 normalcase 4.9380 us/op 5.8000 us/op 0.85
phase0 processRegistryUpdates - 250000 badcase_full_deposits 221.51 us/op 441.57 us/op 0.50
phase0 processRegistryUpdates - 250000 worstcase 0.5 73.208 ms/op 82.933 ms/op 0.88
altair processRewardsAndPenalties - 250000 normalcase 16.304 ms/op 18.070 ms/op 0.90
altair processRewardsAndPenalties - 250000 worstcase 15.665 ms/op 16.914 ms/op 0.93
phase0 getAttestationDeltas - 250000 normalcase 6.4384 ms/op 6.1618 ms/op 1.04
phase0 getAttestationDeltas - 250000 worstcase 6.5024 ms/op 6.2697 ms/op 1.04
phase0 processSlashings - 250000 worstcase 77.441 us/op 129.04 us/op 0.60
altair processSyncCommitteeUpdates - 250000 10.848 ms/op 13.781 ms/op 0.79
BeaconState.hashTreeRoot - No change 186.00 ns/op 199.00 ns/op 0.93
BeaconState.hashTreeRoot - 1 full validator 83.925 us/op 89.161 us/op 0.94
BeaconState.hashTreeRoot - 32 full validator 1.0877 ms/op 1.0777 ms/op 1.01
BeaconState.hashTreeRoot - 512 full validator 7.8153 ms/op 9.3041 ms/op 0.84
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 125.09 us/op 128.13 us/op 0.98
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 2.2292 ms/op 1.7932 ms/op 1.24
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 15.377 ms/op 19.563 ms/op 0.79
BeaconState.hashTreeRoot - 1 balances 87.799 us/op 88.679 us/op 0.99
BeaconState.hashTreeRoot - 32 balances 933.75 us/op 901.37 us/op 1.04
BeaconState.hashTreeRoot - 512 balances 5.8122 ms/op 7.0889 ms/op 0.82
BeaconState.hashTreeRoot - 250000 balances 166.15 ms/op 203.78 ms/op 0.82
aggregationBits - 2048 els - zipIndexesInBitList 20.079 us/op 22.550 us/op 0.89
regular array get 100000 times 23.635 us/op 25.790 us/op 0.92
wrappedArray get 100000 times 23.770 us/op 25.690 us/op 0.93
arrayWithProxy get 100000 times 13.698 ms/op 18.859 ms/op 0.73
ssz.Root.equals 23.439 ns/op 24.552 ns/op 0.95
byteArrayEquals 22.783 ns/op 23.865 ns/op 0.95
Buffer.compare 9.8150 ns/op 10.256 ns/op 0.96
processSlot - 1 slots 11.326 us/op 10.505 us/op 1.08
processSlot - 32 slots 2.4170 ms/op 2.1815 ms/op 1.11
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.5119 ms/op 5.9865 ms/op 0.59
getCommitteeAssignments - req 1 vs - 250000 vc 1.8436 ms/op 1.9788 ms/op 0.93
getCommitteeAssignments - req 100 vs - 250000 vc 3.6006 ms/op 3.8445 ms/op 0.94
getCommitteeAssignments - req 1000 vs - 250000 vc 3.8466 ms/op 4.1177 ms/op 0.93
findModifiedValidators - 10000 modified validators 511.19 ms/op 714.20 ms/op 0.72
findModifiedValidators - 1000 modified validators 403.94 ms/op 437.04 ms/op 0.92
findModifiedValidators - 100 modified validators 236.16 ms/op 358.08 ms/op 0.66
findModifiedValidators - 10 modified validators 190.58 ms/op 245.83 ms/op 0.78
findModifiedValidators - 1 modified validators 144.15 ms/op 280.95 ms/op 0.51
findModifiedValidators - no difference 148.17 ms/op 156.32 ms/op 0.95
migrate state 1500000 validators, 3400 modified, 2000 new 1.1186 s/op 1.2415 s/op 0.90
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.2700 ns/op 4.4300 ns/op 0.96
state getBlockRootAtSlot - 250000 vs - 7PWei 574.18 ns/op 666.73 ns/op 0.86
computeProposerIndex 100000 validators 1.5424 ms/op 1.6533 ms/op 0.93
getNextSyncCommitteeIndices 1000 validators 122.93 ms/op 136.06 ms/op 0.90
getNextSyncCommitteeIndices 10000 validators 119.28 ms/op 134.18 ms/op 0.89
getNextSyncCommitteeIndices 100000 validators 116.84 ms/op 130.53 ms/op 0.90
computeProposers - vc 250000 660.60 us/op 709.69 us/op 0.93
computeEpochShuffling - vc 250000 40.427 ms/op 42.324 ms/op 0.96
getNextSyncCommittee - vc 250000 10.325 ms/op 11.875 ms/op 0.87
nodejs block root to RootHex using toHex 141.11 ns/op 149.59 ns/op 0.94
nodejs block root to RootHex using toRootHex 86.287 ns/op 91.661 ns/op 0.94
nodejs fromHex(blob) 178.54 us/op 513.36 us/op 0.35
nodejs fromHexInto(blob) 690.89 us/op 720.31 us/op 0.96
nodejs block root to RootHex using the deprecated toHexString 211.09 ns/op 592.09 ns/op 0.36
browser block root to RootHex using toHex 164.06 ns/op 302.43 ns/op 0.54
browser block root to RootHex using toRootHex 152.30 ns/op 160.83 ns/op 0.95
browser fromHex(blob) 1.0663 ms/op 1.2589 ms/op 0.85
browser fromHexInto(blob) 715.74 us/op 723.36 us/op 0.99
browser block root to RootHex using the deprecated toHexString 589.14 ns/op 440.94 ns/op 1.34

by benchmarkbot/action

github-actions[bot] avatar Dec 09 '25 07:12 github-actions[bot]

/gemini review

ensi321 avatar Dec 13 '25 02:12 ensi321