Skip to content

Commit

Permalink
Merge pull request #5835 from realbigsean/fix-validator-logic
Browse files Browse the repository at this point in the history
Fix validator logic
  • Loading branch information
realbigsean authored May 24, 2024
2 parents 469296b + bb734af commit 3f169ef
Showing 1 changed file with 38 additions and 7 deletions.
45 changes: 38 additions & 7 deletions validator_client/src/attestation_service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use types::{
attestation::AttestationBase, AggregateSignature, Attestation, AttestationData, BitList,
ChainSpec, CommitteeIndex, EthSpec, Slot,
};
use types::{AttestationElectra, BitVector, ForkName};

/// Builds an `AttestationService`.
pub struct AttestationServiceBuilder<T: SlotClock + 'static, E: EthSpec> {
Expand Down Expand Up @@ -362,9 +363,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,
Expand All @@ -378,11 +386,26 @@ impl<T: SlotClock + 'static, E: EthSpec> AttestationService<T, E> {
return None;
}

let mut attestation = Attestation::Base(AttestationBase {
aggregation_bits: BitList::with_capacity(duty.committee_length as usize).unwrap(),
data: attestation_data.clone(),
signature: AggregateSignature::infinity(),
});
let mut attestation = if fork_name >= ForkName::Electra {
let mut committee_bits: BitVector<E::MaxCommitteesPerSlot> = BitVector::default();
committee_bits
.set(duty.committee_index as usize, true)
.unwrap();
Attestation::Electra(AttestationElectra {
aggregation_bits: BitList::with_capacity(duty.committee_length as usize)
.unwrap(),
data: attestation_data.clone(),
committee_bits,
signature: AggregateSignature::infinity(),
})
} else {
Attestation::Base(AttestationBase {
aggregation_bits: BitList::with_capacity(duty.committee_length as usize)
.unwrap(),
data: attestation_data.clone(),
signature: AggregateSignature::infinity(),
})
};

match self
.validator_store
Expand Down Expand Up @@ -531,6 +554,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;
Expand All @@ -539,7 +568,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;
}
Expand Down

0 comments on commit 3f169ef

Please sign in to comment.