mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-25 10:35:48 +00:00
8befd605b6
* Ensure relay chain block number strictly increases This is a safeguard for when async backing is enabled on the relay chain and multiple parachain blocks per relay chain block are legal. We will need to later change this to support then multiple parachain blocks per relay chain block. * Make the check configurable * Fix compilation * Update pallets/parachain-system/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Update pallets/parachain-system/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Fix test Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>
357 lines
12 KiB
Rust
357 lines
12 KiB
Rust
// Copyright 2019-2022 Parity Technologies (UK) Ltd.
|
|
// This file is part of Cumulus.
|
|
|
|
// Cumulus 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.
|
|
|
|
// Cumulus 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 Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! # Shell Runtime
|
|
//!
|
|
//! The Shell runtime defines a minimal parachain. It can listen for a downward message authorizing
|
|
//! an upgrade into another parachain.
|
|
//!
|
|
//! Generally (so far) only used as the first parachain on a Relay.
|
|
|
|
#![cfg_attr(not(feature = "std"), no_std)]
|
|
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
|
|
#![recursion_limit = "256"]
|
|
|
|
// Make the WASM binary available.
|
|
#[cfg(feature = "std")]
|
|
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
|
|
|
pub mod xcm_config;
|
|
|
|
use codec::{Decode, Encode};
|
|
use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases;
|
|
use frame_support::unsigned::TransactionValidityError;
|
|
use scale_info::TypeInfo;
|
|
use sp_api::impl_runtime_apis;
|
|
use sp_core::OpaqueMetadata;
|
|
use sp_runtime::{
|
|
create_runtime_str, generic,
|
|
traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf},
|
|
transaction_validity::{TransactionSource, TransactionValidity},
|
|
ApplyExtrinsicResult,
|
|
};
|
|
use sp_std::prelude::*;
|
|
#[cfg(feature = "std")]
|
|
use sp_version::NativeVersion;
|
|
use sp_version::RuntimeVersion;
|
|
|
|
// A few exports that help ease life for downstream crates.
|
|
pub use frame_support::{
|
|
construct_runtime, parameter_types,
|
|
traits::{Everything, IsInVec, Randomness},
|
|
weights::{
|
|
constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
|
|
DispatchClass, IdentityFee, Weight,
|
|
},
|
|
StorageValue,
|
|
};
|
|
use frame_system::limits::{BlockLength, BlockWeights};
|
|
#[cfg(any(feature = "std", test))]
|
|
pub use sp_runtime::BuildStorage;
|
|
pub use sp_runtime::{Perbill, Permill};
|
|
|
|
/// This runtime version.
|
|
#[sp_version::runtime_version]
|
|
pub const VERSION: RuntimeVersion = RuntimeVersion {
|
|
spec_name: create_runtime_str!("shell"),
|
|
impl_name: create_runtime_str!("shell"),
|
|
authoring_version: 1,
|
|
spec_version: 2,
|
|
impl_version: 0,
|
|
apis: RUNTIME_API_VERSIONS,
|
|
transaction_version: 1,
|
|
state_version: 0,
|
|
};
|
|
|
|
/// The version information used to identify this runtime when compiled natively.
|
|
#[cfg(feature = "std")]
|
|
pub fn native_version() -> NativeVersion {
|
|
NativeVersion { runtime_version: VERSION, can_author_with: Default::default() }
|
|
}
|
|
|
|
/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers.
|
|
/// This is used to limit the maximal weight of a single extrinsic.
|
|
const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);
|
|
/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used
|
|
/// by Operational extrinsics.
|
|
const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
|
|
/// We allow for .5 seconds of compute with a 12 second average block time.
|
|
const MAXIMUM_BLOCK_WEIGHT: Weight = WEIGHT_PER_SECOND / 2;
|
|
|
|
parameter_types! {
|
|
pub const BlockHashCount: BlockNumber = 250;
|
|
pub const Version: RuntimeVersion = VERSION;
|
|
pub RuntimeBlockLength: BlockLength =
|
|
BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
|
|
pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()
|
|
.base_block(BlockExecutionWeight::get())
|
|
.for_class(DispatchClass::all(), |weights| {
|
|
weights.base_extrinsic = ExtrinsicBaseWeight::get();
|
|
})
|
|
.for_class(DispatchClass::Normal, |weights| {
|
|
weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);
|
|
})
|
|
.for_class(DispatchClass::Operational, |weights| {
|
|
weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);
|
|
// Operational transactions have some extra reserved space, so that they
|
|
// are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.
|
|
weights.reserved = Some(
|
|
MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT
|
|
);
|
|
})
|
|
.avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)
|
|
.build_or_panic();
|
|
pub const SS58Prefix: u8 = 42;
|
|
}
|
|
|
|
impl frame_system::Config for Runtime {
|
|
/// The identifier used to distinguish between accounts.
|
|
type AccountId = AccountId;
|
|
/// The aggregated dispatch type that is available for extrinsics.
|
|
type Call = Call;
|
|
/// The lookup mechanism to get account ID from whatever is passed in dispatchers.
|
|
type Lookup = AccountIdLookup<AccountId, ()>;
|
|
/// The index type for storing how many extrinsics an account has signed.
|
|
type Index = Index;
|
|
/// The index type for blocks.
|
|
type BlockNumber = BlockNumber;
|
|
/// The type for hashing blocks and tries.
|
|
type Hash = Hash;
|
|
/// The hashing algorithm used.
|
|
type Hashing = BlakeTwo256;
|
|
/// The header type.
|
|
type Header = generic::Header<BlockNumber, BlakeTwo256>;
|
|
/// The ubiquitous event type.
|
|
type Event = Event;
|
|
/// The ubiquitous origin type.
|
|
type Origin = Origin;
|
|
/// Maximum number of block number to block hash mappings to keep (oldest pruned first).
|
|
type BlockHashCount = BlockHashCount;
|
|
/// Runtime version.
|
|
type Version = Version;
|
|
/// Converts a module to an index of this module in the runtime.
|
|
type PalletInfo = PalletInfo;
|
|
type AccountData = ();
|
|
type OnNewAccount = ();
|
|
type OnKilledAccount = ();
|
|
type DbWeight = ();
|
|
type BaseCallFilter = frame_support::traits::Everything;
|
|
type SystemWeightInfo = ();
|
|
type BlockWeights = RuntimeBlockWeights;
|
|
type BlockLength = RuntimeBlockLength;
|
|
type SS58Prefix = SS58Prefix;
|
|
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;
|
|
type MaxConsumers = frame_support::traits::ConstU32<16>;
|
|
}
|
|
|
|
parameter_types! {
|
|
// We do anything the parent chain tells us in this runtime.
|
|
pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 2;
|
|
}
|
|
|
|
impl cumulus_pallet_parachain_system::Config for Runtime {
|
|
type Event = Event;
|
|
type OnSystemEvent = ();
|
|
type SelfParaId = parachain_info::Pallet<Runtime>;
|
|
type OutboundXcmpMessageSource = ();
|
|
type DmpMessageHandler = cumulus_pallet_xcm::UnlimitedDmpExecution<Runtime>;
|
|
type ReservedDmpWeight = ReservedDmpWeight;
|
|
type XcmpMessageHandler = ();
|
|
type ReservedXcmpWeight = ();
|
|
type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases;
|
|
}
|
|
|
|
impl parachain_info::Config for Runtime {}
|
|
|
|
construct_runtime! {
|
|
pub enum Runtime where
|
|
Block = Block,
|
|
NodeBlock = generic::Block<Header, sp_runtime::OpaqueExtrinsic>,
|
|
UncheckedExtrinsic = UncheckedExtrinsic,
|
|
{
|
|
System: frame_system::{Pallet, Call, Storage, Config, Event<T>},
|
|
ParachainSystem: cumulus_pallet_parachain_system::{
|
|
Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned,
|
|
},
|
|
ParachainInfo: parachain_info::{Pallet, Storage, Config},
|
|
|
|
// DMP handler.
|
|
CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Storage, Event<T>, Origin},
|
|
}
|
|
}
|
|
|
|
/// Simple implementation which fails any transaction which is signed.
|
|
#[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)]
|
|
pub struct DisallowSigned;
|
|
impl sp_runtime::traits::SignedExtension for DisallowSigned {
|
|
const IDENTIFIER: &'static str = "DisallowSigned";
|
|
type AccountId = AccountId;
|
|
type Call = Call;
|
|
type AdditionalSigned = ();
|
|
type Pre = ();
|
|
fn additional_signed(
|
|
&self,
|
|
) -> sp_std::result::Result<(), sp_runtime::transaction_validity::TransactionValidityError> {
|
|
Ok(())
|
|
}
|
|
fn pre_dispatch(
|
|
self,
|
|
who: &Self::AccountId,
|
|
call: &Self::Call,
|
|
info: &DispatchInfoOf<Self::Call>,
|
|
len: usize,
|
|
) -> Result<Self::Pre, TransactionValidityError> {
|
|
Ok(self.validate(who, call, info, len).map(|_| ())?)
|
|
}
|
|
fn validate(
|
|
&self,
|
|
_who: &Self::AccountId,
|
|
_call: &Self::Call,
|
|
_info: &sp_runtime::traits::DispatchInfoOf<Self::Call>,
|
|
_len: usize,
|
|
) -> TransactionValidity {
|
|
let i = sp_runtime::transaction_validity::InvalidTransaction::BadProof;
|
|
Err(sp_runtime::transaction_validity::TransactionValidityError::Invalid(i))
|
|
}
|
|
}
|
|
|
|
/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
|
|
pub type Signature = sp_runtime::MultiSignature;
|
|
/// Some way of identifying an account on the chain. We intentionally make it equivalent
|
|
/// to the public key of our transaction signing scheme.
|
|
pub type AccountId = <<Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId;
|
|
/// Index of a transaction in the chain.
|
|
pub type Index = u32;
|
|
/// A hash of some data used by the chain.
|
|
pub type Hash = sp_core::H256;
|
|
/// An index to a block.
|
|
pub type BlockNumber = u32;
|
|
/// The address format for describing accounts.
|
|
pub type Address = sp_runtime::MultiAddress<AccountId, ()>;
|
|
/// Block header type as expected by this runtime.
|
|
pub type Header = generic::Header<BlockNumber, BlakeTwo256>;
|
|
/// Block type as expected by this runtime.
|
|
pub type Block = generic::Block<Header, UncheckedExtrinsic>;
|
|
/// A Block signed with a Justification
|
|
pub type SignedBlock = generic::SignedBlock<Block>;
|
|
/// BlockId type as expected by this runtime.
|
|
pub type BlockId = generic::BlockId<Block>;
|
|
/// The SignedExtension to the basic transaction logic.
|
|
pub type SignedExtra = DisallowSigned;
|
|
/// Unchecked extrinsic type as expected by this runtime.
|
|
pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;
|
|
/// Extrinsic type that has already been checked.
|
|
pub type CheckedExtrinsic = generic::CheckedExtrinsic<AccountId, Call, SignedExtra>;
|
|
/// Executive: handles dispatch to the various modules.
|
|
pub type Executive = frame_executive::Executive<
|
|
Runtime,
|
|
Block,
|
|
frame_system::ChainContext<Runtime>,
|
|
Runtime,
|
|
AllPalletsWithSystem,
|
|
>;
|
|
|
|
impl_runtime_apis! {
|
|
impl sp_api::Core<Block> for Runtime {
|
|
fn version() -> RuntimeVersion {
|
|
VERSION
|
|
}
|
|
|
|
fn execute_block(block: Block) {
|
|
Executive::execute_block(block)
|
|
}
|
|
|
|
fn initialize_block(header: &<Block as BlockT>::Header) {
|
|
Executive::initialize_block(header)
|
|
}
|
|
}
|
|
|
|
impl sp_api::Metadata<Block> for Runtime {
|
|
fn metadata() -> OpaqueMetadata {
|
|
OpaqueMetadata::new(Runtime::metadata().into())
|
|
}
|
|
}
|
|
|
|
impl sp_block_builder::BlockBuilder<Block> for Runtime {
|
|
fn apply_extrinsic(
|
|
extrinsic: <Block as BlockT>::Extrinsic,
|
|
) -> ApplyExtrinsicResult {
|
|
Executive::apply_extrinsic(extrinsic)
|
|
}
|
|
|
|
fn finalize_block() -> <Block as BlockT>::Header {
|
|
Executive::finalize_block()
|
|
}
|
|
|
|
fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> {
|
|
data.create_extrinsics()
|
|
}
|
|
|
|
fn check_inherents(block: Block, data: sp_inherents::InherentData) -> sp_inherents::CheckInherentsResult {
|
|
data.check_extrinsics(&block)
|
|
}
|
|
}
|
|
|
|
impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime {
|
|
fn validate_transaction(
|
|
source: TransactionSource,
|
|
tx: <Block as BlockT>::Extrinsic,
|
|
block_hash: <Block as BlockT>::Hash,
|
|
) -> TransactionValidity {
|
|
Executive::validate_transaction(source, tx, block_hash)
|
|
}
|
|
}
|
|
|
|
impl sp_offchain::OffchainWorkerApi<Block> for Runtime {
|
|
fn offchain_worker(header: &<Block as BlockT>::Header) {
|
|
Executive::offchain_worker(header)
|
|
}
|
|
}
|
|
|
|
impl sp_session::SessionKeys<Block> for Runtime {
|
|
fn decode_session_keys(_: Vec<u8>) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>> {
|
|
Some(Vec::new())
|
|
}
|
|
|
|
fn generate_session_keys(_: Option<Vec<u8>>) -> Vec<u8> {
|
|
Vec::new()
|
|
}
|
|
}
|
|
|
|
impl cumulus_primitives_core::CollectCollationInfo<Block> for Runtime {
|
|
fn collect_collation_info(header: &<Block as BlockT>::Header) -> cumulus_primitives_core::CollationInfo {
|
|
ParachainSystem::collect_collation_info(header)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct CheckInherents;
|
|
|
|
impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {
|
|
fn check_inherents(
|
|
_: &Block,
|
|
_: &cumulus_pallet_parachain_system::RelayChainStateProof,
|
|
) -> sp_inherents::CheckInherentsResult {
|
|
sp_inherents::CheckInherentsResult::new()
|
|
}
|
|
}
|
|
|
|
cumulus_pallet_parachain_system::register_validate_block! {
|
|
Runtime = Runtime,
|
|
BlockExecutor = Executive,
|
|
CheckInherents = CheckInherents,
|
|
}
|