Skip to content

fix: restore seen root dedupe for column created block inputs - #9162

Closed
nflaig wants to merge 1 commit into
unstablefrom
nflaig/fulu-seen-root-dedupe
Closed

fix: restore seen root dedupe for column created block inputs#9162
nflaig wants to merge 1 commit into
unstablefrom
nflaig/fulu-seen-root-dedupe

Conversation

@nflaig

@nflaig nflaig commented Apr 2, 2026

Copy link
Copy Markdown
Member

Fulu can cache a BlockInput from data columns before the full beacon block is available.

PR #9025 narrowed seenBlock() to only treat roots with a cached block as seen, which caused the network processor to start unknownBlockRoot sync for roots that were already being assembled locally from columns.

Restore the broader seen root check for BlockInput cache entries while keeping hasBlock() available for the narrower "full block present" query. Add a regression test covering a Fulu column first cache entry.

Fulu can cache a BlockInput from data columns before the full beacon block is
available.

PR #9025 narrowed seenBlock() to only treat roots with a cached block as
seen, which caused the network processor to start unknownBlockRoot sync for
roots that were already being assembled locally from columns.

Restore the broader seen-root check for BlockInput cache entries while
keeping hasBlock() available for the narrower "full block present" query.
Add a regression test covering a Fulu column-first cache entry.
@nflaig
nflaig requested a review from a team as a code owner April 2, 2026 21:03

@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 introduces a new has method to the SeenBlockInput cache and updates the BeaconChain's seenBlock logic to utilize it. This change ensures that blocks currently being assembled from data columns are recognized as seen, which helps prevent redundant synchronization requests. Additionally, a unit test has been added to verify the behavior for column-only block inputs. I have no feedback to provide as the existing review comments were explanatory and did not identify any issues or areas for improvement.

@github-actions

