mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-09 19:51:47 +00:00
Merge branch 'electra-engine-api' of https://github.com/sigp/lighthouse into beacon-api-electra
This commit is contained in:
@@ -61,10 +61,9 @@ use std::borrow::Cow;
|
||||
use strum::AsRefStr;
|
||||
use tree_hash::TreeHash;
|
||||
use types::{
|
||||
Attestation, AttestationRef, BeaconCommittee,
|
||||
BeaconStateError::{self, NoCommitteeFound},
|
||||
ChainSpec, CommitteeIndex, Epoch, EthSpec, ForkName, Hash256, IndexedAttestation,
|
||||
SelectionProof, SignedAggregateAndProof, Slot, SubnetId,
|
||||
Attestation, AttestationRef, BeaconCommittee, BeaconStateError::NoCommitteeFound, ChainSpec,
|
||||
CommitteeIndex, Epoch, EthSpec, Hash256, IndexedAttestation, SelectionProof,
|
||||
SignedAggregateAndProof, Slot, SubnetId,
|
||||
};
|
||||
|
||||
pub use batch::{batch_verify_aggregated_attestations, batch_verify_unaggregated_attestations};
|
||||
@@ -266,30 +265,9 @@ pub enum Error {
|
||||
BeaconChainError(BeaconChainError),
|
||||
}
|
||||
|
||||
// TODO(electra) the error conversion changes here are to get a test case to pass
|
||||
// this could easily be cleaned up
|
||||
impl From<BeaconChainError> for Error {
|
||||
fn from(e: BeaconChainError) -> Self {
|
||||
match &e {
|
||||
BeaconChainError::BeaconStateError(beacon_state_error) => {
|
||||
if let BeaconStateError::AggregatorNotInCommittee { aggregator_index } =
|
||||
beacon_state_error
|
||||
{
|
||||
Self::AggregatorNotInCommittee {
|
||||
aggregator_index: *aggregator_index,
|
||||
}
|
||||
} else if let BeaconStateError::InvalidSelectionProof { aggregator_index } =
|
||||
beacon_state_error
|
||||
{
|
||||
Self::InvalidSelectionProof {
|
||||
aggregator_index: *aggregator_index,
|
||||
}
|
||||
} else {
|
||||
Error::BeaconChainError(e)
|
||||
}
|
||||
}
|
||||
_ => Error::BeaconChainError(e),
|
||||
}
|
||||
Self::BeaconChainError(e)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1169,7 +1147,7 @@ pub fn verify_propagation_slot_range<S: SlotClock, E: EthSpec>(
|
||||
|
||||
let current_fork =
|
||||
spec.fork_name_at_slot::<E>(slot_clock.now().ok_or(BeaconChainError::UnableToReadSlot)?);
|
||||
let earliest_permissible_slot = if current_fork < ForkName::Deneb {
|
||||
let earliest_permissible_slot = if !current_fork.deneb_enabled() {
|
||||
one_epoch_prior
|
||||
// EIP-7045
|
||||
} else {
|
||||
@@ -1414,11 +1392,11 @@ pub fn obtain_indexed_attestation_and_committees_per_slot<T: BeaconChainTypes>(
|
||||
/// Runs the `map_fn` with the committee and committee count per slot for the given `attestation`.
|
||||
///
|
||||
/// This function exists in this odd "map" pattern because efficiently obtaining the committees for
|
||||
/// an attestations slot can be complex. It might involve reading straight from the
|
||||
/// an attestation's slot can be complex. It might involve reading straight from the
|
||||
/// `beacon_chain.shuffling_cache` or it might involve reading it from a state from the DB. Due to
|
||||
/// the complexities of `RwLock`s on the shuffling cache, a simple `Cow` isn't suitable here.
|
||||
///
|
||||
/// If the committees for an `attestation`'s slot isn't found in the `shuffling_cache`, we will read a state
|
||||
/// If the committees for an `attestation`'s slot aren't found in the `shuffling_cache`, we will read a state
|
||||
/// from disk and then update the `shuffling_cache`.
|
||||
///
|
||||
/// Committees are sorted by ascending index order 0..committees_per_slot
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
|
||||
use beacon_chain::block_verification_types::{AsBlock, ExecutedBlock, RpcBlock};
|
||||
use beacon_chain::{
|
||||
test_utils::{AttestationStrategy, BeaconChainHarness, BlockStrategy, EphemeralHarnessType},
|
||||
test_utils::{
|
||||
test_spec, AttestationStrategy, BeaconChainHarness, BlockStrategy, EphemeralHarnessType,
|
||||
},
|
||||
AvailabilityProcessingStatus, BeaconChain, BeaconChainTypes, ExecutionPendingBlock,
|
||||
};
|
||||
use beacon_chain::{
|
||||
@@ -1210,8 +1212,14 @@ async fn block_gossip_verification() {
|
||||
#[tokio::test]
|
||||
async fn verify_block_for_gossip_slashing_detection() {
|
||||
let slasher_dir = tempdir().unwrap();
|
||||
let spec = Arc::new(test_spec::<E>());
|
||||
let slasher = Arc::new(
|
||||
Slasher::open(SlasherConfig::new(slasher_dir.path().into()), test_logger()).unwrap(),
|
||||
Slasher::open(
|
||||
SlasherConfig::new(slasher_dir.path().into()),
|
||||
spec,
|
||||
test_logger(),
|
||||
)
|
||||
.unwrap(),
|
||||
);
|
||||
|
||||
let inner_slasher = slasher.clone();
|
||||
|
||||
@@ -184,8 +184,8 @@ pub fn earliest_attestation_validators<E: EthSpec>(
|
||||
// Bitfield of validators whose attestations are new/fresh.
|
||||
let mut new_validators = match attestation.indexed {
|
||||
CompactIndexedAttestation::Base(indexed_att) => indexed_att.aggregation_bits.clone(),
|
||||
// TODO(electra) per the comments above, this code path is obsolete post altair fork, so maybe we should just return an empty bitlist here?
|
||||
CompactIndexedAttestation::Electra(_) => todo!(),
|
||||
// This code path is obsolete post altair fork, so we just return an empty bitlist here.
|
||||
CompactIndexedAttestation::Electra(_) => return BitList::with_capacity(0).unwrap(),
|
||||
};
|
||||
|
||||
let state_attestations = if attestation.checkpoint.target_epoch == state.current_epoch() {
|
||||
|
||||
@@ -165,22 +165,22 @@ impl<E: EthSpec> CompactIndexedAttestation<E> {
|
||||
CompactIndexedAttestation::Electra(this),
|
||||
CompactIndexedAttestation::Electra(other),
|
||||
) => this.should_aggregate(other),
|
||||
// TODO(electra) is a mix of electra and base compact indexed attestations an edge case we need to deal with?
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn aggregate(&mut self, other: &Self) -> Option<()> {
|
||||
/// Returns `true` if aggregated, otherwise `false`.
|
||||
pub fn aggregate(&mut self, other: &Self) -> bool {
|
||||
match (self, other) {
|
||||
(CompactIndexedAttestation::Base(this), CompactIndexedAttestation::Base(other)) => {
|
||||
this.aggregate(other)
|
||||
this.aggregate(other);
|
||||
true
|
||||
}
|
||||
(
|
||||
CompactIndexedAttestation::Electra(this),
|
||||
CompactIndexedAttestation::Electra(other),
|
||||
) => this.aggregate_same_committee(other),
|
||||
// TODO(electra) is a mix of electra and base compact indexed attestations an edge case we need to deal with?
|
||||
_ => None,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -192,7 +192,7 @@ impl<E: EthSpec> CompactIndexedAttestationBase<E> {
|
||||
.is_zero()
|
||||
}
|
||||
|
||||
pub fn aggregate(&mut self, other: &Self) -> Option<()> {
|
||||
pub fn aggregate(&mut self, other: &Self) {
|
||||
self.attesting_indices = self
|
||||
.attesting_indices
|
||||
.drain(..)
|
||||
@@ -201,8 +201,6 @@ impl<E: EthSpec> CompactIndexedAttestationBase<E> {
|
||||
.collect();
|
||||
self.aggregation_bits = self.aggregation_bits.union(&other.aggregation_bits);
|
||||
self.signature.add_assign_aggregate(&other.signature);
|
||||
|
||||
Some(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,9 +214,10 @@ impl<E: EthSpec> CompactIndexedAttestationElectra<E> {
|
||||
.is_zero()
|
||||
}
|
||||
|
||||
pub fn aggregate_same_committee(&mut self, other: &Self) -> Option<()> {
|
||||
/// Returns `true` if aggregated, otherwise `false`.
|
||||
pub fn aggregate_same_committee(&mut self, other: &Self) -> bool {
|
||||
if self.committee_bits != other.committee_bits {
|
||||
return None;
|
||||
return false;
|
||||
}
|
||||
self.aggregation_bits = self.aggregation_bits.union(&other.aggregation_bits);
|
||||
self.attesting_indices = self
|
||||
@@ -228,7 +227,7 @@ impl<E: EthSpec> CompactIndexedAttestationElectra<E> {
|
||||
.dedup()
|
||||
.collect();
|
||||
self.signature.add_assign_aggregate(&other.signature);
|
||||
Some(())
|
||||
true
|
||||
}
|
||||
|
||||
pub fn aggregate_with_disjoint_committees(&mut self, other: &Self) -> Option<()> {
|
||||
@@ -318,8 +317,7 @@ impl<E: EthSpec> AttestationMap<E> {
|
||||
|
||||
for existing_attestation in attestations.iter_mut() {
|
||||
if existing_attestation.should_aggregate(&indexed) {
|
||||
existing_attestation.aggregate(&indexed);
|
||||
aggregated = true;
|
||||
aggregated = existing_attestation.aggregate(&indexed);
|
||||
} else if *existing_attestation == indexed {
|
||||
aggregated = true;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ use std::ptr;
|
||||
use types::{
|
||||
sync_aggregate::Error as SyncAggregateError, typenum::Unsigned, AbstractExecPayload,
|
||||
Attestation, AttestationData, AttesterSlashing, BeaconState, BeaconStateError, ChainSpec,
|
||||
Epoch, EthSpec, ForkName, ProposerSlashing, SignedBeaconBlock, SignedBlsToExecutionChange,
|
||||
Epoch, EthSpec, ProposerSlashing, SignedBeaconBlock, SignedBlsToExecutionChange,
|
||||
SignedVoluntaryExit, Slot, SyncAggregate, SyncCommitteeContribution, Validator,
|
||||
};
|
||||
|
||||
@@ -316,10 +316,10 @@ impl<E: EthSpec> OperationPool<E> {
|
||||
)
|
||||
.inspect(|_| num_curr_valid += 1);
|
||||
|
||||
let curr_epoch_limit = if fork_name < ForkName::Electra {
|
||||
E::MaxAttestations::to_usize()
|
||||
} else {
|
||||
let curr_epoch_limit = if fork_name.electra_enabled() {
|
||||
E::MaxAttestationsElectra::to_usize()
|
||||
} else {
|
||||
E::MaxAttestations::to_usize()
|
||||
};
|
||||
let prev_epoch_limit = if let BeaconState::Base(base_state) = state {
|
||||
std::cmp::min(
|
||||
|
||||
@@ -80,7 +80,7 @@ impl<E: EthSpec> ProductionBeaconNode<E> {
|
||||
|
||||
let builder = ClientBuilder::new(context.eth_spec_instance.clone())
|
||||
.runtime_context(context)
|
||||
.chain_spec(spec)
|
||||
.chain_spec(spec.clone())
|
||||
.beacon_processor(client_config.beacon_processor.clone())
|
||||
.http_api_config(client_config.http_api.clone())
|
||||
.disk_store(
|
||||
@@ -113,8 +113,12 @@ impl<E: EthSpec> ProductionBeaconNode<E> {
|
||||
_ => {}
|
||||
}
|
||||
let slasher = Arc::new(
|
||||
Slasher::open(slasher_config, log.new(slog::o!("service" => "slasher")))
|
||||
.map_err(|e| format!("Slasher open error: {:?}", e))?,
|
||||
Slasher::open(
|
||||
slasher_config,
|
||||
Arc::new(spec),
|
||||
log.new(slog::o!("service" => "slasher")),
|
||||
)
|
||||
.map_err(|e| format!("Slasher open error: {:?}", e))?,
|
||||
);
|
||||
builder.slasher(slasher)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user