feat: implement ePBS gossip topics
- 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_proofandbeacon_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
DataColumnSidecarhandling
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.tsandattestation.tsto incorporate "Gloas" fork-specific rules, particularly concerningattestation.data.indexvalues. - Block Validation Adjustments: Updated block validation in
block.tsto conditionally apply existing checks (e.g.,blobKzgCommitmentslength, 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, andPayloadAttestationMessageto 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.
[!WARNING] Gemini encountered an error creating the review. You can try again by commenting
/gemini review.
/gemini review
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
/gemini review