Skip to content

Commit 87d6012

Browse files
authored
Merge of #6488
2 parents 669932a + 42c01c6 commit 87d6012

File tree

22 files changed

+829
-102
lines changed

22 files changed

+829
-102
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

beacon_node/beacon_chain/src/attestation_verification.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use tree_hash::TreeHash;
6262
use types::{
6363
Attestation, AttestationRef, BeaconCommittee, BeaconStateError::NoCommitteeFound, ChainSpec,
6464
CommitteeIndex, Epoch, EthSpec, Hash256, IndexedAttestation, SelectionProof,
65-
SignedAggregateAndProof, Slot, SubnetId,
65+
SignedAggregateAndProof, SingleAttestation, Slot, SubnetId,
6666
};
6767

6868
pub use batch::{batch_verify_aggregated_attestations, batch_verify_unaggregated_attestations};
@@ -317,12 +317,22 @@ pub struct VerifiedUnaggregatedAttestation<'a, T: BeaconChainTypes> {
317317
attestation: AttestationRef<'a, T::EthSpec>,
318318
indexed_attestation: IndexedAttestation<T::EthSpec>,
319319
subnet_id: SubnetId,
320+
validator_index: usize,
320321
}
321322

322323
impl<T: BeaconChainTypes> VerifiedUnaggregatedAttestation<'_, T> {
323324
pub fn into_indexed_attestation(self) -> IndexedAttestation<T::EthSpec> {
324325
self.indexed_attestation
325326
}
327+
328+
pub fn single_attestation(&self) -> Option<SingleAttestation> {
329+
Some(SingleAttestation {
330+
committee_index: self.attestation.committee_index()? as usize,
331+
attester_index: self.validator_index,
332+
data: self.attestation.data().clone(),
333+
signature: self.attestation.signature().clone(),
334+
})
335+
}
326336
}
327337

328338
/// Custom `Clone` implementation is to avoid the restrictive trait bounds applied by the usual derive
@@ -1035,6 +1045,7 @@ impl<'a, T: BeaconChainTypes> VerifiedUnaggregatedAttestation<'a, T> {
10351045
attestation,
10361046
indexed_attestation,
10371047
subnet_id,
1048+
validator_index: validator_index as usize,
10381049
})
10391050
}
10401051

beacon_node/beacon_chain/src/beacon_chain.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2035,10 +2035,30 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
20352035
|v| {
20362036
// This method is called for API and gossip attestations, so this covers all unaggregated attestation events
20372037
if let Some(event_handler) = self.event_handler.as_ref() {
2038+
if event_handler.has_single_attestation_subscribers() {
2039+
let current_fork = self
2040+
.spec
2041+
.fork_name_at_slot::<T::EthSpec>(v.attestation().data().slot);
2042+
if current_fork.electra_enabled() {
2043+
// I don't see a situation where this could return None. The upstream unaggregated attestation checks
2044+
// should have already verified that this is an attestation with a single committee bit set.
2045+
if let Some(single_attestation) = v.single_attestation() {
2046+
event_handler.register(EventKind::SingleAttestation(Box::new(
2047+
single_attestation,
2048+
)));
2049+
}
2050+
}
2051+
}
2052+
20382053
if event_handler.has_attestation_subscribers() {
2039-
event_handler.register(EventKind::Attestation(Box::new(
2040-
v.attestation().clone_as_attestation(),
2041-
)));
2054+
let current_fork = self
2055+
.spec
2056+
.fork_name_at_slot::<T::EthSpec>(v.attestation().data().slot);
2057+
if !current_fork.electra_enabled() {
2058+
event_handler.register(EventKind::Attestation(Box::new(
2059+
v.attestation().clone_as_attestation(),
2060+
)));
2061+
}
20422062
}
20432063
}
20442064
metrics::inc_counter(&metrics::UNAGGREGATED_ATTESTATION_PROCESSING_SUCCESSES);

beacon_node/beacon_chain/src/events.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const DEFAULT_CHANNEL_CAPACITY: usize = 16;
88

99
pub struct ServerSentEventHandler<E: EthSpec> {
1010
attestation_tx: Sender<EventKind<E>>,
11+
single_attestation_tx: Sender<EventKind<E>>,
1112
block_tx: Sender<EventKind<E>>,
1213
blob_sidecar_tx: Sender<EventKind<E>>,
1314
finalized_tx: Sender<EventKind<E>>,
@@ -37,6 +38,7 @@ impl<E: EthSpec> ServerSentEventHandler<E> {
3738

3839
pub fn new_with_capacity(log: Logger, capacity: usize) -> Self {
3940
let (attestation_tx, _) = broadcast::channel(capacity);
41+
let (single_attestation_tx, _) = broadcast::channel(capacity);
4042
let (block_tx, _) = broadcast::channel(capacity);
4143
let (blob_sidecar_tx, _) = broadcast::channel(capacity);
4244
let (finalized_tx, _) = broadcast::channel(capacity);
@@ -56,6 +58,7 @@ impl<E: EthSpec> ServerSentEventHandler<E> {
5658

5759
Self {
5860
attestation_tx,
61+
single_attestation_tx,
5962
block_tx,
6063
blob_sidecar_tx,
6164
finalized_tx,
@@ -90,6 +93,10 @@ impl<E: EthSpec> ServerSentEventHandler<E> {
9093
.attestation_tx
9194
.send(kind)
9295
.map(|count| log_count("attestation", count)),
96+
EventKind::SingleAttestation(_) => self
97+
.single_attestation_tx
98+
.send(kind)
99+
.map(|count| log_count("single_attestation", count)),
93100
EventKind::Block(_) => self
94101
.block_tx
95102
.send(kind)
@@ -164,6 +171,10 @@ impl<E: EthSpec> ServerSentEventHandler<E> {
164171
self.attestation_tx.subscribe()
165172
}
166173

174+
pub fn subscribe_single_attestation(&self) -> Receiver<EventKind<E>> {
175+
self.single_attestation_tx.subscribe()
176+
}
177+
167178
pub fn subscribe_block(&self) -> Receiver<EventKind<E>> {
168179
self.block_tx.subscribe()
169180
}
@@ -232,6 +243,10 @@ impl<E: EthSpec> ServerSentEventHandler<E> {
232243
self.attestation_tx.receiver_count() > 0
233244
}
234245

246+
pub fn has_single_attestation_subscribers(&self) -> bool {
247+
self.single_attestation_tx.receiver_count() > 0
248+
}
249+
235250
pub fn has_block_subscribers(&self) -> bool {
236251
self.block_tx.receiver_count() > 0
237252
}

0 commit comments

Comments
 (0)