Skip to content

feat: support EIP-8261 gas limit schedule - #9808

Merged
nflaig merged 14 commits into
unstablefrom
nflaig/gas-limit-schedule
Aug 13, 2026
Merged

nflaig merged 14 commits into
unstablefrom
nflaig/gas-limit-schedule

Conversation

@nflaig

@nflaig nflaig commented Aug 11, 2026 •

Copy link
Copy Markdown
Member

Implements EIP-8261 as an advisory epoch-based gas limit schedule

  • add GAS_LIMIT_SCHEDULE config parsing, serialization, validation and epoch lookup
  • evaluate the schedule per duty from Gloas for builder registrations and proposer preferences
  • honor explicit operator preferences and warn when they exceed the active recommendation
  • keep the current 60M default before Gloas, before the first schedule entry or when the field is absent
  • leave built-in schedules empty until network configs define canonical entries
  • keep block validity and fork digests unchanged, the current EIP introduces no consensus rules

See ethereum/consensus-specs#5533

@github-actions

github-actions Bot commented Aug 11, 2026 •

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 5e1c539 Previous: 742db20 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.2219 ms/op 868.51 us/op 1.41
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 39.219 us/op 39.964 us/op 0.98
BLS verify - blst 728.85 us/op 737.55 us/op 0.99
BLS verifyMultipleSignatures 3 - blst 1.3668 ms/op 1.3784 ms/op 0.99
BLS verifyMultipleSignatures 8 - blst 2.1731 ms/op 2.1870 ms/op 0.99
BLS verifyMultipleSignatures 32 - blst 6.8385 ms/op 6.8353 ms/op 1.00
BLS verifyMultipleSignatures 64 - blst 14.048 ms/op 13.554 ms/op 1.04
BLS verifyMultipleSignatures 128 - blst 26.036 ms/op 25.747 ms/op 1.01
BLS deserializing 10000 signatures 638.43 ms/op 633.09 ms/op 1.01
BLS deserializing 100000 signatures 6.4227 s/op 6.3252 s/op 1.02
BLS verifyMultipleSignatures - same message - 3 - blst 821.55 us/op 826.25 us/op 0.99
BLS verifyMultipleSignatures - same message - 8 - blst 970.45 us/op 894.26 us/op 1.09
BLS verifyMultipleSignatures - same message - 32 - blst 1.5695 ms/op 1.5638 ms/op 1.00
BLS verifyMultipleSignatures - same message - 64 - blst 2.3971 ms/op 2.3877 ms/op 1.00
BLS verifyMultipleSignatures - same message - 128 - blst 4.2334 ms/op 4.0475 ms/op 1.05
BLS aggregatePubkeys 32 - blst 18.171 us/op 17.711 us/op 1.03
BLS aggregatePubkeys 128 - blst 64.187 us/op 63.062 us/op 1.02
getSlashingsAndExits - default max 48.961 us/op 48.294 us/op 1.01
getSlashingsAndExits - 2k 398.73 us/op 338.12 us/op 1.18
proposeBlockBody type=full, size=empty 661.10 us/op 672.26 us/op 0.98
isKnown best case - 1 super set check 165.00 ns/op 176.00 ns/op 0.94
isKnown normal case - 2 super set checks 168.00 ns/op 171.00 ns/op 0.98
isKnown worse case - 16 super set checks 166.00 ns/op 174.00 ns/op 0.95
validate api signedAggregateAndProof - struct 1.5812 ms/op 1.5409 ms/op 1.03
validate gossip signedAggregateAndProof - struct 1.5757 ms/op 1.5344 ms/op 1.03
batch validate gossip attestation - vc 640000 - chunk 32 113.50 us/op 108.59 us/op 1.05
batch validate gossip attestation - vc 640000 - chunk 64 99.034 us/op 94.203 us/op 1.05
batch validate gossip attestation - vc 640000 - chunk 128 95.786 us/op 87.097 us/op 1.10
batch validate gossip attestation - vc 640000 - chunk 256 92.188 us/op 83.579 us/op 1.10
bytes32 toHexString 294.00 ns/op 302.00 ns/op 0.97
bytes32 Buffer.toString(hex) 180.00 ns/op 167.00 ns/op 1.08
bytes32 Buffer.toString(hex) from Uint8Array 245.00 ns/op 241.00 ns/op 1.02
bytes32 Buffer.toString(hex) + 0x 182.00 ns/op 164.00 ns/op 1.11
Return object 10000 times 0.21900 ns/op 0.21350 ns/op 1.03
Throw Error 10000 times 3.3600 us/op 3.3296 us/op 1.01
toHex 98.467 ns/op 102.62 ns/op 0.96
Buffer.from 97.102 ns/op 93.600 ns/op 1.04
shared Buffer 60.364 ns/op 64.079 ns/op 0.94
fastMsgIdFn sha256 / 200 bytes 1.5250 us/op 1.4840 us/op 1.03
fastMsgIdFn h32 xxhash / 200 bytes 160.00 ns/op 156.00 ns/op 1.03
fastMsgIdFn h64 xxhash / 200 bytes 206.00 ns/op 210.00 ns/op 0.98
fastMsgIdFn sha256 / 1000 bytes 4.8980 us/op 4.7790 us/op 1.02
fastMsgIdFn h32 xxhash / 1000 bytes 250.00 ns/op 247.00 ns/op 1.01
fastMsgIdFn h64 xxhash / 1000 bytes 255.00 ns/op 261.00 ns/op 0.98
fastMsgIdFn sha256 / 10000 bytes 43.054 us/op 42.370 us/op 1.02
fastMsgIdFn h32 xxhash / 10000 bytes 1.2910 us/op 1.2750 us/op 1.01
fastMsgIdFn h64 xxhash / 10000 bytes 828.00 ns/op 838.00 ns/op 0.99
send data - 1000 256B messages 4.4362 ms/op 4.3894 ms/op 1.01
send data - 1000 512B messages 5.7074 ms/op 5.0190 ms/op 1.14
send data - 1000 1024B messages 5.9175 ms/op 5.2715 ms/op 1.12
send data - 1000 1200B messages 6.6207 ms/op 6.7043 ms/op 0.99
send data - 1000 2048B messages 9.9359 ms/op 9.3945 ms/op 1.06
send data - 1000 4096B messages 90.750 ms/op 44.818 ms/op 2.02
send data - 1000 16384B messages 336.22 ms/op 451.93 ms/op 0.74
send data - 1000 65536B messages 1.5693 s/op 1.4241 s/op 1.10
enrSubnets - fastDeserialize 64 bits 728.00 ns/op 753.00 ns/op 0.97
enrSubnets - ssz BitVector 64 bits 262.00 ns/op 271.00 ns/op 0.97
enrSubnets - fastDeserialize 4 bits 106.00 ns/op 107.00 ns/op 0.99
enrSubnets - ssz BitVector 4 bits 269.00 ns/op 277.00 ns/op 0.97
prioritizePeers score -10:0 att 32-0.1 sync 2-0 202.31 us/op 207.01 us/op 0.98
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 233.75 us/op 235.33 us/op 0.99
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 346.19 us/op 345.29 us/op 1.00
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 603.16 us/op 604.66 us/op 1.00
prioritizePeers score 0:0 att 64-1 sync 4-1 694.28 us/op 695.91 us/op 1.00
array of 16000 items push then shift 1.3217 us/op 1.3165 us/op 1.00
LinkedList of 16000 items push then shift 7.2860 ns/op 6.8030 ns/op 1.07
array of 16000 items push then pop 72.679 ns/op 69.855 ns/op 1.04
LinkedList of 16000 items push then pop 6.0950 ns/op 6.0600 ns/op 1.01
array of 24000 items push then shift 1.8842 us/op 1.9525 us/op 0.96
LinkedList of 24000 items push then shift 6.9920 ns/op 6.4480 ns/op 1.08
array of 24000 items push then pop 101.67 ns/op 98.316 ns/op 1.03
LinkedList of 24000 items push then pop 5.9270 ns/op 6.0300 ns/op 0.98
intersect bitArray bitLen 8 3.8330 ns/op 3.8900 ns/op 0.99
intersect array and set length 8 30.419 ns/op 30.351 ns/op 1.00
intersect bitArray bitLen 128 23.131 ns/op 23.593 ns/op 0.98
intersect array and set length 128 491.65 ns/op 510.90 ns/op 0.96
bitArray.getTrueBitIndexes() bitLen 128 932.00 ns/op 926.00 ns/op 1.01
bitArray.getTrueBitIndexes() bitLen 248 1.6540 us/op 1.6690 us/op 0.99
bitArray.getTrueBitIndexes() bitLen 512 3.4490 us/op 3.4620 us/op 1.00
Full columns - reconstruct all 6 blobs 190.20 us/op 143.62 us/op 1.32
Full columns - reconstruct half of the blobs out of 6 67.813 us/op 69.023 us/op 0.98
Full columns - reconstruct single blob out of 6 34.144 us/op 37.703 us/op 0.91
Half columns - reconstruct all 6 blobs 399.72 ms/op 383.74 ms/op 1.04
Half columns - reconstruct half of the blobs out of 6 198.87 ms/op 192.25 ms/op 1.03
Half columns - reconstruct single blob out of 6 71.194 ms/op 67.744 ms/op 1.05
Set add up to 64 items then delete first 1.5754 us/op 1.7119 us/op 0.92
OrderedSet add up to 64 items then delete first 2.4293 us/op 2.5726 us/op 0.94
Set add up to 64 items then delete last 1.7927 us/op 1.9242 us/op 0.93
OrderedSet add up to 64 items then delete last 2.7130 us/op 2.8350 us/op 0.96
Set add up to 64 items then delete middle 1.8061 us/op 1.9161 us/op 0.94
OrderedSet add up to 64 items then delete middle 4.1316 us/op 4.3026 us/op 0.96
Set add up to 128 items then delete first 3.6576 us/op 3.8395 us/op 0.95
OrderedSet add up to 128 items then delete first 5.5630 us/op 5.7752 us/op 0.96
Set add up to 128 items then delete last 3.4590 us/op 3.6754 us/op 0.94
OrderedSet add up to 128 items then delete last 5.3059 us/op 5.4639 us/op 0.97
Set add up to 128 items then delete middle 3.4764 us/op 3.7059 us/op 0.94
OrderedSet add up to 128 items then delete middle 10.981 us/op 11.478 us/op 0.96
Set add up to 256 items then delete first 7.7368 us/op 7.6495 us/op 1.01
OrderedSet add up to 256 items then delete first 12.035 us/op 11.726 us/op 1.03
Set add up to 256 items then delete last 7.4969 us/op 7.2666 us/op 1.03
OrderedSet add up to 256 items then delete last 11.763 us/op 11.159 us/op 1.05
Set add up to 256 items then delete middle 7.0535 us/op 8.0053 us/op 0.88
OrderedSet add up to 256 items then delete middle 35.689 us/op 34.541 us/op 1.03
runFastConfirmationRules vc:100000 bc:96 eq:0 4.6148 ms/op 5.1585 ms/op 0.89
runFastConfirmationRules vc:600000 bc:96 eq:0 36.959 ms/op 34.400 ms/op 1.07
runFastConfirmationRules vc:1000000 bc:96 eq:0 60.739 ms/op 57.573 ms/op 1.05
runFastConfirmationRules vc:600000 bc:320 eq:0 37.419 ms/op 34.463 ms/op 1.09
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.1350 s/op 1.1343 s/op 1.00
pass gossip attestations to forkchoice per slot 2.7124 ms/op 2.5680 ms/op 1.06
forkChoice updateHead vc 100000 bc 64 eq 0 413.39 us/op 455.84 us/op 0.91
forkChoice updateHead vc 600000 bc 64 eq 0 2.4225 ms/op 2.7015 ms/op 0.90
forkChoice updateHead vc 1000000 bc 64 eq 0 3.9729 ms/op 4.5334 ms/op 0.88
forkChoice updateHead vc 600000 bc 320 eq 0 2.4801 ms/op 2.7232 ms/op 0.91
forkChoice updateHead vc 600000 bc 1200 eq 0 2.5029 ms/op 2.7376 ms/op 0.91
forkChoice updateHead vc 600000 bc 7200 eq 0 3.8455 ms/op 3.1142 ms/op 1.23
forkChoice updateHead vc 600000 bc 64 eq 1000 2.4382 ms/op 2.7109 ms/op 0.90
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5420 ms/op 2.8142 ms/op 0.90
forkChoice updateHead vc 600000 bc 64 eq 300000 6.9129 ms/op 7.1228 ms/op 0.97
computeDeltas 1400000 validators 0% inactive 11.939 ms/op 13.374 ms/op 0.89
computeDeltas 1400000 validators 10% inactive 11.436 ms/op 12.583 ms/op 0.91
computeDeltas 1400000 validators 20% inactive 10.784 ms/op 11.916 ms/op 0.91
computeDeltas 1400000 validators 50% inactive 8.7238 ms/op 9.6791 ms/op 0.90
computeDeltas 2100000 validators 0% inactive 20.707 ms/op 20.499 ms/op 1.01
computeDeltas 2100000 validators 10% inactive 17.399 ms/op 19.161 ms/op 0.91
computeDeltas 2100000 validators 20% inactive 16.603 ms/op 18.604 ms/op 0.89
computeDeltas 2100000 validators 50% inactive 11.031 ms/op 14.681 ms/op 0.75
altair processAttestation - 250000 vs - 7PWei normalcase 2.7637 ms/op 1.6122 ms/op 1.71
altair processAttestation - 250000 vs - 7PWei worstcase 3.2648 ms/op 2.4348 ms/op 1.34
altair processAttestation - setStatus - 1/6 committees join 107.04 us/op 104.80 us/op 1.02
altair processAttestation - setStatus - 1/3 committees join 216.08 us/op 207.61 us/op 1.04
altair processAttestation - setStatus - 1/2 committees join 292.59 us/op 290.25 us/op 1.01
altair processAttestation - setStatus - 2/3 committees join 371.95 us/op 388.39 us/op 0.96
altair processAttestation - setStatus - 4/5 committees join 529.67 us/op 520.25 us/op 1.02
altair processAttestation - setStatus - 100% committees join 635.28 us/op 623.47 us/op 1.02
altair processBlock - 250000 vs - 7PWei normalcase 4.4230 ms/op 3.0018 ms/op 1.47
altair processBlock - 250000 vs - 7PWei normalcase hashState 13.749 ms/op 12.340 ms/op 1.11
altair processBlock - 250000 vs - 7PWei worstcase 23.315 ms/op 20.823 ms/op 1.12
altair processBlock - 250000 vs - 7PWei worstcase hashState 52.646 ms/op 41.838 ms/op 1.26
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4582 ms/op 1.3243 ms/op 1.10
phase0 processBlock - 250000 vs - 7PWei worstcase 17.617 ms/op 17.252 ms/op 1.02
altair processEth1Data - 250000 vs - 7PWei normalcase 299.43 us/op 299.76 us/op 1.00
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 5.5640 us/op 6.0770 us/op 0.92
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 20.900 us/op 26.779 us/op 0.78
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 6.7240 us/op 6.5890 us/op 1.02
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 4.8310 us/op 5.6140 us/op 0.86
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 100.03 us/op 96.505 us/op 1.04
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.4362 ms/op 1.3897 ms/op 1.03
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.8715 ms/op 1.8397 ms/op 1.02
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.8981 ms/op 1.8283 ms/op 1.04
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.7262 ms/op 3.7648 ms/op 0.99
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.1262 ms/op 2.1032 ms/op 1.01
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 5.5205 ms/op 4.0732 ms/op 1.36
Tree 40 250000 create 353.87 ms/op 319.19 ms/op 1.11
Tree 40 250000 get(125000) 89.319 ns/op 102.79 ns/op 0.87
Tree 40 250000 set(125000) 967.26 ns/op 1.0834 us/op 0.89
Tree 40 250000 toArray() 17.355 ms/op 9.6809 ms/op 1.79
Tree 40 250000 iterate all - toArray() + loop 17.745 ms/op 9.6985 ms/op 1.83
Tree 40 250000 iterate all - get(i) 40.595 ms/op 36.500 ms/op 1.11
Array 250000 create 2.3767 ms/op 2.2675 ms/op 1.05
Array 250000 clone - spread 741.39 us/op 733.16 us/op 1.01
Array 250000 get(125000) 0.29500 ns/op 0.30500 ns/op 0.97
Array 250000 set(125000) 0.29200 ns/op 0.31300 ns/op 0.93
Array 250000 iterate all - loop 56.540 us/op 59.475 us/op 0.95
phase0 afterProcessEpoch - 250000 vs - 7PWei 53.191 ms/op 42.632 ms/op 1.25
Array.fill - length 1000000 5.4595 ms/op 3.5528 ms/op 1.54
Array push - length 1000000 14.295 ms/op 13.729 ms/op 1.04
Array.get 0.20730 ns/op 0.21917 ns/op 0.95
Uint8Array.get 0.23925 ns/op 0.24762 ns/op 0.97
phase0 beforeProcessEpoch - 250000 vs - 7PWei 15.748 ms/op 12.908 ms/op 1.22
altair processEpoch - mainnet_e81889 375.62 ms/op 294.92 ms/op 1.27
mainnet_e81889 - altair beforeProcessEpoch 24.150 ms/op 41.707 ms/op 0.58
mainnet_e81889 - altair processJustificationAndFinalization 8.2930 us/op 11.165 us/op 0.74
mainnet_e81889 - altair processInactivityUpdates 3.5316 ms/op 3.9244 ms/op 0.90
mainnet_e81889 - altair processRewardsAndPenalties 19.893 ms/op 21.856 ms/op 0.91
mainnet_e81889 - altair processRegistryUpdates 591.00 ns/op 1.2990 us/op 0.45
mainnet_e81889 - altair processSlashings 155.00 ns/op 240.00 ns/op 0.65
mainnet_e81889 - altair processEth1DataReset 144.00 ns/op 176.00 ns/op 0.82
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.7677 ms/op 1.3352 ms/op 1.32
mainnet_e81889 - altair processSlashingsReset 719.00 ns/op 1.2860 us/op 0.56
mainnet_e81889 - altair processRandaoMixesReset 1.4360 us/op 1.6530 us/op 0.87
mainnet_e81889 - altair processHistoricalRootsUpdate 148.00 ns/op 219.00 ns/op 0.68
mainnet_e81889 - altair processParticipationFlagUpdates 460.00 ns/op 492.00 ns/op 0.93
mainnet_e81889 - altair processSyncCommitteeUpdates 123.00 ns/op 120.00 ns/op 1.02
mainnet_e81889 - altair afterProcessEpoch 44.307 ms/op 42.012 ms/op 1.05
capella processEpoch - mainnet_e217614 999.71 ms/op 734.97 ms/op 1.36
mainnet_e217614 - capella beforeProcessEpoch 59.948 ms/op 58.151 ms/op 1.03
mainnet_e217614 - capella processJustificationAndFinalization 9.6580 us/op 5.2800 us/op 1.83
mainnet_e217614 - capella processInactivityUpdates 16.271 ms/op 11.571 ms/op 1.41
mainnet_e217614 - capella processRewardsAndPenalties 107.02 ms/op 85.885 ms/op 1.25
mainnet_e217614 - capella processRegistryUpdates 4.5510 us/op 4.6210 us/op 0.98
mainnet_e217614 - capella processSlashings 155.00 ns/op 122.00 ns/op 1.27
mainnet_e217614 - capella processEth1DataReset 150.00 ns/op 145.00 ns/op 1.03
mainnet_e217614 - capella processEffectiveBalanceUpdates 9.9993 ms/op 6.9471 ms/op 1.44
mainnet_e217614 - capella processSlashingsReset 710.00 ns/op 722.00 ns/op 0.98
mainnet_e217614 - capella processRandaoMixesReset 1.5110 us/op 1.4770 us/op 1.02
mainnet_e217614 - capella processHistoricalRootsUpdate 167.00 ns/op 147.00 ns/op 1.14
mainnet_e217614 - capella processParticipationFlagUpdates 464.00 ns/op 478.00 ns/op 0.97
mainnet_e217614 - capella afterProcessEpoch 110.72 ms/op 111.02 ms/op 1.00
phase0 processEpoch - mainnet_e58758 362.82 ms/op 279.38 ms/op 1.30
mainnet_e58758 - phase0 beforeProcessEpoch 75.738 ms/op 66.266 ms/op 1.14
mainnet_e58758 - phase0 processJustificationAndFinalization 7.1650 us/op 6.9220 us/op 1.04
mainnet_e58758 - phase0 processRewardsAndPenalties 16.850 ms/op 16.333 ms/op 1.03
mainnet_e58758 - phase0 processRegistryUpdates 2.3220 us/op 2.3380 us/op 0.99
mainnet_e58758 - phase0 processSlashings 146.00 ns/op 315.00 ns/op 0.46
mainnet_e58758 - phase0 processEth1DataReset 140.00 ns/op 149.00 ns/op 0.94
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 821.62 us/op 934.17 us/op 0.88
mainnet_e58758 - phase0 processSlashingsReset 924.00 ns/op 904.00 ns/op 1.02
mainnet_e58758 - phase0 processRandaoMixesReset 1.4760 us/op 1.4340 us/op 1.03
mainnet_e58758 - phase0 processHistoricalRootsUpdate 144.00 ns/op 146.00 ns/op 0.99
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.3400 us/op 1.1210 us/op 1.20
mainnet_e58758 - phase0 afterProcessEpoch 34.768 ms/op 34.367 ms/op 1.01
phase0 processEffectiveBalanceUpdates - 250000 normalcase 992.63 us/op 1.2845 ms/op 0.77
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 3.0338 ms/op 1.6645 ms/op 1.82
altair processInactivityUpdates - 250000 normalcase 12.742 ms/op 11.059 ms/op 1.15
altair processInactivityUpdates - 250000 worstcase 11.320 ms/op 14.857 ms/op 0.76
phase0 processRegistryUpdates - 250000 normalcase 3.4970 us/op 3.9730 us/op 0.88
phase0 processRegistryUpdates - 250000 badcase_full_deposits 139.52 us/op 151.02 us/op 0.92
phase0 processRegistryUpdates - 250000 worstcase 0.5 61.242 ms/op 60.959 ms/op 1.00
altair processRewardsAndPenalties - 250000 normalcase 15.760 ms/op 13.004 ms/op 1.21
altair processRewardsAndPenalties - 250000 worstcase 15.569 ms/op 15.091 ms/op 1.03
phase0 getAttestationDeltas - 250000 normalcase 5.4666 ms/op 13.359 ms/op 0.41
phase0 getAttestationDeltas - 250000 worstcase 5.3967 ms/op 5.7150 ms/op 0.94
phase0 processSlashings - 250000 worstcase 58.229 us/op 68.426 us/op 0.85
altair processSyncCommitteeUpdates - 250000 9.8325 ms/op 11.562 ms/op 0.85
BeaconState.hashTreeRoot - No change 188.00 ns/op 196.00 ns/op 0.96
BeaconState.hashTreeRoot - 1 full validator 77.687 us/op 79.182 us/op 0.98
BeaconState.hashTreeRoot - 32 full validator 1.0233 ms/op 922.25 us/op 1.11
BeaconState.hashTreeRoot - 512 full validator 7.0698 ms/op 8.3369 ms/op 0.85
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 103.95 us/op 107.10 us/op 0.97
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.4769 ms/op 1.5516 ms/op 0.95
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 16.345 ms/op 18.227 ms/op 0.90
BeaconState.hashTreeRoot - 1 balances 89.395 us/op 81.294 us/op 1.10
BeaconState.hashTreeRoot - 32 balances 968.30 us/op 802.03 us/op 1.21
BeaconState.hashTreeRoot - 512 balances 5.4467 ms/op 6.4903 ms/op 0.84
BeaconState.hashTreeRoot - 250000 balances 148.77 ms/op 139.14 ms/op 1.07
aggregationBits - 2048 els - zipIndexesInBitList 19.491 us/op 21.047 us/op 0.93
regular array get 100000 times 22.488 us/op 23.579 us/op 0.95
wrappedArray get 100000 times 22.546 us/op 23.505 us/op 0.96
arrayWithProxy get 100000 times 9.3419 ms/op 10.668 ms/op 0.88
ssz.Root.equals 20.876 ns/op 21.965 ns/op 0.95
byteArrayEquals 20.885 ns/op 21.782 ns/op 0.96
Buffer.compare 8.7290 ns/op 9.0310 ns/op 0.97
processSlot - 1 slots 9.0230 us/op 9.8620 us/op 0.91
processSlot - 32 slots 2.6835 ms/op 2.2839 ms/op 1.17
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 9.0846 ms/op 2.3415 ms/op 3.88
getCommitteeAssignments - req 1 vs - 250000 vc 1.6832 ms/op 1.7343 ms/op 0.97
getCommitteeAssignments - req 100 vs - 250000 vc 3.4282 ms/op 3.5503 ms/op 0.97
getCommitteeAssignments - req 1000 vs - 250000 vc 3.7089 ms/op 3.8479 ms/op 0.96
findModifiedValidators - 10000 modified validators 747.49 ms/op 767.11 ms/op 0.97
findModifiedValidators - 1000 modified validators 503.13 ms/op 528.73 ms/op 0.95
findModifiedValidators - 100 modified validators 366.66 ms/op 370.76 ms/op 0.99
findModifiedValidators - 10 modified validators 292.72 ms/op 386.82 ms/op 0.76
findModifiedValidators - 1 modified validators 294.84 ms/op 275.34 ms/op 1.07
findModifiedValidators - no difference 258.62 ms/op 549.90 ms/op 0.47
migrate state 1500000 validators, 3400 modified, 2000 new 4.2317 s/op 3.6605 s/op 1.16
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.8700 ns/op 3.7400 ns/op 1.03
state getBlockRootAtSlot - 250000 vs - 7PWei 405.91 ns/op 436.50 ns/op 0.93
computeProposerIndex 100000 validators 1.4443 ms/op 1.4793 ms/op 0.98
getNextSyncCommitteeIndices 1000 validators 2.9865 ms/op 3.0598 ms/op 0.98
getNextSyncCommitteeIndices 10000 validators 27.174 ms/op 27.587 ms/op 0.99
getNextSyncCommitteeIndices 100000 validators 93.410 ms/op 93.956 ms/op 0.99
computeProposers - vc 250000 573.14 us/op 580.08 us/op 0.99
computeEpochShuffling - vc 250000 41.193 ms/op 42.132 ms/op 0.98
getNextSyncCommittee - vc 250000 9.9457 ms/op 10.325 ms/op 0.96
nodejs block root to RootHex using toHex 101.81 ns/op 103.18 ns/op 0.99
nodejs block root to RootHex using toRootHex 64.894 ns/op 66.320 ns/op 0.98
nodejs fromHex(blob) 1.0010 ms/op 1.0480 ms/op 0.96
nodejs fromHexInto(blob) 662.45 us/op 664.56 us/op 1.00
nodejs block root to RootHex using the deprecated toHexString 539.89 ns/op 528.17 ns/op 1.02
nodejs byteArrayEquals 32 bytes (block root) 27.032 ns/op 27.342 ns/op 0.99
nodejs byteArrayEquals 48 bytes (pubkey) 39.149 ns/op 39.723 ns/op 0.99
nodejs byteArrayEquals 96 bytes (signature) 36.420 ns/op 38.397 ns/op 0.95
nodejs byteArrayEquals 1024 bytes 42.486 ns/op 44.459 ns/op 0.96
nodejs byteArrayEquals 131072 bytes (blob) 1.8520 us/op 1.8464 us/op 1.00
browser block root to RootHex using toHex 148.48 ns/op 151.60 ns/op 0.98
browser block root to RootHex using toRootHex 133.06 ns/op 137.56 ns/op 0.97
browser fromHex(blob) 1.8133 ms/op 1.9126 ms/op 0.95
browser fromHexInto(blob) 650.57 us/op 657.10 us/op 0.99
browser block root to RootHex using the deprecated toHexString 368.34 ns/op 360.13 ns/op 1.02
browser byteArrayEquals 32 bytes (block root) 29.247 ns/op 29.211 ns/op 1.00
browser byteArrayEquals 48 bytes (pubkey) 41.206 ns/op 41.246 ns/op 1.00
browser byteArrayEquals 96 bytes (signature) 77.487 ns/op 77.203 ns/op 1.00
browser byteArrayEquals 1024 bytes 788.67 ns/op 789.49 ns/op 1.00
browser byteArrayEquals 131072 bytes (blob) 99.752 us/op 99.848 us/op 1.00

by benchmarkbot/action

@nflaig

nflaig commented Aug 11, 2026

Copy link
Copy Markdown
Member Author

ethereum/EIPs#12142 to align the EIP with our implementation

@nflaig
nflaig marked this pull request as ready for review August 11, 2026 12:22
@nflaig
nflaig requested a review from a team as a code owner August 11, 2026 12:22

@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: 372bef369b

ℹ️ 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".

Comment thread packages/config/src/chainConfig/json.ts Outdated
@nflaig

nflaig commented Aug 11, 2026

Copy link
Copy Markdown
Member Author

merged into glamsterdam-devnet-8

@spiral-ladder spiral-ladder 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.

do we need to update keyManager's getGasLimit as well?

async getGasLimit({pubkey}: {pubkey: PubkeyHex}): ReturnType<Api["getGasLimit"]> {

continue;
}

if (key === "BLOB_SCHEDULE") {

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 validate BLOB_SCHEDULE, should we validate GAS_LIMIT_SCHEDULE?

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.

for the blob schedule we wanna make sure that beacon node <> validator client have same config, however the gas limit schedule is only relevant for the validator client as the beacon node doesn't do anything with this config other than return it via config/spec endpoint, that's why I set GAS_LIMIT_SCHEDULE: false further below

we could still do it if we really wanted to but I am thinking this could cause more headaches than provide actual value if clients have config mismatches for some reason

@nflaig

nflaig commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

do we need to update keyManager's getGasLimit as well?

async getGasLimit({pubkey}: {pubkey: PubkeyHex}): ReturnType<Api["getGasLimit"]> {

doesn't validatorStore.getGasLimit(pubkey) already return the correct gas limit, or you mean something else?

@spiral-ladder

Copy link
Copy Markdown
Member

do we need to update keyManager's getGasLimit as well?

async getGasLimit({pubkey}: {pubkey: PubkeyHex}): ReturnType<Api["getGasLimit"]> {

doesn't validatorStore.getGasLimit(pubkey) already return the correct gas limit, or you mean something else?

we don't pass slot in the keymanager api, so that never returns the scheduledGasLimit and falls back to default if left unconfigured if im understanding this right

@nflaig

nflaig commented Aug 12, 2026

Copy link
Copy Markdown
Member Author

we don't pass slot in the keymanager api, so that never returns the scheduledGasLimit and falls back to default if left unconfigured if im understanding this right

ah this is a good catch, we should probably just default to current slot if queried via keymanager api

private readonly config: BeaconConfig;
private readonly api: ApiClient;
private readonly clock: IClock;
readonly clock: IClock;

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.

not so happy about that but was cleanest way to access current slot in keymanager api

@nflaig
nflaig requested a review from spiral-ladder August 12, 2026 21:17
spiral-ladder
spiral-ladder previously approved these changes Aug 13, 2026
@nflaig

nflaig commented Aug 13, 2026

Copy link
Copy Markdown
Member Author

keeping this open, there will be a decision on ACDE today whether or not clients should adopt this

Comment thread packages/config/src/forkConfig/index.ts
@codecov

codecov Bot commented Aug 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.59%. Comparing base (fc6798b) to head (2f09325).
⚠️ Report is 386 commits behind head on unstable.

Additional details and impacted files
@@             Coverage Diff              @@
##           unstable    #9808      +/-   ##
============================================
+ Coverage     52.46%   52.59%   +0.13%     
============================================
  Files           848      848              
  Lines         62953    59989    -2964     
  Branches       4658     4416     -242     
============================================
- Hits          33030    31554    -1476     
+ Misses        29855    28376    -1479     
+ Partials         68       59       -9     
🚀 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.

throw Error(`Invalid GAS_LIMIT_SCHEDULE value ${input} expected array`);
}

const gasLimitSchedule = input.map((entry, i) => {

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.

maybe we can check here if any epoch is < GLOAS_FORK_EPOCH but I don't think that's possible

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.

this was kinda simple so I added that sanity check here e65c5fa

@matthewkeil matthewkeil 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!! 🎸

Sent some feedback via DM and all were resolved

@matthewkeil
matthewkeil enabled auto-merge (squash) August 13, 2026 16:55
@nflaig
nflaig disabled auto-merge August 13, 2026 17:07
@nflaig
nflaig enabled auto-merge (squash) August 13, 2026 17:08
@nflaig
nflaig merged commit b2cbfa5 into unstable Aug 13, 2026
20 of 21 checks passed
@nflaig
nflaig deleted the nflaig/gas-limit-schedule branch August 13, 2026 17:09
@github-project-automation github-project-automation Bot moved this from In Progress to Done in Lodestar Team Coordination Aug 13, 2026
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.47.0 🎉

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

Labels

None yet

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

4 participants