Skip to content

fix: correct pre-Deneb attestation propagation slot range boundary - #9031

Merged
wemeetagain merged 2 commits into
unstablefrom
nflaig/gossip-validation-tests-2
Mar 13, 2026
Merged

fix: correct pre-Deneb attestation propagation slot range boundary#9031
wemeetagain merged 2 commits into
unstablefrom
nflaig/gossip-validation-tests-2

Conversation

@nflaig

@nflaig nflaig commented Mar 13, 2026

Copy link
Copy Markdown
Member

slotWithPastTolerance floors the disparity-adjusted time to a slot, which is one slot too strict at the exact boundary where compute_time_at_slot(slot + range + 1) + MAXIMUM_GOSSIP_CLOCK_DISPARITY equals current_time_ms. Use isCurrentSlotGivenGossipDisparity to extend the lower bound by one slot only within the disparity window.

Caught by consensus-specs gossip validation reference tests ethereum/consensus-specs#4902

slotWithPastTolerance floors the disparity-adjusted time to a slot,
which is one slot too strict at the exact boundary where
compute_time_at_slot(slot + range + 1) + MAXIMUM_GOSSIP_CLOCK_DISPARITY
equals current_time_ms. Use isCurrentSlotGivenGossipDisparity to
extend the lower bound by one slot only within the disparity window.

Caught by consensus-specs gossip validation reference tests
@nflaig
nflaig requested a review from a team as a code owner March 13, 2026 12:12
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, 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 addresses a subtle bug in the pre-Deneb attestation propagation validation logic. The previous implementation was too strict at the boundary where the disparity-adjusted time aligned with the current time, causing valid attestations to be rejected. The fix adjusts the lower bound of the permissible slot range by one slot, but only when the clock still considers the previous slot current within the gossip disparity window. This ensures compliance with consensus-specs gossip validation reference tests. Additionally, the test utility was updated to skip the 'heze' fork in spec tests.

Highlights

  • Attestation Propagation Logic: Corrected the calculation of the earliest permissible slot for pre-Deneb attestations to properly account for the MAXIMUM_GOSSIP_CLOCK_DISPARITY at the exact boundary, preventing attestations from being considered invalid too early.
  • Test Configuration Update: Updated the test suite configuration to include 'heze' in the list of skipped forks for spec tests.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • packages/beacon-node/src/chain/validation/attestation.ts
    • Modified the verifyPropagationSlotRange function to introduce currentSlot and withinPastDisparity variables, refining the earliestPermissibleSlot calculation for pre-Deneb forks.
  • packages/beacon-node/test/spec/utils/specTestIterator.ts
    • Imported forkAll from @lodestar/params.
    • Added 'heze' to the skippedForks array in defaultSkipOpts.
Activity
  • No specific activity (comments, reviews, progress updates) has been recorded for this pull request yet.
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 corrects the pre-Deneb attestation propagation slot range boundary calculation. The previous implementation was one slot too strict at the boundary due to flooring. The new logic correctly extends the lower bound by one slot within the gossip disparity window, aligning with the consensus specs. The changes also include updates to skip certain tests. The fix appears correct and well-implemented.

