Convert unnecessary storage item to static. (#3093)

* Convert unnecessary storage item to static.

* Polish

* 6 second blocks.

* Compile fixes

* Bump runtime

* Fix

* Another fix

* Import `srml_support::traits::Get`

* Export MinimumPeriod from `decl_module!`

* Remove `config` from Timestamp

* Clean up warnings
This commit is contained in:
Gavin Wood
2019-07-11 23:03:33 +02:00
committed by GitHub
parent b3dc472a9b
commit e4d4548121
15 changed files with 65 additions and 90 deletions
+5 -2
View File
@@ -33,7 +33,6 @@ pub use runtime_primitives::BuildStorage;
pub use timestamp::Call as TimestampCall; pub use timestamp::Call as TimestampCall;
pub use balances::Call as BalancesCall; pub use balances::Call as BalancesCall;
pub use runtime_primitives::{Permill, Perbill}; pub use runtime_primitives::{Permill, Perbill};
pub use timestamp::BlockPeriod;
pub use support::{StorageValue, construct_runtime, parameter_types}; pub use support::{StorageValue, construct_runtime, parameter_types};
/// Alias to the signature scheme used for Aura authority signatures. /// Alias to the signature scheme used for Aura authority signatures.
@@ -155,10 +154,14 @@ impl indices::Trait for Runtime {
type Event = Event; type Event = Event;
} }
parameter_types! {
pub const MinimumPeriod: u64 = 5;
}
impl timestamp::Trait for Runtime { impl timestamp::Trait for Runtime {
/// A timestamp: seconds since the unix epoch. /// A timestamp: seconds since the unix epoch.
type Moment = u64; type Moment = u64;
type OnTimestampSet = Aura; type OnTimestampSet = Aura;
type MinimumPeriod = MinimumPeriod;
} }
parameter_types! { parameter_types! {
@@ -207,7 +210,7 @@ construct_runtime!(
UncheckedExtrinsic = UncheckedExtrinsic UncheckedExtrinsic = UncheckedExtrinsic
{ {
System: system::{Module, Call, Storage, Config, Event}, System: system::{Module, Call, Storage, Config, Event},
Timestamp: timestamp::{Module, Call, Storage, Config<T>, Inherent}, Timestamp: timestamp::{Module, Call, Storage, Inherent},
Aura: aura::{Module, Config<T>, Inherent(Timestamp)}, Aura: aura::{Module, Config<T>, Inherent(Timestamp)},
Indices: indices::{default, Config<T>}, Indices: indices::{default, Config<T>},
Balances: balances, Balances: balances,
+1 -4
View File
@@ -1,6 +1,6 @@
use primitives::{ed25519, sr25519, Pair}; use primitives::{ed25519, sr25519, Pair};
use node_template_runtime::{ use node_template_runtime::{
AccountId, GenesisConfig, AuraConfig, TimestampConfig, BalancesConfig, AccountId, GenesisConfig, AuraConfig, BalancesConfig,
SudoConfig, IndicesConfig, SystemConfig, WASM_BINARY, AuraId SudoConfig, IndicesConfig, SystemConfig, WASM_BINARY, AuraId
}; };
use substrate_service; use substrate_service;
@@ -97,9 +97,6 @@ fn testnet_genesis(initial_authorities: Vec<AuraId>, endowed_accounts: Vec<Accou
aura: Some(AuraConfig { aura: Some(AuraConfig {
authorities: initial_authorities.clone(), authorities: initial_authorities.clone(),
}), }),
timestamp: Some(TimestampConfig {
minimum_period: 5, // 10 second block time.
}),
indices: Some(IndicesConfig { indices: Some(IndicesConfig {
ids: endowed_accounts.clone(), ids: endowed_accounts.clone(),
}), }),
+5 -19
View File
@@ -21,8 +21,8 @@ use node_primitives::{AccountId, AuraId, Balance};
use node_runtime::{ use node_runtime::{
GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, CouncilConfig, GrandpaConfig, BalancesConfig, ContractsConfig, ElectionsConfig, DemocracyConfig, CouncilConfig,
AuraConfig, IndicesConfig, SessionConfig, StakingConfig, SudoConfig, TechnicalCommitteeConfig, AuraConfig, IndicesConfig, SessionConfig, StakingConfig, SudoConfig, TechnicalCommitteeConfig,
SystemConfig, TimestampConfig, WASM_BINARY, Perbill, SessionKeys, StakerStatus, DAYS, DOLLARS, SystemConfig, WASM_BINARY, Perbill, SessionKeys, StakerStatus, DAYS, DOLLARS,
MILLICENTS, SECS_PER_BLOCK, MILLICENTS,
}; };
pub use node_runtime::GenesisConfig; pub use node_runtime::GenesisConfig;
use substrate_service; use substrate_service;
@@ -144,9 +144,6 @@ fn staging_testnet_config_genesis() -> GenesisConfig {
term_duration: 28 * DAYS, term_duration: 28 * DAYS,
desired_seats: 0, desired_seats: 0,
}), }),
timestamp: Some(TimestampConfig {
minimum_period: SECS_PER_BLOCK / 2, // due to the nature of aura the slots are 2*period
}),
contracts: Some(ContractsConfig { contracts: Some(ContractsConfig {
current_schedule: Default::default(), current_schedule: Default::default(),
gas_price: 1 * MILLICENTS, gas_price: 1 * MILLICENTS,
@@ -281,9 +278,6 @@ pub fn testnet_genesis(
term_duration: 1000000, term_duration: 1000000,
desired_seats: desired_seats, desired_seats: desired_seats,
}), }),
timestamp: Some(TimestampConfig {
minimum_period: 2, // 2*2=4 second block time.
}),
contracts: Some(ContractsConfig { contracts: Some(ContractsConfig {
current_schedule: contracts::Schedule { current_schedule: contracts::Schedule {
enable_println, // this should only be enabled on development chains enable_println, // this should only be enabled on development chains
@@ -342,23 +336,15 @@ pub(crate) mod tests {
use service_test; use service_test;
use crate::service::Factory; use crate::service::Factory;
fn local_testnet_genesis_instant() -> GenesisConfig {
let mut genesis = local_testnet_genesis();
genesis.timestamp = Some(TimestampConfig { minimum_period: 1 });
genesis
}
fn local_testnet_genesis_instant_single() -> GenesisConfig { fn local_testnet_genesis_instant_single() -> GenesisConfig {
let mut genesis = testnet_genesis( testnet_genesis(
vec![ vec![
get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Alice"),
], ],
get_account_id_from_seed("Alice"), get_account_id_from_seed("Alice"),
None, None,
false, false,
); )
genesis.timestamp = Some(TimestampConfig { minimum_period: 1 });
genesis
} }
/// Local testnet config (single validator - Alice) /// Local testnet config (single validator - Alice)
@@ -377,7 +363,7 @@ pub(crate) mod tests {
/// Local testnet config (multivalidator Alice + Bob) /// Local testnet config (multivalidator Alice + Bob)
pub fn integration_test_config_with_two_authorities() -> ChainSpec { pub fn integration_test_config_with_two_authorities() -> ChainSpec {
ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis_instant, vec![], None, None, None, None) ChainSpec::from_genesis("Integration Test", "test", local_testnet_genesis, vec![], None, None, None, None)
} }
#[test] #[test]
+1 -1
View File
@@ -38,7 +38,7 @@ use inherents::InherentData;
use timestamp; use timestamp;
use finality_tracker; use finality_tracker;
// TODO get via api: <timestamp::Module<T>>::minimum_period(). See #2587. // TODO get via api: <T as timestamp::Trait>::MinimumPeriod::get(). See #2587.
const MINIMUM_PERIOD: u64 = 99; const MINIMUM_PERIOD: u64 = 99;
pub struct FactoryState<N> { pub struct FactoryState<N> {
-1
View File
@@ -346,7 +346,6 @@ mod tests {
collective_Instance1: Some(Default::default()), collective_Instance1: Some(Default::default()),
collective_Instance2: Some(Default::default()), collective_Instance2: Some(Default::default()),
elections: Some(Default::default()), elections: Some(Default::default()),
timestamp: Some(Default::default()),
contracts: Some(ContractsConfig { contracts: Some(ContractsConfig {
current_schedule: Default::default(), current_schedule: Default::default(),
gas_price: 1 * MILLICENTS, gas_price: 1 * MILLICENTS,
+6 -2
View File
@@ -69,7 +69,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// and set impl_version to equal spec_version. If only runtime // and set impl_version to equal spec_version. If only runtime
// implementation changes and behavior does not, then leave spec_version as // implementation changes and behavior does not, then leave spec_version as
// is and increment impl_version. // is and increment impl_version.
spec_version: 109, spec_version: 110,
impl_version: 110, impl_version: 110,
apis: RUNTIME_API_VERSIONS, apis: RUNTIME_API_VERSIONS,
}; };
@@ -161,9 +161,13 @@ impl balances::Trait for Runtime {
type TransactionByteFee = TransactionByteFee; type TransactionByteFee = TransactionByteFee;
} }
parameter_types! {
pub const MinimumPeriod: u64 = SECS_PER_BLOCK / 2;
}
impl timestamp::Trait for Runtime { impl timestamp::Trait for Runtime {
type Moment = Moment; type Moment = Moment;
type OnTimestampSet = Aura; type OnTimestampSet = Aura;
type MinimumPeriod = MinimumPeriod;
} }
parameter_types! { parameter_types! {
@@ -407,7 +411,7 @@ construct_runtime!(
{ {
System: system::{Module, Call, Storage, Config, Event}, System: system::{Module, Call, Storage, Config, Event},
Aura: aura::{Module, Call, Storage, Config<T>, Inherent(Timestamp)}, Aura: aura::{Module, Call, Storage, Config<T>, Inherent(Timestamp)},
Timestamp: timestamp::{Module, Call, Storage, Config<T>, Inherent}, Timestamp: timestamp::{Module, Call, Storage, Inherent},
Authorship: authorship::{Module, Call, Storage}, Authorship: authorship::{Module, Call, Storage},
Indices: indices, Indices: indices,
Balances: balances, Balances: balances,
+2 -2
View File
@@ -52,7 +52,7 @@ pub use timestamp;
use rstd::{result, prelude::*}; use rstd::{result, prelude::*};
use parity_codec::Encode; use parity_codec::Encode;
use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue}; use srml_support::{decl_storage, decl_module, Parameter, storage::StorageValue, traits::Get};
use primitives::{ use primitives::{
traits::{SaturatedConversion, Saturating, Zero, One, Member, TypedKey}, traits::{SaturatedConversion, Saturating, Zero, One, Member, TypedKey},
generic::DigestItem, generic::DigestItem,
@@ -243,7 +243,7 @@ impl<T: Trait> Module<T> {
pub fn slot_duration() -> T::Moment { pub fn slot_duration() -> T::Moment {
// we double the minimum block-period so each author can always propose within // we double the minimum block-period so each author can always propose within
// the majority of its slot. // the majority of its slot.
<timestamp::Module<T>>::minimum_period().saturating_mul(2.into()) <T as timestamp::Trait>::MinimumPeriod::get().saturating_mul(2.into())
} }
fn on_timestamp_set<H: HandleReport>(now: T::Moment, slot_duration: T::Moment) { fn on_timestamp_set<H: HandleReport>(now: T::Moment, slot_duration: T::Moment) {
+2 -3
View File
@@ -37,6 +37,7 @@ pub struct Test;
parameter_types! { parameter_types! {
pub const BlockHashCount: u64 = 250; pub const BlockHashCount: u64 = 250;
pub const MinimumPeriod: u64 = 1;
} }
impl system::Trait for Test { impl system::Trait for Test {
@@ -55,6 +56,7 @@ impl system::Trait for Test {
impl timestamp::Trait for Test { impl timestamp::Trait for Test {
type Moment = u64; type Moment = u64;
type OnTimestampSet = Aura; type OnTimestampSet = Aura;
type MinimumPeriod = MinimumPeriod;
} }
impl Trait for Test { impl Trait for Test {
@@ -64,9 +66,6 @@ impl Trait for Test {
pub fn new_test_ext(authorities: Vec<u64>) -> runtime_io::TestExternalities<Blake2Hasher> { pub fn new_test_ext(authorities: Vec<u64>) -> runtime_io::TestExternalities<Blake2Hasher> {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap().0; let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap().0;
t.extend(timestamp::GenesisConfig::<Test>{
minimum_period: 1,
}.build_storage().unwrap().0);
t.extend(GenesisConfig::<Test>{ t.extend(GenesisConfig::<Test>{
authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(), authorities: authorities.into_iter().map(|a| UintAuthorityId(a)).collect(),
}.build_storage().unwrap().0); }.build_storage().unwrap().0);
+2 -2
View File
@@ -21,7 +21,7 @@
pub use timestamp; pub use timestamp;
use rstd::{result, prelude::*}; use rstd::{result, prelude::*};
use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor}; use srml_support::{decl_storage, decl_module, StorageValue, traits::FindAuthor, traits::Get};
use timestamp::{OnTimestampSet, Trait}; use timestamp::{OnTimestampSet, Trait};
use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating, RandomnessBeacon}}; use primitives::{generic::DigestItem, traits::{SaturatedConversion, Saturating, RandomnessBeacon}};
use primitives::ConsensusEngineId; use primitives::ConsensusEngineId;
@@ -193,7 +193,7 @@ impl<T: Trait> Module<T> {
pub fn slot_duration() -> T::Moment { pub fn slot_duration() -> T::Moment {
// we double the minimum block-period so each author can always propose within // we double the minimum block-period so each author can always propose within
// the majority of their slot. // the majority of their slot.
<timestamp::Module<T>>::minimum_period().saturating_mul(2.into()) <T as timestamp::Trait>::MinimumPeriod::get().saturating_mul(2.into())
} }
fn change_authorities(new: Vec<AuthorityId>) { fn change_authorities(new: Vec<AuthorityId>) {
+4
View File
@@ -127,9 +127,13 @@ impl balances::Trait for Test {
type TransactionBaseFee = BalancesTransactionBaseFee; type TransactionBaseFee = BalancesTransactionBaseFee;
type TransactionByteFee = BalancesTransactionByteFee; type TransactionByteFee = BalancesTransactionByteFee;
} }
parameter_types! {
pub const MinimumPeriod: u64 = 1;
}
impl timestamp::Trait for Test { impl timestamp::Trait for Test {
type Moment = u64; type Moment = u64;
type OnTimestampSet = (); type OnTimestampSet = ();
type MinimumPeriod = MinimumPeriod;
} }
parameter_types! { parameter_types! {
pub const SignedClaimHandicap: u64 = 2; pub const SignedClaimHandicap: u64 = 2;
-3
View File
@@ -327,9 +327,6 @@ mod tests {
fn new_test_ext() -> runtime_io::TestExternalities<Blake2Hasher> { fn new_test_ext() -> runtime_io::TestExternalities<Blake2Hasher> {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap().0; let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap().0;
t.extend(timestamp::GenesisConfig::<Test> {
minimum_period: 5,
}.build_storage().unwrap().0);
let (storage, _child_storage) = crate::GenesisConfig::<Test> { let (storage, _child_storage) = crate::GenesisConfig::<Test> {
keys: NEXT_VALIDATORS.with(|l| keys: NEXT_VALIDATORS.with(|l|
l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect()
-3
View File
@@ -565,9 +565,6 @@ mod tests {
fn new_test_ext() -> runtime_io::TestExternalities<Blake2Hasher> { fn new_test_ext() -> runtime_io::TestExternalities<Blake2Hasher> {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap(); let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap();
timestamp::GenesisConfig::<Test> {
minimum_period: 5,
}.assimilate_storage(&mut t.0, &mut t.1).unwrap();
GenesisConfig::<Test> { GenesisConfig::<Test> {
keys: NEXT_VALIDATORS.with(|l| keys: NEXT_VALIDATORS.with(|l|
l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect() l.borrow().iter().cloned().map(|i| (i, UintAuthorityId(i))).collect()
+2
View File
@@ -109,6 +109,7 @@ pub fn set_next_validators(next: Vec<u64>) {
pub struct Test; pub struct Test;
parameter_types! { parameter_types! {
pub const BlockHashCount: u64 = 250; pub const BlockHashCount: u64 = 250;
pub const MinimumPeriod: u64 = 5;
} }
impl system::Trait for Test { impl system::Trait for Test {
type Origin = Origin; type Origin = Origin;
@@ -125,6 +126,7 @@ impl system::Trait for Test {
impl timestamp::Trait for Test { impl timestamp::Trait for Test {
type Moment = u64; type Moment = u64;
type OnTimestampSet = (); type OnTimestampSet = ();
type MinimumPeriod = MinimumPeriod;
} }
+4 -4
View File
@@ -140,9 +140,13 @@ impl session::historical::Trait for Test {
type FullIdentificationOf = crate::ExposureOf<Test>; type FullIdentificationOf = crate::ExposureOf<Test>;
} }
parameter_types! {
pub const MinimumPeriod: u64 = 5;
}
impl timestamp::Trait for Test { impl timestamp::Trait for Test {
type Moment = u64; type Moment = u64;
type OnTimestampSet = (); type OnTimestampSet = ();
type MinimumPeriod = MinimumPeriod;
} }
parameter_types! { parameter_types! {
pub const SessionsPerEra: session::SessionIndex = 3; pub const SessionsPerEra: session::SessionIndex = 3;
@@ -279,10 +283,6 @@ impl ExtBuilder {
invulnerables: vec![], invulnerables: vec![],
}.assimilate_storage(&mut t, &mut c); }.assimilate_storage(&mut t, &mut c);
let _ = timestamp::GenesisConfig::<Test>{
minimum_period: 5,
}.assimilate_storage(&mut t, &mut c);
let _ = session::GenesisConfig::<Test> { let _ = session::GenesisConfig::<Test> {
keys: validators.iter().map(|x| (*x, UintAuthorityId(*x))).collect(), keys: validators.iter().map(|x| (*x, UintAuthorityId(*x))).collect(),
}.assimilate_storage(&mut t, &mut c); }.assimilate_storage(&mut t, &mut c);
+31 -44
View File
@@ -44,7 +44,10 @@
//! //!
//! * `get` - Gets the current time for the current block. If this function is called prior to //! * `get` - Gets the current time for the current block. If this function is called prior to
//! setting the timestamp, it will return the timestamp of the previous block. //! setting the timestamp, it will return the timestamp of the previous block.
//! * `minimum_period` - Gets the minimum (and advised) period between blocks for the chain. //!
//! ### Trait Getters
//!
//! * `MinimumPeriod` - Gets the minimum (and advised) period between blocks for the chain.
//! //!
//! ## Usage //! ## Usage
//! //!
@@ -93,8 +96,7 @@ use parity_codec::Encode;
use parity_codec::Decode; use parity_codec::Decode;
#[cfg(feature = "std")] #[cfg(feature = "std")]
use inherents::ProvideInherentData; use inherents::ProvideInherentData;
use srml_support::{StorageValue, Parameter, decl_storage, decl_module}; use srml_support::{StorageValue, Parameter, decl_storage, decl_module, for_each_tuple, traits::Get};
use srml_support::for_each_tuple;
use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion}; use runtime_primitives::traits::{SimpleArithmetic, Zero, SaturatedConversion};
use system::ensure_none; use system::ensure_none;
use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData}; use inherents::{RuntimeString, InherentIdentifier, ProvideInherent, IsFatalError, InherentData};
@@ -208,23 +210,36 @@ pub trait Trait: system::Trait {
/// Something which can be notified when the timestamp is set. Set this to `()` if not needed. /// Something which can be notified when the timestamp is set. Set this to `()` if not needed.
type OnTimestampSet: OnTimestampSet<Self::Moment>; type OnTimestampSet: OnTimestampSet<Self::Moment>;
/// The minimum period between blocks. Beware that this is different to the *expected* period
/// that the block production apparatus provides. Your chosen consensus system will generally
/// work with this to determine a sensible block time. e.g. For Aura, it will be double this
/// period on default settings.
type MinimumPeriod: Get<Self::Moment>;
} }
decl_module! { decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin { pub struct Module<T: Trait> for enum Call where origin: T::Origin {
/// The minimum period between blocks. Beware that this is different to the *expected* period
/// that the block production apparatus provides. Your chosen consensus system will generally
/// work with this to determine a sensible block time. e.g. For Aura, it will be double this
/// period on default settings.
const MinimumPeriod: T::Moment = T::MinimumPeriod::get();
/// Set the current time. /// Set the current time.
/// ///
/// This call should be invoked exactly once per block. It will panic at the finalization phase, /// This call should be invoked exactly once per block. It will panic at the finalization
/// if this call hasn't been invoked by that time. /// phase, if this call hasn't been invoked by that time.
/// ///
/// The timestamp should be greater than the previous one by the amount specified by `minimum_period`. /// The timestamp should be greater than the previous one by the amount specified by
/// `MinimumPeriod`.
/// ///
/// The dispatch origin for this call must be `Inherent`. /// The dispatch origin for this call must be `Inherent`.
fn set(origin, #[compact] now: T::Moment) { fn set(origin, #[compact] now: T::Moment) {
ensure_none(origin)?; ensure_none(origin)?;
assert!(!<Self as Store>::DidUpdate::exists(), "Timestamp must be updated only once in the block"); assert!(!<Self as Store>::DidUpdate::exists(), "Timestamp must be updated only once in the block");
assert!( assert!(
Self::now().is_zero() || now >= Self::now() + <MinimumPeriod<T>>::get(), Self::now().is_zero() || now >= Self::now() + T::MinimumPeriod::get(),
"Timestamp must increment by at least <MinimumPeriod> between sequential blocks" "Timestamp must increment by at least <MinimumPeriod> between sequential blocks"
); );
<Self as Store>::Now::put(now.clone()); <Self as Store>::Now::put(now.clone());
@@ -233,16 +248,6 @@ decl_module! {
<T::OnTimestampSet as OnTimestampSet<_>>::on_timestamp_set(now); <T::OnTimestampSet as OnTimestampSet<_>>::on_timestamp_set(now);
} }
// Manage upgrade. Remove after all networks upgraded.
// TODO: #2133
fn on_initialize() {
if let Some(period) = <BlockPeriod<T>>::take() {
if !<MinimumPeriod<T>>::exists() {
<MinimumPeriod<T>>::put(period)
}
}
}
fn on_finalize() { fn on_finalize() {
assert!(<Self as Store>::DidUpdate::take(), "Timestamp must be updated once in the block"); assert!(<Self as Store>::DidUpdate::take(), "Timestamp must be updated once in the block");
} }
@@ -254,16 +259,6 @@ decl_storage! {
/// Current time for the current block. /// Current time for the current block.
pub Now get(now) build(|_| 0.into()): T::Moment; pub Now get(now) build(|_| 0.into()): T::Moment;
/// Old storage item provided for compatibility. Remove after all networks upgraded.
// TODO: #2133
pub BlockPeriod: Option<T::Moment>;
/// The minimum period between blocks. Beware that this is different to the *expected* period
/// that the block production apparatus provides. Your chosen consensus system will generally
/// work with this to determine a sensible block time. e.g. For Aura, it will be double this
/// period on default settings.
pub MinimumPeriod get(minimum_period) config(): T::Moment = 3.into();
/// Did the timestamp get updated in this block? /// Did the timestamp get updated in this block?
DidUpdate: bool; DidUpdate: bool;
} }
@@ -301,7 +296,7 @@ impl<T: Trait> ProvideInherent for Module<T> {
.expect("Gets and decodes timestamp inherent data") .expect("Gets and decodes timestamp inherent data")
.saturated_into(); .saturated_into();
let next_time = cmp::max(data, Self::now() + <MinimumPeriod<T>>::get()); let next_time = cmp::max(data, Self::now() + T::MinimumPeriod::get());
Some(Call::set(next_time.into())) Some(Call::set(next_time.into()))
} }
@@ -315,7 +310,7 @@ impl<T: Trait> ProvideInherent for Module<T> {
let data = extract_inherent_data(data).map_err(|e| InherentError::Other(e))?; let data = extract_inherent_data(data).map_err(|e| InherentError::Other(e))?;
let minimum = (Self::now() + <MinimumPeriod<T>>::get()).saturated_into::<u64>(); let minimum = (Self::now() + T::MinimumPeriod::get()).saturated_into::<u64>();
if t > data + MAX_TIMESTAMP_DRIFT { if t > data + MAX_TIMESTAMP_DRIFT {
Err(InherentError::Other("Timestamp too far in future to accept".into())) Err(InherentError::Other("Timestamp too far in future to accept".into()))
} else if t < minimum { } else if t < minimum {
@@ -356,19 +351,19 @@ mod tests {
type Event = (); type Event = ();
type BlockHashCount = BlockHashCount; type BlockHashCount = BlockHashCount;
} }
parameter_types! {
pub const MinimumPeriod: u64 = 5;
}
impl Trait for Test { impl Trait for Test {
type Moment = u64; type Moment = u64;
type OnTimestampSet = (); type OnTimestampSet = ();
type MinimumPeriod = MinimumPeriod;
} }
type Timestamp = Module<Test>; type Timestamp = Module<Test>;
#[test] #[test]
fn timestamp_works() { fn timestamp_works() {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap(); let t = system::GenesisConfig::default().build_storage::<Test>().unwrap();
GenesisConfig::<Test> {
minimum_period: 5,
}.assimilate_storage(&mut t.0, &mut t.1).unwrap();
with_externalities(&mut TestExternalities::new_with_children(t), || { with_externalities(&mut TestExternalities::new_with_children(t), || {
Timestamp::set_timestamp(42); Timestamp::set_timestamp(42);
assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE));
@@ -379,11 +374,7 @@ mod tests {
#[test] #[test]
#[should_panic(expected = "Timestamp must be updated only once in the block")] #[should_panic(expected = "Timestamp must be updated only once in the block")]
fn double_timestamp_should_fail() { fn double_timestamp_should_fail() {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap(); let t = system::GenesisConfig::default().build_storage::<Test>().unwrap();
GenesisConfig::<Test> {
minimum_period: 5,
}.assimilate_storage(&mut t.0, &mut t.1).unwrap();
with_externalities(&mut TestExternalities::new_with_children(t), || { with_externalities(&mut TestExternalities::new_with_children(t), || {
Timestamp::set_timestamp(42); Timestamp::set_timestamp(42);
assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE)); assert_ok!(Timestamp::dispatch(Call::set(69), Origin::NONE));
@@ -394,11 +385,7 @@ mod tests {
#[test] #[test]
#[should_panic(expected = "Timestamp must increment by at least <MinimumPeriod> between sequential blocks")] #[should_panic(expected = "Timestamp must increment by at least <MinimumPeriod> between sequential blocks")]
fn block_period_minimum_enforced() { fn block_period_minimum_enforced() {
let mut t = system::GenesisConfig::default().build_storage::<Test>().unwrap(); let t = system::GenesisConfig::default().build_storage::<Test>().unwrap();
GenesisConfig::<Test> {
minimum_period: 5,
}.assimilate_storage(&mut t.0, &mut t.1).unwrap();
with_externalities(&mut TestExternalities::new_with_children(t), || { with_externalities(&mut TestExternalities::new_with_children(t), || {
Timestamp::set_timestamp(42); Timestamp::set_timestamp(42);
let _ = Timestamp::dispatch(Call::set(46), Origin::NONE); let _ = Timestamp::dispatch(Call::set(46), Origin::NONE);