Move inherents to primitives (#4126)

* Split Aura and Timestamp inherents out of paint

* fixup node depedencies

* move babe inherents to primitives

* move authorship inherents into primitives

* Move finalty tracker inherents into primitives

* fix aura primitives import
This commit is contained in:
Benjamin Kampmann
2019-11-20 12:18:36 +01:00
committed by GitHub
parent 5979a8c3e5
commit 303843f483
38 changed files with 654 additions and 404 deletions
+5 -2
View File
@@ -17,7 +17,9 @@ runtime-io ={ package = "sr-io", path = "../../primitives/sr-io", default-featur
support = { package = "paint-support", path = "../support", default-features = false }
substrate-consensus-aura-primitives = { path = "../../primitives/consensus/aura", default-features = false}
system = { package = "paint-system", path = "../system", default-features = false }
timestamp = { package = "paint-timestamp", path = "../timestamp", default-features = false }
sp-timestamp = { package = "sp-timestamp", path = "../../primitives/timestamp", default-features = false }
paint-timestamp = { package = "paint-timestamp", path = "../timestamp", default-features = false }
[dev-dependencies]
lazy_static = "1.4.0"
@@ -37,5 +39,6 @@ std = [
"support/std",
"substrate-consensus-aura-primitives/std",
"system/std",
"timestamp/std",
"sp-timestamp/std",
"paint-timestamp/std",
]
+10 -83
View File
@@ -45,7 +45,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
pub use timestamp;
use paint_timestamp;
use rstd::{result, prelude::*};
use codec::{Encode, Decode};
@@ -57,90 +57,17 @@ use sr_primitives::{
RuntimeAppPublic,
traits::{SaturatedConversion, Saturating, Zero, Member, IsMember}, generic::DigestItem,
};
use timestamp::OnTimestampSet;
#[cfg(feature = "std")]
use timestamp::TimestampInherentData;
use sp_timestamp::OnTimestampSet;
use inherents::{InherentIdentifier, InherentData, ProvideInherent, MakeFatalError};
#[cfg(feature = "std")]
use inherents::{InherentDataProviders, ProvideInherentData};
use substrate_consensus_aura_primitives::{AURA_ENGINE_ID, ConsensusLog, AuthorityIndex};
use substrate_consensus_aura_primitives::{
AURA_ENGINE_ID, ConsensusLog, AuthorityIndex,
inherents::{INHERENT_IDENTIFIER, AuraInherentData},
};
mod mock;
mod tests;
/// The Aura inherent identifier.
pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"auraslot";
/// The type of the Aura inherent.
pub type InherentType = u64;
/// Auxiliary trait to extract Aura inherent data.
pub trait AuraInherentData {
/// Get aura inherent data.
fn aura_inherent_data(&self) -> result::Result<InherentType, inherents::Error>;
/// Replace aura inherent data.
fn aura_replace_inherent_data(&mut self, new: InherentType);
}
impl AuraInherentData for InherentData {
fn aura_inherent_data(&self) -> result::Result<InherentType, inherents::Error> {
self.get_data(&INHERENT_IDENTIFIER)
.and_then(|r| r.ok_or_else(|| "Aura inherent data not found".into()))
}
fn aura_replace_inherent_data(&mut self, new: InherentType) {
self.replace_data(INHERENT_IDENTIFIER, &new);
}
}
/// Provides the slot duration inherent data for `Aura`.
#[cfg(feature = "std")]
pub struct InherentDataProvider {
slot_duration: u64,
}
#[cfg(feature = "std")]
impl InherentDataProvider {
pub fn new(slot_duration: u64) -> Self {
Self {
slot_duration
}
}
}
#[cfg(feature = "std")]
impl ProvideInherentData for InherentDataProvider {
fn on_register(
&self,
providers: &InherentDataProviders,
) -> result::Result<(), inherents::Error> {
if !providers.has_provider(&timestamp::INHERENT_IDENTIFIER) {
// Add the timestamp inherent data provider, as we require it.
providers.register_provider(timestamp::InherentDataProvider)
} else {
Ok(())
}
}
fn inherent_identifier(&self) -> &'static inherents::InherentIdentifier {
&INHERENT_IDENTIFIER
}
fn provide_inherent_data(
&self,
inherent_data: &mut InherentData,
) -> result::Result<(), inherents::Error> {
let timestamp = inherent_data.timestamp_inherent_data()?;
let slot_num = timestamp / self.slot_duration;
inherent_data.put_data(INHERENT_IDENTIFIER, &slot_num)
}
fn error_to_string(&self, error: &[u8]) -> Option<String> {
inherents::Error::decode(&mut &error[..]).map(|e| e.into_string()).ok()
}
}
pub trait Trait: timestamp::Trait {
pub trait Trait: paint_timestamp::Trait {
/// The identifier type for an authority.
type AuthorityId: Member + Parameter + RuntimeAppPublic + Default;
}
@@ -249,7 +176,7 @@ impl<T: Trait> Module<T> {
pub fn slot_duration() -> T::Moment {
// we double the minimum block-period so each author can always propose within
// the majority of its slot.
<T as timestamp::Trait>::MinimumPeriod::get().saturating_mul(2.into())
<T as paint_timestamp::Trait>::MinimumPeriod::get().saturating_mul(2.into())
}
fn on_timestamp_set(now: T::Moment, slot_duration: T::Moment) {
@@ -278,7 +205,7 @@ impl<T: Trait> OnTimestampSet<T::Moment> for Module<T> {
}
impl<T: Trait> ProvideInherent for Module<T> {
type Call = timestamp::Call<T>;
type Call = paint_timestamp::Call<T>;
type Error = MakeFatalError<inherents::Error>;
const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER;
@@ -289,7 +216,7 @@ impl<T: Trait> ProvideInherent for Module<T> {
/// Verify the validity of the inherent using the timestamp.
fn check_inherent(call: &Self::Call, data: &InherentData) -> result::Result<(), Self::Error> {
let timestamp = match call {
timestamp::Call::set(ref timestamp) => timestamp.clone(),
paint_timestamp::Call::set(ref timestamp) => timestamp.clone(),
_ => return Ok(()),
};
+1 -1
View File
@@ -62,7 +62,7 @@ impl system::Trait for Test {
type Version = ();
}
impl timestamp::Trait for Test {
impl paint_timestamp::Trait for Test {
type Moment = u64;
type OnTimestampSet = Aura;
type MinimumPeriod = MinimumPeriod;
+2
View File
@@ -9,6 +9,7 @@ edition = "2018"
primitives = { package = "substrate-primitives", path = "../../primitives/core", default-features = false }
codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] }
inherents = { package = "substrate-inherents", path = "../../primitives/inherents", default-features = false }
sp-authorship = { path = "../../primitives/authorship", default-features = false }
rstd = { package = "sr-std", path = "../../primitives/sr-std", default-features = false }
sr-primitives = { path = "../../primitives/sr-primitives", default-features = false }
support = { package = "paint-support", path = "../support", default-features = false }
@@ -27,4 +28,5 @@ std = [
"support/std",
"system/std",
"runtime-io/std",
"sp-authorship/std",
]
+3 -51
View File
@@ -30,57 +30,9 @@ use system::ensure_none;
use sr_primitives::traits::{Header as HeaderT, One, Zero};
use sr_primitives::weights::SimpleDispatchInfo;
use inherents::{InherentIdentifier, ProvideInherent, InherentData, MakeFatalError};
/// The identifier for the `uncles` inherent.
pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"uncles00";
/// Auxiliary trait to extract uncles inherent data.
pub trait UnclesInherentData<H: Decode> {
/// Get uncles.
fn uncles(&self) -> Result<Vec<H>, inherents::Error>;
}
impl<H: Decode> UnclesInherentData<H> for InherentData {
fn uncles(&self) -> Result<Vec<H>, inherents::Error> {
Ok(self.get_data(&INHERENT_IDENTIFIER)?.unwrap_or_default())
}
}
/// Provider for inherent data.
#[cfg(feature = "std")]
pub struct InherentDataProvider<F, H> {
inner: F,
_marker: std::marker::PhantomData<H>,
}
#[cfg(feature = "std")]
impl<F, H> InherentDataProvider<F, H> {
pub fn new(uncles_oracle: F) -> Self {
InherentDataProvider { inner: uncles_oracle, _marker: Default::default() }
}
}
#[cfg(feature = "std")]
impl<F, H: Encode + std::fmt::Debug> inherents::ProvideInherentData for InherentDataProvider<F, H>
where F: Fn() -> Vec<H>
{
fn inherent_identifier(&self) -> &'static InherentIdentifier {
&INHERENT_IDENTIFIER
}
fn provide_inherent_data(&self, inherent_data: &mut InherentData) -> Result<(), inherents::Error> {
let uncles = (self.inner)();
if !uncles.is_empty() {
inherent_data.put_data(INHERENT_IDENTIFIER, &uncles)
} else {
Ok(())
}
}
fn error_to_string(&self, _error: &[u8]) -> Option<String> {
Some(format!("no further information"))
}
}
use sp_authorship::{
INHERENT_IDENTIFIER, UnclesInherentData,
};
pub trait Trait: system::Trait {
/// Find the author of a block.
+2
View File
@@ -15,6 +15,7 @@ sr-staking-primitives = { path = "../../primitives/sr-staking-primitives", defau
support = { package = "paint-support", path = "../support", default-features = false }
system = { package = "paint-system", path = "../system", default-features = false }
timestamp = { package = "paint-timestamp", path = "../timestamp", default-features = false }
sp-timestamp = { path = "../../primitives/timestamp", default-features = false }
session = { package = "paint-session", path = "../session", default-features = false }
babe-primitives = { package = "substrate-consensus-babe-primitives", path = "../../primitives/consensus/babe", default-features = false }
runtime-io ={ package = "sr-io", path = "../../primitives/sr-io", default-features = false }
@@ -37,6 +38,7 @@ std = [
"sr-staking-primitives/std",
"system/std",
"timestamp/std",
"sp-timestamp/std",
"inherents/std",
"babe-primitives/std",
"session/std",
+4 -78
View File
@@ -21,25 +21,23 @@
#![forbid(unused_must_use, unsafe_code, unused_variables, unused_must_use)]
#![deny(unused_imports)]
pub use timestamp;
use sp_timestamp;
use rstd::{result, prelude::*};
use support::{decl_storage, decl_module, traits::FindAuthor, traits::Get};
use timestamp::OnTimestampSet;
use sp_timestamp::OnTimestampSet;
use sr_primitives::{generic::DigestItem, ConsensusEngineId, Perbill};
use sr_primitives::traits::{IsMember, SaturatedConversion, Saturating, RandomnessBeacon};
use sr_staking_primitives::{
SessionIndex,
offence::{Offence, Kind},
};
#[cfg(feature = "std")]
use timestamp::TimestampInherentData;
use codec::{Encode, Decode};
use inherents::{InherentIdentifier, InherentData, ProvideInherent, MakeFatalError};
#[cfg(feature = "std")]
use inherents::{InherentDataProviders, ProvideInherentData};
use babe_primitives::{
BABE_ENGINE_ID, ConsensusLog, BabeAuthorityWeight, NextEpochDescriptor, RawBabePreDigest,
SlotNumber,
SlotNumber, inherents::{INHERENT_IDENTIFIER, BabeInherentData}
};
pub use babe_primitives::{AuthorityId, VRF_OUTPUT_LENGTH, PUBLIC_KEY_LENGTH};
@@ -49,78 +47,6 @@ mod tests;
#[cfg(all(feature = "std", test))]
mod mock;
/// The BABE inherent identifier.
pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot";
/// The type of the BABE inherent.
pub type InherentType = u64;
/// Auxiliary trait to extract BABE inherent data.
pub trait BabeInherentData {
/// Get BABE inherent data.
fn babe_inherent_data(&self) -> result::Result<InherentType, inherents::Error>;
/// Replace BABE inherent data.
fn babe_replace_inherent_data(&mut self, new: InherentType);
}
impl BabeInherentData for InherentData {
fn babe_inherent_data(&self) -> result::Result<InherentType, inherents::Error> {
self.get_data(&INHERENT_IDENTIFIER)
.and_then(|r| r.ok_or_else(|| "BABE inherent data not found".into()))
}
fn babe_replace_inherent_data(&mut self, new: InherentType) {
self.replace_data(INHERENT_IDENTIFIER, &new);
}
}
/// Provides the slot duration inherent data for BABE.
#[cfg(feature = "std")]
pub struct InherentDataProvider {
slot_duration: u64,
}
#[cfg(feature = "std")]
impl InherentDataProvider {
/// Constructs `Self`
pub fn new(slot_duration: u64) -> Self {
Self {
slot_duration
}
}
}
#[cfg(feature = "std")]
impl ProvideInherentData for InherentDataProvider {
fn on_register(
&self,
providers: &InherentDataProviders,
) -> result::Result<(), inherents::Error> {
if !providers.has_provider(&timestamp::INHERENT_IDENTIFIER) {
// Add the timestamp inherent data provider, as we require it.
providers.register_provider(timestamp::InherentDataProvider)
} else {
Ok(())
}
}
fn inherent_identifier(&self) -> &'static inherents::InherentIdentifier {
&INHERENT_IDENTIFIER
}
fn provide_inherent_data(
&self,
inherent_data: &mut InherentData,
) -> result::Result<(), inherents::Error> {
let timestamp = inherent_data.timestamp_inherent_data()?;
let slot_number = timestamp / self.slot_duration;
inherent_data.put_data(INHERENT_IDENTIFIER, &slot_number)
}
fn error_to_string(&self, error: &[u8]) -> Option<String> {
inherents::Error::decode(&mut &error[..]).map(|e| e.into_string()).ok()
}
}
pub trait Trait: timestamp::Trait {
/// The amount of time, in slots, that each epoch should last.
type EpochDuration: Get<SlotNumber>;
@@ -10,6 +10,7 @@ codec = { package = "parity-scale-codec", version = "1.0.0", default-features =
inherents = { package = "substrate-inherents", path = "../../primitives/inherents", default-features = false }
rstd = { package = "sr-std", path = "../../primitives/sr-std", default-features = false }
sr-primitives = { path = "../../primitives/sr-primitives", default-features = false }
sp-finality-tracker = { path = "../../primitives/finality-tracker", default-features = false }
support = { package = "paint-support", path = "../support", default-features = false }
paint-system = { path = "../system", default-features = false }
impl-trait-for-tuples = "0.1.3"
@@ -27,5 +28,6 @@ std = [
"support/std",
"sr-primitives/std",
"paint-system/std",
"sp-finality-tracker/std",
"inherents/std",
]
+1 -55
View File
@@ -21,64 +21,10 @@
use inherents::{InherentIdentifier, ProvideInherent, InherentData, MakeFatalError};
use sr_primitives::traits::{One, Zero, SaturatedConversion};
use rstd::{prelude::*, result, cmp, vec};
use codec::Decode;
use support::{decl_module, decl_storage};
use support::traits::Get;
use paint_system::{ensure_none, Trait as SystemTrait};
#[cfg(feature = "std")]
use codec::Encode;
/// The identifier for the `finalnum` inherent.
pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"finalnum";
/// Auxiliary trait to extract finalized inherent data.
pub trait FinalizedInherentData<N: Decode> {
/// Get finalized inherent data.
fn finalized_number(&self) -> Result<N, inherents::Error>;
}
impl<N: Decode> FinalizedInherentData<N> for InherentData {
fn finalized_number(&self) -> Result<N, inherents::Error> {
self.get_data(&INHERENT_IDENTIFIER)
.and_then(|r| r.ok_or_else(|| "Finalized number inherent data not found".into()))
}
}
/// Provider for inherent data.
#[cfg(feature = "std")]
pub struct InherentDataProvider<F, N> {
inner: F,
_marker: std::marker::PhantomData<N>,
}
#[cfg(feature = "std")]
impl<F, N> InherentDataProvider<F, N> {
pub fn new(final_oracle: F) -> Self {
InherentDataProvider { inner: final_oracle, _marker: Default::default() }
}
}
#[cfg(feature = "std")]
impl<F, N: Encode> inherents::ProvideInherentData for InherentDataProvider<F, N>
where F: Fn() -> Result<N, inherents::Error>
{
fn inherent_identifier(&self) -> &'static InherentIdentifier {
&INHERENT_IDENTIFIER
}
fn provide_inherent_data(
&self,
inherent_data: &mut InherentData,
) -> Result<(), inherents::Error> {
(self.inner)()
.and_then(|n| inherent_data.put_data(INHERENT_IDENTIFIER, &n))
}
fn error_to_string(&self, _error: &[u8]) -> Option<String> {
Some(format!("no further information"))
}
}
use sp_finality_tracker::{INHERENT_IDENTIFIER, FinalizedInherentData};
pub const DEFAULT_WINDOW_SIZE: u32 = 101;
pub const DEFAULT_REPORT_LATENCY: u32 = 1000;
+2
View File
@@ -12,6 +12,7 @@ sr-primitives = { path = "../../primitives/sr-primitives", default-features = fa
inherents = { package = "substrate-inherents", path = "../../primitives/inherents", default-features = false }
support = { package = "paint-support", path = "../support", default-features = false }
system = { package = "paint-system", path = "../system", default-features = false }
sp-timestamp = { path = "../../primitives/timestamp", default-features = false }
impl-trait-for-tuples = "0.1.3"
[dev-dependencies]
@@ -28,4 +29,5 @@ std = [
"support/std",
"serde",
"system/std",
"sp-timestamp/std"
]
+5 -92
View File
@@ -91,11 +91,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
use rstd::{result, cmp};
use codec::Encode;
#[cfg(feature = "std")]
use codec::Decode;
#[cfg(feature = "std")]
use inherents::ProvideInherentData;
use inherents::{ProvideInherent, InherentData, InherentIdentifier};
use support::{Parameter, decl_storage, decl_module};
use support::traits::{Time, Get};
use sr_primitives::{
@@ -106,93 +102,10 @@ use sr_primitives::{
};
use sr_primitives::weights::SimpleDispatchInfo;
use system::ensure_none;
use inherents::{InherentIdentifier, ProvideInherent, IsFatalError, InherentData};
/// The identifier for the `timestamp` inherent.
pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"timstap0";
/// The type of the inherent.
pub type InherentType = u64;
/// Errors that can occur while checking the timestamp inherent.
#[derive(Encode, sr_primitives::RuntimeDebug)]
#[cfg_attr(feature = "std", derive(Decode))]
pub enum InherentError {
/// The timestamp is valid in the future.
/// This is a non-fatal-error and will not stop checking the inherents.
ValidAtTimestamp(InherentType),
/// Some other error.
Other(RuntimeString),
}
impl IsFatalError for InherentError {
fn is_fatal_error(&self) -> bool {
match self {
InherentError::ValidAtTimestamp(_) => false,
InherentError::Other(_) => true,
}
}
}
impl InherentError {
/// Try to create an instance ouf of the given identifier and data.
#[cfg(feature = "std")]
pub fn try_from(id: &InherentIdentifier, data: &[u8]) -> Option<Self> {
if id == &INHERENT_IDENTIFIER {
<InherentError as codec::Decode>::decode(&mut &data[..]).ok()
} else {
None
}
}
}
/// Auxiliary trait to extract timestamp inherent data.
pub trait TimestampInherentData {
/// Get timestamp inherent data.
fn timestamp_inherent_data(&self) -> Result<InherentType, inherents::Error>;
}
impl TimestampInherentData for InherentData {
fn timestamp_inherent_data(&self) -> Result<InherentType, inherents::Error> {
self.get_data(&INHERENT_IDENTIFIER)
.and_then(|r| r.ok_or_else(|| "Timestamp inherent data not found".into()))
}
}
#[cfg(feature = "std")]
pub struct InherentDataProvider;
#[cfg(feature = "std")]
impl ProvideInherentData for InherentDataProvider {
fn inherent_identifier(&self) -> &'static InherentIdentifier {
&INHERENT_IDENTIFIER
}
fn provide_inherent_data(
&self,
inherent_data: &mut InherentData,
) -> Result<(), inherents::Error> {
use std::time::SystemTime;
let now = SystemTime::now();
now.duration_since(SystemTime::UNIX_EPOCH)
.map_err(|_| {
"Current time is before unix epoch".into()
}).and_then(|d| {
let duration: InherentType = d.as_millis() as u64;
inherent_data.put_data(INHERENT_IDENTIFIER, &duration)
})
}
fn error_to_string(&self, error: &[u8]) -> Option<String> {
InherentError::try_from(&INHERENT_IDENTIFIER, error).map(|e| format!("{:?}", e))
}
}
/// A trait which is called when the timestamp is set.
#[impl_trait_for_tuples::impl_for_tuples(30)]
pub trait OnTimestampSet<Moment> {
fn on_timestamp_set(moment: Moment);
}
use sp_timestamp::{
InherentError, INHERENT_IDENTIFIER, InherentType,
OnTimestampSet,
};
/// The module configuration trait
pub trait Trait: system::Trait {