Skip to content

fix: ignore PTC votes whose slot does not match the referenced block#9425

Merged
wemeetagain merged 1 commit into
unstablefrom
nflaig/fix-ptc-vote-slot-guard
May 30, 2026
Merged

fix: ignore PTC votes whose slot does not match the referenced block#9425
wemeetagain merged 1 commit into
unstablefrom
nflaig/fix-ptc-vote-slot-guard

Conversation

@nflaig
Copy link
Copy Markdown
Member

@nflaig nflaig commented May 30, 2026

Motivation

adhere to spec notify_ptc_messages

# PTC votes can only change the vote for their assigned beacon block, return early otherwise
 if data.slot != state.slot:
    return

see #9415 (comment), this caused issues on glamsterdam-devnet-4

Description

Ignore PTC votes whose slot does not match the referenced block

@nflaig nflaig requested a review from a team as a code owner May 30, 2026 13:31
Copy link
Copy Markdown
Contributor

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

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 updates the notifyPtcMessages method in the fork-choice and proto-array modules to accept a slot parameter. This ensures that Payload Timeliness Committee (PTC) votes are only processed if their slot matches the assigned beacon block's slot, preventing out-of-slot votes from mutating the fork choice state. The corresponding API, gossip handlers, block import logic, and unit tests have been updated to support this new parameter. No review comments were provided, so there is no feedback to address.

Copy link
Copy Markdown

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

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: c6fef950ae

