Skip to content
Snippets Groups Projects
Commit 62ba0cc7 authored by Bastian Köcher's avatar Bastian Köcher Committed by GitHub
Browse files

Fix Babe secondary plain slots claiming (#6451)

We need to check that the public key of an authority exists in our
keystore before we can successfully claim a plain secondary slot.
parent 7b344381
No related merge requests found
......@@ -169,11 +169,13 @@ fn claim_secondary_slot(
} else {
None
}
} else {
} else if keystore.read().has_keys(&[(authority_id.to_raw_vec(), AuthorityId::ID)]) {
Some(PreDigest::SecondaryPlain(SecondaryPlainPreDigest {
slot_number,
authority_index: *authority_index as u32,
}))
} else {
None
};
if let Some(pre_digest) = pre_digest {
......@@ -283,3 +285,41 @@ fn claim_primary_slot(
None
}
#[cfg(test)]
mod tests {
use super::*;
use sp_core::{sr25519::Pair, crypto::Pair as _};
use sp_consensus_babe::{AuthorityId, BabeEpochConfiguration, AllowedSlots};
#[test]
fn claim_secondary_plain_slot_works() {
let keystore = sc_keystore::Store::new_in_memory();
let valid_public_key = dbg!(keystore.write().sr25519_generate_new(
AuthorityId::ID,
Some(sp_core::crypto::DEV_PHRASE),
).unwrap());
let authorities = vec![
(AuthorityId::from(Pair::generate().0.public()), 5),
(AuthorityId::from(Pair::generate().0.public()), 7),
];
let mut epoch = Epoch {
epoch_index: 10,
start_slot: 0,
duration: 20,
authorities: authorities.clone(),
randomness: Default::default(),
config: BabeEpochConfiguration {
c: (3, 10),
allowed_slots: AllowedSlots::PrimaryAndSecondaryPlainSlots,
},
};
assert!(claim_slot(10, &epoch, &keystore).is_none());
epoch.authorities.push((valid_public_key.clone().into(), 10));
assert_eq!(claim_slot(10, &epoch, &keystore).unwrap().1, valid_public_key.into());
}
}
......@@ -272,7 +272,7 @@ impl Store {
fn raw_public_keys(&self, id: KeyTypeId) -> Result<Vec<Vec<u8>>> {
let mut public_keys: Vec<Vec<u8>> = self.additional.keys()
.into_iter()
.filter_map(|k| if k.0 == id { Some(k.1.clone()) } else { None })
.filter_map(|k| if k.0 == id { Some(k.1.clone()) } else { None })
.collect();
if let Some(path) = &self.path {
......@@ -365,7 +365,7 @@ impl BareCryptoStore for Store {
.map(|k| sr25519::Public::from_slice(k.as_slice()))
.collect()
})
.unwrap_or_default()
.unwrap_or_default()
}
fn sr25519_generate_new(
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment