Skip to content

fix: query shuffling from cache to compute proposer lookahead#7988

Merged
nflaig merged 6 commits into
unstablefrom
nflaig/fix-proposer-lookahead-to-unstable
Jul 25, 2025
Merged

fix: query shuffling from cache to compute proposer lookahead#7988
nflaig merged 6 commits into
unstablefrom
nflaig/fix-proposer-lookahead-to-unstable

Conversation

@nflaig

@nflaig nflaig commented Jun 21, 2025

Copy link
Copy Markdown
Member

Motivation

Right now we always compute shuffling during epoch transition when processing proposer lookahead (processProposerLookahead()) post fulu but it should already be in cache most of the time.

Description

Query shuffling from cache to compute proposer lookahead

@nflaig nflaig marked this pull request as ready for review June 21, 2025 12:44
@nflaig nflaig requested a review from a team as a code owner June 21, 2025 12:44
@github-actions

github-actions Bot commented Jun 21, 2025

Copy link
Copy Markdown
Contributor

Performance Report

🚀🚀 Significant benchmark improvement detected

Benchmark suite Current: 358d85f Previous: 899163f Ratio
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.4200 ns/op 21.020 ns/op 0.21
naive computeProposerIndex 100000 validators 55.210 ms/op 181.21 ms/op 0.30
naiveGetNextSyncCommitteeIndices 1000 validators 7.9585 s/op 23.981 s/op 0.33
naiveGetNextSyncCommitteeIndices 100000 validators 7.5867 s/op 28.737 s/op 0.26
Full benchmark results
Benchmark suite Current: 358d85f Previous: 899163f Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0113 ms/op 1.2373 ms/op 0.82
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 38.490 us/op 44.266 us/op 0.87
BLS verify - blst 889.14 us/op 1.0517 ms/op 0.85
BLS verifyMultipleSignatures 3 - blst 1.2993 ms/op 1.7609 ms/op 0.74
BLS verifyMultipleSignatures 8 - blst 2.0613 ms/op 2.4046 ms/op 0.86
BLS verifyMultipleSignatures 32 - blst 4.9044 ms/op 7.2460 ms/op 0.68
BLS verifyMultipleSignatures 64 - blst 8.9961 ms/op 12.426 ms/op 0.72
BLS verifyMultipleSignatures 128 - blst 17.260 ms/op 20.442 ms/op 0.84
BLS deserializing 10000 signatures 697.90 ms/op 880.91 ms/op 0.79
BLS deserializing 100000 signatures 6.9198 s/op 10.078 s/op 0.69
BLS verifyMultipleSignatures - same message - 3 - blst 889.30 us/op 1.6637 ms/op 0.53
BLS verifyMultipleSignatures - same message - 8 - blst 1.0073 ms/op 2.1891 ms/op 0.46
BLS verifyMultipleSignatures - same message - 32 - blst 1.7269 ms/op 2.9194 ms/op 0.59
BLS verifyMultipleSignatures - same message - 64 - blst 2.5933 ms/op 4.1895 ms/op 0.62
BLS verifyMultipleSignatures - same message - 128 - blst 4.3836 ms/op 6.0144 ms/op 0.73
BLS aggregatePubkeys 32 - blst 19.516 us/op 27.848 us/op 0.70
BLS aggregatePubkeys 128 - blst 68.318 us/op 105.00 us/op 0.65
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 49.492 ms/op 83.191 ms/op 0.59
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 44.922 ms/op 94.750 ms/op 0.47
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 34.905 ms/op 62.764 ms/op 0.56
getSlashingsAndExits - default max 72.463 us/op 154.69 us/op 0.47
getSlashingsAndExits - 2k 307.23 us/op 437.90 us/op 0.70
proposeBlockBody type=full, size=empty 6.5864 ms/op 15.865 ms/op 0.42
isKnown best case - 1 super set check 211.00 ns/op 397.00 ns/op 0.53
isKnown normal case - 2 super set checks 211.00 ns/op 414.00 ns/op 0.51
isKnown worse case - 16 super set checks 209.00 ns/op 395.00 ns/op 0.53
InMemoryCheckpointStateCache - add get delete 2.4750 us/op 5.5490 us/op 0.45
validate api signedAggregateAndProof - struct 1.7828 ms/op 3.1906 ms/op 0.56
validate gossip signedAggregateAndProof - struct 1.4255 ms/op 3.1990 ms/op 0.45
batch validate gossip attestation - vc 640000 - chunk 32 118.10 us/op 189.43 us/op 0.62
batch validate gossip attestation - vc 640000 - chunk 64 102.84 us/op 149.48 us/op 0.69
batch validate gossip attestation - vc 640000 - chunk 128 97.921 us/op 144.66 us/op 0.68
batch validate gossip attestation - vc 640000 - chunk 256 100.57 us/op 143.12 us/op 0.70
pickEth1Vote - no votes 986.02 us/op 1.2223 ms/op 0.81
pickEth1Vote - max votes 6.6561 ms/op 9.7668 ms/op 0.68
pickEth1Vote - Eth1Data hashTreeRoot value x2048 11.620 ms/op 18.156 ms/op 0.64
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 17.384 ms/op 22.715 ms/op 0.77
pickEth1Vote - Eth1Data fastSerialize value x2048 433.65 us/op 534.63 us/op 0.81
pickEth1Vote - Eth1Data fastSerialize tree x2048 3.7968 ms/op 3.3865 ms/op 1.12
bytes32 toHexString 364.00 ns/op 472.00 ns/op 0.77
bytes32 Buffer.toString(hex) 243.00 ns/op 290.00 ns/op 0.84
bytes32 Buffer.toString(hex) from Uint8Array 343.00 ns/op 441.00 ns/op 0.78
bytes32 Buffer.toString(hex) + 0x 243.00 ns/op 284.00 ns/op 0.86
Object access 1 prop 0.12300 ns/op 0.16100 ns/op 0.76
Map access 1 prop 0.12700 ns/op 0.15000 ns/op 0.85
Object get x1000 5.9550 ns/op 7.4370 ns/op 0.80
Map get x1000 6.3590 ns/op 8.0870 ns/op 0.79
Object set x1000 28.756 ns/op 35.057 ns/op 0.82
Map set x1000 19.919 ns/op 24.996 ns/op 0.80
Return object 10000 times 0.29000 ns/op 0.33820 ns/op 0.86
Throw Error 10000 times 4.5826 us/op 5.4756 us/op 0.84
toHex 147.68 ns/op 163.06 ns/op 0.91
Buffer.from 126.96 ns/op 187.45 ns/op 0.68
shared Buffer 85.390 ns/op 107.58 ns/op 0.79
fastMsgIdFn sha256 / 200 bytes 2.2130 us/op 2.7600 us/op 0.80
fastMsgIdFn h32 xxhash / 200 bytes 211.00 ns/op 244.00 ns/op 0.86
fastMsgIdFn h64 xxhash / 200 bytes 271.00 ns/op 317.00 ns/op 0.85
fastMsgIdFn sha256 / 1000 bytes 7.2830 us/op 8.8230 us/op 0.83
fastMsgIdFn h32 xxhash / 1000 bytes 341.00 ns/op 417.00 ns/op 0.82
fastMsgIdFn h64 xxhash / 1000 bytes 348.00 ns/op 417.00 ns/op 0.83
fastMsgIdFn sha256 / 10000 bytes 66.053 us/op 79.875 us/op 0.83
fastMsgIdFn h32 xxhash / 10000 bytes 1.8400 us/op 2.1140 us/op 0.87
fastMsgIdFn h64 xxhash / 10000 bytes 1.2260 us/op 1.4290 us/op 0.86
send data - 1000 256B messages 16.221 ms/op 20.873 ms/op 0.78
send data - 1000 512B messages 19.839 ms/op 25.638 ms/op 0.77
send data - 1000 1024B messages 27.051 ms/op 34.358 ms/op 0.79
send data - 1000 1200B messages 23.976 ms/op 30.304 ms/op 0.79
send data - 1000 2048B messages 25.309 ms/op 35.330 ms/op 0.72
send data - 1000 4096B messages 28.470 ms/op 37.144 ms/op 0.77
send data - 1000 16384B messages 43.898 ms/op 56.431 ms/op 0.78
send data - 1000 65536B messages 112.18 ms/op 135.48 ms/op 0.83
enrSubnets - fastDeserialize 64 bits 1.0060 us/op 1.0490 us/op 0.96
enrSubnets - ssz BitVector 64 bits 328.00 ns/op 416.00 ns/op 0.79
enrSubnets - fastDeserialize 4 bits 140.00 ns/op 166.00 ns/op 0.84
enrSubnets - ssz BitVector 4 bits 334.00 ns/op 412.00 ns/op 0.81
prioritizePeers score -10:0 att 32-0.1 sync 2-0 121.41 us/op 149.31 us/op 0.81
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 142.33 us/op 174.12 us/op 0.82
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 211.03 us/op 248.86 us/op 0.85
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 396.92 us/op 468.29 us/op 0.85
prioritizePeers score 0:0 att 64-1 sync 4-1 471.13 us/op 562.53 us/op 0.84
array of 16000 items push then shift 1.6428 us/op 1.9160 us/op 0.86
LinkedList of 16000 items push then shift 7.9110 ns/op 8.7010 ns/op 0.91
array of 16000 items push then pop 78.017 ns/op 97.819 ns/op 0.80
LinkedList of 16000 items push then pop 7.4380 ns/op 8.5930 ns/op 0.87
array of 24000 items push then shift 2.4571 us/op 3.0965 us/op 0.79
LinkedList of 24000 items push then shift 7.4690 ns/op 8.9290 ns/op 0.84
array of 24000 items push then pop 104.40 ns/op 135.85 ns/op 0.77
LinkedList of 24000 items push then pop 7.2200 ns/op 8.3740 ns/op 0.86
intersect bitArray bitLen 8 6.4820 ns/op 7.9200 ns/op 0.82
intersect array and set length 8 42.321 ns/op 46.870 ns/op 0.90
intersect bitArray bitLen 128 30.857 ns/op 37.336 ns/op 0.83
intersect array and set length 128 715.88 ns/op 778.62 ns/op 0.92
bitArray.getTrueBitIndexes() bitLen 128 1.0540 us/op 1.2080 us/op 0.87
bitArray.getTrueBitIndexes() bitLen 248 1.8600 us/op 2.1510 us/op 0.86
bitArray.getTrueBitIndexes() bitLen 512 3.8000 us/op 4.4080 us/op 0.86
Buffer.concat 32 items 619.00 ns/op 816.00 ns/op 0.76
Uint8Array.set 32 items 921.00 ns/op 1.1530 us/op 0.80
Buffer.copy 2.2120 us/op 2.4700 us/op 0.90
Uint8Array.set - with subarray 1.5300 us/op 2.0040 us/op 0.76
Uint8Array.set - without subarray 841.00 ns/op 1.1880 us/op 0.71
getUint32 - dataview 206.00 ns/op 238.00 ns/op 0.87
getUint32 - manual 123.00 ns/op 148.00 ns/op 0.83
Set add up to 64 items then delete first 2.2800 us/op 2.8018 us/op 0.81
OrderedSet add up to 64 items then delete first 3.6132 us/op 4.4256 us/op 0.82
Set add up to 64 items then delete last 2.6933 us/op 3.0608 us/op 0.88
OrderedSet add up to 64 items then delete last 4.1457 us/op 4.5414 us/op 0.91
Set add up to 64 items then delete middle 3.3876 us/op 3.2129 us/op 1.05
OrderedSet add up to 64 items then delete middle 5.7902 us/op 6.6731 us/op 0.87
Set add up to 128 items then delete first 5.4886 us/op 6.2940 us/op 0.87
OrderedSet add up to 128 items then delete first 8.6005 us/op 9.7698 us/op 0.88
Set add up to 128 items then delete last 5.4079 us/op 6.3941 us/op 0.85
OrderedSet add up to 128 items then delete last 9.7071 us/op 9.2114 us/op 1.05
Set add up to 128 items then delete middle 5.3062 us/op 6.1111 us/op 0.87
OrderedSet add up to 128 items then delete middle 17.157 us/op 17.405 us/op 0.99
Set add up to 256 items then delete first 12.711 us/op 12.656 us/op 1.00
OrderedSet add up to 256 items then delete first 17.550 us/op 20.089 us/op 0.87
Set add up to 256 items then delete last 10.647 us/op 14.128 us/op 0.75
OrderedSet add up to 256 items then delete last 16.410 us/op 21.254 us/op 0.77
Set add up to 256 items then delete middle 10.403 us/op 14.117 us/op 0.74
OrderedSet add up to 256 items then delete middle 46.212 us/op 67.685 us/op 0.68
transfer serialized Status (84 B) 2.2840 us/op 3.0220 us/op 0.76
copy serialized Status (84 B) 1.1320 us/op 1.6430 us/op 0.69
transfer serialized SignedVoluntaryExit (112 B) 2.3160 us/op 2.9930 us/op 0.77
copy serialized SignedVoluntaryExit (112 B) 1.1490 us/op 1.6020 us/op 0.72
transfer serialized ProposerSlashing (416 B) 2.3290 us/op 3.1280 us/op 0.74
copy serialized ProposerSlashing (416 B) 1.1840 us/op 1.5390 us/op 0.77
transfer serialized Attestation (485 B) 2.3800 us/op 2.7860 us/op 0.85
copy serialized Attestation (485 B) 1.2740 us/op 1.7210 us/op 0.74
transfer serialized AttesterSlashing (33232 B) 2.5600 us/op 3.2690 us/op 0.78
copy serialized AttesterSlashing (33232 B) 3.9300 us/op 4.5440 us/op 0.86
transfer serialized Small SignedBeaconBlock (128000 B) 3.2020 us/op 3.9160 us/op 0.82
copy serialized Small SignedBeaconBlock (128000 B) 10.559 us/op 11.978 us/op 0.88
transfer serialized Avg SignedBeaconBlock (200000 B) 3.6310 us/op 4.5080 us/op 0.81
copy serialized Avg SignedBeaconBlock (200000 B) 14.638 us/op 18.122 us/op 0.81
transfer serialized BlobsSidecar (524380 B) 3.7060 us/op 4.7820 us/op 0.77
copy serialized BlobsSidecar (524380 B) 60.989 us/op 65.194 us/op 0.94
transfer serialized Big SignedBeaconBlock (1000000 B) 3.6680 us/op 4.9330 us/op 0.74
copy serialized Big SignedBeaconBlock (1000000 B) 202.08 us/op 121.84 us/op 1.66
pass gossip attestations to forkchoice per slot 2.9620 ms/op 4.9699 ms/op 0.60
forkChoice updateHead vc 100000 bc 64 eq 0 492.59 us/op 828.75 us/op 0.59
forkChoice updateHead vc 600000 bc 64 eq 0 3.3262 ms/op 5.7943 ms/op 0.57
forkChoice updateHead vc 1000000 bc 64 eq 0 5.9404 ms/op 7.9653 ms/op 0.75
forkChoice updateHead vc 600000 bc 320 eq 0 3.1385 ms/op 5.0670 ms/op 0.62
forkChoice updateHead vc 600000 bc 1200 eq 0 3.2715 ms/op 4.7121 ms/op 0.69
forkChoice updateHead vc 600000 bc 7200 eq 0 3.8333 ms/op 5.2148 ms/op 0.74
forkChoice updateHead vc 600000 bc 64 eq 1000 11.033 ms/op 16.351 ms/op 0.67
forkChoice updateHead vc 600000 bc 64 eq 10000 12.254 ms/op 15.093 ms/op 0.81
forkChoice updateHead vc 600000 bc 64 eq 300000 16.682 ms/op 19.913 ms/op 0.84
computeDeltas 500000 validators 300 proto nodes 4.4590 ms/op 5.6015 ms/op 0.80
computeDeltas 500000 validators 1200 proto nodes 4.4441 ms/op 5.4477 ms/op 0.82
computeDeltas 500000 validators 7200 proto nodes 4.4445 ms/op 5.3462 ms/op 0.83
computeDeltas 750000 validators 300 proto nodes 6.3255 ms/op 7.5486 ms/op 0.84
computeDeltas 750000 validators 1200 proto nodes 7.5682 ms/op 7.2349 ms/op 1.05
computeDeltas 750000 validators 7200 proto nodes 6.9809 ms/op 7.4295 ms/op 0.94
computeDeltas 1400000 validators 300 proto nodes 12.293 ms/op 14.092 ms/op 0.87
computeDeltas 1400000 validators 1200 proto nodes 13.058 ms/op 13.242 ms/op 0.99
computeDeltas 1400000 validators 7200 proto nodes 11.647 ms/op 12.889 ms/op 0.90
computeDeltas 2100000 validators 300 proto nodes 17.478 ms/op 20.099 ms/op 0.87
computeDeltas 2100000 validators 1200 proto nodes 16.933 ms/op 20.146 ms/op 0.84
computeDeltas 2100000 validators 7200 proto nodes 16.846 ms/op 21.145 ms/op 0.80
altair processAttestation - 250000 vs - 7PWei normalcase 2.0404 ms/op 2.9257 ms/op 0.70
altair processAttestation - 250000 vs - 7PWei worstcase 3.1970 ms/op 3.8129 ms/op 0.84
altair processAttestation - setStatus - 1/6 committees join 126.36 us/op 152.79 us/op 0.83
altair processAttestation - setStatus - 1/3 committees join 246.99 us/op 283.46 us/op 0.87
altair processAttestation - setStatus - 1/2 committees join 346.23 us/op 394.94 us/op 0.88
altair processAttestation - setStatus - 2/3 committees join 440.48 us/op 532.69 us/op 0.83
altair processAttestation - setStatus - 4/5 committees join 616.64 us/op 740.05 us/op 0.83
altair processAttestation - setStatus - 100% committees join 735.60 us/op 823.75 us/op 0.89
altair processBlock - 250000 vs - 7PWei normalcase 6.9111 ms/op 5.3261 ms/op 1.30
altair processBlock - 250000 vs - 7PWei normalcase hashState 28.744 ms/op 37.005 ms/op 0.78
altair processBlock - 250000 vs - 7PWei worstcase 37.012 ms/op 40.919 ms/op 0.90
altair processBlock - 250000 vs - 7PWei worstcase hashState 80.366 ms/op 106.50 ms/op 0.75
phase0 processBlock - 250000 vs - 7PWei normalcase 1.7258 ms/op 1.9748 ms/op 0.87
phase0 processBlock - 250000 vs - 7PWei worstcase 21.349 ms/op 32.959 ms/op 0.65
altair processEth1Data - 250000 vs - 7PWei normalcase 343.81 us/op 406.32 us/op 0.85
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 6.1800 us/op 9.5830 us/op 0.64
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 41.941 us/op 50.638 us/op 0.83
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 10.565 us/op 9.6640 us/op 1.09
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 6.3870 us/op 7.7740 us/op 0.82
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 147.38 us/op 210.31 us/op 0.70
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 1.8958 ms/op 2.1959 ms/op 0.86
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.3891 ms/op 2.5606 ms/op 0.93
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.3893 ms/op 2.6487 ms/op 0.90
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.7877 ms/op 5.2202 ms/op 0.92
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.4364 ms/op 2.9303 ms/op 0.83
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.7353 ms/op 6.8572 ms/op 0.69
Tree 40 250000 create 418.78 ms/op 534.78 ms/op 0.78
Tree 40 250000 get(125000) 143.11 ns/op 182.13 ns/op 0.79
Tree 40 250000 set(125000) 1.4520 us/op 1.9269 us/op 0.75
Tree 40 250000 toArray() 15.728 ms/op 24.199 ms/op 0.65
Tree 40 250000 iterate all - toArray() + loop 16.371 ms/op 22.279 ms/op 0.73
Tree 40 250000 iterate all - get(i) 55.058 ms/op 71.101 ms/op 0.77
Array 250000 create 2.4230 ms/op 5.0338 ms/op 0.48
Array 250000 clone - spread 816.44 us/op 2.3014 ms/op 0.35
Array 250000 get(125000) 0.41500 ns/op 0.59400 ns/op 0.70
Array 250000 set(125000) 0.43400 ns/op 0.60600 ns/op 0.72
Array 250000 iterate all - loop 108.42 us/op 130.45 us/op 0.83
phase0 afterProcessEpoch - 250000 vs - 7PWei 42.463 ms/op 65.925 ms/op 0.64
Array.fill - length 1000000 3.5071 ms/op 4.2628 ms/op 0.82
Array push - length 1000000 13.594 ms/op 16.868 ms/op 0.81
Array.get 0.27810 ns/op 0.38998 ns/op 0.71
Uint8Array.get 0.44645 ns/op 0.54937 ns/op 0.81
phase0 beforeProcessEpoch - 250000 vs - 7PWei 16.697 ms/op 19.879 ms/op 0.84
altair processEpoch - mainnet_e81889 237.99 ms/op 321.07 ms/op 0.74
mainnet_e81889 - altair beforeProcessEpoch 16.865 ms/op 24.653 ms/op 0.68
mainnet_e81889 - altair processJustificationAndFinalization 5.6880 us/op 7.8410 us/op 0.73
mainnet_e81889 - altair processInactivityUpdates 4.8244 ms/op 5.2049 ms/op 0.93
mainnet_e81889 - altair processRewardsAndPenalties 38.016 ms/op 53.358 ms/op 0.71
mainnet_e81889 - altair processRegistryUpdates 655.00 ns/op 886.00 ns/op 0.74
mainnet_e81889 - altair processSlashings 180.00 ns/op 240.00 ns/op 0.75
mainnet_e81889 - altair processEth1DataReset 177.00 ns/op 245.00 ns/op 0.72
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.1963 ms/op 1.4740 ms/op 0.81
mainnet_e81889 - altair processSlashingsReset 915.00 ns/op 1.1600 us/op 0.79
mainnet_e81889 - altair processRandaoMixesReset 1.1240 us/op 1.4450 us/op 0.78
mainnet_e81889 - altair processHistoricalRootsUpdate 181.00 ns/op 217.00 ns/op 0.83
mainnet_e81889 - altair processParticipationFlagUpdates 517.00 ns/op 615.00 ns/op 0.84
mainnet_e81889 - altair processSyncCommitteeUpdates 144.00 ns/op 189.00 ns/op 0.76
mainnet_e81889 - altair afterProcessEpoch 45.030 ms/op 57.888 ms/op 0.78
capella processEpoch - mainnet_e217614 902.25 ms/op 1.0173 s/op 0.89
mainnet_e217614 - capella beforeProcessEpoch 63.359 ms/op 69.280 ms/op 0.91
mainnet_e217614 - capella processJustificationAndFinalization 5.7390 us/op 5.8390 us/op 0.98
mainnet_e217614 - capella processInactivityUpdates 14.559 ms/op 17.056 ms/op 0.85
mainnet_e217614 - capella processRewardsAndPenalties 211.00 ms/op 217.98 ms/op 0.97
mainnet_e217614 - capella processRegistryUpdates 6.4900 us/op 8.2520 us/op 0.79
mainnet_e217614 - capella processSlashings 180.00 ns/op 236.00 ns/op 0.76
mainnet_e217614 - capella processEth1DataReset 179.00 ns/op 210.00 ns/op 0.85
mainnet_e217614 - capella processEffectiveBalanceUpdates 4.4745 ms/op 5.1181 ms/op 0.87
mainnet_e217614 - capella processSlashingsReset 911.00 ns/op 1.2090 us/op 0.75
mainnet_e217614 - capella processRandaoMixesReset 1.1870 us/op 1.5570 us/op 0.76
mainnet_e217614 - capella processHistoricalRootsUpdate 182.00 ns/op 242.00 ns/op 0.75
mainnet_e217614 - capella processParticipationFlagUpdates 536.00 ns/op 588.00 ns/op 0.91
mainnet_e217614 - capella afterProcessEpoch 117.12 ms/op 132.53 ms/op 0.88
phase0 processEpoch - mainnet_e58758 286.71 ms/op 368.24 ms/op 0.78
mainnet_e58758 - phase0 beforeProcessEpoch 66.492 ms/op 89.144 ms/op 0.75
mainnet_e58758 - phase0 processJustificationAndFinalization 5.6250 us/op 5.9500 us/op 0.95
mainnet_e58758 - phase0 processRewardsAndPenalties 35.228 ms/op 42.345 ms/op 0.83
mainnet_e58758 - phase0 processRegistryUpdates 3.1790 us/op 3.8580 us/op 0.82
mainnet_e58758 - phase0 processSlashings 183.00 ns/op 223.00 ns/op 0.82
mainnet_e58758 - phase0 processEth1DataReset 180.00 ns/op 225.00 ns/op 0.80
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.2013 ms/op 1.5562 ms/op 0.77
mainnet_e58758 - phase0 processSlashingsReset 950.00 ns/op 1.0490 us/op 0.91
mainnet_e58758 - phase0 processRandaoMixesReset 1.2270 us/op 1.4200 us/op 0.86
mainnet_e58758 - phase0 processHistoricalRootsUpdate 182.00 ns/op 214.00 ns/op 0.85
mainnet_e58758 - phase0 processParticipationRecordUpdates 920.00 ns/op 1.0290 us/op 0.89
mainnet_e58758 - phase0 afterProcessEpoch 55.574 ms/op 39.554 ms/op 1.41
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.3695 ms/op 1.3452 ms/op 1.02
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.9051 ms/op 1.9849 ms/op 1.46
altair processInactivityUpdates - 250000 normalcase 17.837 ms/op 27.344 ms/op 0.65
altair processInactivityUpdates - 250000 worstcase 17.555 ms/op 19.012 ms/op 0.92
phase0 processRegistryUpdates - 250000 normalcase 6.5970 us/op 11.139 us/op 0.59
phase0 processRegistryUpdates - 250000 badcase_full_deposits 273.57 us/op 441.92 us/op 0.62
phase0 processRegistryUpdates - 250000 worstcase 0.5 101.97 ms/op 140.86 ms/op 0.72
altair processRewardsAndPenalties - 250000 normalcase 25.994 ms/op 29.759 ms/op 0.87
altair processRewardsAndPenalties - 250000 worstcase 25.145 ms/op 39.912 ms/op 0.63
phase0 getAttestationDeltas - 250000 normalcase 15.498 ms/op 10.240 ms/op 1.51
phase0 getAttestationDeltas - 250000 worstcase 6.4444 ms/op 7.6891 ms/op 0.84
phase0 processSlashings - 250000 worstcase 91.606 us/op 123.09 us/op 0.74
altair processSyncCommitteeUpdates - 250000 11.607 ms/op 11.978 ms/op 0.97
BeaconState.hashTreeRoot - No change 226.00 ns/op 267.00 ns/op 0.85
BeaconState.hashTreeRoot - 1 full validator 90.366 us/op 96.077 us/op 0.94
BeaconState.hashTreeRoot - 32 full validator 870.94 us/op 1.3553 ms/op 0.64
BeaconState.hashTreeRoot - 512 full validator 11.368 ms/op 13.777 ms/op 0.83
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 109.56 us/op 157.21 us/op 0.70
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5760 ms/op 2.8024 ms/op 0.56
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 19.063 ms/op 28.934 ms/op 0.66
BeaconState.hashTreeRoot - 1 balances 70.373 us/op 95.554 us/op 0.74
BeaconState.hashTreeRoot - 32 balances 693.64 us/op 965.09 us/op 0.72
BeaconState.hashTreeRoot - 512 balances 7.8440 ms/op 7.7464 ms/op 1.01
BeaconState.hashTreeRoot - 250000 balances 146.92 ms/op 219.91 ms/op 0.67
aggregationBits - 2048 els - zipIndexesInBitList 21.755 us/op 23.677 us/op 0.92
byteArrayEquals 32 54.670 ns/op 63.841 ns/op 0.86
Buffer.compare 32 17.650 ns/op 20.088 ns/op 0.88
byteArrayEquals 1024 1.6276 us/op 1.7625 us/op 0.92
Buffer.compare 1024 25.514 ns/op 28.883 ns/op 0.88
byteArrayEquals 16384 25.916 us/op 28.104 us/op 0.92
Buffer.compare 16384 208.31 ns/op 228.41 ns/op 0.91
byteArrayEquals 123687377 195.17 ms/op 235.55 ms/op 0.83
Buffer.compare 123687377 7.1240 ms/op 6.8450 ms/op 1.04
byteArrayEquals 32 - diff last byte 53.044 ns/op 60.030 ns/op 0.88
Buffer.compare 32 - diff last byte 17.177 ns/op 19.928 ns/op 0.86
byteArrayEquals 1024 - diff last byte 1.6055 us/op 1.8809 us/op 0.85
Buffer.compare 1024 - diff last byte 25.099 ns/op 30.513 ns/op 0.82
byteArrayEquals 16384 - diff last byte 25.595 us/op 29.720 us/op 0.86
Buffer.compare 16384 - diff last byte 188.44 ns/op 239.66 ns/op 0.79
byteArrayEquals 123687377 - diff last byte 197.28 ms/op 229.05 ms/op 0.86
Buffer.compare 123687377 - diff last byte 7.9706 ms/op 6.3901 ms/op 1.25
byteArrayEquals 32 - random bytes 5.2680 ns/op 6.4640 ns/op 0.81
Buffer.compare 32 - random bytes 17.499 ns/op 22.189 ns/op 0.79
byteArrayEquals 1024 - random bytes 5.2410 ns/op 6.3540 ns/op 0.82
Buffer.compare 1024 - random bytes 18.374 ns/op 21.546 ns/op 0.85
byteArrayEquals 16384 - random bytes 5.2910 ns/op 6.2590 ns/op 0.85
Buffer.compare 16384 - random bytes 18.976 ns/op 21.406 ns/op 0.89
byteArrayEquals 123687377 - random bytes 6.6600 ns/op 7.5000 ns/op 0.89
Buffer.compare 123687377 - random bytes 18.930 ns/op 22.430 ns/op 0.84
regular array get 100000 times 33.623 us/op 47.177 us/op 0.71
wrappedArray get 100000 times 33.577 us/op 38.563 us/op 0.87
arrayWithProxy get 100000 times 13.790 ms/op 15.052 ms/op 0.92
ssz.Root.equals 48.923 ns/op 54.061 ns/op 0.90
byteArrayEquals 46.464 ns/op 54.427 ns/op 0.85
Buffer.compare 11.162 ns/op 12.513 ns/op 0.89
processSlot - 1 slots 10.553 us/op 12.498 us/op 0.84
processSlot - 32 slots 2.8637 ms/op 2.2908 ms/op 1.25
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.0039 ms/op 3.5462 ms/op 0.85
getCommitteeAssignments - req 1 vs - 250000 vc 2.2841 ms/op 2.8292 ms/op 0.81
getCommitteeAssignments - req 100 vs - 250000 vc 4.4166 ms/op 5.1674 ms/op 0.85
getCommitteeAssignments - req 1000 vs - 250000 vc 4.7191 ms/op 5.8432 ms/op 0.81
findModifiedValidators - 10000 modified validators 747.04 ms/op 818.14 ms/op 0.91
findModifiedValidators - 1000 modified validators 726.41 ms/op 735.28 ms/op 0.99
findModifiedValidators - 100 modified validators 294.56 ms/op 280.09 ms/op 1.05
findModifiedValidators - 10 modified validators 225.37 ms/op 280.56 ms/op 0.80
findModifiedValidators - 1 modified validators 177.61 ms/op 204.91 ms/op 0.87
findModifiedValidators - no difference 172.86 ms/op 170.65 ms/op 1.01
compare ViewDUs 6.1723 s/op 7.8326 s/op 0.79
compare each validator Uint8Array 1.3965 s/op 1.9587 s/op 0.71
compare ViewDU to Uint8Array 1.0127 s/op 1.5186 s/op 0.67
migrate state 1000000 validators, 24 modified, 0 new 791.60 ms/op 1.2334 s/op 0.64
migrate state 1000000 validators, 1700 modified, 1000 new 1.0675 s/op 1.9183 s/op 0.56
migrate state 1000000 validators, 3400 modified, 2000 new 1.2707 s/op 2.3833 s/op 0.53
migrate state 1500000 validators, 24 modified, 0 new 840.27 ms/op 1.7895 s/op 0.47
migrate state 1500000 validators, 1700 modified, 1000 new 1.0411 s/op 2.3762 s/op 0.44
migrate state 1500000 validators, 3400 modified, 2000 new 1.3087 s/op 3.2302 s/op 0.41
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.4200 ns/op 21.020 ns/op 0.21
state getBlockRootAtSlot - 250000 vs - 7PWei 636.07 ns/op 1.4400 us/op 0.44
naive computeProposerIndex 100000 validators 55.210 ms/op 181.21 ms/op 0.30
computeProposerIndex 100000 validators 1.7168 ms/op 4.6067 ms/op 0.37
naiveGetNextSyncCommitteeIndices 1000 validators 7.9585 s/op 23.981 s/op 0.33
getNextSyncCommitteeIndices 1000 validators 116.86 ms/op 348.90 ms/op 0.33
naiveGetNextSyncCommitteeIndices 10000 validators 7.8516 s/op 18.176 s/op 0.43
getNextSyncCommitteeIndices 10000 validators 126.83 ms/op 283.42 ms/op 0.45
naiveGetNextSyncCommitteeIndices 100000 validators 7.5867 s/op 28.737 s/op 0.26
getNextSyncCommitteeIndices 100000 validators 114.72 ms/op 287.38 ms/op 0.40
naive computeShuffledIndex 100000 validators 37.332 s/op 65.296 s/op 0.57
cached computeShuffledIndex 100000 validators 672.75 ms/op 1.5172 s/op 0.44
naive computeShuffledIndex 2000000 validators 491.84 s/op 523.56 s/op 0.94
cached computeShuffledIndex 2000000 validators 33.370 s/op 30.504 s/op 1.09
computeProposers - vc 250000 620.68 us/op 650.19 us/op 0.95
computeEpochShuffling - vc 250000 42.031 ms/op 43.284 ms/op 0.97
getNextSyncCommittee - vc 250000 10.439 ms/op 10.515 ms/op 0.99
computeSigningRoot for AttestationData 20.785 us/op 19.708 us/op 1.05
hash AttestationData serialized data then Buffer.toString(base64) 1.5686 us/op 1.6025 us/op 0.98
toHexString serialized data 1.1327 us/op 1.1309 us/op 1.00
Buffer.toString(base64) 143.35 ns/op 152.91 ns/op 0.94
nodejs block root to RootHex using toHex 149.29 ns/op 142.20 ns/op 1.05
nodejs block root to RootHex using toRootHex 84.006 ns/op 90.886 ns/op 0.92
browser block root to RootHex using the deprecated toHexString 209.27 ns/op 221.60 ns/op 0.94
browser block root to RootHex using toHex 167.79 ns/op 175.32 ns/op 0.96
browser block root to RootHex using toRootHex 158.10 ns/op 167.65 ns/op 0.94

