Repository navigation
Conversation
tcoratger
force-pushed
the
feat/eip-8450-hstar
branch
from
October 30, 2026 17:11
fb6b7aa to
9c4397c
Compare
firas9941
approved these changes
Oct 31, 2026
…rk (consensus-specs #5736) onboard_builders_from_pending_deposits now keeps every deposit without a builder withdrawal credential queued, even when a builder holds its pubkey. A valid builder deposit registers a builder even under a validator's pubkey or behind a pending validator deposit. A builder deposit with a bad signature for a new pubkey stays queued only when it can still fund a validator, and is dropped otherwise. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…awals (consensus-specs #5764) Electra's validate_voluntary_exit_gossip ignores an exit while the validator has a pending partial withdrawal, since process_voluntary_exit would reject it. An ignored exit is not recorded as seen, so the validator can exit once the withdrawal is processed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d (consensus-specs #5756) get_slot_component_duration_ms now rounds half up instead of flooring, so 3333 basis points of a 12 s slot is 4000 ms rather than 3999 ms. The validator client's slot clock computes its duty offsets the same way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ble (consensus-specs #5765) Each sampled sidecar's header must now hash to the block root, and its inclusion proof must tie its commitments to that header. Before, sidecars built from unrelated blobs under another block's header made the block available. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (consensus-specs #5767) Fulu's get_data_column_sidecars and gloas's builder version returned NUMBER_OF_COLUMNS empty sidecars for a block without blobs, which every peer rejects. Both now return none. The live publishing paths already skipped sidecar construction for such blocks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…arent choice (consensus-specs #5763) The proposer already decides should_build_on_full for the proposal slot, the slot the head state is advanced to. Only this doc comment still named the wall-clock slot. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EIP-8450 gives every validator and builder a post-quantum key ahead of a signature switch. This puts it in heze, where consensus-specs builds it as the `eip8450` feature on top of heze (ethereum/consensus-specs#5782), following the EIP as revised by ethereum/EIPs#12592 and #12599: - Heze's state appends four lists parallel to the validator and builder registries: each index's key material (a leanXMSS key and a VRF root, zero for builders) and the epoch of its last change. Heze's body appends `pq_key_registrations`. The gloas upgrade into heze fills the lists, and new validators and builders, a reused builder index included, get unset entries. - A registration names a validator or a builder, is authorized by the registrant's BLS key, and carries a leanXMSS proof of possession of the key for that BLS key, at the reserved leaf 0. It may replace registered keys once per MIN_PQ_KEY_CHANGE_DELAY epochs (256, 8 in minimal), and names the change it replaces, which blocks replays. A key any index holds is refused. - Registrations travel as a new operation on the `pq_key_registration` topic, validated in the specification's order on a heze head, pooled per (index, change epoch), packed by heze block production when they apply after the other operations, and submitted through `/eth/v1/beacon/pool/pq_key_registrations` (not yet a Beacon API route). The beacon suite runs the `eip8450` vectors as heze, and lists `heze` (without the registry) as unmodeled. No release ships those vectors yet: `make eip8450-spec-tests` generates them from #5782's pyspec, pinned by commit. DB_VERSION goes to 9, since heze rows change shape. New dependency: lean-pq, the leanXMSS bindings of ethereum/lean-pq-bindings (v0.8.0, pinned by commit). The consensus-specs vectors are generated with py-lean-pq, the Python side of the same bindings, and proofs must verify under exactly that scheme. The `leanvm` pin here carries the lean chain's own XMSS (BLAKE2s, 42 chains, one tree), a different scheme, so it cannot stand in. thiserror moves to 2.0.21, which lean-pq requires, resolved under the 14-day cooldown. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tcoratger
force-pushed
the
feat/eip-8450-hstar
branch
from
November 1, 2026 19:09
9c4397c to
c1bfda7
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🗒️ Description / Motivation
EIP-8450 gives every validator and builder a post-quantum key ahead of a signature switch. This PR puts it in heze, following the EIP as revised by ethereum/EIPs#12592 and #12599, and its consensus-specs PR, ethereum/consensus-specs#5782. That PR builds the registry as the
eip8450feature on top of heze; here it is part of heze itself.This replaces the earlier version of this PR, which added a separate
hstarfork on top of gloas, following the first draft of the EIP. The EIP has since changed a lot:The PR targets
heze-devnet-3, the latest heze devnet: EIP-7805, EIP-8015, EIP-8365 and EIP-8198 (quick slots). Testing the registry alongside the other heze components gives a more faithful picture than testing it alone. It also ports the consensus-specs merges since v1.7.0-beta.4 that touch forks up to heze, one commit each.What Changed
The registry (the last commit)
post_quantum_key_material, each index's leanXMSS key plus VRF root, zero for builders;post_quantum_key_change_epochs, the epoch of each index's last change;Heze's body appends
pq_key_registrations. Eachactive_fieldslayout grows by exactly the appended fields, so every earlier field keeps its generalized index.BeaconState::pq_registry(), which isNonebefore heze, rather than checking the fork.process_pq_key_registrationruns last inprocess_operations, in the spec's order. It checks:previous_change_epochagainst the stored change, which blocks replays;PQKeyPossession{pubkey, key}, at leaf 0.pq_key_registrationtopic, on heze digests only. It is validated as the spec'svalidate_pq_key_registration_gossip, IGNORE/REJECT order included. The first-seen record for a pair (index, change epoch) is judged at its spec position, so a later REJECT still wins over a duplicate.GET/POST /eth/v1/beacon/pool/pq_key_registrationslists and submits registrations. It is not yet a Beacon API route.ethlambda_crypto::lean_xmssverifies through the lean-pq bindings. Nothing in the scheme is reimplemented.Spec catch-ups since v1.7.0-beta.4 (six commits)
is_data_availablebinds column sidecars to the block.Already handled here: #5724, #5780, #5768. Not applicable, since there is no implementation of those features: #5737 (partial columns), #5670 and #5788 (fast confirmation). The other merges touch only feature forks heze does not include in the specs (EIP-8025, EIP-8148).
Correctness / Behavior Guarantees
Invariants
Behavior changes
DB_VERSION8 → 9: heze states and blocks change shape.thiserror2.0.18 → 2.0.21, required by lean-pq, resolved withmake updateunder the 14-day cooldown.Spec vectors
eip8450fork. The releasedhezevectors lack the registry, so they are listed inUNMODELED_FORKS. Theeip8450directory runs as heze instead.make eip8450-spec-testsgenerates them with #5782's pyspec, pinned by commit. It also addseip8450to the forksssz_staticcovers, in that temporary copy only.SLOT_DURATION_MS_HEZE. The harness's existing rule for such fixtures keeps the heze slot duration equal to the genesis one, matching how they were generated.fixture_forks/missing/eip8450as ignored, so the gap is visible.eip8450cases. Itsforkandtransitioncases start from the registryless heze, so they are ignored.forkcases are ignored by name, inSUPERSEDED_BY_5736. #5736 changed what they expect, and the same cases regenerated at #5736 pass.New dependency:
lean-pq(ethereum/lean-pq-bindings v0.8.0, pinned by commit). The spec vectors are generated with py-lean-pq, the same bindings, so proofs must verify under exactly that scheme. Theleanvmpin here is the lean chain's XMSS (BLAKE2s, 42 chains, one tree), a different scheme. The two leanVM revisions coexist as separate crate graphs.Tests Added / Run
Runs were kept to what the change needs.
b1b194cb, minimal preset, run as heze onheze-devnet-3: 10,366 passed, 0 failed. This covers:operations/pq_key_registrationcases;networking/gossip_pq_key_registrationcases;ssz_staticfor the new and modified containers;eip8450shape.The ignored are the
fork/transitioncases and topics the node does not validate.The #5782 head has since merged master; that brings only spec fixes already ported here, no EIP-8450 change.
XmssSignatureencoding, and the lean-pq wrapper.cargo fmt --checkpasses, and clippy-D warningsis clean on the workspace and on thebeacon-spec-teststarget.Not run, to save compute: the mainnet preset of the vectors, the full beta.4 suite, and the whole-workspace tests. CI covers those.
Related Issues / PRs
✅ Verification Checklist
make fmt: cleanmake lint(clippy with-D warnings): cleanmake test: only the impacted tests and the generated EIP-8450 vectors, listed above🤖 Generated with Claude Code