diff --git a/Cargo.lock b/Cargo.lock index da3683e3de7..5eff1301f6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -727,13 +727,29 @@ dependencies = [ ] [[package]] -name = "bp-bridge-hub-rococo" +name = "bp-bridge-hub-cumulus" version = "0.1.0" dependencies = [ "bp-messages", "bp-polkadot-core", "bp-runtime", "frame-support", + "frame-system", + "polkadot-primitives", + "polkadot-runtime-constants", + "smallvec", + "sp-api", + "sp-std", +] + +[[package]] +name = "bp-bridge-hub-rococo" +version = "0.1.0" +dependencies = [ + "bp-bridge-hub-cumulus", + "bp-messages", + "bp-runtime", + "frame-support", "polkadot-runtime-constants", "smallvec", "sp-api", @@ -744,7 +760,7 @@ dependencies = [ name = "bp-bridge-hub-wococo" version = "0.1.0" dependencies = [ - "bp-bridge-hub-rococo", + "bp-bridge-hub-cumulus", "bp-messages", "bp-runtime", "frame-support", diff --git a/bin/runtime-common/src/refund_relayer_extension.rs b/bin/runtime-common/src/refund_relayer_extension.rs index 6b6e2078e00..76e15ab3cbc 100644 --- a/bin/runtime-common/src/refund_relayer_extension.rs +++ b/bin/runtime-common/src/refund_relayer_extension.rs @@ -608,7 +608,7 @@ mod tests { } fn run_test(test: impl FnOnce()) { - sp_io::TestExternalities::new(Default::default()).execute_with(|| test()) + sp_io::TestExternalities::new(Default::default()).execute_with(test) } fn run_pre_dispatch( diff --git a/primitives/chain-bridge-hub-cumulus/Cargo.toml b/primitives/chain-bridge-hub-cumulus/Cargo.toml new file mode 100644 index 00000000000..d413ce2ca4c --- /dev/null +++ b/primitives/chain-bridge-hub-cumulus/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "bp-bridge-hub-cumulus" +description = "Primitives of BridgeHubRococo parachain runtime." +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" + +[dependencies] +smallvec = "1.10.0" + +# Bridge Dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } + +# Substrate Based Dependencies + +frame-system = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +frame-support = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } +sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false } + +# Polkadot Dependencies +polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } +polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" } + +[features] +default = ["std"] +std = [ + "bp-polkadot-core/std", + "bp-messages/std", + "bp-runtime/std", + "frame-system/std", + "frame-support/std", + "sp-api/std", + "sp-std/std", + "polkadot-primitives/std", + "polkadot-runtime-constants/std", +] diff --git a/primitives/chain-bridge-hub-cumulus/src/lib.rs b/primitives/chain-bridge-hub-cumulus/src/lib.rs new file mode 100644 index 00000000000..264e85a517e --- /dev/null +++ b/primitives/chain-bridge-hub-cumulus/src/lib.rs @@ -0,0 +1,106 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common 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. + +// Parity Bridges Common 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 Parity Bridges Common. If not, see . + +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_messages::*; +pub use bp_polkadot_core::{ + AccountId, AccountInfoStorageMapKeyProvider, AccountPublic, Balance, BlockNumber, Hash, Hasher, + Hashing, Header, Index, Nonce, Perbill, Signature, SignedBlock, SignedExtensions, + UncheckedExtrinsic, MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, TX_EXTRA_BYTES, +}; +use frame_support::{ + dispatch::DispatchClass, + parameter_types, + sp_runtime::{MultiAddress, MultiSigner}, + weights::{constants, WeightToFeeCoefficient, WeightToFeeCoefficients, WeightToFeePolynomial}, +}; +use frame_system::limits; + +/// All cumulus bridge hubs allow normal extrinsics to fill block up to 75 percent. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// All cumulus bridge hubs chains allow for 0.5 seconds of compute with a 6-second average block +/// time. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const MAXIMUM_BLOCK_WEIGHT: Weight = constants::WEIGHT_PER_SECOND + .saturating_div(2) + .set_proof_size(polkadot_primitives::v2::MAX_POV_SIZE as u64); + +/// All cumulus bridge hubs assume that about 5 percent of the block weight is consumed by +/// `on_initialize` handlers. This is used to limit the maximal weight of a single extrinsic. +/// +/// This is a copy-paste from the cumulus repo's `parachains-common` crate. +pub const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); + +parameter_types! { + pub BlockLength: limits::BlockLength = limits::BlockLength::max_with_normal_ratio( + 5 * 1024 * 1024, + NORMAL_DISPATCH_RATIO, + ); + + pub const BlockExecutionWeight: Weight = constants::WEIGHT_PER_NANOS.saturating_mul(5_000_000); + + pub const ExtrinsicBaseWeight: Weight = constants::WEIGHT_PER_NANOS.saturating_mul(125_000); + + pub BlockWeights: limits::BlockWeights = limits::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 an 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(); +} + +/// [`WeightToFee`] should reflect cumulus/bridge-hub-* [`WeightToFee`] +pub struct WeightToFee; +impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + pub const CENTS: Balance = polkadot_runtime_constants::currency::CENTS; + + // In BridgeHub, we map the extrinsic base weight to 1/100 CENT. + let p = CENTS; + let q = 100 * Balance::from(constants::ExtrinsicBaseWeight::get().ref_time()); + smallvec::smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational(p % q, q), + coeff_integer: p / q, + }] + } +} + +/// Public key of the chain account that may be used to verify signatures. +pub type AccountSigner = MultiSigner; + +/// The address format for describing accounts. +pub type Address = MultiAddress; diff --git a/primitives/chain-bridge-hub-rococo/Cargo.toml b/primitives/chain-bridge-hub-rococo/Cargo.toml index 51bc88baf0e..806587bb9a1 100644 --- a/primitives/chain-bridge-hub-rococo/Cargo.toml +++ b/primitives/chain-bridge-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ smallvec = "1.10.0" # Bridge Dependencies -bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } bp-runtime = { path = "../../primitives/runtime", default-features = false } bp-messages = { path = "../../primitives/messages", default-features = false } @@ -27,7 +27,7 @@ polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", d [features] default = ["std"] std = [ - "bp-polkadot-core/std", + "bp-bridge-hub-cumulus/std", "bp-messages/std", "bp-runtime/std", "frame-support/std", diff --git a/primitives/chain-bridge-hub-rococo/src/lib.rs b/primitives/chain-bridge-hub-rococo/src/lib.rs index aa65f378542..633a021b634 100644 --- a/primitives/chain-bridge-hub-rococo/src/lib.rs +++ b/primitives/chain-bridge-hub-rococo/src/lib.rs @@ -19,19 +19,14 @@ #![cfg_attr(not(feature = "std"), no_std)] +pub use bp_bridge_hub_cumulus::*; use bp_messages::*; -pub use bp_polkadot_core::*; use bp_runtime::{ decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, }; use frame_support::{ dispatch::DispatchClass, - parameter_types, sp_runtime::{MultiAddress, MultiSigner}, - weights::{ - constants::ExtrinsicBaseWeight, WeightToFeeCoefficient, WeightToFeeCoefficients, - WeightToFeePolynomial, - }, RuntimeDebug, }; use sp_std::prelude::*; @@ -67,26 +62,6 @@ impl Parachain for BridgeHubRococo { const PARACHAIN_ID: u32 = BRIDGE_HUB_ROCOCO_PARACHAIN_ID; } -/// [`WeightToFee`] should reflect cumulus/bridge-hub-rococo-runtime [`WeightToFee`] -pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - pub const CENTS: Balance = polkadot_runtime_constants::currency::CENTS; - - // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // in BridgeHub, we map to 1/10 of that, or 1/100 CENT - let p = CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - smallvec::smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - /// Public key of the chain account that may be used to verify signatures. pub type AccountSigner = MultiSigner; @@ -99,9 +74,5 @@ pub const BRIDGE_HUB_ROCOCO_PARACHAIN_ID: u32 = 1013; /// Name of the With-BridgeHubRococo messages pallet instance that is deployed at bridged chains. pub const WITH_BRIDGE_HUB_ROCOCO_MESSAGES_PALLET_NAME: &str = "BridgeRococoMessages"; -parameter_types! { - pub const SS58Prefix: u16 = 42; -} - decl_bridge_finality_runtime_apis!(bridge_hub_rococo); decl_bridge_messages_runtime_apis!(bridge_hub_rococo); diff --git a/primitives/chain-bridge-hub-wococo/Cargo.toml b/primitives/chain-bridge-hub-wococo/Cargo.toml index 94ac501fbd5..24ecdb7adbc 100644 --- a/primitives/chain-bridge-hub-wococo/Cargo.toml +++ b/primitives/chain-bridge-hub-wococo/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" # Bridge Dependencies -bp-bridge-hub-rococo = { path = "../chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } bp-runtime = { path = "../../primitives/runtime", default-features = false } bp-messages = { path = "../../primitives/messages", default-features = false } @@ -23,10 +23,10 @@ sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", d [features] default = ["std"] std = [ + "bp-bridge-hub-cumulus/std", "bp-runtime/std", "bp-messages/std", "frame-support/std", "sp-api/std", "sp-std/std", - "bp-bridge-hub-rococo/std", ] diff --git a/primitives/chain-bridge-hub-wococo/src/lib.rs b/primitives/chain-bridge-hub-wococo/src/lib.rs index a2c3f2ad37a..e9a170223b9 100644 --- a/primitives/chain-bridge-hub-wococo/src/lib.rs +++ b/primitives/chain-bridge-hub-wococo/src/lib.rs @@ -23,13 +23,7 @@ #![cfg_attr(not(feature = "std"), no_std)] // Re-export only what is really needed -pub use bp_bridge_hub_rococo::{ - AccountId, AccountInfoStorageMapKeyProvider, AccountPublic, AccountSigner, Address, Balance, - BlockLength, BlockNumber, BlockWeights, Hash, Hasher, Hashing, Header, Index, Nonce, - SS58Prefix, Signature, SignedBlock, SignedExtensions, UncheckedExtrinsic, WeightToFee, - MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, - TX_EXTRA_BYTES, -}; +pub use bp_bridge_hub_cumulus::*; use bp_messages::*; use bp_runtime::{ decl_bridge_finality_runtime_apis, decl_bridge_messages_runtime_apis, Chain, Parachain, diff --git a/relays/bin-substrate/src/chains/millau.rs b/relays/bin-substrate/src/chains/millau.rs index 705755506f7..aa56d113e14 100644 --- a/relays/bin-substrate/src/chains/millau.rs +++ b/relays/bin-substrate/src/chains/millau.rs @@ -56,8 +56,4 @@ impl CliChain for Millau { const RUNTIME_VERSION: Option = Some(millau_runtime::VERSION); type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - millau_runtime::SS58Prefix::get() as u16 - } } diff --git a/relays/bin-substrate/src/chains/rialto.rs b/relays/bin-substrate/src/chains/rialto.rs index 83bccf626b9..a8e8143632e 100644 --- a/relays/bin-substrate/src/chains/rialto.rs +++ b/relays/bin-substrate/src/chains/rialto.rs @@ -48,8 +48,4 @@ impl CliChain for Rialto { const RUNTIME_VERSION: Option = Some(rialto_runtime::VERSION); type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - rialto_runtime::SS58Prefix::get() as u16 - } } diff --git a/relays/bin-substrate/src/chains/rialto_parachain.rs b/relays/bin-substrate/src/chains/rialto_parachain.rs index a480dc3eebb..66d03f212ce 100644 --- a/relays/bin-substrate/src/chains/rialto_parachain.rs +++ b/relays/bin-substrate/src/chains/rialto_parachain.rs @@ -50,8 +50,4 @@ impl CliChain for RialtoParachain { const RUNTIME_VERSION: Option = Some(rialto_parachain_runtime::VERSION); type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - rialto_parachain_runtime::SS58Prefix::get() as u16 - } } diff --git a/relays/bin-substrate/src/chains/rococo.rs b/relays/bin-substrate/src/chains/rococo.rs index 6a99eab6cb3..68a6b3e7b1d 100644 --- a/relays/bin-substrate/src/chains/rococo.rs +++ b/relays/bin-substrate/src/chains/rococo.rs @@ -25,18 +25,10 @@ impl CliChain for Rococo { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - bp_rococo::SS58Prefix::get() as u16 - } } impl CliChain for BridgeHubRococo { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - relay_bridge_hub_rococo_client::runtime::SS58Prefix::get() - } } diff --git a/relays/bin-substrate/src/chains/westend.rs b/relays/bin-substrate/src/chains/westend.rs index 1627bc015d3..075f22b698f 100644 --- a/relays/bin-substrate/src/chains/westend.rs +++ b/relays/bin-substrate/src/chains/westend.rs @@ -24,24 +24,10 @@ impl CliChain for Westend { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - sp_core::crypto::Ss58AddressFormat::from( - sp_core::crypto::Ss58AddressFormatRegistry::SubstrateAccount, - ) - .into() - } } impl CliChain for Westmint { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - sp_core::crypto::Ss58AddressFormat::from( - sp_core::crypto::Ss58AddressFormatRegistry::SubstrateAccount, - ) - .into() - } } diff --git a/relays/bin-substrate/src/chains/wococo.rs b/relays/bin-substrate/src/chains/wococo.rs index c44f3ac811f..2edd3dcf606 100644 --- a/relays/bin-substrate/src/chains/wococo.rs +++ b/relays/bin-substrate/src/chains/wococo.rs @@ -25,18 +25,10 @@ impl CliChain for Wococo { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - bp_wococo::SS58Prefix::get() as u16 - } } impl CliChain for BridgeHubWococo { const RUNTIME_VERSION: Option = None; type KeyPair = sp_core::sr25519::Pair; - - fn ss58_format() -> u16 { - relay_bridge_hub_wococo_client::runtime::SS58Prefix::get() - } } diff --git a/relays/bin-substrate/src/cli/mod.rs b/relays/bin-substrate/src/cli/mod.rs index 2086008bc95..5733aa411d8 100644 --- a/relays/bin-substrate/src/cli/mod.rs +++ b/relays/bin-substrate/src/cli/mod.rs @@ -167,9 +167,6 @@ pub trait CliChain: relay_substrate_client::Chain { /// /// In case of chains supporting multiple cryptos, pick one used by the CLI. type KeyPair: sp_core::crypto::Pair; - - /// Numeric value of SS58 format. - fn ss58_format() -> u16; } /// Lane id. diff --git a/relays/client-bridge-hub-rococo/src/runtime_wrapper.rs b/relays/client-bridge-hub-rococo/src/runtime_wrapper.rs index 6f83257cf4d..0571f82f5a6 100644 --- a/relays/client-bridge-hub-rococo/src/runtime_wrapper.rs +++ b/relays/client-bridge-hub-rococo/src/runtime_wrapper.rs @@ -22,7 +22,6 @@ use bp_polkadot_core::PolkadotLike; use codec::{Decode, Encode}; use scale_info::TypeInfo; -pub use bp_bridge_hub_rococo::SS58Prefix; use bp_messages::UnrewardedRelayersState; use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; use bp_runtime::Chain; diff --git a/relays/client-bridge-hub-wococo/src/runtime_wrapper.rs b/relays/client-bridge-hub-wococo/src/runtime_wrapper.rs index 8d94e7f9026..05176af471a 100644 --- a/relays/client-bridge-hub-wococo/src/runtime_wrapper.rs +++ b/relays/client-bridge-hub-wococo/src/runtime_wrapper.rs @@ -16,8 +16,6 @@ //! Types that are specific to the BridgeHubWococo runtime. -pub use bp_bridge_hub_wococo::SS58Prefix; - // We reuse everything from rococo runtime wrapper pub type Call = relay_bridge_hub_rococo_client::runtime::Call; pub type UncheckedExtrinsic = bp_bridge_hub_wococo::UncheckedExtrinsic;