mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-03 00:31:50 +00:00
Use all attestation subnets (#1257)
* Update `milagro_bls` to new release (#1183) * Update milagro_bls to new release Signed-off-by: Kirk Baird <baird.k@outlook.com> * Tidy up fake cryptos Signed-off-by: Kirk Baird <baird.k@outlook.com> * move SecretHash to bls and put plaintext back Signed-off-by: Kirk Baird <baird.k@outlook.com> * Update v0.12.0 to v0.12.1 * Add compute_subnet_for_attestation * Replace CommitteeIndex topic with Attestation * Fix warnings * Fix attestation service tests * fmt * Appease clippy * return error from validator_subscriptions * move state out of loop * Fix early break on error * Get state from slot clock * Fix beacon state in attestation tests * Add failing test for lookahead > 1 * Minor change * Address some review comments * Add subnet verification to beacon chain * Move subnet verification to processor * Pass committee_count_at_slot to ValidatorDuty and ValidatorSubscription * Pass subnet id for publishing attestations * Fix attestation service tests * Fix more tests * Fix fork choice test * Remove unused code * Remove more unused and expensive code Co-authored-by: Kirk Baird <baird.k@outlook.com> Co-authored-by: Michael Sproul <michael@sigmaprime.io> Co-authored-by: Age Manning <Age@AgeManning.com> Co-authored-by: Paul Hauner <paul@paulhauner.com>
This commit is contained in:
@@ -5,13 +5,13 @@ use crate::{
|
||||
use environment::RuntimeContext;
|
||||
use futures::StreamExt;
|
||||
use remote_beacon_node::{PublishStatus, RemoteBeaconNode};
|
||||
use slog::{crit, debug, info, trace};
|
||||
use slog::{crit, debug, error, info, trace};
|
||||
use slot_clock::SlotClock;
|
||||
use std::collections::HashMap;
|
||||
use std::ops::Deref;
|
||||
use std::sync::Arc;
|
||||
use tokio::time::{delay_until, interval_at, Duration, Instant};
|
||||
use types::{Attestation, ChainSpec, CommitteeIndex, EthSpec, Slot};
|
||||
use types::{Attestation, ChainSpec, CommitteeIndex, EthSpec, Slot, SubnetId};
|
||||
|
||||
/// Builds an `AttestationService`.
|
||||
pub struct AttestationServiceBuilder<T, E: EthSpec> {
|
||||
@@ -334,17 +334,22 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
.iter()
|
||||
.filter_map(|duty| {
|
||||
// Ensure that all required fields are present in the validator duty.
|
||||
let (duty_slot, duty_committee_index, validator_committee_position, _) =
|
||||
if let Some(tuple) = duty.attestation_duties() {
|
||||
tuple
|
||||
} else {
|
||||
crit!(
|
||||
log,
|
||||
"Missing validator duties when signing";
|
||||
"duties" => format!("{:?}", duty)
|
||||
);
|
||||
return None;
|
||||
};
|
||||
let (
|
||||
duty_slot,
|
||||
duty_committee_index,
|
||||
validator_committee_position,
|
||||
_,
|
||||
committee_count_at_slot,
|
||||
) = if let Some(tuple) = duty.attestation_duties() {
|
||||
tuple
|
||||
} else {
|
||||
crit!(
|
||||
log,
|
||||
"Missing validator duties when signing";
|
||||
"duties" => format!("{:?}", duty)
|
||||
);
|
||||
return None;
|
||||
};
|
||||
|
||||
// Ensure that the attestation matches the duties.
|
||||
if duty_slot != attestation.data.slot
|
||||
@@ -363,7 +368,18 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
}
|
||||
|
||||
let mut attestation = attestation.clone();
|
||||
|
||||
let subnet_id = SubnetId::compute_subnet_for_attestation_data::<E>(
|
||||
&attestation.data,
|
||||
committee_count_at_slot,
|
||||
&self.context.eth2_config().spec,
|
||||
)
|
||||
.map_err(|e| {
|
||||
error!(
|
||||
log,
|
||||
"Failed to compute subnet id to publish attestation: {:?}", e
|
||||
)
|
||||
})
|
||||
.ok()?;
|
||||
self.validator_store
|
||||
.sign_attestation(
|
||||
duty.validator_pubkey(),
|
||||
@@ -371,7 +387,7 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
&mut attestation,
|
||||
current_epoch,
|
||||
)
|
||||
.map(|_| attestation)
|
||||
.map(|_| (attestation, subnet_id))
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
@@ -379,7 +395,7 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
// just return early.
|
||||
if let Some(attestation) = signed_attestations.first().cloned() {
|
||||
let num_attestations = signed_attestations.len();
|
||||
let beacon_block_root = attestation.data.beacon_block_root;
|
||||
let beacon_block_root = attestation.0.data.beacon_block_root;
|
||||
|
||||
self.beacon_node
|
||||
.http
|
||||
@@ -409,7 +425,7 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
crit!(log, "Unknown condition when publishing unagg. attestation")
|
||||
}
|
||||
})
|
||||
.map(|()| Some(attestation))
|
||||
.map(|()| Some(attestation.0))
|
||||
} else {
|
||||
debug!(
|
||||
log,
|
||||
@@ -459,7 +475,7 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
|
||||
// subscribed aggregators.
|
||||
let selection_proof = duty_and_proof.selection_proof.as_ref()?.clone();
|
||||
|
||||
let (duty_slot, duty_committee_index, _, validator_index) =
|
||||
let (duty_slot, duty_committee_index, _, validator_index, _) =
|
||||
duty_and_proof.attestation_duties().or_else(|| {
|
||||
crit!(log, "Missing duties when signing aggregate");
|
||||
None
|
||||
|
||||
@@ -90,12 +90,13 @@ impl DutyAndProof {
|
||||
|
||||
/// Returns the information required for an attesting validator, if they are scheduled to
|
||||
/// attest.
|
||||
pub fn attestation_duties(&self) -> Option<(Slot, CommitteeIndex, usize, u64)> {
|
||||
pub fn attestation_duties(&self) -> Option<(Slot, CommitteeIndex, usize, u64, u64)> {
|
||||
Some((
|
||||
self.duty.attestation_slot?,
|
||||
self.duty.attestation_committee_index?,
|
||||
self.duty.attestation_committee_position?,
|
||||
self.duty.validator_index?,
|
||||
self.duty.committee_count_at_slot?,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -116,6 +117,7 @@ impl TryInto<DutyAndProof> for ValidatorDutyBytes {
|
||||
attestation_slot: self.attestation_slot,
|
||||
attestation_committee_index: self.attestation_committee_index,
|
||||
attestation_committee_position: self.attestation_committee_position,
|
||||
committee_count_at_slot: self.committee_count_at_slot,
|
||||
block_proposal_slots: self.block_proposal_slots,
|
||||
aggregator_modulo: self.aggregator_modulo,
|
||||
};
|
||||
@@ -609,6 +611,7 @@ impl<T: SlotClock + 'static, E: EthSpec> DutiesService<T, E> {
|
||||
validator_index: remote_duties.validator_index?,
|
||||
attestation_committee_index: remote_duties.attestation_committee_index?,
|
||||
slot: remote_duties.attestation_slot?,
|
||||
committee_count_at_slot: remote_duties.committee_count_at_slot?,
|
||||
is_aggregator,
|
||||
})
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user