github-actions Bot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: 5beacca Previous: 8b81ee6 Ratio
Full columns - reconstruct all 20 blobs 584.92 us/op 2.0418 ms/op 0.29
Full benchmark results
Benchmark suite Current: 5beacca Previous: 8b81ee6 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0241 ms/op 897.89 us/op 1.14
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 40.307 us/op 38.221 us/op 1.05
BLS verify - blst 740.11 us/op 631.71 us/op 1.17
BLS verifyMultipleSignatures 3 - blst 1.2956 ms/op 1.2890 ms/op 1.01
BLS verifyMultipleSignatures 8 - blst 2.0543 ms/op 2.0581 ms/op 1.00
BLS verifyMultipleSignatures 32 - blst 6.4218 ms/op 6.5589 ms/op 0.98
BLS verifyMultipleSignatures 64 - blst 12.660 ms/op 12.616 ms/op 1.00
BLS verifyMultipleSignatures 128 - blst 24.125 ms/op 24.455 ms/op 0.99
BLS deserializing 10000 signatures 619.30 ms/op 620.54 ms/op 1.00
BLS deserializing 100000 signatures 6.1612 s/op 6.2137 s/op 0.99
BLS verifyMultipleSignatures - same message - 3 - blst 692.28 us/op 730.95 us/op 0.95
BLS verifyMultipleSignatures - same message - 8 - blst 897.61 us/op 805.76 us/op 1.11
BLS verifyMultipleSignatures - same message - 32 - blst 1.5000 ms/op 1.4922 ms/op 1.01
BLS verifyMultipleSignatures - same message - 64 - blst 2.4029 ms/op 2.3906 ms/op 1.01
BLS verifyMultipleSignatures - same message - 128 - blst 3.9944 ms/op 3.9794 ms/op 1.00
BLS aggregatePubkeys 32 - blst 17.931 us/op 17.032 us/op 1.05
BLS aggregatePubkeys 128 - blst 63.834 us/op 61.127 us/op 1.04
getSlashingsAndExits - default max 50.047 us/op 43.859 us/op 1.14
getSlashingsAndExits - 2k 417.52 us/op 356.92 us/op 1.17
proposeBlockBody type=full, size=empty 660.44 us/op 532.51 us/op 1.24
isKnown best case - 1 super set check 210.00 ns/op 183.00 ns/op 1.15
isKnown normal case - 2 super set checks 173.00 ns/op 163.00 ns/op 1.06
isKnown worse case - 16 super set checks 170.00 ns/op 165.00 ns/op 1.03
validate api signedAggregateAndProof - struct 1.4870 ms/op 1.4148 ms/op 1.05
validate gossip signedAggregateAndProof - struct 1.4928 ms/op 1.4225 ms/op 1.05
batch validate gossip attestation - vc 640000 - chunk 32 107.64 us/op 100.92 us/op 1.07
batch validate gossip attestation - vc 640000 - chunk 64 94.383 us/op 88.818 us/op 1.06
batch validate gossip attestation - vc 640000 - chunk 128 87.524 us/op 82.969 us/op 1.05
batch validate gossip attestation - vc 640000 - chunk 256 86.016 us/op 80.607 us/op 1.07
bytes32 toHexString 301.00 ns/op 267.00 ns/op 1.13
bytes32 Buffer.toString(hex) 183.00 ns/op 172.00 ns/op 1.06
bytes32 Buffer.toString(hex) from Uint8Array 266.00 ns/op 245.00 ns/op 1.09
bytes32 Buffer.toString(hex) + 0x 182.00 ns/op 173.00 ns/op 1.05
Return object 10000 times 0.21320 ns/op 0.20430 ns/op 1.04
Throw Error 10000 times 3.3347 us/op 3.1469 us/op 1.06
toHex 111.72 ns/op 90.732 ns/op 1.23
Buffer.from 87.763 ns/op 83.139 ns/op 1.06
shared Buffer 62.084 ns/op 56.957 ns/op 1.09
fastMsgIdFn sha256 / 200 bytes 1.4820 us/op 1.4110 us/op 1.05
fastMsgIdFn h32 xxhash / 200 bytes 163.00 ns/op 147.00 ns/op 1.11
fastMsgIdFn h64 xxhash / 200 bytes 205.00 ns/op 194.00 ns/op 1.06
fastMsgIdFn sha256 / 1000 bytes 4.7300 us/op 4.5000 us/op 1.05
fastMsgIdFn h32 xxhash / 1000 bytes 252.00 ns/op 234.00 ns/op 1.08
fastMsgIdFn h64 xxhash / 1000 bytes 252.00 ns/op 240.00 ns/op 1.05
fastMsgIdFn sha256 / 10000 bytes 41.754 us/op 39.868 us/op 1.05
fastMsgIdFn h32 xxhash / 10000 bytes 1.2890 us/op 1.2220 us/op 1.05
fastMsgIdFn h64 xxhash / 10000 bytes 831.00 ns/op 796.00 ns/op 1.04
send data - 1000 256B messages 4.7138 ms/op 4.2410 ms/op 1.11
send data - 1000 512B messages 6.5557 ms/op 4.1894 ms/op 1.56
send data - 1000 1024B messages 5.9717 ms/op 4.2691 ms/op 1.40
send data - 1000 1200B messages 5.6173 ms/op 4.6198 ms/op 1.22
send data - 1000 2048B messages 5.6059 ms/op 4.7627 ms/op 1.18
send data - 1000 4096B messages 6.8266 ms/op 5.4421 ms/op 1.25
send data - 1000 16384B messages 18.496 ms/op 29.233 ms/op 0.63
send data - 1000 65536B messages 231.84 ms/op 210.08 ms/op 1.10
enrSubnets - fastDeserialize 64 bits 756.00 ns/op 701.00 ns/op 1.08
enrSubnets - ssz BitVector 64 bits 293.00 ns/op 248.00 ns/op 1.18
enrSubnets - fastDeserialize 4 bits 103.00 ns/op 105.00 ns/op 0.98
enrSubnets - ssz BitVector 4 bits 299.00 ns/op 252.00 ns/op 1.19
prioritizePeers score -10:0 att 32-0.1 sync 2-0 213.62 us/op 194.99 us/op 1.10
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 259.76 us/op 223.24 us/op 1.16
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 351.34 us/op 332.40 us/op 1.06
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 614.93 us/op 575.68 us/op 1.07
prioritizePeers score 0:0 att 64-1 sync 4-1 734.54 us/op 674.80 us/op 1.09
array of 16000 items push then shift 1.2611 us/op 1.2372 us/op 1.02
LinkedList of 16000 items push then shift 7.6450 ns/op 7.2270 ns/op 1.06
array of 16000 items push then pop 71.054 ns/op 67.046 ns/op 1.06
LinkedList of 16000 items push then pop 6.2390 ns/op 5.7940 ns/op 1.08
array of 24000 items push then shift 1.8576 us/op 1.8070 us/op 1.03
LinkedList of 24000 items push then shift 7.8070 ns/op 6.8190 ns/op 1.14
array of 24000 items push then pop 99.263 ns/op 93.670 ns/op 1.06
LinkedList of 24000 items push then pop 6.1350 ns/op 5.8340 ns/op 1.05
intersect bitArray bitLen 8 4.7160 ns/op 4.6390 ns/op 1.02
intersect array and set length 8 28.720 ns/op 29.482 ns/op 0.97
intersect bitArray bitLen 128 24.936 ns/op 23.392 ns/op 1.07
intersect array and set length 128 494.81 ns/op 479.55 ns/op 1.03
bitArray.getTrueBitIndexes() bitLen 128 1.0120 us/op 1.0180 us/op 0.99
bitArray.getTrueBitIndexes() bitLen 248 1.7400 us/op 1.7130 us/op 1.02
bitArray.getTrueBitIndexes() bitLen 512 3.5820 us/op 3.4970 us/op 1.02
Full columns - reconstruct all 6 blobs 124.34 us/op 145.41 us/op 0.86
Full columns - reconstruct half of the blobs out of 6 102.84 us/op 124.54 us/op 0.83
Full columns - reconstruct single blob out of 6 32.951 us/op 31.465 us/op 1.05
Half columns - reconstruct all 6 blobs 384.01 ms/op 372.07 ms/op 1.03
Half columns - reconstruct half of the blobs out of 6 194.85 ms/op 187.02 ms/op 1.04
Half columns - reconstruct single blob out of 6 69.024 ms/op 67.171 ms/op 1.03
Full columns - reconstruct all 10 blobs 212.87 us/op 245.36 us/op 0.87
Full columns - reconstruct half of the blobs out of 10 110.13 us/op 139.53 us/op 0.79
Full columns - reconstruct single blob out of 10 29.122 us/op 43.945 us/op 0.66
Half columns - reconstruct all 10 blobs 647.21 ms/op 629.27 ms/op 1.03
Half columns - reconstruct half of the blobs out of 10 327.61 ms/op 308.78 ms/op 1.06
Half columns - reconstruct single blob out of 10 69.184 ms/op 65.549 ms/op 1.06
Full columns - reconstruct all 20 blobs 584.92 us/op 2.0418 ms/op 0.29
Full columns - reconstruct half of the blobs out of 20 197.58 us/op 376.49 us/op 0.52
Full columns - reconstruct single blob out of 20 29.250 us/op 25.707 us/op 1.14
Half columns - reconstruct all 20 blobs 1.2883 s/op 1.2100 s/op 1.06
Half columns - reconstruct half of the blobs out of 20 636.91 ms/op 615.53 ms/op 1.03
Half columns - reconstruct single blob out of 20 68.318 ms/op 67.258 ms/op 1.02
Set add up to 64 items then delete first 2.0363 us/op 2.0502 us/op 0.99
OrderedSet add up to 64 items then delete first 3.1990 us/op 3.2482 us/op 0.98
Set add up to 64 items then delete last 2.0445 us/op 2.0523 us/op 1.00
OrderedSet add up to 64 items then delete last 3.1907 us/op 3.1296 us/op 1.02
Set add up to 64 items then delete middle 2.0275 us/op 2.0259 us/op 1.00
OrderedSet add up to 64 items then delete middle 4.6599 us/op 4.4952 us/op 1.04
Set add up to 128 items then delete first 4.2635 us/op 4.0021 us/op 1.07
OrderedSet add up to 128 items then delete first 6.3420 us/op 5.9882 us/op 1.06
Set add up to 128 items then delete last 4.0260 us/op 3.6881 us/op 1.09
OrderedSet add up to 128 items then delete last 5.7264 us/op 5.5092 us/op 1.04
Set add up to 128 items then delete middle 3.7499 us/op 3.6629 us/op 1.02
OrderedSet add up to 128 items then delete middle 12.932 us/op 11.354 us/op 1.14
Set add up to 256 items then delete first 9.6962 us/op 7.5123 us/op 1.29
OrderedSet add up to 256 items then delete first 12.052 us/op 11.666 us/op 1.03
Set add up to 256 items then delete last 7.4080 us/op 7.3153 us/op 1.01
OrderedSet add up to 256 items then delete last 11.075 us/op 11.166 us/op 0.99
Set add up to 256 items then delete middle 7.4078 us/op 7.2048 us/op 1.03
OrderedSet add up to 256 items then delete middle 34.418 us/op 37.315 us/op 0.92
pass gossip attestations to forkchoice per slot 2.5495 ms/op 2.4796 ms/op 1.03
forkChoice updateHead vc 100000 bc 64 eq 0 386.25 us/op 381.16 us/op 1.01
forkChoice updateHead vc 600000 bc 64 eq 0 2.3321 ms/op 2.2751 ms/op 1.03
forkChoice updateHead vc 1000000 bc 64 eq 0 3.9066 ms/op 3.7688 ms/op 1.04
forkChoice updateHead vc 600000 bc 320 eq 0 2.3160 ms/op 2.2909 ms/op 1.01
forkChoice updateHead vc 600000 bc 1200 eq 0 2.3345 ms/op 2.3395 ms/op 1.00
forkChoice updateHead vc 600000 bc 7200 eq 0 3.2792 ms/op 2.6996 ms/op 1.21
forkChoice updateHead vc 600000 bc 64 eq 1000 2.8505 ms/op 2.8557 ms/op 1.00
forkChoice updateHead vc 600000 bc 64 eq 10000 2.9738 ms/op 2.9894 ms/op 0.99
forkChoice updateHead vc 600000 bc 64 eq 300000 6.6235 ms/op 7.5422 ms/op 0.88
computeDeltas 1400000 validators 0% inactive 12.501 ms/op 12.927 ms/op 0.97
computeDeltas 1400000 validators 10% inactive 11.710 ms/op 12.531 ms/op 0.93
computeDeltas 1400000 validators 20% inactive 10.571 ms/op 10.973 ms/op 0.96
computeDeltas 1400000 validators 50% inactive 8.1738 ms/op 8.4396 ms/op 0.97
computeDeltas 2100000 validators 0% inactive 18.806 ms/op 19.131 ms/op 0.98
computeDeltas 2100000 validators 10% inactive 17.395 ms/op 17.984 ms/op 0.97
computeDeltas 2100000 validators 20% inactive 15.903 ms/op 16.265 ms/op 0.98
computeDeltas 2100000 validators 50% inactive 9.2057 ms/op 12.465 ms/op 0.74
altair processAttestation - 250000 vs - 7PWei normalcase 2.3337 ms/op 2.0687 ms/op 1.13
altair processAttestation - 250000 vs - 7PWei worstcase 3.3334 ms/op 2.9528 ms/op 1.13
altair processAttestation - setStatus - 1/6 committees join 107.27 us/op 100.48 us/op 1.07
altair processAttestation - setStatus - 1/3 committees join 202.80 us/op 198.78 us/op 1.02
altair processAttestation - setStatus - 1/2 committees join 276.30 us/op 274.94 us/op 1.00
altair processAttestation - setStatus - 2/3 committees join 361.37 us/op 352.06 us/op 1.03
altair processAttestation - setStatus - 4/5 committees join 502.32 us/op 501.95 us/op 1.00
altair processAttestation - setStatus - 100% committees join 574.92 us/op 571.47 us/op 1.01
altair processBlock - 250000 vs - 7PWei normalcase 4.3575 ms/op 4.9806 ms/op 0.87
altair processBlock - 250000 vs - 7PWei normalcase hashState 17.803 ms/op 16.207 ms/op 1.10
altair processBlock - 250000 vs - 7PWei worstcase 21.874 ms/op 21.413 ms/op 1.02
altair processBlock - 250000 vs - 7PWei worstcase hashState 40.583 ms/op 44.937 ms/op 0.90
phase0 processBlock - 250000 vs - 7PWei normalcase 1.3576 ms/op 1.3962 ms/op 0.97
phase0 processBlock - 250000 vs - 7PWei worstcase 16.620 ms/op 17.162 ms/op 0.97
altair processEth1Data - 250000 vs - 7PWei normalcase 273.40 us/op 306.32 us/op 0.89
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.2160 us/op 3.2580 us/op 0.99
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 19.843 us/op 22.569 us/op 0.88
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.7160 us/op 6.0710 us/op 0.94
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.6380 us/op 4.0510 us/op 0.90
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 87.022 us/op 90.966 us/op 0.96
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.3341 ms/op 1.3343 ms/op 1.00
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.7931 ms/op 1.7402 ms/op 1.03
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.7713 ms/op 1.7240 ms/op 1.03
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.7161 ms/op 3.5574 ms/op 1.04
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.1704 ms/op 2.0206 ms/op 1.07
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.4101 ms/op 3.9670 ms/op 1.11
Tree 40 250000 create 329.38 ms/op 322.57 ms/op 1.02
Tree 40 250000 get(125000) 88.962 ns/op 88.707 ns/op 1.00
Tree 40 250000 set(125000) 956.11 ns/op 973.93 ns/op 0.98
Tree 40 250000 toArray() 11.070 ms/op 14.299 ms/op 0.77
Tree 40 250000 iterate all - toArray() + loop 12.299 ms/op 12.230 ms/op 1.01
Tree 40 250000 iterate all - get(i) 37.044 ms/op 37.712 ms/op 0.98
Array 250000 create 2.0582 ms/op 2.1518 ms/op 0.96
Array 250000 clone - spread 640.89 us/op 660.31 us/op 0.97
Array 250000 get(125000) 0.28700 ns/op 0.30100 ns/op 0.95
Array 250000 set(125000) 0.29300 ns/op 0.29600 ns/op 0.99
Array 250000 iterate all - loop 55.199 us/op 57.084 us/op 0.97
phase0 afterProcessEpoch - 250000 vs - 7PWei 39.627 ms/op 48.833 ms/op 0.81
Array.fill - length 1000000 2.2479 ms/op 2.0327 ms/op 1.11
Array push - length 1000000 7.3396 ms/op 8.6210 ms/op 0.85
Array.get 0.20459 ns/op 0.19556 ns/op 1.05
Uint8Array.get 0.24080 ns/op 0.22133 ns/op 1.09
phase0 beforeProcessEpoch - 250000 vs - 7PWei 19.010 ms/op 14.026 ms/op 1.36
altair processEpoch - mainnet_e81889 284.25 ms/op 257.89 ms/op 1.10
mainnet_e81889 - altair beforeProcessEpoch 16.133 ms/op 14.809 ms/op 1.09
mainnet_e81889 - altair processJustificationAndFinalization 6.4970 us/op 5.8320 us/op 1.11
mainnet_e81889 - altair processInactivityUpdates 5.9244 ms/op 4.4666 ms/op 1.33
mainnet_e81889 - altair processRewardsAndPenalties 20.148 ms/op 21.060 ms/op 0.96
mainnet_e81889 - altair processRegistryUpdates 539.00 ns/op 526.00 ns/op 1.02
mainnet_e81889 - altair processSlashings 137.00 ns/op 136.00 ns/op 1.01
mainnet_e81889 - altair processEth1DataReset 132.00 ns/op 126.00 ns/op 1.05
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.6087 ms/op 1.2895 ms/op 1.25
mainnet_e81889 - altair processSlashingsReset 709.00 ns/op 690.00 ns/op 1.03
mainnet_e81889 - altair processRandaoMixesReset 1.2160 us/op 1.1620 us/op 1.05
mainnet_e81889 - altair processHistoricalRootsUpdate 136.00 ns/op 127.00 ns/op 1.07
mainnet_e81889 - altair processParticipationFlagUpdates 429.00 ns/op 415.00 ns/op 1.03
mainnet_e81889 - altair processSyncCommitteeUpdates 110.00 ns/op 100.00 ns/op 1.10
mainnet_e81889 - altair afterProcessEpoch 42.450 ms/op 40.599 ms/op 1.05
capella processEpoch - mainnet_e217614 853.15 ms/op 817.38 ms/op 1.04
mainnet_e217614 - capella beforeProcessEpoch 77.644 ms/op 56.897 ms/op 1.36
mainnet_e217614 - capella processJustificationAndFinalization 7.1390 us/op 5.9900 us/op 1.19
mainnet_e217614 - capella processInactivityUpdates 15.682 ms/op 15.084 ms/op 1.04
mainnet_e217614 - capella processRewardsAndPenalties 91.641 ms/op 91.579 ms/op 1.00
mainnet_e217614 - capella processRegistryUpdates 4.5520 us/op 4.2890 us/op 1.06
mainnet_e217614 - capella processSlashings 135.00 ns/op 125.00 ns/op 1.08
mainnet_e217614 - capella processEth1DataReset 135.00 ns/op 123.00 ns/op 1.10
mainnet_e217614 - capella processEffectiveBalanceUpdates 16.918 ms/op 13.188 ms/op 1.28
mainnet_e217614 - capella processSlashingsReset 685.00 ns/op 664.00 ns/op 1.03
mainnet_e217614 - capella processRandaoMixesReset 1.2750 us/op 1.1750 us/op 1.09
mainnet_e217614 - capella processHistoricalRootsUpdate 135.00 ns/op 127.00 ns/op 1.06
mainnet_e217614 - capella processParticipationFlagUpdates 441.00 ns/op 406.00 ns/op 1.09
mainnet_e217614 - capella afterProcessEpoch 111.39 ms/op 104.29 ms/op 1.07
phase0 processEpoch - mainnet_e58758 308.37 ms/op 310.67 ms/op 0.99
mainnet_e58758 - phase0 beforeProcessEpoch 68.750 ms/op 70.901 ms/op 0.97
mainnet_e58758 - phase0 processJustificationAndFinalization 6.1310 us/op 6.4140 us/op 0.96
mainnet_e58758 - phase0 processRewardsAndPenalties 16.232 ms/op 15.645 ms/op 1.04
mainnet_e58758 - phase0 processRegistryUpdates 2.2070 us/op 2.1620 us/op 1.02
mainnet_e58758 - phase0 processSlashings 134.00 ns/op 129.00 ns/op 1.04
mainnet_e58758 - phase0 processEth1DataReset 132.00 ns/op 123.00 ns/op 1.07
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.0506 ms/op 1.2125 ms/op 0.87
mainnet_e58758 - phase0 processSlashingsReset 1.1720 us/op 876.00 ns/op 1.34
mainnet_e58758 - phase0 processRandaoMixesReset 1.4630 us/op 1.3150 us/op 1.11
mainnet_e58758 - phase0 processHistoricalRootsUpdate 135.00 ns/op 129.00 ns/op 1.05
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.2980 us/op 1.1340 us/op 1.14
mainnet_e58758 - phase0 afterProcessEpoch 33.985 ms/op 33.375 ms/op 1.02
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.0063 ms/op 966.36 us/op 1.04
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 4.5634 ms/op 1.5378 ms/op 2.97
altair processInactivityUpdates - 250000 normalcase 12.926 ms/op 11.442 ms/op 1.13
altair processInactivityUpdates - 250000 worstcase 12.602 ms/op 10.811 ms/op 1.17
phase0 processRegistryUpdates - 250000 normalcase 2.1790 us/op 2.0610 us/op 1.06
phase0 processRegistryUpdates - 250000 badcase_full_deposits 139.72 us/op 136.02 us/op 1.03
phase0 processRegistryUpdates - 250000 worstcase 0.5 59.612 ms/op 67.360 ms/op 0.88
altair processRewardsAndPenalties - 250000 normalcase 15.716 ms/op 15.758 ms/op 1.00
altair processRewardsAndPenalties - 250000 worstcase 15.632 ms/op 15.005 ms/op 1.04
phase0 getAttestationDeltas - 250000 normalcase 5.2799 ms/op 5.2174 ms/op 1.01
phase0 getAttestationDeltas - 250000 worstcase 5.3529 ms/op 5.3097 ms/op 1.01
phase0 processSlashings - 250000 worstcase 59.661 us/op 63.371 us/op 0.94
altair processSyncCommitteeUpdates - 250000 10.171 ms/op 9.9210 ms/op 1.03
BeaconState.hashTreeRoot - No change 181.00 ns/op 163.00 ns/op 1.11
BeaconState.hashTreeRoot - 1 full validator 78.904 us/op 71.329 us/op 1.11
BeaconState.hashTreeRoot - 32 full validator 811.52 us/op 868.70 us/op 0.93
BeaconState.hashTreeRoot - 512 full validator 7.5469 ms/op 7.6902 ms/op 0.98
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 98.170 us/op 104.94 us/op 0.94
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.3931 ms/op 1.4138 ms/op 0.99
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 17.821 ms/op 17.271 ms/op 1.03
BeaconState.hashTreeRoot - 1 balances 82.051 us/op 83.880 us/op 0.98
BeaconState.hashTreeRoot - 32 balances 742.13 us/op 778.16 us/op 0.95
BeaconState.hashTreeRoot - 512 balances 5.7135 ms/op 5.8731 ms/op 0.97
BeaconState.hashTreeRoot - 250000 balances 128.37 ms/op 123.38 ms/op 1.04
aggregationBits - 2048 els - zipIndexesInBitList 19.458 us/op 19.298 us/op 1.01
regular array get 100000 times 22.892 us/op 22.467 us/op 1.02
wrappedArray get 100000 times 22.813 us/op 22.380 us/op 1.02
arrayWithProxy get 100000 times 17.544 ms/op 9.2294 ms/op 1.90
ssz.Root.equals 21.534 ns/op 20.743 ns/op 1.04
byteArrayEquals 21.383 ns/op 20.533 ns/op 1.04
Buffer.compare 8.8990 ns/op 8.5910 ns/op 1.04
processSlot - 1 slots 9.5420 us/op 8.3290 us/op 1.15
processSlot - 32 slots 1.9961 ms/op 2.0012 ms/op 1.00
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 5.3901 ms/op 5.1630 ms/op 1.04
getCommitteeAssignments - req 1 vs - 250000 vc 1.6675 ms/op 1.7021 ms/op 0.98
getCommitteeAssignments - req 100 vs - 250000 vc 3.3937 ms/op 3.4288 ms/op 0.99
getCommitteeAssignments - req 1000 vs - 250000 vc 3.6847 ms/op 3.7614 ms/op 0.98
findModifiedValidators - 10000 modified validators 749.71 ms/op 753.38 ms/op 1.00
findModifiedValidators - 1000 modified validators 581.33 ms/op 550.29 ms/op 1.06
findModifiedValidators - 100 modified validators 328.20 ms/op 367.83 ms/op 0.89
findModifiedValidators - 10 modified validators 280.16 ms/op 283.39 ms/op 0.99
findModifiedValidators - 1 modified validators 199.48 ms/op 188.46 ms/op 1.06
findModifiedValidators - no difference 160.41 ms/op 153.76 ms/op 1.04
migrate state 1500000 validators, 3400 modified, 2000 new 3.3976 s/op 3.2084 s/op 1.06
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.7400 ns/op 3.5400 ns/op 1.06
state getBlockRootAtSlot - 250000 vs - 7PWei 419.27 ns/op 395.23 ns/op 1.06
computeProposerIndex 100000 validators 1.3758 ms/op 1.2770 ms/op 1.08
getNextSyncCommitteeIndices 1000 validators 2.8820 ms/op 2.7419 ms/op 1.05
getNextSyncCommitteeIndices 10000 validators 25.529 ms/op 24.029 ms/op 1.06
getNextSyncCommitteeIndices 100000 validators 87.934 ms/op 78.952 ms/op 1.11
computeProposers - vc 250000 558.68 us/op 521.57 us/op 1.07
computeEpochShuffling - vc 250000 39.386 ms/op 36.731 ms/op 1.07
getNextSyncCommittee - vc 250000 10.006 ms/op 8.9951 ms/op 1.11
nodejs block root to RootHex using toHex 104.24 ns/op 98.191 ns/op 1.06
nodejs block root to RootHex using toRootHex 67.099 ns/op 62.993 ns/op 1.07
nodejs fromHex(blob) 821.70 us/op 720.99 us/op 1.14
nodejs fromHexInto(blob) 629.58 us/op 593.87 us/op 1.06
nodejs block root to RootHex using the deprecated toHexString 477.54 ns/op 339.24 ns/op 1.41
nodejs byteArrayEquals 32 bytes (block root) 25.888 ns/op 24.618 ns/op 1.05
nodejs byteArrayEquals 48 bytes (pubkey) 37.641 ns/op 35.499 ns/op 1.06
nodejs byteArrayEquals 96 bytes (signature) 32.408 ns/op 31.034 ns/op 1.04
nodejs byteArrayEquals 1024 bytes 40.240 ns/op 37.023 ns/op 1.09
nodejs byteArrayEquals 131072 bytes (blob) 1.7439 us/op 1.6418 us/op 1.06
browser block root to RootHex using toHex 143.38 ns/op 136.29 ns/op 1.05
browser block root to RootHex using toRootHex 130.82 ns/op 123.32 ns/op 1.06
browser fromHex(blob) 1.6110 ms/op 1.4424 ms/op 1.12
browser fromHexInto(blob) 623.83 us/op 597.42 us/op 1.04
browser block root to RootHex using the deprecated toHexString 326.80 ns/op 447.52 ns/op 0.73
browser byteArrayEquals 32 bytes (block root) 27.998 ns/op 26.764 ns/op 1.05
browser byteArrayEquals 48 bytes (pubkey) 39.502 ns/op 37.439 ns/op 1.06
browser byteArrayEquals 96 bytes (signature) 73.997 ns/op 70.064 ns/op 1.06
browser byteArrayEquals 1024 bytes 754.45 ns/op 715.09 ns/op 1.06
browser byteArrayEquals 131072 bytes (blob) 94.972 us/op 90.022 us/op 1.05

