Skip to content

feat: upgrade to v1.7.0-alpha.8 spec#9383

Merged
wemeetagain merged 4 commits into
unstablefrom
te/v1.7.0_alpha.8
May 20, 2026
Merged

feat: upgrade to v1.7.0-alpha.8 spec#9383
wemeetagain merged 4 commits into
unstablefrom
te/v1.7.0_alpha.8

Conversation

@twoeths

@twoeths twoeths commented May 19, 2026

Copy link
Copy Markdown
Member

Motivation

Upgrade Lodestar to the v1.7.0-alpha.8 following #9375

What's changed since #9375

Detailed Description

  • Bump spec-tests-version.json to v1.7.0-alpha.8 and apply the matching specrefs/* updates.
  • Config: MIN_BUILDER_WITHDRAWABILITY_DELAY 64 → 8192; add PAYLOAD_DUE_BPS (mainnet/minimal/types + validator critical params).
  • Add Gloas targetGasLimit to PayloadAttributes (SSZ, execution-engine PayloadAttributes/RPC + serialize/deserialize).
  • Rename ProposerPreferences.gasLimit → targetGasLimit (alpha.8) and update the unstable-only consumers not present on the feat: upgrade to alpha.8 spec #9375 branch: validatorStore.signProposerPreferences, gossip validateExecutionPayloadBid, and test/event fixtures. The gossip bid-validation rule keeps strict equality (rename only); is_gas_limit_target_compatible is a separate follow-up.
  • upgradeStateToGloas: set latestExecutionPayloadBid.gasLimit from the Fulu header and bump the spec-comment URL. The existing onboardBuildersFromPendingDeposits is already spec-equivalent and is left as-is; the previously-skipped fork_invalid_validator_deposit_followed_by_builder_credentials spec test is re-enabled and passes.
  • produceBlockBody: resolve the Gloas payload-attributes targetGasLimit from the ProposerPreferencesPool (same (slot, dependent_root) lookup as bid validation), falling back to the parent payload gas limit when no preferences are pooled. Addresses the feat: upgrade to alpha.8 spec #9375 review note that the builder-registration source was incorrect.
  • Add getPayloadDueMs() to forkConfig (spec get_payload_due_ms, PAYLOAD_DUE_BPS) and gate producePayloadAttestationData's payloadPresent on the execution payload envelope being seen before that deadline (uses the envelope's own arrival time). Addresses the feat: upgrade to alpha.8 spec #9375 review note about using PAYLOAD_DUE_BPS instead of PAYLOAD_ATTESTATION_DUE_BPS.
  • Skip the new gloas/fork_choice/on_payload_attestation_message spec suite (PTC fork choice not yet implemented).

AI Assistance Disclosure

Used Claude Code to port and adapt the changes, address the PR review comments, and run verification.

🤖 Generated with Claude Code

@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 updates the codebase to align with the Ethereum consensus spec v1.7.0-alpha.8. Key changes include renaming gas_limit to target_gas_limit across several components (ProposerPreferences, PayloadAttributes, and validator services) and implementing logic to resolve the proposer's target gas limit during block production. Additionally, it updates the payload_present flag logic to check envelope arrival times against a new getPayloadDueMs configuration and increases the MIN_BUILDER_WITHDRAWABILITY_DELAY constant. A significant portion of the PR also involves updating spec references and test data to match the new alpha.8 version. One critical issue was identified: the isStatePostGloas type guard is used in produceBlockBody.ts but is missing from the imports, which will lead to a compilation error.

Comment thread packages/beacon-node/src/chain/produceBlock/produceBlockBody.ts
@github-actions

github-actions Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

⚠️ Performance Alert ⚠️

Possible performance regression was detected for some benchmarks.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold.

Benchmark suite Current: 37bdc0c Previous: c5efeb6 Ratio
proposeBlockBody type=full, size=empty 3.8491 ms/op 988.33 us/op 3.89
Full benchmark results
Benchmark suite Current: 37bdc0c Previous: c5efeb6 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 965.21 us/op 1.1200 ms/op 0.86
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 39.854 us/op 37.720 us/op 1.06
BLS verify - blst 645.07 us/op 728.03 us/op 0.89
BLS verifyMultipleSignatures 3 - blst 1.3291 ms/op 1.3458 ms/op 0.99
BLS verifyMultipleSignatures 8 - blst 2.0959 ms/op 2.1503 ms/op 0.97
BLS verifyMultipleSignatures 32 - blst 6.5205 ms/op 6.8729 ms/op 0.95
BLS verifyMultipleSignatures 64 - blst 12.752 ms/op 13.281 ms/op 0.96
BLS verifyMultipleSignatures 128 - blst 25.790 ms/op 26.143 ms/op 0.99
BLS deserializing 10000 signatures 627.15 ms/op 605.21 ms/op 1.04
BLS deserializing 100000 signatures 6.1043 s/op 6.1346 s/op 1.00
BLS verifyMultipleSignatures - same message - 3 - blst 670.52 us/op 712.96 us/op 0.94
BLS verifyMultipleSignatures - same message - 8 - blst 847.96 us/op 901.87 us/op 0.94
BLS verifyMultipleSignatures - same message - 32 - blst 1.4713 ms/op 1.6049 ms/op 0.92
BLS verifyMultipleSignatures - same message - 64 - blst 2.1408 ms/op 2.4647 ms/op 0.87
BLS verifyMultipleSignatures - same message - 128 - blst 3.8477 ms/op 4.1585 ms/op 0.93
BLS aggregatePubkeys 32 - blst 16.723 us/op 18.086 us/op 0.92
BLS aggregatePubkeys 128 - blst 59.664 us/op 64.639 us/op 0.92
getSlashingsAndExits - default max 44.857 us/op 59.383 us/op 0.76
getSlashingsAndExits - 2k 494.43 us/op 408.25 us/op 1.21
proposeBlockBody type=full, size=empty 3.8491 ms/op 988.33 us/op 3.89
isKnown best case - 1 super set check 165.00 ns/op 159.00 ns/op 1.04
isKnown normal case - 2 super set checks 163.00 ns/op 165.00 ns/op 0.99
isKnown worse case - 16 super set checks 159.00 ns/op 158.00 ns/op 1.01
validate api signedAggregateAndProof - struct 1.4842 ms/op 1.5508 ms/op 0.96
validate gossip signedAggregateAndProof - struct 1.4823 ms/op 1.5515 ms/op 0.96
batch validate gossip attestation - vc 640000 - chunk 32 110.85 us/op 109.24 us/op 1.01
batch validate gossip attestation - vc 640000 - chunk 64 95.033 us/op 94.929 us/op 1.00
batch validate gossip attestation - vc 640000 - chunk 128 89.900 us/op 90.689 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 256 92.278 us/op 86.181 us/op 1.07
bytes32 toHexString 283.00 ns/op 273.00 ns/op 1.04
bytes32 Buffer.toString(hex) 173.00 ns/op 165.00 ns/op 1.05
bytes32 Buffer.toString(hex) from Uint8Array 234.00 ns/op 242.00 ns/op 0.97
bytes32 Buffer.toString(hex) + 0x 176.00 ns/op 165.00 ns/op 1.07
Return object 10000 times 0.20660 ns/op 0.20340 ns/op 1.02
Throw Error 10000 times 3.2429 us/op 3.2047 us/op 1.01
toHex 89.034 ns/op 96.009 ns/op 0.93
Buffer.from 82.097 ns/op 81.382 ns/op 1.01
shared Buffer 53.293 ns/op 53.390 ns/op 1.00
fastMsgIdFn sha256 / 200 bytes 1.4020 us/op 1.4450 us/op 0.97
fastMsgIdFn h32 xxhash / 200 bytes 150.00 ns/op 164.00 ns/op 0.91
fastMsgIdFn h64 xxhash / 200 bytes 198.00 ns/op 218.00 ns/op 0.91
fastMsgIdFn sha256 / 1000 bytes 4.5870 us/op 4.8780 us/op 0.94
fastMsgIdFn h32 xxhash / 1000 bytes 236.00 ns/op 246.00 ns/op 0.96
fastMsgIdFn h64 xxhash / 1000 bytes 247.00 ns/op 258.00 ns/op 0.96
fastMsgIdFn sha256 / 10000 bytes 40.348 us/op 43.164 us/op 0.93
fastMsgIdFn h32 xxhash / 10000 bytes 1.2480 us/op 1.3120 us/op 0.95
fastMsgIdFn h64 xxhash / 10000 bytes 802.00 ns/op 860.00 ns/op 0.93
send data - 1000 256B messages 4.5226 ms/op 4.3986 ms/op 1.03
send data - 1000 512B messages 4.3134 ms/op 4.6498 ms/op 0.93
send data - 1000 1024B messages 4.4129 ms/op 4.5332 ms/op 0.97
send data - 1000 1200B messages 4.7458 ms/op 4.7997 ms/op 0.99
send data - 1000 2048B messages 4.8124 ms/op 5.0721 ms/op 0.95
send data - 1000 4096B messages 5.6702 ms/op 5.5759 ms/op 1.02
send data - 1000 16384B messages 13.807 ms/op 16.633 ms/op 0.83
send data - 1000 65536B messages 166.75 ms/op 192.67 ms/op 0.87
enrSubnets - fastDeserialize 64 bits 726.00 ns/op 693.00 ns/op 1.05
enrSubnets - ssz BitVector 64 bits 249.00 ns/op 255.00 ns/op 0.98
enrSubnets - fastDeserialize 4 bits 102.00 ns/op 94.000 ns/op 1.09
enrSubnets - ssz BitVector 4 bits 255.00 ns/op 250.00 ns/op 1.02
prioritizePeers score -10:0 att 32-0.1 sync 2-0 203.02 us/op 208.22 us/op 0.98
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 228.41 us/op 244.96 us/op 0.93
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 330.13 us/op 350.04 us/op 0.94
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 595.71 us/op 593.12 us/op 1.00
prioritizePeers score 0:0 att 64-1 sync 4-1 697.48 us/op 712.08 us/op 0.98
array of 16000 items push then shift 1.2315 us/op 1.2231 us/op 1.01
LinkedList of 16000 items push then shift 7.4170 ns/op 7.1990 ns/op 1.03
array of 16000 items push then pop 67.148 ns/op 69.077 ns/op 0.97
LinkedList of 16000 items push then pop 5.8310 ns/op 5.7460 ns/op 1.01
array of 24000 items push then shift 1.7930 us/op 1.7962 us/op 1.00
LinkedList of 24000 items push then shift 6.9910 ns/op 7.0640 ns/op 0.99
array of 24000 items push then pop 94.930 ns/op 102.93 ns/op 0.92
LinkedList of 24000 items push then pop 5.8620 ns/op 6.2500 ns/op 0.94
intersect bitArray bitLen 8 4.6070 ns/op 4.8950 ns/op 0.94
intersect array and set length 8 28.186 ns/op 28.030 ns/op 1.01
intersect bitArray bitLen 128 23.201 ns/op 23.023 ns/op 1.01
intersect array and set length 128 482.66 ns/op 477.68 ns/op 1.01
bitArray.getTrueBitIndexes() bitLen 128 1.0200 us/op 1.0300 us/op 0.99
bitArray.getTrueBitIndexes() bitLen 248 1.7730 us/op 1.7720 us/op 1.00
bitArray.getTrueBitIndexes() bitLen 512 3.5930 us/op 3.5960 us/op 1.00
Full columns - reconstruct all 6 blobs 181.80 us/op 140.76 us/op 1.29
Full columns - reconstruct half of the blobs out of 6 73.878 us/op 67.584 us/op 1.09
Full columns - reconstruct single blob out of 6 30.080 us/op 35.645 us/op 0.84
Half columns - reconstruct all 6 blobs 375.86 ms/op 395.33 ms/op 0.95
Half columns - reconstruct half of the blobs out of 6 188.41 ms/op 200.51 ms/op 0.94
Half columns - reconstruct single blob out of 6 66.834 ms/op 71.626 ms/op 0.93
Full columns - reconstruct all 10 blobs 412.25 us/op 703.62 us/op 0.59
Full columns - reconstruct half of the blobs out of 10 118.92 us/op 155.73 us/op 0.76
Full columns - reconstruct single blob out of 10 31.708 us/op 28.964 us/op 1.09
Half columns - reconstruct all 10 blobs 620.49 ms/op 655.61 ms/op 0.95
Half columns - reconstruct half of the blobs out of 10 312.92 ms/op 329.43 ms/op 0.95
Half columns - reconstruct single blob out of 10 65.124 ms/op 72.103 ms/op 0.90
Full columns - reconstruct all 20 blobs 906.79 us/op 1.9813 ms/op 0.46
Full columns - reconstruct half of the blobs out of 20 415.50 us/op 206.91 us/op 2.01
Full columns - reconstruct single blob out of 20 32.483 us/op 32.006 us/op 1.01
Half columns - reconstruct all 20 blobs 1.2248 s/op 1.2898 s/op 0.95
Half columns - reconstruct half of the blobs out of 20 613.49 ms/op 648.72 ms/op 0.95
Half columns - reconstruct single blob out of 20 64.836 ms/op 71.565 ms/op 0.91
Set add up to 64 items then delete first 2.3899 us/op 2.2384 us/op 1.07
OrderedSet add up to 64 items then delete first 3.1956 us/op 3.5522 us/op 0.90
Set add up to 64 items then delete last 2.2666 us/op 2.3335 us/op 0.97
OrderedSet add up to 64 items then delete last 3.2155 us/op 3.4962 us/op 0.92
Set add up to 64 items then delete middle 2.0700 us/op 2.2402 us/op 0.92
OrderedSet add up to 64 items then delete middle 4.4969 us/op 5.1221 us/op 0.88
Set add up to 128 items then delete first 3.9613 us/op 4.3373 us/op 0.91
OrderedSet add up to 128 items then delete first 6.1172 us/op 6.5480 us/op 0.93
Set add up to 128 items then delete last 3.6257 us/op 4.0662 us/op 0.89
OrderedSet add up to 128 items then delete last 5.4095 us/op 6.2786 us/op 0.86
Set add up to 128 items then delete middle 3.6737 us/op 3.8849 us/op 0.95
OrderedSet add up to 128 items then delete middle 11.042 us/op 11.979 us/op 0.92
Set add up to 256 items then delete first 7.3213 us/op 7.5890 us/op 0.96
OrderedSet add up to 256 items then delete first 11.475 us/op 12.279 us/op 0.93
Set add up to 256 items then delete last 7.0353 us/op 9.5604 us/op 0.74
OrderedSet add up to 256 items then delete last 10.834 us/op 12.513 us/op 0.87
Set add up to 256 items then delete middle 7.1395 us/op 8.0492 us/op 0.89
OrderedSet add up to 256 items then delete middle 32.977 us/op 37.679 us/op 0.88
pass gossip attestations to forkchoice per slot 2.4176 ms/op 2.5668 ms/op 0.94
forkChoice updateHead vc 100000 bc 64 eq 0 368.46 us/op 424.39 us/op 0.87
forkChoice updateHead vc 600000 bc 64 eq 0 2.1923 ms/op 2.2480 ms/op 0.98
forkChoice updateHead vc 1000000 bc 64 eq 0 3.6765 ms/op 3.7360 ms/op 0.98
forkChoice updateHead vc 600000 bc 320 eq 0 2.2053 ms/op 2.2609 ms/op 0.98
forkChoice updateHead vc 600000 bc 1200 eq 0 2.2488 ms/op 2.3022 ms/op 0.98
forkChoice updateHead vc 600000 bc 7200 eq 0 2.5183 ms/op 2.8660 ms/op 0.88
forkChoice updateHead vc 600000 bc 64 eq 1000 2.7941 ms/op 3.0478 ms/op 0.92
forkChoice updateHead vc 600000 bc 64 eq 10000 2.8849 ms/op 3.1554 ms/op 0.91
forkChoice updateHead vc 600000 bc 64 eq 300000 6.4236 ms/op 7.1017 ms/op 0.90
computeDeltas 1400000 validators 0% inactive 11.904 ms/op 12.986 ms/op 0.92
computeDeltas 1400000 validators 10% inactive 11.150 ms/op 12.144 ms/op 0.92
computeDeltas 1400000 validators 20% inactive 10.196 ms/op 11.021 ms/op 0.93
computeDeltas 1400000 validators 50% inactive 7.8402 ms/op 8.4975 ms/op 0.92
computeDeltas 2100000 validators 0% inactive 17.912 ms/op 19.418 ms/op 0.92
computeDeltas 2100000 validators 10% inactive 16.777 ms/op 18.245 ms/op 0.92
computeDeltas 2100000 validators 20% inactive 15.248 ms/op 17.069 ms/op 0.89
computeDeltas 2100000 validators 50% inactive 9.7840 ms/op 9.8594 ms/op 0.99
altair processAttestation - 250000 vs - 7PWei normalcase 2.0012 ms/op 2.1062 ms/op 0.95
altair processAttestation - 250000 vs - 7PWei worstcase 3.1688 ms/op 2.8345 ms/op 1.12
altair processAttestation - setStatus - 1/6 committees join 101.53 us/op 109.17 us/op 0.93
altair processAttestation - setStatus - 1/3 committees join 197.96 us/op 208.62 us/op 0.95
altair processAttestation - setStatus - 1/2 committees join 282.59 us/op 294.89 us/op 0.96
altair processAttestation - setStatus - 2/3 committees join 375.47 us/op 377.50 us/op 0.99
altair processAttestation - setStatus - 4/5 committees join 500.31 us/op 533.73 us/op 0.94
altair processAttestation - setStatus - 100% committees join 580.83 us/op 624.67 us/op 0.93
altair processBlock - 250000 vs - 7PWei normalcase 4.3821 ms/op 4.0522 ms/op 1.08
altair processBlock - 250000 vs - 7PWei normalcase hashState 17.306 ms/op 18.570 ms/op 0.93
altair processBlock - 250000 vs - 7PWei worstcase 21.492 ms/op 21.725 ms/op 0.99
altair processBlock - 250000 vs - 7PWei worstcase hashState 44.937 ms/op 43.101 ms/op 1.04
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4706 ms/op 1.6605 ms/op 0.89
phase0 processBlock - 250000 vs - 7PWei worstcase 17.320 ms/op 17.623 ms/op 0.98
altair processEth1Data - 250000 vs - 7PWei normalcase 293.59 us/op 312.19 us/op 0.94
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 8.1040 us/op 3.1500 us/op 2.57
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 20.530 us/op 20.411 us/op 1.01
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 6.4850 us/op 6.8010 us/op 0.95
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 5.2910 us/op 4.3980 us/op 1.20
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 90.897 us/op 93.337 us/op 0.97
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4143 ms/op 1.4232 ms/op 0.99
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.8334 ms/op 1.7579 ms/op 1.04
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.8349 ms/op 1.7755 ms/op 1.03
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.7176 ms/op 3.4384 ms/op 1.08
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.0773 ms/op 2.1690 ms/op 0.96
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.1164 ms/op 4.3367 ms/op 0.95
Tree 40 250000 create 326.40 ms/op 343.91 ms/op 0.95
Tree 40 250000 get(125000) 91.843 ns/op 97.014 ns/op 0.95
Tree 40 250000 set(125000) 1.0024 us/op 1.0383 us/op 0.97
Tree 40 250000 toArray() 13.331 ms/op 9.6347 ms/op 1.38
Tree 40 250000 iterate all - toArray() + loop 15.249 ms/op 9.6346 ms/op 1.58
Tree 40 250000 iterate all - get(i) 37.447 ms/op 36.438 ms/op 1.03
Array 250000 create 2.2112 ms/op 2.2922 ms/op 0.96
Array 250000 clone - spread 695.05 us/op 698.15 us/op 1.00
Array 250000 get(125000) 0.30600 ns/op 0.29800 ns/op 1.03
Array 250000 set(125000) 0.30600 ns/op 0.30300 ns/op 1.01
Array 250000 iterate all - loop 59.425 us/op 58.462 us/op 1.02
phase0 afterProcessEpoch - 250000 vs - 7PWei 63.687 ms/op 40.105 ms/op 1.59
Array.fill - length 1000000 2.2356 ms/op 2.1999 ms/op 1.02
Array push - length 1000000 9.8639 ms/op 8.1325 ms/op 1.21
Array.get 0.21405 ns/op 0.21216 ns/op 1.01
Uint8Array.get 0.23345 ns/op 0.22976 ns/op 1.02
phase0 beforeProcessEpoch - 250000 vs - 7PWei 15.447 ms/op 17.846 ms/op 0.87
altair processEpoch - mainnet_e81889 286.25 ms/op 302.74 ms/op 0.95
mainnet_e81889 - altair beforeProcessEpoch 22.736 ms/op 20.594 ms/op 1.10
mainnet_e81889 - altair processJustificationAndFinalization 6.3030 us/op 6.6720 us/op 0.94
mainnet_e81889 - altair processInactivityUpdates 3.6287 ms/op 3.4363 ms/op 1.06
mainnet_e81889 - altair processRewardsAndPenalties 20.467 ms/op 19.445 ms/op 1.05
mainnet_e81889 - altair processRegistryUpdates 574.00 ns/op 568.00 ns/op 1.01
mainnet_e81889 - altair processSlashings 131.00 ns/op 130.00 ns/op 1.01
mainnet_e81889 - altair processEth1DataReset 131.00 ns/op 133.00 ns/op 0.98
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.7895 ms/op 1.6898 ms/op 1.06
mainnet_e81889 - altair processSlashingsReset 702.00 ns/op 737.00 ns/op 0.95
mainnet_e81889 - altair processRandaoMixesReset 1.3050 us/op 1.4330 us/op 0.91
mainnet_e81889 - altair processHistoricalRootsUpdate 134.00 ns/op 147.00 ns/op 0.91
mainnet_e81889 - altair processParticipationFlagUpdates 430.00 ns/op 466.00 ns/op 0.92
mainnet_e81889 - altair processSyncCommitteeUpdates 110.00 ns/op 106.00 ns/op 1.04
mainnet_e81889 - altair afterProcessEpoch 42.791 ms/op 41.691 ms/op 1.03
capella processEpoch - mainnet_e217614 859.48 ms/op 1.0453 s/op 0.82
mainnet_e217614 - capella beforeProcessEpoch 58.474 ms/op 65.859 ms/op 0.89
mainnet_e217614 - capella processJustificationAndFinalization 5.9520 us/op 6.7960 us/op 0.88
mainnet_e217614 - capella processInactivityUpdates 15.312 ms/op 15.316 ms/op 1.00
mainnet_e217614 - capella processRewardsAndPenalties 92.673 ms/op 94.480 ms/op 0.98
mainnet_e217614 - capella processRegistryUpdates 4.3750 us/op 4.3780 us/op 1.00
mainnet_e217614 - capella processSlashings 135.00 ns/op 133.00 ns/op 1.02
mainnet_e217614 - capella processEth1DataReset 131.00 ns/op 125.00 ns/op 1.05
mainnet_e217614 - capella processEffectiveBalanceUpdates 14.963 ms/op 15.640 ms/op 0.96
mainnet_e217614 - capella processSlashingsReset 677.00 ns/op 667.00 ns/op 1.01
mainnet_e217614 - capella processRandaoMixesReset 1.2640 us/op 1.4500 us/op 0.87
mainnet_e217614 - capella processHistoricalRootsUpdate 134.00 ns/op 141.00 ns/op 0.95
mainnet_e217614 - capella processParticipationFlagUpdates 426.00 ns/op 460.00 ns/op 0.93
mainnet_e217614 - capella afterProcessEpoch 109.94 ms/op 110.17 ms/op 1.00
phase0 processEpoch - mainnet_e58758 309.29 ms/op 348.44 ms/op 0.89
mainnet_e58758 - phase0 beforeProcessEpoch 67.513 ms/op 79.752 ms/op 0.85
mainnet_e58758 - phase0 processJustificationAndFinalization 6.3210 us/op 7.7320 us/op 0.82
mainnet_e58758 - phase0 processRewardsAndPenalties 16.947 ms/op 16.822 ms/op 1.01
mainnet_e58758 - phase0 processRegistryUpdates 2.3060 us/op 2.2280 us/op 1.04
mainnet_e58758 - phase0 processSlashings 135.00 ns/op 134.00 ns/op 1.01
mainnet_e58758 - phase0 processEth1DataReset 133.00 ns/op 138.00 ns/op 0.96
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 945.38 us/op 892.15 us/op 1.06
mainnet_e58758 - phase0 processSlashingsReset 924.00 ns/op 937.00 ns/op 0.99
mainnet_e58758 - phase0 processRandaoMixesReset 1.2030 us/op 1.4220 us/op 0.85
mainnet_e58758 - phase0 processHistoricalRootsUpdate 137.00 ns/op 128.00 ns/op 1.07
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.1600 us/op 1.2610 us/op 0.92
mainnet_e58758 - phase0 afterProcessEpoch 35.031 ms/op 31.928 ms/op 1.10
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.0933 ms/op 1.3118 ms/op 0.83
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.8132 ms/op 1.2708 ms/op 1.43
altair processInactivityUpdates - 250000 normalcase 10.601 ms/op 10.941 ms/op 0.97
altair processInactivityUpdates - 250000 worstcase 11.300 ms/op 11.137 ms/op 1.01
phase0 processRegistryUpdates - 250000 normalcase 2.1590 us/op 2.4350 us/op 0.89
phase0 processRegistryUpdates - 250000 badcase_full_deposits 137.95 us/op 149.24 us/op 0.92
phase0 processRegistryUpdates - 250000 worstcase 0.5 61.341 ms/op 63.014 ms/op 0.97
altair processRewardsAndPenalties - 250000 normalcase 15.708 ms/op 14.527 ms/op 1.08
altair processRewardsAndPenalties - 250000 worstcase 15.362 ms/op 14.055 ms/op 1.09
phase0 getAttestationDeltas - 250000 normalcase 5.3562 ms/op 5.2127 ms/op 1.03
phase0 getAttestationDeltas - 250000 worstcase 5.2775 ms/op 5.2119 ms/op 1.01
phase0 processSlashings - 250000 worstcase 62.414 us/op 58.906 us/op 1.06
altair processSyncCommitteeUpdates - 250000 10.075 ms/op 10.253 ms/op 0.98
BeaconState.hashTreeRoot - No change 168.00 ns/op 163.00 ns/op 1.03
BeaconState.hashTreeRoot - 1 full validator 73.549 us/op 79.697 us/op 0.92
BeaconState.hashTreeRoot - 32 full validator 849.07 us/op 895.34 us/op 0.95
BeaconState.hashTreeRoot - 512 full validator 6.7834 ms/op 6.5333 ms/op 1.04
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 93.683 us/op 102.64 us/op 0.91
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.3876 ms/op 1.6060 ms/op 0.86
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 14.045 ms/op 21.680 ms/op 0.65
BeaconState.hashTreeRoot - 1 balances 69.272 us/op 87.470 us/op 0.79
BeaconState.hashTreeRoot - 32 balances 735.59 us/op 1.3806 ms/op 0.53
BeaconState.hashTreeRoot - 512 balances 5.0001 ms/op 5.3877 ms/op 0.93
BeaconState.hashTreeRoot - 250000 balances 138.56 ms/op 189.45 ms/op 0.73
aggregationBits - 2048 els - zipIndexesInBitList 19.289 us/op 171.20 us/op 0.11
regular array get 100000 times 22.753 us/op 22.220 us/op 1.02
wrappedArray get 100000 times 22.820 us/op 22.231 us/op 1.03
arrayWithProxy get 100000 times 9.1624 ms/op 9.2237 ms/op 0.99
ssz.Root.equals 20.768 ns/op 20.653 ns/op 1.01
byteArrayEquals 20.273 ns/op 20.375 ns/op 0.99
Buffer.compare 8.4170 ns/op 8.4980 ns/op 0.99
processSlot - 1 slots 7.6540 us/op 11.784 us/op 0.65
processSlot - 32 slots 1.9184 ms/op 2.3291 ms/op 0.82
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 4.4753 ms/op 5.7897 ms/op 0.77
getCommitteeAssignments - req 1 vs - 250000 vc 1.5871 ms/op 1.7258 ms/op 0.92
getCommitteeAssignments - req 100 vs - 250000 vc 3.2763 ms/op 3.5606 ms/op 0.92
getCommitteeAssignments - req 1000 vs - 250000 vc 3.4942 ms/op 3.8431 ms/op 0.91
findModifiedValidators - 10000 modified validators 602.36 ms/op 690.35 ms/op 0.87
findModifiedValidators - 1000 modified validators 413.33 ms/op 455.50 ms/op 0.91
findModifiedValidators - 100 modified validators 288.51 ms/op 311.51 ms/op 0.93
findModifiedValidators - 10 modified validators 216.27 ms/op 242.61 ms/op 0.89
findModifiedValidators - 1 modified validators 153.77 ms/op 260.38 ms/op 0.59
findModifiedValidators - no difference 174.21 ms/op 182.26 ms/op 0.96
migrate state 1500000 validators, 3400 modified, 2000 new 2.6580 s/op 3.8336 s/op 0.69
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.5500 ns/op 3.7400 ns/op 0.95
state getBlockRootAtSlot - 250000 vs - 7PWei 332.47 ns/op 284.76 ns/op 1.17
computeProposerIndex 100000 validators 1.2905 ms/op 1.3727 ms/op 0.94
getNextSyncCommitteeIndices 1000 validators 2.7308 ms/op 2.9330 ms/op 0.93
getNextSyncCommitteeIndices 10000 validators 23.952 ms/op 26.064 ms/op 0.92
getNextSyncCommitteeIndices 100000 validators 83.272 ms/op 90.993 ms/op 0.92
computeProposers - vc 250000 529.09 us/op 555.38 us/op 0.95
computeEpochShuffling - vc 250000 37.914 ms/op 41.095 ms/op 0.92
getNextSyncCommittee - vc 250000 9.0081 ms/op 9.8053 ms/op 0.92
nodejs block root to RootHex using toHex 87.709 ns/op 100.57 ns/op 0.87
nodejs block root to RootHex using toRootHex 53.828 ns/op 61.104 ns/op 0.88
nodejs fromHex(blob) 711.53 us/op 834.10 us/op 0.85
nodejs fromHexInto(blob) 594.98 us/op 596.53 us/op 1.00
nodejs block root to RootHex using the deprecated toHexString 461.52 ns/op 528.77 ns/op 0.87
nodejs byteArrayEquals 32 bytes (block root) 24.875 ns/op 24.863 ns/op 1.00
nodejs byteArrayEquals 48 bytes (pubkey) 35.934 ns/op 35.894 ns/op 1.00
nodejs byteArrayEquals 96 bytes (signature) 32.063 ns/op 32.475 ns/op 0.99
nodejs byteArrayEquals 1024 bytes 38.461 ns/op 38.339 ns/op 1.00
nodejs byteArrayEquals 131072 bytes (blob) 1.6739 us/op 1.6777 us/op 1.00
browser block root to RootHex using toHex 137.80 ns/op 137.70 ns/op 1.00
browser block root to RootHex using toRootHex 123.73 ns/op 123.60 ns/op 1.00
browser fromHex(blob) 1.4270 ms/op 1.5983 ms/op 0.89
browser fromHexInto(blob) 606.19 us/op 595.64 us/op 1.02
browser block root to RootHex using the deprecated toHexString 467.88 ns/op 517.65 ns/op 0.90
browser byteArrayEquals 32 bytes (block root) 27.411 ns/op 26.581 ns/op 1.03
browser byteArrayEquals 48 bytes (pubkey) 38.443 ns/op 37.773 ns/op 1.02
browser byteArrayEquals 96 bytes (signature) 72.442 ns/op 70.317 ns/op 1.03
browser byteArrayEquals 1024 bytes 735.03 ns/op 718.35 ns/op 1.02
browser byteArrayEquals 131072 bytes (blob) 92.662 us/op 91.566 us/op 1.01

by benchmarkbot/action

@twoeths

twoeths commented May 19, 2026

Copy link
Copy Markdown
Member Author

found this in the e2e https://github.com/ChainSafe/lodestar/actions/runs/26099502380/job/76750258577?pr=9383

stdout | packages/beacon-node/test/e2e/sync/checkpointSync.test.ts > sync / checkpoint sync optimistic flow for gloas > Checkpoint sync from skipped-slot checkpoint
Eph 4/4 0.002[CheckpointSync-Node-A/api] verbose: Error on submitSignedProposerPreferences [0] slot=38, validatorIndex=7, dependentRoot=0xaf9b85b94f48843db15d6fcbcb2399c0d5fc24793de5fb1cd6daa72afc5387c8, code=PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT, proposalSlot=38, dependentRoot=0xaf9b85b94f48843db15d6fcbcb2399c0d5fc24793de5fb1cd6daa72afc5387c8
Error: PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT
    at validateGossipProposerPreferences (/home/runner/work/lodestar/lodestar/packages/beacon-node/src/chain/validation/proposerPreferences.ts:66:11)
    at /home/runner/work/lodestar/lodestar/packages/beacon-node/src/api/impl/beacon/pool/index.ts:103:19
    at Array.map (<anonymous>)
    at Object.submitSignedProposerPreferences (/home/runner/work/lodestar/lodestar/packages/beacon-node/src/api/impl/beacon/pool/index.ts:101:35)
    at Object.submitSignedProposerPreferences (/home/runner/work/lodestar/lodestar/packages/beacon-node/test/utils/node/validator.ts:97:36)

@wemeetagain

Copy link
Copy Markdown
Member

found this in the e2e

Resolved in #9380

@wemeetagain wemeetagain marked this pull request as ready for review May 19, 2026 22:00
@wemeetagain wemeetagain requested a review from a team as a code owner May 19, 2026 22:00
@codecov

codecov Bot commented May 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.55%. Comparing base (c5efeb6) to head (be04b1f).

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #9383   +/-   ##
=========================================
  Coverage     52.55%   52.55%           
=========================================
  Files           848      848           
  Lines         60950    60950           
  Branches       4487     4487           
=========================================
  Hits          32034    32034           
  Misses        28854    28854           
  Partials         62       62           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: be04b1fc0d

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

})();

const pref = dependentRootHex !== null ? chain.proposerPreferencesPool.get(prepareSlot, dependentRootHex) : null;
return Number(pref ? pref.message.targetGasLimit : state.latestExecutionPayloadBid.gasLimit);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Derive fallback target gas limit from parent payload

When no proposer preferences are found, this fallback uses state.latestExecutionPayloadBid.gasLimit, but that field is the previous block’s bid gas limit, not necessarily the latest executed payload gas limit. In Gloas, latestExecutionPayloadBid is overwritten for every block (including EMPTY-parent cases), so after an EMPTY block with a custom proposer target, the next slot can inherit that target even though no payload changed, violating the stated “keep parent payload gas limit unchanged” behavior and producing incorrect targetGasLimit in PayloadAttributesV4.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

we need to come up with chain.targetGasLimit option
Prysm has something like DefaultBuilderGasLimit for that

@twoeths

twoeths commented May 20, 2026

Copy link
Copy Markdown
Member Author

confirmed that PROPOSER_PREFERENCES_ERROR_UNKNOWN_DEPENDENT_ROOT does not happen anymore on checkpointSync e2e test
also tested this branch with kurtosis for glamsterdam-devnet-4, looks good interacting with Prysm + Lighthouse

participants_matrix:
  el:
    - el_type: ethrex
      el_image: ethpandaops/ethrex:glamsterdam-devnet-4
      el_extra_params:
         - --http.api=eth,net,web3,admin   # workaround for kurtosis enode probe, see https://github.com/ethpandaops/ethereum-package/pull/1392
  cl:
    - cl_type: prysm
      cl_image: ethpandaops/prysm-beacon-chain:glamsterdam-devnet-4-tmp
      vc_type: prysm
      vc_image: ethpandaops/prysm-validator:glamsterdam-devnet-4-tmp
    - cl_type: lighthouse
      cl_image: ethpandaops/lighthouse:glamsterdam-devnet-4
    - cl_type: lodestar
      cl_image: te:v1.7.0_alpha.8
  count: 1

network_params:
  gloas_fork_epoch: 1
  withdrawal_type: "0x01"
  seconds_per_slot: 6
  validator_balance: 40000
  genesis_gaslimit: 150000000
  gas_limit: 150000000

additional_services:
  - dora
  - assertoor
  - spamoor
  - checkpointz
spamoor_params:
  image: ethpandaops/spamoor:master

assertoor_params:
  run_stability_check: false
  run_block_proposal_check: false
  tests:
    - { file: "https://raw.githubusercontent.com/ethpandaops/assertoor/refs/heads/master/playbooks/gloas-dev/builder-lifecycle.yaml" }

snooper_enabled: false
global_log_level: debug

port_publisher:
  additional_services:
    enabled: true

checkpointz_params:
  image: ethpandaops/checkpointz:gloas-latest

@wemeetagain wemeetagain merged commit 1d0e0b9 into unstable May 20, 2026
18 of 19 checks passed
@wemeetagain wemeetagain deleted the te/v1.7.0_alpha.8 branch May 20, 2026 13:24
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.44.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.

2 participants