Skip to content

Commit 06329ec

Browse files
authored
SingleAttestation implementation (#6488)
* First pass * Add restrictions to RuntimeVariableList api * Use empty_uninitialized and fix warnings * Fix some todos * Merge branch 'unstable' into max-blobs-preset * Fix take impl on RuntimeFixedList * cleanup * Fix test compilations * Fix some more tests * Fix test from unstable * Merge branch 'unstable' into max-blobs-preset * SingleAttestation * Add post attestation v2 endpoint logic to attestation service * Merge branch 'unstable' of https://github.com/sigp/lighthouse into single_attestation * Implement "Bugfix and more withdrawal tests" * Implement "Add missed exit checks to consolidation processing" * Implement "Update initial earliest_exit_epoch calculation" * Implement "Limit consolidating balance by validator.effective_balance" * Implement "Use 16-bit random value in validator filter" * Implement "Do not change creds type on consolidation" * some tests and fixed attestqtion calc * Merge branch 'unstable' of https://github.com/sigp/lighthouse into single_attestation * Rename PendingPartialWithdraw index field to validator_index * Skip slots to get test to pass and add TODO * Implement "Synchronously check all transactions to have non-zero length" * Merge remote-tracking branch 'origin/unstable' into max-blobs-preset * Remove footgun function * Minor simplifications * Move from preset to config * Fix typo * Revert "Remove footgun function" This reverts commit de01f92. * Try fixing tests * Implement "bump minimal preset MAX_BLOB_COMMITMENTS_PER_BLOCK and KZG_COMMITMENT_INCLUSION_PROOF_DEPTH" * Thread through ChainSpec * Fix release tests * Move RuntimeFixedVector into module and rename * Add test * Merge branch 'unstable' of https://github.com/sigp/lighthouse into single_attestation * Added more test coverage, simplified Attestation conversion, and other minor refactors * Removed unusued codepaths * Fix failing test * Implement "Remove post-altair `initialize_beacon_state_from_eth1` from specs" * Update preset YAML * Remove empty RuntimeVarList awefullness * Make max_blobs_per_block a config parameter (#6329) Squashed commit of the following: commit 04b3743 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 17:36:58 2025 +1100 Add test commit 440e854 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 17:24:50 2025 +1100 Move RuntimeFixedVector into module and rename commit f66e179 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 17:17:17 2025 +1100 Fix release tests commit e4bfe71 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 17:05:30 2025 +1100 Thread through ChainSpec commit 063b79c Author: Michael Sproul <[email protected]> Date: Mon Jan 6 15:32:16 2025 +1100 Try fixing tests commit 88bedf0 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 15:04:37 2025 +1100 Revert "Remove footgun function" This reverts commit de01f92. commit 32483d3 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 15:04:32 2025 +1100 Fix typo commit 2e86585 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 15:04:15 2025 +1100 Move from preset to config commit 1095d60 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 14:38:40 2025 +1100 Minor simplifications commit de01f92 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 14:06:57 2025 +1100 Remove footgun function commit 0c2c8c4 Merge: 21ecb58 f51a292 Author: Michael Sproul <[email protected]> Date: Mon Jan 6 14:02:50 2025 +1100 Merge remote-tracking branch 'origin/unstable' into max-blobs-preset commit f51a292 Author: Daniel Knopik <[email protected]> Date: Fri Jan 3 20:27:21 2025 +0100 fully lint only explicitly to avoid unnecessary rebuilds (#6753) * fully lint only explicitly to avoid unnecessary rebuilds commit 7e0cdde Author: Akihito Nakano <[email protected]> Date: Tue Dec 24 10:38:56 2024 +0900 Make sure we have fanout peers when publish (#6738) * Ensure that `fanout_peers` is always non-empty if it's `Some` commit 21ecb58 Merge: 2fcb293 9aefb55 Author: Pawan Dhananjay <[email protected]> Date: Mon Oct 21 14:46:00 2024 -0700 Merge branch 'unstable' into max-blobs-preset commit 2fcb293 Author: Pawan Dhananjay <[email protected]> Date: Fri Sep 6 18:28:31 2024 -0700 Fix test from unstable commit 12c6ef1 Author: Pawan Dhananjay <[email protected]> Date: Wed Sep 4 16:16:36 2024 -0700 Fix some more tests commit d37733b Author: Pawan Dhananjay <[email protected]> Date: Wed Sep 4 12:47:36 2024 -0700 Fix test compilations commit 52bb581 Author: Pawan Dhananjay <[email protected]> Date: Tue Sep 3 18:38:19 2024 -0700 cleanup commit e71020e Author: Pawan Dhananjay <[email protected]> Date: Tue Sep 3 17:16:10 2024 -0700 Fix take impl on RuntimeFixedList commit 13f9bba Merge: 60100fc 4e675cf Author: Pawan Dhananjay <[email protected]> Date: Tue Sep 3 16:08:59 2024 -0700 Merge branch 'unstable' into max-blobs-preset commit 60100fc Author: Pawan Dhananjay <[email protected]> Date: Fri Aug 30 16:04:11 2024 -0700 Fix some todos commit a9cb329 Author: Pawan Dhananjay <[email protected]> Date: Fri Aug 30 15:54:00 2024 -0700 Use empty_uninitialized and fix warnings commit 4dc6e65 Author: Pawan Dhananjay <[email protected]> Date: Fri Aug 30 15:53:18 2024 -0700 Add restrictions to RuntimeVariableList api commit 25feedf Author: Pawan Dhananjay <[email protected]> Date: Thu Aug 29 16:11:19 2024 -0700 First pass * Fix tests * Implement max_blobs_per_block_electra * Fix config issues * Simplify BlobSidecarListFromRoot * Disable PeerDAS tests * Cleanup single attestation imports * Fix some single attestation network plumbing * Merge remote-tracking branch 'origin/unstable' into max-blobs-preset * Bump quota to account for new target (6) * Remove clone * Fix issue from review * Try to remove ugliness * Merge branch 'unstable' into max-blobs-preset * Merge remote-tracking branch 'origin/unstable' into electra-alpha10 * Merge commit '04b3743ec1e0b650269dd8e58b540c02430d1c0d' into electra-alpha10 * Merge remote-tracking branch 'pawan/max-blobs-preset' into electra-alpha10 * Update tests to v1.5.0-beta.0 * Merge remote-tracking branch 'origin/electra-alpha10' into single_attestation * Fix some tests * Cargo fmt * lint * fmt * Resolve merge conflicts * Merge branch 'electra-alpha10' of https://github.com/sigp/lighthouse into single_attestation * lint * Linting * fmt * Merge branch 'electra-alpha10' of https://github.com/sigp/lighthouse into single_attestation * Fmt * Fix test and add TODO * Gracefully handle slashed proposers in fork choice tests * Merge remote-tracking branch 'origin/unstable' into electra-alpha10 * Keep latest changes from max_blobs_per_block PR in codec.rs * Revert a few more regressions and add a comment * Merge branch 'electra-alpha10' of https://github.com/sigp/lighthouse into single_attestation * Disable more DAS tests * Improve validator monitor test a little * Make test more robust * Fix sync test that didn't understand blobs * Fill out cropped comment * Merge remote-tracking branch 'origin/electra-alpha10' into single_attestation * Merge remote-tracking branch 'origin/unstable' into single_attestation * Merge remote-tracking branch 'origin/unstable' into single_attestation * Merge branch 'unstable' of https://github.com/sigp/lighthouse into single_attestation * publish_attestations should accept Either<Attestation,SingleAttestation> * log an error when failing to convert to SingleAttestation * Use Cow to avoid clone * Avoid reconverting to SingleAttestation * Tweak VC error message * update comments * update comments * pass in single attestation as ref to subnetid calculation method * Improved API, new error variants and other minor tweaks * Fix single_attestation event topic boilerplate * fix sse event failure * Add single_attestation event topic test coverage
1 parent 669932a commit 06329ec

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)