by benchmarkbot/action

@codecov

codecov Bot commented Jun 21, 2025

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 12.12121% with 29 lines in your changes missing coverage. Please review.

Project coverage is 55.71%. Comparing base (899163f) to head (5a55959).
Report is 6 commits behind head on unstable.

Additional details and impacted files
@@             Coverage Diff              @@
##           unstable    #7988      +/-   ##
============================================
- Coverage     55.72%   55.71%   -0.01%     
============================================
  Files           834      834              
  Lines         59665    59679      +14     
  Branches       4610     4612       +2     
============================================
+ Hits          33246    33250       +4     
- Misses        26350    26360      +10     
  Partials         69       69              
🚀 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.

Comment thread packages/state-transition/src/util/fulu.ts Outdated
Comment thread packages/state-transition/src/epoch/processProposerLookahead.ts
Comment thread packages/state-transition/src/util/fulu.ts Outdated

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

as discussed, the last issue I found with this work is proposers not assigned for the 1st fulu epoch
we can simply call afterProcessEpoch after upgradeStateToFulu

@nflaig

nflaig commented Jul 24, 2025

Copy link
Copy Markdown
Member Author

as discussed, the last issue I found with this work is proposers not assigned for the 1st fulu epoch we can simply call afterProcessEpoch after upgradeStateToFulu

this is already the case irrespective of changes in this PR, I would address this separately

@nflaig nflaig merged commit fb26214 into unstable Jul 25, 2025
21 checks passed
@nflaig nflaig deleted the nflaig/fix-proposer-lookahead-to-unstable branch July 25, 2025 08:03
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.33.0 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants