mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 14:37:57 +00:00
More secure Signed implementation (#2963)
* Remove signature verification in backing. `SignedFullStatement` now signals that the signature has already been checked. * Remove unused check_payload function. * Introduced unchecked signed variants. * Fix inclusion to use unchecked variant. * More unchecked variants. * Use unchecked variants in protocols. * Start fixing statement-distribution. * Fixup statement distribution. * Fix inclusion. * Fix warning. * Fix backing properly. * Fix bitfield distribution. * Make crypto store optional for `RuntimeInfo`. * Factor out utility functions. * get_group_rotation_info * WIP: Collator cleanup + check signatures. * Convenience signature checking functions. * Check signature on collator-side. * Fix warnings. * Fix collator side tests. * Get rid of warnings. * Better Signed/UncheckedSigned implementation. Also get rid of Encode/Decode for Signed! *party* * Get rid of dead code. * Move Signed in its own module. * into_checked -> try_into_checked * Fix merge.
This commit is contained in:
@@ -195,7 +195,6 @@ const fn group_quorum(n_validators: usize) -> usize {
|
||||
|
||||
#[derive(Default)]
|
||||
struct TableContext {
|
||||
signing_context: SigningContext,
|
||||
validator: Option<Validator>,
|
||||
groups: HashMap<ParaId, Vec<ValidatorIndex>>,
|
||||
validators: Vec<ValidatorId>,
|
||||
@@ -870,7 +869,6 @@ impl CandidateBackingJob {
|
||||
.with_candidate(statement.payload().candidate_hash())
|
||||
.with_relay_parent(_relay_parent);
|
||||
|
||||
self.check_statement_signature(&statement)?;
|
||||
match self.maybe_validate_and_import(&root_span, sender, statement).await {
|
||||
Err(Error::ValidationFailed(_)) => return Ok(()),
|
||||
Err(e) => return Err(e),
|
||||
@@ -1028,22 +1026,6 @@ impl CandidateBackingJob {
|
||||
Some(signed)
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "trace", skip(self), fields(subsystem = LOG_TARGET))]
|
||||
fn check_statement_signature(&self, statement: &SignedFullStatement) -> Result<(), Error> {
|
||||
let idx = statement.validator_index().0 as usize;
|
||||
|
||||
if self.table_context.validators.len() > idx {
|
||||
statement.check_signature(
|
||||
&self.table_context.signing_context,
|
||||
&self.table_context.validators[idx],
|
||||
).map_err(|_| Error::InvalidSignature)?;
|
||||
} else {
|
||||
return Err(Error::InvalidSignature);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Insert or get the unbacked-span for the given candidate hash.
|
||||
fn insert_or_get_unbacked_span(
|
||||
&mut self,
|
||||
@@ -1204,7 +1186,6 @@ impl util::JobTrait for CandidateBackingJob {
|
||||
let table_context = TableContext {
|
||||
groups,
|
||||
validators,
|
||||
signing_context,
|
||||
validator,
|
||||
};
|
||||
|
||||
@@ -1658,14 +1639,9 @@ mod tests {
|
||||
AllMessages::StatementDistribution(
|
||||
StatementDistributionMessage::Share(
|
||||
parent_hash,
|
||||
signed_statement,
|
||||
_signed_statement,
|
||||
)
|
||||
) if parent_hash == test_state.relay_parent => {
|
||||
signed_statement.check_signature(
|
||||
&test_state.signing_context,
|
||||
&test_state.validator_public[0],
|
||||
).unwrap();
|
||||
}
|
||||
) if parent_hash == test_state.relay_parent => {}
|
||||
);
|
||||
|
||||
assert_matches!(
|
||||
@@ -1708,11 +1684,6 @@ mod tests {
|
||||
}.build();
|
||||
|
||||
let candidate_a_hash = candidate_a.hash();
|
||||
let public0 = CryptoStore::sr25519_generate_new(
|
||||
&*test_state.keystore,
|
||||
ValidatorId::ID,
|
||||
Some(&test_state.validators[0].to_seed()),
|
||||
).await.expect("Insert key into keystore");
|
||||
let public1 = CryptoStore::sr25519_generate_new(
|
||||
&*test_state.keystore,
|
||||
ValidatorId::ID,
|
||||
@@ -1795,10 +1766,9 @@ mod tests {
|
||||
assert_matches!(
|
||||
virtual_overseer.recv().await,
|
||||
AllMessages::StatementDistribution(
|
||||
StatementDistributionMessage::Share(hash, stmt)
|
||||
StatementDistributionMessage::Share(hash, _stmt)
|
||||
) => {
|
||||
assert_eq!(test_state.relay_parent, hash);
|
||||
stmt.check_signature(&test_state.signing_context, &public0.into()).expect("Is signed correctly");
|
||||
}
|
||||
);
|
||||
|
||||
@@ -2092,11 +2062,6 @@ mod tests {
|
||||
signed_statement,
|
||||
)
|
||||
) if relay_parent == test_state.relay_parent => {
|
||||
signed_statement.check_signature(
|
||||
&test_state.signing_context,
|
||||
&test_state.validator_public[0],
|
||||
).unwrap();
|
||||
|
||||
assert_eq!(*signed_statement.payload(), Statement::Valid(candidate_a_hash));
|
||||
}
|
||||
);
|
||||
@@ -2257,11 +2222,6 @@ mod tests {
|
||||
signed_statement,
|
||||
)
|
||||
) if parent_hash == test_state.relay_parent => {
|
||||
signed_statement.check_signature(
|
||||
&test_state.signing_context,
|
||||
&test_state.validator_public[0],
|
||||
).unwrap();
|
||||
|
||||
assert_eq!(*signed_statement.payload(), Statement::Seconded(candidate_b));
|
||||
}
|
||||
);
|
||||
@@ -2593,10 +2553,7 @@ mod tests {
|
||||
use sp_core::Encode;
|
||||
use std::convert::TryFrom;
|
||||
|
||||
let relay_parent = [1; 32].into();
|
||||
let para_id = ParaId::from(10);
|
||||
let session_index = 5;
|
||||
let signing_context = SigningContext { parent_hash: relay_parent, session_index };
|
||||
let validators = vec![
|
||||
Sr25519Keyring::Alice,
|
||||
Sr25519Keyring::Bob,
|
||||
@@ -2614,7 +2571,6 @@ mod tests {
|
||||
};
|
||||
|
||||
let table_context = TableContext {
|
||||
signing_context,
|
||||
validator: None,
|
||||
groups: validator_groups,
|
||||
validators: validator_public.clone(),
|
||||
|
||||
Reference in New Issue
Block a user