// ```
export const defaultSkipOpts: SkipOpts = {
skippedForks: ["eip7805"],
skippedForks: ["eip7805", "heze"],

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.

not related but good to skip for now before someone else runs into same issue, we don't have boilerplate for heze set up yet, so we can't pass this right now

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 77cee14fac

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/beacon-node/src/chain/validation/attestation.ts
@github-actions

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 724705e Previous: 8cdde18 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.1667 ms/op 1.0309 ms/op 1.13
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 39.709 us/op 39.607 us/op 1.00
BLS verify - blst 1.1161 ms/op 1.4406 ms/op 0.77
BLS verifyMultipleSignatures 3 - blst 1.7097 ms/op 1.7943 ms/op 0.95
BLS verifyMultipleSignatures 8 - blst 2.7189 ms/op 2.3420 ms/op 1.16
BLS verifyMultipleSignatures 32 - blst 6.6936 ms/op 7.4087 ms/op 0.90
BLS verifyMultipleSignatures 64 - blst 10.899 ms/op 10.525 ms/op 1.04
BLS verifyMultipleSignatures 128 - blst 17.322 ms/op 17.455 ms/op 0.99
BLS deserializing 10000 signatures 697.85 ms/op 694.96 ms/op 1.00
BLS deserializing 100000 signatures 7.0247 s/op 6.7637 s/op 1.04
BLS verifyMultipleSignatures - same message - 3 - blst 1.0748 ms/op 1.6737 ms/op 0.64
BLS verifyMultipleSignatures - same message - 8 - blst 1.2292 ms/op 1.1773 ms/op 1.04
BLS verifyMultipleSignatures - same message - 32 - blst 1.7755 ms/op 1.7528 ms/op 1.01
BLS verifyMultipleSignatures - same message - 64 - blst 2.6998 ms/op 2.7647 ms/op 0.98
BLS verifyMultipleSignatures - same message - 128 - blst 4.4835 ms/op 4.3491 ms/op 1.03
BLS aggregatePubkeys 32 - blst 21.761 us/op 19.515 us/op 1.12
BLS aggregatePubkeys 128 - blst 77.516 us/op 69.668 us/op 1.11
getSlashingsAndExits - default max 71.989 us/op 65.235 us/op 1.10
getSlashingsAndExits - 2k 320.80 us/op 309.75 us/op 1.04
isKnown best case - 1 super set check 222.00 ns/op 206.00 ns/op 1.08
isKnown normal case - 2 super set checks 206.00 ns/op 203.00 ns/op 1.01
isKnown worse case - 16 super set checks 212.00 ns/op 204.00 ns/op 1.04
validate api signedAggregateAndProof - struct 1.4242 ms/op 1.5206 ms/op 0.94
validate gossip signedAggregateAndProof - struct 1.6849 ms/op 1.5075 ms/op 1.12
batch validate gossip attestation - vc 640000 - chunk 32 123.59 us/op 115.40 us/op 1.07
batch validate gossip attestation - vc 640000 - chunk 64 124.84 us/op 103.05 us/op 1.21
batch validate gossip attestation - vc 640000 - chunk 128 117.99 us/op 95.097 us/op 1.24
batch validate gossip attestation - vc 640000 - chunk 256 100.00 us/op 90.589 us/op 1.10
bytes32 toHexString 365.00 ns/op 340.00 ns/op 1.07
bytes32 Buffer.toString(hex) 254.00 ns/op 276.00 ns/op 0.92
bytes32 Buffer.toString(hex) from Uint8Array 347.00 ns/op 306.00 ns/op 1.13
bytes32 Buffer.toString(hex) + 0x 236.00 ns/op 301.00 ns/op 0.78
Return object 10000 times 0.26170 ns/op 0.22500 ns/op 1.16
Throw Error 10000 times 4.2764 us/op 4.1702 us/op 1.03
toHex 141.17 ns/op 134.34 ns/op 1.05
Buffer.from 133.82 ns/op 125.55 ns/op 1.07
shared Buffer 78.606 ns/op 74.702 ns/op 1.05
fastMsgIdFn sha256 / 200 bytes 1.9290 us/op 1.8170 us/op 1.06
fastMsgIdFn h32 xxhash / 200 bytes 198.00 ns/op 196.00 ns/op 1.01
fastMsgIdFn h64 xxhash / 200 bytes 263.00 ns/op 312.00 ns/op 0.84
fastMsgIdFn sha256 / 1000 bytes 6.1090 us/op 5.7620 us/op 1.06
fastMsgIdFn h32 xxhash / 1000 bytes 294.00 ns/op 302.00 ns/op 0.97
fastMsgIdFn h64 xxhash / 1000 bytes 313.00 ns/op 309.00 ns/op 1.01
fastMsgIdFn sha256 / 10000 bytes 53.996 us/op 50.527 us/op 1.07
fastMsgIdFn h32 xxhash / 10000 bytes 1.4620 us/op 1.3650 us/op 1.07
fastMsgIdFn h64 xxhash / 10000 bytes 975.00 ns/op 901.00 ns/op 1.08
send data - 1000 256B messages 4.9480 ms/op 6.1335 ms/op 0.81
send data - 1000 512B messages 4.4748 ms/op 4.7333 ms/op 0.95
send data - 1000 1024B messages 4.9465 ms/op 4.9824 ms/op 0.99
send data - 1000 1200B messages 5.2898 ms/op 5.7580 ms/op 0.92
send data - 1000 2048B messages 6.1163 ms/op 6.8053 ms/op 0.90
send data - 1000 4096B messages 6.9392 ms/op 7.1670 ms/op 0.97
send data - 1000 16384B messages 33.358 ms/op 28.500 ms/op 1.17
send data - 1000 65536B messages 104.78 ms/op 104.23 ms/op 1.01
enrSubnets - fastDeserialize 64 bits 932.00 ns/op 876.00 ns/op 1.06
enrSubnets - ssz BitVector 64 bits 449.00 ns/op 312.00 ns/op 1.44
enrSubnets - fastDeserialize 4 bits 161.00 ns/op 122.00 ns/op 1.32
enrSubnets - ssz BitVector 4 bits 349.00 ns/op 316.00 ns/op 1.10
prioritizePeers score -10:0 att 32-0.1 sync 2-0 260.40 us/op 282.08 us/op 0.92
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 267.07 us/op 315.93 us/op 0.85
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 384.78 us/op 378.07 us/op 1.02
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 744.19 us/op 687.18 us/op 1.08
prioritizePeers score 0:0 att 64-1 sync 4-1 902.64 us/op 1.1760 ms/op 0.77
array of 16000 items push then shift 1.6509 us/op 1.5327 us/op 1.08
LinkedList of 16000 items push then shift 7.5250 ns/op 7.1610 ns/op 1.05
array of 16000 items push then pop 78.393 ns/op 74.301 ns/op 1.06
LinkedList of 16000 items push then pop 7.4150 ns/op 6.8740 ns/op 1.08
array of 24000 items push then shift 2.4149 us/op 2.3210 us/op 1.04
LinkedList of 24000 items push then shift 7.7840 ns/op 7.3010 ns/op 1.07
array of 24000 items push then pop 105.99 ns/op 104.56 ns/op 1.01
LinkedList of 24000 items push then pop 7.2870 ns/op 6.9090 ns/op 1.05
intersect bitArray bitLen 8 5.8070 ns/op 5.5870 ns/op 1.04
intersect array and set length 8 34.400 ns/op 38.626 ns/op 0.89
intersect bitArray bitLen 128 27.189 ns/op 28.032 ns/op 0.97
intersect array and set length 128 557.78 ns/op 684.45 ns/op 0.81
bitArray.getTrueBitIndexes() bitLen 128 1.0940 us/op 1.0100 us/op 1.08
bitArray.getTrueBitIndexes() bitLen 248 1.9250 us/op 1.8080 us/op 1.06
bitArray.getTrueBitIndexes() bitLen 512 3.9140 us/op 3.6740 us/op 1.07
Full columns - reconstruct all 6 blobs 223.86 us/op 251.23 us/op 0.89
Full columns - reconstruct half of the blobs out of 6 93.923 us/op 127.90 us/op 0.73
Full columns - reconstruct single blob out of 6 32.638 us/op 41.880 us/op 0.78
Half columns - reconstruct all 6 blobs 282.53 ms/op 266.62 ms/op 1.06
Half columns - reconstruct half of the blobs out of 6 142.74 ms/op 133.32 ms/op 1.07
Half columns - reconstruct single blob out of 6 52.268 ms/op 48.778 ms/op 1.07
Full columns - reconstruct all 10 blobs 391.84 us/op 308.24 us/op 1.27
Full columns - reconstruct half of the blobs out of 10 173.75 us/op 157.36 us/op 1.10
Full columns - reconstruct single blob out of 10 33.010 us/op 29.949 us/op 1.10
Half columns - reconstruct all 10 blobs 467.56 ms/op 434.39 ms/op 1.08
Half columns - reconstruct half of the blobs out of 10 238.11 ms/op 220.48 ms/op 1.08
Half columns - reconstruct single blob out of 10 52.725 ms/op 48.400 ms/op 1.09
Full columns - reconstruct all 20 blobs 559.55 us/op 790.66 us/op 0.71
Full columns - reconstruct half of the blobs out of 20 417.12 us/op 320.26 us/op 1.30
Full columns - reconstruct single blob out of 20 37.696 us/op 30.898 us/op 1.22
Half columns - reconstruct all 20 blobs 917.68 ms/op 864.51 ms/op 1.06
Half columns - reconstruct half of the blobs out of 20 463.75 ms/op 436.48 ms/op 1.06
Half columns - reconstruct single blob out of 20 55.265 ms/op 48.759 ms/op 1.13
Set add up to 64 items then delete first 2.1990 us/op 1.9560 us/op 1.12
OrderedSet add up to 64 items then delete first 3.1723 us/op 2.9035 us/op 1.09
Set add up to 64 items then delete last 2.4740 us/op 2.2281 us/op 1.11
OrderedSet add up to 64 items then delete last 3.5609 us/op 3.1756 us/op 1.12
Set add up to 64 items then delete middle 2.4046 us/op 2.1960 us/op 1.10
OrderedSet add up to 64 items then delete middle 5.1133 us/op 4.6592 us/op 1.10
Set add up to 128 items then delete first 5.0936 us/op 4.5115 us/op 1.13
OrderedSet add up to 128 items then delete first 7.7448 us/op 6.8265 us/op 1.13
Set add up to 128 items then delete last 5.1123 us/op 4.3534 us/op 1.17
OrderedSet add up to 128 items then delete last 7.0725 us/op 6.3556 us/op 1.11
Set add up to 128 items then delete middle 4.8759 us/op 4.2820 us/op 1.14
OrderedSet add up to 128 items then delete middle 14.257 us/op 12.546 us/op 1.14
Set add up to 256 items then delete first 10.602 us/op 9.4291 us/op 1.12
OrderedSet add up to 256 items then delete first 16.640 us/op 14.487 us/op 1.15
Set add up to 256 items then delete last 10.633 us/op 8.7268 us/op 1.22
OrderedSet add up to 256 items then delete last 15.487 us/op 13.206 us/op 1.17
Set add up to 256 items then delete middle 9.8487 us/op 8.6436 us/op 1.14
OrderedSet add up to 256 items then delete middle 46.032 us/op 39.069 us/op 1.18
pass gossip attestations to forkchoice per slot 579.59 us/op 463.93 us/op 1.25
computeDeltas 1400000 validators 0% inactive 15.336 ms/op 13.626 ms/op 1.13
computeDeltas 1400000 validators 10% inactive 15.102 ms/op 13.164 ms/op 1.15
computeDeltas 1400000 validators 20% inactive 13.097 ms/op 12.022 ms/op 1.09
computeDeltas 1400000 validators 50% inactive 10.334 ms/op 9.4793 ms/op 1.09
computeDeltas 2100000 validators 0% inactive 23.249 ms/op 21.073 ms/op 1.10
computeDeltas 2100000 validators 10% inactive 21.247 ms/op 20.091 ms/op 1.06
computeDeltas 2100000 validators 20% inactive 19.699 ms/op 18.334 ms/op 1.07
computeDeltas 2100000 validators 50% inactive 15.255 ms/op 14.276 ms/op 1.07
altair processAttestation - setStatus - 1/6 committees join 584.00 ns/op 551.00 ns/op 1.06
altair processAttestation - setStatus - 1/3 committees join 900.00 ns/op 951.00 ns/op 0.95
altair processAttestation - setStatus - 1/2 committees join 1.2950 us/op 1.3210 us/op 0.98
altair processAttestation - setStatus - 2/3 committees join 1.5140 us/op 1.4560 us/op 1.04
altair processAttestation - setStatus - 4/5 committees join 1.7530 us/op 1.6060 us/op 1.09
altair processAttestation - setStatus - 100% committees join 2.0940 us/op 1.9210 us/op 1.09
phase0 processBlock - 250000 vs - 7PWei normalcase 2.0979 ms/op 1.5685 ms/op 1.34
phase0 processBlock - 250000 vs - 7PWei worstcase 33.230 ms/op 28.358 ms/op 1.17
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 14.433 us/op 5.7380 us/op 2.52
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 70.636 us/op 55.111 us/op 1.28
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 21.321 us/op 16.508 us/op 1.29
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 15.006 us/op 10.697 us/op 1.40
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 258.69 us/op 242.07 us/op 1.07
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 2.5784 ms/op 1.7916 ms/op 1.44
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 3.4176 ms/op 2.1988 ms/op 1.55
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 3.5330 ms/op 2.0517 ms/op 1.72
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 6.1178 ms/op 4.1721 ms/op 1.47
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 4.0222 ms/op 2.7828 ms/op 1.45
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 7.7746 ms/op 4.7172 ms/op 1.65
Tree 40 250000 create 488.32 ms/op 379.24 ms/op 1.29
Tree 40 250000 get(125000) 150.98 ns/op 127.48 ns/op 1.18
Tree 40 250000 set(125000) 1.4865 us/op 1.2120 us/op 1.23
Tree 40 250000 toArray() 23.329 ms/op 13.480 ms/op 1.73
Tree 40 250000 iterate all - toArray() + loop 21.374 ms/op 13.323 ms/op 1.60
Tree 40 250000 iterate all - get(i) 58.643 ms/op 45.855 ms/op 1.28
Array 250000 create 3.2718 ms/op 2.4189 ms/op 1.35
Array 250000 clone - spread 993.65 us/op 802.20 us/op 1.24
Array 250000 get(125000) 0.41200 ns/op 0.42900 ns/op 0.96
Array 250000 set(125000) 0.39500 ns/op 0.35400 ns/op 1.12
Array 250000 iterate all - loop 65.112 us/op 61.362 us/op 1.06
phase0 afterProcessEpoch - 250000 vs - 7PWei 49.177 ms/op 41.927 ms/op 1.17
Array.fill - length 1000000 4.4119 ms/op 3.1607 ms/op 1.40
Array push - length 1000000 13.760 ms/op 10.617 ms/op 1.30
Array.get 0.22971 ns/op 0.21867 ns/op 1.05
Uint8Array.get 0.22886 ns/op 0.22019 ns/op 1.04
phase0 beforeProcessEpoch - 250000 vs - 7PWei 19.885 ms/op 14.436 ms/op 1.38
altair processEpoch - mainnet_e81889 342.25 ms/op 264.98 ms/op 1.29
mainnet_e81889 - altair beforeProcessEpoch 35.594 ms/op 17.371 ms/op 2.05
mainnet_e81889 - altair processJustificationAndFinalization 7.5620 us/op 5.2750 us/op 1.43
mainnet_e81889 - altair processInactivityUpdates 4.0293 ms/op 4.0213 ms/op 1.00
mainnet_e81889 - altair processRewardsAndPenalties 22.473 ms/op 24.706 ms/op 0.91
mainnet_e81889 - altair processRegistryUpdates 725.00 ns/op 718.00 ns/op 1.01
mainnet_e81889 - altair processSlashings 230.00 ns/op 213.00 ns/op 1.08
mainnet_e81889 - altair processEth1DataReset 220.00 ns/op 242.00 ns/op 0.91
mainnet_e81889 - altair processEffectiveBalanceUpdates 2.0441 ms/op 1.8049 ms/op 1.13
mainnet_e81889 - altair processSlashingsReset 910.00 ns/op 841.00 ns/op 1.08
mainnet_e81889 - altair processRandaoMixesReset 1.4550 us/op 1.0730 us/op 1.36
mainnet_e81889 - altair processHistoricalRootsUpdate 175.00 ns/op 160.00 ns/op 1.09
mainnet_e81889 - altair processParticipationFlagUpdates 532.00 ns/op 492.00 ns/op 1.08
mainnet_e81889 - altair processSyncCommitteeUpdates 143.00 ns/op 157.00 ns/op 0.91
mainnet_e81889 - altair afterProcessEpoch 45.416 ms/op 43.330 ms/op 1.05
capella processEpoch - mainnet_e217614 788.70 ms/op 847.53 ms/op 0.93
mainnet_e217614 - capella beforeProcessEpoch 60.906 ms/op 53.038 ms/op 1.15
mainnet_e217614 - capella processJustificationAndFinalization 5.8000 us/op 7.0480 us/op 0.82
mainnet_e217614 - capella processInactivityUpdates 16.265 ms/op 16.332 ms/op 1.00
mainnet_e217614 - capella processRewardsAndPenalties 126.84 ms/op 115.65 ms/op 1.10
mainnet_e217614 - capella processRegistryUpdates 6.0850 us/op 5.7090 us/op 1.07
mainnet_e217614 - capella processSlashings 184.00 ns/op 201.00 ns/op 0.92
mainnet_e217614 - capella processEth1DataReset 169.00 ns/op 170.00 ns/op 0.99
mainnet_e217614 - capella processEffectiveBalanceUpdates 14.511 ms/op 10.840 ms/op 1.34
mainnet_e217614 - capella processSlashingsReset 948.00 ns/op 1.0340 us/op 0.92
mainnet_e217614 - capella processRandaoMixesReset 1.3080 us/op 1.1910 us/op 1.10
mainnet_e217614 - capella processHistoricalRootsUpdate 170.00 ns/op 158.00 ns/op 1.08
mainnet_e217614 - capella processParticipationFlagUpdates 500.00 ns/op 501.00 ns/op 1.00
mainnet_e217614 - capella afterProcessEpoch 117.41 ms/op 113.91 ms/op 1.03
phase0 processEpoch - mainnet_e58758 246.73 ms/op 248.02 ms/op 0.99
mainnet_e58758 - phase0 beforeProcessEpoch 65.233 ms/op 52.366 ms/op 1.25
mainnet_e58758 - phase0 processJustificationAndFinalization 6.1800 us/op 5.3830 us/op 1.15
mainnet_e58758 - phase0 processRewardsAndPenalties 23.882 ms/op 21.354 ms/op 1.12
mainnet_e58758 - phase0 processRegistryUpdates 2.9440 us/op 2.7430 us/op 1.07
mainnet_e58758 - phase0 processSlashings 184.00 ns/op 169.00 ns/op 1.09
mainnet_e58758 - phase0 processEth1DataReset 170.00 ns/op 169.00 ns/op 1.01
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.1401 ms/op 1.0301 ms/op 1.11
mainnet_e58758 - phase0 processSlashingsReset 1.0580 us/op 869.00 ns/op 1.22
mainnet_e58758 - phase0 processRandaoMixesReset 1.1760 us/op 1.0820 us/op 1.09
mainnet_e58758 - phase0 processHistoricalRootsUpdate 290.00 ns/op 222.00 ns/op 1.31
mainnet_e58758 - phase0 processParticipationRecordUpdates 867.00 ns/op 880.00 ns/op 0.99
mainnet_e58758 - phase0 afterProcessEpoch 36.753 ms/op 35.414 ms/op 1.04
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.8374 ms/op 1.6832 ms/op 1.09
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.1095 ms/op 1.5905 ms/op 1.33
altair processInactivityUpdates - 250000 normalcase 93.593 us/op 96.735 us/op 0.97
altair processInactivityUpdates - 250000 worstcase 80.768 us/op 89.814 us/op 0.90
phase0 processRegistryUpdates - 250000 normalcase 4.5030 us/op 10.832 us/op 0.42
phase0 processRegistryUpdates - 250000 badcase_full_deposits 256.06 us/op 362.12 us/op 0.71
phase0 processRegistryUpdates - 250000 worstcase 0.5 82.221 ms/op 65.293 ms/op 1.26
altair processRewardsAndPenalties - 250000 normalcase 116.23 us/op 125.70 us/op 0.92
altair processRewardsAndPenalties - 250000 worstcase 127.52 us/op 121.07 us/op 1.05
phase0 getAttestationDeltas - 250000 normalcase 5.6835 ms/op 6.4585 ms/op 0.88
phase0 getAttestationDeltas - 250000 worstcase 5.7633 ms/op 6.5265 ms/op 0.88
phase0 processSlashings - 250000 worstcase 102.60 us/op 119.35 us/op 0.86
altair processSyncCommitteeUpdates - 250000 9.0878 ms/op 8.4915 ms/op 1.07
BeaconState.hashTreeRoot - No change 197.00 ns/op 251.00 ns/op 0.78
BeaconState.hashTreeRoot - 1 full validator 94.138 us/op 78.834 us/op 1.19
BeaconState.hashTreeRoot - 32 full validator 947.84 us/op 972.02 us/op 0.98
BeaconState.hashTreeRoot - 512 full validator 8.9613 ms/op 8.1531 ms/op 1.10
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 88.815 us/op 113.87 us/op 0.78
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5684 ms/op 1.3649 ms/op 1.15
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 19.202 ms/op 20.065 ms/op 0.96
BeaconState.hashTreeRoot - 1 balances 93.343 us/op 91.316 us/op 1.02
BeaconState.hashTreeRoot - 32 balances 1.0379 ms/op 929.98 us/op 1.12
BeaconState.hashTreeRoot - 512 balances 7.7974 ms/op 6.1672 ms/op 1.26
BeaconState.hashTreeRoot - 250000 balances 158.64 ms/op 147.50 ms/op 1.08
aggregationBits - 2048 els - zipIndexesInBitList 20.297 us/op 20.772 us/op 0.98
regular array get 100000 times 24.258 us/op 24.380 us/op 0.99
wrappedArray get 100000 times 24.151 us/op 24.453 us/op 0.99
arrayWithProxy get 100000 times 23.561 ms/op 15.144 ms/op 1.56
ssz.Root.equals 23.731 ns/op 23.588 ns/op 1.01
byteArrayEquals 23.172 ns/op 23.250 ns/op 1.00
Buffer.compare 9.8910 ns/op 9.8510 ns/op 1.00
processSlot - 1 slots 12.526 us/op 10.933 us/op 1.15
processSlot - 32 slots 2.9812 ms/op 1.8611 ms/op 1.60
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.5806 ms/op 3.3316 ms/op 1.68
getCommitteeAssignments - req 1 vs - 250000 vc 1.8892 ms/op 1.8678 ms/op 1.01
getCommitteeAssignments - req 100 vs - 250000 vc 3.7513 ms/op 3.7092 ms/op 1.01
getCommitteeAssignments - req 1000 vs - 250000 vc 4.0427 ms/op 4.0019 ms/op 1.01
findModifiedValidators - 10000 modified validators 656.76 ms/op 506.67 ms/op 1.30
findModifiedValidators - 1000 modified validators 371.62 ms/op 468.92 ms/op 0.79
findModifiedValidators - 100 modified validators 240.15 ms/op 143.47 ms/op 1.67
findModifiedValidators - 10 modified validators 256.07 ms/op 221.56 ms/op 1.16
findModifiedValidators - 1 modified validators 183.24 ms/op 157.41 ms/op 1.16
findModifiedValidators - no difference 184.18 ms/op 164.39 ms/op 1.12
migrate state 1500000 validators, 3400 modified, 2000 new 361.80 ms/op 368.01 ms/op 0.98
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.2300 ns/op 3.9300 ns/op 1.08
state getBlockRootAtSlot - 250000 vs - 7PWei 781.21 ns/op 560.84 ns/op 1.39
computeProposerIndex 100000 validators 1.6267 ms/op 1.5169 ms/op 1.07
getNextSyncCommitteeIndices 1000 validators 3.4186 ms/op 3.3452 ms/op 1.02
getNextSyncCommitteeIndices 10000 validators 3.3432 ms/op 3.3489 ms/op 1.00
getNextSyncCommitteeIndices 100000 validators 3.3591 ms/op 3.3468 ms/op 1.00
computeProposers - vc 250000 641.15 us/op 612.48 us/op 1.05
computeEpochShuffling - vc 250000 42.391 ms/op 40.981 ms/op 1.03
getNextSyncCommittee - vc 250000 11.168 ms/op 10.112 ms/op 1.10
nodejs block root to RootHex using toHex 145.11 ns/op 141.95 ns/op 1.02
nodejs block root to RootHex using toRootHex 87.255 ns/op 84.071 ns/op 1.04
nodejs fromHex(blob) 257.38 us/op 215.80 us/op 1.19
nodejs fromHexInto(blob) 719.72 us/op 704.43 us/op 1.02
nodejs block root to RootHex using the deprecated toHexString 537.74 ns/op 209.08 ns/op 2.57
nodejs byteArrayEquals 32 bytes (block root) 29.611 ns/op 28.465 ns/op 1.04
nodejs byteArrayEquals 48 bytes (pubkey) 42.395 ns/op 40.729 ns/op 1.04
nodejs byteArrayEquals 96 bytes (signature) 41.968 ns/op 41.225 ns/op 1.02
nodejs byteArrayEquals 1024 bytes 48.618 ns/op 45.736 ns/op 1.06
nodejs byteArrayEquals 131072 bytes (blob) 1.9696 us/op 1.8725 us/op 1.05
browser block root to RootHex using toHex 181.82 ns/op 162.96 ns/op 1.12
browser block root to RootHex using toRootHex 161.66 ns/op 153.36 ns/op 1.05
browser fromHex(blob) 1.0900 ms/op 977.08 us/op 1.12
browser fromHexInto(blob) 722.71 us/op 706.45 us/op 1.02
browser block root to RootHex using the deprecated toHexString 405.49 ns/op 561.80 ns/op 0.72
browser byteArrayEquals 32 bytes (block root) 32.074 ns/op 30.371 ns/op 1.06
browser byteArrayEquals 48 bytes (pubkey) 44.740 ns/op 42.357 ns/op 1.06
browser byteArrayEquals 96 bytes (signature) 87.986 ns/op 83.122 ns/op 1.06
browser byteArrayEquals 1024 bytes 827.15 ns/op 781.36 ns/op 1.06
browser byteArrayEquals 131072 bytes (blob) 104.73 us/op 99.242 us/op 1.06

by benchmarkbot/action

@wemeetagain
wemeetagain merged commit 1ddf8e4 into unstable Mar 13, 2026
24 of 25 checks passed
@wemeetagain
wemeetagain deleted the nflaig/gossip-validation-tests-2 branch March 13, 2026 14:22
@codecov

codecov Bot commented Mar 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.32%. Comparing base (8cdde18) to head (77cee14).
⚠️ Report is 1 commits behind head on unstable.

Additional details and impacted files
@@             Coverage Diff              @@
##           unstable    #9031      +/-   ##
============================================
- Coverage     52.32%   52.32%   -0.01%     
============================================
  Files           848      848              
  Lines         62507    62505       -2     
  Branches       4603     4603              
============================================
- Hits          32705    32703       -2     
  Misses        29736    29736              
  Partials         66       66              
🚀 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

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.41.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.

2 participants