Skip to content

feat: upgrade to v1.7.0-alpha.11 spec - #9541

Merged
ensi321 merged 8 commits into
unstablefrom
nflaig/alpha.11
Jun 26, 2026
Merged

feat: upgrade to v1.7.0-alpha.11 spec#9541
ensi321 merged 8 commits into
unstablefrom
nflaig/alpha.11

Conversation

@nflaig
nflaig requested a review from a team as a code owner June 21, 2026 09:54

@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 implements EIP-8282 (Builder deposits and exits) for the Gloas fork, extending ExecutionRequests with builder deposits and exits, updating serialization/deserialization logic, and adding corresponding block processing handlers. It also refactors voluntary exits to be validator-only post-Gloas. The review feedback highlights a critical bug where validator deposit appending logic was accidentally deleted in processDepositRequest.ts for Gloas, and points out a compilation error in types.ts due to missing imports of ForkName and ForkSeq.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/state-transition/src/block/processDepositRequest.ts
Comment thread packages/beacon-node/src/execution/engine/types.ts
@nflaig
nflaig marked this pull request as draft June 21, 2026 10:05
@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 27d85b7 Previous: e4ada6b Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.4177 ms/op 912.03 us/op 1.55
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 44.312 us/op 38.146 us/op 1.16
BLS verify - blst 764.41 us/op 630.16 us/op 1.21
BLS verifyMultipleSignatures 3 - blst 1.4237 ms/op 1.3041 ms/op 1.09
BLS verifyMultipleSignatures 8 - blst 2.2921 ms/op 2.0434 ms/op 1.12
BLS verifyMultipleSignatures 32 - blst 7.2400 ms/op 6.3080 ms/op 1.15
BLS verifyMultipleSignatures 64 - blst 14.351 ms/op 12.299 ms/op 1.17
BLS verifyMultipleSignatures 128 - blst 27.179 ms/op 24.058 ms/op 1.13
BLS deserializing 10000 signatures 648.77 ms/op 609.27 ms/op 1.06
BLS deserializing 100000 signatures 6.4389 s/op 5.9966 s/op 1.07
BLS verifyMultipleSignatures - same message - 3 - blst 785.26 us/op 739.29 us/op 1.06
BLS verifyMultipleSignatures - same message - 8 - blst 917.18 us/op 856.80 us/op 1.07
BLS verifyMultipleSignatures - same message - 32 - blst 1.5639 ms/op 1.4535 ms/op 1.08
BLS verifyMultipleSignatures - same message - 64 - blst 2.3060 ms/op 2.2416 ms/op 1.03
BLS verifyMultipleSignatures - same message - 128 - blst 4.0981 ms/op 3.8117 ms/op 1.08
BLS aggregatePubkeys 32 - blst 17.791 us/op 16.724 us/op 1.06
BLS aggregatePubkeys 128 - blst 63.493 us/op 59.872 us/op 1.06
getSlashingsAndExits - default max 61.465 us/op 44.691 us/op 1.38
getSlashingsAndExits - 2k 554.43 us/op 392.28 us/op 1.41
proposeBlockBody type=full, size=empty 740.74 us/op 815.97 us/op 0.91
isKnown best case - 1 super set check 354.00 ns/op 188.00 ns/op 1.88
isKnown normal case - 2 super set checks 172.00 ns/op 160.00 ns/op 1.07
isKnown worse case - 16 super set checks 168.00 ns/op 159.00 ns/op 1.06
validate api signedAggregateAndProof - struct 1.6138 ms/op 1.4516 ms/op 1.11
validate gossip signedAggregateAndProof - struct 1.6036 ms/op 1.4599 ms/op 1.10
batch validate gossip attestation - vc 640000 - chunk 32 115.99 us/op 103.16 us/op 1.12
batch validate gossip attestation - vc 640000 - chunk 64 101.24 us/op 91.327 us/op 1.11
batch validate gossip attestation - vc 640000 - chunk 128 96.441 us/op 86.946 us/op 1.11
batch validate gossip attestation - vc 640000 - chunk 256 94.460 us/op 82.700 us/op 1.14
bytes32 toHexString 300.00 ns/op 277.00 ns/op 1.08
bytes32 Buffer.toString(hex) 174.00 ns/op 164.00 ns/op 1.06
bytes32 Buffer.toString(hex) from Uint8Array 238.00 ns/op 232.00 ns/op 1.03
bytes32 Buffer.toString(hex) + 0x 171.00 ns/op 168.00 ns/op 1.02
Return object 10000 times 0.21620 ns/op 0.20610 ns/op 1.05
Throw Error 10000 times 3.5634 us/op 3.2492 us/op 1.10
toHex 96.687 ns/op 93.438 ns/op 1.03
Buffer.from 88.992 ns/op 83.294 ns/op 1.07
shared Buffer 58.052 ns/op 54.864 ns/op 1.06
fastMsgIdFn sha256 / 200 bytes 1.4810 us/op 1.4070 us/op 1.05
fastMsgIdFn h32 xxhash / 200 bytes 156.00 ns/op 145.00 ns/op 1.08
fastMsgIdFn h64 xxhash / 200 bytes 197.00 ns/op 194.00 ns/op 1.02
fastMsgIdFn sha256 / 1000 bytes 5.0280 us/op 4.4860 us/op 1.12
fastMsgIdFn h32 xxhash / 1000 bytes 249.00 ns/op 232.00 ns/op 1.07
fastMsgIdFn h64 xxhash / 1000 bytes 243.00 ns/op 235.00 ns/op 1.03
fastMsgIdFn sha256 / 10000 bytes 42.032 us/op 39.902 us/op 1.05
fastMsgIdFn h32 xxhash / 10000 bytes 1.2590 us/op 1.2030 us/op 1.05
fastMsgIdFn h64 xxhash / 10000 bytes 808.00 ns/op 776.00 ns/op 1.04
send data - 1000 256B messages 5.1461 ms/op 4.2108 ms/op 1.22
send data - 1000 512B messages 6.8384 ms/op 4.8890 ms/op 1.40
send data - 1000 1024B messages 6.5639 ms/op 5.3345 ms/op 1.23
send data - 1000 1200B messages 7.3091 ms/op 6.2929 ms/op 1.16
send data - 1000 2048B messages 13.769 ms/op 24.904 ms/op 0.55
send data - 1000 4096B messages 112.86 ms/op 61.807 ms/op 1.83
send data - 1000 16384B messages 422.55 ms/op 218.04 ms/op 1.94
send data - 1000 65536B messages 1.9257 s/op 967.05 ms/op 1.99
enrSubnets - fastDeserialize 64 bits 829.00 ns/op 728.00 ns/op 1.14
enrSubnets - ssz BitVector 64 bits 284.00 ns/op 249.00 ns/op 1.14
enrSubnets - fastDeserialize 4 bits 113.00 ns/op 96.000 ns/op 1.18
enrSubnets - ssz BitVector 4 bits 282.00 ns/op 255.00 ns/op 1.11
prioritizePeers score -10:0 att 32-0.1 sync 2-0 215.63 us/op 212.58 us/op 1.01
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 268.08 us/op 239.10 us/op 1.12
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 379.18 us/op 343.08 us/op 1.11
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 645.27 us/op 606.80 us/op 1.06
prioritizePeers score 0:0 att 64-1 sync 4-1 781.53 us/op 710.08 us/op 1.10
array of 16000 items push then shift 1.3505 us/op 1.2308 us/op 1.10
LinkedList of 16000 items push then shift 8.9040 ns/op 7.6980 ns/op 1.16
array of 16000 items push then pop 77.537 ns/op 72.972 ns/op 1.06
LinkedList of 16000 items push then pop 6.8170 ns/op 5.9410 ns/op 1.15
array of 24000 items push then shift 2.0074 us/op 1.8424 us/op 1.09
LinkedList of 24000 items push then shift 8.4820 ns/op 7.4750 ns/op 1.13
array of 24000 items push then pop 105.89 ns/op 102.90 ns/op 1.03
LinkedList of 24000 items push then pop 6.5530 ns/op 5.9580 ns/op 1.10
intersect bitArray bitLen 8 5.0270 ns/op 4.6040 ns/op 1.09
intersect array and set length 8 31.857 ns/op 28.595 ns/op 1.11
intersect bitArray bitLen 128 25.612 ns/op 23.565 ns/op 1.09
intersect array and set length 128 548.55 ns/op 485.43 ns/op 1.13
bitArray.getTrueBitIndexes() bitLen 128 1.1310 us/op 1.0370 us/op 1.09
bitArray.getTrueBitIndexes() bitLen 248 1.9370 us/op 1.7100 us/op 1.13
bitArray.getTrueBitIndexes() bitLen 512 4.0840 us/op 3.5150 us/op 1.16
Full columns - reconstruct all 6 blobs 157.78 us/op 112.50 us/op 1.40
Full columns - reconstruct half of the blobs out of 6 84.782 us/op 94.632 us/op 0.90
Full columns - reconstruct single blob out of 6 37.973 us/op 32.527 us/op 1.17
Half columns - reconstruct all 6 blobs 407.02 ms/op 375.95 ms/op 1.08
Half columns - reconstruct half of the blobs out of 6 208.12 ms/op 188.12 ms/op 1.11
Half columns - reconstruct single blob out of 6 74.915 ms/op 69.040 ms/op 1.09
Set add up to 64 items then delete first 1.6159 us/op 1.5617 us/op 1.03
OrderedSet add up to 64 items then delete first 2.5330 us/op 2.4171 us/op 1.05
Set add up to 64 items then delete last 1.8580 us/op 1.7876 us/op 1.04
OrderedSet add up to 64 items then delete last 2.9105 us/op 3.1057 us/op 0.94
Set add up to 64 items then delete middle 1.9605 us/op 2.1921 us/op 0.89
OrderedSet add up to 64 items then delete middle 4.4730 us/op 4.7546 us/op 0.94
Set add up to 128 items then delete first 3.7790 us/op 3.8911 us/op 0.97
OrderedSet add up to 128 items then delete first 5.5397 us/op 6.3044 us/op 0.88
Set add up to 128 items then delete last 3.7059 us/op 3.8713 us/op 0.96
OrderedSet add up to 128 items then delete last 6.2388 us/op 5.2637 us/op 1.19
Set add up to 128 items then delete middle 3.7024 us/op 3.5143 us/op 1.05
OrderedSet add up to 128 items then delete middle 11.781 us/op 10.983 us/op 1.07
Set add up to 256 items then delete first 7.3061 us/op 7.2124 us/op 1.01
OrderedSet add up to 256 items then delete first 12.410 us/op 12.032 us/op 1.03
Set add up to 256 items then delete last 7.9445 us/op 6.8646 us/op 1.16
OrderedSet add up to 256 items then delete last 12.460 us/op 11.307 us/op 1.10
Set add up to 256 items then delete middle 7.3013 us/op 6.8483 us/op 1.07
OrderedSet add up to 256 items then delete middle 36.408 us/op 34.150 us/op 1.07
runFastConfirmationRules vc:100000 bc:96 eq:0 4.2940 us/op 2.4080 us/op 1.78
runFastConfirmationRules vc:600000 bc:96 eq:0 4.5040 us/op 2.1830 us/op 2.06
runFastConfirmationRules vc:1000000 bc:96 eq:0 4.4850 us/op 2.1240 us/op 2.11
runFastConfirmationRules vc:600000 bc:320 eq:0 8.8330 us/op 5.7220 us/op 1.54
runFastConfirmationRules vc:600000 bc:1200 eq:0 38.375 us/op 17.662 us/op 2.17
runFastConfirmationRules vc:600000 bc:96 eq:1000 4.0910 us/op 2.0080 us/op 2.04
runFastConfirmationRules vc:600000 bc:96 eq:10000 4.2390 us/op 2.1900 us/op 1.94
runFastConfirmationRules vc:600000 bc:96 eq:300000 4.2270 us/op 2.1790 us/op 1.94
pass gossip attestations to forkchoice per slot 2.7355 ms/op 2.4972 ms/op 1.10
forkChoice updateHead vc 100000 bc 64 eq 0 408.18 us/op 392.69 us/op 1.04
forkChoice updateHead vc 600000 bc 64 eq 0 2.4333 ms/op 2.3936 ms/op 1.02
forkChoice updateHead vc 1000000 bc 64 eq 0 4.8353 ms/op 3.9980 ms/op 1.21
forkChoice updateHead vc 600000 bc 320 eq 0 2.4777 ms/op 2.3975 ms/op 1.03
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5696 ms/op 2.5474 ms/op 1.01
forkChoice updateHead vc 600000 bc 7200 eq 0 3.5615 ms/op 3.3341 ms/op 1.07
forkChoice updateHead vc 600000 bc 64 eq 1000 2.4575 ms/op 2.3648 ms/op 1.04
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5547 ms/op 2.4708 ms/op 1.03
forkChoice updateHead vc 600000 bc 64 eq 300000 6.9521 ms/op 6.7121 ms/op 1.04
computeDeltas 1400000 validators 0% inactive 12.518 ms/op 12.207 ms/op 1.03
computeDeltas 1400000 validators 10% inactive 11.661 ms/op 11.470 ms/op 1.02
computeDeltas 1400000 validators 20% inactive 10.594 ms/op 10.456 ms/op 1.01
computeDeltas 1400000 validators 50% inactive 8.2191 ms/op 8.0311 ms/op 1.02
computeDeltas 2100000 validators 0% inactive 18.545 ms/op 18.384 ms/op 1.01
computeDeltas 2100000 validators 10% inactive 17.578 ms/op 17.059 ms/op 1.03
computeDeltas 2100000 validators 20% inactive 15.822 ms/op 15.839 ms/op 1.00
computeDeltas 2100000 validators 50% inactive 9.2092 ms/op 9.1560 ms/op 1.01
altair processAttestation - 250000 vs - 7PWei normalcase 2.6681 ms/op 2.5170 ms/op 1.06
altair processAttestation - 250000 vs - 7PWei worstcase 3.9909 ms/op 3.1744 ms/op 1.26
altair processAttestation - setStatus - 1/6 committees join 114.09 us/op 107.54 us/op 1.06
altair processAttestation - setStatus - 1/3 committees join 225.90 us/op 197.40 us/op 1.14
altair processAttestation - setStatus - 1/2 committees join 297.88 us/op 285.97 us/op 1.04
altair processAttestation - setStatus - 2/3 committees join 406.89 us/op 360.62 us/op 1.13
altair processAttestation - setStatus - 4/5 committees join 561.08 us/op 523.34 us/op 1.07
altair processAttestation - setStatus - 100% committees join 645.18 us/op 595.86 us/op 1.08
altair processBlock - 250000 vs - 7PWei normalcase 4.7321 ms/op 4.7177 ms/op 1.00
altair processBlock - 250000 vs - 7PWei normalcase hashState 14.963 ms/op 16.022 ms/op 0.93
altair processBlock - 250000 vs - 7PWei worstcase 25.193 ms/op 21.910 ms/op 1.15
altair processBlock - 250000 vs - 7PWei worstcase hashState 50.319 ms/op 45.117 ms/op 1.12
phase0 processBlock - 250000 vs - 7PWei normalcase 1.6694 ms/op 1.4919 ms/op 1.12
phase0 processBlock - 250000 vs - 7PWei worstcase 19.175 ms/op 19.081 ms/op 1.00
altair processEth1Data - 250000 vs - 7PWei normalcase 308.82 us/op 286.75 us/op 1.08
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 7.9310 us/op 6.4010 us/op 1.24
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 22.459 us/op 23.180 us/op 0.97
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 8.1880 us/op 8.3330 us/op 0.98
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 7.8820 us/op 4.6620 us/op 1.69
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 101.90 us/op 92.750 us/op 1.10
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.5421 ms/op 1.4269 ms/op 1.08
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.0914 ms/op 2.0776 ms/op 1.01
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.9321 ms/op 1.9817 ms/op 0.97
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.7213 ms/op 4.8257 ms/op 0.98
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.5146 ms/op 2.2875 ms/op 1.10
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 6.3355 ms/op 5.4378 ms/op 1.17
Tree 40 250000 create 444.21 ms/op 411.03 ms/op 1.08
Tree 40 250000 get(125000) 99.015 ns/op 91.239 ns/op 1.09
Tree 40 250000 set(125000) 1.1350 us/op 1.2239 us/op 0.93
Tree 40 250000 toArray() 23.810 ms/op 20.622 ms/op 1.15
Tree 40 250000 iterate all - toArray() + loop 21.022 ms/op 19.987 ms/op 1.05
Tree 40 250000 iterate all - get(i) 43.651 ms/op 41.073 ms/op 1.06
Array 250000 create 2.6499 ms/op 2.3291 ms/op 1.14
Array 250000 clone - spread 783.59 us/op 703.16 us/op 1.11
Array 250000 get(125000) 0.31100 ns/op 0.28600 ns/op 1.09
Array 250000 set(125000) 0.31300 ns/op 0.28500 ns/op 1.10
Array 250000 iterate all - loop 60.831 us/op 55.642 us/op 1.09
phase0 afterProcessEpoch - 250000 vs - 7PWei 65.747 ms/op 39.404 ms/op 1.67
Array.fill - length 1000000 2.6689 ms/op 2.9280 ms/op 0.91
Array push - length 1000000 11.672 ms/op 10.738 ms/op 1.09
Array.get 0.20647 ns/op 0.20262 ns/op 1.02
Uint8Array.get 0.23079 ns/op 0.23586 ns/op 0.98
phase0 beforeProcessEpoch - 250000 vs - 7PWei 24.826 ms/op 15.278 ms/op 1.62
altair processEpoch - mainnet_e81889 467.74 ms/op 316.09 ms/op 1.48
mainnet_e81889 - altair beforeProcessEpoch 38.279 ms/op 26.660 ms/op 1.44
mainnet_e81889 - altair processJustificationAndFinalization 12.250 us/op 6.9270 us/op 1.77
mainnet_e81889 - altair processInactivityUpdates 7.7535 ms/op 7.6550 ms/op 1.01
mainnet_e81889 - altair processRewardsAndPenalties 23.979 ms/op 24.050 ms/op 1.00
mainnet_e81889 - altair processRegistryUpdates 625.00 ns/op 564.00 ns/op 1.11
mainnet_e81889 - altair processSlashings 167.00 ns/op 131.00 ns/op 1.27
mainnet_e81889 - altair processEth1DataReset 133.00 ns/op 125.00 ns/op 1.06
mainnet_e81889 - altair processEffectiveBalanceUpdates 7.5068 ms/op 7.7112 ms/op 0.97
mainnet_e81889 - altair processSlashingsReset 771.00 ns/op 689.00 ns/op 1.12
mainnet_e81889 - altair processRandaoMixesReset 1.8370 us/op 1.4080 us/op 1.30
mainnet_e81889 - altair processHistoricalRootsUpdate 131.00 ns/op 122.00 ns/op 1.07
mainnet_e81889 - altair processParticipationFlagUpdates 463.00 ns/op 431.00 ns/op 1.07
mainnet_e81889 - altair processSyncCommitteeUpdates 110.00 ns/op 102.00 ns/op 1.08
mainnet_e81889 - altair afterProcessEpoch 45.095 ms/op 40.868 ms/op 1.10
capella processEpoch - mainnet_e217614 1.1515 s/op 875.95 ms/op 1.31
mainnet_e217614 - capella beforeProcessEpoch 74.003 ms/op 69.551 ms/op 1.06
mainnet_e217614 - capella processJustificationAndFinalization 34.562 ms/op 6.4760 us/op 5336.86
mainnet_e217614 - capella processInactivityUpdates 20.436 ms/op 15.460 ms/op 1.32
mainnet_e217614 - capella processRewardsAndPenalties 107.02 ms/op 95.866 ms/op 1.12
mainnet_e217614 - capella processRegistryUpdates 4.7690 us/op 4.3460 us/op 1.10
mainnet_e217614 - capella processSlashings 142.00 ns/op 124.00 ns/op 1.15
mainnet_e217614 - capella processEth1DataReset 136.00 ns/op 123.00 ns/op 1.11
mainnet_e217614 - capella processEffectiveBalanceUpdates 17.578 ms/op 17.926 ms/op 0.98
mainnet_e217614 - capella processSlashingsReset 693.00 ns/op 657.00 ns/op 1.05
mainnet_e217614 - capella processRandaoMixesReset 1.5570 us/op 1.3900 us/op 1.12
mainnet_e217614 - capella processHistoricalRootsUpdate 132.00 ns/op 123.00 ns/op 1.07
mainnet_e217614 - capella processParticipationFlagUpdates 441.00 ns/op 437.00 ns/op 1.01
mainnet_e217614 - capella afterProcessEpoch 110.47 ms/op 103.27 ms/op 1.07
phase0 processEpoch - mainnet_e58758 421.99 ms/op 334.38 ms/op 1.26
mainnet_e58758 - phase0 beforeProcessEpoch 88.427 ms/op 70.789 ms/op 1.25
mainnet_e58758 - phase0 processJustificationAndFinalization 9.8320 us/op 6.4450 us/op 1.53
mainnet_e58758 - phase0 processRewardsAndPenalties 17.839 ms/op 16.807 ms/op 1.06
mainnet_e58758 - phase0 processRegistryUpdates 2.4160 us/op 2.1980 us/op 1.10
mainnet_e58758 - phase0 processSlashings 143.00 ns/op 125.00 ns/op 1.14
mainnet_e58758 - phase0 processEth1DataReset 133.00 ns/op 121.00 ns/op 1.10
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 827.43 us/op 790.13 us/op 1.05
mainnet_e58758 - phase0 processSlashingsReset 1.1010 us/op 874.00 ns/op 1.26
mainnet_e58758 - phase0 processRandaoMixesReset 1.8660 us/op 1.3490 us/op 1.38
mainnet_e58758 - phase0 processHistoricalRootsUpdate 136.00 ns/op 129.00 ns/op 1.05
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.6540 us/op 1.1960 us/op 1.38
mainnet_e58758 - phase0 afterProcessEpoch 36.552 ms/op 33.452 ms/op 1.09
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.4441 ms/op 991.21 us/op 1.46
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 2.8877 ms/op 1.5681 ms/op 1.84
altair processInactivityUpdates - 250000 normalcase 13.791 ms/op 13.004 ms/op 1.06
altair processInactivityUpdates - 250000 worstcase 13.276 ms/op 14.615 ms/op 0.91
phase0 processRegistryUpdates - 250000 normalcase 2.3430 us/op 3.4030 us/op 0.69
phase0 processRegistryUpdates - 250000 badcase_full_deposits 155.06 us/op 131.85 us/op 1.18
phase0 processRegistryUpdates - 250000 worstcase 0.5 73.108 ms/op 60.495 ms/op 1.21
altair processRewardsAndPenalties - 250000 normalcase 19.615 ms/op 16.075 ms/op 1.22
altair processRewardsAndPenalties - 250000 worstcase 19.168 ms/op 15.746 ms/op 1.22
phase0 getAttestationDeltas - 250000 normalcase 5.7849 ms/op 5.0452 ms/op 1.15
phase0 getAttestationDeltas - 250000 worstcase 5.9369 ms/op 5.1477 ms/op 1.15
phase0 processSlashings - 250000 worstcase 70.222 us/op 57.198 us/op 1.23
altair processSyncCommitteeUpdates - 250000 12.307 ms/op 9.8585 ms/op 1.25
BeaconState.hashTreeRoot - No change 189.00 ns/op 153.00 ns/op 1.24
BeaconState.hashTreeRoot - 1 full validator 94.394 us/op 73.423 us/op 1.29
BeaconState.hashTreeRoot - 32 full validator 1.2225 ms/op 808.79 us/op 1.51
BeaconState.hashTreeRoot - 512 full validator 10.459 ms/op 7.5049 ms/op 1.39
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 150.63 us/op 87.425 us/op 1.72
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 2.6958 ms/op 1.3488 ms/op 2.00
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 33.515 ms/op 15.485 ms/op 2.16
BeaconState.hashTreeRoot - 1 balances 209.38 us/op 70.453 us/op 2.97
BeaconState.hashTreeRoot - 32 balances 1.2945 ms/op 672.84 us/op 1.92
BeaconState.hashTreeRoot - 512 balances 6.6763 ms/op 5.8475 ms/op 1.14
BeaconState.hashTreeRoot - 250000 balances 165.71 ms/op 126.58 ms/op 1.31
aggregationBits - 2048 els - zipIndexesInBitList 21.813 us/op 18.752 us/op 1.16
regular array get 100000 times 24.294 us/op 22.013 us/op 1.10
wrappedArray get 100000 times 24.368 us/op 21.873 us/op 1.11
arrayWithProxy get 100000 times 10.644 ms/op 9.4441 ms/op 1.13
ssz.Root.equals 22.664 ns/op 20.361 ns/op 1.11
byteArrayEquals 22.421 ns/op 20.354 ns/op 1.10
Buffer.compare 9.3330 ns/op 8.4030 ns/op 1.11
processSlot - 1 slots 10.257 us/op 10.490 us/op 0.98
processSlot - 32 slots 3.1605 ms/op 2.0687 ms/op 1.53
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 7.8583 ms/op 3.6504 ms/op 2.15
getCommitteeAssignments - req 1 vs - 250000 vc 1.7489 ms/op 1.5952 ms/op 1.10
getCommitteeAssignments - req 100 vs - 250000 vc 3.5605 ms/op 3.2795 ms/op 1.09
getCommitteeAssignments - req 1000 vs - 250000 vc 3.8489 ms/op 3.5353 ms/op 1.09
findModifiedValidators - 10000 modified validators 933.74 ms/op 862.37 ms/op 1.08
findModifiedValidators - 1000 modified validators 609.31 ms/op 489.38 ms/op 1.25
findModifiedValidators - 100 modified validators 337.29 ms/op 336.51 ms/op 1.00
findModifiedValidators - 10 modified validators 311.14 ms/op 251.32 ms/op 1.24
findModifiedValidators - 1 modified validators 282.32 ms/op 163.32 ms/op 1.73
findModifiedValidators - no difference 180.15 ms/op 176.15 ms/op 1.02
migrate state 1500000 validators, 3400 modified, 2000 new 4.1308 s/op 2.8412 s/op 1.45
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.9200 ns/op 3.6500 ns/op 1.07
state getBlockRootAtSlot - 250000 vs - 7PWei 405.29 ns/op 371.23 ns/op 1.09
computeProposerIndex 100000 validators 1.4003 ms/op 1.3024 ms/op 1.08
getNextSyncCommitteeIndices 1000 validators 3.0174 ms/op 2.7952 ms/op 1.08
getNextSyncCommitteeIndices 10000 validators 26.553 ms/op 24.450 ms/op 1.09
getNextSyncCommitteeIndices 100000 validators 93.310 ms/op 80.840 ms/op 1.15
computeProposers - vc 250000 564.61 us/op 532.33 us/op 1.06
computeEpochShuffling - vc 250000 40.650 ms/op 38.849 ms/op 1.05
getNextSyncCommittee - vc 250000 11.006 ms/op 9.0848 ms/op 1.21
nodejs block root to RootHex using toHex 102.24 ns/op 90.992 ns/op 1.12
nodejs block root to RootHex using toRootHex 65.005 ns/op 71.137 ns/op 0.91
nodejs fromHex(blob) 1.0426 ms/op 802.14 us/op 1.30
nodejs fromHexInto(blob) 674.98 us/op 601.09 us/op 1.12
nodejs block root to RootHex using the deprecated toHexString 560.81 ns/op 443.32 ns/op 1.27
nodejs byteArrayEquals 32 bytes (block root) 27.734 ns/op 25.020 ns/op 1.11
nodejs byteArrayEquals 48 bytes (pubkey) 40.105 ns/op 36.201 ns/op 1.11
nodejs byteArrayEquals 96 bytes (signature) 36.257 ns/op 32.999 ns/op 1.10
nodejs byteArrayEquals 1024 bytes 43.289 ns/op 38.728 ns/op 1.12
nodejs byteArrayEquals 131072 bytes (blob) 1.8389 us/op 1.7697 us/op 1.04
browser block root to RootHex using toHex 150.37 ns/op 137.69 ns/op 1.09
browser block root to RootHex using toRootHex 136.66 ns/op 126.07 ns/op 1.08
browser fromHex(blob) 1.8136 ms/op 1.5863 ms/op 1.14
browser fromHexInto(blob) 604.29 us/op 605.26 us/op 1.00
browser block root to RootHex using the deprecated toHexString 328.01 ns/op 349.56 ns/op 0.94
browser byteArrayEquals 32 bytes (block root) 26.854 ns/op 27.137 ns/op 0.99
browser byteArrayEquals 48 bytes (pubkey) 37.814 ns/op 38.102 ns/op 0.99
browser byteArrayEquals 96 bytes (signature) 70.098 ns/op 71.290 ns/op 0.98
browser byteArrayEquals 1024 bytes 729.03 ns/op 737.53 ns/op 0.99
browser byteArrayEquals 131072 bytes (blob) 91.625 us/op 92.551 us/op 0.99

by benchmarkbot/action

@ensi321 ensi321 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 to remove all references to the builder voluntary exit mechanism that is now removed. Eg. remove getBuilderVoluntaryExitSignatureSet and merge getVoluntaryExitsSignatureSets and getVoluntaryExitSignatureSet into one.

Could be a future refactoring opportunity

@nflaig

nflaig commented Jun 23, 2026

Copy link
Copy Markdown
Member Author

We need to remove all references to the builder voluntary exit mechanism that is now removed. Eg. remove getBuilderVoluntaryExitSignatureSet and merge getVoluntaryExitsSignatureSets and getVoluntaryExitSignatureSet into one.

Could be a future refactoring opportunity

yes there is more stuff we might wanna clean up, eg. there is no need to validate pending deposits anymore so we can probably remove the cache or at least keep it only for the fork transition, this branch still needs to be cleaned up carefully

@ensi321
ensi321 marked this pull request as ready for review June 26, 2026 05:34
@ensi321

ensi321 commented Jun 26, 2026

Copy link
Copy Markdown
Member

@lodekeeper review plz

@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: 92e099ad51

ℹ️ 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 thread packages/beacon-node/src/execution/engine/mock.ts Outdated
@lodekeeper

Copy link
Copy Markdown
Contributor

@ensi321 reviewed 👍 — focused on the EIP-8282 core + the flagged findings (not an exhaustive pass over all 45 files, and I see it's still WIP per @nflaig's note).

