mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-21 00:25:41 +00:00
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:
@@ -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,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(),
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user