Skip to content

fix: differentiate ALREADY_KNOWN vs REPEAT_PROPOSAL seen block proposal - #9814

Merged
nflaig merged 1 commit into
unstablefrom
te/fix_REPEAT_PROPOSAL
Aug 13, 2026
Merged

fix: differentiate ALREADY_KNOWN vs REPEAT_PROPOSAL seen block proposal#9814
nflaig merged 1 commit into
unstablefrom
te/fix_REPEAT_PROPOSAL

Conversation

@twoeths

@twoeths twoeths commented Aug 13, 2026

Copy link
Copy Markdown
Member

Motivation

Description

  • enhance SeenBlockProposers, track also block root in proposerIndexesBySlot, new isRepeatProposal in gossip block validation
  • if a block proposal is known, also check "isRepeatProposal"

AI Assistance Disclosure

  • created with the help of Claude

@github-actions

Copy link
Copy Markdown
Contributor

Performance Report

馃殌馃殌 Significant benchmark improvement detected

Benchmark suite Current: 8de8bb0 Previous: d9c16ea Ratio
send data - 1000 4096B messages 40.206 ms/op 146.51 ms/op 0.27
Full benchmark results
Benchmark suite Current: 8de8bb0 Previous: d9c16ea Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 893.64 us/op 957.64 us/op 0.93
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 36.308 us/op 43.319 us/op 0.84
BLS verify - blst 622.04 us/op 742.29 us/op 0.84
BLS verifyMultipleSignatures 3 - blst 1.3111 ms/op 1.3927 ms/op 0.94
BLS verifyMultipleSignatures 8 - blst 2.0504 ms/op 2.2199 ms/op 0.92
BLS verifyMultipleSignatures 32 - blst 6.4671 ms/op 7.1568 ms/op 0.90
BLS verifyMultipleSignatures 64 - blst 13.079 ms/op 14.415 ms/op 0.91
BLS verifyMultipleSignatures 128 - blst 25.049 ms/op 26.545 ms/op 0.94
BLS deserializing 10000 signatures 613.66 ms/op 657.61 ms/op 0.93
BLS deserializing 100000 signatures 6.1651 s/op 6.6898 s/op 0.92
BLS verifyMultipleSignatures - same message - 3 - blst 728.05 us/op 791.23 us/op 0.92
BLS verifyMultipleSignatures - same message - 8 - blst 849.20 us/op 878.41 us/op 0.97
BLS verifyMultipleSignatures - same message - 32 - blst 1.4841 ms/op 1.6210 ms/op 0.92
BLS verifyMultipleSignatures - same message - 64 - blst 2.2617 ms/op 2.5187 ms/op 0.90
BLS verifyMultipleSignatures - same message - 128 - blst 3.8121 ms/op 4.2556 ms/op 0.90
BLS aggregatePubkeys 32 - blst 17.084 us/op 18.701 us/op 0.91
BLS aggregatePubkeys 128 - blst 60.578 us/op 65.889 us/op 0.92
getSlashingsAndExits - default max 45.722 us/op 58.795 us/op 0.78
getSlashingsAndExits - 2k 339.55 us/op 421.60 us/op 0.81
proposeBlockBody type=full, size=empty 698.90 us/op 765.60 us/op 0.91
isKnown best case - 1 super set check 181.00 ns/op 246.00 ns/op 0.74
isKnown normal case - 2 super set checks 170.00 ns/op 189.00 ns/op 0.90
isKnown worse case - 16 super set checks 169.00 ns/op 195.00 ns/op 0.87
validate api signedAggregateAndProof - struct 1.4642 ms/op 1.5864 ms/op 0.92
validate gossip signedAggregateAndProof - struct 1.4611 ms/op 1.5742 ms/op 0.93
batch validate gossip attestation - vc 640000 - chunk 32 109.31 us/op 119.77 us/op 0.91
batch validate gossip attestation - vc 640000 - chunk 64 95.204 us/op 104.31 us/op 0.91
batch validate gossip attestation - vc 640000 - chunk 128 89.461 us/op 100.04 us/op 0.89
batch validate gossip attestation - vc 640000 - chunk 256 84.743 us/op 94.793 us/op 0.89
bytes32 toHexString 282.00 ns/op 311.00 ns/op 0.91
bytes32 Buffer.toString(hex) 168.00 ns/op 170.00 ns/op 0.99
bytes32 Buffer.toString(hex) from Uint8Array 235.00 ns/op 243.00 ns/op 0.97
bytes32 Buffer.toString(hex) + 0x 169.00 ns/op 174.00 ns/op 0.97
Return object 10000 times 0.20760 ns/op 0.21950 ns/op 0.95
Throw Error 10000 times 3.2355 us/op 3.6641 us/op 0.88
toHex 93.554 ns/op 98.404 ns/op 0.95
Buffer.from 90.196 ns/op 88.787 ns/op 1.02
shared Buffer 57.304 ns/op 62.619 ns/op 0.92
fastMsgIdFn sha256 / 200 bytes 1.4310 us/op 1.5440 us/op 0.93
fastMsgIdFn h32 xxhash / 200 bytes 152.00 ns/op 158.00 ns/op 0.96
fastMsgIdFn h64 xxhash / 200 bytes 201.00 ns/op 206.00 ns/op 0.98
fastMsgIdFn sha256 / 1000 bytes 4.6010 us/op 4.9310 us/op 0.93
fastMsgIdFn h32 xxhash / 1000 bytes 242.00 ns/op 249.00 ns/op 0.97
fastMsgIdFn h64 xxhash / 1000 bytes 245.00 ns/op 257.00 ns/op 0.95
fastMsgIdFn sha256 / 10000 bytes 40.106 us/op 43.547 us/op 0.92
fastMsgIdFn h32 xxhash / 10000 bytes 1.2500 us/op 1.3220 us/op 0.95
fastMsgIdFn h64 xxhash / 10000 bytes 816.00 ns/op 860.00 ns/op 0.95
send data - 1000 256B messages 4.4931 ms/op 4.6639 ms/op 0.96
send data - 1000 512B messages 5.3276 ms/op 5.8813 ms/op 0.91
send data - 1000 1024B messages 5.3826 ms/op 6.2731 ms/op 0.86
send data - 1000 1200B messages 6.4961 ms/op 9.4988 ms/op 0.68
send data - 1000 2048B messages 19.451 ms/op 22.574 ms/op 0.86
send data - 1000 4096B messages 40.206 ms/op 146.51 ms/op 0.27
send data - 1000 16384B messages 222.63 ms/op 661.06 ms/op 0.34
send data - 1000 65536B messages 1.2404 s/op 2.2667 s/op 0.55
enrSubnets - fastDeserialize 64 bits 734.00 ns/op 817.00 ns/op 0.90
enrSubnets - ssz BitVector 64 bits 255.00 ns/op 278.00 ns/op 0.92
enrSubnets - fastDeserialize 4 bits 100.00 ns/op 107.00 ns/op 0.93
enrSubnets - ssz BitVector 4 bits 258.00 ns/op 276.00 ns/op 0.93
prioritizePeers score -10:0 att 32-0.1 sync 2-0 192.52 us/op 217.36 us/op 0.89
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 218.71 us/op 246.33 us/op 0.89
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 327.38 us/op 449.58 us/op 0.73
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 581.79 us/op 758.37 us/op 0.77
prioritizePeers score 0:0 att 64-1 sync 4-1 677.66 us/op 930.37 us/op 0.73
array of 16000 items push then shift 1.2461 us/op 1.3504 us/op 0.92
LinkedList of 16000 items push then shift 7.3600 ns/op 8.5620 ns/op 0.86
array of 16000 items push then pop 68.760 ns/op 81.767 ns/op 0.84
LinkedList of 16000 items push then pop 5.9000 ns/op 6.8850 ns/op 0.86
array of 24000 items push then shift 1.8076 us/op 2.0117 us/op 0.90
LinkedList of 24000 items push then shift 7.0170 ns/op 7.9310 ns/op 0.88
array of 24000 items push then pop 97.072 ns/op 110.83 ns/op 0.88
LinkedList of 24000 items push then pop 5.8840 ns/op 6.5390 ns/op 0.90
intersect bitArray bitLen 8 3.8510 ns/op 4.0460 ns/op 0.95
intersect array and set length 8 28.441 ns/op 31.197 ns/op 0.91
intersect bitArray bitLen 128 22.871 ns/op 24.536 ns/op 0.93
intersect array and set length 128 491.67 ns/op 520.45 ns/op 0.94
bitArray.getTrueBitIndexes() bitLen 128 913.00 ns/op 1.0020 us/op 0.91
bitArray.getTrueBitIndexes() bitLen 248 1.6410 us/op 1.7760 us/op 0.92
bitArray.getTrueBitIndexes() bitLen 512 3.4420 us/op 3.7850 us/op 0.91
Full columns - reconstruct all 6 blobs 158.11 us/op 183.99 us/op 0.86
Full columns - reconstruct half of the blobs out of 6 93.895 us/op 87.226 us/op 1.08
Full columns - reconstruct single blob out of 6 50.192 us/op 35.992 us/op 1.39
Half columns - reconstruct all 6 blobs 384.69 ms/op 398.42 ms/op 0.97
Half columns - reconstruct half of the blobs out of 6 191.83 ms/op 205.43 ms/op 0.93
Half columns - reconstruct single blob out of 6 66.427 ms/op 70.217 ms/op 0.95
Set add up to 64 items then delete first 1.6177 us/op 1.7055 us/op 0.95
OrderedSet add up to 64 items then delete first 2.4784 us/op 2.5772 us/op 0.96
Set add up to 64 items then delete last 1.7760 us/op 2.6366 us/op 0.67
OrderedSet add up to 64 items then delete last 2.7680 us/op 4.1087 us/op 0.67
Set add up to 64 items then delete middle 1.8058 us/op 1.9942 us/op 0.91
OrderedSet add up to 64 items then delete middle 4.2990 us/op 4.6206 us/op 0.93
Set add up to 128 items then delete first 3.4833 us/op 3.7752 us/op 0.92
OrderedSet add up to 128 items then delete first 5.3173 us/op 5.6996 us/op 0.93
Set add up to 128 items then delete last 3.5399 us/op 3.7467 us/op 0.94
OrderedSet add up to 128 items then delete last 5.5560 us/op 5.7425 us/op 0.97
Set add up to 128 items then delete middle 4.0297 us/op 3.7499 us/op 1.07
OrderedSet add up to 128 items then delete middle 11.940 us/op 11.981 us/op 1.00
Set add up to 256 items then delete first 7.0397 us/op 7.8436 us/op 0.90
OrderedSet add up to 256 items then delete first 11.671 us/op 12.227 us/op 0.95
Set add up to 256 items then delete last 7.0166 us/op 7.4837 us/op 0.94
OrderedSet add up to 256 items then delete last 12.074 us/op 12.159 us/op 0.99
Set add up to 256 items then delete middle 7.0820 us/op 7.8220 us/op 0.91
OrderedSet add up to 256 items then delete middle 35.931 us/op 37.235 us/op 0.96
runFastConfirmationRules vc:100000 bc:96 eq:0 4.4459 ms/op 4.7959 ms/op 0.93
runFastConfirmationRules vc:600000 bc:96 eq:0 35.253 ms/op 38.568 ms/op 0.91
runFastConfirmationRules vc:1000000 bc:96 eq:0 59.047 ms/op 61.592 ms/op 0.96
runFastConfirmationRules vc:600000 bc:320 eq:0 36.261 ms/op 37.558 ms/op 0.97
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.1353 s/op 1.1657 s/op 0.97
pass gossip attestations to forkchoice per slot 2.5580 ms/op 2.8645 ms/op 0.89
forkChoice updateHead vc 100000 bc 64 eq 0 406.93 us/op 432.65 us/op 0.94
forkChoice updateHead vc 600000 bc 64 eq 0 2.4759 ms/op 2.5773 ms/op 0.96
forkChoice updateHead vc 1000000 bc 64 eq 0 4.1127 ms/op 4.2495 ms/op 0.97
forkChoice updateHead vc 600000 bc 320 eq 0 2.4896 ms/op 2.5908 ms/op 0.96
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5475 ms/op 2.6544 ms/op 0.96
forkChoice updateHead vc 600000 bc 7200 eq 0 3.1536 ms/op 3.1044 ms/op 1.02
forkChoice updateHead vc 600000 bc 64 eq 1000 2.4575 ms/op 2.6043 ms/op 0.94
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5830 ms/op 2.7057 ms/op 0.95
forkChoice updateHead vc 600000 bc 64 eq 300000 6.7352 ms/op 7.2341 ms/op 0.93
computeDeltas 1400000 validators 0% inactive 11.692 ms/op 12.904 ms/op 0.91
computeDeltas 1400000 validators 10% inactive 11.136 ms/op 12.011 ms/op 0.93
computeDeltas 1400000 validators 20% inactive 10.551 ms/op 11.311 ms/op 0.93
computeDeltas 1400000 validators 50% inactive 8.6268 ms/op 9.3389 ms/op 0.92
computeDeltas 2100000 validators 0% inactive 17.632 ms/op 18.933 ms/op 0.93
computeDeltas 2100000 validators 10% inactive 16.654 ms/op 17.840 ms/op 0.93
computeDeltas 2100000 validators 20% inactive 15.670 ms/op 16.914 ms/op 0.93
computeDeltas 2100000 validators 50% inactive 10.515 ms/op 12.849 ms/op 0.82
altair processAttestation - 250000 vs - 7PWei normalcase 2.5206 ms/op 1.7962 ms/op 1.40
altair processAttestation - 250000 vs - 7PWei worstcase 4.0968 ms/op 2.5140 ms/op 1.63
altair processAttestation - setStatus - 1/6 committees join 105.66 us/op 104.30 us/op 1.01
altair processAttestation - setStatus - 1/3 committees join 200.34 us/op 206.57 us/op 0.97
altair processAttestation - setStatus - 1/2 committees join 285.43 us/op 294.23 us/op 0.97
altair processAttestation - setStatus - 2/3 committees join 355.25 us/op 379.54 us/op 0.94
altair processAttestation - setStatus - 4/5 committees join 502.95 us/op 578.59 us/op 0.87
altair processAttestation - setStatus - 100% committees join 607.77 us/op 625.83 us/op 0.97
altair processBlock - 250000 vs - 7PWei normalcase 4.1429 ms/op 4.0011 ms/op 1.04
altair processBlock - 250000 vs - 7PWei normalcase hashState 16.648 ms/op 17.056 ms/op 0.98
altair processBlock - 250000 vs - 7PWei worstcase 20.283 ms/op 22.561 ms/op 0.90
altair processBlock - 250000 vs - 7PWei worstcase hashState 41.495 ms/op 41.373 ms/op 1.00
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4777 ms/op 1.6054 ms/op 0.92
phase0 processBlock - 250000 vs - 7PWei worstcase 15.766 ms/op 17.365 ms/op 0.91
altair processEth1Data - 250000 vs - 7PWei normalcase 285.69 us/op 291.35 us/op 0.98
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.2340 us/op 3.6630 us/op 0.88
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 18.953 us/op 22.327 us/op 0.85
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.2670 us/op 6.1610 us/op 0.85
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.5540 us/op 3.9930 us/op 0.89
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 82.238 us/op 95.746 us/op 0.86
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3192 ms/op 1.4351 ms/op 0.92
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.6910 ms/op 1.8593 ms/op 0.91
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.7025 ms/op 1.8597 ms/op 0.92
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.4851 ms/op 3.7311 ms/op 0.93
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.0420 ms/op 2.1208 ms/op 0.96
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 3.8327 ms/op 4.1017 ms/op 0.93
Tree 40 250000 create 325.55 ms/op 326.52 ms/op 1.00
Tree 40 250000 get(125000) 90.513 ns/op 99.711 ns/op 0.91
Tree 40 250000 set(125000) 963.07 ns/op 1.0776 us/op 0.89
Tree 40 250000 toArray() 15.585 ms/op 11.207 ms/op 1.39
Tree 40 250000 iterate all - toArray() + loop 15.928 ms/op 12.849 ms/op 1.24
Tree 40 250000 iterate all - get(i) 38.034 ms/op 42.578 ms/op 0.89
Array 250000 create 2.2377 ms/op 2.4341 ms/op 0.92
Array 250000 clone - spread 695.81 us/op 736.93 us/op 0.94
Array 250000 get(125000) 0.28700 ns/op 0.30100 ns/op 0.95
Array 250000 set(125000) 0.29200 ns/op 0.30300 ns/op 0.96
Array 250000 iterate all - loop 56.062 us/op 58.287 us/op 0.96
phase0 afterProcessEpoch - 250000 vs - 7PWei 38.554 ms/op 41.826 ms/op 0.92
Array.fill - length 1000000 4.6709 ms/op 4.0479 ms/op 1.15
Array push - length 1000000 14.322 ms/op 13.294 ms/op 1.08
Array.get 0.20677 ns/op 0.21147 ns/op 0.98
Uint8Array.get 0.24374 ns/op 0.24875 ns/op 0.98
phase0 beforeProcessEpoch - 250000 vs - 7PWei 16.522 ms/op 17.051 ms/op 0.97
altair processEpoch - mainnet_e81889 262.31 ms/op 304.64 ms/op 0.86
mainnet_e81889 - altair beforeProcessEpoch 16.277 ms/op 58.890 ms/op 0.28
mainnet_e81889 - altair processJustificationAndFinalization 6.2060 us/op 6.7300 us/op 0.92
mainnet_e81889 - altair processInactivityUpdates 5.4696 ms/op 3.5969 ms/op 1.52
mainnet_e81889 - altair processRewardsAndPenalties 19.817 ms/op 19.634 ms/op 1.01
mainnet_e81889 - altair processRegistryUpdates 552.00 ns/op 586.00 ns/op 0.94
mainnet_e81889 - altair processSlashings 136.00 ns/op 149.00 ns/op 0.91
mainnet_e81889 - altair processEth1DataReset 135.00 ns/op 144.00 ns/op 0.94
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.5571 ms/op 1.6883 ms/op 0.92
mainnet_e81889 - altair processSlashingsReset 688.00 ns/op 774.00 ns/op 0.89
mainnet_e81889 - altair processRandaoMixesReset 1.2450 us/op 1.4350 us/op 0.87
mainnet_e81889 - altair processHistoricalRootsUpdate 136.00 ns/op 147.00 ns/op 0.93
mainnet_e81889 - altair processParticipationFlagUpdates 439.00 ns/op 476.00 ns/op 0.92
mainnet_e81889 - altair processSyncCommitteeUpdates 110.00 ns/op 164.00 ns/op 0.67
mainnet_e81889 - altair afterProcessEpoch 41.491 ms/op 43.060 ms/op 0.96
capella processEpoch - mainnet_e217614 848.07 ms/op 803.02 ms/op 1.06
mainnet_e217614 - capella beforeProcessEpoch 70.783 ms/op 65.510 ms/op 1.08
mainnet_e217614 - capella processJustificationAndFinalization 7.2120 us/op 5.9300 us/op 1.22
mainnet_e217614 - capella processInactivityUpdates 15.605 ms/op 13.961 ms/op 1.12
mainnet_e217614 - capella processRewardsAndPenalties 89.694 ms/op 97.527 ms/op 0.92
mainnet_e217614 - capella processRegistryUpdates 4.4210 us/op 4.6050 us/op 0.96
mainnet_e217614 - capella processSlashings 137.00 ns/op 144.00 ns/op 0.95
mainnet_e217614 - capella processEth1DataReset 134.00 ns/op 156.00 ns/op 0.86
mainnet_e217614 - capella processEffectiveBalanceUpdates 14.914 ms/op 5.9442 ms/op 2.51
mainnet_e217614 - capella processSlashingsReset 668.00 ns/op 706.00 ns/op 0.95
mainnet_e217614 - capella processRandaoMixesReset 1.3690 us/op 1.2020 us/op 1.14
mainnet_e217614 - capella processHistoricalRootsUpdate 135.00 ns/op 145.00 ns/op 0.93
mainnet_e217614 - capella processParticipationFlagUpdates 430.00 ns/op 451.00 ns/op 0.95
mainnet_e217614 - capella afterProcessEpoch 105.77 ms/op 111.80 ms/op 0.95
phase0 processEpoch - mainnet_e58758 358.03 ms/op 326.38 ms/op 1.10
mainnet_e58758 - phase0 beforeProcessEpoch 82.128 ms/op 66.820 ms/op 1.23
mainnet_e58758 - phase0 processJustificationAndFinalization 6.5140 us/op 6.1800 us/op 1.05
mainnet_e58758 - phase0 processRewardsAndPenalties 16.000 ms/op 16.732 ms/op 0.96
mainnet_e58758 - phase0 processRegistryUpdates 2.2150 us/op 2.3760 us/op 0.93
mainnet_e58758 - phase0 processSlashings 138.00 ns/op 146.00 ns/op 0.95
mainnet_e58758 - phase0 processEth1DataReset 134.00 ns/op 146.00 ns/op 0.92
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 2.7865 ms/op 854.13 us/op 3.26
mainnet_e58758 - phase0 processSlashingsReset 939.00 ns/op 990.00 ns/op 0.95
mainnet_e58758 - phase0 processRandaoMixesReset 1.4570 us/op 1.4070 us/op 1.04
mainnet_e58758 - phase0 processHistoricalRootsUpdate 136.00 ns/op 144.00 ns/op 0.94
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.3340 us/op 1.5990 us/op 0.83
mainnet_e58758 - phase0 afterProcessEpoch 35.147 ms/op 34.338 ms/op 1.02
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.0130 ms/op 1.0364 ms/op 0.98
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.6256 ms/op 1.6778 ms/op 0.97
altair processInactivityUpdates - 250000 normalcase 12.215 ms/op 11.054 ms/op 1.11
altair processInactivityUpdates - 250000 worstcase 12.605 ms/op 11.299 ms/op 1.12
phase0 processRegistryUpdates - 250000 normalcase 3.5680 us/op 2.8020 us/op 1.27
phase0 processRegistryUpdates - 250000 badcase_full_deposits 142.98 us/op 149.53 us/op 0.96
phase0 processRegistryUpdates - 250000 worstcase 0.5 74.656 ms/op 77.222 ms/op 0.97
altair processRewardsAndPenalties - 250000 normalcase 16.962 ms/op 15.422 ms/op 1.10
altair processRewardsAndPenalties - 250000 worstcase 16.920 ms/op 17.747 ms/op 0.95
phase0 getAttestationDeltas - 250000 normalcase 5.7646 ms/op 5.6873 ms/op 1.01
phase0 getAttestationDeltas - 250000 worstcase 5.6302 ms/op 6.7986 ms/op 0.83
phase0 processSlashings - 250000 worstcase 65.267 us/op 78.493 us/op 0.83
altair processSyncCommitteeUpdates - 250000 12.860 ms/op 10.344 ms/op 1.24
BeaconState.hashTreeRoot - No change 183.00 ns/op 176.00 ns/op 1.04
BeaconState.hashTreeRoot - 1 full validator 95.465 us/op 59.826 us/op 1.60
BeaconState.hashTreeRoot - 32 full validator 824.30 us/op 665.90 us/op 1.24
BeaconState.hashTreeRoot - 512 full validator 9.9911 ms/op 6.3350 ms/op 1.58
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 109.39 us/op 74.058 us/op 1.48
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4147 ms/op 1.1432 ms/op 1.24
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 23.443 ms/op 14.029 ms/op 1.67
BeaconState.hashTreeRoot - 1 balances 91.465 us/op 75.746 us/op 1.21
BeaconState.hashTreeRoot - 32 balances 804.37 us/op 566.39 us/op 1.42
BeaconState.hashTreeRoot - 512 balances 7.9279 ms/op 4.9884 ms/op 1.59
BeaconState.hashTreeRoot - 250000 balances 137.21 ms/op 119.49 ms/op 1.15
aggregationBits - 2048 els - zipIndexesInBitList 22.147 us/op 21.795 us/op 1.02
regular array get 100000 times 23.091 us/op 23.398 us/op 0.99
wrappedArray get 100000 times 23.059 us/op 23.468 us/op 0.98
arrayWithProxy get 100000 times 9.6626 ms/op 11.337 ms/op 0.85
ssz.Root.equals 21.378 ns/op 22.134 ns/op 0.97
byteArrayEquals 21.291 ns/op 21.916 ns/op 0.97
Buffer.compare 8.8420 ns/op 9.0890 ns/op 0.97
processSlot - 1 slots 10.633 us/op 8.4690 us/op 1.26
processSlot - 32 slots 2.1642 ms/op 1.7250 ms/op 1.25
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 6.8479 ms/op 3.4562 ms/op 1.98
getCommitteeAssignments - req 1 vs - 250000 vc 1.6479 ms/op 1.7448 ms/op 0.94
getCommitteeAssignments - req 100 vs - 250000 vc 3.4523 ms/op 3.6975 ms/op 0.93
getCommitteeAssignments - req 1000 vs - 250000 vc 3.6382 ms/op 3.8562 ms/op 0.94
findModifiedValidators - 10000 modified validators 824.18 ms/op 827.47 ms/op 1.00
findModifiedValidators - 1000 modified validators 595.01 ms/op 892.89 ms/op 0.67
findModifiedValidators - 100 modified validators 381.21 ms/op 383.28 ms/op 0.99
findModifiedValidators - 10 modified validators 284.34 ms/op 308.82 ms/op 0.92
findModifiedValidators - 1 modified validators 240.44 ms/op 354.68 ms/op 0.68
findModifiedValidators - no difference 251.09 ms/op 246.57 ms/op 1.02
migrate state 1500000 validators, 3400 modified, 2000 new 3.5912 s/op 3.2757 s/op 1.10
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.6700 ns/op 3.8000 ns/op 0.97
state getBlockRootAtSlot - 250000 vs - 7PWei 431.18 ns/op 290.40 ns/op 1.48
computeProposerIndex 100000 validators 1.3871 ms/op 1.3766 ms/op 1.01
getNextSyncCommitteeIndices 1000 validators 2.9151 ms/op 3.0220 ms/op 0.96
getNextSyncCommitteeIndices 10000 validators 25.987 ms/op 26.854 ms/op 0.97
getNextSyncCommitteeIndices 100000 validators 94.044 ms/op 90.724 ms/op 1.04
computeProposers - vc 250000 582.48 us/op 563.36 us/op 1.03
computeEpochShuffling - vc 250000 40.361 ms/op 41.539 ms/op 0.97
getNextSyncCommittee - vc 250000 10.876 ms/op 9.6437 ms/op 1.13
nodejs block root to RootHex using toHex 94.663 ns/op 100.70 ns/op 0.94
nodejs block root to RootHex using toRootHex 64.443 ns/op 65.457 ns/op 0.98
nodejs fromHex(blob) 867.97 us/op 916.97 us/op 0.95
nodejs fromHexInto(blob) 628.18 us/op 644.73 us/op 0.97
nodejs block root to RootHex using the deprecated toHexString 494.50 ns/op 514.23 ns/op 0.96
nodejs byteArrayEquals 32 bytes (block root) 25.847 ns/op 26.627 ns/op 0.97
nodejs byteArrayEquals 48 bytes (pubkey) 37.639 ns/op 38.529 ns/op 0.98
nodejs byteArrayEquals 96 bytes (signature) 33.418 ns/op 38.963 ns/op 0.86
nodejs byteArrayEquals 1024 bytes 39.221 ns/op 46.301 ns/op 0.85
nodejs byteArrayEquals 131072 bytes (blob) 1.7653 us/op 1.7879 us/op 0.99
browser block root to RootHex using toHex 143.76 ns/op 148.78 ns/op 0.97
browser block root to RootHex using toRootHex 140.09 ns/op 134.51 ns/op 1.04
browser fromHex(blob) 1.7521 ms/op 1.7763 ms/op 0.99
browser fromHexInto(blob) 632.83 us/op 652.00 us/op 0.97
browser block root to RootHex using the deprecated toHexString 356.39 ns/op 357.17 ns/op 1.00
browser byteArrayEquals 32 bytes (block root) 28.290 ns/op 28.770 ns/op 0.98
browser byteArrayEquals 48 bytes (pubkey) 39.633 ns/op 40.451 ns/op 0.98
browser byteArrayEquals 96 bytes (signature) 75.051 ns/op 75.519 ns/op 0.99
browser byteArrayEquals 1024 bytes 760.92 ns/op 770.49 ns/op 0.99
browser byteArrayEquals 131072 bytes (blob) 96.909 us/op 97.250 us/op 1.00

by benchmarkbot/action

@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

@nflaig

nflaig commented Aug 13, 2026

Copy link
Copy Markdown
Member

with this change we should be able to remove REPEAT_PROPOSAL handling on the api and always throw an error as this should never happen unless it's a faulty validator client or a signer without slashing protection db

@nflaig
nflaig merged commit ca6d994 into unstable Aug 13, 2026
20 checks passed
@nflaig
nflaig deleted the te/fix_REPEAT_PROPOSAL branch August 13, 2026 08:05
@github-project-automation github-project-automation Bot moved this from In Progress to Done in Lodestar Team Coordination Aug 13, 2026
nflaig added a commit that referenced this pull request Aug 17, 2026
Follow-up to #9805 and #9814

`REPEAT_PROPOSAL` now identifies a conflicting block root, but the
publish block API still treated it like benign `ALREADY_KNOWN` and
returned success.

Remove that special case so repeat proposals use the existing gossip
validation error path. Keep `ALREADY_KNOWN` benign and add focused API
coverage for both cases.
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