Both Gemini "blocking" findings are already resolved on current HEAD (flagged on an earlier commit):

  • processDepositRequest.ts — the Gloas deposit append is present, unified into the unconditional pendingDeposits.push; the Electra-only start-index is gated by fork === ForkSeq.electra. Not missing.
  • types.tsForkName/ForkSeq are imported (L10-11). No compile error.

New builder-request processors look correct & spec-aligned:

  • processBuilderDepositRequest — PoP-gated register for a new builder, balance top-up + withdrawable-epoch reset for an existing one; credential split ([0] prefix / subarray(12) exec address) is right.
  • processBuilderExitRequest — source-address (not BLS) authorization mirroring EIP-7002, drops on missing/inactive/address-mismatch/pending-withdrawal. The isActiveBuilder(builder, state.finalizedCheckpoint.epoch) gate is intentional (a builder is active only once its deposit is finalized) and consistent across all 3 call sites (bid validation + bid processing + this).

On your cleanup point (builder voluntary exit refs): agreed — getBuilderVoluntaryExitSignatureSet is still present (voluntaryExits.ts:72, dispatched from getVoluntaryExitSignatureSet L40); merging it into the single voluntary-exit path is a clean follow-up. Tracking it as the future refactor you flagged, alongside @nflaig's noted cleanup (drop/limit the pending-deposit validation cache now that those aren't validated). Given the branch still needs that work, no objection from me on the EIP-8282 core I checked.

@ensi321

ensi321 commented Jun 26, 2026

Copy link
Copy Markdown
Member

@lodekeeper no you need to review the entire PR, which covers all alpha.11 changes. This PR is ready for review. Clean ups will be done in a follow up PR

@ensi321
ensi321 enabled auto-merge (squash) June 26, 2026 06:17

@ensi321 ensi321 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

@ensi321
ensi321 merged commit 551b8b0 into unstable Jun 26, 2026
19 checks passed
@ensi321
ensi321 deleted the nflaig/alpha.11 branch June 26, 2026 06:17
@lodekeeper

Copy link
Copy Markdown
Contributor

@ensi321 done — full review of all 45 alpha.11 files (reviewed at HEAD 92e099ad), covering specrefs/params, SSZ types, state-transition, execution-engine + chain, and tests.

Verdict: solid, spec-faithful alpha.11 upgrade. No blocking correctness issues beyond the one already flagged (the mock.ts Gloas TypeError, r3479389415). The rest are cosmetic / cleanup / test-redundancy.

Clean (cross-checked against consensus-specs v1.7.0-alpha.11)

  • SSZ containersBuilderDepositRequest, BuilderExitRequest, the extended ExecutionRequests (deposits/withdrawals/consolidations/builderDeposits/builderExits, in that order), and BuilderPendingPayment (+proposerIndex) all match field names/order/types/limits.
  • Constants/presetsBUILDER_DEPOSIT_REQUEST_TYPE=0x03, BUILDER_EXIT_REQUEST_TYPE=0x04, DOMAIN_BUILDER_DEPOSIT=0x0E000000, PAYLOAD_BUILDER_VERSION=0, MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD=256, MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD=16; spec-tests pinned to alpha.11.
  • State-transitionprocess_block op ordering; processExecutionPayloadBid (new version == PAYLOAD_BUILDER_VERSION check, proposerIndex on BuilderPendingPayment, DOMAIN_BEACON_BUILDER); processParentExecutionPayload (apply order incl. builder_deposits/builder_exits; assertEmptyExecutionRequests now covers the builder fields; root via ssz.gloas); processProposerSlashing (clears builderPendingPayments[idx] only when proposerIndex matches); processDepositRequest simplification; upgradeStateToGloas (all new fields initialized); util/gloas.ts helpers (registry reuse, deposit-signature domain, gas-limit calc).
  • Execution-engine/chain — serialize/deserialize round-trip is symmetric and fork-gated (builder fields only >= gloas; pre-gloas 0x03/0x04 rejected); executionPayloadBid validation (new INVALID_BUILDER_VERSION REJECT, correct placement); envelope validation; produceBlockBody electra→gloas migration.

