mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-16 03:12:41 +00:00
Merge remote-tracking branch 'origin/unstable' into tree-states
This commit is contained in:
@@ -227,7 +227,10 @@ where
|
||||
} else {
|
||||
VerifyBlockRoot::False
|
||||
});
|
||||
let mut ctxt = ConsensusContext::new(block.slot());
|
||||
// Proposer index was already checked when this block was originally processed, we
|
||||
// can omit recomputing it during replay.
|
||||
let mut ctxt = ConsensusContext::new(block.slot())
|
||||
.set_proposer_index(block.message().proposer_index());
|
||||
per_block_processing(
|
||||
&mut self.state,
|
||||
block,
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use crate::common::{decrease_balance, increase_balance, initiate_validator_exit};
|
||||
use crate::{
|
||||
common::{decrease_balance, increase_balance, initiate_validator_exit},
|
||||
per_block_processing::errors::BlockProcessingError,
|
||||
ConsensusContext,
|
||||
};
|
||||
use safe_arith::SafeArith;
|
||||
use std::cmp;
|
||||
use types::{
|
||||
consts::altair::{PROPOSER_WEIGHT, WEIGHT_DENOMINATOR},
|
||||
BeaconStateError as Error, *,
|
||||
*,
|
||||
};
|
||||
|
||||
/// Slash the validator with index `slashed_index`.
|
||||
@@ -11,8 +15,9 @@ pub fn slash_validator<T: EthSpec>(
|
||||
state: &mut BeaconState<T>,
|
||||
slashed_index: usize,
|
||||
opt_whistleblower_index: Option<usize>,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), Error> {
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
let epoch = state.current_epoch();
|
||||
|
||||
initiate_validator_exit(state, slashed_index, spec)?;
|
||||
@@ -39,7 +44,7 @@ pub fn slash_validator<T: EthSpec>(
|
||||
)?;
|
||||
|
||||
// Apply proposer and whistleblower rewards
|
||||
let proposer_index = state.get_beacon_proposer_index(state.slot(), spec)?;
|
||||
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)?;
|
||||
@@ -52,7 +57,7 @@ pub fn slash_validator<T: EthSpec>(
|
||||
|
||||
// Ensure the whistleblower index is in the validator registry.
|
||||
if state.validators().get(whistleblower_index).is_none() {
|
||||
return Err(BeaconStateError::UnknownValidator(whistleblower_index));
|
||||
return Err(BeaconStateError::UnknownValidator(whistleblower_index).into());
|
||||
}
|
||||
|
||||
increase_balance(state, proposer_index, proposer_reward)?;
|
||||
|
||||
@@ -112,6 +112,7 @@ pub fn per_block_processing<T: EthSpec, Payload: ExecPayload<T>>(
|
||||
BlockSignatureStrategy::VerifyBulk => {
|
||||
// Verify all signatures in the block at once.
|
||||
let block_root = Some(ctxt.get_current_block_root(signed_block)?);
|
||||
let proposer_index = Some(ctxt.get_proposer_index(state, spec)?);
|
||||
block_verify!(
|
||||
BlockSignatureVerifier::verify_entire_block(
|
||||
state,
|
||||
@@ -119,7 +120,7 @@ pub fn per_block_processing<T: EthSpec, Payload: ExecPayload<T>>(
|
||||
|pk_bytes| pk_bytes.decompress().ok().map(Cow::Owned),
|
||||
signed_block,
|
||||
block_root,
|
||||
false,
|
||||
proposer_index,
|
||||
spec
|
||||
)
|
||||
.is_ok(),
|
||||
@@ -161,9 +162,9 @@ pub fn per_block_processing<T: EthSpec, Payload: ExecPayload<T>>(
|
||||
process_execution_payload(state, payload, spec)?;
|
||||
}
|
||||
|
||||
process_randao(state, block, verify_randao, spec)?;
|
||||
process_randao(state, block, verify_randao, ctxt, spec)?;
|
||||
process_eth1_data(state, block.body().eth1_data())?;
|
||||
process_operations(state, block.body(), proposer_index, verify_signatures, spec)?;
|
||||
process_operations(state, block.body(), verify_signatures, ctxt, spec)?;
|
||||
|
||||
if let Ok(sync_aggregate) = block.body().sync_aggregate() {
|
||||
process_sync_aggregate(
|
||||
@@ -231,7 +232,7 @@ pub fn process_block_header<T: EthSpec>(
|
||||
HeaderInvalid::ProposerSlashed(proposer_index)
|
||||
);
|
||||
|
||||
Ok(proposer_index as u64)
|
||||
Ok(proposer_index)
|
||||
}
|
||||
|
||||
/// Verifies the signature of a block.
|
||||
@@ -244,13 +245,14 @@ pub fn verify_block_signature<T: EthSpec, Payload: ExecPayload<T>>(
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockOperationError<HeaderInvalid>> {
|
||||
let block_root = Some(ctxt.get_current_block_root(block)?);
|
||||
let proposer_index = Some(ctxt.get_proposer_index(state, spec)?);
|
||||
verify!(
|
||||
block_proposal_signature_set(
|
||||
state,
|
||||
|i| get_pubkey_from_state(state, i),
|
||||
block,
|
||||
block_root,
|
||||
false,
|
||||
proposer_index,
|
||||
spec
|
||||
)?
|
||||
.verify(),
|
||||
@@ -266,12 +268,21 @@ pub fn process_randao<T: EthSpec, Payload: ExecPayload<T>>(
|
||||
state: &mut BeaconState<T>,
|
||||
block: BeaconBlockRef<'_, T, Payload>,
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
if verify_signatures.is_true() {
|
||||
// Verify RANDAO reveal signature.
|
||||
let proposer_index = ctxt.get_proposer_index(state, spec)?;
|
||||
block_verify!(
|
||||
randao_signature_set(state, |i| get_pubkey_from_state(state, i), block, spec)?.verify(),
|
||||
randao_signature_set(
|
||||
state,
|
||||
|i| get_pubkey_from_state(state, i),
|
||||
block,
|
||||
Some(proposer_index),
|
||||
spec
|
||||
)?
|
||||
.verify(),
|
||||
BlockProcessingError::RandaoSignatureInvalid
|
||||
);
|
||||
}
|
||||
|
||||
@@ -123,11 +123,11 @@ where
|
||||
decompressor: D,
|
||||
block: &'a SignedBeaconBlock<T, Payload>,
|
||||
block_root: Option<Hash256>,
|
||||
check_proposer_index: bool,
|
||||
verified_proposer_index: Option<u64>,
|
||||
spec: &'a ChainSpec,
|
||||
) -> Result<()> {
|
||||
let mut verifier = Self::new(state, get_pubkey, decompressor, spec);
|
||||
verifier.include_all_signatures(block, block_root, check_proposer_index)?;
|
||||
verifier.include_all_signatures(block, block_root, verified_proposer_index)?;
|
||||
verifier.verify()
|
||||
}
|
||||
|
||||
@@ -136,10 +136,10 @@ where
|
||||
&mut self,
|
||||
block: &'a SignedBeaconBlock<T, Payload>,
|
||||
block_root: Option<Hash256>,
|
||||
check_proposer_index: bool,
|
||||
verified_proposer_index: Option<u64>,
|
||||
) -> Result<()> {
|
||||
self.include_block_proposal(block, block_root, check_proposer_index)?;
|
||||
self.include_all_signatures_except_proposal(block)?;
|
||||
self.include_block_proposal(block, block_root, verified_proposer_index)?;
|
||||
self.include_all_signatures_except_proposal(block, verified_proposer_index)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -149,8 +149,9 @@ where
|
||||
pub fn include_all_signatures_except_proposal<Payload: ExecPayload<T>>(
|
||||
&mut self,
|
||||
block: &'a SignedBeaconBlock<T, Payload>,
|
||||
verified_proposer_index: Option<u64>,
|
||||
) -> Result<()> {
|
||||
self.include_randao_reveal(block)?;
|
||||
self.include_randao_reveal(block, verified_proposer_index)?;
|
||||
self.include_proposer_slashings(block)?;
|
||||
self.include_attester_slashings(block)?;
|
||||
self.include_attestations(block)?;
|
||||
@@ -166,14 +167,14 @@ where
|
||||
&mut self,
|
||||
block: &'a SignedBeaconBlock<T, Payload>,
|
||||
block_root: Option<Hash256>,
|
||||
check_proposer_index: bool,
|
||||
verified_proposer_index: Option<u64>,
|
||||
) -> Result<()> {
|
||||
let set = block_proposal_signature_set(
|
||||
self.state,
|
||||
self.get_pubkey.clone(),
|
||||
block,
|
||||
block_root,
|
||||
check_proposer_index,
|
||||
verified_proposer_index,
|
||||
self.spec,
|
||||
)?;
|
||||
self.sets.push(set);
|
||||
@@ -184,11 +185,13 @@ where
|
||||
pub fn include_randao_reveal<Payload: ExecPayload<T>>(
|
||||
&mut self,
|
||||
block: &'a SignedBeaconBlock<T, Payload>,
|
||||
verified_proposer_index: Option<u64>,
|
||||
) -> Result<()> {
|
||||
let set = randao_signature_set(
|
||||
self.state,
|
||||
self.get_pubkey.clone(),
|
||||
block.message(),
|
||||
verified_proposer_index,
|
||||
self.spec,
|
||||
)?;
|
||||
self.sets.push(set);
|
||||
|
||||
@@ -13,23 +13,25 @@ use types::consts::altair::{PARTICIPATION_FLAG_WEIGHTS, PROPOSER_WEIGHT, WEIGHT_
|
||||
pub fn process_operations<'a, T: EthSpec, Payload: ExecPayload<T>>(
|
||||
state: &mut BeaconState<T>,
|
||||
block_body: BeaconBlockBodyRef<'a, T, Payload>,
|
||||
proposer_index: u64,
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
process_proposer_slashings(
|
||||
state,
|
||||
block_body.proposer_slashings(),
|
||||
verify_signatures,
|
||||
ctxt,
|
||||
spec,
|
||||
)?;
|
||||
process_attester_slashings(
|
||||
state,
|
||||
block_body.attester_slashings(),
|
||||
verify_signatures,
|
||||
ctxt,
|
||||
spec,
|
||||
)?;
|
||||
process_attestations(state, block_body, proposer_index, verify_signatures, spec)?;
|
||||
process_attestations(state, block_body, verify_signatures, ctxt, spec)?;
|
||||
process_deposits(state, block_body.deposits(), spec)?;
|
||||
process_exits(state, block_body.voluntary_exits(), verify_signatures, spec)?;
|
||||
Ok(())
|
||||
@@ -46,12 +48,13 @@ pub mod base {
|
||||
state: &mut BeaconState<T>,
|
||||
attestations: &[Attestation<T>],
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
// Ensure the previous epoch cache exists.
|
||||
state.build_committee_cache(RelativeEpoch::Previous, spec)?;
|
||||
|
||||
let proposer_index = state.get_beacon_proposer_index(state.slot(), spec)? as u64;
|
||||
let proposer_index = ctxt.get_proposer_index(state, spec)?;
|
||||
|
||||
// Verify and apply each attestation.
|
||||
for (i, attestation) in attestations.iter().enumerate() {
|
||||
@@ -88,10 +91,11 @@ pub mod altair {
|
||||
pub fn process_attestations<T: EthSpec>(
|
||||
state: &mut BeaconState<T>,
|
||||
attestations: &[Attestation<T>],
|
||||
proposer_index: u64,
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
let proposer_index = ctxt.get_proposer_index(state, spec)?;
|
||||
attestations
|
||||
.iter()
|
||||
.enumerate()
|
||||
@@ -173,6 +177,7 @@ pub fn process_proposer_slashings<T: EthSpec>(
|
||||
state: &mut BeaconState<T>,
|
||||
proposer_slashings: &[ProposerSlashing],
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
// Verify and apply proposer slashings in series.
|
||||
@@ -189,6 +194,7 @@ pub fn process_proposer_slashings<T: EthSpec>(
|
||||
state,
|
||||
proposer_slashing.signed_header_1.message.proposer_index as usize,
|
||||
None,
|
||||
ctxt,
|
||||
spec,
|
||||
)?;
|
||||
|
||||
@@ -204,6 +210,7 @@ pub fn process_attester_slashings<T: EthSpec>(
|
||||
state: &mut BeaconState<T>,
|
||||
attester_slashings: &[AttesterSlashing<T>],
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
for (i, attester_slashing) in attester_slashings.iter().enumerate() {
|
||||
@@ -214,7 +221,7 @@ pub fn process_attester_slashings<T: EthSpec>(
|
||||
get_slashable_indices(state, attester_slashing).map_err(|e| e.into_with_index(i))?;
|
||||
|
||||
for i in slashable_indices {
|
||||
slash_validator(state, i as usize, None, spec)?;
|
||||
slash_validator(state, i as usize, None, ctxt, spec)?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,20 +232,26 @@ pub fn process_attester_slashings<T: EthSpec>(
|
||||
pub fn process_attestations<'a, T: EthSpec, Payload: ExecPayload<T>>(
|
||||
state: &mut BeaconState<T>,
|
||||
block_body: BeaconBlockBodyRef<'a, T, Payload>,
|
||||
proposer_index: u64,
|
||||
verify_signatures: VerifySignatures,
|
||||
ctxt: &mut ConsensusContext<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<(), BlockProcessingError> {
|
||||
match block_body {
|
||||
BeaconBlockBodyRef::Base(_) => {
|
||||
base::process_attestations(state, block_body.attestations(), verify_signatures, spec)?;
|
||||
base::process_attestations(
|
||||
state,
|
||||
block_body.attestations(),
|
||||
verify_signatures,
|
||||
ctxt,
|
||||
spec,
|
||||
)?;
|
||||
}
|
||||
BeaconBlockBodyRef::Altair(_) | BeaconBlockBodyRef::Merge(_) => {
|
||||
altair::process_attestations(
|
||||
state,
|
||||
block_body.attestations(),
|
||||
proposer_index,
|
||||
verify_signatures,
|
||||
ctxt,
|
||||
spec,
|
||||
)?;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ pub fn block_proposal_signature_set<'a, T, F, Payload: ExecPayload<T>>(
|
||||
get_pubkey: F,
|
||||
signed_block: &'a SignedBeaconBlock<T, Payload>,
|
||||
block_root: Option<Hash256>,
|
||||
check_proposer_index: bool,
|
||||
verified_proposer_index: Option<u64>,
|
||||
spec: &'a ChainSpec,
|
||||
) -> Result<SignatureSet<'a>>
|
||||
where
|
||||
@@ -85,19 +85,17 @@ where
|
||||
{
|
||||
let block = signed_block.message();
|
||||
|
||||
let proposer_index = if check_proposer_index {
|
||||
let proposer_index = state.get_beacon_proposer_index(block.slot(), spec)? as u64;
|
||||
|
||||
if proposer_index != block.proposer_index() {
|
||||
return Err(Error::IncorrectBlockProposer {
|
||||
block: block.proposer_index(),
|
||||
local_shuffling: proposer_index,
|
||||
});
|
||||
}
|
||||
let proposer_index = if let Some(proposer_index) = verified_proposer_index {
|
||||
proposer_index
|
||||
} else {
|
||||
block.proposer_index()
|
||||
state.get_beacon_proposer_index(block.slot(), spec)? as u64
|
||||
};
|
||||
if proposer_index != block.proposer_index() {
|
||||
return Err(Error::IncorrectBlockProposer {
|
||||
block: block.proposer_index(),
|
||||
local_shuffling: proposer_index,
|
||||
});
|
||||
}
|
||||
|
||||
block_proposal_signature_set_from_parts(
|
||||
signed_block,
|
||||
@@ -163,15 +161,18 @@ pub fn randao_signature_set<'a, T, F, Payload: ExecPayload<T>>(
|
||||
state: &'a BeaconState<T>,
|
||||
get_pubkey: F,
|
||||
block: BeaconBlockRef<'a, T, Payload>,
|
||||
verified_proposer_index: Option<u64>,
|
||||
spec: &'a ChainSpec,
|
||||
) -> Result<SignatureSet<'a>>
|
||||
where
|
||||
T: EthSpec,
|
||||
F: Fn(usize) -> Option<Cow<'a, PublicKey>>,
|
||||
{
|
||||
// FIXME(sproul): ensure this is checked elsewhere
|
||||
let proposer_index = block.proposer_index() as usize;
|
||||
// let proposer_index = state.get_beacon_proposer_index(block.slot(), spec)?;
|
||||
let proposer_index = if let Some(proposer_index) = verified_proposer_index {
|
||||
proposer_index
|
||||
} else {
|
||||
state.get_beacon_proposer_index(block.slot(), spec)? as u64
|
||||
};
|
||||
|
||||
let domain = spec.get_domain(
|
||||
block.slot().epoch(T::slots_per_epoch()),
|
||||
@@ -187,7 +188,7 @@ where
|
||||
|
||||
Ok(SignatureSet::single_pubkey(
|
||||
block.body().randao_reveal(),
|
||||
get_pubkey(proposer_index).ok_or(Error::ValidatorUnknown(proposer_index as u64))?,
|
||||
get_pubkey(proposer_index as usize).ok_or(Error::ValidatorUnknown(proposer_index))?,
|
||||
message,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -391,11 +391,12 @@ async fn invalid_attestation_no_committee_for_index() {
|
||||
head_block.to_mut().body_mut().attestations_mut()[0]
|
||||
.data
|
||||
.index += 1;
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -429,11 +430,12 @@ async fn invalid_attestation_wrong_justified_checkpoint() {
|
||||
.data
|
||||
.source = new_justified_checkpoint;
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -468,11 +470,12 @@ async fn invalid_attestation_bad_aggregation_bitfield_len() {
|
||||
head_block.to_mut().body_mut().attestations_mut()[0].aggregation_bits =
|
||||
Bitfield::with_capacity(spec.target_committee_size).unwrap();
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -500,11 +503,12 @@ async fn invalid_attestation_bad_signature() {
|
||||
.0;
|
||||
head_block.to_mut().body_mut().attestations_mut()[0].signature = AggregateSignature::empty();
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
// Expecting BadSignature because we're signing with invalid secret_keys
|
||||
@@ -538,11 +542,12 @@ async fn invalid_attestation_included_too_early() {
|
||||
.data
|
||||
.slot = new_attesation_slot;
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -580,11 +585,12 @@ async fn invalid_attestation_included_too_late() {
|
||||
.data
|
||||
.slot = new_attesation_slot;
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
assert_eq!(
|
||||
@@ -618,11 +624,12 @@ async fn invalid_attestation_target_epoch_slot_mismatch() {
|
||||
.target
|
||||
.epoch += Epoch::new(1);
|
||||
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attestations(
|
||||
&mut state,
|
||||
head_block.body(),
|
||||
head_block.proposer_index(),
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
assert_eq!(
|
||||
@@ -645,10 +652,12 @@ async fn valid_insert_attester_slashing() {
|
||||
let attester_slashing = harness.make_attester_slashing(vec![1, 2]);
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attester_slashings(
|
||||
&mut state,
|
||||
&[attester_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -665,10 +674,12 @@ async fn invalid_attester_slashing_not_slashable() {
|
||||
attester_slashing.attestation_1 = attester_slashing.attestation_2.clone();
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attester_slashings(
|
||||
&mut state,
|
||||
&[attester_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -691,10 +702,12 @@ async fn invalid_attester_slashing_1_invalid() {
|
||||
attester_slashing.attestation_1.attesting_indices = VariableList::from(vec![2, 1]);
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attester_slashings(
|
||||
&mut state,
|
||||
&[attester_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -720,10 +733,12 @@ async fn invalid_attester_slashing_2_invalid() {
|
||||
attester_slashing.attestation_2.attesting_indices = VariableList::from(vec![2, 1]);
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_attester_slashings(
|
||||
&mut state,
|
||||
&[attester_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -746,10 +761,12 @@ async fn valid_insert_proposer_slashing() {
|
||||
let harness = get_harness::<MainnetEthSpec>(EPOCH_OFFSET, VALIDATOR_COUNT).await;
|
||||
let proposer_slashing = harness.make_proposer_slashing(1);
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
// Expecting Ok(_) because we inserted a valid proposer slashing
|
||||
@@ -765,10 +782,12 @@ async fn invalid_proposer_slashing_proposals_identical() {
|
||||
proposer_slashing.signed_header_1.message = proposer_slashing.signed_header_2.message.clone();
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -792,10 +811,12 @@ async fn invalid_proposer_slashing_proposer_unknown() {
|
||||
proposer_slashing.signed_header_2.message.proposer_index = 3_141_592;
|
||||
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -816,10 +837,12 @@ async fn invalid_proposer_slashing_duplicate_slashing() {
|
||||
|
||||
let proposer_slashing = harness.make_proposer_slashing(1);
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result_1 = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing.clone()],
|
||||
VerifySignatures::False,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
assert!(result_1.is_ok());
|
||||
@@ -828,6 +851,7 @@ async fn invalid_proposer_slashing_duplicate_slashing() {
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::False,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
// Expecting ProposerNotSlashable because we've already slashed the validator
|
||||
@@ -847,10 +871,12 @@ async fn invalid_bad_proposal_1_signature() {
|
||||
let mut proposer_slashing = harness.make_proposer_slashing(1);
|
||||
proposer_slashing.signed_header_1.signature = Signature::empty();
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -871,10 +897,12 @@ async fn invalid_bad_proposal_2_signature() {
|
||||
let mut proposer_slashing = harness.make_proposer_slashing(1);
|
||||
proposer_slashing.signed_header_2.signature = Signature::empty();
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::True,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
@@ -896,10 +924,12 @@ async fn invalid_proposer_slashing_proposal_epoch_mismatch() {
|
||||
proposer_slashing.signed_header_1.message.slot = Slot::new(0);
|
||||
proposer_slashing.signed_header_2.message.slot = Slot::new(128);
|
||||
let mut state = harness.get_current_state();
|
||||
let mut ctxt = ConsensusContext::new(state.slot());
|
||||
let result = process_operations::process_proposer_slashings(
|
||||
&mut state,
|
||||
&[proposer_slashing],
|
||||
VerifySignatures::False,
|
||||
&mut ctxt,
|
||||
&spec,
|
||||
);
|
||||
|
||||
|
||||
@@ -29,9 +29,7 @@ pub fn verify_deposit_signature(deposit_data: &DepositData, spec: &ChainSpec) ->
|
||||
/// Returns a `Some(validator index)` if a pubkey already exists in the `validators`,
|
||||
/// otherwise returns `None`.
|
||||
///
|
||||
/// ## Errors
|
||||
///
|
||||
/// Errors if the state's `pubkey_cache` is not current.
|
||||
/// Builds the pubkey cache if it is not already built.
|
||||
pub fn get_existing_validator_index<T: EthSpec>(
|
||||
state: &mut BeaconState<T>,
|
||||
pub_key: &PublicKeyBytes,
|
||||
|
||||
Reference in New Issue
Block a user