// Copyright 2017 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Substrate is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . //! Primitives for the runtime modules. use rstd::prelude::*; use rstd::{self, result}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, de::DeserializeOwned}; use substrate_primitives; use substrate_primitives::Blake2Hasher; use codec::{Codec, Encode}; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; pub use num_traits::ops::checked::{CheckedAdd, CheckedSub, CheckedMul, CheckedDiv}; use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign, Shl, Shr}; /// A lazy value. pub trait Lazy { fn get(&mut self) -> &T; } impl<'a> Lazy<[u8]> for &'a [u8] { fn get(&mut self) -> &[u8] { &**self } } /// Means of signature verification. pub trait Verify { /// Type of the signer. type Signer; /// Verify a signature. Return `true` if signature is valid for the value. fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } /// Some sort of check on the origin is performed by this object. pub trait EnsureOrigin { type Success; fn ensure_origin(o: OuterOrigin) -> Result; } /// Means of changing one type into another in a manner dependent on the source type. pub trait Lookup { /// Type to lookup from. type Source; /// Type to lookup into. type Target; /// Attempt a lookup. fn lookup(s: Self::Source) -> result::Result; } /// Simple payment making trait, operating on a single generic `AccountId` type. pub trait MakePayment { /// Make some sort of payment concerning `who` for an extrinsic (transaction) of encoded length /// `encoded_len` bytes. Return true iff the payment was successful. fn make_payment(who: &AccountId, encoded_len: usize) -> Result<(), &'static str>; } impl MakePayment for () { fn make_payment(_: &T, _: usize) -> Result<(), &'static str> { Ok(()) } } /// Extensible conversion trait. Generic over both source and destination types. pub trait Convert { /// Make conversion. fn convert(a: A) -> B; } /// Simple trait similar to `Into`, except that it can be used to convert numerics between each /// other. pub trait As { /// Convert forward (ala `Into::into`). fn as_(self) -> T; /// Convert backward (ala `From::from`). fn sa(T) -> Self; } macro_rules! impl_numerics { ( $( $t:ty ),* ) => { $( impl_numerics!($t: u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize,); )* }; ( $f:ty : $t:ty, $( $rest:ty, )* ) => { impl As<$t> for $f { fn as_(self) -> $t { self as $t } fn sa(t: $t) -> Self { t as Self } } impl_numerics!($f: $( $rest, )*); }; ( $f:ty : ) => {} } impl_numerics!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize); pub struct Identity; impl Convert for Identity { fn convert(a: T) -> T { a } } impl Convert for () { fn convert(_: T) -> () { () } } pub trait RefInto { fn ref_into(&self) -> &T; } impl RefInto for T { fn ref_into(&self) -> &T { &self } } pub trait SimpleArithmetic: Zero + One + IntegerSquareRoot + As + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + PartialOrd + Ord {} impl + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + PartialOrd + Ord > SimpleArithmetic for T {} /// Trait for things that can be clear (have no bits set). For numeric types, essentially the same /// as `Zero`. pub trait Clear { /// True iff no bits are set. fn is_clear(&self) -> bool; /// Return the value of Self that is clear. fn clear() -> Self; } impl Clear for T { fn is_clear(&self) -> bool { *self == Self::clear() } fn clear() -> Self { Default::default() } } pub trait SimpleBitOps: Sized + Clear + rstd::ops::BitOr + rstd::ops::BitAnd {} impl + rstd::ops::BitAnd > SimpleBitOps for T {} /// The block finalisation trait. Implementing this lets you express what should happen /// for your module when the block is ending. pub trait OnFinalise { /// The block is being finalised. Implement to have something happen. fn on_finalise(_n: BlockNumber) {} } impl OnFinalise for () {} macro_rules! tuple_impl { ($one:ident,) => { impl> OnFinalise for ($one,) { fn on_finalise(n: Number) { $one::on_finalise(n); } } }; ($first:ident, $($rest:ident,)+) => { impl< Number: Copy, $first: OnFinalise, $($rest: OnFinalise),+ > OnFinalise for ($first, $($rest),+) { fn on_finalise(n: Number) { $first::on_finalise(n); $($rest::on_finalise(n);)+ } } tuple_impl!($($rest,)+); } } #[allow(non_snake_case)] tuple_impl!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,); /// Abstraction around hashing pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. type Output: Member + AsRef<[u8]>; /// Produce the hash of some byte-slice. fn hash(s: &[u8]) -> Self::Output; /// Produce the hash of some codec-encodable value. fn hash_of(s: &S) -> Self::Output { Encode::using_encoded(s, Self::hash) } /// Produce the patricia-trie root of a mapping from indices to byte slices. fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; /// Iterator-based version of `enumerated_trie_root`. fn ordered_trie_root< I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output; /// The Patricia tree root of the given mapping as an iterator. fn trie_root< I: IntoIterator, A: AsRef<[u8]> + Ord, B: AsRef<[u8]> >(input: I) -> Self::Output; /// Acquire the global storage root. fn storage_root() -> Self::Output; /// Acquire the global storage changes root. fn storage_changes_root(block: u64) -> Option; } /// Blake2-256 Hash implementation. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct BlakeTwo256; impl Hash for BlakeTwo256 { type Output = substrate_primitives::H256; fn hash(s: &[u8]) -> Self::Output { runtime_io::blake2_256(s).into() } fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { runtime_io::enumerated_trie_root::(items).into() } fn trie_root< I: IntoIterator, A: AsRef<[u8]> + Ord, B: AsRef<[u8]> >(input: I) -> Self::Output { runtime_io::trie_root::(input).into() } fn ordered_trie_root< I: IntoIterator, A: AsRef<[u8]> >(input: I) -> Self::Output { runtime_io::ordered_trie_root::(input).into() } fn storage_root() -> Self::Output { runtime_io::storage_root().into() } fn storage_changes_root(block: u64) -> Option { runtime_io::storage_changes_root(block).map(Into::into) } } /// Something that can be checked for equality and printed out to a debug channel if bad. pub trait CheckEqual { fn check_equal(&self, other: &Self); } impl CheckEqual for substrate_primitives::H256 { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { use substrate_primitives::hexdisplay::HexDisplay; if &self.0 != &other.0 { println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); } } #[cfg(not(feature = "std"))] fn check_equal(&self, other: &Self) { if self != other { runtime_io::print("Hash not equal"); runtime_io::print(&self.0[..]); runtime_io::print(&other.0[..]); } } } #[cfg(feature = "std")] pub trait MaybeSerializeDebugButNotDeserialize: Serialize + Debug {} #[cfg(feature = "std")] impl MaybeSerializeDebugButNotDeserialize for T {} #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebugButNotDeserialize {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebugButNotDeserialize for T {} #[cfg(feature = "std")] pub trait MaybeSerializeDebug: Serialize + DeserializeOwned + Debug {} #[cfg(feature = "std")] impl MaybeSerializeDebug for T {} #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebug {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebug for T {} #[cfg(feature = "std")] pub trait MaybeDisplay: Display {} #[cfg(feature = "std")] impl MaybeDisplay for T {} #[cfg(not(feature = "std"))] pub trait MaybeDisplay {} #[cfg(not(feature = "std"))] impl MaybeDisplay for T {} pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone + 'static {} impl Member for T {} /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'static { type Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec; type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]>; type Hashing: Hash; type Digest: Digest; fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, digest: Self::Digest ) -> Self; fn number(&self) -> &Self::Number; fn set_number(&mut self, Self::Number); fn extrinsics_root(&self) -> &Self::Hash; fn set_extrinsics_root(&mut self, Self::Hash); fn state_root(&self) -> &Self::Hash; fn set_state_root(&mut self, Self::Hash); fn parent_hash(&self) -> &Self::Hash; fn set_parent_hash(&mut self, Self::Hash); fn digest(&self) -> &Self::Digest; fn set_digest(&mut self, Self::Digest); fn hash(&self) -> Self::Hash { ::hash_of(self) } } /// Something which fulfills the abstract idea of a Substrate block. It has types for an /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'static { type Extrinsic: Member + Codec; type Header: Header; type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]>; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); fn new(header: Self::Header, extrinsics: Vec) -> Self; fn hash(&self) -> Self::Hash { <::Hashing as Hash>::hash_of(self.header()) } } /// Extract the hashing type for a block. pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. pub type NumberFor = <::Header as Header>::Number; /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. /// Implement for pieces of information that require some additional context `Context` in order to be /// checked. pub trait Checkable: Sized { /// Returned if `check_with` succeeds. type Checked; fn check_with(self, context: Context) -> Result; } /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. /// Implement for pieces of information that don't require additional context in order to be /// checked. pub trait BlindCheckable: Sized { /// Returned if `check` succeeds. type Checked; fn check(self) -> Result; } // Every `BlindCheckable` is also a `Checkable` for arbitrary `Context`. impl Checkable for T { type Checked = ::Checked; fn check_with(self, _: Context) -> Result { BlindCheckable::check(self) } } /// An "executable" piece of information, used by the standard Substrate Executive in order to /// enact a piece of extrinsic information by marshalling and dispatching to a named functioon /// call. /// /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. pub trait Applyable: Sized + Send + Sync { type AccountId: Member + MaybeDisplay; type Index: Member + MaybeDisplay + SimpleArithmetic; type Call: Member; fn index(&self) -> &Self::Index; fn sender(&self) -> Option<&Self::AccountId>; fn deconstruct(self) -> (Self::Call, Option); } /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Codec`. pub trait Digest: Member + Default { type Hash: Member; type Item: DigestItem; /// Get reference to all digest items. fn logs(&self) -> &[Self::Item]; /// Push new digest item. fn push(&mut self, item: Self::Item); } /// Single digest item. Could be any type that implements `Member` and provides methods /// for casting member to 'system' log items, known to substrate. /// /// If the runtime does not supports some 'system' items, use `()` as a stub. pub trait DigestItem: Member { type Hash: Member; type AuthorityId: Member; /// Returns Some if the entry is the `AuthoritiesChange` entry. fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]> { None } /// Returns Some if the entry is the `ChangesTrieRoot` entry. fn as_changes_trie_root(&self) -> Option<&Self::Hash> { None } }