lib.rs 45.9 KiB
Newer Older
// This file is part of Substrate.
Gav Wood's avatar
Gav Wood committed

// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0
Gav Wood's avatar
Gav Wood committed

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 	http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
Gav Wood's avatar
Gav Wood committed

//! # System Module
//! The System module provides low-level access to core types and cross-cutting utilities.
//! It acts as the base layer for other pallets to interact with the Substrate framework components.
//!
//! - [`system::Trait`](./trait.Trait.html)
//! ## Overview
//! The System module defines the core data types used in a Substrate runtime.
//! It also provides several utility functions (see [`Module`](./struct.Module.html)) for other FRAME pallets.
//! In addition, it manages the storage items for extrinsics data, indexes, event records, and digest items,
//! among other things that support the execution of the current block.
//! It also handles low-level tasks like depositing logs, basic set up and take down of
//! temporary storage entries, and access to previous block hashes.
//! ## Interface
//! ### Dispatchable Functions
//! The System module does not implement any dispatchable functions.
//! ### Public Functions
//! See the [`Module`](./struct.Module.html) struct for details of publicly available functions.
//! The System module defines the following extensions:
//!
//!   - [`CheckWeight`]: Checks the weight and length of the block and ensure that it does not
//!     exceed the limits.
yjh's avatar
yjh committed
//!   - [`CheckNonce`]: Checks the nonce of the transaction. Contains a single payload of type
//!     `T::Index`.
//!   - [`CheckEra`]: Checks the era of the transaction. Contains a single payload of type `Era`.
//!   - [`CheckGenesis`]: Checks the provided genesis hash of the transaction. Must be a part of the
//!     signed payload of the transaction.
//!   - [`CheckSpecVersion`]: Checks that the runtime version is the same as the one used to sign the
//!     transaction.
//!   - [`CheckTxVersion`]: Checks that the transaction version is the same as the one used to sign the
//!     transaction.
//!
//! Lookup the runtime aggregator file (e.g. `node/runtime`) to see the full list of signed
//! extensions included in a chain.
//!
//! ### Prerequisites
//! Import the System module and derive your module's configuration trait from the system trait.
//! ### Example - Get extrinsic count and parent hash for the current block
//! use frame_support::{decl_module, dispatch};
//! use frame_system::{self as system, ensure_signed};
//! pub trait Trait: system::Trait {}
//! decl_module! {
//! 	pub struct Module<T: Trait> for enum Call where origin: T::Origin {
//! 		pub fn system_module_example(origin) -> dispatch::DispatchResult {
//! 			let _sender = ensure_signed(origin)?;
//! 			let _extrinsic_count = <system::Module<T>>::extrinsic_count();
//! 			let _parent_hash = <system::Module<T>>::parent_hash();
//! 			Ok(())
//! 		}
//! 	}
//! }
//! # fn main() { }
//! ```
Gav Wood's avatar
Gav Wood committed

#![cfg_attr(not(feature = "std"), no_std)]

#[cfg(feature = "std")]
use serde::Serialize;
use sp_std::prelude::*;
#[cfg(any(feature = "std", test))]
Gavin Wood's avatar
Gavin Wood committed
use sp_std::convert::Infallible;
use sp_std::marker::PhantomData;
use sp_std::fmt::Debug;
use sp_version::RuntimeVersion;
use sp_runtime::{
	RuntimeDebug, Perbill, DispatchError, Either, generic,
		self, CheckEqual, AtLeast32Bit, Zero, Lookup, LookupError,
		SimpleBitOps, Hash, Member, MaybeDisplay, BadOrigin,
		MaybeSerialize, MaybeSerializeDeserialize, MaybeMallocSizeOf, StaticLookup, One, Bounded,
		Dispatchable, AtLeast32BitUnsigned
	offchain::storage_lock::BlockNumberProvider,
use sp_core::{ChangesTrieConfiguration, storage::well_known_keys};
use frame_support::{
	decl_module, decl_event, decl_storage, decl_error, Parameter, ensure, debug,
Gavin Wood's avatar
Gavin Wood committed
	traits::{
Gavin Wood's avatar
Gavin Wood committed
		Contains, Get, ModuleToIndex, OnNewAccount, OnKilledAccount, IsDeadAccount, Happened,
		StoredMap, EnsureOrigin, OriginTrait, Filter,
Gavin Wood's avatar
Gavin Wood committed
	},
	weights::{
		Weight, RuntimeDbWeight, DispatchInfo, DispatchClass,
	},
	dispatch::DispatchResultWithPostInfo,
Gavin Wood's avatar
Gavin Wood committed
use codec::{Encode, Decode, FullCodec, EncodeLike};
Gav Wood's avatar
Gav Wood committed

#[cfg(any(feature = "std", test))]
use sp_io::TestExternalities;
#[cfg(test)]
pub(crate) mod mock;

mod extensions;
mod weights;
#[cfg(test)]
mod tests;

pub use extensions::{
	check_mortality::CheckMortality, check_genesis::CheckGenesis, check_nonce::CheckNonce,
	check_spec_version::CheckSpecVersion, check_tx_version::CheckTxVersion,
	check_weight::CheckWeight,
};
// Backward compatible re-export.
pub use extensions::check_mortality::CheckMortality as CheckEra;
/// Compute the trie root of a list of extrinsics.
pub fn extrinsics_root<H: Hash, E: codec::Encode>(extrinsics: &[E]) -> H::Output {
	extrinsics_data_root::<H>(extrinsics.iter().map(codec::Encode::encode).collect())
/// Compute the trie root of a list of extrinsics.
pub fn extrinsics_data_root<H: Hash>(xts: Vec<Vec<u8>>) -> H::Output {
Bastian Köcher's avatar
Bastian Köcher committed
	H::ordered_trie_root(xts)
pub trait WeightInfo {
	fn remark(b: u32, ) -> Weight;
	fn set_heap_pages(i: u32, ) -> Weight;
	fn set_code_without_checks(b: u32, ) -> Weight;
	fn set_changes_trie_config(d: u32, ) -> Weight;
	fn set_storage(i: u32, ) -> Weight;
	fn kill_storage(i: u32, ) -> Weight;
	fn kill_prefix(p: u32, ) -> Weight;
	fn suicide(n: u32, ) -> Weight;
}

impl WeightInfo for () {
	fn remark(_b: u32, ) -> Weight { 1_000_000_000 }
	fn set_heap_pages(_i: u32, ) -> Weight { 1_000_000_000 }
	fn set_code_without_checks(_b: u32, ) -> Weight { 1_000_000_000 }
	fn set_changes_trie_config(_d: u32, ) -> Weight { 1_000_000_000 }
	fn set_storage(_i: u32, ) -> Weight { 1_000_000_000 }
	fn kill_storage(_i: u32, ) -> Weight { 1_000_000_000 }
	fn kill_prefix(_p: u32, ) -> Weight { 1_000_000_000 }
	fn suicide(_n: u32, ) -> Weight { 1_000_000_000 }
}

pub trait Trait: 'static + Eq + Clone {
	/// The basic call filter to use in Origin. All origins are built with this filter as base,
	/// except Root.
	type BaseCallFilter: Filter<Self::Call>;

	/// The `Origin` type used by dispatchable calls.
		Into<Result<RawOrigin<Self::AccountId>, Self::Origin>>
		+ From<RawOrigin<Self::AccountId>>
		+ Clone
		+ OriginTrait<Call = Self::Call>;
	/// The aggregated `Call` type.
	type Call: Dispatchable + Debug;
	/// Account index (aka nonce) type. This stores the number of previous transactions associated
	/// with a sender account.
Loading full blame...