Make planning epoch config change in BABE easier (#5776)

* Make planning epoch config change in BABE easier

* Bump node runtime version

* Update frame/babe/src/lib.rs

Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>

* BabeEpochConfiguration -> NextConfigDescriptor

* Add tests for babe config changes

Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>
Co-authored-by: André Silva <andre.beat@gmail.com>
This commit is contained in:
Wei Tang
2020-05-20 22:08:20 +02:00
committed by GitHub
parent 3f3753b8e4
commit e04f237152
2 changed files with 51 additions and 3 deletions
+18 -3
View File
@@ -42,7 +42,7 @@ use sp_inherents::{InherentIdentifier, InherentData, ProvideInherent, MakeFatalE
use sp_consensus_babe::{
BABE_ENGINE_ID, ConsensusLog, BabeAuthorityWeight, SlotNumber,
inherents::{INHERENT_IDENTIFIER, BabeInherentData},
digests::{NextEpochDescriptor, PreDigest},
digests::{NextEpochDescriptor, NextConfigDescriptor, PreDigest},
};
use sp_consensus_vrf::schnorrkel;
pub use sp_consensus_babe::{AuthorityId, VRF_OUTPUT_LENGTH, RANDOMNESS_LENGTH, PUBLIC_KEY_LENGTH};
@@ -136,6 +136,9 @@ decl_storage! {
// variable to its underlying value.
pub Randomness get(fn randomness): schnorrkel::Randomness;
/// Next epoch configuration, if changed.
NextEpochConfig: Option<NextConfigDescriptor>;
/// Next epoch randomness.
NextRandomness: schnorrkel::Randomness;
@@ -364,6 +367,15 @@ impl<T: Trait> Module<T> {
})
}
/// Plan an epoch config change. The epoch config change is recorded and will be enacted on the
/// next call to `enact_epoch_change`. The config will be activated one epoch after. Multiple calls to this
/// method will replace any existing planned config change that had not been enacted yet.
pub fn plan_config_change(
config: NextConfigDescriptor,
) {
NextEpochConfig::put(config);
}
/// DANGEROUS: Enact an epoch change. Should be done on every block where `should_epoch_change` has returned `true`,
/// and the caller is the only caller of this function.
///
@@ -399,12 +411,15 @@ impl<T: Trait> Module<T> {
// so that nodes can track changes.
let next_randomness = NextRandomness::get();
let next = NextEpochDescriptor {
let next_epoch = NextEpochDescriptor {
authorities: next_authorities,
randomness: next_randomness,
};
Self::deposit_consensus(ConsensusLog::NextEpochData(next_epoch));
Self::deposit_consensus(ConsensusLog::NextEpochData(next))
if let Some(next_config) = NextEpochConfig::take() {
Self::deposit_consensus(ConsensusLog::NextConfigData(next_config));
}
}
// finds the start slot of the current epoch. only guaranteed to