Low / non-blocking

  1. Leftover builder voluntary-exit code (signatureSets/voluntaryExits.ts:36-41,72-92) — getVoluntaryExitSignatureSet still dispatches to getBuilderVoluntaryExitSignatureSet, reachable via batch sig verification (getVoluntaryExitsSignatureSets). It's effectively dead/divergent now (the op processor rejects builder indices), but this is exactly the cleanup you flagged in your review — confirmed real. Good for the follow-up.
  2. Cosmetic — stale spec doc-comment v1.7.0-alpha.6 → should be alpha.11 in verifyExecutionPayloadEnvelope.ts (L23, L117).
  3. CosmeticprocessExecutionPayloadBid runs the blob_kzg_commitments <= max assert last vs the spec's order; all hard throws, no state-transition impact.
  4. Test-onlytest/unit/execution/engine/types.test.ts:90 parses the hex type-byte with Number(...); works for 0x03/0x04 but would silently break for any type byte ≥ 0x0aparseInt(_, 16) is safer.
  5. Test coverage (CI vectors already cover these; unit-level redundancy only)addBuilderToRegistry exited-slot-reuse branch and the "already-exited builder" exit-drop path aren't exercised by the new unit tests; the alpha.11 spec vectors do cover them once CI fetches the pinned version.

