mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 03:01:07 +00:00
feat: FRAME umbrella crate. (#1337)
### Original PR https://github.com/paritytech/substrate/pull/14137 This PR brings in the first version of the "_`frame` umbrella crate_". This crate is intended to serve two purposes: 1. documentation 2. easier development with frame. Ideally, we want most users to be able to build a frame-based pallet and runtime using just `frame` (plus `scale-codec` and `scale-info`). The crate is not finalized and is not yet intended for external use. Therefore, the version is set to `0.0.1-dev`, this PR is `silent`, and the entire crate is hidden behind the `experimental` flag. The main intention in merging it early on is to be able to iterate on it in the rest of [`developer-hub`](https://github.com/paritytech/polkadot-sdk-docs/) efforts. The public API of the `frame` crate is at the moment as follows: ``` pub mod frame pub use frame::log pub use frame::pallet pub mod frame::arithmetic pub use frame::arithmetic::<<sp_arithmetic::*>> pub use frame::arithmetic::<<sp_arithmetic::traits::*>> pub mod frame::deps pub use frame::deps::codec pub use frame::deps::frame_executive pub use frame::deps::frame_support pub use frame::deps::frame_system pub use frame::deps::scale_info pub use frame::deps::sp_api pub use frame::deps::sp_arithmetic pub use frame::deps::sp_block_builder pub use frame::deps::sp_consensus_aura pub use frame::deps::sp_consensus_grandpa pub use frame::deps::sp_core pub use frame::deps::sp_inherents pub use frame::deps::sp_io pub use frame::deps::sp_offchain pub use frame::deps::sp_runtime pub use frame::deps::sp_std pub use frame::deps::sp_version pub mod frame::derive pub use frame::derive::CloneNoBound pub use frame::derive::Debug pub use frame::derive::Debug pub use frame::derive::DebugNoBound pub use frame::derive::Decode pub use frame::derive::Decode pub use frame::derive::DefaultNoBound pub use frame::derive::Encode pub use frame::derive::Encode pub use frame::derive::EqNoBound pub use frame::derive::PartialEqNoBound pub use frame::derive::RuntimeDebug pub use frame::derive::RuntimeDebugNoBound pub use frame::derive::TypeInfo pub use frame::derive::TypeInfo pub mod frame::prelude pub use frame::prelude::<<frame_support::pallet_prelude::*>> pub use frame::prelude::<<frame_system::pallet_prelude::*>> pub use frame::prelude::<<sp_std::prelude::*>> pub use frame::prelude::CloneNoBound pub use frame::prelude::Debug pub use frame::prelude::Debug pub use frame::prelude::DebugNoBound pub use frame::prelude::Decode pub use frame::prelude::Decode pub use frame::prelude::DefaultNoBound pub use frame::prelude::Encode pub use frame::prelude::Encode pub use frame::prelude::EqNoBound pub use frame::prelude::PartialEqNoBound pub use frame::prelude::RuntimeDebug pub use frame::prelude::RuntimeDebugNoBound pub use frame::prelude::TypeInfo pub use frame::prelude::TypeInfo pub use frame::prelude::frame_system pub mod frame::primitives pub use frame::primitives::BlakeTwo256 pub use frame::primitives::H160 pub use frame::primitives::H256 pub use frame::primitives::H512 pub use frame::primitives::Hash pub use frame::primitives::Keccak256 pub use frame::primitives::U256 pub use frame::primitives::U512 pub mod frame::runtime pub mod frame::runtime::apis pub use frame::runtime::apis::<<frame_system_rpc_runtime_api::*>> pub use frame::runtime::apis::<<sp_api::*>> pub use frame::runtime::apis::<<sp_block_builder::*>> pub use frame::runtime::apis::<<sp_consensus_aura::*>> pub use frame::runtime::apis::<<sp_consensus_grandpa::*>> pub use frame::runtime::apis::<<sp_offchain::*>> pub use frame::runtime::apis::<<sp_session::runtime_api::*>> pub use frame::runtime::apis::<<sp_transaction_pool::runtime_api::*>> pub use frame::runtime::apis::ApplyExtrinsicResult pub use frame::runtime::apis::CheckInherentsResult pub use frame::runtime::apis::InherentData pub use frame::runtime::apis::OpaqueMetadata pub use frame::runtime::apis::impl_runtime_apis pub use frame::runtime::apis::sp_api pub mod frame::runtime::prelude pub use frame::runtime::prelude::<<frame_executive::*>> pub use frame::runtime::prelude::ConstBool pub use frame::runtime::prelude::ConstI128 pub use frame::runtime::prelude::ConstI16 pub use frame::runtime::prelude::ConstI32 pub use frame::runtime::prelude::ConstI64 pub use frame::runtime::prelude::ConstI8 pub use frame::runtime::prelude::ConstU128 pub use frame::runtime::prelude::ConstU16 pub use frame::runtime::prelude::ConstU32 pub use frame::runtime::prelude::ConstU64 pub use frame::runtime::prelude::ConstU8 pub use frame::runtime::prelude::NativeVersion pub use frame::runtime::prelude::RuntimeVersion pub use frame::runtime::prelude::construct_runtime pub use frame::runtime::prelude::create_runtime_str pub use frame::runtime::prelude::derive_impl pub use frame::runtime::prelude::frame_support pub use frame::runtime::prelude::ord_parameter_types pub use frame::runtime::prelude::parameter_types pub use frame::runtime::prelude::runtime_version pub mod frame::runtime::testing_prelude pub use frame::runtime::testing_prelude::BuildStorage pub use frame::runtime::testing_prelude::Storage pub mod frame::runtime::types_common pub type frame::runtime::types_common::AccountId = <<frame::runtime::types_common::Signature as sp_runtime::traits::Verify>::Signer as sp_runtime::traits::IdentifyAccount>::AccountId pub type frame::runtime::types_common::BlockNumber = u32 pub type frame::runtime::types_common::BlockOf<T, Extra> = sp_runtime::generic::block::Block<sp_runtime::generic::header::Header<frame::runtime::types_common::BlockNumber, sp_runtime::traits::BlakeTwo256>, sp_runtime::generic::unchecked_extrinsic::UncheckedExtrinsic<sp_runtime::multiaddress::MultiAddress<frame::runtime::types_common::AccountId, ()>, <T as frame_system::pallet::Config>::RuntimeCall, frame::runtime::types_common::Signature, Extra>> pub type frame::runtime::types_common::OpaqueBlock = sp_runtime::generic::block::Block<sp_runtime::generic::header::Header<frame::runtime::types_common::BlockNumber, sp_runtime::traits::BlakeTwo256>, sp_runtime::OpaqueExtrinsic> pub type frame::runtime::types_common::Signature = sp_runtime::MultiSignature pub type frame::runtime::types_common::SystemSignedExtensionsOf<T> = (frame_system::extensions::check_non_zero_sender::CheckNonZeroSender<T>, frame_system::extensions::check_spec_version::CheckSpecVersion<T>, frame_system::extensions::check_tx_version::CheckTxVersion<T>, frame_system::extensions::check_genesis::CheckGenesis<T>, frame_system::extensions::check_mortality::CheckMortality<T>, frame_system::extensions::check_nonce::CheckNonce<T>, frame_system::extensions::check_weight::CheckWeight<T>) pub mod frame::testing_prelude pub use frame::testing_prelude::<<frame_executive::*>> pub use frame::testing_prelude::<<frame_system::mocking::*>> pub use frame::testing_prelude::BuildStorage pub use frame::testing_prelude::ConstBool pub use frame::testing_prelude::ConstI128 pub use frame::testing_prelude::ConstI16 pub use frame::testing_prelude::ConstI32 pub use frame::testing_prelude::ConstI64 pub use frame::testing_prelude::ConstI8 pub use frame::testing_prelude::ConstU128 pub use frame::testing_prelude::ConstU16 pub use frame::testing_prelude::ConstU32 pub use frame::testing_prelude::ConstU64 pub use frame::testing_prelude::ConstU8 pub use frame::testing_prelude::NativeVersion pub use frame::testing_prelude::RuntimeVersion pub use frame::testing_prelude::Storage pub use frame::testing_prelude::TestState pub use frame::testing_prelude::assert_err pub use frame::testing_prelude::assert_err_ignore_postinfo pub use frame::testing_prelude::assert_error_encoded_size pub use frame::testing_prelude::assert_noop pub use frame::testing_prelude::assert_ok pub use frame::testing_prelude::assert_storage_noop pub use frame::testing_prelude::construct_runtime pub use frame::testing_prelude::create_runtime_str pub use frame::testing_prelude::derive_impl pub use frame::testing_prelude::frame_support pub use frame::testing_prelude::frame_system pub use frame::testing_prelude::if_std pub use frame::testing_prelude::ord_parameter_types pub use frame::testing_prelude::parameter_types pub use frame::testing_prelude::runtime_version pub use frame::testing_prelude::storage_alias pub mod frame::traits pub use frame::traits::<<frame_support::traits::*>> pub use frame::traits::<<sp_runtime::traits::*>> ``` --- The road to full stabilization is - [ ] https://github.com/paritytech/polkadot-sdk/issues/127 - [ ] have a more intentional version bump, as opposed to the current bi weekly force-major-bump - [ ] revise the internal API of `frame`, especially what goes into the `prelude`s. - [ ] migrate all internal pallets and runtime to use `frame` --------- Co-authored-by: kianenigma <kian@parity.io> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Francisco Aguirre <franciscoaguirreperez@gmail.com>
This commit is contained in:
Generated
+116
-12
@@ -575,7 +575,7 @@ dependencies = [
|
||||
"num-traits",
|
||||
"rusticata-macros",
|
||||
"thiserror",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -591,7 +591,7 @@ dependencies = [
|
||||
"num-traits",
|
||||
"rusticata-macros",
|
||||
"thiserror",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2434,14 +2434,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.30"
|
||||
version = "0.4.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877"
|
||||
checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"time 0.1.45",
|
||||
"wasm-bindgen",
|
||||
"windows-targets 0.48.5",
|
||||
]
|
||||
@@ -5192,10 +5193,32 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
|
||||
|
||||
[[package]]
|
||||
name = "frame"
|
||||
version = "0.1.0"
|
||||
version = "0.0.1-dev"
|
||||
dependencies = [
|
||||
"docify",
|
||||
"frame-executive",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"frame-system-rpc-runtime-api",
|
||||
"log",
|
||||
"pallet-examples",
|
||||
"parity-scale-codec",
|
||||
"scale-info",
|
||||
"simple-mermaid",
|
||||
"sp-api",
|
||||
"sp-arithmetic",
|
||||
"sp-block-builder",
|
||||
"sp-consensus-aura",
|
||||
"sp-consensus-grandpa",
|
||||
"sp-core",
|
||||
"sp-inherents",
|
||||
"sp-io",
|
||||
"sp-offchain",
|
||||
"sp-runtime",
|
||||
"sp-session",
|
||||
"sp-std",
|
||||
"sp-transaction-pool",
|
||||
"sp-version",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -7933,6 +7956,55 @@ version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-node"
|
||||
version = "4.0.0-dev"
|
||||
dependencies = [
|
||||
"clap 4.4.6",
|
||||
"frame",
|
||||
"futures",
|
||||
"futures-timer",
|
||||
"jsonrpsee",
|
||||
"minimal-runtime",
|
||||
"sc-basic-authorship",
|
||||
"sc-cli",
|
||||
"sc-client-api",
|
||||
"sc-consensus",
|
||||
"sc-consensus-manual-seal",
|
||||
"sc-executor",
|
||||
"sc-network",
|
||||
"sc-offchain",
|
||||
"sc-rpc-api",
|
||||
"sc-service",
|
||||
"sc-telemetry",
|
||||
"sc-transaction-pool",
|
||||
"sc-transaction-pool-api",
|
||||
"sp-api",
|
||||
"sp-block-builder",
|
||||
"sp-blockchain",
|
||||
"sp-io",
|
||||
"sp-keyring",
|
||||
"sp-runtime",
|
||||
"sp-timestamp",
|
||||
"substrate-build-script-utils",
|
||||
"substrate-frame-rpc-system",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-runtime"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"frame",
|
||||
"pallet-balances",
|
||||
"pallet-sudo",
|
||||
"pallet-timestamp",
|
||||
"pallet-transaction-payment",
|
||||
"pallet-transaction-payment-rpc-runtime-api",
|
||||
"parity-scale-codec",
|
||||
"scale-info",
|
||||
"substrate-wasm-builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.7.1"
|
||||
@@ -9695,6 +9767,15 @@ dependencies = [
|
||||
"sp-std",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pallet-example-frame-crate"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"frame",
|
||||
"parity-scale-codec",
|
||||
"scale-info",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pallet-example-kitchensink"
|
||||
version = "4.0.0-dev"
|
||||
@@ -9751,6 +9832,7 @@ dependencies = [
|
||||
"pallet-default-config-example",
|
||||
"pallet-dev-mode",
|
||||
"pallet-example-basic",
|
||||
"pallet-example-frame-crate",
|
||||
"pallet-example-kitchensink",
|
||||
"pallet-example-offchain-worker",
|
||||
"pallet-example-split",
|
||||
@@ -13796,7 +13878,7 @@ checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd"
|
||||
dependencies = [
|
||||
"pem",
|
||||
"ring 0.16.20",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
"x509-parser 0.13.2",
|
||||
"yasna",
|
||||
]
|
||||
@@ -13809,7 +13891,7 @@ checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b"
|
||||
dependencies = [
|
||||
"pem",
|
||||
"ring 0.16.20",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
"yasna",
|
||||
]
|
||||
|
||||
@@ -16497,6 +16579,11 @@ dependencies = [
|
||||
"wide",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simple-mermaid"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/kianenigma/simple-mermaid.git?rev=e48b187bcfd5cc75111acd9d241f1bd36604344b#e48b187bcfd5cc75111acd9d241f1bd36604344b"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
version = "0.3.11"
|
||||
@@ -17843,7 +17930,6 @@ dependencies = [
|
||||
name = "substrate"
|
||||
version = "1.0.0"
|
||||
dependencies = [
|
||||
"aquamarine",
|
||||
"chain-spec-builder",
|
||||
"frame-support",
|
||||
"sc-cli",
|
||||
@@ -17854,6 +17940,7 @@ dependencies = [
|
||||
"sc-consensus-manual-seal",
|
||||
"sc-consensus-pow",
|
||||
"sc-service",
|
||||
"simple-mermaid",
|
||||
"sp-runtime",
|
||||
"subkey",
|
||||
]
|
||||
@@ -18570,6 +18657,17 @@ dependencies = [
|
||||
"tikv-jemalloc-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.1.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"wasi 0.10.0+wasi-snapshot-preview1",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.3.27"
|
||||
@@ -19422,6 +19520,12 @@ version = "0.9.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.10.0+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
@@ -19924,7 +20028,7 @@ dependencies = [
|
||||
"sha2 0.10.7",
|
||||
"stun",
|
||||
"thiserror",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
"tokio",
|
||||
"turn",
|
||||
"url",
|
||||
@@ -20539,7 +20643,7 @@ dependencies = [
|
||||
"ring 0.16.20",
|
||||
"rusticata-macros",
|
||||
"thiserror",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -20557,7 +20661,7 @@ dependencies = [
|
||||
"oid-registry 0.6.1",
|
||||
"rusticata-macros",
|
||||
"thiserror",
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -20727,7 +20831,7 @@ version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
|
||||
dependencies = [
|
||||
"time",
|
||||
"time 0.3.27",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
+3
-1
@@ -179,6 +179,8 @@ members = [
|
||||
"polkadot/xcm/xcm-simulator",
|
||||
"polkadot/xcm/xcm-simulator/example",
|
||||
"polkadot/xcm/xcm-simulator/fuzzer",
|
||||
"substrate/bin/minimal/node",
|
||||
"substrate/bin/minimal/runtime",
|
||||
"substrate",
|
||||
"substrate/bin/node-template/node",
|
||||
"substrate/bin/node-template/pallets/template",
|
||||
@@ -251,6 +253,7 @@ members = [
|
||||
"substrate/client/transaction-pool",
|
||||
"substrate/client/transaction-pool/api",
|
||||
"substrate/client/utils",
|
||||
"substrate/frame",
|
||||
"substrate/frame/alliance",
|
||||
"substrate/frame/asset-conversion",
|
||||
"substrate/frame/asset-rate",
|
||||
@@ -350,7 +353,6 @@ members = [
|
||||
"substrate/frame/support/test",
|
||||
"substrate/frame/support/test/compile_pass",
|
||||
"substrate/frame/support/test/pallet",
|
||||
"substrate/frame/support/test/stg_frame_crate/frame",
|
||||
"substrate/frame/support/test/stg_frame_crate",
|
||||
"substrate/frame/system",
|
||||
"substrate/frame/system/benchmarking",
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
graph TB
|
||||
subgraph Substrate
|
||||
direction LR
|
||||
subgraph Client
|
||||
end
|
||||
subgraph Runtime
|
||||
end
|
||||
Client --runtime-api--> Runtime
|
||||
Runtime --host-functions--> Client
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
graph TB
|
||||
subgraph Substrate
|
||||
direction LR
|
||||
subgraph Client
|
||||
end
|
||||
subgraph Runtime
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,20 @@
|
||||
graph TB
|
||||
subgraph Substrate
|
||||
direction LR
|
||||
subgraph Client
|
||||
Database
|
||||
Networking
|
||||
Consensus
|
||||
end
|
||||
subgraph Runtime
|
||||
subgraph FRAME
|
||||
direction LR
|
||||
Governance
|
||||
Currency
|
||||
Staking
|
||||
Identity
|
||||
end
|
||||
end
|
||||
Client --runtime-api--> Runtime
|
||||
Runtime --host-functions--> Client
|
||||
end
|
||||
@@ -10,7 +10,7 @@ version = "1.0.0"
|
||||
|
||||
# The dependencies are only needed for docs.
|
||||
[dependencies]
|
||||
aquamarine = "0.3.2"
|
||||
simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" }
|
||||
|
||||
subkey = { path = "bin/utils/subkey" }
|
||||
chain-spec-builder = { path = "bin/utils/chain-spec-builder" }
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
[package]
|
||||
name = "minimal-node"
|
||||
version = "4.0.0-dev"
|
||||
description = "A fresh FRAME-based Substrate node, ready for hacking."
|
||||
authors = ["Substrate DevHub <https://github.com/substrate-developer-hub>"]
|
||||
homepage = "https://substrate.io/"
|
||||
edition = "2021"
|
||||
license = "MIT-0"
|
||||
publish = false
|
||||
repository = "https://github.com/substrate-developer-hub/substrate-node-template/"
|
||||
build = "build.rs"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[[bin]]
|
||||
name = "minimal-node"
|
||||
|
||||
[dependencies]
|
||||
clap = { version = "4.0.9", features = ["derive"] }
|
||||
futures = { version = "0.3.21", features = ["thread-pool"] }
|
||||
futures-timer = "3.0.1"
|
||||
jsonrpsee = { version = "0.16.2", features = ["server"] }
|
||||
|
||||
sc-cli = { path = "../../../client/cli" }
|
||||
sc-executor = { path = "../../../client/executor" }
|
||||
sc-network = { path = "../../../client/network" }
|
||||
sc-service = { path = "../../../client/service" }
|
||||
sc-telemetry = { path = "../../../client/telemetry" }
|
||||
sc-transaction-pool = { path = "../../../client/transaction-pool" }
|
||||
sc-transaction-pool-api = { path = "../../../client/transaction-pool/api" }
|
||||
sc-consensus = { path = "../../../client/consensus/common" }
|
||||
sc-consensus-manual-seal = { path = "../../../client/consensus/manual-seal" }
|
||||
sc-rpc-api = { path = "../../../client/rpc-api" }
|
||||
sc-basic-authorship = { path = "../../../client/basic-authorship" }
|
||||
sc-offchain = { path = "../../../client/offchain" }
|
||||
sc-client-api = { path = "../../../client/api" }
|
||||
|
||||
sp-timestamp = { path = "../../../primitives/timestamp" }
|
||||
sp-keyring = { path = "../../../primitives/keyring" }
|
||||
sp-api = { path = "../../../primitives/api" }
|
||||
sp-blockchain = { path = "../../../primitives/blockchain" }
|
||||
sp-block-builder = { path = "../../../primitives/block-builder" }
|
||||
sp-io = { path = "../../../primitives/io" }
|
||||
sp-runtime = { path = "../../../primitives/runtime" }
|
||||
|
||||
substrate-frame-rpc-system = { path = "../../../utils/frame/rpc/system" }
|
||||
|
||||
frame = { path = "../../../frame", features = ["runtime", "experimental"] }
|
||||
runtime = { package = "minimal-runtime", path = "../runtime" }
|
||||
|
||||
[build-dependencies]
|
||||
substrate-build-script-utils = { version = "3.0.0", path = "../../../utils/build-script-utils" }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
@@ -0,0 +1,23 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use substrate_build_script_utils::{generate_cargo_keys, rerun_if_git_head_changed};
|
||||
|
||||
fn main() {
|
||||
generate_cargo_keys();
|
||||
rerun_if_git_head_changed();
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use runtime::{BalancesConfig, RuntimeGenesisConfig, SudoConfig, SystemConfig, WASM_BINARY};
|
||||
use sc_service::{ChainType, Properties};
|
||||
use sp_keyring::AccountKeyring;
|
||||
|
||||
/// This is a specialization of the general Substrate ChainSpec type.
|
||||
pub type ChainSpec = sc_service::GenericChainSpec<RuntimeGenesisConfig>;
|
||||
|
||||
fn props() -> Properties {
|
||||
let mut properties = Properties::new();
|
||||
properties.insert("tokenDecimals".to_string(), 0.into());
|
||||
properties.insert("tokenSymbol".to_string(), "MINI".into());
|
||||
properties
|
||||
}
|
||||
|
||||
pub fn development_config() -> Result<ChainSpec, String> {
|
||||
let wasm_binary = WASM_BINARY.ok_or_else(|| "Development wasm not available".to_string())?;
|
||||
Ok(ChainSpec::from_genesis(
|
||||
"Development",
|
||||
"dev",
|
||||
ChainType::Development,
|
||||
move || testnet_genesis(wasm_binary),
|
||||
vec![],
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(props()),
|
||||
None,
|
||||
))
|
||||
}
|
||||
|
||||
/// Configure initial storage state for FRAME pallets.
|
||||
fn testnet_genesis(wasm_binary: &[u8]) -> RuntimeGenesisConfig {
|
||||
use frame::traits::Get;
|
||||
use runtime::interface::{Balance, MinimumBalance};
|
||||
let endowment = <MinimumBalance as Get<Balance>>::get().max(1) * 1000;
|
||||
let balances = AccountKeyring::iter()
|
||||
.map(|a| (a.to_account_id(), endowment))
|
||||
.collect::<Vec<_>>();
|
||||
RuntimeGenesisConfig {
|
||||
system: SystemConfig {
|
||||
// Add Wasm runtime to storage.
|
||||
code: wasm_binary.to_vec(),
|
||||
_config: Default::default(),
|
||||
},
|
||||
balances: BalancesConfig { balances },
|
||||
sudo: SudoConfig { key: Some(AccountKeyring::Alice.to_account_id()) },
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use sc_cli::RunCmd;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Consensus {
|
||||
ManualSeal(u64),
|
||||
InstantSeal,
|
||||
}
|
||||
|
||||
impl std::str::FromStr for Consensus {
|
||||
type Err = String;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
Ok(if s == "instant-seal" {
|
||||
Consensus::InstantSeal
|
||||
} else if let Some(block_time) = s.strip_prefix("manual-seal-") {
|
||||
Consensus::ManualSeal(block_time.parse().map_err(|_| "invalid block time")?)
|
||||
} else {
|
||||
return Err("incorrect consensus identifier".into())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, clap::Parser)]
|
||||
pub struct Cli {
|
||||
#[command(subcommand)]
|
||||
pub subcommand: Option<Subcommand>,
|
||||
|
||||
#[clap(long, default_value = "manual-seal-3000")]
|
||||
pub consensus: Consensus,
|
||||
|
||||
#[clap(flatten)]
|
||||
pub run: RunCmd,
|
||||
}
|
||||
|
||||
#[derive(Debug, clap::Subcommand)]
|
||||
pub enum Subcommand {
|
||||
/// Key management cli utilities
|
||||
#[command(subcommand)]
|
||||
Key(sc_cli::KeySubcommand),
|
||||
|
||||
/// Build a chain specification.
|
||||
BuildSpec(sc_cli::BuildSpecCmd),
|
||||
|
||||
/// Validate blocks.
|
||||
CheckBlock(sc_cli::CheckBlockCmd),
|
||||
|
||||
/// Export blocks.
|
||||
ExportBlocks(sc_cli::ExportBlocksCmd),
|
||||
|
||||
/// Export the state of a given block into a chain spec.
|
||||
ExportState(sc_cli::ExportStateCmd),
|
||||
|
||||
/// Import blocks.
|
||||
ImportBlocks(sc_cli::ImportBlocksCmd),
|
||||
|
||||
/// Remove the whole chain.
|
||||
PurgeChain(sc_cli::PurgeChainCmd),
|
||||
|
||||
/// Revert the chain to a previous state.
|
||||
Revert(sc_cli::RevertCmd),
|
||||
|
||||
/// Db meta columns information.
|
||||
ChainInfo(sc_cli::ChainInfoCmd),
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use crate::{
|
||||
chain_spec,
|
||||
cli::{Cli, Subcommand},
|
||||
service,
|
||||
};
|
||||
use sc_cli::SubstrateCli;
|
||||
use sc_service::PartialComponents;
|
||||
|
||||
#[cfg(feature = "try-runtime")]
|
||||
use try_runtime_cli::block_building_info::timestamp_with_aura_info;
|
||||
|
||||
impl SubstrateCli for Cli {
|
||||
fn impl_name() -> String {
|
||||
"Substrate Node".into()
|
||||
}
|
||||
|
||||
fn impl_version() -> String {
|
||||
env!("SUBSTRATE_CLI_IMPL_VERSION").into()
|
||||
}
|
||||
|
||||
fn description() -> String {
|
||||
env!("CARGO_PKG_DESCRIPTION").into()
|
||||
}
|
||||
|
||||
fn author() -> String {
|
||||
env!("CARGO_PKG_AUTHORS").into()
|
||||
}
|
||||
|
||||
fn support_url() -> String {
|
||||
"support.anonymous.an".into()
|
||||
}
|
||||
|
||||
fn copyright_start_year() -> i32 {
|
||||
2017
|
||||
}
|
||||
|
||||
fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
|
||||
Ok(match id {
|
||||
"dev" => Box::new(chain_spec::development_config()?),
|
||||
path =>
|
||||
Box::new(chain_spec::ChainSpec::from_json_file(std::path::PathBuf::from(path))?),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse and run command line arguments
|
||||
pub fn run() -> sc_cli::Result<()> {
|
||||
let cli = Cli::from_args();
|
||||
|
||||
match &cli.subcommand {
|
||||
Some(Subcommand::Key(cmd)) => cmd.run(&cli),
|
||||
Some(Subcommand::BuildSpec(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.sync_run(|config| cmd.run(config.chain_spec, config.network))
|
||||
},
|
||||
Some(Subcommand::CheckBlock(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.async_run(|config| {
|
||||
let PartialComponents { client, task_manager, import_queue, .. } =
|
||||
service::new_partial(&config)?;
|
||||
Ok((cmd.run(client, import_queue), task_manager))
|
||||
})
|
||||
},
|
||||
Some(Subcommand::ExportBlocks(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.async_run(|config| {
|
||||
let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?;
|
||||
Ok((cmd.run(client, config.database), task_manager))
|
||||
})
|
||||
},
|
||||
Some(Subcommand::ExportState(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.async_run(|config| {
|
||||
let PartialComponents { client, task_manager, .. } = service::new_partial(&config)?;
|
||||
Ok((cmd.run(client, config.chain_spec), task_manager))
|
||||
})
|
||||
},
|
||||
Some(Subcommand::ImportBlocks(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.async_run(|config| {
|
||||
let PartialComponents { client, task_manager, import_queue, .. } =
|
||||
service::new_partial(&config)?;
|
||||
Ok((cmd.run(client, import_queue), task_manager))
|
||||
})
|
||||
},
|
||||
Some(Subcommand::PurgeChain(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.sync_run(|config| cmd.run(config.database))
|
||||
},
|
||||
Some(Subcommand::Revert(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.async_run(|config| {
|
||||
let PartialComponents { client, task_manager, backend, .. } =
|
||||
service::new_partial(&config)?;
|
||||
Ok((cmd.run(client, backend, None), task_manager))
|
||||
})
|
||||
},
|
||||
Some(Subcommand::ChainInfo(cmd)) => {
|
||||
let runner = cli.create_runner(cmd)?;
|
||||
runner.sync_run(|config| cmd.run::<runtime::interface::OpaqueBlock>(&config))
|
||||
},
|
||||
None => {
|
||||
let runner = cli.create_runner(&cli.run)?;
|
||||
runner.run_node_until_exit(|config| async move {
|
||||
service::new_full(config, cli.consensus).map_err(sc_cli::Error::Service)
|
||||
})
|
||||
},
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -15,7 +15,7 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod deps {
|
||||
pub use frame_support;
|
||||
pub use frame_system;
|
||||
}
|
||||
pub mod chain_spec;
|
||||
pub(crate) mod cli;
|
||||
pub mod rpc;
|
||||
pub mod service;
|
||||
@@ -0,0 +1,30 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
//! Substrate Node Template CLI library.
|
||||
#![warn(missing_docs)]
|
||||
|
||||
mod chain_spec;
|
||||
#[macro_use]
|
||||
mod service;
|
||||
mod cli;
|
||||
mod command;
|
||||
mod rpc;
|
||||
|
||||
fn main() -> sc_cli::Result<()> {
|
||||
command::run()
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
//! A collection of node-specific RPC methods.
|
||||
//! Substrate provides the `sc-rpc` crate, which defines the core RPC layer
|
||||
//! used by Substrate nodes. This file extends those RPC definitions with
|
||||
//! capabilities that are specific to this project's runtime configuration.
|
||||
|
||||
#![warn(missing_docs)]
|
||||
|
||||
use jsonrpsee::RpcModule;
|
||||
use runtime::interface::{AccountId, Nonce, OpaqueBlock};
|
||||
use sc_transaction_pool_api::TransactionPool;
|
||||
use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata};
|
||||
use std::sync::Arc;
|
||||
use substrate_frame_rpc_system::{System, SystemApiServer};
|
||||
|
||||
pub use sc_rpc_api::DenyUnsafe;
|
||||
|
||||
/// Full client dependencies.
|
||||
pub struct FullDeps<C, P> {
|
||||
/// The client instance to use.
|
||||
pub client: Arc<C>,
|
||||
/// Transaction pool instance.
|
||||
pub pool: Arc<P>,
|
||||
/// Whether to deny unsafe calls
|
||||
pub deny_unsafe: DenyUnsafe,
|
||||
}
|
||||
|
||||
/// Instantiate all full RPC extensions.
|
||||
pub fn create_full<C, P>(
|
||||
deps: FullDeps<C, P>,
|
||||
) -> Result<RpcModule<()>, Box<dyn std::error::Error + Send + Sync>>
|
||||
where
|
||||
C: Send
|
||||
+ Sync
|
||||
+ 'static
|
||||
+ sp_api::ProvideRuntimeApi<OpaqueBlock>
|
||||
+ HeaderBackend<OpaqueBlock>
|
||||
+ HeaderMetadata<OpaqueBlock, Error = BlockChainError>
|
||||
+ 'static,
|
||||
C::Api: sp_block_builder::BlockBuilder<OpaqueBlock>,
|
||||
C::Api: substrate_frame_rpc_system::AccountNonceApi<OpaqueBlock, AccountId, Nonce>,
|
||||
P: TransactionPool + 'static,
|
||||
{
|
||||
let mut module = RpcModule::new(());
|
||||
let FullDeps { client, pool, deny_unsafe } = deps;
|
||||
|
||||
module.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?;
|
||||
|
||||
Ok(module)
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use futures::FutureExt;
|
||||
use runtime::{self, interface::OpaqueBlock as Block, RuntimeApi};
|
||||
use sc_client_api::backend::Backend;
|
||||
use sc_executor::WasmExecutor;
|
||||
use sc_service::{error::Error as ServiceError, Configuration, TaskManager};
|
||||
use sc_telemetry::{Telemetry, TelemetryWorker};
|
||||
use sc_transaction_pool_api::OffchainTransactionPoolFactory;
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::cli::Consensus;
|
||||
|
||||
#[cfg(feature = "runtime-benchmarks")]
|
||||
type HostFunctions =
|
||||
(sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions);
|
||||
|
||||
#[cfg(not(feature = "runtime-benchmarks"))]
|
||||
type HostFunctions = sp_io::SubstrateHostFunctions;
|
||||
|
||||
pub(crate) type FullClient =
|
||||
sc_service::TFullClient<Block, RuntimeApi, WasmExecutor<HostFunctions>>;
|
||||
type FullBackend = sc_service::TFullBackend<Block>;
|
||||
type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
|
||||
|
||||
pub fn new_partial(
|
||||
config: &Configuration,
|
||||
) -> Result<
|
||||
sc_service::PartialComponents<
|
||||
FullClient,
|
||||
FullBackend,
|
||||
FullSelectChain,
|
||||
sc_consensus::DefaultImportQueue<Block>,
|
||||
sc_transaction_pool::FullPool<Block, FullClient>,
|
||||
Option<Telemetry>,
|
||||
>,
|
||||
ServiceError,
|
||||
> {
|
||||
let telemetry = config
|
||||
.telemetry_endpoints
|
||||
.clone()
|
||||
.filter(|x| !x.is_empty())
|
||||
.map(|endpoints| -> Result<_, sc_telemetry::Error> {
|
||||
let worker = TelemetryWorker::new(16)?;
|
||||
let telemetry = worker.handle().new_telemetry(endpoints);
|
||||
Ok((worker, telemetry))
|
||||
})
|
||||
.transpose()?;
|
||||
|
||||
let executor = sc_service::new_wasm_executor(&config);
|
||||
|
||||
let (client, backend, keystore_container, task_manager) =
|
||||
sc_service::new_full_parts::<Block, RuntimeApi, _>(
|
||||
config,
|
||||
telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()),
|
||||
executor,
|
||||
)?;
|
||||
let client = Arc::new(client);
|
||||
|
||||
let telemetry = telemetry.map(|(worker, telemetry)| {
|
||||
task_manager.spawn_handle().spawn("telemetry", None, worker.run());
|
||||
telemetry
|
||||
});
|
||||
|
||||
let select_chain = sc_consensus::LongestChain::new(backend.clone());
|
||||
|
||||
let transaction_pool = sc_transaction_pool::BasicPool::new_full(
|
||||
config.transaction_pool.clone(),
|
||||
config.role.is_authority().into(),
|
||||
config.prometheus_registry(),
|
||||
task_manager.spawn_essential_handle(),
|
||||
client.clone(),
|
||||
);
|
||||
|
||||
let import_queue = sc_consensus_manual_seal::import_queue(
|
||||
Box::new(client.clone()),
|
||||
&task_manager.spawn_essential_handle(),
|
||||
config.prometheus_registry(),
|
||||
);
|
||||
|
||||
Ok(sc_service::PartialComponents {
|
||||
client,
|
||||
backend,
|
||||
task_manager,
|
||||
import_queue,
|
||||
keystore_container,
|
||||
select_chain,
|
||||
transaction_pool,
|
||||
other: (telemetry),
|
||||
})
|
||||
}
|
||||
|
||||
/// Builds a new service for a full client.
|
||||
pub fn new_full(config: Configuration, consensus: Consensus) -> Result<TaskManager, ServiceError> {
|
||||
let sc_service::PartialComponents {
|
||||
client,
|
||||
backend,
|
||||
mut task_manager,
|
||||
import_queue,
|
||||
keystore_container,
|
||||
select_chain,
|
||||
transaction_pool,
|
||||
other: mut telemetry,
|
||||
} = new_partial(&config)?;
|
||||
|
||||
let net_config = sc_network::config::FullNetworkConfiguration::new(&config.network);
|
||||
|
||||
let (network, system_rpc_tx, tx_handler_controller, network_starter, sync_service) =
|
||||
sc_service::build_network(sc_service::BuildNetworkParams {
|
||||
config: &config,
|
||||
client: client.clone(),
|
||||
transaction_pool: transaction_pool.clone(),
|
||||
spawn_handle: task_manager.spawn_handle(),
|
||||
import_queue,
|
||||
net_config,
|
||||
block_announce_validator_builder: None,
|
||||
warp_sync_params: None,
|
||||
block_relay: None,
|
||||
})?;
|
||||
|
||||
if config.offchain_worker.enabled {
|
||||
task_manager.spawn_handle().spawn(
|
||||
"offchain-workers-runner",
|
||||
"offchain-worker",
|
||||
sc_offchain::OffchainWorkers::new(sc_offchain::OffchainWorkerOptions {
|
||||
runtime_api_provider: client.clone(),
|
||||
is_validator: config.role.is_authority(),
|
||||
keystore: Some(keystore_container.keystore()),
|
||||
offchain_db: backend.offchain_storage(),
|
||||
transaction_pool: Some(OffchainTransactionPoolFactory::new(
|
||||
transaction_pool.clone(),
|
||||
)),
|
||||
network_provider: network.clone(),
|
||||
enable_http_requests: true,
|
||||
custom_extensions: |_| vec![],
|
||||
})
|
||||
.run(client.clone(), task_manager.spawn_handle())
|
||||
.boxed(),
|
||||
);
|
||||
}
|
||||
|
||||
let rpc_extensions_builder = {
|
||||
let client = client.clone();
|
||||
let pool = transaction_pool.clone();
|
||||
|
||||
Box::new(move |deny_unsafe, _| {
|
||||
let deps =
|
||||
crate::rpc::FullDeps { client: client.clone(), pool: pool.clone(), deny_unsafe };
|
||||
crate::rpc::create_full(deps).map_err(Into::into)
|
||||
})
|
||||
};
|
||||
|
||||
let prometheus_registry = config.prometheus_registry().cloned();
|
||||
|
||||
let _rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams {
|
||||
network,
|
||||
client: client.clone(),
|
||||
keystore: keystore_container.keystore(),
|
||||
task_manager: &mut task_manager,
|
||||
transaction_pool: transaction_pool.clone(),
|
||||
rpc_builder: rpc_extensions_builder,
|
||||
backend,
|
||||
system_rpc_tx,
|
||||
tx_handler_controller,
|
||||
sync_service,
|
||||
config,
|
||||
telemetry: telemetry.as_mut(),
|
||||
})?;
|
||||
|
||||
let proposer = sc_basic_authorship::ProposerFactory::new(
|
||||
task_manager.spawn_handle(),
|
||||
client.clone(),
|
||||
transaction_pool.clone(),
|
||||
prometheus_registry.as_ref(),
|
||||
telemetry.as_ref().map(|x| x.handle()),
|
||||
);
|
||||
|
||||
match consensus {
|
||||
Consensus::InstantSeal => {
|
||||
let params = sc_consensus_manual_seal::InstantSealParams {
|
||||
block_import: client.clone(),
|
||||
env: proposer,
|
||||
client,
|
||||
pool: transaction_pool,
|
||||
select_chain,
|
||||
consensus_data_provider: None,
|
||||
create_inherent_data_providers: move |_, ()| async move {
|
||||
Ok(sp_timestamp::InherentDataProvider::from_system_time())
|
||||
},
|
||||
};
|
||||
|
||||
let authorship_future = sc_consensus_manual_seal::run_instant_seal(params);
|
||||
|
||||
task_manager.spawn_essential_handle().spawn_blocking(
|
||||
"instant-seal",
|
||||
None,
|
||||
authorship_future,
|
||||
);
|
||||
},
|
||||
Consensus::ManualSeal(block_time) => {
|
||||
let (mut sink, commands_stream) = futures::channel::mpsc::channel(1024);
|
||||
task_manager.spawn_handle().spawn("block_authoring", None, async move {
|
||||
loop {
|
||||
futures_timer::Delay::new(std::time::Duration::from_millis(block_time)).await;
|
||||
sink.try_send(sc_consensus_manual_seal::EngineCommand::SealNewBlock {
|
||||
create_empty: true,
|
||||
finalize: true,
|
||||
parent_hash: None,
|
||||
sender: None,
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
});
|
||||
|
||||
let params = sc_consensus_manual_seal::ManualSealParams {
|
||||
block_import: client.clone(),
|
||||
env: proposer,
|
||||
client,
|
||||
pool: transaction_pool,
|
||||
select_chain,
|
||||
commands_stream: Box::pin(commands_stream),
|
||||
consensus_data_provider: None,
|
||||
create_inherent_data_providers: move |_, ()| async move {
|
||||
Ok(sp_timestamp::InherentDataProvider::from_system_time())
|
||||
},
|
||||
};
|
||||
let authorship_future = sc_consensus_manual_seal::run_manual_seal(params);
|
||||
|
||||
task_manager.spawn_essential_handle().spawn_blocking(
|
||||
"manual-seal",
|
||||
None,
|
||||
authorship_future,
|
||||
);
|
||||
},
|
||||
}
|
||||
|
||||
network_starter.start_network();
|
||||
Ok(task_manager)
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
[package]
|
||||
name = "minimal-runtime"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
parity-scale-codec = { version = "3.0.0", default-features = false }
|
||||
scale-info = { version = "2.6.0", default-features = false }
|
||||
|
||||
# this is a frame-based runtime, thus importing `frame` with runtime feature enabled.
|
||||
frame = { path = "../../../frame", default-features = false, features = ["runtime", "experimental"] }
|
||||
|
||||
# pallets that we want to use
|
||||
pallet-balances = { path = "../../../frame/balances", default-features = false }
|
||||
pallet-sudo = { path = "../../../frame/sudo", default-features = false }
|
||||
pallet-timestamp = { path = "../../../frame/timestamp", default-features = false }
|
||||
pallet-transaction-payment = { path = "../../../frame/transaction-payment", default-features = false }
|
||||
pallet-transaction-payment-rpc-runtime-api = { path = "../../../frame/transaction-payment/rpc/runtime-api", default-features = false }
|
||||
|
||||
|
||||
[build-dependencies]
|
||||
substrate-wasm-builder = { path = "../../../utils/wasm-builder", optional = true }
|
||||
|
||||
[features]
|
||||
default = [ "std" ]
|
||||
std = [
|
||||
"frame/std",
|
||||
"pallet-balances/std",
|
||||
"pallet-sudo/std",
|
||||
"pallet-timestamp/std",
|
||||
"pallet-transaction-payment-rpc-runtime-api/std",
|
||||
"pallet-transaction-payment/std",
|
||||
"parity-scale-codec/std",
|
||||
"scale-info/std",
|
||||
"substrate-wasm-builder",
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
fn main() {
|
||||
#[cfg(feature = "std")]
|
||||
{
|
||||
substrate_wasm_builder::WasmBuilder::new()
|
||||
.with_current_project()
|
||||
.export_heap_base()
|
||||
.import_memory()
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
|
||||
// Make the WASM binary available.
|
||||
#[cfg(feature = "std")]
|
||||
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
|
||||
|
||||
use frame::{
|
||||
deps::frame_support::weights::{FixedFee, NoFee},
|
||||
prelude::*,
|
||||
runtime::{
|
||||
apis::{
|
||||
self, impl_runtime_apis, ApplyExtrinsicResult, CheckInherentsResult, OpaqueMetadata,
|
||||
},
|
||||
prelude::*,
|
||||
},
|
||||
};
|
||||
|
||||
#[runtime_version]
|
||||
pub const VERSION: RuntimeVersion = RuntimeVersion {
|
||||
spec_name: create_runtime_str!("minimal-runtime"),
|
||||
impl_name: create_runtime_str!("minimal-runtime"),
|
||||
authoring_version: 1,
|
||||
spec_version: 0,
|
||||
impl_version: 1,
|
||||
apis: RUNTIME_API_VERSIONS,
|
||||
transaction_version: 1,
|
||||
state_version: 1,
|
||||
};
|
||||
|
||||
/// 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() }
|
||||
}
|
||||
|
||||
type SignedExtra = (
|
||||
frame_system::CheckNonZeroSender<Runtime>,
|
||||
frame_system::CheckSpecVersion<Runtime>,
|
||||
frame_system::CheckTxVersion<Runtime>,
|
||||
frame_system::CheckGenesis<Runtime>,
|
||||
frame_system::CheckEra<Runtime>,
|
||||
frame_system::CheckNonce<Runtime>,
|
||||
frame_system::CheckWeight<Runtime>,
|
||||
pallet_transaction_payment::ChargeTransactionPayment<Runtime>,
|
||||
);
|
||||
|
||||
construct_runtime!(
|
||||
pub struct Runtime {
|
||||
System: frame_system,
|
||||
Timestamp: pallet_timestamp,
|
||||
|
||||
Balances: pallet_balances,
|
||||
Sudo: pallet_sudo,
|
||||
TransactionPayment: pallet_transaction_payment,
|
||||
}
|
||||
);
|
||||
|
||||
parameter_types! {
|
||||
pub const Version: RuntimeVersion = VERSION;
|
||||
}
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig as frame_system::DefaultConfig)]
|
||||
impl frame_system::Config for Runtime {
|
||||
type Block = Block;
|
||||
type Version = Version;
|
||||
type BlockHashCount = ConstU32<1024>;
|
||||
type AccountData = pallet_balances::AccountData<<Runtime as pallet_balances::Config>::Balance>;
|
||||
}
|
||||
|
||||
#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)]
|
||||
impl pallet_balances::Config for Runtime {
|
||||
type AccountStore = System;
|
||||
}
|
||||
|
||||
#[derive_impl(pallet_sudo::config_preludes::TestDefaultConfig as pallet_sudo::DefaultConfig)]
|
||||
impl pallet_sudo::Config for Runtime {}
|
||||
|
||||
#[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig as pallet_timestamp::DefaultConfig)]
|
||||
impl pallet_timestamp::Config for Runtime {}
|
||||
|
||||
#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig as pallet_transaction_payment::DefaultConfig)]
|
||||
impl pallet_transaction_payment::Config for Runtime {
|
||||
type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, ()>;
|
||||
type WeightToFee = NoFee<<Self as pallet_balances::Config>::Balance>;
|
||||
type LengthToFee = FixedFee<1, <Self as pallet_balances::Config>::Balance>;
|
||||
}
|
||||
|
||||
type Block = frame::runtime::types_common::BlockOf<Runtime, SignedExtra>;
|
||||
type Header = HeaderFor<Runtime>;
|
||||
|
||||
type RuntimeExecutive =
|
||||
Executive<Runtime, Block, frame_system::ChainContext<Runtime>, Runtime, AllPalletsWithSystem>;
|
||||
|
||||
use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo};
|
||||
|
||||
impl_runtime_apis! {
|
||||
impl apis::Core<Block> for Runtime {
|
||||
fn version() -> RuntimeVersion {
|
||||
VERSION
|
||||
}
|
||||
|
||||
fn execute_block(block: Block) {
|
||||
RuntimeExecutive::execute_block(block)
|
||||
}
|
||||
|
||||
fn initialize_block(header: &Header) {
|
||||
RuntimeExecutive::initialize_block(header)
|
||||
}
|
||||
}
|
||||
impl apis::Metadata<Block> for Runtime {
|
||||
fn metadata() -> OpaqueMetadata {
|
||||
OpaqueMetadata::new(Runtime::metadata().into())
|
||||
}
|
||||
|
||||
fn metadata_at_version(version: u32) -> Option<OpaqueMetadata> {
|
||||
Runtime::metadata_at_version(version)
|
||||
}
|
||||
|
||||
fn metadata_versions() -> Vec<u32> {
|
||||
Runtime::metadata_versions()
|
||||
}
|
||||
}
|
||||
|
||||
impl apis::BlockBuilder<Block> for Runtime {
|
||||
fn apply_extrinsic(extrinsic: ExtrinsicFor<Runtime>) -> ApplyExtrinsicResult {
|
||||
RuntimeExecutive::apply_extrinsic(extrinsic)
|
||||
}
|
||||
|
||||
fn finalize_block() -> HeaderFor<Runtime> {
|
||||
RuntimeExecutive::finalize_block()
|
||||
}
|
||||
|
||||
fn inherent_extrinsics(data: InherentData) -> Vec<ExtrinsicFor<Runtime>> {
|
||||
data.create_extrinsics()
|
||||
}
|
||||
|
||||
fn check_inherents(
|
||||
block: Block,
|
||||
data: InherentData,
|
||||
) -> CheckInherentsResult {
|
||||
data.check_extrinsics(&block)
|
||||
}
|
||||
}
|
||||
|
||||
impl apis::TaggedTransactionQueue<Block> for Runtime {
|
||||
fn validate_transaction(
|
||||
source: TransactionSource,
|
||||
tx: ExtrinsicFor<Runtime>,
|
||||
block_hash: <Runtime as frame_system::Config>::Hash,
|
||||
) -> TransactionValidity {
|
||||
RuntimeExecutive::validate_transaction(source, tx, block_hash)
|
||||
}
|
||||
}
|
||||
|
||||
impl apis::OffchainWorkerApi<Block> for Runtime {
|
||||
fn offchain_worker(header: &HeaderFor<Runtime>) {
|
||||
RuntimeExecutive::offchain_worker(header)
|
||||
}
|
||||
}
|
||||
|
||||
impl apis::SessionKeys<Block> for Runtime {
|
||||
fn generate_session_keys(_seed: Option<Vec<u8>>) -> Vec<u8> {
|
||||
Default::default()
|
||||
}
|
||||
|
||||
fn decode_session_keys(
|
||||
_encoded: Vec<u8>,
|
||||
) -> Option<Vec<(Vec<u8>, apis::KeyTypeId)>> {
|
||||
Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl apis::AccountNonceApi<Block, interface::AccountId, interface::Nonce> for Runtime {
|
||||
fn account_nonce(account: interface::AccountId) -> interface::Nonce {
|
||||
System::account_nonce(account)
|
||||
}
|
||||
}
|
||||
|
||||
impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<
|
||||
Block,
|
||||
interface::Balance,
|
||||
> for Runtime {
|
||||
fn query_info(uxt: ExtrinsicFor<Runtime>, len: u32) -> RuntimeDispatchInfo<interface::Balance> {
|
||||
TransactionPayment::query_info(uxt, len)
|
||||
}
|
||||
fn query_fee_details(uxt: ExtrinsicFor<Runtime>, len: u32) -> FeeDetails<interface::Balance> {
|
||||
TransactionPayment::query_fee_details(uxt, len)
|
||||
}
|
||||
fn query_weight_to_fee(weight: Weight) -> interface::Balance {
|
||||
TransactionPayment::weight_to_fee(weight)
|
||||
}
|
||||
fn query_length_to_fee(length: u32) -> interface::Balance {
|
||||
TransactionPayment::length_to_fee(length)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Some re-exports that the node side code needs to know. Some are useful in this context as well.
|
||||
///
|
||||
/// Other types should preferably be private.
|
||||
// TODO: this should be standardized in some way, see:
|
||||
// https://github.com/paritytech/substrate/issues/10579#issuecomment-1600537558
|
||||
pub mod interface {
|
||||
use super::Runtime;
|
||||
use frame::deps::frame_system;
|
||||
|
||||
pub type Block = super::Block;
|
||||
pub use frame::runtime::types_common::OpaqueBlock;
|
||||
pub type AccountId = <Runtime as frame_system::Config>::AccountId;
|
||||
pub type Nonce = <Runtime as frame_system::Config>::Nonce;
|
||||
pub type Hash = <Runtime as frame_system::Config>::Hash;
|
||||
pub type Balance = <Runtime as pallet_balances::Config>::Balance;
|
||||
pub type MinimumBalance = <Runtime as pallet_balances::Config>::ExistentialDeposit;
|
||||
}
|
||||
@@ -236,7 +236,7 @@ pub async fn run_instant_seal<B, BI, CB, E, C, TP, SC, CIDP, P>(
|
||||
// instant-seal creates blocks as soon as transactions are imported
|
||||
// into the transaction pool.
|
||||
let commands_stream = pool.import_notification_stream().map(|_| EngineCommand::SealNewBlock {
|
||||
create_empty: false,
|
||||
create_empty: true,
|
||||
finalize: false,
|
||||
parent_hash: None,
|
||||
sender: None,
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
[package]
|
||||
name = "frame"
|
||||
version = "0.0.1-dev"
|
||||
authors = ["Parity Technologies <admin@parity.io>"]
|
||||
edition = "2021"
|
||||
license = "Apache-2.0"
|
||||
homepage = "paritytech.github.io"
|
||||
repository.workspace = true
|
||||
description = "The single package to get you started with building frame pallets and runtimes"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
# enable `experimental` feature for docs
|
||||
features = ["experimental"]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[dependencies]
|
||||
# external deps
|
||||
parity-scale-codec = { version = "3.2.2", default-features = false, features = ["derive"] }
|
||||
scale-info = { version = "2.6.0", default-features = false, features = ["derive"] }
|
||||
|
||||
# primitive deps, used for developing FRAME pallets.
|
||||
sp-runtime = { default-features = false, path = "../primitives/runtime" }
|
||||
sp-std = { default-features = false, path = "../primitives/std" }
|
||||
sp-io = { default-features = false, path = "../primitives/io" }
|
||||
sp-core = { default-features = false, path = "../primitives/core" }
|
||||
sp-arithmetic = { default-features = false, path = "../primitives/arithmetic" }
|
||||
|
||||
# frame deps, for developing FRAME pallets.
|
||||
frame-support = { default-features = false, path = "support" }
|
||||
frame-system = { default-features = false, path = "system" }
|
||||
|
||||
# primitive types used for developing FRAME runtimes.
|
||||
sp-version = { default-features = false, path = "../primitives/version", optional = true }
|
||||
sp-api = { default-features = false, path = "../primitives/api", optional = true }
|
||||
sp-block-builder = { default-features = false, path = "../primitives/block-builder", optional = true }
|
||||
sp-transaction-pool = { default-features = false, path = "../primitives/transaction-pool", optional = true }
|
||||
sp-offchain = { default-features = false, path = "../primitives/offchain", optional = true }
|
||||
sp-session = { default-features = false, path = "../primitives/session", optional = true }
|
||||
sp-consensus-aura = { default-features = false, path = "../primitives/consensus/aura", optional = true }
|
||||
sp-consensus-grandpa = { default-features = false, path = "../primitives/consensus/grandpa", optional = true }
|
||||
sp-inherents = { default-features = false, path = "../primitives/inherents", optional = true }
|
||||
|
||||
frame-executive = { default-features = false, path = "../frame/executive", optional = true }
|
||||
frame-system-rpc-runtime-api = { default-features = false, path = "../frame/system/rpc/runtime-api", optional = true }
|
||||
|
||||
docify = "0.2.0"
|
||||
simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" }
|
||||
log = { version = "0.4.20", default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
pallet-examples = { path = "./examples" }
|
||||
|
||||
[features]
|
||||
default = [ "runtime", "std" ]
|
||||
experimental = [ "frame-support/experimental", "frame-system/experimental" ]
|
||||
runtime = [
|
||||
"frame-executive",
|
||||
"frame-system-rpc-runtime-api",
|
||||
"sp-api",
|
||||
"sp-block-builder",
|
||||
"sp-consensus-aura",
|
||||
"sp-consensus-grandpa",
|
||||
"sp-inherents",
|
||||
"sp-offchain",
|
||||
"sp-session",
|
||||
"sp-transaction-pool",
|
||||
"sp-version",
|
||||
]
|
||||
std = [
|
||||
"frame-executive?/std",
|
||||
"frame-support/std",
|
||||
"frame-system-rpc-runtime-api?/std",
|
||||
"frame-system/std",
|
||||
"log/std",
|
||||
"parity-scale-codec/std",
|
||||
"scale-info/std",
|
||||
"sp-api?/std",
|
||||
"sp-arithmetic/std",
|
||||
"sp-block-builder?/std",
|
||||
"sp-consensus-aura?/std",
|
||||
"sp-consensus-grandpa?/std",
|
||||
"sp-core/std",
|
||||
"sp-inherents?/std",
|
||||
"sp-io/std",
|
||||
"sp-offchain?/std",
|
||||
"sp-runtime/std",
|
||||
"sp-session?/std",
|
||||
"sp-std/std",
|
||||
"sp-transaction-pool?/std",
|
||||
"sp-version?/std",
|
||||
]
|
||||
@@ -12,11 +12,12 @@ description = "The single package with examples of various types of FRAME pallet
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[dependencies]
|
||||
pallet-example-basic = { path = "basic", default-features = false}
|
||||
pallet-default-config-example = { path = "default-config", default-features = false}
|
||||
pallet-example-offchain-worker = { path = "offchain-worker", default-features = false}
|
||||
pallet-example-kitchensink = { path = "kitchensink", default-features = false}
|
||||
pallet-dev-mode = { path = "dev-mode", default-features = false}
|
||||
pallet-example-basic = { path = "basic", default-features = false}
|
||||
pallet-example-frame-crate = { path = "frame-crate", default-features = false }
|
||||
pallet-example-kitchensink = { path = "kitchensink", default-features = false}
|
||||
pallet-example-offchain-worker = { path = "offchain-worker", default-features = false}
|
||||
pallet-example-split = { path = "split", default-features = false}
|
||||
|
||||
[features]
|
||||
@@ -25,6 +26,7 @@ std = [
|
||||
"pallet-default-config-example/std",
|
||||
"pallet-dev-mode/std",
|
||||
"pallet-example-basic/std",
|
||||
"pallet-example-frame-crate/std",
|
||||
"pallet-example-kitchensink/std",
|
||||
"pallet-example-offchain-worker/std",
|
||||
"pallet-example-split/std",
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
[package]
|
||||
name = "pallet-example-frame-crate"
|
||||
version = "0.0.1"
|
||||
authors = ["Parity Technologies <admin@parity.io>"]
|
||||
edition = "2021"
|
||||
license = "MIT-0"
|
||||
homepage = "https://substrate.io"
|
||||
repository.workspace = true
|
||||
description = "FRAME example pallet with umbrella crate"
|
||||
readme = "README.md"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false }
|
||||
scale-info = { version = "2.5.0", default-features = false, features = ["derive"] }
|
||||
|
||||
frame = { path = "../..", default-features = false, features = ["runtime", "experimental"] }
|
||||
|
||||
|
||||
[features]
|
||||
default = [ "std" ]
|
||||
std = [ "codec/std", "frame/std", "scale-info/std" ]
|
||||
@@ -0,0 +1,66 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
use frame::prelude::*;
|
||||
|
||||
#[frame::pallet(dev_mode)]
|
||||
pub mod pallet {
|
||||
use super::*;
|
||||
|
||||
#[pallet::config]
|
||||
pub trait Config: frame_system::Config {
|
||||
type RuntimeEvent: IsType<<Self as frame_system::Config>::RuntimeEvent> + From<Event<Self>>;
|
||||
}
|
||||
|
||||
#[pallet::pallet]
|
||||
pub struct Pallet<T>(_);
|
||||
|
||||
#[pallet::event]
|
||||
pub enum Event<T: Config> {}
|
||||
|
||||
#[pallet::storage]
|
||||
pub type Value<T> = StorageValue<Value = u32>;
|
||||
|
||||
#[pallet::call]
|
||||
impl<T: Config> Pallet<T> {
|
||||
pub fn some_dispatchable(_origin: OriginFor<T>) -> DispatchResult {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::pallet as my_pallet;
|
||||
use frame::testing_prelude::*;
|
||||
|
||||
construct_runtime!(
|
||||
pub struct Runtime {
|
||||
System: frame_system,
|
||||
MyPallet: my_pallet,
|
||||
}
|
||||
);
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)]
|
||||
impl frame_system::Config for Runtime {
|
||||
type Block = MockBlock<Self>;
|
||||
}
|
||||
|
||||
impl my_pallet::Config for Runtime {
|
||||
type RuntimeEvent = RuntimeEvent;
|
||||
}
|
||||
}
|
||||
@@ -40,4 +40,7 @@
|
||||
//! - [`pallet_example_split`]: A simple example of a FRAME pallet demonstrating the ability to
|
||||
//! split sections across multiple files.
|
||||
//!
|
||||
//! - [`pallet_example_frame_crate`]: Example pallet showcasing how one can be
|
||||
//! built using only the `frame` umbrella crate.
|
||||
//!
|
||||
//! **Tip**: Use `cargo doc --package <pallet-name> --open` to view each pallet's documentation.
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
//! > Made for [![polkadot]](https://polkadot.network)
|
||||
//!
|
||||
//! [polkadot]: https://img.shields.io/badge/polkadot-E6007A?style=for-the-badge&logo=polkadot&logoColor=white
|
||||
//!
|
||||
//! # FRAME
|
||||
//!
|
||||
//! ```no_compile
|
||||
//! ______ ______ ________ ___ __ __ ______
|
||||
//! /_____/\ /_____/\ /_______/\ /__//_//_/\ /_____/\
|
||||
//! \::::_\/_\:::_ \ \ \::: _ \ \\::\| \| \ \\::::_\/_
|
||||
//! \:\/___/\\:(_) ) )_\::(_) \ \\:. \ \\:\/___/\
|
||||
//! \:::._\/ \: __ `\ \\:: __ \ \\:.\-/\ \ \\::___\/_
|
||||
//! \:\ \ \ \ `\ \ \\:.\ \ \ \\. \ \ \ \\:\____/\
|
||||
//! \_\/ \_\/ \_\/ \__\/\__\/ \__\/ \__\/ \_____\/
|
||||
//! ```
|
||||
//!
|
||||
//! > **F**ramework for **R**untime **A**ggregation of **M**odularized **E**ntities: Substrate's
|
||||
//! > State Transition Function (Runtime) Framework.
|
||||
//!
|
||||
//! ## Warning: Experimental
|
||||
//!
|
||||
//! This crate and all of its content is experimental, and should not yet be used in production.
|
||||
//!
|
||||
//! ## Getting Started
|
||||
//!
|
||||
//! TODO: link to `developer_hub::polkadot_sdk::frame`. The `developer_hub` hasn't been published
|
||||
//! yet, this can be updated once it is linkable.
|
||||
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
#![cfg(feature = "experimental")]
|
||||
|
||||
/// Exports the main pallet macro. This can wrap a `mod pallet` and will transform it into
|
||||
/// being a pallet, eg `#[frame::pallet] mod pallet { .. }`.
|
||||
///
|
||||
/// Note that this is not part of the prelude, in order to make it such that the common way to
|
||||
/// define a macro is `#[frame::pallet] mod pallet { .. }`, followed by `#[pallet::foo]`,
|
||||
/// `#[pallet::bar]` inside the mod.
|
||||
pub use frame_support::pallet;
|
||||
|
||||
/// The logging library of the runtime. Can normally be the classic `log` crate.
|
||||
pub use log;
|
||||
|
||||
/// The main prelude of FRAME.
|
||||
///
|
||||
/// This prelude should almost always be the first line of code in any pallet or runtime.
|
||||
///
|
||||
/// ```
|
||||
/// use frame::prelude::*;
|
||||
///
|
||||
/// // rest of your pallet..
|
||||
/// mod pallet {}
|
||||
/// ```
|
||||
pub mod prelude {
|
||||
/// `frame_system`'s parent crate, which is mandatory in all pallets build with this crate.
|
||||
///
|
||||
/// Conveniently, the keyword `frame_system` is in scope as one uses `use
|
||||
/// frame::prelude::*`
|
||||
#[doc(inline)]
|
||||
pub use frame_system;
|
||||
|
||||
/// Pallet prelude of `frame-support`.
|
||||
///
|
||||
/// Note: this needs to revised once `frame-support` evolves.
|
||||
// `frame-support` will be break down https://github.com/paritytech/polkadot-sdk/issues/127 and its reexports will
|
||||
// most likely change. These wildcard reexportings can be optimized once `frame-support` has
|
||||
// changed.
|
||||
#[doc(no_inline)]
|
||||
pub use frame_support::pallet_prelude::*;
|
||||
|
||||
/// Pallet prelude of `frame-system`.
|
||||
#[doc(no_inline)]
|
||||
pub use frame_system::pallet_prelude::*;
|
||||
|
||||
/// All of the std alternative types.
|
||||
#[doc(no_inline)]
|
||||
pub use sp_std::prelude::*;
|
||||
|
||||
/// All FRAME-relevant derive macros.
|
||||
#[doc(no_inline)]
|
||||
pub use super::derive::*;
|
||||
}
|
||||
|
||||
/// The main testing prelude of FRAME.
|
||||
///
|
||||
/// A test setup typically starts with:
|
||||
///
|
||||
/// ```
|
||||
/// use frame::testing_prelude::*;
|
||||
/// // rest of your test setup.
|
||||
/// ```
|
||||
#[cfg(feature = "std")]
|
||||
pub mod testing_prelude {
|
||||
pub use super::prelude::*;
|
||||
/// Testing includes building a runtime, so we bring in all preludes related to runtimes as
|
||||
/// well.
|
||||
pub use super::runtime::testing_prelude::*;
|
||||
|
||||
/// Other helper macros from `frame_support` that help with asserting in tests.
|
||||
pub use frame_support::{
|
||||
assert_err, assert_err_ignore_postinfo, assert_error_encoded_size, assert_noop, assert_ok,
|
||||
assert_storage_noop, storage_alias,
|
||||
};
|
||||
|
||||
pub use frame_system::{self, mocking::*};
|
||||
pub use sp_io::TestExternalities as TestState;
|
||||
pub use sp_std::if_std;
|
||||
}
|
||||
|
||||
/// All of the types and tools needed to build FRAME-based runtimes.
|
||||
#[cfg(any(feature = "runtime", feature = "std"))]
|
||||
pub mod runtime {
|
||||
/// The main prelude of `FRAME` for building runtimes.
|
||||
///
|
||||
/// A runtime typically starts with:
|
||||
///
|
||||
/// ```
|
||||
/// use frame::{prelude::*, runtime::prelude::*};
|
||||
/// ```
|
||||
pub mod prelude {
|
||||
/// All of the types related to the FRAME runtime executive.
|
||||
pub use frame_executive::*;
|
||||
|
||||
/// Macro to amalgamate the runtime into `struct Runtime`.
|
||||
pub use frame_support::construct_runtime;
|
||||
|
||||
/// Macro to easily derive the `Config` trait of various pallet for `Runtime`.
|
||||
pub use frame_support::derive_impl;
|
||||
|
||||
/// Macros to easily impl traits such as `Get` for types.
|
||||
// TODO: using linking in the Get in the line above triggers an ICE :/
|
||||
pub use frame_support::{ord_parameter_types, parameter_types};
|
||||
|
||||
/// Const types that can easily be used in conjuncture with `Get`.
|
||||
pub use frame_support::traits::{
|
||||
ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16,
|
||||
ConstU32, ConstU64, ConstU8,
|
||||
};
|
||||
|
||||
/// Types to define your runtime version.
|
||||
pub use sp_version::{create_runtime_str, runtime_version, RuntimeVersion};
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
pub use sp_version::NativeVersion;
|
||||
}
|
||||
|
||||
/// Types and traits for runtimes that implement runtime APIs.
|
||||
///
|
||||
/// A testing runtime should not need this.
|
||||
///
|
||||
/// A non-testing runtime should have this enabled, as such:
|
||||
///
|
||||
/// ```
|
||||
/// use frame::runtime::{prelude::*, apis::{*,}};
|
||||
/// ```
|
||||
// TODO: This is because of wildcard imports, and it should be not needed once we can avoid
|
||||
// that. Imports like that are needed because we seem to need some unknown types in the macro
|
||||
// expansion. See `sp_session::runtime_api::*;` as one example. All runtime api decls should be
|
||||
// moved to file similarly.
|
||||
#[allow(ambiguous_glob_reexports)]
|
||||
pub mod apis {
|
||||
// Types often used in the runtime APIs.
|
||||
pub use sp_core::OpaqueMetadata;
|
||||
pub use sp_inherents::{CheckInherentsResult, InherentData};
|
||||
pub use sp_runtime::ApplyExtrinsicResult;
|
||||
|
||||
/// Macro to implement runtime APIs.
|
||||
pub use sp_api::impl_runtime_apis;
|
||||
|
||||
pub use frame_system_rpc_runtime_api::*;
|
||||
pub use sp_api::{self, *};
|
||||
pub use sp_block_builder::*;
|
||||
pub use sp_consensus_aura::*;
|
||||
pub use sp_consensus_grandpa::*;
|
||||
pub use sp_offchain::*;
|
||||
pub use sp_session::runtime_api::*;
|
||||
pub use sp_transaction_pool::runtime_api::*;
|
||||
}
|
||||
|
||||
/// A set of opinionated types aliases commonly used in runtimes.
|
||||
///
|
||||
/// This is one set of opinionated types. They are compatible with one another, but are not
|
||||
/// guaranteed to work if you start tweaking a portion.
|
||||
///
|
||||
/// Some note-worthy opinions in this prelude:
|
||||
///
|
||||
/// - `u32` block number.
|
||||
/// - [`sp_runtime::MultiAddress`] and [`sp_runtime::MultiSignature`] are used as the account id
|
||||
/// and signature types. This implies that this prelude can possibly used with an
|
||||
/// "account-index" system (eg `pallet-indices`). And, in any case, it should be paired with
|
||||
/// `AccountIdLookup` in [`frame_system::Config::Lookup`].
|
||||
pub mod types_common {
|
||||
use frame_system::Config as SysConfig;
|
||||
use sp_runtime::{generic, traits, OpaqueExtrinsic};
|
||||
|
||||
/// A signature type compatible capably of handling multiple crypto-schemes.
|
||||
pub type Signature = sp_runtime::MultiSignature;
|
||||
|
||||
/// The corresponding account-id type of [`Signature`].
|
||||
pub type AccountId =
|
||||
<<Signature as traits::Verify>::Signer as traits::IdentifyAccount>::AccountId;
|
||||
|
||||
/// The block-number type, which should be fed into [`frame_system::Config`].
|
||||
pub type BlockNumber = u32;
|
||||
|
||||
/// TODO: Ideally we want the hashing type to be equal to SysConfig::Hashing?
|
||||
type HeaderInner = generic::Header<BlockNumber, traits::BlakeTwo256>;
|
||||
|
||||
// NOTE: `AccountIndex` is provided for future compatibility, if you want to introduce
|
||||
// something like `pallet-indices`.
|
||||
type ExtrinsicInner<T, Extra, AccountIndex = ()> = generic::UncheckedExtrinsic<
|
||||
sp_runtime::MultiAddress<AccountId, AccountIndex>,
|
||||
<T as SysConfig>::RuntimeCall,
|
||||
Signature,
|
||||
Extra,
|
||||
>;
|
||||
|
||||
/// The block type, which should be fed into [`frame_system::Config`].
|
||||
///
|
||||
/// Should be parameterized with `T: frame_system::Config` and a tuple of `SignedExtension`.
|
||||
/// When in doubt, use [`SystemSignedExtensionsOf`].
|
||||
// Note that this cannot be dependent on `T` for block-number because it would lead to a
|
||||
// circular dependency (self-referential generics).
|
||||
pub type BlockOf<T, Extra = ()> = generic::Block<HeaderInner, ExtrinsicInner<T, Extra>>;
|
||||
|
||||
/// The opaque block type. This is the same [`BlockOf`], but it has
|
||||
/// [`sp_runtime::OpaqueExtrinsic`] as its final extrinsic type.
|
||||
///
|
||||
/// This should be provided to the client side as the extrinsic type.
|
||||
pub type OpaqueBlock = generic::Block<HeaderInner, OpaqueExtrinsic>;
|
||||
|
||||
/// Default set of signed extensions exposed from the `frame_system`.
|
||||
///
|
||||
/// crucially, this does NOT contain any tx-payment extension.
|
||||
pub type SystemSignedExtensionsOf<T> = (
|
||||
frame_system::CheckNonZeroSender<T>,
|
||||
frame_system::CheckSpecVersion<T>,
|
||||
frame_system::CheckTxVersion<T>,
|
||||
frame_system::CheckGenesis<T>,
|
||||
frame_system::CheckEra<T>,
|
||||
frame_system::CheckNonce<T>,
|
||||
frame_system::CheckWeight<T>,
|
||||
);
|
||||
}
|
||||
|
||||
/// The main prelude of FRAME for building runtimes, and in the context of testing.
|
||||
///
|
||||
/// counter part of `runtime::prelude`.
|
||||
#[cfg(feature = "std")]
|
||||
pub mod testing_prelude {
|
||||
pub use super::prelude::*;
|
||||
pub use sp_core::storage::Storage;
|
||||
pub use sp_runtime::BuildStorage;
|
||||
}
|
||||
}
|
||||
|
||||
/// All traits often used in FRAME pallets.
|
||||
///
|
||||
/// Note that types implementing these traits can also be found in this module.
|
||||
// TODO: `Hash` and `Bounded` are defined multiple times; should be fixed once these two crates are
|
||||
// cleaned up.
|
||||
#[allow(ambiguous_glob_reexports)]
|
||||
pub mod traits {
|
||||
pub use frame_support::traits::*;
|
||||
pub use sp_runtime::traits::*;
|
||||
}
|
||||
|
||||
/// The arithmetic types used for safe math.
|
||||
pub mod arithmetic {
|
||||
pub use sp_arithmetic::{traits::*, *};
|
||||
}
|
||||
|
||||
/// Low level primitive types used in FRAME pallets.
|
||||
pub mod primitives {
|
||||
pub use sp_core::{H160, H256, H512, U256, U512};
|
||||
pub use sp_runtime::traits::{BlakeTwo256, Hash, Keccak256};
|
||||
}
|
||||
|
||||
/// All derive macros used in frame.
|
||||
///
|
||||
/// This is already part of the [`prelude`].
|
||||
pub mod derive {
|
||||
pub use frame_support::{
|
||||
CloneNoBound, DebugNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound,
|
||||
RuntimeDebugNoBound,
|
||||
};
|
||||
pub use parity_scale_codec::{Decode, Encode};
|
||||
pub use scale_info::TypeInfo;
|
||||
pub use sp_runtime::RuntimeDebug;
|
||||
pub use sp_std::fmt::Debug;
|
||||
}
|
||||
|
||||
/// Access to all of the dependencies of this crate. In case the re-exports are not enough, this
|
||||
/// module can be used.
|
||||
///
|
||||
/// Any time one uses this module to access a dependency, you can have a moment to think about
|
||||
/// whether this item could have been placed in any of the other modules and preludes in this crate.
|
||||
/// In most cases, hopefully the answer is yes.
|
||||
pub mod deps {
|
||||
// TODO: It would be great to somehow instruct RA to prefer *not* suggesting auto-imports from
|
||||
// these. For example, we prefer `frame::derive::CloneNoBound` rather than
|
||||
// `frame::deps::frame_support::CloneNoBound`.
|
||||
pub use frame_support;
|
||||
pub use frame_system;
|
||||
|
||||
pub use sp_arithmetic;
|
||||
pub use sp_core;
|
||||
pub use sp_io;
|
||||
pub use sp_runtime;
|
||||
pub use sp_std;
|
||||
|
||||
pub use parity_scale_codec as codec;
|
||||
pub use scale_info;
|
||||
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use frame_executive;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_api;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_block_builder;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_consensus_aura;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_consensus_grandpa;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_inherents;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_offchain;
|
||||
#[cfg(feature = "runtime")]
|
||||
pub use sp_version;
|
||||
}
|
||||
@@ -148,12 +148,34 @@ pub mod pallet {
|
||||
use frame_support::pallet_prelude::*;
|
||||
use frame_system::pallet_prelude::*;
|
||||
|
||||
#[pallet::config]
|
||||
/// Default preludes for [`Config`].
|
||||
pub mod config_preludes {
|
||||
use super::*;
|
||||
use frame_support::derive_impl;
|
||||
|
||||
/// Default prelude sensible to be used in a testing environment.
|
||||
pub struct TestDefaultConfig;
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
|
||||
impl frame_system::DefaultConfig for TestDefaultConfig {}
|
||||
|
||||
#[frame_support::register_default_impl(TestDefaultConfig)]
|
||||
impl DefaultConfig for TestDefaultConfig {
|
||||
type WeightInfo = ();
|
||||
#[inject_runtime_type]
|
||||
type RuntimeEvent = ();
|
||||
#[inject_runtime_type]
|
||||
type RuntimeCall = ();
|
||||
}
|
||||
}
|
||||
#[pallet::config(with_default)]
|
||||
pub trait Config: frame_system::Config {
|
||||
/// The overarching event type.
|
||||
#[pallet::no_default_bounds]
|
||||
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
|
||||
|
||||
/// A sudo-able call.
|
||||
#[pallet::no_default_bounds]
|
||||
type RuntimeCall: Parameter
|
||||
+ UnfilteredDispatchable<RuntimeOrigin = Self::RuntimeOrigin>
|
||||
+ GetDispatchInfo;
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
|
||||
use super::*;
|
||||
use crate as sudo;
|
||||
use frame_support::traits::{ConstU32, ConstU64, Contains};
|
||||
use sp_core::H256;
|
||||
use frame_support::traits::{ConstU32, Contains};
|
||||
use sp_core::{ConstU64, H256};
|
||||
use sp_io;
|
||||
use sp_runtime::{
|
||||
traits::{BlakeTwo256, IdentityLookup},
|
||||
|
||||
@@ -802,16 +802,20 @@ pub mod testing_prelude {
|
||||
/// Prelude to be used alongside pallet macro, for ease of use.
|
||||
pub mod pallet_prelude {
|
||||
pub use crate::{
|
||||
defensive, defensive_assert,
|
||||
dispatch::{DispatchClass, DispatchResult, DispatchResultWithPostInfo, Parameter, Pays},
|
||||
ensure,
|
||||
inherent::{InherentData, InherentIdentifier, ProvideInherent},
|
||||
storage,
|
||||
storage::{
|
||||
bounded_btree_map::BoundedBTreeMap,
|
||||
bounded_btree_set::BoundedBTreeSet,
|
||||
bounded_vec::BoundedVec,
|
||||
types::{
|
||||
CountedStorageMap, CountedStorageNMap, Key as NMapKey, OptionQuery, ResultQuery,
|
||||
StorageDoubleMap, StorageMap, StorageNMap, StorageValue, ValueQuery,
|
||||
},
|
||||
weak_bounded_vec::WeakBoundedVec,
|
||||
StorageList,
|
||||
},
|
||||
traits::{
|
||||
|
||||
@@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] }
|
||||
frame = { path = "frame", default-features = false}
|
||||
frame = { path = "../../..", default-features = false, features = ["runtime", "experimental"]}
|
||||
scale-info = { version = "2.10.0", default-features = false, features = ["derive"] }
|
||||
|
||||
[features]
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
[package]
|
||||
name = "frame"
|
||||
version = "0.1.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
publish = false
|
||||
homepage = "https://substrate.io"
|
||||
repository.workspace = true
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ["x86_64-unknown-linux-gnu"]
|
||||
|
||||
[dependencies]
|
||||
frame-system = { path = "../../../../system", default-features = false}
|
||||
frame-support = { path = "../../..", default-features = false}
|
||||
|
||||
[features]
|
||||
default = [ "std" ]
|
||||
std = [ "frame-support/std", "frame-system/std" ]
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
#[frame_support::pallet]
|
||||
mod pallet {
|
||||
use frame::deps::frame_system::pallet_prelude::BlockNumberFor;
|
||||
use frame_support::pallet_prelude::{Hooks, IsType};
|
||||
|
||||
#[pallet::config]
|
||||
pub trait Config: frame::deps::frame_system::Config {
|
||||
type Bar: Clone + std::fmt::Debug + Eq;
|
||||
type RuntimeEvent: IsType<<Self as frame::deps::frame_system::Config>::RuntimeEvent>
|
||||
+ From<Event<Self>>;
|
||||
}
|
||||
|
||||
#[pallet::pallet]
|
||||
pub struct Pallet<T>(core::marker::PhantomData<T>);
|
||||
|
||||
#[pallet::hooks]
|
||||
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {}
|
||||
|
||||
#[pallet::call]
|
||||
impl<T: Config> Pallet<T> {}
|
||||
|
||||
#[pallet::event]
|
||||
pub enum Event<T: Config> {
|
||||
B { b: T::Bar },
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
error: Invalid `type RuntimeEvent`, associated type `RuntimeEvent` is reserved and must bound: `IsType<<Self as frame_system::Config>::RuntimeEvent>`
|
||||
--> tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs:26:3
|
||||
|
|
||||
26 | type RuntimeEvent: IsType<<Self as frame::deps::frame_system::Config>::RuntimeEvent>
|
||||
| ^^^^
|
||||
@@ -52,6 +52,7 @@ runtime-benchmarks = [
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
]
|
||||
try-runtime = [ "frame-support/try-runtime", "sp-runtime/try-runtime" ]
|
||||
experimental = []
|
||||
|
||||
[[bench]]
|
||||
name = "bench"
|
||||
|
||||
@@ -244,6 +244,53 @@ pub mod pallet {
|
||||
type BlockHashCount = frame_support::traits::ConstU64<10>;
|
||||
type OnSetCode = ();
|
||||
}
|
||||
|
||||
/// Default configurations of this pallet in a solo-chain environment.
|
||||
///
|
||||
/// ## Considerations:
|
||||
///
|
||||
/// By default, this type makes the following choices:
|
||||
///
|
||||
/// * Use a normal 32 byte account id, with a [`DefaultConfig::Lookup`] that implies no
|
||||
/// 'account-indexing' pallet is being used.
|
||||
/// * Given that we don't know anything about the existence of a currency system in scope,
|
||||
/// an [`DefaultConfig::AccountData`] is chosen that has no addition data. Overwrite this
|
||||
/// if you use `pallet-balances` or similar.
|
||||
/// * Make sure to overwrite [`DefaultConfig::Version`].
|
||||
/// * 2s block time, and a default 5mb block size is used.
|
||||
#[cfg(feature = "experimental")]
|
||||
pub struct SolochainDefaultConfig;
|
||||
|
||||
#[cfg(feature = "experimental")]
|
||||
#[frame_support::register_default_impl(SolochainDefaultConfig)]
|
||||
impl DefaultConfig for SolochainDefaultConfig {
|
||||
type Nonce = u32;
|
||||
type Hash = sp_core::hash::H256;
|
||||
type Hashing = sp_runtime::traits::BlakeTwo256;
|
||||
type AccountId = sp_runtime::AccountId32;
|
||||
type Lookup = sp_runtime::traits::AccountIdLookup<Self::AccountId, ()>;
|
||||
type MaxConsumers = frame_support::traits::ConstU32<128>;
|
||||
type AccountData = crate::AccountInfo<Self::Nonce, ()>;
|
||||
type OnNewAccount = ();
|
||||
type OnKilledAccount = ();
|
||||
type SystemWeightInfo = ();
|
||||
type SS58Prefix = ();
|
||||
type Version = ();
|
||||
type BlockWeights = ();
|
||||
type BlockLength = ();
|
||||
type DbWeight = ();
|
||||
#[inject_runtime_type]
|
||||
type RuntimeEvent = ();
|
||||
#[inject_runtime_type]
|
||||
type RuntimeOrigin = ();
|
||||
#[inject_runtime_type]
|
||||
type RuntimeCall = ();
|
||||
#[inject_runtime_type]
|
||||
type PalletInfo = ();
|
||||
type BaseCallFilter = frame_support::traits::Everything;
|
||||
type BlockHashCount = frame_support::traits::ConstU32<256>;
|
||||
type OnSetCode = ();
|
||||
}
|
||||
}
|
||||
|
||||
/// System configuration trait. Implemented by runtime.
|
||||
@@ -1817,4 +1864,11 @@ pub mod pallet_prelude {
|
||||
|
||||
/// Type alias for the `BlockNumber` associated type of system config.
|
||||
pub type BlockNumberFor<T> = <HeaderFor<T> as sp_runtime::traits::Header>::Number;
|
||||
|
||||
/// Type alias for the `Extrinsic` associated type of system config.
|
||||
pub type ExtrinsicFor<T> =
|
||||
<<T as crate::Config>::Block as sp_runtime::traits::Block>::Extrinsic;
|
||||
|
||||
/// Type alias for the `RuntimeCall` associated type of system config.
|
||||
pub type RuntimeCallFor<T> = <T as crate::Config>::RuntimeCall;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
//!
|
||||
//! See the [`pallet`] module for more information about the interfaces this pallet exposes,
|
||||
//! including its configuration trait, dispatchables, storage items, events and errors.
|
||||
//!
|
||||
//!
|
||||
//! ## Overview
|
||||
//!
|
||||
//! The Timestamp pallet is designed to create a consensus-based time source. This helps ensure that
|
||||
@@ -144,12 +144,33 @@ pub use pallet::*;
|
||||
#[frame_support::pallet]
|
||||
pub mod pallet {
|
||||
use super::*;
|
||||
use frame_support::pallet_prelude::*;
|
||||
use frame_support::{derive_impl, pallet_prelude::*};
|
||||
use frame_system::pallet_prelude::*;
|
||||
|
||||
#[pallet::config]
|
||||
/// Default preludes for [`Config`].
|
||||
pub mod config_preludes {
|
||||
use super::*;
|
||||
|
||||
/// Default prelude sensible to be used in a testing environment.
|
||||
pub struct TestDefaultConfig;
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
|
||||
impl frame_system::DefaultConfig for TestDefaultConfig {}
|
||||
|
||||
#[frame_support::register_default_impl(TestDefaultConfig)]
|
||||
impl DefaultConfig for TestDefaultConfig {
|
||||
type Moment = u64;
|
||||
type OnTimestampSet = ();
|
||||
type MinimumPeriod = frame_support::traits::ConstU64<1>;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
}
|
||||
|
||||
/// The pallet configuration trait
|
||||
#[pallet::config(with_default)]
|
||||
pub trait Config: frame_system::Config {
|
||||
/// Type used for expressing a timestamp.
|
||||
#[pallet::no_default_bounds]
|
||||
type Moment: Parameter
|
||||
+ Default
|
||||
+ AtLeast32Bit
|
||||
|
||||
@@ -319,9 +319,29 @@ pub mod pallet {
|
||||
#[pallet::pallet]
|
||||
pub struct Pallet<T>(_);
|
||||
|
||||
#[pallet::config]
|
||||
pub mod config_preludes {
|
||||
use super::*;
|
||||
use frame_support::derive_impl;
|
||||
|
||||
/// Default prelude sensible to be used in a testing environment.
|
||||
pub struct TestDefaultConfig;
|
||||
|
||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)]
|
||||
impl frame_system::DefaultConfig for TestDefaultConfig {}
|
||||
|
||||
#[frame_support::register_default_impl(TestDefaultConfig)]
|
||||
impl DefaultConfig for TestDefaultConfig {
|
||||
#[inject_runtime_type]
|
||||
type RuntimeEvent = ();
|
||||
type FeeMultiplierUpdate = ();
|
||||
type OperationalFeeMultiplier = ();
|
||||
}
|
||||
}
|
||||
|
||||
#[pallet::config(with_default)]
|
||||
pub trait Config: frame_system::Config {
|
||||
/// The overarching event type.
|
||||
#[pallet::no_default_bounds]
|
||||
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
|
||||
|
||||
/// Handler for withdrawing, refunding and depositing the transaction fee.
|
||||
@@ -330,12 +350,24 @@ pub mod pallet {
|
||||
/// adjusted, depending on the used resources by the transaction. If the
|
||||
/// transaction weight is lower than expected, parts of the transaction fee
|
||||
/// might be refunded. In the end the fees can be deposited.
|
||||
#[pallet::no_default]
|
||||
type OnChargeTransaction: OnChargeTransaction<Self>;
|
||||
|
||||
/// A fee mulitplier for `Operational` extrinsics to compute "virtual tip" to boost their
|
||||
/// Convert a weight value into a deductible fee based on the currency type.
|
||||
#[pallet::no_default]
|
||||
type WeightToFee: WeightToFee<Balance = BalanceOf<Self>>;
|
||||
|
||||
/// Convert a length value into a deductible fee based on the currency type.
|
||||
#[pallet::no_default]
|
||||
type LengthToFee: WeightToFee<Balance = BalanceOf<Self>>;
|
||||
|
||||
/// Update the multiplier of the next block, based on the previous block's weight.
|
||||
type FeeMultiplierUpdate: MultiplierUpdate;
|
||||
|
||||
/// A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their
|
||||
/// `priority`
|
||||
///
|
||||
/// This value is multipled by the `final_fee` to obtain a "virtual tip" that is later
|
||||
/// This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later
|
||||
/// added to a tip component in regular `priority` calculations.
|
||||
/// It means that a `Normal` transaction can front-run a similarly-sized `Operational`
|
||||
/// extrinsic (with no tip), by including a tip value greater than the virtual tip.
|
||||
@@ -355,15 +387,6 @@ pub mod pallet {
|
||||
/// transactions.
|
||||
#[pallet::constant]
|
||||
type OperationalFeeMultiplier: Get<u8>;
|
||||
|
||||
/// Convert a weight value into a deductible fee based on the currency type.
|
||||
type WeightToFee: WeightToFee<Balance = BalanceOf<Self>>;
|
||||
|
||||
/// Convert a length value into a deductible fee based on the currency type.
|
||||
type LengthToFee: WeightToFee<Balance = BalanceOf<Self>>;
|
||||
|
||||
/// Update the multiplier of the next block, based on the previous block's weight.
|
||||
type FeeMultiplierUpdate: MultiplierUpdate;
|
||||
}
|
||||
|
||||
#[pallet::type_value]
|
||||
|
||||
@@ -15,21 +15,16 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use crate::common::API_VERSION_ATTRIBUTE;
|
||||
use inflector::Inflector;
|
||||
use proc_macro2::{Span, TokenStream};
|
||||
|
||||
use proc_macro_crate::{crate_name, FoundCrate};
|
||||
use quote::{format_ident, quote, ToTokens};
|
||||
use syn::{
|
||||
parse_quote, spanned::Spanned, token::And, Attribute, Error, FnArg, GenericArgument, Ident,
|
||||
ImplItem, ItemImpl, Pat, Path, PathArguments, Result, ReturnType, Signature, Type, TypePath,
|
||||
};
|
||||
|
||||
use quote::{format_ident, quote};
|
||||
|
||||
use proc_macro_crate::{crate_name, FoundCrate};
|
||||
|
||||
use crate::common::API_VERSION_ATTRIBUTE;
|
||||
|
||||
use inflector::Inflector;
|
||||
|
||||
/// Generates the access to the `sc_client` crate.
|
||||
pub fn generate_crate_access() -> TokenStream {
|
||||
match crate_name("sp-api") {
|
||||
@@ -38,10 +33,15 @@ pub fn generate_crate_access() -> TokenStream {
|
||||
let renamed_name = Ident::new(&renamed_name, Span::call_site());
|
||||
quote!(#renamed_name)
|
||||
},
|
||||
Err(e) => {
|
||||
let err = Error::new(Span::call_site(), e).to_compile_error();
|
||||
quote!( #err )
|
||||
},
|
||||
Err(e) =>
|
||||
if let Ok(FoundCrate::Name(name)) = crate_name(&"frame") {
|
||||
let path = format!("{}::deps::{}", name, "sp_api");
|
||||
let path = syn::parse_str::<syn::Path>(&path).expect("is a valid path; qed");
|
||||
quote!( #path )
|
||||
} else {
|
||||
let err = Error::new(Span::call_site(), e).to_compile_error();
|
||||
quote!( #err )
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,8 +261,6 @@ pub fn versioned_trait_name(trait_ident: &Ident, version: u64) -> Ident {
|
||||
/// Extract the documentation from the provided attributes.
|
||||
#[cfg(feature = "frame-metadata")]
|
||||
pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec<syn::Lit> {
|
||||
use quote::ToTokens;
|
||||
|
||||
attrs
|
||||
.iter()
|
||||
.filter_map(|attr| {
|
||||
|
||||
@@ -942,8 +942,7 @@ pub trait Pair: CryptoType + Sized {
|
||||
/// - the path may be followed by `///`, in which case everything after the `///` is treated
|
||||
/// as a password.
|
||||
/// - If `s` begins with a `/` character it is prefixed with the Substrate public `DEV_PHRASE`
|
||||
/// and
|
||||
/// interpreted as above.
|
||||
/// and interpreted as above.
|
||||
///
|
||||
/// In this case they are interpreted as HDKD junctions; purely numeric items are interpreted as
|
||||
/// integers, non-numeric items as strings. Junctions prefixed with `/` are interpreted as soft
|
||||
|
||||
@@ -35,6 +35,12 @@ pub enum Keyring {
|
||||
Dave,
|
||||
Eve,
|
||||
Ferdie,
|
||||
AliceStash,
|
||||
BobStash,
|
||||
CharlieStash,
|
||||
DaveStash,
|
||||
EveStash,
|
||||
FerdieStash,
|
||||
One,
|
||||
Two,
|
||||
}
|
||||
@@ -104,6 +110,12 @@ impl From<Keyring> for &'static str {
|
||||
Keyring::Dave => "Dave",
|
||||
Keyring::Eve => "Eve",
|
||||
Keyring::Ferdie => "Ferdie",
|
||||
Keyring::AliceStash => "Alice//stash",
|
||||
Keyring::BobStash => "Bob//stash",
|
||||
Keyring::CharlieStash => "Charlie//stash",
|
||||
Keyring::DaveStash => "Dave//stash",
|
||||
Keyring::EveStash => "Eve//stash",
|
||||
Keyring::FerdieStash => "Ferdie//stash",
|
||||
Keyring::One => "One",
|
||||
Keyring::Two => "Two",
|
||||
}
|
||||
|
||||
@@ -27,9 +27,8 @@ pub mod ed25519;
|
||||
#[cfg(feature = "bandersnatch-experimental")]
|
||||
pub mod bandersnatch;
|
||||
|
||||
/// Convenience export: Sr25519's Keyring is exposed as `AccountKeyring`,
|
||||
/// since it tends to be used for accounts (although it may also be used
|
||||
/// by authorities).
|
||||
/// Convenience export: Sr25519's Keyring is exposed as `AccountKeyring`, since it tends to be
|
||||
/// used for accounts (although it may also be used by authorities).
|
||||
pub use sr25519::Keyring as AccountKeyring;
|
||||
|
||||
#[cfg(feature = "bandersnatch-experimental")]
|
||||
|
||||
@@ -35,6 +35,12 @@ pub enum Keyring {
|
||||
Dave,
|
||||
Eve,
|
||||
Ferdie,
|
||||
AliceStash,
|
||||
BobStash,
|
||||
CharlieStash,
|
||||
DaveStash,
|
||||
EveStash,
|
||||
FerdieStash,
|
||||
One,
|
||||
Two,
|
||||
}
|
||||
@@ -114,6 +120,12 @@ impl From<Keyring> for &'static str {
|
||||
Keyring::Dave => "Dave",
|
||||
Keyring::Eve => "Eve",
|
||||
Keyring::Ferdie => "Ferdie",
|
||||
Keyring::AliceStash => "Alice//stash",
|
||||
Keyring::BobStash => "Bob//stash",
|
||||
Keyring::CharlieStash => "Charlie//stash",
|
||||
Keyring::DaveStash => "Dave//stash",
|
||||
Keyring::EveStash => "Eve//stash",
|
||||
Keyring::FerdieStash => "Ferdie//stash",
|
||||
Keyring::One => "One",
|
||||
Keyring::Two => "Two",
|
||||
}
|
||||
|
||||
@@ -134,16 +134,16 @@ impl<Address: TypeInfo, Call: TypeInfo, Signature: TypeInfo, Extra: SignedExtens
|
||||
}
|
||||
}
|
||||
|
||||
impl<Address, AccountId, Call, Signature, Extra, Lookup> Checkable<Lookup>
|
||||
for UncheckedExtrinsic<Address, Call, Signature, Extra>
|
||||
impl<LookupSource, AccountId, Call, Signature, Extra, Lookup> Checkable<Lookup>
|
||||
for UncheckedExtrinsic<LookupSource, Call, Signature, Extra>
|
||||
where
|
||||
Address: Member + MaybeDisplay,
|
||||
LookupSource: Member + MaybeDisplay,
|
||||
Call: Encode + Member,
|
||||
Signature: Member + traits::Verify,
|
||||
<Signature as traits::Verify>::Signer: IdentifyAccount<AccountId = AccountId>,
|
||||
Extra: SignedExtension<AccountId = AccountId>,
|
||||
AccountId: Member + MaybeDisplay,
|
||||
Lookup: traits::Lookup<Source = Address, Target = AccountId>,
|
||||
Lookup: traits::Lookup<Source = LookupSource, Target = AccountId>,
|
||||
{
|
||||
type Checked = CheckedExtrinsic<AccountId, Call, Extra>;
|
||||
|
||||
|
||||
@@ -466,7 +466,7 @@ impl Verify for MultiSignature {
|
||||
}
|
||||
|
||||
/// Signature verify that can work with any known signature types..
|
||||
#[derive(Eq, PartialEq, Clone, Default, Encode, Decode, RuntimeDebug)]
|
||||
#[derive(Eq, PartialEq, Clone, Default, Encode, Decode, RuntimeDebug, TypeInfo)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
pub struct AnySignature(H512);
|
||||
|
||||
|
||||
@@ -226,7 +226,7 @@ pub trait StaticLookup {
|
||||
}
|
||||
|
||||
/// A lookup implementation returning the input value.
|
||||
#[derive(Default)]
|
||||
#[derive(Default, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct IdentityLookup<T>(PhantomData<T>);
|
||||
impl<T: Codec + Clone + PartialEq + Debug + TypeInfo> StaticLookup for IdentityLookup<T> {
|
||||
type Source = T;
|
||||
@@ -1666,8 +1666,6 @@ impl<AccountId, Call: Dispatchable> SignedExtension for Tuple {
|
||||
}
|
||||
}
|
||||
|
||||
/// Only for bare bone testing when you don't care about signed extensions at all.
|
||||
#[cfg(feature = "std")]
|
||||
impl SignedExtension for () {
|
||||
type AccountId = u64;
|
||||
type AdditionalSigned = ();
|
||||
|
||||
@@ -26,28 +26,12 @@ use sp_api::ProvideRuntimeApi;
|
||||
#[cfg(feature = "std")]
|
||||
use sp_runtime::traits::Block as BlockT;
|
||||
|
||||
use sp_core::{crypto::KeyTypeId, RuntimeDebug};
|
||||
use sp_core::RuntimeDebug;
|
||||
use sp_staking::SessionIndex;
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
sp_api::decl_runtime_apis! {
|
||||
/// Session keys runtime api.
|
||||
pub trait SessionKeys {
|
||||
/// Generate a set of session keys with optionally using the given seed.
|
||||
/// The keys should be stored within the keystore exposed via runtime
|
||||
/// externalities.
|
||||
///
|
||||
/// The seed needs to be a valid `utf8` string.
|
||||
///
|
||||
/// Returns the concatenated SCALE encoded public keys.
|
||||
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8>;
|
||||
|
||||
/// Decode the given public session keys.
|
||||
///
|
||||
/// Returns the list of public raw public keys + key type.
|
||||
fn decode_session_keys(encoded: Vec<u8>) -> Option<Vec<(Vec<u8>, KeyTypeId)>>;
|
||||
}
|
||||
}
|
||||
pub mod runtime_api;
|
||||
pub use runtime_api::*;
|
||||
|
||||
/// Number of validators in a given session.
|
||||
pub type ValidatorCount = u32;
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// 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.
|
||||
|
||||
pub use sp_core::crypto::KeyTypeId;
|
||||
use sp_std::prelude::*;
|
||||
|
||||
sp_api::decl_runtime_apis! {
|
||||
/// Session keys runtime api.
|
||||
pub trait SessionKeys {
|
||||
/// Generate a set of session keys with optionally using the given seed.
|
||||
/// The keys should be stored within the keystore exposed via runtime
|
||||
/// externalities.
|
||||
///
|
||||
/// The seed needs to be a valid `utf8` string.
|
||||
///
|
||||
/// Returns the concatenated SCALE encoded public keys.
|
||||
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8>;
|
||||
|
||||
/// Decode the given public session keys.
|
||||
///
|
||||
/// Returns the list of public raw public keys + key type.
|
||||
fn decode_session_keys(encoded: Vec<u8>) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>>;
|
||||
}
|
||||
}
|
||||
@@ -248,7 +248,25 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Implementor of [`WeightToFee`] such that it maps any unit of weight to a fixed fee.
|
||||
pub struct FixedFee<const F: u32, T>(sp_std::marker::PhantomData<T>);
|
||||
|
||||
impl<const F: u32, T> WeightToFee for FixedFee<F, T>
|
||||
where
|
||||
T: BaseArithmetic + From<u32> + Copy + Unsigned,
|
||||
{
|
||||
type Balance = T;
|
||||
|
||||
fn weight_to_fee(_: &Weight) -> Self::Balance {
|
||||
F.into()
|
||||
}
|
||||
}
|
||||
|
||||
/// An implementation of [`WeightToFee`] that collects no fee.
|
||||
pub type NoFee<T> = FixedFee<0, T>;
|
||||
|
||||
/// Implementor of [`WeightToFee`] that uses a constant multiplier.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
|
||||
+25
-84
@@ -55,9 +55,22 @@
|
||||
//! is merely a matter of the Wasm blob being changed in the chain state, which is, in principle,
|
||||
//! same as updating an account's balance.
|
||||
//!
|
||||
//! To learn more about the substrate architecture using some visuals, see [`substrate_diagram`].
|
||||
//! ### Architecture
|
||||
//!
|
||||
//! `FRAME`, Substrate's default runtime development library takes the above even further by
|
||||
//! Therefore, Substrate can be visualized as follows:
|
||||
#![doc = simple_mermaid::mermaid!("../../docs/mermaid/substrate_simple.mmd")]
|
||||
//!
|
||||
//! The client and the runtime of course need to communicate. This is done through two concepts:
|
||||
//!
|
||||
//! 1. Host functions: a way for the (Wasm) runtime to talk to the client. All host functions are
|
||||
//! defined in [`sp-io`]. For example, [`sp-io::storage`] are the set of host functions that
|
||||
//! allow the runtime to read and write data to the on-chain state.
|
||||
//! 2. Runtime APIs: a way for the client to talk to the Wasm runtime. Runtime APIs are defined
|
||||
//! using macros and utilities in [`sp-api`]. For example, [`sp-api::Core`] is the most basic
|
||||
//! runtime API that any blockchain must implement in order to be able to (re) execute blocks.
|
||||
#![doc = simple_mermaid::mermaid!("../../docs/mermaid/substrate_client_runtime.mmd")]
|
||||
//!
|
||||
//! [`FRAME`], Substrate's default runtime development library takes the above even further by
|
||||
//! embracing a declarative programming model whereby correctness is enhanced and the system is
|
||||
//! highly configurable through parameterization.
|
||||
//!
|
||||
@@ -68,8 +81,8 @@
|
||||
//! ## How to Get Stared
|
||||
//!
|
||||
//! Most developers want to leave the client side code as-is, and focus on the runtime. To do so,
|
||||
//! look into the [`frame_support`] crate, which is the entry point crate into runtime development
|
||||
//! with FRAME.
|
||||
//! look into the [`frame`] crate, which is the entry point crate into runtime development with
|
||||
//! FRAME.
|
||||
//!
|
||||
//! > Side note, it is entirely possible to craft a substrate-based runtime without FRAME, an
|
||||
//! > example of which can be found [here](https://github.com/JoshOrndorff/frameless-node-template).
|
||||
@@ -79,8 +92,8 @@
|
||||
//! * **Templates**: A number of substrate-based templates exist and they can be used for various
|
||||
//! purposes, with zero to little additional code needed. All of these templates contain runtimes
|
||||
//! that are highly configurable and are likely suitable for basic needs.
|
||||
//! * `FRAME`: If need, one can customize that runtime even further, by using `FRAME` and developing
|
||||
//! custom modules.
|
||||
//! * [`FRAME`]: If need, one can customize that runtime even further, by using `FRAME` and
|
||||
//! developing custom modules.
|
||||
//! * **Core**: To the contrary, some developers may want to customize the client side software to
|
||||
//! achieve novel goals such as a new consensus engine, or a new database backend. While
|
||||
//! Substrate's main configurability is in the runtime, the client is also highly generic and can
|
||||
@@ -100,10 +113,9 @@
|
||||
//! * `sp-*` (short for *substrate-primitives*) crates, located under `./primitives` folder. These
|
||||
//! are the traits that glue the client and runtime together, but are not opinionated about what
|
||||
//! framework is using for building the runtime. Notable examples are [`sp-api`] and [`sp-io`],
|
||||
//! which form the communication bridge between the client and runtime, as explained in
|
||||
//! [`substrate_diagram`].
|
||||
//! which form the communication bridge between the client and runtime.
|
||||
//! * `pallet-*` and `frame-*` crates, located under `./frame` folder. These are the crates related
|
||||
//! to FRAME. See [`frame_support`] for more information.
|
||||
//! to FRAME. See [`frame`] for more information.
|
||||
//!
|
||||
//! ### Wasm Build
|
||||
//!
|
||||
@@ -157,8 +169,9 @@
|
||||
//! through which Polkadot can be utilized is by building "parachains", blockchains that are
|
||||
//! connected to Polkadot's shared security.
|
||||
//!
|
||||
//! To build a parachain, one could use [`Cumulus`](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus), the
|
||||
//! library on top of Substrate, empowering any substrate-based chain to be a Polkadot parachain.
|
||||
//! To build a parachain, one could use
|
||||
//! [`Cumulus`](https://github.com/paritytech/polkadot-sdk/tree/master/cumulus), the library on top
|
||||
//! of Substrate, empowering any substrate-based chain to be a Polkadot parachain.
|
||||
//!
|
||||
//! ## Where To Go Next?
|
||||
//!
|
||||
@@ -199,6 +212,7 @@
|
||||
//! https://img.shields.io/badge/polkadot-E6007A?style=for-the-badge&logo=polkadot&logoColor=white
|
||||
//! [github]:
|
||||
//! https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github
|
||||
//! [`FRAME`]: ../frame/index.html
|
||||
//! [`sp-io`]: ../sp_io/index.html
|
||||
//! [`sp-api`]: ../sp_api/index.html
|
||||
//! [`sp-api`]: ../sp_api/index.html
|
||||
@@ -222,76 +236,3 @@
|
||||
|
||||
#![deny(rustdoc::broken_intra_doc_links)]
|
||||
#![deny(rustdoc::private_intra_doc_links)]
|
||||
|
||||
#[cfg_attr(doc, aquamarine::aquamarine)]
|
||||
/// In this module, we explore substrate at a more depth. First, let's establish substrate being
|
||||
/// divided into a client and runtime.
|
||||
///
|
||||
/// ```mermaid
|
||||
/// graph TB
|
||||
/// subgraph Substrate
|
||||
/// direction LR
|
||||
/// subgraph Client
|
||||
/// end
|
||||
/// subgraph Runtime
|
||||
/// end
|
||||
/// end
|
||||
/// ```
|
||||
///
|
||||
/// The client and the runtime of course need to communicate. This is done through two concepts:
|
||||
///
|
||||
/// 1. Host functions: a way for the (Wasm) runtime to talk to the client. All host functions are
|
||||
/// defined in [`sp-io`]. For example, [`sp-io::storage`] are the set of host functions that
|
||||
/// allow the runtime to read and write data to the on-chain state.
|
||||
/// 2. Runtime APIs: a way for the client to talk to the Wasm runtime. Runtime APIs are defined
|
||||
/// using macros and utilities in [`sp-api`]. For example, [`sp-api::Core`] is the most basic
|
||||
/// runtime API that any blockchain must implement in order to be able to (re) execute blocks.
|
||||
///
|
||||
/// ```mermaid
|
||||
/// graph TB
|
||||
/// subgraph Substrate
|
||||
/// direction LR
|
||||
/// subgraph Client
|
||||
/// end
|
||||
/// subgraph Runtime
|
||||
/// end
|
||||
/// Client --runtime-api--> Runtime
|
||||
/// Runtime --host-functions--> Client
|
||||
/// end
|
||||
/// ```
|
||||
///
|
||||
/// Finally, let's expand the diagram a bit further and look at the internals of each component:
|
||||
///
|
||||
/// ```mermaid
|
||||
/// graph TB
|
||||
/// subgraph Substrate
|
||||
/// direction LR
|
||||
/// subgraph Client
|
||||
/// Database
|
||||
/// Networking
|
||||
/// Consensus
|
||||
/// end
|
||||
/// subgraph Runtime
|
||||
/// subgraph FRAME
|
||||
/// direction LR
|
||||
/// Governance
|
||||
/// Currency
|
||||
/// Staking
|
||||
/// Identity
|
||||
/// end
|
||||
/// end
|
||||
/// Client --runtime-api--> Runtime
|
||||
/// Runtime --host-functions--> Client
|
||||
/// end
|
||||
/// ```
|
||||
///
|
||||
/// As noted the runtime contains all of the application specific logic of the blockchain. This is
|
||||
/// usually written with `FRAME`. The client, on the other hand, contains reusable and generic
|
||||
/// components that are not specific to one single blockchain, such as networking, database, and the
|
||||
/// consensus engine.
|
||||
///
|
||||
/// [`sp-io`]: ../../sp_io/index.html
|
||||
/// [`sp-api`]: ../../sp_api/index.html
|
||||
/// [`sp-io::storage`]: ../../sp_io/storage/index.html
|
||||
/// [`sp-api::Core`]: ../../sp_api/trait.Core.html
|
||||
pub mod substrate_diagram {}
|
||||
|
||||
Reference in New Issue
Block a user