ℹ️ 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 on lines +697 to +698
if (node === undefined || node.slot !== slot) {
return;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reject slot-mismatched PTC messages before side effects

When this new branch returns for data.slot != block.slot, gossip/API validation has already treated the message as valid: validatePayloadAttestationMessage() only checks that the block root is known, verifies the signature against data.slot, and then adds the validator to seenPayloadAttesters; the API/gossip handlers also insert it into the payload-attestation pool before calling here. In the skipped-slot case the local validator API can produce exactly this shape by returning the closest prior canonical block with the current slot, so the message is then silently ignored by fork choice but still consumes the validator's per-epoch dedup and can be pooled/published. Please move this slot/root check into validation before marking seen/inserting, or make this call report that the message was ignored so callers can avoid those side effects.

Useful? React with 👍 / 👎.

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.

@github-actions
Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 913d459 Previous: ff43f01 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0642 ms/op 1.4649 ms/op 0.73
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 42.138 us/op 42.099 us/op 1.00
BLS verify - blst 676.50 us/op 715.81 us/op 0.95
BLS verifyMultipleSignatures 3 - blst 1.3968 ms/op 1.3562 ms/op 1.03
BLS verifyMultipleSignatures 8 - blst 2.2107 ms/op 2.1086 ms/op 1.05
BLS verifyMultipleSignatures 32 - blst 6.9686 ms/op 6.6683 ms/op 1.05
BLS verifyMultipleSignatures 64 - blst 13.319 ms/op 12.789 ms/op 1.04
BLS verifyMultipleSignatures 128 - blst 26.067 ms/op 25.679 ms/op 1.02
BLS deserializing 10000 signatures 652.76 ms/op 613.44 ms/op 1.06
BLS deserializing 100000 signatures 6.2828 s/op 6.1398 s/op 1.02
BLS verifyMultipleSignatures - same message - 3 - blst 731.77 us/op 772.81 us/op 0.95
BLS verifyMultipleSignatures - same message - 8 - blst 857.39 us/op 802.98 us/op 1.07
BLS verifyMultipleSignatures - same message - 32 - blst 1.4664 ms/op 1.4739 ms/op 0.99
BLS verifyMultipleSignatures - same message - 64 - blst 2.2655 ms/op 2.2473 ms/op 1.01
BLS verifyMultipleSignatures - same message - 128 - blst 3.8960 ms/op 3.8332 ms/op 1.02
BLS aggregatePubkeys 32 - blst 16.841 us/op 16.988 us/op 0.99
BLS aggregatePubkeys 128 - blst 59.332 us/op 60.422 us/op 0.98
getSlashingsAndExits - default max 45.617 us/op 47.046 us/op 0.97
getSlashingsAndExits - 2k 354.32 us/op 362.30 us/op 0.98
proposeBlockBody type=full, size=empty 647.40 us/op 749.41 us/op 0.86
isKnown best case - 1 super set check 419.00 ns/op 165.00 ns/op 2.54
isKnown normal case - 2 super set checks 376.00 ns/op 159.00 ns/op 2.36
isKnown worse case - 16 super set checks 383.00 ns/op 164.00 ns/op 2.34
validate api signedAggregateAndProof - struct 1.4528 ms/op 1.4059 ms/op 1.03
validate gossip signedAggregateAndProof - struct 1.4572 ms/op 1.4041 ms/op 1.04
batch validate gossip attestation - vc 640000 - chunk 32 106.46 us/op 104.05 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 64 91.697 us/op 91.400 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 128 84.533 us/op 85.234 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 256 81.530 us/op 84.332 us/op 0.97
bytes32 toHexString 466.00 ns/op 273.00 ns/op 1.71
bytes32 Buffer.toString(hex) 362.00 ns/op 161.00 ns/op 2.25
bytes32 Buffer.toString(hex) from Uint8Array 433.00 ns/op 227.00 ns/op 1.91
bytes32 Buffer.toString(hex) + 0x 361.00 ns/op 164.00 ns/op 2.20
Return object 10000 times 0.22300 ns/op 0.20510 ns/op 1.09
Throw Error 10000 times 3.1848 us/op 3.1974 us/op 1.00
toHex 82.462 ns/op 84.797 ns/op 0.97
Buffer.from 76.923 ns/op 83.441 ns/op 0.92
shared Buffer 49.659 ns/op 49.672 ns/op 1.00
fastMsgIdFn sha256 / 200 bytes 1.6300 us/op 1.4220 us/op 1.15
fastMsgIdFn h32 xxhash / 200 bytes 348.00 ns/op 150.00 ns/op 2.32
fastMsgIdFn h64 xxhash / 200 bytes 405.00 ns/op 196.00 ns/op 2.07
fastMsgIdFn sha256 / 1000 bytes 4.7040 us/op 4.6060 us/op 1.02
fastMsgIdFn h32 xxhash / 1000 bytes 422.00 ns/op 235.00 ns/op 1.80
fastMsgIdFn h64 xxhash / 1000 bytes 442.00 ns/op 246.00 ns/op 1.80
fastMsgIdFn sha256 / 10000 bytes 39.685 us/op 40.715 us/op 0.97
fastMsgIdFn h32 xxhash / 10000 bytes 1.4230 us/op 1.2160 us/op 1.17
fastMsgIdFn h64 xxhash / 10000 bytes 1.0180 us/op 780.00 ns/op 1.31
send data - 1000 256B messages 4.1603 ms/op 4.4319 ms/op 0.94
send data - 1000 512B messages 4.3149 ms/op 4.5625 ms/op 0.95
send data - 1000 1024B messages 4.4186 ms/op 4.5637 ms/op 0.97
send data - 1000 1200B messages 4.8834 ms/op 4.7993 ms/op 1.02
send data - 1000 2048B messages 4.9638 ms/op 5.1604 ms/op 0.96
send data - 1000 4096B messages 5.6384 ms/op 6.1352 ms/op 0.92
send data - 1000 16384B messages 30.774 ms/op 36.680 ms/op 0.84
send data - 1000 65536B messages 115.56 ms/op 186.82 ms/op 0.62
enrSubnets - fastDeserialize 64 bits 982.00 ns/op 705.00 ns/op 1.39
enrSubnets - ssz BitVector 64 bits 473.00 ns/op 254.00 ns/op 1.86
enrSubnets - fastDeserialize 4 bits 284.00 ns/op 97.000 ns/op 2.93
enrSubnets - ssz BitVector 4 bits 495.00 ns/op 253.00 ns/op 1.96
prioritizePeers score -10:0 att 32-0.1 sync 2-0 208.25 us/op 199.86 us/op 1.04
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 223.07 us/op 244.88 us/op 0.91
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 326.47 us/op 338.42 us/op 0.96
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 585.50 us/op 597.07 us/op 0.98
prioritizePeers score 0:0 att 64-1 sync 4-1 671.23 us/op 717.07 us/op 0.94
array of 16000 items push then shift 1.2101 us/op 1.2516 us/op 0.97
LinkedList of 16000 items push then shift 7.3820 ns/op 7.9860 ns/op 0.92
array of 16000 items push then pop 64.402 ns/op 77.308 ns/op 0.83
LinkedList of 16000 items push then pop 5.9750 ns/op 6.0800 ns/op 0.98
array of 24000 items push then shift 1.7785 us/op 1.8672 us/op 0.95
LinkedList of 24000 items push then shift 6.9780 ns/op 7.7330 ns/op 0.90
array of 24000 items push then pop 96.403 ns/op 109.76 ns/op 0.88
LinkedList of 24000 items push then pop 6.0430 ns/op 6.2000 ns/op 0.97
intersect bitArray bitLen 8 4.7370 ns/op 4.6390 ns/op 1.02
intersect array and set length 8 28.024 ns/op 29.062 ns/op 0.96
intersect bitArray bitLen 128 23.044 ns/op 23.687 ns/op 0.97
intersect array and set length 128 479.95 ns/op 506.15 ns/op 0.95
bitArray.getTrueBitIndexes() bitLen 128 1.2350 us/op 1.0100 us/op 1.22
bitArray.getTrueBitIndexes() bitLen 248 1.9530 us/op 1.7660 us/op 1.11
bitArray.getTrueBitIndexes() bitLen 512 3.6930 us/op 3.5470 us/op 1.04
Full columns - reconstruct all 6 blobs 204.58 us/op 134.26 us/op 1.52
Full columns - reconstruct half of the blobs out of 6 119.44 us/op 66.417 us/op 1.80
Full columns - reconstruct single blob out of 6 35.854 us/op 81.738 us/op 0.44
Half columns - reconstruct all 6 blobs 375.33 ms/op 375.28 ms/op 1.00
Half columns - reconstruct half of the blobs out of 6 186.66 ms/op 189.13 ms/op 0.99
Half columns - reconstruct single blob out of 6 66.522 ms/op 67.204 ms/op 0.99
Full columns - reconstruct all 10 blobs 284.90 us/op 296.09 us/op 0.96
Full columns - reconstruct half of the blobs out of 10 220.46 us/op 147.66 us/op 1.49
Full columns - reconstruct single blob out of 10 34.342 us/op 32.069 us/op 1.07
Half columns - reconstruct all 10 blobs 613.84 ms/op 628.92 ms/op 0.98
Half columns - reconstruct half of the blobs out of 10 308.96 ms/op 313.80 ms/op 0.98
Half columns - reconstruct single blob out of 10 65.410 ms/op 67.055 ms/op 0.98
Full columns - reconstruct all 20 blobs 795.07 us/op 2.1248 ms/op 0.37
Full columns - reconstruct half of the blobs out of 20 388.46 us/op 270.61 us/op 1.44
Full columns - reconstruct single blob out of 20 32.241 us/op 29.131 us/op 1.11
Half columns - reconstruct all 20 blobs 1.2412 s/op 1.1948 s/op 1.04
Half columns - reconstruct half of the blobs out of 20 615.56 ms/op 599.98 ms/op 1.03
Half columns - reconstruct single blob out of 20 66.727 ms/op 64.181 ms/op 1.04
Set add up to 64 items then delete first 2.0049 us/op 2.4000 us/op 0.84
OrderedSet add up to 64 items then delete first 3.1646 us/op 3.1481 us/op 1.01
Set add up to 64 items then delete last 2.0501 us/op 2.1963 us/op 0.93
OrderedSet add up to 64 items then delete last 3.1984 us/op 3.0365 us/op 1.05
Set add up to 64 items then delete middle 1.9823 us/op 1.9830 us/op 1.00
OrderedSet add up to 64 items then delete middle 4.5394 us/op 4.3811 us/op 1.04
Set add up to 128 items then delete first 3.9983 us/op 3.9176 us/op 1.02
OrderedSet add up to 128 items then delete first 5.9062 us/op 6.0883 us/op 0.97
Set add up to 128 items then delete last 3.6635 us/op 3.5555 us/op 1.03
OrderedSet add up to 128 items then delete last 5.4858 us/op 5.3891 us/op 1.02
Set add up to 128 items then delete middle 3.6145 us/op 3.5946 us/op 1.01
OrderedSet add up to 128 items then delete middle 11.054 us/op 10.846 us/op 1.02
Set add up to 256 items then delete first 7.4507 us/op 7.3294 us/op 1.02
OrderedSet add up to 256 items then delete first 11.555 us/op 11.307 us/op 1.02
Set add up to 256 items then delete last 7.2135 us/op 7.2297 us/op 1.00
OrderedSet add up to 256 items then delete last 10.997 us/op 10.839 us/op 1.01
Set add up to 256 items then delete middle 8.1314 us/op 7.1898 us/op 1.13
OrderedSet add up to 256 items then delete middle 33.394 us/op 32.893 us/op 1.02
pass gossip attestations to forkchoice per slot 2.4982 ms/op 2.4638 ms/op 1.01
forkChoice updateHead vc 100000 bc 64 eq 0 382.07 us/op 373.87 us/op 1.02
forkChoice updateHead vc 600000 bc 64 eq 0 2.2753 ms/op 2.2148 ms/op 1.03
forkChoice updateHead vc 1000000 bc 64 eq 0 3.7926 ms/op 3.6892 ms/op 1.03
forkChoice updateHead vc 600000 bc 320 eq 0 2.2923 ms/op 2.2479 ms/op 1.02
forkChoice updateHead vc 600000 bc 1200 eq 0 2.3074 ms/op 2.3933 ms/op 0.96
forkChoice updateHead vc 600000 bc 7200 eq 0 2.5933 ms/op 3.0365 ms/op 0.85
forkChoice updateHead vc 600000 bc 64 eq 1000 2.8926 ms/op 2.8269 ms/op 1.02
forkChoice updateHead vc 600000 bc 64 eq 10000 2.9775 ms/op 2.8955 ms/op 1.03
forkChoice updateHead vc 600000 bc 64 eq 300000 6.5557 ms/op 6.7827 ms/op 0.97
computeDeltas 1400000 validators 0% inactive 12.143 ms/op 12.023 ms/op 1.01
computeDeltas 1400000 validators 10% inactive 11.363 ms/op 11.217 ms/op 1.01
computeDeltas 1400000 validators 20% inactive 10.339 ms/op 10.221 ms/op 1.01
computeDeltas 1400000 validators 50% inactive 8.0146 ms/op 7.8913 ms/op 1.02
computeDeltas 2100000 validators 0% inactive 18.187 ms/op 18.112 ms/op 1.00
computeDeltas 2100000 validators 10% inactive 17.026 ms/op 16.881 ms/op 1.01
computeDeltas 2100000 validators 20% inactive 15.497 ms/op 15.361 ms/op 1.01
computeDeltas 2100000 validators 50% inactive 9.4699 ms/op 8.9063 ms/op 1.06
altair processAttestation - 250000 vs - 7PWei normalcase 1.8394 ms/op 1.8803 ms/op 0.98
altair processAttestation - 250000 vs - 7PWei worstcase 2.5333 ms/op 2.6677 ms/op 0.95
altair processAttestation - setStatus - 1/6 committees join 95.839 us/op 98.156 us/op 0.98
altair processAttestation - setStatus - 1/3 committees join 190.50 us/op 183.75 us/op 1.04
altair processAttestation - setStatus - 1/2 committees join 272.09 us/op 267.46 us/op 1.02
altair processAttestation - setStatus - 2/3 committees join 352.23 us/op 363.24 us/op 0.97
altair processAttestation - setStatus - 4/5 committees join 481.26 us/op 487.03 us/op 0.99
altair processAttestation - setStatus - 100% committees join 567.67 us/op 575.68 us/op 0.99
altair processBlock - 250000 vs - 7PWei normalcase 3.7687 ms/op 4.1239 ms/op 0.91
altair processBlock - 250000 vs - 7PWei normalcase hashState 13.619 ms/op 15.634 ms/op 0.87
altair processBlock - 250000 vs - 7PWei worstcase 20.108 ms/op 21.234 ms/op 0.95
altair processBlock - 250000 vs - 7PWei worstcase hashState 40.189 ms/op 42.939 ms/op 0.94
phase0 processBlock - 250000 vs - 7PWei normalcase 1.2373 ms/op 1.3543 ms/op 0.91
phase0 processBlock - 250000 vs - 7PWei worstcase 16.405 ms/op 16.318 ms/op 1.01
altair processEth1Data - 250000 vs - 7PWei normalcase 284.40 us/op 293.66 us/op 0.97
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.2770 us/op 7.8140 us/op 0.42
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 19.044 us/op 20.816 us/op 0.91
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.5470 us/op 7.5900 us/op 0.73
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.5410 us/op 4.4200 us/op 0.80
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 87.321 us/op 94.112 us/op 0.93
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3186 ms/op 1.4362 ms/op 0.92
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.7417 ms/op 1.8397 ms/op 0.95
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.7084 ms/op 1.8064 ms/op 0.95
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.5177 ms/op 3.5322 ms/op 1.00
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.9904 ms/op 1.9737 ms/op 1.01
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 3.7911 ms/op 4.3328 ms/op 0.87
Tree 40 250000 create 306.41 ms/op 346.85 ms/op 0.88
Tree 40 250000 get(125000) 92.231 ns/op 93.379 ns/op 0.99
Tree 40 250000 set(125000) 980.91 ns/op 1.0324 us/op 0.95
Tree 40 250000 toArray() 12.951 ms/op 17.857 ms/op 0.73
Tree 40 250000 iterate all - toArray() + loop 12.298 ms/op 18.917 ms/op 0.65
Tree 40 250000 iterate all - get(i) 38.392 ms/op 42.398 ms/op 0.91
Array 250000 create 2.1311 ms/op 2.4062 ms/op 0.89
Array 250000 clone - spread 663.23 us/op 725.90 us/op 0.91
Array 250000 get(125000) 0.47000 ns/op 0.28900 ns/op 1.63
Array 250000 set(125000) 0.48200 ns/op 0.29200 ns/op 1.65
Array 250000 iterate all - loop 55.819 us/op 56.396 us/op 0.99
phase0 afterProcessEpoch - 250000 vs - 7PWei 39.530 ms/op 61.960 ms/op 0.64
Array.fill - length 1000000 2.0949 ms/op 2.1808 ms/op 0.96
Array push - length 1000000 8.7887 ms/op 10.283 ms/op 0.85
Array.get 0.20087 ns/op 0.20115 ns/op 1.00
Uint8Array.get 0.23387 ns/op 0.23777 ns/op 0.98
phase0 beforeProcessEpoch - 250000 vs - 7PWei 16.094 ms/op 14.835 ms/op 1.08
altair processEpoch - mainnet_e81889 272.95 ms/op 274.79 ms/op 0.99
mainnet_e81889 - altair beforeProcessEpoch 15.761 ms/op 15.718 ms/op 1.00
mainnet_e81889 - altair processJustificationAndFinalization 6.7470 us/op 6.0220 us/op 1.12
mainnet_e81889 - altair processInactivityUpdates 3.7979 ms/op 4.2669 ms/op 0.89
mainnet_e81889 - altair processRewardsAndPenalties 20.566 ms/op 19.697 ms/op 1.04
mainnet_e81889 - altair processRegistryUpdates 776.00 ns/op 542.00 ns/op 1.43
mainnet_e81889 - altair processSlashings 350.00 ns/op 133.00 ns/op 2.63
mainnet_e81889 - altair processEth1DataReset 350.00 ns/op 127.00 ns/op 2.76
mainnet_e81889 - altair processEffectiveBalanceUpdates 2.5883 ms/op 3.3286 ms/op 0.78
mainnet_e81889 - altair processSlashingsReset 919.00 ns/op 698.00 ns/op 1.32
mainnet_e81889 - altair processRandaoMixesReset 1.5120 us/op 1.3770 us/op 1.10
mainnet_e81889 - altair processHistoricalRootsUpdate 350.00 ns/op 125.00 ns/op 2.80
mainnet_e81889 - altair processParticipationFlagUpdates 658.00 ns/op 437.00 ns/op 1.51
mainnet_e81889 - altair processSyncCommitteeUpdates 320.00 ns/op 106.00 ns/op 3.02
mainnet_e81889 - altair afterProcessEpoch 40.655 ms/op 42.088 ms/op 0.97
capella processEpoch - mainnet_e217614 893.32 ms/op 825.12 ms/op 1.08
mainnet_e217614 - capella beforeProcessEpoch 116.18 ms/op 57.995 ms/op 2.00
mainnet_e217614 - capella processJustificationAndFinalization 7.6940 us/op 6.3620 us/op 1.21
mainnet_e217614 - capella processInactivityUpdates 20.945 ms/op 16.973 ms/op 1.23
mainnet_e217614 - capella processRewardsAndPenalties 102.46 ms/op 93.702 ms/op 1.09
mainnet_e217614 - capella processRegistryUpdates 4.9720 us/op 4.4200 us/op 1.12
mainnet_e217614 - capella processSlashings 369.00 ns/op 133.00 ns/op 2.77
mainnet_e217614 - capella processEth1DataReset 360.00 ns/op 123.00 ns/op 2.93
mainnet_e217614 - capella processEffectiveBalanceUpdates 17.130 ms/op 17.946 ms/op 0.95
mainnet_e217614 - capella processSlashingsReset 917.00 ns/op 685.00 ns/op 1.34
mainnet_e217614 - capella processRandaoMixesReset 1.5390 us/op 1.3010 us/op 1.18
mainnet_e217614 - capella processHistoricalRootsUpdate 359.00 ns/op 124.00 ns/op 2.90
mainnet_e217614 - capella processParticipationFlagUpdates 661.00 ns/op 422.00 ns/op 1.57
mainnet_e217614 - capella afterProcessEpoch 111.52 ms/op 105.66 ms/op 1.06
phase0 processEpoch - mainnet_e58758 306.04 ms/op 333.61 ms/op 0.92
mainnet_e58758 - phase0 beforeProcessEpoch 59.881 ms/op 72.565 ms/op 0.83
mainnet_e58758 - phase0 processJustificationAndFinalization 6.4730 us/op 6.8510 us/op 0.94
mainnet_e58758 - phase0 processRewardsAndPenalties 15.524 ms/op 16.873 ms/op 0.92
mainnet_e58758 - phase0 processRegistryUpdates 2.4280 us/op 2.2780 us/op 1.07
mainnet_e58758 - phase0 processSlashings 402.00 ns/op 127.00 ns/op 3.17
mainnet_e58758 - phase0 processEth1DataReset 349.00 ns/op 264.00 ns/op 1.32
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 825.68 us/op 830.08 us/op 0.99
mainnet_e58758 - phase0 processSlashingsReset 1.3080 us/op 997.00 ns/op 1.31
mainnet_e58758 - phase0 processRandaoMixesReset 1.7240 us/op 1.3780 us/op 1.25
mainnet_e58758 - phase0 processHistoricalRootsUpdate 355.00 ns/op 135.00 ns/op 2.63
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.7260 us/op 1.1740 us/op 1.47
mainnet_e58758 - phase0 afterProcessEpoch 34.672 ms/op 34.877 ms/op 0.99
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.8176 ms/op 1.0009 ms/op 1.82
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5825 ms/op 1.5448 ms/op 1.02
altair processInactivityUpdates - 250000 normalcase 12.907 ms/op 13.197 ms/op 0.98
altair processInactivityUpdates - 250000 worstcase 12.620 ms/op 12.545 ms/op 1.01
phase0 processRegistryUpdates - 250000 normalcase 2.3200 us/op 2.0240 us/op 1.15
phase0 processRegistryUpdates - 250000 badcase_full_deposits 135.34 us/op 140.11 us/op 0.97
phase0 processRegistryUpdates - 250000 worstcase 0.5 67.729 ms/op 60.391 ms/op 1.12
altair processRewardsAndPenalties - 250000 normalcase 16.142 ms/op 17.091 ms/op 0.94
altair processRewardsAndPenalties - 250000 worstcase 14.813 ms/op 16.299 ms/op 0.91
phase0 getAttestationDeltas - 250000 normalcase 5.5819 ms/op 5.2285 ms/op 1.07
phase0 getAttestationDeltas - 250000 worstcase 5.4311 ms/op 5.3326 ms/op 1.02
phase0 processSlashings - 250000 worstcase 58.226 us/op 63.833 us/op 0.91
altair processSyncCommitteeUpdates - 250000 10.765 ms/op 10.369 ms/op 1.04
BeaconState.hashTreeRoot - No change 400.00 ns/op 161.00 ns/op 2.48
BeaconState.hashTreeRoot - 1 full validator 73.465 us/op 90.146 us/op 0.81
BeaconState.hashTreeRoot - 32 full validator 863.05 us/op 871.03 us/op 0.99
BeaconState.hashTreeRoot - 512 full validator 6.8612 ms/op 9.0366 ms/op 0.76
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 89.210 us/op 111.21 us/op 0.80
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4327 ms/op 1.4646 ms/op 0.98
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 15.351 ms/op 19.196 ms/op 0.80
BeaconState.hashTreeRoot - 1 balances 72.783 us/op 85.842 us/op 0.85
BeaconState.hashTreeRoot - 32 balances 791.50 us/op 797.76 us/op 0.99
BeaconState.hashTreeRoot - 512 balances 5.1953 ms/op 6.3721 ms/op 0.82
BeaconState.hashTreeRoot - 250000 balances 109.61 ms/op 141.77 ms/op 0.77
aggregationBits - 2048 els - zipIndexesInBitList 19.283 us/op 20.064 us/op 0.96
regular array get 100000 times 22.505 us/op 22.684 us/op 0.99
wrappedArray get 100000 times 22.606 us/op 22.639 us/op 1.00
arrayWithProxy get 100000 times 9.5240 ms/op 17.422 ms/op 0.55
ssz.Root.equals 21.153 ns/op 21.150 ns/op 1.00
byteArrayEquals 21.080 ns/op 20.940 ns/op 1.01
Buffer.compare 8.8540 ns/op 8.7000 ns/op 1.02
processSlot - 1 slots 9.2420 us/op 10.561 us/op 0.88
processSlot - 32 slots 2.0745 ms/op 2.1867 ms/op 0.95
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.4762 ms/op 4.6360 ms/op 1.18
getCommitteeAssignments - req 1 vs - 250000 vc 1.6153 ms/op 1.6373 ms/op 0.99
getCommitteeAssignments - req 100 vs - 250000 vc 3.2912 ms/op 3.3925 ms/op 0.97
getCommitteeAssignments - req 1000 vs - 250000 vc 3.5354 ms/op 3.5816 ms/op 0.99
findModifiedValidators - 10000 modified validators 718.57 ms/op 821.86 ms/op 0.87
findModifiedValidators - 1000 modified validators 452.69 ms/op 539.62 ms/op 0.84
findModifiedValidators - 100 modified validators 279.93 ms/op 353.55 ms/op 0.79
findModifiedValidators - 10 modified validators 229.91 ms/op 209.55 ms/op 1.10
findModifiedValidators - 1 modified validators 174.91 ms/op 157.38 ms/op 1.11
findModifiedValidators - no difference 174.01 ms/op 156.32 ms/op 1.11
migrate state 1500000 validators, 3400 modified, 2000 new 3.1958 s/op 3.1804 s/op 1.00
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 5.3800 ns/op 3.6100 ns/op 1.49
state getBlockRootAtSlot - 250000 vs - 7PWei 420.36 ns/op 366.00 ns/op 1.15
computeProposerIndex 100000 validators 1.3226 ms/op 1.3204 ms/op 1.00
getNextSyncCommitteeIndices 1000 validators 2.8136 ms/op 2.8527 ms/op 0.99
getNextSyncCommitteeIndices 10000 validators 24.680 ms/op 24.933 ms/op 0.99
getNextSyncCommitteeIndices 100000 validators 86.734 ms/op 87.304 ms/op 0.99
computeProposers - vc 250000 558.67 us/op 542.82 us/op 1.03
computeEpochShuffling - vc 250000 38.667 ms/op 38.218 ms/op 1.01
getNextSyncCommittee - vc 250000 9.4710 ms/op 9.2396 ms/op 1.03
nodejs block root to RootHex using toHex 86.714 ns/op 87.435 ns/op 0.99
nodejs block root to RootHex using toRootHex 52.288 ns/op 51.464 ns/op 1.02
nodejs fromHex(blob) 788.39 us/op 766.96 us/op 1.03
nodejs fromHexInto(blob) 604.92 us/op 610.14 us/op 0.99
nodejs block root to RootHex using the deprecated toHexString 352.22 ns/op 482.44 ns/op 0.73
nodejs byteArrayEquals 32 bytes (block root) 24.834 ns/op 25.668 ns/op 0.97
nodejs byteArrayEquals 48 bytes (pubkey) 36.085 ns/op 37.188 ns/op 0.97
nodejs byteArrayEquals 96 bytes (signature) 32.961 ns/op 33.006 ns/op 1.00
nodejs byteArrayEquals 1024 bytes 40.348 ns/op 41.004 ns/op 0.98
nodejs byteArrayEquals 131072 bytes (blob) 1.7633 us/op 1.7314 us/op 1.02
browser block root to RootHex using toHex 139.65 ns/op 142.46 ns/op 0.98
browser block root to RootHex using toRootHex 126.49 ns/op 128.01 ns/op 0.99
browser fromHex(blob) 1.4815 ms/op 1.4823 ms/op 1.00
browser fromHexInto(blob) 603.78 us/op 606.29 us/op 1.00
browser block root to RootHex using the deprecated toHexString 464.52 ns/op 327.46 ns/op 1.42
browser byteArrayEquals 32 bytes (block root) 26.807 ns/op 27.306 ns/op 0.98
browser byteArrayEquals 48 bytes (pubkey) 37.788 ns/op 38.816 ns/op 0.97
browser byteArrayEquals 96 bytes (signature) 70.235 ns/op 72.078 ns/op 0.97
browser byteArrayEquals 1024 bytes 730.15 ns/op 736.41 ns/op 0.99
browser byteArrayEquals 131072 bytes (blob) 91.420 us/op 93.344 us/op 0.98

by benchmarkbot/action

@wemeetagain wemeetagain merged commit 0e1ac44 into unstable May 30, 2026
25 of 27 checks passed
@wemeetagain wemeetagain deleted the nflaig/fix-ptc-vote-slot-guard branch May 30, 2026 18:12
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