Skip to content

Commit 6679d1a

Browse files
authored
Merge of #477
2 parents 7d2d94f + afd047f commit 6679d1a

File tree

2 files changed

+39
-19
lines changed
  • anchor

2 files changed

+39
-19
lines changed

anchor/signature_collector/src/lib.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl SignatureCollectorManager {
103103
self: &Arc<Self>,
104104
metadata: SignatureMetadata,
105105
requester: SignatureRequester,
106-
signing_data: SigningData,
106+
validator_signing_data: ValidatorSigningData,
107107
) -> Result<Arc<Signature>, CollectionError> {
108108
let Some(signer) = self.operator_id.get() else {
109109
return Err(CollectionError::OwnOperatorIdUnknown);
@@ -114,8 +114,8 @@ impl SignatureCollectorManager {
114114
debug!(
115115
?metadata,
116116
?requester,
117-
root=?signing_data.root,
118-
index=?signing_data.index,
117+
root=?validator_signing_data.root,
118+
index=?validator_signing_data.index,
119119
"sign_and_collect called",
120120
);
121121

@@ -125,8 +125,8 @@ impl SignatureCollectorManager {
125125
self.processor.permitless.send_immediate(
126126
move |drop_on_finish| {
127127
let sender = manager.get_or_spawn(
128-
signing_data.root,
129-
signing_data.index,
128+
validator_signing_data.root,
129+
validator_signing_data.index,
130130
cloned_metadata.slot,
131131
);
132132
let _ = sender.send(CollectorMessage {
@@ -144,21 +144,21 @@ impl SignatureCollectorManager {
144144
let manager = self.clone();
145145
self.processor.urgent_consensus.send_blocking(
146146
move || {
147-
trace!(root = ?signing_data.root, "Signing...");
147+
trace!(root = ?validator_signing_data.root, "Signing...");
148148
// If we have no share, we can not actually sign the message, because we are running
149149
// in impostor mode.
150-
let partial_signature = if let Some(share) = &signing_data.share {
151-
share.sign(signing_data.root)
150+
let partial_signature = if let Some(share) = &validator_signing_data.share {
151+
share.sign(validator_signing_data.root)
152152
} else {
153153
Signature::empty()
154154
};
155-
trace!(root = ?signing_data.root, "Signed");
155+
trace!(root = ?validator_signing_data.root, "Signed");
156156

157157
let message = PartialSignatureMessage {
158158
partial_signature,
159-
signing_root: signing_data.root,
159+
signing_root: validator_signing_data.root,
160160
signer,
161-
validator_index: signing_data.index,
161+
validator_index: validator_signing_data.index,
162162
};
163163
match requester {
164164
SignatureRequester::SingleValidator { pubkey } => {
@@ -178,12 +178,13 @@ impl SignatureCollectorManager {
178178
}
179179
SignatureRequester::Committee {
180180
num_signatures_to_collect,
181+
base_hash,
181182
} => {
182183
// We have to collect all signatures from the given validators.
183184
// To check this create or get an entry from the `committee_signatures` map.
184185
let mut entry = match manager
185186
.committee_signatures
186-
.entry((signing_data.root, metadata.committee_id))
187+
.entry((base_hash, metadata.committee_id))
187188
{
188189
Entry::Occupied(occupied) => occupied,
189190
Entry::Vacant(vacant) => vacant.insert_entry(CommitteeSignatures {
@@ -224,7 +225,7 @@ impl SignatureCollectorManager {
224225

225226
// Finally, make the local instance aware of the partial signature, if it is a real
226227
// signature.
227-
if signing_data.share.is_some() {
228+
if validator_signing_data.share.is_some() {
228229
let _ = manager.receive_partial_signature(message, metadata.slot);
229230
}
230231
},
@@ -391,11 +392,16 @@ pub enum SignatureRequester {
391392
Committee {
392393
/// The number of signatures we have to wait for.
393394
num_signatures_to_collect: usize,
395+
/// A hash that identifies what we are signing. We wait with sending the message until we
396+
/// have created enough signatures with this `base_hash`. We need this to differentiate
397+
/// "groups" of signatures. We cannot use the signing root, as we need to group signatures
398+
/// with differing signing roots.
399+
base_hash: Hash256,
394400
},
395401
}
396402

397403
#[derive(Clone)]
398-
pub struct SigningData {
404+
pub struct ValidatorSigningData {
399405
pub root: Hash256,
400406
pub index: ValidatorIndex,
401407
pub share: Option<SecretKey>,

anchor/validator_store/src/lib.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ use qbft_manager::{
2424
};
2525
use safe_arith::{ArithError, SafeArith};
2626
use signature_collector::{
27-
CollectionError, SignatureCollectorManager, SignatureMetadata, SignatureRequester, SigningData,
27+
CollectionError, SignatureCollectorManager, SignatureMetadata, SignatureRequester,
28+
ValidatorSigningData,
2829
};
2930
use slashing_protection::{NotSafe, Safe, SlashingDatabase};
3031
use slot_clock::SlotClock;
3132
use ssv_types::{
3233
Cluster, CommitteeId, ValidatorIndex, ValidatorMetadata,
3334
consensus::{
3435
BEACON_ROLE_AGGREGATOR, BEACON_ROLE_PROPOSER, BEACON_ROLE_SYNC_COMMITTEE_CONTRIBUTION,
35-
BeaconVote, Contribution, ContributionWrapper, Contributions, ValidatorConsensusData,
36-
ValidatorDuty,
36+
BeaconVote, Contribution, ContributionWrapper, Contributions, QbftData,
37+
ValidatorConsensusData, ValidatorDuty,
3738
},
3839
msgid::Role,
3940
partial_sig::PartialSignatureKind,
@@ -335,6 +336,7 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
335336
&self,
336337
signature_kind: PartialSignatureKind,
337338
role: Role,
339+
base_hash: Option<Hash256>,
338340
validator: InitializedValidator,
339341
signing_root: Hash256,
340342
slot: Slot,
@@ -353,7 +355,7 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
353355
committee_id,
354356
};
355357

356-
let requester = if role == Role::Committee {
358+
let requester = if let Some(base_hash) = base_hash {
357359
let metadata = self.get_slot_metadata(slot).await?;
358360
SignatureRequester::Committee {
359361
num_signatures_to_collect: self
@@ -375,14 +377,15 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
375377
.sum()
376378
})
377379
.unwrap_or_default(),
380+
base_hash,
378381
}
379382
} else {
380383
SignatureRequester::SingleValidator {
381384
pubkey: validator.metadata.public_key,
382385
}
383386
};
384387

385-
let signing_data = SigningData {
388+
let signing_data = ValidatorSigningData {
386389
root: signing_root,
387390
index: validator
388391
.metadata
@@ -514,6 +517,7 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
514517
.collect_signature(
515518
PartialSignatureKind::PostConsensus,
516519
Role::Proposer,
520+
None,
517521
self.validator(validator_pubkey)?,
518522
signing_root,
519523
header.slot,
@@ -616,6 +620,7 @@ impl<T: SlotClock, E: EthSpec> AnchorValidatorStore<T, E> {
616620
.collect_signature(
617621
PartialSignatureKind::VoluntaryExit,
618622
Role::VoluntaryExit,
623+
None,
619624
self.validator(validator_pubkey)?,
620625
signing_root,
621626
slot,
@@ -835,6 +840,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
835840
self.collect_signature(
836841
PartialSignatureKind::RandaoPartialSig,
837842
Role::Proposer,
843+
None,
838844
self.validator(validator_pubkey)?,
839845
signing_root,
840846
self.slot_clock.now().ok_or(SpecificError::SlotClock)?,
@@ -972,6 +978,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
972978
Completed::TimedOut => return Err(Error::SpecificError(SpecificError::Timeout)),
973979
Completed::Success(data) => data,
974980
};
981+
let data_hash = data.hash();
975982
attestation.data_mut().beacon_block_root = data.block_root;
976983
attestation.data_mut().source = data.source;
977984
attestation.data_mut().target = data.target;
@@ -992,6 +999,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
992999
.collect_signature(
9931000
PartialSignatureKind::PostConsensus,
9941001
Role::Committee,
1002+
Some(data_hash),
9951003
validator,
9961004
signing_root,
9971005
attestation.data().slot,
@@ -1036,6 +1044,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
10361044
.collect_signature(
10371045
PartialSignatureKind::ValidatorRegistration,
10381046
Role::ValidatorRegistration,
1047+
None,
10391048
self.validator(validator_registration_data.pubkey)?,
10401049
signing_root,
10411050
validity_slot,
@@ -1149,6 +1158,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
11491158
.collect_signature(
11501159
PartialSignatureKind::PostConsensus,
11511160
Role::Aggregator,
1161+
None,
11521162
validator,
11531163
signing_root,
11541164
message.aggregate().get_slot(),
@@ -1190,6 +1200,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
11901200
self.collect_signature(
11911201
PartialSignatureKind::SelectionProofPartialSig,
11921202
Role::Aggregator,
1203+
None,
11931204
self.validator(validator_pubkey)?,
11941205
signing_root,
11951206
slot,
@@ -1234,6 +1245,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
12341245
self.collect_signature(
12351246
PartialSignatureKind::ContributionProofs,
12361247
Role::SyncCommittee,
1248+
None,
12371249
self.validator(*validator_pubkey)?,
12381250
signing_root,
12391251
slot,
@@ -1294,6 +1306,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
12941306
.collect_signature(
12951307
PartialSignatureKind::PostConsensus,
12961308
Role::Committee,
1309+
Some(data.hash()),
12971310
validator,
12981311
signing_root,
12991312
slot,
@@ -1441,6 +1454,7 @@ impl<T: SlotClock, E: EthSpec> ValidatorStore for AnchorValidatorStore<T, E> {
14411454
self.collect_signature(
14421455
PartialSignatureKind::PostConsensus,
14431456
Role::SyncCommittee,
1457+
None,
14441458
validator,
14451459
signing_root,
14461460
slot,

0 commit comments

Comments
 (0)