// Copyright 2017-2019 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, marker::PhantomData, convert::{TryFrom, TryInto}}; use runtime_io; #[cfg(feature = "std")] use std::fmt::{Debug, Display}; #[cfg(feature = "std")] use serde::{Serialize, Deserialize, de::DeserializeOwned}; use substrate_primitives::{self, Hasher, Blake2Hasher}; use crate::codec::{Codec, Encode, Decode, HasCompact}; use crate::transaction_validity::TransactionValidity; use crate::generic::{Digest, DigestItem}; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, CheckedShl, CheckedShr }; use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign, Shl, Shr }; /// A lazy value. pub trait Lazy { /// Get a reference to the underlying value. /// /// This will compute the value if the function is invoked for the first time. 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; } impl Verify for substrate_primitives::ed25519::Signature { type Signer = substrate_primitives::ed25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { runtime_io::ed25519_verify(self.as_ref(), msg.get(), signer) } } impl Verify for substrate_primitives::sr25519::Signature { type Signer = substrate_primitives::sr25519::Public; fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { runtime_io::sr25519_verify(self.as_ref(), msg.get(), signer) } } /// Some sort of check on the origin is performed by this object. pub trait EnsureOrigin { /// A return type. type Success; /// Perform the origin check. fn ensure_origin(o: OuterOrigin) -> result::Result { Self::try_origin(o).map_err(|_| "Invalid origin") } /// Perform the origin check. fn try_origin(o: OuterOrigin) -> result::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(&self, s: Self::Source) -> result::Result; } /// Means of changing one type into another in a manner dependent on the source type. /// This variant is different to `Lookup` in that it doesn't (can cannot) require any /// context. pub trait StaticLookup { /// Type to lookup from. type Source: Codec + Clone + PartialEq + MaybeDebug; /// Type to lookup into. type Target; /// Attempt a lookup. fn lookup(s: Self::Source) -> result::Result; /// Convert from Target back to Source. fn unlookup(t: Self::Target) -> Self::Source; } /// A lookup implementation returning the input value. #[derive(Default)] pub struct IdentityLookup(PhantomData); impl StaticLookup for IdentityLookup { type Source = T; type Target = T; fn lookup(x: T) -> result::Result { Ok(x) } fn unlookup(x: T) -> T { x } } impl Lookup for IdentityLookup { type Source = T; type Target = T; fn lookup(&self, x: T) -> result::Result { Ok(x) } } /// Get the "current" block number. pub trait CurrentHeight { /// The type of the block number. type BlockNumber; /// Return the current block number. Not allowed to fail. fn current_height(&self) -> Self::BlockNumber; } /// Translate a block number into a hash. pub trait BlockNumberToHash { /// The type of the block number. type BlockNumber: Zero; /// The type of the hash. type Hash: Encode; /// Get the hash for a given block number, or `None` if unknown. fn block_number_to_hash(&self, n: Self::BlockNumber) -> Option; /// Get the genesis block hash; this should always be known. fn genesis_hash(&self) -> Self::Hash { self.block_number_to_hash(Zero::zero()).expect("All blockchains must know their genesis block hash; qed") } } /// Extensible conversion trait. Generic over both source and destination types. pub trait Convert { /// Make conversion. fn convert(a: A) -> B; } impl Convert for () { fn convert(_: A) -> B { Default::default() } } /// A structure that performs identity conversion. pub struct Identity; impl Convert for Identity { fn convert(a: T) -> T { a } } /// A meta trait for arithmetic. /// /// Arithmetic types do all the usual stuff you'd expect numbers to do. They are guaranteed to /// be able to represent at least `u32` values without loss, hence the trait implies `From` /// and smaller ints. All other conversions are fallible. pub trait SimpleArithmetic: Zero + One + IntegerSquareRoot + From + From + From + TryInto + TryInto + TryInto + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + Saturating + PartialOrd + Ord + Bounded + HasCompact + Sized {} impl + From + From + TryInto + TryInto + TryInto + TryFrom + TryInto + TryFrom + TryInto + TryFrom + TryInto + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + UniqueSaturatedFrom + UniqueSaturatedInto + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + Div + DivAssign + Rem + RemAssign + Shl + Shr + CheckedShl + CheckedShr + CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + Saturating + PartialOrd + Ord + Bounded + HasCompact + Sized > SimpleArithmetic for T {} /// Just like `From` except that if the source value is too big to fit into the destination type /// then it'll saturate the destination. pub trait UniqueSaturatedFrom: Sized { /// Convert from a value of `T` into an equivalent instance of `Self`. fn unique_saturated_from(t: T) -> Self; } /// Just like `Into` except that if the source value is too big to fit into the destination type /// then it'll saturate the destination. pub trait UniqueSaturatedInto: Sized { /// Consume self to return an equivalent value of `T`. fn unique_saturated_into(self) -> T; } impl + Bounded + Sized> UniqueSaturatedFrom for S { fn unique_saturated_from(t: T) -> Self { S::try_from(t).unwrap_or_else(|_| Bounded::max_value()) } } impl + Sized> UniqueSaturatedInto for S { fn unique_saturated_into(self) -> T { self.try_into().unwrap_or_else(|_| Bounded::max_value()) } } /// Simple trait to use checked mul and max value to give a saturated mul operation over /// supported types. pub trait Saturating { /// Saturated addition - if the product can't fit in the type then just use max-value. fn saturating_add(self, o: Self) -> Self; /// Saturated subtraction - if the product can't fit in the type then just use max-value. fn saturating_sub(self, o: Self) -> Self; /// Saturated multiply - if the product can't fit in the type then just use max-value. fn saturating_mul(self, o: Self) -> Self; } impl Saturating for T { fn saturating_add(self, o: Self) -> Self { ::saturating_add(self, o) } fn saturating_sub(self, o: Self) -> Self { ::saturating_sub(self, o) } fn saturating_mul(self, o: Self) -> Self { self.checked_mul(&o).unwrap_or_else(Bounded::max_value) } } /// Convenience type to work around the highly unergonomic syntax needed /// to invoke the functions of overloaded generic traits, in this case /// `SaturatedFrom` and `SaturatedInto`. pub trait SaturatedConversion { /// Convert from a value of `T` into an equivalent instance of `Self`. /// /// This just uses `UniqueSaturatedFrom` internally but with this /// variant you can provide the destination type using turbofish syntax /// in case Rust happens not to assume the correct type. fn saturated_from(t: T) -> Self where Self: UniqueSaturatedFrom { >::unique_saturated_from(t) } /// Consume self to return an equivalent value of `T`. /// /// This just uses `UniqueSaturatedInto` internally but with this /// variant you can provide the destination type using turbofish syntax /// in case Rust happens not to assume the correct type. fn saturated_into(self) -> T where Self: UniqueSaturatedInto { >::unique_saturated_into(self) } } impl SaturatedConversion for T {} /// Convenience type to work around the highly unergonomic syntax needed /// to invoke the functions of overloaded generic traits, in this case /// `TryFrom` and `TryInto`. pub trait CheckedConversion { /// Convert from a value of `T` into an equivalent instance of `Option`. /// /// This just uses `TryFrom` internally but with this /// variant you can provide the destination type using turbofish syntax /// in case Rust happens not to assume the correct type. fn checked_from(t: T) -> Option where Self: TryFrom { >::try_from(t).ok() } /// Consume self to return `Some` equivalent value of `Option`. /// /// This just uses `TryInto` internally but with this /// variant you can provide the destination type using turbofish syntax /// in case Rust happens not to assume the correct type. fn checked_into(self) -> Option where Self: TryInto { >::try_into(self).ok() } } impl CheckedConversion 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() } } /// A meta trait for all bit ops. pub trait SimpleBitOps: Sized + Clear + rstd::ops::BitOr + rstd::ops::BitXor + rstd::ops::BitAnd {} impl + rstd::ops::BitXor + rstd::ops::BitAnd > SimpleBitOps for T {} /// The block finalization trait. Implementing this lets you express what should happen /// for your module when the block is ending. pub trait OnFinalize { /// The block is being finalized. Implement to have something happen. fn on_finalize(_n: BlockNumber) {} } impl OnFinalize for () {} /// The block initialization trait. Implementing this lets you express what should happen /// for your module when the block is beginning (right before the first extrinsic is executed). pub trait OnInitialize { /// The block is being initialized. Implement to have something happen. fn on_initialize(_n: BlockNumber) {} } impl OnInitialize for () {} /// Off-chain computation trait. /// /// Implementing this trait on a module allows you to perform long-running tasks /// that make validators generate extrinsics (either transactions or inherents) /// with the results of those long-running computations. /// /// NOTE: This function runs off-chain, so it can access the block state, /// but cannot preform any alterations. pub trait OffchainWorker { /// This function is being called on every block. /// /// Implement this and use special `extern`s to generate transactions or inherents. /// Any state alterations are lost and are not persisted. fn generate_extrinsics(_n: BlockNumber) {} } impl OffchainWorker for () {} macro_rules! tuple_impl { ($first:ident, $($rest:ident,)+) => { tuple_impl!([$first] [$first] [$($rest)+]); }; ([$($direct:ident)+] [$($reverse:ident)+] []) => { impl< Number: Copy, $($direct: OnFinalize),+ > OnFinalize for ($($direct),+,) { fn on_finalize(n: Number) { $($reverse::on_finalize(n);)+ } } impl< Number: Copy, $($direct: OnInitialize),+ > OnInitialize for ($($direct),+,) { fn on_initialize(n: Number) { $($direct::on_initialize(n);)+ } } impl< Number: Copy, $($direct: OffchainWorker),+ > OffchainWorker for ($($direct),+,) { fn generate_extrinsics(n: Number) { $($direct::generate_extrinsics(n);)+ } } }; ([$($direct:ident)+] [$($reverse:ident)+] [$first:ident $($rest:ident)*]) => { tuple_impl!([$($direct)+] [$($reverse)+] []); tuple_impl!([$($direct)+ $first] [$first $($reverse)+] [$($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 + MaybeSerializeDebug + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]> + Copy + Default + Encode + Decode; /// The associated hash_db Hasher type. type Hasher: Hasher; /// 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 trie-db 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 + Iterator, 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(parent_hash: Self::Output) -> 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; type Hasher = Blake2Hasher; 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 + Iterator, 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(parent_hash: Self::Output) -> Option { runtime_io::storage_changes_root(parent_hash.into()).map(Into::into) } } /// Something that can be checked for equality and printed out to a debug channel if bad. pub trait CheckEqual { /// Perform the equality check. 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 != other { println!("Hash: given={}, expected={}", HexDisplay::from(self.as_fixed_bytes()), HexDisplay::from(other.as_fixed_bytes())); } } #[cfg(not(feature = "std"))] fn check_equal(&self, other: &Self) { if self != other { runtime_io::print("Hash not equal"); runtime_io::print(self.as_bytes()); runtime_io::print(other.as_bytes()); } } } impl CheckEqual for super::generic::DigestItem where H: Encode { #[cfg(feature = "std")] fn check_equal(&self, other: &Self) { if self != other { println!("DigestItem: given={:?}, expected={:?}", self, other); } } #[cfg(not(feature = "std"))] fn check_equal(&self, other: &Self) { if self != other { runtime_io::print("DigestItem not equal"); runtime_io::print(&Encode::encode(self)[..]); runtime_io::print(&Encode::encode(other)[..]); } } } /// A type that implements Serialize and Debug when in std environment. #[cfg(feature = "std")] pub trait MaybeSerializeDebugButNotDeserialize: Serialize + Debug {} #[cfg(feature = "std")] impl MaybeSerializeDebugButNotDeserialize for T {} /// A type that implements Serialize and Debug when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebugButNotDeserialize {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebugButNotDeserialize for T {} /// A type that implements Serialize when in std environment. #[cfg(feature = "std")] pub trait MaybeSerialize: Serialize {} #[cfg(feature = "std")] impl MaybeSerialize for T {} /// A type that implements Serialize when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeSerialize {} #[cfg(not(feature = "std"))] impl MaybeSerialize for T {} /// A type that implements Serialize, DeserializeOwned and Debug when in std environment. #[cfg(feature = "std")] pub trait MaybeSerializeDebug: Serialize + DeserializeOwned + Debug {} #[cfg(feature = "std")] impl MaybeSerializeDebug for T {} /// A type that implements Serialize, DeserializeOwned and Debug when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeSerializeDebug {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebug for T {} /// A type that implements Debug when in std environment. #[cfg(feature = "std")] pub trait MaybeDebug: Debug {} #[cfg(feature = "std")] impl MaybeDebug for T {} /// A type that implements Debug when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeDebug {} #[cfg(not(feature = "std"))] impl MaybeDebug for T {} /// A type that implements Display when in std environment. #[cfg(feature = "std")] pub trait MaybeDisplay: Display {} #[cfg(feature = "std")] impl MaybeDisplay for T {} /// A type that implements Display when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeDisplay {} #[cfg(not(feature = "std"))] impl MaybeDisplay for T {} /// A type that implements Hash when in std environment. #[cfg(feature = "std")] pub trait MaybeHash: ::rstd::hash::Hash {} #[cfg(feature = "std")] impl MaybeHash for T {} /// A type that implements Hash when in std environment. #[cfg(not(feature = "std"))] pub trait MaybeHash {} #[cfg(not(feature = "std"))] impl MaybeHash for T {} /// A type that provides a randomness beacon. pub trait RandomnessBeacon { /// Returns 32 bytes of random data. The output will change eventually, but /// is not guaranteed to be different between any two calls. /// /// # Security /// /// This MUST NOT be used for gambling, as it can be influenced by a /// malicious validator in the short term. It MAY be used in many /// cryptographic protocols, however, so long as one remembers that this /// (like everything else on-chain) is public. For example, it can be /// used where a number is needed that cannot have been chosen by an /// adversary, for purposes such as public-coin zero-knowledge proofs. fn random() -> [u8; 32]; } /// A type that can be used in runtime structures. pub trait Member: Send + Sync + Sized + MaybeDebug + 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 + MaybeSerializeDebugButNotDeserialize + 'static { /// Header number. type Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec; /// Header hash type type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Hashing algorithm type Hashing: Hash; /// Creates new header. fn new( number: Self::Number, extrinsics_root: Self::Hash, state_root: Self::Hash, parent_hash: Self::Hash, digest: Digest, ) -> Self; /// Returns a reference to the header number. fn number(&self) -> &Self::Number; /// Sets the header number. fn set_number(&mut self, number: Self::Number); /// Returns a reference to the extrinsics root. fn extrinsics_root(&self) -> &Self::Hash; /// Sets the extrinsic root. fn set_extrinsics_root(&mut self, root: Self::Hash); /// Returns a reference to the state root. fn state_root(&self) -> &Self::Hash; /// Sets the state root. fn set_state_root(&mut self, root: Self::Hash); /// Returns a reference to the parent hash. fn parent_hash(&self) -> &Self::Hash; /// Sets the parent hash. fn set_parent_hash(&mut self, hash: Self::Hash); /// Returns a reference to the digest. fn digest(&self) -> &Digest; /// Get a mutable reference to the digest. fn digest_mut(&mut self) -> &mut Digest; /// Returns the hash of the header. 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 + MaybeSerializeDebugButNotDeserialize + 'static { /// Type of extrinsics. type Extrinsic: Member + Codec + Extrinsic + MaybeSerialize; /// Header type. type Header: Header; /// Block hash type. type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; /// Returns a reference to the header. fn header(&self) -> &Self::Header; /// Returns a reference to the list of extrinsics. fn extrinsics(&self) -> &[Self::Extrinsic]; /// Split the block into header and list of extrinsics. fn deconstruct(self) -> (Self::Header, Vec); /// Creates new block from header and extrinsics. fn new(header: Self::Header, extrinsics: Vec) -> Self; /// Returns the hash of the block. fn hash(&self) -> Self::Hash { <::Hashing as Hash>::hash_of(self.header()) } } /// Something that acts like an `Extrinsic`. pub trait Extrinsic { /// Is this `Extrinsic` signed? /// If no information are available about signed/unsigned, `None` should be returned. fn is_signed(&self) -> Option { None } } /// 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; /// Extract the digest type for a block. pub type DigestFor = Digest<<::Header as Header>::Hash>; /// Extract the digest item type for a block. pub type DigestItemFor = DigestItem<<::Header as Header>::Hash>; /// 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` succeeds. type Checked; /// Check self, given an instance of Context. fn check(self, c: &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; /// Check self. fn check(self) -> Result; } // Every `BlindCheckable` is also a `StaticCheckable` for arbitrary `Context`. impl Checkable for T { type Checked = ::Checked; fn check(self, _c: &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 function /// 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 { /// Id of the account that is responsible for this piece of information (sender). type AccountId: Member + MaybeDisplay; /// Index allowing to disambiguate other `Applyable`s from the same `AccountId`. type Index: Member + MaybeDisplay + SimpleArithmetic; /// Function call. type Call: Member; /// Returns a reference to the index if any. fn index(&self) -> Option<&Self::Index>; /// Returns a reference to the sender if any. fn sender(&self) -> Option<&Self::AccountId>; /// Deconstructs into function call and sender. fn deconstruct(self) -> (Self::Call, Option); } /// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. pub struct ApiRef<'a, T>(T, rstd::marker::PhantomData<&'a ()>); impl<'a, T> From for ApiRef<'a, T> { fn from(api: T) -> Self { ApiRef(api, Default::default()) } } impl<'a, T> rstd::ops::Deref for ApiRef<'a, T> { type Target = T; fn deref(&self) -> &Self::Target { &self.0 } } impl<'a, T> rstd::ops::DerefMut for ApiRef<'a, T> { fn deref_mut(&mut self) -> &mut T { &mut self.0 } } /// Something that provides a runtime api. pub trait ProvideRuntimeApi { /// The concrete type that provides the api. type Api; /// Returns the runtime api. /// The returned instance will keep track of modifications to the storage. Any successful /// call to an api function, will `commit` its changes to an internal buffer. Otherwise, /// the modifications will be `discarded`. The modifications will not be applied to the /// storage, even on a `commit`. fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api>; } /// A marker trait for something that knows the type of the runtime block. pub trait GetRuntimeBlockType { /// The `RuntimeBlock` type. type RuntimeBlock: self::Block; } /// A marker trait for something that knows the type of the node block. pub trait GetNodeBlockType { /// The `NodeBlock` type. type NodeBlock: self::Block; } /// Something that provides information about a runtime api. pub trait RuntimeApiInfo { /// The identifier of the runtime api. const ID: [u8; 8]; /// The version of the runtime api. const VERSION: u32; } /// Something that can validate unsigned extrinsics. pub trait ValidateUnsigned { /// The call to validate type Call; /// Return the validity of the call /// /// This doesn't execute any side-effects; it merely checks /// whether the transaction would panic if it were included or not. /// /// Changes made to storage should be discarded by caller. fn validate_unsigned(call: &Self::Call) -> TransactionValidity; } /// Opaque datatype that may be destructured into a series of raw byte slices (which represent /// individual keys). pub trait OpaqueKeys: Clone { /// Return the number of encoded keys. fn count() -> usize { 0 } /// Get the raw bytes of key with index `i`. fn get_raw(&self, i: usize) -> &[u8]; /// Get the decoded key with index `i`. fn get(&self, i: usize) -> Option { T::decode(&mut self.get_raw(i)) } /// Verify a proof of ownership for the keys. fn ownership_proof_is_valid(&self, _proof: &[u8]) -> bool { true } } struct TrailingZeroInput<'a>(&'a [u8]); impl<'a> codec::Input for TrailingZeroInput<'a> { fn read(&mut self, into: &mut [u8]) -> usize { let len = into.len().min(self.0.len()); into[..len].copy_from_slice(&self.0[..len]); for i in &mut into[len..] { *i = 0; } self.0 = &self.0[len..]; into.len() } } /// This type can be converted into and possibly from an AccountId (which itself is generic). pub trait AccountIdConversion: Sized { /// Convert into an account ID. This is infallible. fn into_account(&self) -> AccountId; /// Try to convert an account ID into this type. Might not succeed. fn try_from_account(a: &AccountId) -> Option; } /// Provide a simply 4 byte identifier for a type. pub trait TypeId { /// Simple 4 byte identifier. const TYPE_ID: [u8; 4]; } /// Format is TYPE_ID ++ encode(parachain ID) ++ 00.... where 00... is indefinite trailing zeroes to fill AccountId. impl AccountIdConversion for Id { fn into_account(&self) -> T { (Id::TYPE_ID, self).using_encoded(|b| T::decode(&mut TrailingZeroInput(b)) ).unwrap_or_default() } fn try_from_account(x: &T) -> Option { x.using_encoded(|d| { if &d[0..4] != Id::TYPE_ID { return None } let mut cursor = &d[4..]; let result = Decode::decode(&mut cursor)?; if cursor.iter().all(|x| *x == 0) { Some(result) } else { None } }) } } #[cfg(test)] mod tests { use super::AccountIdConversion; use crate::codec::{Encode, Decode}; #[derive(Encode, Decode, Default, PartialEq, Debug)] struct U32Value(u32); impl super::TypeId for U32Value { const TYPE_ID: [u8; 4] = [0x0d, 0xf0, 0xfe, 0xca]; } // cafef00d #[derive(Encode, Decode, Default, PartialEq, Debug)] struct U16Value(u16); impl super::TypeId for U16Value { const TYPE_ID: [u8; 4] = [0xfe, 0xca, 0x0d, 0xf0]; } // f00dcafe type AccountId = u64; #[test] fn into_account_should_work() { let r: AccountId = U32Value::into_account(&U32Value(0xdeadbeef)); assert_eq!(r, 0x_deadbeef_cafef00d); } #[test] fn try_from_account_should_work() { let r = U32Value::try_from_account(&0x_deadbeef_cafef00d_u64); assert_eq!(r.unwrap(), U32Value(0xdeadbeef)); } #[test] fn into_account_with_fill_should_work() { let r: AccountId = U16Value::into_account(&U16Value(0xc0da)); assert_eq!(r, 0x_0000_c0da_f00dcafe); } #[test] fn try_from_account_with_fill_should_work() { let r = U16Value::try_from_account(&0x0000_c0da_f00dcafe_u64); assert_eq!(r.unwrap(), U16Value(0xc0da)); } #[test] fn bad_try_from_account_should_fail() { let r = U16Value::try_from_account(&0x0000_c0de_baadcafe_u64); assert!(r.is_none()); let r = U16Value::try_from_account(&0x0100_c0da_f00dcafe_u64); assert!(r.is_none()); } } /// Calls a given macro a number of times with a set of fixed params and an incrementing numeral. /// e.g. /// ```nocompile /// count!(println ("{}",) foo, bar, baz); /// // Will result in three `println!`s: "0", "1" and "2". /// ``` #[macro_export] macro_rules! count { ($f:ident ($($x:tt)*) ) => (); ($f:ident ($($x:tt)*) $x1:tt) => { $f!($($x)* 0); }; ($f:ident ($($x:tt)*) $x1:tt, $x2:tt) => { $f!($($x)* 0); $f!($($x)* 1); }; ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt) => { $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); }; ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt) => { $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); }; ($f:ident ($($x:tt)*) $x1:tt, $x2:tt, $x3:tt, $x4:tt, $x5:tt) => { $f!($($x)* 0); $f!($($x)* 1); $f!($($x)* 2); $f!($($x)* 3); $f!($($x)* 4); }; } #[macro_export] /// Just implement `OpaqueKeys` for a given tuple-struct. /// Would be much nicer for this to be converted to `derive` code. macro_rules! impl_opaque_keys { ( pub struct $name:ident ( $( $t:ty ),* $(,)* ); ) => { impl_opaque_keys! { pub struct $name ( $( $t ,)* ); impl OpaqueKeys for _ {} } }; ( pub struct $name:ident ( $( $t:ty ),* $(,)* ); impl OpaqueKeys for _ { $($rest:tt)* } ) => { #[derive(Default, Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)] #[cfg_attr(feature = "std", derive(Debug, $crate::serde::Serialize, $crate::serde::Deserialize))] pub struct $name($( pub $t ,)*); impl $crate::traits::OpaqueKeys for $name { fn count() -> usize { let mut c = 0; $( let _: $t; c += 1; )* c } fn get_raw(&self, i: usize) -> &[u8] { $crate::count!(impl_opaque_keys (!! self i) $($t),*); &[] } $($rest)* } }; ( !! $self:ident $param_i:ident $i:tt) => { if $param_i == $i { return $self.$i.as_ref() } } }