mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-15 02:42:38 +00:00
Merge branch 'electra-engine-api' of https://github.com/sigp/lighthouse into beacon-api-electra
This commit is contained in:
@@ -367,9 +367,16 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
let duty = &duty_and_proof.duty;
|
||||
let attestation_data = attestation_data_ref;
|
||||
|
||||
let fork_name = self
|
||||
.context
|
||||
.eth2_config
|
||||
.spec
|
||||
.fork_name_at_slot::<E>(attestation_data.slot);
|
||||
|
||||
// Ensure that the attestation matches the duties.
|
||||
#[allow(clippy::suspicious_operation_groupings)]
|
||||
if duty.slot != attestation_data.slot || duty.committee_index != attestation_data.index
|
||||
if duty.slot != attestation_data.slot
|
||||
|| (fork_name < ForkName::Electra && duty.committee_index != attestation_data.index)
|
||||
{
|
||||
crit!(
|
||||
log,
|
||||
@@ -383,12 +390,6 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
return None;
|
||||
}
|
||||
|
||||
let fork_name = self
|
||||
.context
|
||||
.eth2_config
|
||||
.spec
|
||||
.fork_name_at_slot::<E>(attestation_data.slot);
|
||||
|
||||
let mut attestation = if fork_name >= ForkName::Electra {
|
||||
let mut committee_bits: BitVector<E::MaxCommitteesPerSlot> = BitVector::default();
|
||||
committee_bits
|
||||
@@ -576,6 +577,12 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
.await
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
let fork_name = self
|
||||
.context
|
||||
.eth2_config
|
||||
.spec
|
||||
.fork_name_at_slot::<E>(attestation_data.slot);
|
||||
|
||||
// Create futures to produce the signed aggregated attestations.
|
||||
let signing_futures = validator_duties.iter().map(|duty_and_proof| async move {
|
||||
let duty = &duty_and_proof.duty;
|
||||
@@ -584,7 +591,9 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
let slot = attestation_data.slot;
|
||||
let committee_index = attestation_data.index;
|
||||
|
||||
if duty.slot != slot || duty.committee_index != committee_index {
|
||||
if duty.slot != slot
|
||||
|| (fork_name < ForkName::Electra && duty.committee_index != committee_index)
|
||||
{
|
||||
crit!(log, "Inconsistent validator duties during signing");
|
||||
return None;
|
||||
}
|
||||
|
||||
@@ -215,6 +215,8 @@ pub struct DutiesService<T, E: EthSpec> {
|
||||
pub sync_duties: SyncDutiesMap<E>,
|
||||
/// Provides the canonical list of locally-managed validators.
|
||||
pub validator_store: Arc<ValidatorStore<T, E>>,
|
||||
/// Maps unknown validator pubkeys to the next slot time when a poll should be conducted again.
|
||||
pub unknown_validator_next_poll_slots: RwLock<HashMap<PublicKeyBytes, Slot>>,
|
||||
/// Tracks the current slot.
|
||||
pub slot_clock: T,
|
||||
/// Provides HTTP access to remote beacon nodes.
|
||||
@@ -489,6 +491,24 @@ async fn poll_validator_indices<T: SlotClock + 'static, E: EthSpec>(
|
||||
.is_some();
|
||||
|
||||
if !is_known {
|
||||
let current_slot_opt = duties_service.slot_clock.now();
|
||||
|
||||
if let Some(current_slot) = current_slot_opt {
|
||||
let is_first_slot_of_epoch = current_slot % E::slots_per_epoch() == 0;
|
||||
|
||||
// Query an unknown validator later if it was queried within the last epoch, or if
|
||||
// the current slot is the first slot of an epoch.
|
||||
let poll_later = duties_service
|
||||
.unknown_validator_next_poll_slots
|
||||
.read()
|
||||
.get(&pubkey)
|
||||
.map(|&poll_slot| poll_slot > current_slot || is_first_slot_of_epoch)
|
||||
.unwrap_or(false);
|
||||
if poll_later {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Query the remote BN to resolve a pubkey to a validator index.
|
||||
let download_result = duties_service
|
||||
.beacon_nodes
|
||||
@@ -533,10 +553,23 @@ async fn poll_validator_indices<T: SlotClock + 'static, E: EthSpec>(
|
||||
.initialized_validators()
|
||||
.write()
|
||||
.set_index(&pubkey, response.data.index);
|
||||
|
||||
duties_service
|
||||
.unknown_validator_next_poll_slots
|
||||
.write()
|
||||
.remove(&pubkey);
|
||||
}
|
||||
// This is not necessarily an error, it just means the validator is not yet known to
|
||||
// the beacon chain.
|
||||
Ok(None) => {
|
||||
if let Some(current_slot) = current_slot_opt {
|
||||
let next_poll_slot = current_slot.saturating_add(E::slots_per_epoch());
|
||||
duties_service
|
||||
.unknown_validator_next_poll_slots
|
||||
.write()
|
||||
.insert(pubkey, next_poll_slot);
|
||||
}
|
||||
|
||||
debug!(
|
||||
log,
|
||||
"Validator without index";
|
||||
|
||||
@@ -476,6 +476,7 @@ impl<E: EthSpec> ProductionValidatorClient<E> {
|
||||
slot_clock: slot_clock.clone(),
|
||||
beacon_nodes: beacon_nodes.clone(),
|
||||
validator_store: validator_store.clone(),
|
||||
unknown_validator_next_poll_slots: <_>::default(),
|
||||
spec: context.eth2_config.spec.clone(),
|
||||
context: duties_context,
|
||||
enable_high_validator_count_metrics: config.enable_high_validator_count_metrics,
|
||||
|
||||
Reference in New Issue
Block a user