Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block processing electra #5741

Merged
merged 139 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
3b7132b
Attestation superstruct changes for EIP 7549 (#5644)
eserilev Apr 30, 2024
e6c7f14
`superstruct` the `AttesterSlashing` (#5636)
ethDreamer May 2, 2024
3a41e13
Merge remote-tracking branch 'upstream/unstable' into electra_attesta…
ethDreamer May 2, 2024
9b98f4e
Make EF Tests Fork-Agnostic (#5713)
ethDreamer May 3, 2024
7c6526d
Finish EF Test Fork Agnostic (#5714)
ethDreamer May 3, 2024
19a9479
Superstruct `AggregateAndProof` (#5715)
ethDreamer May 6, 2024
9f6de8e
Merge remote-tracking branch 'sigp/unstable' into electra_attestation…
realbigsean May 6, 2024
38382a3
cargo fmt
realbigsean May 6, 2024
2c2e44c
Merge pull request #5726 from realbigsean/electra_attestation_changes
realbigsean May 6, 2024
e2e82ff
process withdrawals updates
realbigsean May 6, 2024
e0abede
cleanup withdrawals processing
realbigsean May 7, 2024
f1f9f92
update `process_operations` deposit length check
realbigsean May 7, 2024
3c68841
add apply_deposit changes
realbigsean May 7, 2024
1d5f755
add execution layer withdrawal request processing
realbigsean May 7, 2024
32357d8
process deposit receipts
realbigsean May 7, 2024
c40bec9
add consolidation processing
realbigsean May 7, 2024
31955c2
update process operations function
realbigsean May 7, 2024
75ab913
exit updates
realbigsean May 7, 2024
5728f78
clean up
realbigsean May 7, 2024
8517236
update slash_validator
realbigsean May 7, 2024
90179d4
EIP7549 `get_attestation_indices` (#5657)
eserilev May 8, 2024
f30246b
Some small changes (#5739)
ethDreamer May 8, 2024
7c0a8f8
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 8, 2024
43c3f63
cargo fmt (#5740)
ethDreamer May 8, 2024
721e73f
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 8, 2024
7abb762
fix attestation verification
realbigsean May 8, 2024
7cb7653
Sketch op pool changes
michaelsproul May 9, 2024
e32dfcd
fix get attesting indices (#5742)
realbigsean May 9, 2024
3ea3d22
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 9, 2024
07229b7
Ef test fixes (#5753)
realbigsean May 9, 2024
36a559e
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 9, 2024
cb8c8f5
Fix Aggregation Pool for Electra (#5754)
ethDreamer May 9, 2024
c30f709
fix ssz (#5755)
realbigsean May 9, 2024
ab9e58a
Get `electra_op_pool` up to date (#5756)
ethDreamer May 9, 2024
ca09671
Revert "Get `electra_op_pool` up to date (#5756)" (#5757)
ethDreamer May 9, 2024
b807d39
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 9, 2024
19f8333
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 9, 2024
411fcee
Compute on chain aggregate impl (#5752)
eserilev May 10, 2024
e448557
update the naive agg pool interface (#5760)
realbigsean May 10, 2024
aa83e8b
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 10, 2024
437e851
Fix bugs in cross-committee aggregation
michaelsproul May 10, 2024
16265ef
Add comment to max cover optimisation
michaelsproul May 10, 2024
72548cb
Fix assert
michaelsproul May 10, 2024
7926afe
Merge pull request #5749 from sigp/electra_op_pool
realbigsean May 10, 2024
89e4de9
don't fail on empty consolidations
realbigsean May 10, 2024
f60eac6
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 10, 2024
e1dcfb6
update committee offset
realbigsean May 11, 2024
b819d2d
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 11, 2024
a97e86c
only increment the state deposit index on old deposit flow
realbigsean May 11, 2024
3b1fb0a
Fix Electra Fork Choice Tests (#5764)
ethDreamer May 12, 2024
af7ba6f
Fix Electra Fork Choice Tests (#5764)
ethDreamer May 12, 2024
c900a88
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 12, 2024
217fa9f
Fix Consolidation Sigs & Withdrawals
ethDreamer May 12, 2024
793764f
Merge pull request #5766 from ethDreamer/two_fixes
realbigsean May 12, 2024
fc15736
Subscribe to the correct subnets for electra attestations (#5782)
eserilev May 15, 2024
d8941d7
cargo fmt
realbigsean May 15, 2024
79a5f25
Subscribe to the correct subnets for electra attestations (#5782)
eserilev May 15, 2024
a8088f1
cargo fmt
realbigsean May 15, 2024
bafb5f0
fix slashing handling
realbigsean May 17, 2024
f9c50bc
Fix Bug In Block Processing with 0x02 Credentials
ethDreamer May 16, 2024
987abe0
Merge remote-tracking branch 'upstream/unstable'
ethDreamer May 24, 2024
82858bc
Send unagg attestation based on fork
pawanjay176 May 13, 2024
154b7a7
Publish all aggregates
ethDreamer May 15, 2024
bb734af
just one more check bro plz..
ethDreamer May 15, 2024
469296b
Merge pull request #5832 from ethDreamer/electra_attestation_changes_…
realbigsean May 24, 2024
3f169ef
Merge pull request #5835 from realbigsean/fix-validator-logic
realbigsean May 24, 2024
3e10e68
Merge pull request #5816 from realbigsean/electra-attestation-slashin…
realbigsean May 24, 2024
9440c36
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 24, 2024
75432e1
Electra attestation changes rm decode impl (#5856)
ethDreamer May 30, 2024
e340998
Fix failing attestation tests and misc electra attestation cleanup (#…
eserilev May 30, 2024
b61d244
fix some todos (#5817)
realbigsean May 30, 2024
49de63f
Merge branch 'unstable' of https://github.com/sigp/lighthouse into el…
realbigsean May 31, 2024
29ed1c5
add consolidations to merkle calc for inclusion proof
realbigsean May 12, 2024
a647a36
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean May 31, 2024
f9d3545
Remove Duplicate KZG Commitment Merkle Proof Code (#5874)
ethDreamer Jun 1, 2024
77c630b
Merge branch 'unstable' of https://github.com/sigp/lighthouse into el…
realbigsean Jun 13, 2024
f25531d
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean Jun 13, 2024
b21b108
fix compile
realbigsean Jun 13, 2024
8dc9f38
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean Jun 13, 2024
35e07eb
Fix slasher tests (#5906)
pawanjay176 Jun 14, 2024
d7f3c95
Update superstruct to 0.8
michaelsproul Jun 14, 2024
d5aa2d8
Merge remote-tracking branch 'origin/unstable' into electra_attestati…
michaelsproul Jun 14, 2024
c4f2284
Small cleanup in slasher tests
michaelsproul Jun 14, 2024
3ac3ddb
Clean up Electra observed aggregates (#5929)
michaelsproul Jun 17, 2024
9a01b6b
Merge branch 'unstable' of https://github.com/sigp/lighthouse into el…
realbigsean Jun 17, 2024
d87541c
De-dup attestation constructor logic
dapplion Jun 17, 2024
dd0d5e2
Remove unwraps in Attestation construction
dapplion Jun 17, 2024
3ec21a2
Dedup match_attestation_data
dapplion Jun 17, 2024
795eff9
Remove outdated TODO
dapplion Jun 17, 2024
960f8c5
Use ForkName Ord in fork-choice tests
dapplion Jun 17, 2024
1d0e3f4
Use ForkName Ord in BeaconBlockBody
dapplion Jun 17, 2024
5acc052
Make to_electra not fallible
dapplion Jun 17, 2024
4f08f6e
Remove TestRandom impl for IndexedAttestation
dapplion Jun 17, 2024
f049285
Remove IndexedAttestation faulty Decode impl
dapplion Jun 17, 2024
5070ab2
Drop TestRandom impl
dapplion Jun 17, 2024
45d007a
Add PendingAttestationInElectra
dapplion Jun 17, 2024
9e84779
Indexed att on disk (#35)
realbigsean Jun 18, 2024
7af3f2e
add electra fork enabled fn to ForkName impl (#36)
eserilev Jun 18, 2024
2634a1f
Update common/eth2/src/types.rs
dapplion Jun 18, 2024
dec7cff
Dedup attestation constructor logic in attester cache
dapplion Jun 17, 2024
6a4d842
Use if let Ok for committee_bits
dapplion Jun 18, 2024
6f0b784
Dedup Attestation constructor code
dapplion Jun 18, 2024
444cd62
Diff reduction in tests
dapplion Jun 18, 2024
d264736
Fix beacon_chain tests
dapplion Jun 18, 2024
7521f97
Diff reduction
dapplion Jun 18, 2024
4d3edfe
Use Ord for ForkName in pubsub
dapplion Jun 18, 2024
7fce143
Resolve into_attestation_and_indices todo
dapplion Jun 18, 2024
4d4c268
Remove stale TODO
dapplion Jun 18, 2024
370d511
Fix beacon_chain tests
dapplion Jun 18, 2024
cbb7c5d
Test spec invariant
dapplion Jun 19, 2024
70a2d4d
Use electra_enabled in pubsub
dapplion Jun 19, 2024
9e6e76f
Remove get_indexed_attestation_from_signed_aggregate
dapplion Jun 19, 2024
a8d8989
Use ok_or instead of if let else
dapplion Jun 19, 2024
d67270f
committees are sorted
dapplion Jun 19, 2024
3977b92
remove dup method `get_indexed_attestation_from_committees`
realbigsean Jun 19, 2024
6e44832
Merge pull request #5940 from dapplion/electra_attestation_changes_li…
realbigsean Jun 19, 2024
afb9122
update default persisted op pool deserialization
realbigsean Jun 19, 2024
381bbab
ensure aggregate and proof uses serde untagged on ref
realbigsean Jun 19, 2024
0e2add2
Fork aware ssz static attestation tests
dapplion Jun 20, 2024
f85a124
Electra attestation changes from Lions review (#5971)
eserilev Jun 20, 2024
efb8a01
Merge branch 'unstable' of https://github.com/sigp/lighthouse into el…
realbigsean Jun 20, 2024
dd0aa8e
Merge branch 'electra_attestation_changes' of https://github.com/sigp…
realbigsean Jun 20, 2024
27ed90e
Electra attestation changes sean review (#5972)
realbigsean Jun 21, 2024
b6913ae
Avoid changing slasher schema for Electra
michaelsproul Jun 21, 2024
ebbb17b
Delete slasher schema v4
michaelsproul Jun 21, 2024
13b1b05
Fix clippy
michaelsproul Jun 21, 2024
339d1b8
Fix compilation of beacon_chain tests
michaelsproul Jun 21, 2024
70a80d5
Update database.rs
dapplion Jun 21, 2024
7509cf6
Update per_block_processing.rs
dapplion Jun 21, 2024
8715589
Add electra lightclient types
dapplion Jun 21, 2024
09141ec
Update slasher/src/database.rs
realbigsean Jun 21, 2024
8fc5333
fix imports
realbigsean Jun 21, 2024
5517c78
Merge pull request #5980 from dapplion/electra-lightclient
realbigsean Jun 21, 2024
cf030d0
Merge pull request #5975 from michaelsproul/electra-slasher-no-migration
realbigsean Jun 21, 2024
68fd7a7
Update beacon_node/beacon_chain/src/attestation_verification.rs
realbigsean Jun 21, 2024
d137881
Update beacon_node/beacon_chain/src/attestation_verification.rs
realbigsean Jun 21, 2024
87fde51
Merge branch 'unstable' of https://github.com/sigp/lighthouse into el…
realbigsean Jun 25, 2024
a8d84d6
Merge branch 'electra_attestation_changes' of https://github.com/real…
realbigsean Jun 25, 2024
7c17098
fork enabled electra
realbigsean Jun 26, 2024
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
5 changes: 4 additions & 1 deletion beacon_node/beacon_chain/src/beacon_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4538,6 +4538,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
let proposal_epoch = proposal_slot.epoch(T::EthSpec::slots_per_epoch());
if head_state.current_epoch() == proposal_epoch {
return get_expected_withdrawals(&unadvanced_state, &self.spec)
.map(|(withdrawals, _)| withdrawals)
.map_err(Error::PrepareProposerFailed);
}

Expand All @@ -4555,7 +4556,9 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
proposal_epoch.start_slot(T::EthSpec::slots_per_epoch()),
&self.spec,
)?;
get_expected_withdrawals(&advanced_state, &self.spec).map_err(Error::PrepareProposerFailed)
get_expected_withdrawals(&advanced_state, &self.spec)
.map(|(withdrawals, _)| withdrawals)
.map_err(Error::PrepareProposerFailed)
}

/// Determine whether a fork choice update to the execution layer should be overridden.
Expand Down
2 changes: 1 addition & 1 deletion beacon_node/beacon_chain/src/execution_payload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ pub fn get_execution_payload<T: BeaconChainTypes>(
state.latest_execution_payload_header()?.block_hash();
let withdrawals = match state {
&BeaconState::Capella(_) | &BeaconState::Deneb(_) | &BeaconState::Electra(_) => {
Some(get_expected_withdrawals(state, spec)?.into())
Some(get_expected_withdrawals(state, spec)?.0.into())
}
&BeaconState::Bellatrix(_) => None,
// These shouldn't happen but they're here to make the pattern irrefutable
Expand Down
8 changes: 7 additions & 1 deletion beacon_node/genesis/src/eth1_genesis_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,8 +432,14 @@ impl Eth1GenesisService {
// Such an optimization would only be useful in a scenario where `MIN_GENESIS_TIME`
// is reached _prior_ to `MIN_ACTIVE_VALIDATOR_COUNT`. I suspect this won't be the
// case for mainnet, so we defer this optimization.
let Deposit { proof, data } = deposit;
let proof = if PROOF_VERIFICATION {
Some(proof)
} else {
None
};

apply_deposit(&mut state, &deposit, spec, PROOF_VERIFICATION)
apply_deposit(&mut state, data, proof, true, spec)
.map_err(|e| format!("Error whilst processing deposit: {:?}", e))
})?;

Expand Down
2 changes: 1 addition & 1 deletion beacon_node/http_api/src/builder_states.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub fn get_next_withdrawals<T: BeaconChainTypes>(
}

match get_expected_withdrawals(&state, &chain.spec) {
Ok(withdrawals) => Ok(withdrawals),
Ok((withdrawals, _)) => Ok(withdrawals),
Err(e) => Err(warp_utils::reject::custom_server_error(format!(
"failed to get expected withdrawal: {:?}",
e
Expand Down
2 changes: 2 additions & 0 deletions beacon_node/http_api/tests/interactive_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,7 @@ pub async fn proposer_boost_re_org_test(
assert_eq!(state_b.slot(), slot_b);
let pre_advance_withdrawals = get_expected_withdrawals(&state_b, &harness.chain.spec)
.unwrap()
.0
.to_vec();
complete_state_advance(&mut state_b, None, slot_c, &harness.chain.spec).unwrap();

Expand Down Expand Up @@ -696,6 +697,7 @@ pub async fn proposer_boost_re_org_test(
get_expected_withdrawals(&state_b, &harness.chain.spec)
}
.unwrap()
.0
.to_vec();
let payload_attribs_withdrawals = payload_attribs.withdrawals().unwrap();
assert_eq!(expected_withdrawals, *payload_attribs_withdrawals);
Expand Down
4 changes: 3 additions & 1 deletion beacon_node/http_api/tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5471,7 +5471,9 @@ impl ApiTester {
&self.chain.spec,
);
}
let expected_withdrawals = get_expected_withdrawals(&state, &self.chain.spec).unwrap();
let expected_withdrawals = get_expected_withdrawals(&state, &self.chain.spec)
.unwrap()
.0;

// fetch expected withdrawals from the client
let result = self.client.get_expected_withdrawals(&state_id).await;
Expand Down
26 changes: 16 additions & 10 deletions consensus/state_processing/src/common/initiate_validator_exit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,22 @@ pub fn initiate_validator_exit<E: EthSpec>(
state.build_exit_cache(spec)?;

// Compute exit queue epoch
let delayed_epoch = state.compute_activation_exit_epoch(state.current_epoch(), spec)?;
let mut exit_queue_epoch = state
.exit_cache()
.max_epoch()?
.map_or(delayed_epoch, |epoch| max(epoch, delayed_epoch));
let exit_queue_churn = state.exit_cache().get_churn_at(exit_queue_epoch)?;

if exit_queue_churn >= state.get_validator_churn_limit(spec)? {
exit_queue_epoch.safe_add_assign(1)?;
}
let exit_queue_epoch = if state.fork_name_unchecked() >= ForkName::Electra {
let effective_balance = state.get_validator(index)?.effective_balance;
state.compute_exit_epoch_and_update_churn(effective_balance, spec)?
} else {
let delayed_epoch = state.compute_activation_exit_epoch(state.current_epoch(), spec)?;
let mut exit_queue_epoch = state
.exit_cache()
.max_epoch()?
.map_or(delayed_epoch, |epoch| max(epoch, delayed_epoch));
let exit_queue_churn = state.exit_cache().get_churn_at(exit_queue_epoch)?;

if exit_queue_churn >= state.get_validator_churn_limit(spec)? {
exit_queue_epoch.safe_add_assign(1)?;
}
exit_queue_epoch
};

let validator = state.get_validator_cow(index)?;

Expand Down
4 changes: 2 additions & 2 deletions consensus/state_processing/src/common/slash_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ pub fn slash_validator<E: EthSpec>(
// Apply proposer and whistleblower rewards
let proposer_index = ctxt.get_proposer_index(state, spec)? as usize;
let whistleblower_index = opt_whistleblower_index.unwrap_or(proposer_index);
let whistleblower_reward =
validator_effective_balance.safe_div(spec.whistleblower_reward_quotient)?;
let whistleblower_reward = validator_effective_balance
.safe_div(spec.whistleblower_reward_quotient_for_state(state))?;
let proposer_reward = match state {
BeaconState::Base(_) => whistleblower_reward.safe_div(spec.proposer_reward_quotient)?,
BeaconState::Altair(_)
Expand Down
5 changes: 3 additions & 2 deletions consensus/state_processing/src/genesis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,13 @@ pub fn initialize_beacon_state_from_eth1<E: EthSpec>(

let mut deposit_tree = DepositDataTree::create(&[], 0, DEPOSIT_TREE_DEPTH);

for deposit in deposits.iter() {
for deposit in deposits.into_iter() {
deposit_tree
.push_leaf(deposit.data.tree_hash_root())
.map_err(BlockProcessingError::MerkleTreeError)?;
state.eth1_data_mut().deposit_root = deposit_tree.root();
apply_deposit(&mut state, deposit, spec, true)?;
let Deposit { proof, data } = deposit;
apply_deposit(&mut state, data, Some(proof), true, spec)?;
}

process_activations(&mut state, spec)?;
Expand Down
74 changes: 65 additions & 9 deletions consensus/state_processing/src/per_block_processing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub use verify_attestation::{
};
pub use verify_bls_to_execution_change::verify_bls_to_execution_change;
pub use verify_deposit::{
get_existing_validator_index, verify_deposit_merkle_proof, verify_deposit_signature,
get_existing_validator_index, is_valid_deposit_signature, verify_deposit_merkle_proof,
};
pub use verify_exit::verify_exit;

Expand Down Expand Up @@ -503,13 +503,55 @@ pub fn compute_timestamp_at_slot<E: EthSpec>(
pub fn get_expected_withdrawals<E: EthSpec>(
state: &BeaconState<E>,
spec: &ChainSpec,
) -> Result<Withdrawals<E>, BlockProcessingError> {
) -> Result<(Withdrawals<E>, Option<usize>), BlockProcessingError> {
let epoch = state.current_epoch();
let mut withdrawal_index = state.next_withdrawal_index()?;
let mut validator_index = state.next_withdrawal_validator_index()?;
let mut withdrawals = vec![];
let fork_name = state.fork_name_unchecked();

// [New in Electra:EIP7251]
// Consume pending partial withdrawals
let partial_withdrawals_count =
if let Ok(partial_withdrawals) = state.pending_partial_withdrawals() {
for withdrawal in partial_withdrawals {
if withdrawal.withdrawable_epoch > epoch
|| withdrawals.len() == spec.max_pending_partials_per_withdrawals_sweep as usize
{
break;
}

let withdrawal_balance = state.get_balance(withdrawal.index as usize)?;
let validator = state.get_validator(withdrawal.index as usize)?;

let has_sufficient_effective_balance =
validator.effective_balance >= spec.min_activation_balance;
let has_excess_balance = withdrawal_balance > spec.min_activation_balance;

if validator.exit_epoch == spec.far_future_epoch
&& has_sufficient_effective_balance
&& has_excess_balance
{
let withdrawable_balance = std::cmp::min(
withdrawal_balance.safe_sub(spec.min_activation_balance)?,
withdrawal.amount,
);
withdrawals.push(Withdrawal {
index: withdrawal_index,
validator_index: withdrawal.index,
address: validator
.get_execution_withdrawal_address(spec)
.ok_or(BeaconStateError::NonExecutionAddresWithdrawalCredential)?,
amount: withdrawable_balance,
});
withdrawal_index.safe_add_assign(1)?;
}
}
Some(withdrawals.len())
} else {
None
};

let bound = std::cmp::min(
state.validators().len() as u64,
spec.max_validators_per_withdrawals_sweep,
Expand All @@ -524,7 +566,7 @@ pub fn get_expected_withdrawals<E: EthSpec>(
index: withdrawal_index,
validator_index,
address: validator
.get_eth1_withdrawal_address(spec)
.get_execution_withdrawal_address(spec)
.ok_or(BlockProcessingError::WithdrawalCredentialsInvalid)?,
amount: balance,
});
Expand All @@ -534,9 +576,12 @@ pub fn get_expected_withdrawals<E: EthSpec>(
index: withdrawal_index,
validator_index,
address: validator
.get_eth1_withdrawal_address(spec)
.get_execution_withdrawal_address(spec)
.ok_or(BlockProcessingError::WithdrawalCredentialsInvalid)?,
amount: balance.safe_sub(spec.max_effective_balance)?,
amount: balance.safe_sub(
validator
.get_validator_max_effective_balance(spec, state.fork_name_unchecked()),
)?,
});
withdrawal_index.safe_add_assign(1)?;
}
Expand All @@ -548,7 +593,7 @@ pub fn get_expected_withdrawals<E: EthSpec>(
.safe_rem(state.validators().len() as u64)?;
}

Ok(withdrawals.into())
Ok((withdrawals.into(), partial_withdrawals_count))
}

/// Apply withdrawals to the state.
Expand All @@ -558,9 +603,9 @@ pub fn process_withdrawals<E: EthSpec, Payload: AbstractExecPayload<E>>(
spec: &ChainSpec,
) -> Result<(), BlockProcessingError> {
match state {
BeaconState::Bellatrix(_) => Ok(()),
BeaconState::Capella(_) | BeaconState::Deneb(_) | BeaconState::Electra(_) => {
let expected_withdrawals = get_expected_withdrawals(state, spec)?;
let (expected_withdrawals, partial_withdrawals_count) =
get_expected_withdrawals(state, spec)?;
let expected_root = expected_withdrawals.tree_hash_root();
let withdrawals_root = payload.withdrawals_root()?;

Expand All @@ -579,6 +624,17 @@ pub fn process_withdrawals<E: EthSpec, Payload: AbstractExecPayload<E>>(
)?;
}

// Update pending partial withdrawals [New in Electra:EIP7251]
if let Some(partial_withdrawals_count) = partial_withdrawals_count {
// TODO(electra): Use efficient pop_front after milhouse release https://github.com/sigp/milhouse/pull/38
let new_partial_withdrawals = state
.pending_partial_withdrawals()?
.iter_from(partial_withdrawals_count)?
.cloned()
.collect::<Vec<_>>();
*state.pending_partial_withdrawals_mut()? = List::new(new_partial_withdrawals)?;
}

// Update the next withdrawal index if this block contained withdrawals
if let Some(latest_withdrawal) = expected_withdrawals.last() {
*state.next_withdrawal_index_mut()? = latest_withdrawal.index.safe_add(1)?;
Expand Down Expand Up @@ -606,6 +662,6 @@ pub fn process_withdrawals<E: EthSpec, Payload: AbstractExecPayload<E>>(
Ok(())
}
// these shouldn't even be encountered but they're here for completeness
BeaconState::Base(_) | BeaconState::Altair(_) => Ok(()),
BeaconState::Base(_) | BeaconState::Altair(_) | BeaconState::Bellatrix(_) => Ok(()),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ where
self.include_exits(block)?;
self.include_sync_aggregate(block)?;
self.include_bls_to_execution_changes(block)?;
self.include_consolidations(block)?;

Ok(())
}
Expand Down Expand Up @@ -359,6 +360,27 @@ where
Ok(())
}

/// Includes all signatures in `self.block.body.consolidations` for verification.
pub fn include_consolidations<Payload: AbstractExecPayload<E>>(
&mut self,
block: &'a SignedBeaconBlock<E, Payload>,
) -> Result<()> {
if let Ok(consolidations) = block.message().body().consolidations() {
self.sets.sets.reserve(consolidations.len());
for consolidation in consolidations {
let set = consolidation_signature_set(
self.state,
self.get_pubkey.clone(),
consolidation,
self.spec,
)?;

self.sets.push(set);
}
}
Ok(())
}

/// Verify all the signatures that have been included in `self`, returning `true` if and only if
/// all the signatures are valid.
///
Expand Down
46 changes: 45 additions & 1 deletion consensus/state_processing/src/per_block_processing/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,46 @@ pub enum BlockProcessingError {
found: Hash256,
},
WithdrawalCredentialsInvalid,
TooManyPendingConsolidations {
consolidations: usize,
limit: usize,
},
ConsolidationChurnLimitTooLow {
churn_limit: u64,
minimum: u64,
},
MatchingSourceTargetConsolidation {
index: u64,
},
InactiveConsolidationSource {
index: u64,
current_epoch: Epoch,
dapplion marked this conversation as resolved.
Show resolved Hide resolved
},
InactiveConsolidationTarget {
index: u64,
current_epoch: Epoch,
},
SourceValidatorExiting {
index: u64,
},
TargetValidatorExiting {
index: u64,
},
FutureConsolidationEpoch {
current_epoch: Epoch,
consolidation_epoch: Epoch,
},
NoSourceExecutionWithdrawalCredential {
index: u64,
},
NoTargetExecutionWithdrawalCredential {
index: u64,
},
MismatchedWithdrawalCredentials {
source_address: Address,
target_address: Address,
},
InavlidConsolidationSignature,
PendingAttestationInElectra,
}

Expand Down Expand Up @@ -412,7 +452,10 @@ pub enum ExitInvalid {
/// The specified validator has already initiated exit.
AlreadyInitiatedExit(u64),
/// The exit is for a future epoch.
FutureEpoch { state: Epoch, exit: Epoch },
FutureEpoch {
state: Epoch,
exit: Epoch,
},
/// The validator has not been active for long enough.
TooYoungToExit {
current_epoch: Epoch,
Expand All @@ -423,6 +466,7 @@ pub enum ExitInvalid {
/// There was an error whilst attempting to get a set of signatures. The signatures may have
/// been invalid or an internal error occurred.
SignatureSetError(SignatureSetError),
PendingWithdrawalInQueue(u64),
}

#[derive(Debug, PartialEq, Clone)]
Expand Down
Loading