Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
86f8c2e
EIP-7916: ProgressiveList and tests
michaelsproul Dec 1, 2025
d7ebdeb
Merge remote-tracking branch 'origin/unstable' into progressive-list-…
michaelsproul Dec 8, 2025
9e15231
Test runners for basic progressive containers and bitlists
michaelsproul Dec 10, 2025
fffd203
Rest of the progressive container tests
michaelsproul Dec 18, 2025
30289cd
Remove path patches
michaelsproul Dec 18, 2025
6b5d878
Compatible union tests
michaelsproul Jan 12, 2026
9aad3c6
Passing on v1.7.1-alpha.1
michaelsproul Jan 12, 2026
e98b6db
Merge remote-tracking branch 'origin/unstable' into progressive-list-…
michaelsproul Jan 12, 2026
ecd207f
Remove selector attribute duplication! Yay!
michaelsproul Jan 13, 2026
be9d697
Fix Bitfield type inference
macladson Feb 12, 2026
e9d53ea
Merge branch 'unstable' into progressive-list-tests
macladson Feb 12, 2026
827ff95
Enable all ssz tests
macladson Feb 13, 2026
72723b2
Merge branch 'unstable' into progressive-list-tests
macladson May 27, 2026
0d64c6f
Merge branch 'unstable' into progressive-list-tests
macladson Jun 1, 2026
1340bf3
Merge branch 'unstable' into eip-7688
macladson Jun 3, 2026
448ebda
Forwards compatible consensus data structures
macladson Jun 10, 2026
187ea35
Merge branch 'unstable' into eip-7688
macladson Jun 10, 2026
8bafb1d
Tidy up
macladson Jun 10, 2026
261ab4c
Test cleanup
macladson Jun 10, 2026
ff71771
Remove unnecessary Box
macladson Jun 10, 2026
4381922
Merge branch 'unstable' into eip-7688
macladson Jul 1, 2026
ee451e7
tidy
macladson Jul 1, 2026
a2a8664
Minimize diff
macladson Jul 1, 2026
5954269
More cleanup
macladson Jul 1, 2026
07c926a
Merge branch 'unstable' into eip-7688
macladson Jul 2, 2026
a01b312
Merge branch 'unstable' into eip-7688
macladson Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 33 additions & 30 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,13 @@ inherits = "release"
debug = true

[patch.crates-io]
# FIXME(mac): EIP-7688 development patches
ssz_types = { git = "https://github.com/sigp/ssz_types", branch = "progressive" }
milhouse = { git = "https://github.com/sigp/milhouse", branch = "progressive-list" }
ethereum_ssz = { git = "https://github.com/sigp/ethereum_ssz", branch = "progressive" }
ethereum_ssz_derive = { git = "https://github.com/sigp/ethereum_ssz", branch = "progressive" }
tree_hash = { git = "https://github.com/sigp/tree_hash", branch = "progressive" }
tree_hash_derive = { git = "https://github.com/sigp/tree_hash", branch = "progressive" }
# Temporary patch until the axum migration is complete
warp = { git = "https://github.com/macladson/warp", rev = "6f5f21beab6a240e59470caaab56afd46d46b709" }

Expand Down
32 changes: 32 additions & 0 deletions beacon_node/beacon_chain/src/attestation_verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ use state_processing::{
common::{
attesting_indices_base,
attesting_indices_electra::{self, get_committee_indices},
attesting_indices_gloas,
},
per_block_processing::errors::{AttestationValidationError, BlockOperationError},
signature_sets::{
Expand Down Expand Up @@ -688,6 +689,16 @@ impl<'a, T: BeaconChainTypes> IndexedAggregatedAttestation<'a, T> {
signed_aggregate.message.selection_proof.clone(),
signed_aggregate.message.aggregate.data.clone(),
),
SignedAggregateAndProof::Gloas(signed_aggregate) => (
signed_aggregate
.message
.aggregate
.committee_index()
.ok_or(Error::NotExactlyOneCommitteeBitSet(0))?,
signed_aggregate.message.aggregator_index,
signed_aggregate.message.selection_proof.clone(),
signed_aggregate.message.aggregate.data.clone(),
),
};
let slot = data.slot;

Expand Down Expand Up @@ -724,6 +735,13 @@ impl<'a, T: BeaconChainTypes> IndexedAggregatedAttestation<'a, T> {
)
.map_err(|e| BeaconChainError::from(e).into())
}
SignedAggregateAndProof::Gloas(signed_aggregate) => {
attesting_indices_gloas::get_indexed_attestation(
&committees,
&signed_aggregate.message.aggregate,
)
.map_err(|e| BeaconChainError::from(e).into())
}
}
};

Expand Down Expand Up @@ -1562,6 +1580,20 @@ pub fn obtain_indexed_attestation_and_committees_per_slot<T: BeaconChainTypes>(
}
})
}
AttestationRef::Gloas(att) => {
attesting_indices_gloas::get_indexed_attestation(&committees, att)
.map(|attestation| (attestation, committees_per_slot))
.map_err(|e| {
if let BlockOperationError::BeaconStateError(NoCommitteeFound(index)) = e {
Error::NoCommitteeForSlotAndIndex {
slot: att.data.slot,
index,
}
} else {
Error::Invalid(e)
}
})
}
}
})
}
Expand Down
8 changes: 5 additions & 3 deletions beacon_node/beacon_chain/src/beacon_block_reward.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,9 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
.safe_mul(WEIGHT_DENOMINATOR)?
.safe_div(PROPOSER_WEIGHT)?;

let mut current_epoch_participation = state.current_epoch_participation()?.clone();
let mut previous_epoch_participation = state.previous_epoch_participation()?.clone();
let mut current_epoch_participation = state.current_epoch_participation()?.to_owned_list();
let mut previous_epoch_participation =
state.previous_epoch_participation()?.to_owned_list();

for attestation in block.body().attestations() {
let data = attestation.data();
Expand All @@ -289,7 +290,8 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
};

let validator_participation = epoch_participation
.get_mut(index)
.as_mut()
.into_get_mut(index)
.ok_or(BeaconStateError::ParticipationOutOfBounds(index))?;

if participation_flag_indices.contains(&flag_index)
Expand Down
24 changes: 13 additions & 11 deletions beacon_node/beacon_chain/src/beacon_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1259,7 +1259,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
if header_from_payload != execution_payload_header {
for txn in execution_payload.transactions() {
debug!(
bytes = format!("0x{}", hex::encode(&**txn)),
bytes = format!("0x{}", hex::encode(txn)),
"Reconstructed txn"
);
}
Expand Down Expand Up @@ -1756,6 +1756,12 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
att.committee_index()
.ok_or(Error::AttestationCommitteeIndexNotSet)?,
),
AttestationRef::Gloas(att) => self.get_aggregated_attestation_electra(
att.data.slot,
&att.data.tree_hash_root(),
att.committee_index()
.ok_or(Error::AttestationCommitteeIndexNotSet)?,
),
}
}

Expand Down Expand Up @@ -5823,6 +5829,9 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
match slashing {
AttesterSlashing::Base(slashing) => base.push(slashing),
AttesterSlashing::Electra(slashing) => electra.push(slashing),
// Gloas-typed slashings cannot be included in pre-Gloas blocks, and
// Gloas blocks are produced via `complete_partial_beacon_block_gloas`.
AttesterSlashing::Gloas(_) => (),
}
(base, electra)
},
Expand All @@ -5833,6 +5842,9 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
match attestation {
Attestation::Base(attestation) => base.push(attestation),
Attestation::Electra(attestation) => electra.push(attestation),
// Gloas-typed attestations cannot be included in pre-Gloas blocks, and
// Gloas blocks are produced via `complete_partial_beacon_block_gloas`.
Attestation::Gloas(_) => (),
}
(base, electra)
},
Expand Down Expand Up @@ -6091,11 +6103,6 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
blob_kzg_commitments: kzg_commitments
.ok_or(BlockProductionError::InvalidPayloadFork)?,
execution_requests: maybe_requests
.map(|r| ExecutionRequestsElectra {
deposits: r.deposits().clone(),
withdrawals: r.withdrawals().clone(),
consolidations: r.consolidations().clone(),
})
.ok_or(BlockProductionError::MissingExecutionRequests)?,
},
}),
Expand Down Expand Up @@ -6150,11 +6157,6 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
blob_kzg_commitments: kzg_commitments
.ok_or(BlockProductionError::InvalidPayloadFork)?,
execution_requests: maybe_requests
.map(|r| ExecutionRequestsElectra {
deposits: r.deposits().clone(),
withdrawals: r.withdrawals().clone(),
consolidations: r.consolidations().clone(),
})
.ok_or(BlockProductionError::MissingExecutionRequests)?,
},
}),
Expand Down
Loading
Loading