Info (pre-existing, out of scope)

  • http.ts maps gloas getPayloadengine_getPayloadV6 but notifyNewPayloadengine_newPayloadV5. This V5/V6 asymmetry already exists on unstable, so not from this PR — just worth a glance that the ePBS engine-API pairing is intended.

Plus the already-resolved items for the record: Gemini's two "blocking" findings were false positives on an earlier commit (replied r3479378162 / r3479378249), and the codex mock.ts Gloas TypeError is valid with a fork-aware fix (r3479389415).

Nothing here blocks from my side — the voluntary-exit and pending-deposit-cache cleanups are fine as the follow-up you described. Nice work. 👍

nflaig pushed a commit to ChainSafe/lodestar-z that referenced this pull request Jun 27, 2026
Bumps the consensus spec tests from `v1.7.0-alpha.10` to
`v1.7.0-alpha.11`.

Closes #443.

### Changes
- `build.zig.zon`: bump `spec_test_version` default to `v1.7.0-alpha.11`
- `test/spec/version.txt`: updated version (changed by the spec-test
download step, not hand edited)

### Notes
- Unblocked by ChainSafe/lodestar#9541 (alpha.11 spec upgrade), now
merged — lodestar and lodestar-z are aligned on the same spec test
version.
- All spec tests pass locally against alpha.11.
- The pre-gloas spec refactors @ensi321 flagged in [#441
(comment)](#441 (review))
don't surface as test failures. Leaving those alignments as a separate
follow-up rather than folding them into this bump though I can also fold
them in here if needed.
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.44.0 🎉

nflaig added a commit that referenced this pull request Jul 7, 2026
`protoArray.isDescendant` was missing the gloas `is_ancestor PENDING`
short-circuit, causing the FCR to undercount attestation support.

Depends on #9541

Closes #9539

---------

Co-authored-by: Nazar Hussain <nazarhussain@gmail.com>
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.

4 participants