Skip to content

fix: process REPEAT_PROPOSAL block - #9805

Merged
nflaig merged 8 commits into
unstablefrom
te/process_equivocation_block
Aug 13, 2026
Merged

fix: process REPEAT_PROPOSAL block#9805
nflaig merged 8 commits into
unstablefrom
te/process_equivocation_block

Conversation

@twoeths

@twoeths twoeths commented Aug 11, 2026

Copy link
Copy Markdown
Member

Motivation

Description

  • process REPEAT_PROPOSAL block, but don't publish it to the network (to conform to the spec)

part of #9799

AI Assistance Disclosure

  • created with the help of Claude

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 6fad50a Previous: ca6d994 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 923.75 us/op 884.32 us/op 1.04
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 39.721 us/op 39.851 us/op 1.00
BLS verify - blst 757.05 us/op 714.63 us/op 1.06
BLS verifyMultipleSignatures 3 - blst 1.3960 ms/op 1.3809 ms/op 1.01
BLS verifyMultipleSignatures 8 - blst 2.2241 ms/op 2.1945 ms/op 1.01
BLS verifyMultipleSignatures 32 - blst 6.9990 ms/op 6.9485 ms/op 1.01
BLS verifyMultipleSignatures 64 - blst 13.426 ms/op 13.904 ms/op 0.97
BLS verifyMultipleSignatures 128 - blst 26.368 ms/op 26.156 ms/op 1.01
BLS deserializing 10000 signatures 653.82 ms/op 652.32 ms/op 1.00
BLS deserializing 100000 signatures 6.4671 s/op 6.5183 s/op 0.99
BLS verifyMultipleSignatures - same message - 3 - blst 806.64 us/op 778.32 us/op 1.04
BLS verifyMultipleSignatures - same message - 8 - blst 906.59 us/op 909.30 us/op 1.00
BLS verifyMultipleSignatures - same message - 32 - blst 1.5578 ms/op 1.5906 ms/op 0.98
BLS verifyMultipleSignatures - same message - 64 - blst 2.4644 ms/op 2.4610 ms/op 1.00
BLS verifyMultipleSignatures - same message - 128 - blst 4.1190 ms/op 4.1627 ms/op 0.99
BLS aggregatePubkeys 32 - blst 18.017 us/op 18.032 us/op 1.00
BLS aggregatePubkeys 128 - blst 63.882 us/op 64.419 us/op 0.99
getSlashingsAndExits - default max 51.719 us/op 47.227 us/op 1.10
getSlashingsAndExits - 2k 381.10 us/op 368.30 us/op 1.03
proposeBlockBody type=full, size=empty 706.88 us/op 737.09 us/op 0.96
isKnown best case - 1 super set check 425.00 ns/op 186.00 ns/op 2.28
isKnown normal case - 2 super set checks 447.00 ns/op 166.00 ns/op 2.69
isKnown worse case - 16 super set checks 425.00 ns/op 166.00 ns/op 2.56
validate api signedAggregateAndProof - struct 1.5436 ms/op 1.5711 ms/op 0.98
validate gossip signedAggregateAndProof - struct 1.5427 ms/op 1.5511 ms/op 0.99
batch validate gossip attestation - vc 640000 - chunk 32 110.30 us/op 110.47 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 64 97.442 us/op 99.789 us/op 0.98
batch validate gossip attestation - vc 640000 - chunk 128 88.887 us/op 93.249 us/op 0.95
batch validate gossip attestation - vc 640000 - chunk 256 86.206 us/op 89.182 us/op 0.97
bytes32 toHexString 522.00 ns/op 302.00 ns/op 1.73
bytes32 Buffer.toString(hex) 402.00 ns/op 178.00 ns/op 2.26
bytes32 Buffer.toString(hex) from Uint8Array 483.00 ns/op 243.00 ns/op 1.99
bytes32 Buffer.toString(hex) + 0x 409.00 ns/op 181.00 ns/op 2.26
Return object 10000 times 0.23510 ns/op 0.22180 ns/op 1.06
Throw Error 10000 times 3.3581 us/op 3.4129 us/op 0.98
toHex 94.615 ns/op 98.995 ns/op 0.96
Buffer.from 87.913 ns/op 92.497 ns/op 0.95
shared Buffer 60.031 ns/op 62.240 ns/op 0.96
fastMsgIdFn sha256 / 200 bytes 1.7530 us/op 1.5390 us/op 1.14
fastMsgIdFn h32 xxhash / 200 bytes 367.00 ns/op 156.00 ns/op 2.35
fastMsgIdFn h64 xxhash / 200 bytes 427.00 ns/op 214.00 ns/op 2.00
fastMsgIdFn sha256 / 1000 bytes 5.0890 us/op 4.9110 us/op 1.04
fastMsgIdFn h32 xxhash / 1000 bytes 459.00 ns/op 255.00 ns/op 1.80
fastMsgIdFn h64 xxhash / 1000 bytes 481.00 ns/op 261.00 ns/op 1.84
fastMsgIdFn sha256 / 10000 bytes 42.848 us/op 43.293 us/op 0.99
fastMsgIdFn h32 xxhash / 10000 bytes 1.5140 us/op 1.3150 us/op 1.15
fastMsgIdFn h64 xxhash / 10000 bytes 1.0830 us/op 857.00 ns/op 1.26
send data - 1000 256B messages 5.0521 ms/op 4.5092 ms/op 1.12
send data - 1000 512B messages 6.0601 ms/op 5.4205 ms/op 1.12
send data - 1000 1024B messages 6.8530 ms/op 5.6715 ms/op 1.21
send data - 1000 1200B messages 6.4236 ms/op 6.3144 ms/op 1.02
send data - 1000 2048B messages 9.4404 ms/op 14.637 ms/op 0.64
send data - 1000 4096B messages 55.005 ms/op 118.46 ms/op 0.46
send data - 1000 16384B messages 281.03 ms/op 352.11 ms/op 0.80
send data - 1000 65536B messages 1.2306 s/op 1.3849 s/op 0.89
enrSubnets - fastDeserialize 64 bits 1.0380 us/op 805.00 ns/op 1.29
enrSubnets - ssz BitVector 64 bits 510.00 ns/op 282.00 ns/op 1.81
enrSubnets - fastDeserialize 4 bits 303.00 ns/op 105.00 ns/op 2.89
enrSubnets - ssz BitVector 4 bits 515.00 ns/op 277.00 ns/op 1.86
prioritizePeers score -10:0 att 32-0.1 sync 2-0 204.63 us/op 255.59 us/op 0.80
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 231.30 us/op 249.38 us/op 0.93
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 334.99 us/op 362.65 us/op 0.92
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 608.01 us/op 629.61 us/op 0.97
prioritizePeers score 0:0 att 64-1 sync 4-1 704.07 us/op 717.40 us/op 0.98
array of 16000 items push then shift 1.3214 us/op 1.3374 us/op 0.99
LinkedList of 16000 items push then shift 7.6240 ns/op 7.7590 ns/op 0.98
array of 16000 items push then pop 71.607 ns/op 74.450 ns/op 0.96
LinkedList of 16000 items push then pop 6.3840 ns/op 6.2170 ns/op 1.03
array of 24000 items push then shift 1.9516 us/op 1.9705 us/op 0.99
LinkedList of 24000 items push then shift 7.3580 ns/op 6.9130 ns/op 1.06
array of 24000 items push then pop 100.12 ns/op 104.89 ns/op 0.95
LinkedList of 24000 items push then pop 6.4280 ns/op 6.9380 ns/op 0.93
intersect bitArray bitLen 8 4.1200 ns/op 4.0010 ns/op 1.03
intersect array and set length 8 29.859 ns/op 30.663 ns/op 0.97
intersect bitArray bitLen 128 23.819 ns/op 24.285 ns/op 0.98
intersect array and set length 128 503.87 ns/op 507.40 ns/op 0.99
bitArray.getTrueBitIndexes() bitLen 128 1.2060 us/op 931.00 ns/op 1.30
bitArray.getTrueBitIndexes() bitLen 248 1.9350 us/op 1.7000 us/op 1.14
bitArray.getTrueBitIndexes() bitLen 512 3.7870 us/op 3.5660 us/op 1.06
Full columns - reconstruct all 6 blobs 251.42 us/op 179.84 us/op 1.40
Full columns - reconstruct half of the blobs out of 6 114.39 us/op 96.159 us/op 1.19
Full columns - reconstruct single blob out of 6 36.314 us/op 35.819 us/op 1.01
Half columns - reconstruct all 6 blobs 395.18 ms/op 404.82 ms/op 0.98
Half columns - reconstruct half of the blobs out of 6 199.21 ms/op 202.88 ms/op 0.98
Half columns - reconstruct single blob out of 6 70.249 ms/op 75.686 ms/op 0.93
Set add up to 64 items then delete first 1.6659 us/op 1.6996 us/op 0.98
OrderedSet add up to 64 items then delete first 2.5353 us/op 2.5808 us/op 0.98
Set add up to 64 items then delete last 1.8859 us/op 1.8914 us/op 1.00
OrderedSet add up to 64 items then delete last 2.9332 us/op 2.8513 us/op 1.03
Set add up to 64 items then delete middle 1.9344 us/op 1.9067 us/op 1.01
OrderedSet add up to 64 items then delete middle 4.5011 us/op 4.3639 us/op 1.03
Set add up to 128 items then delete first 3.7744 us/op 3.8927 us/op 0.97
OrderedSet add up to 128 items then delete first 5.5306 us/op 5.8651 us/op 0.94
Set add up to 128 items then delete last 3.7219 us/op 3.6487 us/op 1.02
OrderedSet add up to 128 items then delete last 5.6943 us/op 5.5216 us/op 1.03
Set add up to 128 items then delete middle 3.7267 us/op 3.6863 us/op 1.01
OrderedSet add up to 128 items then delete middle 11.834 us/op 11.925 us/op 0.99
Set add up to 256 items then delete first 7.3762 us/op 7.4976 us/op 0.98
OrderedSet add up to 256 items then delete first 11.333 us/op 12.159 us/op 0.93
Set add up to 256 items then delete last 7.3103 us/op 7.3244 us/op 1.00
OrderedSet add up to 256 items then delete last 12.566 us/op 11.522 us/op 1.09
Set add up to 256 items then delete middle 7.6877 us/op 7.2774 us/op 1.06
OrderedSet add up to 256 items then delete middle 36.812 us/op 35.897 us/op 1.03
runFastConfirmationRules vc:100000 bc:96 eq:0 4.6015 ms/op 4.8007 ms/op 0.96
runFastConfirmationRules vc:600000 bc:96 eq:0 36.459 ms/op 36.765 ms/op 0.99
runFastConfirmationRules vc:1000000 bc:96 eq:0 62.009 ms/op 62.758 ms/op 0.99
runFastConfirmationRules vc:600000 bc:320 eq:0 36.081 ms/op 38.058 ms/op 0.95
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.1455 s/op 1.2887 s/op 0.89
pass gossip attestations to forkchoice per slot 2.6259 ms/op 2.7186 ms/op 0.97
forkChoice updateHead vc 100000 bc 64 eq 0 429.23 us/op 432.43 us/op 0.99
forkChoice updateHead vc 600000 bc 64 eq 0 2.5425 ms/op 2.4927 ms/op 1.02
forkChoice updateHead vc 1000000 bc 64 eq 0 4.3876 ms/op 4.1825 ms/op 1.05
forkChoice updateHead vc 600000 bc 320 eq 0 2.5562 ms/op 2.5648 ms/op 1.00
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5923 ms/op 2.6256 ms/op 0.99
forkChoice updateHead vc 600000 bc 7200 eq 0 2.9728 ms/op 2.9571 ms/op 1.01
forkChoice updateHead vc 600000 bc 64 eq 1000 2.5839 ms/op 2.5284 ms/op 1.02
forkChoice updateHead vc 600000 bc 64 eq 10000 2.6970 ms/op 2.6288 ms/op 1.03
forkChoice updateHead vc 600000 bc 64 eq 300000 7.0116 ms/op 7.2019 ms/op 0.97
computeDeltas 1400000 validators 0% inactive 12.289 ms/op 12.516 ms/op 0.98
computeDeltas 1400000 validators 10% inactive 11.807 ms/op 11.949 ms/op 0.99
computeDeltas 1400000 validators 20% inactive 11.051 ms/op 11.319 ms/op 0.98
computeDeltas 1400000 validators 50% inactive 8.9790 ms/op 9.1387 ms/op 0.98
computeDeltas 2100000 validators 0% inactive 18.709 ms/op 18.711 ms/op 1.00
computeDeltas 2100000 validators 10% inactive 17.780 ms/op 17.837 ms/op 1.00
computeDeltas 2100000 validators 20% inactive 16.858 ms/op 16.969 ms/op 0.99
computeDeltas 2100000 validators 50% inactive 11.080 ms/op 13.688 ms/op 0.81
altair processAttestation - 250000 vs - 7PWei normalcase 1.7350 ms/op 1.8313 ms/op 0.95
altair processAttestation - 250000 vs - 7PWei worstcase 2.4533 ms/op 2.5787 ms/op 0.95
altair processAttestation - setStatus - 1/6 committees join 105.48 us/op 101.81 us/op 1.04
altair processAttestation - setStatus - 1/3 committees join 196.94 us/op 205.98 us/op 0.96
altair processAttestation - setStatus - 1/2 committees join 292.91 us/op 285.62 us/op 1.03
altair processAttestation - setStatus - 2/3 committees join 374.06 us/op 383.63 us/op 0.98
altair processAttestation - setStatus - 4/5 committees join 526.07 us/op 536.05 us/op 0.98
altair processAttestation - setStatus - 100% committees join 625.01 us/op 635.73 us/op 0.98
altair processBlock - 250000 vs - 7PWei normalcase 3.2538 ms/op 3.4270 ms/op 0.95
altair processBlock - 250000 vs - 7PWei normalcase hashState 12.338 ms/op 15.890 ms/op 0.78
altair processBlock - 250000 vs - 7PWei worstcase 19.898 ms/op 21.855 ms/op 0.91
altair processBlock - 250000 vs - 7PWei worstcase hashState 40.304 ms/op 43.366 ms/op 0.93
phase0 processBlock - 250000 vs - 7PWei normalcase 1.3038 ms/op 1.4281 ms/op 0.91
phase0 processBlock - 250000 vs - 7PWei worstcase 16.900 ms/op 18.172 ms/op 0.93
altair processEth1Data - 250000 vs - 7PWei normalcase 295.10 us/op 303.45 us/op 0.97
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.5190 us/op 3.6190 us/op 0.97
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 21.663 us/op 21.957 us/op 0.99
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 6.1390 us/op 5.9100 us/op 1.04
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 4.2720 us/op 3.7020 us/op 1.15
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 93.018 us/op 92.977 us/op 1.00
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4120 ms/op 1.4512 ms/op 0.97
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.8688 ms/op 1.8656 ms/op 1.00
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.8426 ms/op 1.8716 ms/op 0.98
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.7174 ms/op 3.7002 ms/op 1.00
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.1073 ms/op 2.1076 ms/op 1.00
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.0651 ms/op 4.1530 ms/op 0.98
Tree 40 250000 create 315.55 ms/op 323.46 ms/op 0.98
Tree 40 250000 get(125000) 95.567 ns/op 98.411 ns/op 0.97
Tree 40 250000 set(125000) 1.0483 us/op 1.0478 us/op 1.00
Tree 40 250000 toArray() 9.3048 ms/op 12.790 ms/op 0.73
Tree 40 250000 iterate all - toArray() + loop 9.4471 ms/op 11.323 ms/op 0.83
Tree 40 250000 iterate all - get(i) 37.329 ms/op 40.574 ms/op 0.92
Array 250000 create 2.2624 ms/op 2.5129 ms/op 0.90
Array 250000 clone - spread 720.03 us/op 750.56 us/op 0.96
Array 250000 get(125000) 0.49900 ns/op 0.30800 ns/op 1.62
Array 250000 set(125000) 0.51300 ns/op 0.30700 ns/op 1.67
Array 250000 iterate all - loop 57.344 us/op 58.959 us/op 0.97
phase0 afterProcessEpoch - 250000 vs - 7PWei 52.614 ms/op 54.336 ms/op 0.97
Array.fill - length 1000000 3.9651 ms/op 3.9513 ms/op 1.00
Array push - length 1000000 12.977 ms/op 14.709 ms/op 0.88
Array.get 0.20679 ns/op 0.20891 ns/op 0.99
Uint8Array.get 0.24225 ns/op 0.25106 ns/op 0.96
phase0 beforeProcessEpoch - 250000 vs - 7PWei 29.212 ms/op 16.977 ms/op 1.72
altair processEpoch - mainnet_e81889 260.42 ms/op 273.46 ms/op 0.95
mainnet_e81889 - altair beforeProcessEpoch 13.946 ms/op 21.461 ms/op 0.65
mainnet_e81889 - altair processJustificationAndFinalization 5.6050 us/op 6.0630 us/op 0.92
mainnet_e81889 - altair processInactivityUpdates 3.5318 ms/op 3.6123 ms/op 0.98
mainnet_e81889 - altair processRewardsAndPenalties 18.069 ms/op 20.989 ms/op 0.86
mainnet_e81889 - altair processRegistryUpdates 860.00 ns/op 597.00 ns/op 1.44
mainnet_e81889 - altair processSlashings 406.00 ns/op 155.00 ns/op 2.62
mainnet_e81889 - altair processEth1DataReset 401.00 ns/op 157.00 ns/op 2.55
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.7127 ms/op 1.7213 ms/op 0.99
mainnet_e81889 - altair processSlashingsReset 997.00 ns/op 732.00 ns/op 1.36
mainnet_e81889 - altair processRandaoMixesReset 1.4480 us/op 1.3010 us/op 1.11
mainnet_e81889 - altair processHistoricalRootsUpdate 414.00 ns/op 181.00 ns/op 2.29
mainnet_e81889 - altair processParticipationFlagUpdates 717.00 ns/op 468.00 ns/op 1.53
mainnet_e81889 - altair processSyncCommitteeUpdates 374.00 ns/op 130.00 ns/op 2.88
mainnet_e81889 - altair afterProcessEpoch 41.693 ms/op 43.006 ms/op 0.97
capella processEpoch - mainnet_e217614 769.27 ms/op 801.44 ms/op 0.96
mainnet_e217614 - capella beforeProcessEpoch 61.877 ms/op 58.030 ms/op 1.07
mainnet_e217614 - capella processJustificationAndFinalization 5.9690 us/op 6.5290 us/op 0.91
mainnet_e217614 - capella processInactivityUpdates 11.292 ms/op 13.941 ms/op 0.81
mainnet_e217614 - capella processRewardsAndPenalties 89.510 ms/op 89.663 ms/op 1.00
mainnet_e217614 - capella processRegistryUpdates 4.7970 us/op 4.5100 us/op 1.06
mainnet_e217614 - capella processSlashings 400.00 ns/op 153.00 ns/op 2.61
mainnet_e217614 - capella processEth1DataReset 401.00 ns/op 145.00 ns/op 2.77
mainnet_e217614 - capella processEffectiveBalanceUpdates 5.6445 ms/op 5.8310 ms/op 0.97
mainnet_e217614 - capella processSlashingsReset 954.00 ns/op 715.00 ns/op 1.33
mainnet_e217614 - capella processRandaoMixesReset 1.3390 us/op 1.3300 us/op 1.01
mainnet_e217614 - capella processHistoricalRootsUpdate 396.00 ns/op 151.00 ns/op 2.62
mainnet_e217614 - capella processParticipationFlagUpdates 701.00 ns/op 468.00 ns/op 1.50
mainnet_e217614 - capella afterProcessEpoch 112.71 ms/op 111.94 ms/op 1.01
phase0 processEpoch - mainnet_e58758 246.20 ms/op 294.05 ms/op 0.84
mainnet_e58758 - phase0 beforeProcessEpoch 47.289 ms/op 63.622 ms/op 0.74
mainnet_e58758 - phase0 processJustificationAndFinalization 5.4110 us/op 6.4470 us/op 0.84
mainnet_e58758 - phase0 processRewardsAndPenalties 15.322 ms/op 55.613 ms/op 0.28
mainnet_e58758 - phase0 processRegistryUpdates 2.5280 us/op 2.3230 us/op 1.09
mainnet_e58758 - phase0 processSlashings 395.00 ns/op 155.00 ns/op 2.55
mainnet_e58758 - phase0 processEth1DataReset 391.00 ns/op 147.00 ns/op 2.66
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 831.78 us/op 1.1654 ms/op 0.71
mainnet_e58758 - phase0 processSlashingsReset 1.0660 us/op 891.00 ns/op 1.20
mainnet_e58758 - phase0 processRandaoMixesReset 1.4790 us/op 1.1540 us/op 1.28
mainnet_e58758 - phase0 processHistoricalRootsUpdate 395.00 ns/op 150.00 ns/op 2.63
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.3640 us/op 1.1880 us/op 1.15
mainnet_e58758 - phase0 afterProcessEpoch 33.686 ms/op 34.677 ms/op 0.97
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.2566 ms/op 1.0367 ms/op 1.21
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.9091 ms/op 1.6672 ms/op 1.15
altair processInactivityUpdates - 250000 normalcase 10.633 ms/op 10.828 ms/op 0.98
altair processInactivityUpdates - 250000 worstcase 10.704 ms/op 11.151 ms/op 0.96
phase0 processRegistryUpdates - 250000 normalcase 2.8990 us/op 2.4610 us/op 1.18
phase0 processRegistryUpdates - 250000 badcase_full_deposits 150.20 us/op 145.58 us/op 1.03
phase0 processRegistryUpdates - 250000 worstcase 0.5 63.707 ms/op 64.594 ms/op 0.99
altair processRewardsAndPenalties - 250000 normalcase 13.679 ms/op 13.136 ms/op 1.04
altair processRewardsAndPenalties - 250000 worstcase 15.407 ms/op 13.015 ms/op 1.18
phase0 getAttestationDeltas - 250000 normalcase 5.5938 ms/op 5.5749 ms/op 1.00
phase0 getAttestationDeltas - 250000 worstcase 5.6460 ms/op 5.6101 ms/op 1.01
phase0 processSlashings - 250000 worstcase 62.211 us/op 61.968 us/op 1.00
altair processSyncCommitteeUpdates - 250000 10.351 ms/op 10.272 ms/op 1.01
BeaconState.hashTreeRoot - No change 423.00 ns/op 180.00 ns/op 2.35
BeaconState.hashTreeRoot - 1 full validator 60.954 us/op 58.363 us/op 1.04
BeaconState.hashTreeRoot - 32 full validator 647.94 us/op 672.79 us/op 0.96
BeaconState.hashTreeRoot - 512 full validator 5.9296 ms/op 6.0500 ms/op 0.98
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 70.795 us/op 71.633 us/op 0.99
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.0036 ms/op 1.0583 ms/op 0.95
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 13.185 ms/op 12.181 ms/op 1.08
BeaconState.hashTreeRoot - 1 balances 58.303 us/op 57.656 us/op 1.01
BeaconState.hashTreeRoot - 32 balances 542.85 us/op 545.02 us/op 1.00
BeaconState.hashTreeRoot - 512 balances 4.6567 ms/op 4.6170 ms/op 1.01
BeaconState.hashTreeRoot - 250000 balances 101.57 ms/op 97.115 ms/op 1.05
aggregationBits - 2048 els - zipIndexesInBitList 19.311 us/op 19.112 us/op 1.01
regular array get 100000 times 23.182 us/op 22.939 us/op 1.01
wrappedArray get 100000 times 23.131 us/op 22.961 us/op 1.01
arrayWithProxy get 100000 times 10.392 ms/op 10.591 ms/op 0.98
ssz.Root.equals 21.823 ns/op 21.707 ns/op 1.01
byteArrayEquals 21.516 ns/op 21.456 ns/op 1.00
Buffer.compare 9.0830 ns/op 8.8990 ns/op 1.02
processSlot - 1 slots 8.2910 us/op 8.7490 us/op 0.95
processSlot - 32 slots 1.9553 ms/op 1.8921 ms/op 1.03
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.8655 ms/op 4.0178 ms/op 0.96
getCommitteeAssignments - req 1 vs - 250000 vc 1.7496 ms/op 1.7029 ms/op 1.03
getCommitteeAssignments - req 100 vs - 250000 vc 3.5326 ms/op 3.4475 ms/op 1.02
getCommitteeAssignments - req 1000 vs - 250000 vc 3.8448 ms/op 3.7066 ms/op 1.04
findModifiedValidators - 10000 modified validators 799.66 ms/op 759.00 ms/op 1.05
findModifiedValidators - 1000 modified validators 613.52 ms/op 821.90 ms/op 0.75
findModifiedValidators - 100 modified validators 400.11 ms/op 391.90 ms/op 1.02
findModifiedValidators - 10 modified validators 345.44 ms/op 268.58 ms/op 1.29
findModifiedValidators - 1 modified validators 220.78 ms/op 206.34 ms/op 1.07
findModifiedValidators - no difference 247.94 ms/op 203.57 ms/op 1.22
migrate state 1500000 validators, 3400 modified, 2000 new 3.3122 s/op 3.1647 s/op 1.05
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 5.8100 ns/op 3.8000 ns/op 1.53
state getBlockRootAtSlot - 250000 vs - 7PWei 384.99 ns/op 304.57 ns/op 1.26
computeProposerIndex 100000 validators 1.3868 ms/op 1.4168 ms/op 0.98
getNextSyncCommitteeIndices 1000 validators 2.9645 ms/op 2.9926 ms/op 0.99
getNextSyncCommitteeIndices 10000 validators 25.742 ms/op 26.158 ms/op 0.98
getNextSyncCommitteeIndices 100000 validators 88.698 ms/op 89.646 ms/op 0.99
computeProposers - vc 250000 558.15 us/op 567.80 us/op 0.98
computeEpochShuffling - vc 250000 39.916 ms/op 40.375 ms/op 0.99
getNextSyncCommittee - vc 250000 9.5505 ms/op 9.7906 ms/op 0.98
nodejs block root to RootHex using toHex 97.590 ns/op 98.917 ns/op 0.99
nodejs block root to RootHex using toRootHex 65.074 ns/op 64.177 ns/op 1.01
nodejs fromHex(blob) 731.41 us/op 821.35 us/op 0.89
nodejs fromHexInto(blob) 638.71 us/op 657.20 us/op 0.97
nodejs block root to RootHex using the deprecated toHexString 557.49 ns/op 538.69 ns/op 1.03
nodejs byteArrayEquals 32 bytes (block root) 26.236 ns/op 26.791 ns/op 0.98
nodejs byteArrayEquals 48 bytes (pubkey) 37.776 ns/op 38.807 ns/op 0.97
nodejs byteArrayEquals 96 bytes (signature) 36.110 ns/op 36.716 ns/op 0.98
nodejs byteArrayEquals 1024 bytes 45.188 ns/op 44.455 ns/op 1.02
nodejs byteArrayEquals 131072 bytes (blob) 1.7753 us/op 1.8341 us/op 0.97
browser block root to RootHex using toHex 147.36 ns/op 150.08 ns/op 0.98
browser block root to RootHex using toRootHex 133.34 ns/op 134.72 ns/op 0.99
browser fromHex(blob) 1.5600 ms/op 1.6334 ms/op 0.96
browser fromHexInto(blob) 656.27 us/op 680.96 us/op 0.96
browser block root to RootHex using the deprecated toHexString 383.82 ns/op 418.39 ns/op 0.92
browser byteArrayEquals 32 bytes (block root) 29.376 ns/op 28.975 ns/op 1.01
browser byteArrayEquals 48 bytes (pubkey) 41.044 ns/op 45.103 ns/op 0.91
browser byteArrayEquals 96 bytes (signature) 76.849 ns/op 88.995 ns/op 0.86
browser byteArrayEquals 1024 bytes 798.49 ns/op 828.01 ns/op 0.96
browser byteArrayEquals 131072 bytes (blob) 100.87 us/op 103.69 us/op 0.97

by benchmarkbot/action

@twoeths
twoeths marked this pull request as ready for review August 11, 2026 10:21
@twoeths
twoeths requested a review from a team as a code owner August 11, 2026 10:21
@codecov

codecov Bot commented Aug 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.60%. Comparing base (31cbd91) to head (aff7f38).
⚠️ Report is 1 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #9805   +/-   ##
=========================================
  Coverage     52.60%   52.60%           
=========================================
  Files           848      848           
  Lines         59996    59989    -7     
  Branches       4418     4418           
=========================================
- Hits          31559    31558    -1     
+ Misses        28378    28372    -6     
  Partials         59       59           
🚀 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.

@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: aff7f38830

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +381 to +382
...(skipPublish
? []

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 Keep Fulu publish results aligned when skipping gossip

When skipPublish is true for a Fulu repeat proposal with blobs, this branch removes the beacon-block and data-column publish thunks, so sentPeersArr only contains the processBlock result. The Fulu metrics loop below still reads sentPeersArr[i + 1] for each data column and destructures it, which turns a successfully imported repeat-proposal publish into a TypeError instead of returning normally.

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.

fixed in 4ac0456

Comment thread packages/beacon-node/src/api/impl/beacon/blocks/index.ts
Comment thread packages/beacon-node/src/api/impl/beacon/blocks/index.ts Outdated
const blockInput = chain.seenBlockInputCache.get(e.type.root);
if (blockInput) {
chain.serializedCache.set(signedBlock, serializedData);
handleValidBeaconBlock(blockInput, peerIdStr, seenTimestampSec);

@nflaig nflaig Aug 12, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think we need to revisit the ordering in validateGossipBlock, so right now, if we throw a REPEAT_PROPOSAL that happens quite early, so the beacon block isn't fully validated here?

also it's before this check

 if (blockState.getBeaconProposer(blockSlot) !== proposerIndex) {
    throw new BlockGossipError(GossipAction.REJECT, {code: BlockErrorCode.INCORRECT_PROPOSER, proposerIndex});
  }

which seems questionable?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I think the p2p rules are just quick checks to forward the gossip block without having to run state transition
if the block is really invalid, it should be caught inside the state transition itself
in this case it's

it's worth to mention this in the code

@nflaig nflaig Aug 13, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yeah that is probably fine was thinking the same way, but we should be more explicit about it, so adding a comment as suggested makes sense.

there was one worry that we could receive many invalid blocks and fill our cache but due to how gossip re-propagation works this should be unlikely unless a peer sends them directly to us, but I think we still wanna make sure that we at least validate the proposer signature in any case, although my worry here is that we run blockState.getBeaconProposer(blockSlot) !== proposerIndex later, so technically any validator can produce a valid signature (of course they would get slashed too if they do more >=2 so the incentives for doing so are low) and we downscore them, so it's likely fine

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.

but I think we still wanna make sure that we at least validate the proposer signature in any case

it's already checked at line 718 above

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ah yeah that looks fine

@nflaig nflaig left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, I can do the api cleanup to remove REPEAT_PROPOSAL handling separately

@nflaig
nflaig merged commit 36fc832 into unstable Aug 13, 2026
19 checks passed
@nflaig
nflaig deleted the te/process_equivocation_block branch August 13, 2026 12:23
@github-project-automation github-project-automation Bot moved this from In Progress to Done in Lodestar Team Coordination Aug 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants