Skip to content

feat: add heze fork definition and boilerplate - #9505

Merged
nflaig merged 30 commits into
unstablefrom
nc/heze-boilerplate
Aug 5, 2026
Merged

feat: add heze fork definition and boilerplate#9505
nflaig merged 30 commits into
unstablefrom
nc/heze-boilerplate

Conversation

@ensi321

@ensi321 ensi321 commented Jun 11, 2026

Copy link
Copy Markdown
Member

No description provided.

ensi321 added 4 commits June 10, 2026 21:02
Scaffold the heze fork (post-gloas) as a gloas-copy plus the EIP-7805
inclusion-list data model: IL containers (InclusionList,
SignedInclusionList, committee/request), ExecutionPayloadBid extended
with inclusionListBits, and the modified BeaconState/Body/PayloadAttributes.

Wires fork registration (params, config, forkConfig, ssz/type maps),
upgradeStateToHeze, IBeaconStateViewHeze, and fork-specific bid signing
root/storage and genesis fork versions so the bid type round-trips
correctly. Enables heze spec tests (skipping the FOCIL fork-choice
scenarios shared with gloas pending #9233) and validates heze config
fields against the spec.

Excludes FOCIL feature logic (inclusion-list pools, validation, gossip,
reqresp, duties) which remains on the focil branch.
Move heze constants/presets after gloas to match fork sequence, validate
the heze fork version, inclusion-list config and committee-size values
against the remote spec (ensure-config-is-synced), and wire ethspecify
sources for the heze constant/preset/config references so they are no
longer skipped.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces the initial types, configurations, and state transition logic for the upcoming 'Heze' hard fork (EIP-7805), which implements inclusion lists. It adds Heze-specific parameters to the mainnet and minimal configurations, defines SSZ types (such as InclusionList and modified BeaconState), implements the state upgrade logic (upgradeStateToHeze), and updates spec references. However, two issues were identified: first, removing unimplemented Heze fields (VIEW_FREEZE_CUTOFF_BPS, INCLUSION_LIST_SUBMISSION_DUE_BPS, and PROPOSER_INCLUSION_LIST_CUTOFF_BPS) from the ignored remote config list in ensure-config-is-synced.test.ts will cause configuration sync tests to fail; second, a biome ignore comment is required directly preceding case ForkName.heze: in utils.ts to prevent lint/build failures from the switch-case fallthrough.

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/config/test/e2e/ensure-config-is-synced.test.ts
Comment thread packages/state-transition/src/lightClient/spec/utils.ts
@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: a5f7fcf Previous: 3eb64f9 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.0745 ms/op 923.30 us/op 1.16
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 40.930 us/op 40.108 us/op 1.02
BLS verify - blst 662.34 us/op 665.84 us/op 0.99
BLS verifyMultipleSignatures 3 - blst 1.3610 ms/op 1.3881 ms/op 0.98
BLS verifyMultipleSignatures 8 - blst 2.1620 ms/op 2.2171 ms/op 0.98
BLS verifyMultipleSignatures 32 - blst 6.8327 ms/op 7.0650 ms/op 0.97
BLS verifyMultipleSignatures 64 - blst 12.991 ms/op 14.117 ms/op 0.92
BLS verifyMultipleSignatures 128 - blst 25.236 ms/op 26.948 ms/op 0.94
BLS deserializing 10000 signatures 642.26 ms/op 656.06 ms/op 0.98
BLS deserializing 100000 signatures 6.4360 s/op 6.5042 s/op 0.99
BLS verifyMultipleSignatures - same message - 3 - blst 765.45 us/op 787.05 us/op 0.97
BLS verifyMultipleSignatures - same message - 8 - blst 828.77 us/op 938.14 us/op 0.88
BLS verifyMultipleSignatures - same message - 32 - blst 1.4625 ms/op 1.5833 ms/op 0.92
BLS verifyMultipleSignatures - same message - 64 - blst 2.3560 ms/op 2.4771 ms/op 0.95
BLS verifyMultipleSignatures - same message - 128 - blst 3.9713 ms/op 4.1372 ms/op 0.96
BLS aggregatePubkeys 32 - blst 17.474 us/op 17.849 us/op 0.98
BLS aggregatePubkeys 128 - blst 62.666 us/op 63.667 us/op 0.98
getSlashingsAndExits - default max 48.618 us/op 51.004 us/op 0.95
getSlashingsAndExits - 2k 469.90 us/op 359.96 us/op 1.31
proposeBlockBody type=full, size=empty 739.01 us/op 851.41 us/op 0.87
isKnown best case - 1 super set check 186.00 ns/op 180.00 ns/op 1.03
isKnown normal case - 2 super set checks 160.00 ns/op 176.00 ns/op 0.91
isKnown worse case - 16 super set checks 163.00 ns/op 178.00 ns/op 0.92
validate api signedAggregateAndProof - struct 1.5328 ms/op 1.5497 ms/op 0.99
validate gossip signedAggregateAndProof - struct 1.5210 ms/op 1.5402 ms/op 0.99
batch validate gossip attestation - vc 640000 - chunk 32 115.10 us/op 110.37 us/op 1.04
batch validate gossip attestation - vc 640000 - chunk 64 100.33 us/op 97.974 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 128 96.205 us/op 91.630 us/op 1.05
batch validate gossip attestation - vc 640000 - chunk 256 91.423 us/op 93.364 us/op 0.98
bytes32 toHexString 297.00 ns/op 317.00 ns/op 0.94
bytes32 Buffer.toString(hex) 173.00 ns/op 176.00 ns/op 0.98
bytes32 Buffer.toString(hex) from Uint8Array 230.00 ns/op 246.00 ns/op 0.93
bytes32 Buffer.toString(hex) + 0x 171.00 ns/op 178.00 ns/op 0.96
Return object 10000 times 0.21310 ns/op 0.22010 ns/op 0.97
Throw Error 10000 times 3.3175 us/op 3.8929 us/op 0.85
toHex 94.627 ns/op 118.04 ns/op 0.80
Buffer.from 88.955 ns/op 100.31 ns/op 0.89
shared Buffer 58.165 ns/op 68.922 ns/op 0.84
fastMsgIdFn sha256 / 200 bytes 1.4850 us/op 1.5190 us/op 0.98
fastMsgIdFn h32 xxhash / 200 bytes 151.00 ns/op 164.00 ns/op 0.92
fastMsgIdFn h64 xxhash / 200 bytes 205.00 ns/op 214.00 ns/op 0.96
fastMsgIdFn sha256 / 1000 bytes 4.7660 us/op 4.8710 us/op 0.98
fastMsgIdFn h32 xxhash / 1000 bytes 245.00 ns/op 255.00 ns/op 0.96
fastMsgIdFn h64 xxhash / 1000 bytes 253.00 ns/op 264.00 ns/op 0.96
fastMsgIdFn sha256 / 10000 bytes 41.669 us/op 43.008 us/op 0.97
fastMsgIdFn h32 xxhash / 10000 bytes 1.3540 us/op 1.3220 us/op 1.02
fastMsgIdFn h64 xxhash / 10000 bytes 901.00 ns/op 856.00 ns/op 1.05
send data - 1000 256B messages 5.1440 ms/op 4.3891 ms/op 1.17
send data - 1000 512B messages 7.2965 ms/op 5.3849 ms/op 1.35
send data - 1000 1024B messages 7.1380 ms/op 6.3793 ms/op 1.12
send data - 1000 1200B messages 8.1308 ms/op 7.3139 ms/op 1.11
send data - 1000 2048B messages 15.346 ms/op 9.4921 ms/op 1.62
send data - 1000 4096B messages 120.88 ms/op 81.556 ms/op 1.48
send data - 1000 16384B messages 415.76 ms/op 357.53 ms/op 1.16
send data - 1000 65536B messages 2.1664 s/op 999.89 ms/op 2.17
enrSubnets - fastDeserialize 64 bits 751.00 ns/op 827.00 ns/op 0.91
enrSubnets - ssz BitVector 64 bits 251.00 ns/op 264.00 ns/op 0.95
enrSubnets - fastDeserialize 4 bits 103.00 ns/op 114.00 ns/op 0.90
enrSubnets - ssz BitVector 4 bits 255.00 ns/op 271.00 ns/op 0.94
prioritizePeers score -10:0 att 32-0.1 sync 2-0 203.79 us/op 213.78 us/op 0.95
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 233.55 us/op 240.01 us/op 0.97
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 393.88 us/op 349.55 us/op 1.13
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 648.02 us/op 614.53 us/op 1.05
prioritizePeers score 0:0 att 64-1 sync 4-1 816.82 us/op 704.34 us/op 1.16
array of 16000 items push then shift 1.2650 us/op 1.3287 us/op 0.95
LinkedList of 16000 items push then shift 9.3900 ns/op 7.8850 ns/op 1.19
array of 16000 items push then pop 70.794 ns/op 77.594 ns/op 0.91
LinkedList of 16000 items push then pop 7.0390 ns/op 6.2540 ns/op 1.13
array of 24000 items push then shift 1.8587 us/op 1.9610 us/op 0.95
LinkedList of 24000 items push then shift 8.4360 ns/op 7.0070 ns/op 1.20
array of 24000 items push then pop 100.77 ns/op 106.93 ns/op 0.94
LinkedList of 24000 items push then pop 6.6840 ns/op 6.1770 ns/op 1.08
intersect bitArray bitLen 8 3.8600 ns/op 3.9800 ns/op 0.97
intersect array and set length 8 30.417 ns/op 30.005 ns/op 1.01
intersect bitArray bitLen 128 28.805 ns/op 23.927 ns/op 1.20
intersect array and set length 128 527.19 ns/op 511.41 ns/op 1.03
bitArray.getTrueBitIndexes() bitLen 128 993.00 ns/op 958.00 ns/op 1.04
bitArray.getTrueBitIndexes() bitLen 248 1.8380 us/op 1.7300 us/op 1.06
bitArray.getTrueBitIndexes() bitLen 512 3.8230 us/op 3.6860 us/op 1.04
Full columns - reconstruct all 6 blobs 187.07 us/op 171.99 us/op 1.09
Full columns - reconstruct half of the blobs out of 6 72.757 us/op 77.028 us/op 0.94
Full columns - reconstruct single blob out of 6 38.568 us/op 35.274 us/op 1.09
Half columns - reconstruct all 6 blobs 398.17 ms/op 403.70 ms/op 0.99
Half columns - reconstruct half of the blobs out of 6 197.49 ms/op 203.94 ms/op 0.97
Half columns - reconstruct single blob out of 6 70.564 ms/op 73.566 ms/op 0.96
Set add up to 64 items then delete first 1.6137 us/op 1.6767 us/op 0.96
OrderedSet add up to 64 items then delete first 2.4566 us/op 2.5484 us/op 0.96
Set add up to 64 items then delete last 1.8145 us/op 1.8729 us/op 0.97
OrderedSet add up to 64 items then delete last 2.7436 us/op 2.8249 us/op 0.97
Set add up to 64 items then delete middle 1.8403 us/op 1.8851 us/op 0.98
OrderedSet add up to 64 items then delete middle 4.2299 us/op 4.3542 us/op 0.97
Set add up to 128 items then delete first 3.6782 us/op 3.7657 us/op 0.98
OrderedSet add up to 128 items then delete first 5.5295 us/op 5.8143 us/op 0.95
Set add up to 128 items then delete last 3.4760 us/op 3.5866 us/op 0.97
OrderedSet add up to 128 items then delete last 5.2481 us/op 5.7059 us/op 0.92
Set add up to 128 items then delete middle 3.5604 us/op 3.6225 us/op 0.98
OrderedSet add up to 128 items then delete middle 11.122 us/op 11.493 us/op 0.97
Set add up to 256 items then delete first 7.1152 us/op 7.4116 us/op 0.96
OrderedSet add up to 256 items then delete first 11.843 us/op 11.908 us/op 0.99
Set add up to 256 items then delete last 7.2523 us/op 7.4326 us/op 0.98
OrderedSet add up to 256 items then delete last 11.272 us/op 11.252 us/op 1.00
Set add up to 256 items then delete middle 7.2111 us/op 7.3868 us/op 0.98
OrderedSet add up to 256 items then delete middle 34.322 us/op 35.630 us/op 0.96
runFastConfirmationRules vc:100000 bc:96 eq:0 4.3905 ms/op 4.9015 ms/op 0.90
runFastConfirmationRules vc:600000 bc:96 eq:0 35.698 ms/op 35.519 ms/op 1.01
runFastConfirmationRules vc:1000000 bc:96 eq:0 59.707 ms/op 59.758 ms/op 1.00
runFastConfirmationRules vc:600000 bc:320 eq:0 35.945 ms/op 35.764 ms/op 1.01
runFastConfirmationRules vc:100000 bc:96 eq:1000 1.1139 s/op 1.1580 s/op 0.96
pass gossip attestations to forkchoice per slot 2.5514 ms/op 2.6801 ms/op 0.95
forkChoice updateHead vc 100000 bc 64 eq 0 398.62 us/op 418.85 us/op 0.95
forkChoice updateHead vc 600000 bc 64 eq 0 2.4201 ms/op 2.4917 ms/op 0.97
forkChoice updateHead vc 1000000 bc 64 eq 0 4.0450 ms/op 4.1326 ms/op 0.98
forkChoice updateHead vc 600000 bc 320 eq 0 2.4667 ms/op 2.4941 ms/op 0.99
forkChoice updateHead vc 600000 bc 1200 eq 0 2.6643 ms/op 2.5355 ms/op 1.05
forkChoice updateHead vc 600000 bc 7200 eq 0 4.2456 ms/op 2.8692 ms/op 1.48
forkChoice updateHead vc 600000 bc 64 eq 1000 2.5130 ms/op 2.4754 ms/op 1.02
forkChoice updateHead vc 600000 bc 64 eq 10000 2.5800 ms/op 2.5675 ms/op 1.00
forkChoice updateHead vc 600000 bc 64 eq 300000 6.5678 ms/op 6.7365 ms/op 0.97
computeDeltas 1400000 validators 0% inactive 12.405 ms/op 12.246 ms/op 1.01
computeDeltas 1400000 validators 10% inactive 11.719 ms/op 11.619 ms/op 1.01
computeDeltas 1400000 validators 20% inactive 10.964 ms/op 10.959 ms/op 1.00
computeDeltas 1400000 validators 50% inactive 9.3099 ms/op 8.9895 ms/op 1.04
computeDeltas 2100000 validators 0% inactive 18.379 ms/op 18.429 ms/op 1.00
computeDeltas 2100000 validators 10% inactive 17.780 ms/op 17.469 ms/op 1.02
computeDeltas 2100000 validators 20% inactive 16.562 ms/op 16.451 ms/op 1.01
computeDeltas 2100000 validators 50% inactive 10.785 ms/op 10.980 ms/op 0.98
altair processAttestation - 250000 vs - 7PWei normalcase 2.5015 ms/op 1.8707 ms/op 1.34
altair processAttestation - 250000 vs - 7PWei worstcase 3.2991 ms/op 2.5338 ms/op 1.30
altair processAttestation - setStatus - 1/6 committees join 113.77 us/op 107.87 us/op 1.05
altair processAttestation - setStatus - 1/3 committees join 237.96 us/op 210.13 us/op 1.13
altair processAttestation - setStatus - 1/2 committees join 338.43 us/op 298.72 us/op 1.13
altair processAttestation - setStatus - 2/3 committees join 458.15 us/op 379.04 us/op 1.21
altair processAttestation - setStatus - 4/5 committees join 527.35 us/op 530.30 us/op 0.99
altair processAttestation - setStatus - 100% committees join 616.80 us/op 679.40 us/op 0.91
altair processBlock - 250000 vs - 7PWei normalcase 3.9389 ms/op 3.5968 ms/op 1.10
altair processBlock - 250000 vs - 7PWei normalcase hashState 16.137 ms/op 15.405 ms/op 1.05
altair processBlock - 250000 vs - 7PWei worstcase 21.046 ms/op 23.362 ms/op 0.90
altair processBlock - 250000 vs - 7PWei worstcase hashState 42.817 ms/op 40.400 ms/op 1.06
phase0 processBlock - 250000 vs - 7PWei normalcase 1.3108 ms/op 1.5590 ms/op 0.84
phase0 processBlock - 250000 vs - 7PWei worstcase 16.339 ms/op 18.273 ms/op 0.89
altair processEth1Data - 250000 vs - 7PWei normalcase 278.70 us/op 294.33 us/op 0.95
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:16 3.0770 us/op 3.4090 us/op 0.90
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:220 18.446 us/op 19.750 us/op 0.93
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:43 5.4300 us/op 5.7660 us/op 0.94
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:19 3.4220 us/op 4.7740 us/op 0.72
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1021 83.918 us/op 89.828 us/op 0.93
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11778 1.2874 ms/op 1.4040 ms/op 0.92
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 1.7270 ms/op 1.8394 ms/op 0.94
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 1.6961 ms/op 1.8479 ms/op 0.92
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 3.4379 ms/op 3.8314 ms/op 0.90
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 1.9660 ms/op 2.1407 ms/op 0.92
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 3.6843 ms/op 4.0289 ms/op 0.91
Tree 40 250000 create 294.63 ms/op 339.93 ms/op 0.87
Tree 40 250000 get(125000) 86.292 ns/op 95.335 ns/op 0.91
Tree 40 250000 set(125000) 936.64 ns/op 1.0100 us/op 0.93
Tree 40 250000 toArray() 12.438 ms/op 12.730 ms/op 0.98
Tree 40 250000 iterate all - toArray() + loop 12.722 ms/op 11.095 ms/op 1.15
Tree 40 250000 iterate all - get(i) 36.518 ms/op 36.305 ms/op 1.01
Array 250000 create 2.0378 ms/op 2.4354 ms/op 0.84
Array 250000 clone - spread 631.82 us/op 758.22 us/op 0.83
Array 250000 get(125000) 0.28200 ns/op 0.29700 ns/op 0.95
Array 250000 set(125000) 0.28400 ns/op 0.30300 ns/op 0.94
Array 250000 iterate all - loop 54.555 us/op 57.818 us/op 0.94
phase0 afterProcessEpoch - 250000 vs - 7PWei 38.604 ms/op 40.232 ms/op 0.96
Array.fill - length 1000000 1.8895 ms/op 2.3823 ms/op 0.79
Array push - length 1000000 6.9115 ms/op 8.2591 ms/op 0.84
Array.get 0.20208 ns/op 0.20976 ns/op 0.96
Uint8Array.get 0.22955 ns/op 0.23415 ns/op 0.98
phase0 beforeProcessEpoch - 250000 vs - 7PWei 14.365 ms/op 26.902 ms/op 0.53
altair processEpoch - mainnet_e81889 260.75 ms/op 271.06 ms/op 0.96
mainnet_e81889 - altair beforeProcessEpoch 14.919 ms/op 14.933 ms/op 1.00
mainnet_e81889 - altair processJustificationAndFinalization 5.8270 us/op 6.2270 us/op 0.94
mainnet_e81889 - altair processInactivityUpdates 3.7631 ms/op 3.7294 ms/op 1.01
mainnet_e81889 - altair processRewardsAndPenalties 18.598 ms/op 21.931 ms/op 0.85
mainnet_e81889 - altair processRegistryUpdates 535.00 ns/op 604.00 ns/op 0.89
mainnet_e81889 - altair processSlashings 137.00 ns/op 148.00 ns/op 0.93
mainnet_e81889 - altair processEth1DataReset 133.00 ns/op 141.00 ns/op 0.94
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.5204 ms/op 1.7319 ms/op 0.88
mainnet_e81889 - altair processSlashingsReset 686.00 ns/op 719.00 ns/op 0.95
mainnet_e81889 - altair processRandaoMixesReset 1.0530 us/op 1.1730 us/op 0.90
mainnet_e81889 - altair processHistoricalRootsUpdate 135.00 ns/op 147.00 ns/op 0.92
mainnet_e81889 - altair processParticipationFlagUpdates 433.00 ns/op 517.00 ns/op 0.84
mainnet_e81889 - altair processSyncCommitteeUpdates 111.00 ns/op 118.00 ns/op 0.94
mainnet_e81889 - altair afterProcessEpoch 40.291 ms/op 44.082 ms/op 0.91
capella processEpoch - mainnet_e217614 816.48 ms/op 842.93 ms/op 0.97
mainnet_e217614 - capella beforeProcessEpoch 60.898 ms/op 76.029 ms/op 0.80
mainnet_e217614 - capella processJustificationAndFinalization 6.2170 us/op 6.4140 us/op 0.97
mainnet_e217614 - capella processInactivityUpdates 14.835 ms/op 19.074 ms/op 0.78
mainnet_e217614 - capella processRewardsAndPenalties 89.564 ms/op 92.609 ms/op 0.97
mainnet_e217614 - capella processRegistryUpdates 4.4340 us/op 4.5250 us/op 0.98
mainnet_e217614 - capella processSlashings 140.00 ns/op 143.00 ns/op 0.98
mainnet_e217614 - capella processEth1DataReset 137.00 ns/op 142.00 ns/op 0.96
mainnet_e217614 - capella processEffectiveBalanceUpdates 17.004 ms/op 15.833 ms/op 1.07
mainnet_e217614 - capella processSlashingsReset 678.00 ns/op 705.00 ns/op 0.96
mainnet_e217614 - capella processRandaoMixesReset 1.3770 us/op 1.2700 us/op 1.08
mainnet_e217614 - capella processHistoricalRootsUpdate 139.00 ns/op 142.00 ns/op 0.98
mainnet_e217614 - capella processParticipationFlagUpdates 452.00 ns/op 489.00 ns/op 0.92
mainnet_e217614 - capella afterProcessEpoch 107.92 ms/op 112.63 ms/op 0.96
phase0 processEpoch - mainnet_e58758 366.18 ms/op 309.16 ms/op 1.18
mainnet_e58758 - phase0 beforeProcessEpoch 81.478 ms/op 74.491 ms/op 1.09
mainnet_e58758 - phase0 processJustificationAndFinalization 6.6480 us/op 6.8610 us/op 0.97
mainnet_e58758 - phase0 processRewardsAndPenalties 16.546 ms/op 17.140 ms/op 0.97
mainnet_e58758 - phase0 processRegistryUpdates 2.3110 us/op 2.3360 us/op 0.99
mainnet_e58758 - phase0 processSlashings 140.00 ns/op 153.00 ns/op 0.92
mainnet_e58758 - phase0 processEth1DataReset 259.00 ns/op 152.00 ns/op 1.70
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 821.28 us/op 845.26 us/op 0.97
mainnet_e58758 - phase0 processSlashingsReset 1000.0 ns/op 938.00 ns/op 1.07
mainnet_e58758 - phase0 processRandaoMixesReset 1.4710 us/op 1.1800 us/op 1.25
mainnet_e58758 - phase0 processHistoricalRootsUpdate 136.00 ns/op 155.00 ns/op 0.88
mainnet_e58758 - phase0 processParticipationRecordUpdates 1.4240 us/op 1.1940 us/op 1.19
mainnet_e58758 - phase0 afterProcessEpoch 34.568 ms/op 34.129 ms/op 1.01
phase0 processEffectiveBalanceUpdates - 250000 normalcase 997.53 us/op 1.1644 ms/op 0.86
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 3.3121 ms/op 1.6971 ms/op 1.95
altair processInactivityUpdates - 250000 normalcase 13.300 ms/op 10.994 ms/op 1.21
altair processInactivityUpdates - 250000 worstcase 14.907 ms/op 12.273 ms/op 1.21
phase0 processRegistryUpdates - 250000 normalcase 3.7320 us/op 3.2350 us/op 1.15
phase0 processRegistryUpdates - 250000 badcase_full_deposits 176.25 us/op 146.82 us/op 1.20
phase0 processRegistryUpdates - 250000 worstcase 0.5 72.597 ms/op 64.172 ms/op 1.13
altair processRewardsAndPenalties - 250000 normalcase 17.332 ms/op 14.143 ms/op 1.23
altair processRewardsAndPenalties - 250000 worstcase 17.293 ms/op 16.946 ms/op 1.02
phase0 getAttestationDeltas - 250000 normalcase 5.4957 ms/op 5.8138 ms/op 0.95
phase0 getAttestationDeltas - 250000 worstcase 5.6372 ms/op 5.7999 ms/op 0.97
phase0 processSlashings - 250000 worstcase 64.888 us/op 65.939 us/op 0.98
altair processSyncCommitteeUpdates - 250000 12.382 ms/op 11.424 ms/op 1.08
BeaconState.hashTreeRoot - No change 172.00 ns/op 185.00 ns/op 0.93
BeaconState.hashTreeRoot - 1 full validator 83.794 us/op 85.451 us/op 0.98
BeaconState.hashTreeRoot - 32 full validator 908.16 us/op 1.0527 ms/op 0.86
BeaconState.hashTreeRoot - 512 full validator 8.8347 ms/op 9.7697 ms/op 0.90
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 111.45 us/op 100.03 us/op 1.11
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.5539 ms/op 1.4438 ms/op 1.08
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 20.263 ms/op 19.800 ms/op 1.02
BeaconState.hashTreeRoot - 1 balances 80.953 us/op 89.904 us/op 0.90
BeaconState.hashTreeRoot - 32 balances 808.41 us/op 793.25 us/op 1.02
BeaconState.hashTreeRoot - 512 balances 6.1142 ms/op 7.7206 ms/op 0.79
BeaconState.hashTreeRoot - 250000 balances 146.19 ms/op 159.99 ms/op 0.91
aggregationBits - 2048 els - zipIndexesInBitList 19.863 us/op 20.605 us/op 0.96
regular array get 100000 times 23.166 us/op 23.557 us/op 0.98
wrappedArray get 100000 times 23.151 us/op 23.277 us/op 0.99
arrayWithProxy get 100000 times 10.597 ms/op 9.9571 ms/op 1.06
ssz.Root.equals 21.303 ns/op 21.995 ns/op 0.97
byteArrayEquals 21.014 ns/op 21.804 ns/op 0.96
Buffer.compare 8.6770 ns/op 9.0540 ns/op 0.96
processSlot - 1 slots 10.127 us/op 8.8420 us/op 1.15
processSlot - 32 slots 2.1640 ms/op 2.0970 ms/op 1.03
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 4.7971 ms/op 5.4549 ms/op 0.88
getCommitteeAssignments - req 1 vs - 250000 vc 1.6261 ms/op 1.7108 ms/op 0.95
getCommitteeAssignments - req 100 vs - 250000 vc 3.3838 ms/op 3.5246 ms/op 0.96
getCommitteeAssignments - req 1000 vs - 250000 vc 3.5708 ms/op 3.7726 ms/op 0.95
findModifiedValidators - 10000 modified validators 688.32 ms/op 866.75 ms/op 0.79
findModifiedValidators - 1000 modified validators 469.12 ms/op 791.80 ms/op 0.59
findModifiedValidators - 100 modified validators 369.61 ms/op 462.71 ms/op 0.80
findModifiedValidators - 10 modified validators 273.73 ms/op 254.84 ms/op 1.07
findModifiedValidators - 1 modified validators 162.06 ms/op 231.80 ms/op 0.70
findModifiedValidators - no difference 154.90 ms/op 298.88 ms/op 0.52
migrate state 1500000 validators, 3400 modified, 2000 new 3.0469 s/op 3.1629 s/op 0.96
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 3.6400 ns/op 3.7000 ns/op 0.98
state getBlockRootAtSlot - 250000 vs - 7PWei 392.12 ns/op 299.48 ns/op 1.31
computeProposerIndex 100000 validators 1.3105 ms/op 1.3948 ms/op 0.94
getNextSyncCommitteeIndices 1000 validators 2.8210 ms/op 2.9331 ms/op 0.96
getNextSyncCommitteeIndices 10000 validators 24.644 ms/op 26.354 ms/op 0.94
getNextSyncCommitteeIndices 100000 validators 83.426 ms/op 92.282 ms/op 0.90
computeProposers - vc 250000 549.18 us/op 578.91 us/op 0.95
computeEpochShuffling - vc 250000 39.570 ms/op 40.899 ms/op 0.97
getNextSyncCommittee - vc 250000 10.460 ms/op 9.6083 ms/op 1.09
nodejs block root to RootHex using toHex 97.006 ns/op 108.36 ns/op 0.90
nodejs block root to RootHex using toRootHex 61.105 ns/op 67.375 ns/op 0.91
nodejs fromHex(blob) 894.68 us/op 787.82 us/op 1.14
nodejs fromHexInto(blob) 616.60 us/op 639.44 us/op 0.96
nodejs block root to RootHex using the deprecated toHexString 424.48 ns/op 459.62 ns/op 0.92
nodejs byteArrayEquals 32 bytes (block root) 25.157 ns/op 26.282 ns/op 0.96
nodejs byteArrayEquals 48 bytes (pubkey) 36.051 ns/op 38.133 ns/op 0.95
nodejs byteArrayEquals 96 bytes (signature) 33.397 ns/op 35.311 ns/op 0.95
nodejs byteArrayEquals 1024 bytes 40.520 ns/op 43.395 ns/op 0.93
nodejs byteArrayEquals 131072 bytes (blob) 1.6809 us/op 1.7812 us/op 0.94
browser block root to RootHex using toHex 138.45 ns/op 146.48 ns/op 0.95
browser block root to RootHex using toRootHex 125.54 ns/op 132.10 ns/op 0.95
browser fromHex(blob) 1.5551 ms/op 1.6959 ms/op 0.92
browser fromHexInto(blob) 601.66 us/op 643.71 us/op 0.93
browser block root to RootHex using the deprecated toHexString 444.72 ns/op 328.50 ns/op 1.35
browser byteArrayEquals 32 bytes (block root) 27.392 ns/op 28.519 ns/op 0.96
browser byteArrayEquals 48 bytes (pubkey) 38.687 ns/op 40.341 ns/op 0.96
browser byteArrayEquals 96 bytes (signature) 72.744 ns/op 75.913 ns/op 0.96
browser byteArrayEquals 1024 bytes 748.38 ns/op 772.42 ns/op 0.97
browser byteArrayEquals 131072 bytes (blob) 94.973 us/op 98.096 us/op 0.97

by benchmarkbot/action

ensi321 added 2 commits June 10, 2026 23:25
…snapshot

Add DOMAIN_INCLUSION_LIST_COMMITTEE to the config API specConstants so the
e2e config test (which scans heze spec docs) sees it exposed, and refresh
the forkName snapshot to include heze (shared by the browser test via the
test/browser -> ./unit symlink).
@ensi321
ensi321 marked this pull request as ready for review June 15, 2026 22:47
@ensi321
ensi321 requested a review from a team as a code owner June 15, 2026 22:47

@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: 9f70a38ca9

ℹ️ 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/types/src/heze/sszTypes.ts Outdated
Comment thread packages/types/src/heze/sszTypes.ts
@nflaig

nflaig commented Jun 22, 2026

Copy link
Copy Markdown
Member

@ensi321 can you address bot comments please

ensi321 and others added 2 commits June 22, 2026 15:02
- getGossipSSZType: dispatch SignedExecutionPayloadBid via sszTypesFor(fork)
  so heze bids include inclusionListBits instead of being decoded as gloas
  and rejected as invalid serialized bytes.
- preparePayloadAttributes: set inclusionListTransactions to an empty list
  post-heze so the heze SSEPayloadAttributes container can be serialized.
  Aggregation pool wiring lands with the focil feature (TODO HEZE).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Resolve conflicts:
- params/index.ts: keep both DOMAIN_BUILDER_DEPOSIT (gloas, 0x0E) and
  DOMAIN_INCLUSION_LIST_COMMITTEE (heze); fix heze domain 14 -> 16 (0x10) to
  match spec (both had collided on 14). Keep both request-type + committee-size
  consts.
- api config constants.ts: export both gloas builder-deposit consts and heze
  DOMAIN_INCLUSION_LIST_COMMITTEE.
- processExecutionPayloadBid.ts: merge imports; drop unused ForkPostGloas and
  BeaconBlock.
@nflaig

nflaig commented Jul 8, 2026

Copy link
Copy Markdown
Member

seems like spec tests are failing

nflaig and others added 2 commits July 8, 2026 15:26
Match spec-tests v1.7.0-alpha.11, where the IL bitlist was removed from
the bid (consensus-specs #5371). It is re-added post-alpha.11 (#5410);
that change will land on the alpha.12 branch instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@nflaig nflaig 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 might wanna wait until alpha.12 since inclusion_list_bits will be there again

Comment thread packages/config/src/chainConfig/configs/mainnet.ts Outdated
Comment thread packages/config/src/chainConfig/configs/minimal.ts Outdated
Comment thread packages/config/src/chainConfig/types.ts Outdated
Comment thread packages/state-transition/src/block/processExecutionPayloadBid.ts
Comment thread packages/state-transition/src/signatureSets/executionPayloadBid.ts Outdated
Comment thread packages/types/src/heze/sszTypes.ts Outdated
Comment thread packages/types/src/heze/sszTypes.ts
Comment thread packages/types/src/heze/sszTypes.ts Outdated
ensi321 and others added 2 commits July 8, 2026 21:37
This reverts commit bdafb91.

inclusion_list_bits is re-added to the bid post-alpha.11 (consensus-specs
#5410), so removing it was a regression against the latest spec. Add the
Bitvector[INCLUSION_LIST_COMMITTEE_SIZE] field back and wait for the
alpha.12 spec-tests, where the field is present again.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Drop spurious `(EIP-7805)` from HEZE config comments to match the
  style of other forks
- Remove heze redefinitions of ExecutionPayload, ExecutionPayloadHeader
  and the blinded block types: heze does not modify them per the
  alpha.12 spec, so inherit them from gloas/deneb/electra via the fork
  type registry (mirrors gloas, which defines none of these)
- Type getExecutionPayloadBidSigningRoot's bid param with the top-level
  ExecutionPayloadBid instead of a gloas|heze union
- Drop the `as unknown` double cast in processExecutionPayloadBid by
  widening through CachedBeaconStateAllForks

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ensi321
ensi321 marked this pull request as draft July 9, 2026 05:08
@ensi321

ensi321 commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

wait for #9606 to be merged.

@wemeetagain

Copy link
Copy Markdown
Member

wait for #9606 to be merged.

looks ready now

ensi321 and others added 3 commits July 24, 2026 17:47
- heze SSZ types now use ProgressiveContainerType (ExecutionPayloadBid 13 active
  fields, BeaconState 46) and ProgressiveList for inclusion list transactions
- move INCLUSION_LIST_COMMITTEE_SIZE from ChainConfig to BeaconPreset and add
  MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE_HEZE / MAX_SIGNED_INCLUSION_LIST_SIZE
- align heze TypesByFork entries with gloas (light client + attestation types)
- run heze spec test suites; skip eip8148 fork vector, heze FCR and PTC/FOCIL
  fork choice handlers matching existing gloas skips
- check name-based spec test skips before input deserialization so cross-fork
  vectors that cannot be parsed can be skipped

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Note: the eip8148 upgrade vector (fork_base_state) is generated under
heze/fork because eip8148 is not a testgen fork, so it is not covered by
skippedForks and currently fails. To be investigated separately.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ensi321
ensi321 marked this pull request as ready for review July 25, 2026 01:32

@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: aa4505cc19

ℹ️ 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/network/gossip/topic.ts
Comment thread packages/types/src/heze/sszTypes.ts
ensi321 added 4 commits July 27, 2026 19:03
# Conflicts:
#	packages/beacon-node/test/spec/presets/fast_confirmation.test.ts
Gloas block production (#9595) returns `BlockContents` containing the
execution payload envelope for the stateless self-build flow. Heze was
still mapped to `fulu.BlockContents`, which has no envelope and carries
a fulu block, so produceBlockV4 would have serialized the wrong shape at
the heze boundary.
The heze preset raises MAX_SIGNED_EXECUTION_PAYLOAD_BID_SIZE from 196932
to 196934 to cover the new inclusion_list_bits field. Without selecting
the heze bound, valid bids in those last two bytes are rejected before
deserialization.
The heze block body requires a heze SignedExecutionPayloadBid, so the
self-build path must initialize inclusionListBits or hashing/serializing
the produced block reads an undefined bitvector.
@matthewkeil matthewkeil moved this from Backlog to Ready in Lodestar Team Coordination Jul 30, 2026
ensi321 added 2 commits August 3, 2026 18:25
Conflict resolutions:
- specTestIterator: keep the heze on_payload_attestation_message skip
  alongside unstable's new gloas should_apply_proposer_boost skip
- ensure-config-is-synced: this branch implements the EIP-7805 inclusion
  list params in ChainConfig, so they no longer need to be ignored
- processExecutionPayloadBid: read parentSlot before overwriting the bid
  (#5473) while keeping the heze ExecutionPayloadBid type branch
- .ethspecify.yml: heze configs are wired to sources on this branch, so
  drop them from the "not implemented" ignore list
Most of the alpha.12 -> alpha.13 heze delta is cosmetic in the spec
(uint64 -> Uint64, Bitvector -> BitVector). The functional changes:

- Add MIN_SLOTS_FOR_INCLUSION_LISTS_REQUESTS (= 1), a new inclusion list
  req/resp serving window param. Marked non-critical in assertEqualParams
  to match the other MIN_EPOCHS_FOR_*_REQUESTS / MAX_REQUEST_* params.
- Rename InclusionListByCommitteeIndices -> InclusionListsByIndices and
  add the inclusion_list_committee_root field to the request, renaming
  committee_indices to indices.
- Point heze spec reference URLs at v1.7.0-alpha.13.
- Unskip heze/fork/fork/pyspec_tests: the broken eip8148 upgrade vector
  was removed upstream in consensus-specs#5440 and alpha.13 adds real
  heze fork test vectors, which pass.
- Skip heze/fork_choice/should_apply_proposer_boost alongside the gloas
  suite; the generator emits heze vectors too and Lodestar still applies
  the pre-gloas proposer boost.

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

Reviewed this and opened a stacked fix in #9763.

What I found/fixed there:

  • Heze PayloadAttributes and upgrade_to_heze were implemented but still listed as unimplemented in specrefs.
  • The generated mainnet gloas/heze sanity/slots/historical_accumulator cases pass but exceed the current 30s timeout, which reproduces the failing CI job.
  • Heze inclusionListTransactions was populated by block production but dropped during engine payload-attributes RPC serialization.
  • The stale /heze_fork skip is removed; the current Heze fork-upgrade vectors pass with SPEC_FILTER_FORK=heze.

I do not think the remaining zeroed FOCIL placeholders need to block this boilerplate PR while Heze is disabled by default and FOCIL suites are explicitly skipped. They should block any PR that actually enables Heze on a live/test network before inclusion-list pool/gossip/fork-choice handling is wired.

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

it's a bit concerning that spec tests take forever, see #9763

Comment thread packages/state-transition/src/block/processExecutionPayloadBid.ts
Comment thread packages/state-transition/src/block/processExecutionPayloadBid.ts
Comment thread packages/state-transition/src/signatureSets/executionPayloadBid.ts Outdated
Comment thread packages/state-transition/src/stateView/interface.ts Outdated
Comment thread packages/state-transition/src/stateView/interface.ts Outdated
Comment thread packages/types/src/heze/sszTypes.ts Outdated
wemeetagain
wemeetagain previously approved these changes Aug 5, 2026
ensi321 added 3 commits August 4, 2026 18:20
gloas and heze take ~23-24s on the mainnet preset versus ~1-6s for every
pre-gloas fork, which is 76-81% of the 30s sanity/slots timeout and a
flake risk on slower runners. The suite steps SLOTS_PER_HISTORICAL_ROOT
(8192) slots and every post-gloas slot writes into the equally wide
executionPayloadAvailability bitvector.

Skipped rather than raising the timeout so the regression stays visible.
Tracked in #9771
- getExecutionPayloadBidSigningRoot: select the bid ssz type via fork-aware
  sszTypesFor() instead of a manual heze/gloas ternary, matching the pattern
  in getGossipSSZType. Keeps the pre-gloas fallback so the "different fork"
  negative test still compares roots rather than throwing.
- IBeaconStateViewHeze: drop the latestExecutionPayloadBid redeclaration.
  IBeaconStateViewGloas already declares it as ExecutionPayloadBid, which
  defaults to the ForkPostGloas union and therefore already covers heze. This
  follows latestExecutionPayloadHeader, declared once at bellatrix as a union
  and never re-narrowed in capella or deneb. Dropping it also removes the
  Omit/re-add of the field in IBeaconStateViewLatestFork, which only existed
  to undo the narrowing.

The interface and isStatePostHeze guard stay: every fork from altair onwards
has both, even when it adds no fields (IBeaconStateViewDeneb is forkName-only
and isStatePostDeneb has no callers).
Match the convention in the other fork type modules: gloas, fulu, electra,
capella and altair carry no consensus-specs URLs in sszTypes.ts. The
[New in Heze:EIP7805] / [Modified in Heze:EIP7805] field markers are kept,
since those mirror the spec annotations and mark what heze actually changes.
Comment thread packages/beacon-node/test/spec/presets/operations.test.ts Outdated
Comment thread packages/state-transition/src/block/processExecutionPayloadBid.ts
Comment thread packages/state-transition/src/signatureSets/executionPayloadBid.ts Outdated
Comment thread packages/state-transition/src/stateView/interface.ts

// Verify that the builder has funds to cover the bid
if (!canBuilderCoverBid(state, builderIndex, amount)) {
if (!canBuilderCoverBid(state as CachedBeaconStateGloas, builderIndex, amount)) {

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.

this is a bit annoying but it's the cleanest and safe type cast

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.

Handled in #9773 now. I refreshed the branch onto current #9505 head d388ac1f, so it preserves your later type-cast cleanup and only keeps the intended change here: widen canBuilderCoverBid / the pending-balance helper to CachedBeaconStateGloas | CachedBeaconStateHeze, then remove this stale Gloas-only cast at the call site.

@nflaig
nflaig merged commit 9be1d27 into unstable Aug 5, 2026
19 checks passed
@nflaig
nflaig deleted the nc/heze-boilerplate branch August 5, 2026 09:32
@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.46.0 🎉

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

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

7 participants