by benchmarkbot/action

@twoeths twoeths 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.

we need "seenBlock", not "seenBlockHex"
ie we want to know if the chain see an imported beacon_block
so we should keep the current behavior of seenBlock() function

but I do see we have a bug: DataColumnSidecar does not need a BeaconBlock to be validated in its p2p validation rule, we should search for the block, but do not await for it

we should fix it instead

@nflaig

nflaig commented Apr 3, 2026

Copy link
Copy Markdown
Member Author

but I do see we have a bug: DataColumnSidecar does not need a BeaconBlock to be validated in its p2p validation rule, we should search for the block, but do not await for it

I suppose you mean for fulu? then yes we should definitely not delay column import

@twoeths

twoeths commented Apr 3, 2026

Copy link
Copy Markdown
Member

but I do see we have a bug: DataColumnSidecar does not need a BeaconBlock to be validated in its p2p validation rule, we should search for the block, but do not await for it

I suppose you mean for fulu? then yes we should definitely not delay column import

yes, for fulu only
for gloas, a DataColumnSidecar needs respective BeaconBlock to pass through p2p validation so it makes sense to await for block there

@nflaig

nflaig commented Apr 3, 2026

Copy link
Copy Markdown
Member Author

for gloas, a DataColumnSidecar needs respective BeaconBlock to pass through p2p validation so it makes sense to await for block there

exactly, I thought the fulu case we already pass through, need to fix that before we cut a rc today

@nflaig

nflaig commented Apr 3, 2026

Copy link
Copy Markdown
Member Author

closing

@nflaig nflaig closed this Apr 3, 2026
@nflaig
nflaig deleted the nflaig/fulu-seen-root-dedupe branch April 3, 2026 08:58
@codecov

codecov Bot commented Apr 3, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.52%. Comparing base (e8407e9) to head (9e9af3d).
⚠️ Report is 2 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #9162   +/-   ##
=========================================
  Coverage     52.52%   52.52%           
=========================================
  Files           848      848           
  Lines         61447    61447           
  Branches       4528     4528           
=========================================
  Hits          32272    32272           
  Misses        29110    29110           
  Partials         65       65           
🚀 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.

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