Upgrade to v2.0.0-rc5 (#65)
parent
f8924ad3e0
commit
3718adb0bc
File diff suppressed because it is too large
Load Diff
136
README.md
136
README.md
|
@ -1,79 +1,147 @@
|
|||
[![Try on playground](https://img.shields.io/badge/Playground-node_template-brightgreen?logo=Parity%20Substrate)](https://playground-staging.substrate.dev/?deploy=node-template)
|
||||
|
||||
# Substrate Node Template
|
||||
|
||||
A new FRAME-based Substrate node, ready for hacking :rocket:
|
||||
|
||||
## Local Development
|
||||
|
||||
Follow these steps to prepare your local environment for Substrate development :hammer_and_wrench:
|
||||
Follow these steps to prepare a local Substrate development environment :hammer_and_wrench:
|
||||
|
||||
### Simple Method
|
||||
### Simple Setup
|
||||
|
||||
You can install all the required dependencies with a single command (be patient, this can take up
|
||||
to 30 minutes).
|
||||
Install all the required dependencies with a single command (be patient, this can take up to 30
|
||||
minutes).
|
||||
|
||||
```bash
|
||||
curl https://getsubstrate.io -sSf | bash -s -- --fast
|
||||
```
|
||||
|
||||
### Manual Method
|
||||
### Manual Setup
|
||||
|
||||
Manual steps for Linux-based systems can be found below; you can
|
||||
[find more information at substrate.dev](https://substrate.dev/docs/en/knowledgebase/getting-started/#manual-installation).
|
||||
|
||||
Install Rust:
|
||||
|
||||
```bash
|
||||
curl https://sh.rustup.rs -sSf | sh
|
||||
```
|
||||
|
||||
Initialize your Wasm Build environment:
|
||||
|
||||
```bash
|
||||
./scripts/init.sh
|
||||
```
|
||||
Find manual setup instructions at the
|
||||
[Substrate Developer Hub](https://substrate.dev/docs/en/knowledgebase/getting-started/#manual-installation).
|
||||
|
||||
### Build
|
||||
|
||||
Once you have prepared your local development environment, you can build the node template. Use this
|
||||
command to build the [Wasm](https://substrate.dev/docs/en/knowledgebase/advanced/executor#wasm-execution)
|
||||
and [native](https://substrate.dev/docs/en/knowledgebase/advanced/executor#native-execution) code:
|
||||
Once the development environment is set up, build the node template. This command will build the
|
||||
[Wasm](https://substrate.dev/docs/en/knowledgebase/advanced/executor#wasm-execution) and
|
||||
[native](https://substrate.dev/docs/en/knowledgebase/advanced/executor#native-execution) code:
|
||||
|
||||
```bash
|
||||
cargo build --release
|
||||
```
|
||||
|
||||
## Playground [![Try on playground](https://img.shields.io/badge/Playground-node_template-brightgreen?logo=Parity%20Substrate)](https://playground-staging.substrate.dev/?deploy=node-template)
|
||||
|
||||
[The Substrate Playground](https://playground-staging.substrate.dev/?deploy=node-template) is an
|
||||
online development environment that allows you to take advantage of a pre-configured container
|
||||
with pre-compiled build artifacts :woman_cartwheeling:
|
||||
|
||||
## Run
|
||||
|
||||
### Single Node Development Chain
|
||||
|
||||
Purge any existing developer chain state:
|
||||
Purge any existing dev chain state:
|
||||
|
||||
```bash
|
||||
./target/release/node-template purge-chain --dev
|
||||
```
|
||||
|
||||
Start a development chain with:
|
||||
Start a dev chain:
|
||||
|
||||
```bash
|
||||
./target/release/node-template --dev
|
||||
```
|
||||
|
||||
Detailed logs may be shown by running the node with the following environment variables set:
|
||||
`RUST_LOG=debug RUST_BACKTRACE=1 cargo run -- --dev`.
|
||||
Or, start a dev chain with detailed logging:
|
||||
|
||||
```bash
|
||||
RUST_LOG=debug RUST_BACKTRACE=1 ./target/release/node-template -lruntime=debug --dev
|
||||
```
|
||||
|
||||
### Multi-Node Local Testnet
|
||||
|
||||
If you want to see the multi-node consensus algorithm in action, refer to
|
||||
[our Start a Private Network tutorial](https://substrate.dev/docs/en/tutorials/start-a-private-network/).
|
||||
|
||||
## Template Structure
|
||||
|
||||
A Substrate project such as this consists of a number of components that are spread across a few
|
||||
directories.
|
||||
|
||||
### Node
|
||||
|
||||
A blockchain node is an application that allows users to participate in a blockchain network.
|
||||
Substrate-based blockchain nodes expose a number of capabilities:
|
||||
|
||||
- Networking: Substrate nodes use the [`libp2p`](https://libp2p.io/) networking stack to allow the
|
||||
nodes in the network to communicate with one another.
|
||||
- Consensus: Blockchains must have a way to come to
|
||||
[consensus](https://substrate.dev/docs/en/knowledgebase/advanced/consensus) on the state of the
|
||||
network. Substrate makes it possible to supply custom consensus engines and also ships with
|
||||
several consensus mechanisms that have been built on top of Web3 Foundation research.
|
||||
- RPC Server: A remote procedure call (RPC) server is used to interact with Substrate nodes.
|
||||
|
||||
There are several files in the `node` directory - take special note of the following:
|
||||
|
||||
- [`chain_spec.rs`](./node/src/chain_spec.rs): A
|
||||
[chain specification](https://substrate.dev/docs/en/knowledgebase/integrate/chain-spec) is a
|
||||
source code file that defines a Substrate chain's initial (genesis) state. Chain specifications
|
||||
are useful for development and testing, and critical when architecting the launch of a
|
||||
production chain. Take note of the `development_config` and `testnet_genesis` functions, which
|
||||
are used to define the genesis state for the local development chain configuration. These
|
||||
functions identify some
|
||||
[well-known accounts](https://substrate.dev/docs/en/knowledgebase/integrate/subkey#well-known-keys)
|
||||
and use them to configure the blockchain's initial state.
|
||||
- [`service.rs`](./node/src/service.rs): This file defines the node implementation. Take note of
|
||||
the libraries that this file imports and the names of the functions it invokes. In particular,
|
||||
there are references to consensus-related topics, such as the
|
||||
[longest chain rule](https://substrate.dev/docs/en/knowledgebase/advanced/consensus#longest-chain-rule),
|
||||
the [Aura](https://substrate.dev/docs/en/knowledgebase/advanced/consensus#aura) block authoring
|
||||
mechanism and the
|
||||
[GRANDPA](https://substrate.dev/docs/en/knowledgebase/advanced/consensus#grandpa) finality
|
||||
gadget.
|
||||
|
||||
After the node has been [built](#build), refer to the embedded documentation to learn more about the
|
||||
capabilities and configuration parameters that it exposes:
|
||||
|
||||
```shell
|
||||
./target/release/node-template --help
|
||||
```
|
||||
|
||||
### Runtime
|
||||
|
||||
The Substrate project in this repository uses the
|
||||
[FRAME](https://substrate.dev/docs/en/knowledgebase/runtime/frame) framework to construct a
|
||||
blockchain runtime. FRAME allows runtime developers to declare domain-specific logic in modules
|
||||
called "pallets". At the heart of FRAME is a helpful
|
||||
[macro language](https://substrate.dev/docs/en/knowledgebase/runtime/macros) that makes it easy to
|
||||
create pallets and flexibly compose them to create blockchains that can address a variety of needs.
|
||||
|
||||
Review the [FRAME runtime implementation](./runtime/src/lib.rs) included in this template and note
|
||||
the following:
|
||||
|
||||
- This file configures several pallets to include in the runtime. Each pallet configuration is
|
||||
defined by a code block that begins with `impl $PALLET_NAME::Trait for Runtime`.
|
||||
- The pallets are composed into a single runtime by way of the
|
||||
[`construct_runtime!`](https://crates.parity.io/frame_support/macro.construct_runtime.html)
|
||||
macro, which is part of the core
|
||||
[FRAME Support](https://substrate.dev/docs/en/knowledgebase/runtime/frame#support-library)
|
||||
library.
|
||||
|
||||
### Pallets
|
||||
|
||||
The runtime in this project is constructed using many FRAME pallets that ship with the
|
||||
[core Substrate repository](https://github.com/paritytech/substrate/tree/master/frame) and a
|
||||
template pallet that is [defined in the `pallets`](./pallets/template/src/lib.rs) directory.
|
||||
|
||||
A FRAME pallet is compromised of a number of blockchain primitives:
|
||||
|
||||
- Storage: FRAME defines a rich set of powerful
|
||||
[storage abstractions](https://substrate.dev/docs/en/knowledgebase/runtime/storage) that makes
|
||||
it easy to use Substrate's efficient key-value database to manage the evolving state of a
|
||||
blockchain.
|
||||
- Dispatchables: FRAME pallets define special types of functions that can be invoked (dispatched)
|
||||
from outside of the runtime in order to update its state.
|
||||
- Events: Substrate uses [events](https://substrate.dev/docs/en/knowledgebase/runtime/events) to
|
||||
notify users of important changes in the runtime.
|
||||
- Errors: When a dispatchable fails, it returns an error.
|
||||
- Trait: The `Trait` configuration interface is used to define the types and parameters upon which
|
||||
a FRAME pallet depends.
|
||||
|
||||
### Run in Docker
|
||||
|
||||
First, install [Docker](https://docs.docker.com/get-docker/) and
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
[package]
|
||||
authors = ['Substrate DevHub <https://github.com/substrate-developer-hub>']
|
||||
build = 'build.rs'
|
||||
description = 'Substrate Node template'
|
||||
description = 'A fresh FRAME-based Substrate node, ready for hacking.'
|
||||
edition = '2018'
|
||||
homepage = 'https://substrate.dev'
|
||||
license = 'Unlicense'
|
||||
name = 'node-template'
|
||||
repository = 'https://github.com/substrate-developer-hub/substrate-node-template/'
|
||||
version = '2.0.0-rc4'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ['x86_64-unknown-linux-gnu']
|
||||
|
||||
|
@ -22,96 +23,97 @@ structopt = '0.3.8'
|
|||
|
||||
[dependencies.node-template-runtime]
|
||||
path = '../runtime'
|
||||
version = '2.0.0-rc4'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sc-basic-authorship]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-cli]
|
||||
features = ['wasmtime']
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-client-api]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sc-consensus]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-consensus-aura]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-executor]
|
||||
features = ['wasmtime']
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-finality-grandpa]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-network]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-service]
|
||||
features = ['wasmtime']
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sc-transaction-pool]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-consensus]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sp-consensus-aura]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sp-core]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-finality-grandpa]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-inherents]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-runtime]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-transaction-pool]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[build-dependencies.substrate-build-script-utils]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
|
|
@ -8,13 +8,13 @@ use sp_finality_grandpa::AuthorityId as GrandpaId;
|
|||
use sp_runtime::traits::{Verify, IdentifyAccount};
|
||||
use sc_service::ChainType;
|
||||
|
||||
// Note this is the URL for the telemetry server
|
||||
//const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
|
||||
// The URL for the telemetry server.
|
||||
// const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
|
||||
|
||||
/// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type.
|
||||
pub type ChainSpec = sc_service::GenericChainSpec<GenesisConfig>;
|
||||
|
||||
/// Helper function to generate a crypto pair from seed
|
||||
/// Generate a crypto pair from seed.
|
||||
pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
|
||||
TPublic::Pair::from_string(&format!("//{}", seed), None)
|
||||
.expect("static values are valid; qed")
|
||||
|
@ -23,14 +23,14 @@ pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Pu
|
|||
|
||||
type AccountPublic = <Signature as Verify>::Signer;
|
||||
|
||||
/// Helper function to generate an account ID from seed
|
||||
/// Generate an account ID from seed.
|
||||
pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId where
|
||||
AccountPublic: From<<TPublic::Pair as Pair>::Public>
|
||||
{
|
||||
AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
|
||||
}
|
||||
|
||||
/// Helper function to generate an authority key for Aura
|
||||
/// Generate an Aura authority key.
|
||||
pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) {
|
||||
(
|
||||
get_from_seed::<AuraId>(s),
|
||||
|
@ -38,16 +38,24 @@ pub fn authority_keys_from_seed(s: &str) -> (AuraId, GrandpaId) {
|
|||
)
|
||||
}
|
||||
|
||||
pub fn development_config() -> ChainSpec {
|
||||
ChainSpec::from_genesis(
|
||||
pub fn development_config() -> Result<ChainSpec, String> {
|
||||
let wasm_binary = WASM_BINARY.ok_or("Development wasm binary not available".to_string())?;
|
||||
|
||||
Ok(ChainSpec::from_genesis(
|
||||
// Name
|
||||
"Development",
|
||||
// ID
|
||||
"dev",
|
||||
ChainType::Development,
|
||||
|| testnet_genesis(
|
||||
move || testnet_genesis(
|
||||
wasm_binary,
|
||||
// Initial PoA authorities
|
||||
vec![
|
||||
authority_keys_from_seed("Alice"),
|
||||
],
|
||||
// Sudo account
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
// Pre-funded accounts
|
||||
vec![
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
get_account_id_from_seed::<sr25519::Public>("Bob"),
|
||||
|
@ -56,25 +64,38 @@ pub fn development_config() -> ChainSpec {
|
|||
],
|
||||
true,
|
||||
),
|
||||
// Bootnodes
|
||||
vec![],
|
||||
// Telemetry
|
||||
None,
|
||||
// Protocol ID
|
||||
None,
|
||||
// Properties
|
||||
None,
|
||||
// Extensions
|
||||
None,
|
||||
)
|
||||
))
|
||||
}
|
||||
|
||||
pub fn local_testnet_config() -> ChainSpec {
|
||||
ChainSpec::from_genesis(
|
||||
pub fn local_testnet_config() -> Result<ChainSpec, String> {
|
||||
let wasm_binary = WASM_BINARY.ok_or("Development wasm binary not available".to_string())?;
|
||||
|
||||
Ok(ChainSpec::from_genesis(
|
||||
// Name
|
||||
"Local Testnet",
|
||||
// ID
|
||||
"local_testnet",
|
||||
ChainType::Local,
|
||||
|| testnet_genesis(
|
||||
move || testnet_genesis(
|
||||
wasm_binary,
|
||||
// Initial PoA authorities
|
||||
vec![
|
||||
authority_keys_from_seed("Alice"),
|
||||
authority_keys_from_seed("Bob"),
|
||||
],
|
||||
// Sudo account
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
// Pre-funded accounts
|
||||
vec![
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
get_account_id_from_seed::<sr25519::Public>("Bob"),
|
||||
|
@ -91,24 +112,35 @@ pub fn local_testnet_config() -> ChainSpec {
|
|||
],
|
||||
true,
|
||||
),
|
||||
// Bootnodes
|
||||
vec![],
|
||||
// Telemetry
|
||||
None,
|
||||
// Protocol ID
|
||||
None,
|
||||
// Properties
|
||||
None,
|
||||
// Extensions
|
||||
None,
|
||||
)
|
||||
))
|
||||
}
|
||||
|
||||
fn testnet_genesis(initial_authorities: Vec<(AuraId, GrandpaId)>,
|
||||
/// Configure initial storage state for FRAME modules.
|
||||
fn testnet_genesis(
|
||||
wasm_binary: &[u8],
|
||||
initial_authorities: Vec<(AuraId, GrandpaId)>,
|
||||
root_key: AccountId,
|
||||
endowed_accounts: Vec<AccountId>,
|
||||
_enable_println: bool) -> GenesisConfig {
|
||||
_enable_println: bool,
|
||||
) -> GenesisConfig {
|
||||
GenesisConfig {
|
||||
system: Some(SystemConfig {
|
||||
code: WASM_BINARY.to_vec(),
|
||||
// Add Wasm runtime to storage.
|
||||
code: wasm_binary.to_vec(),
|
||||
changes_trie_config: Default::default(),
|
||||
}),
|
||||
balances: Some(BalancesConfig {
|
||||
// Configure endowed accounts with initial balance of 1 << 60.
|
||||
balances: endowed_accounts.iter().cloned().map(|k|(k, 1 << 60)).collect(),
|
||||
}),
|
||||
aura: Some(AuraConfig {
|
||||
|
@ -118,6 +150,7 @@ fn testnet_genesis(initial_authorities: Vec<(AuraId, GrandpaId)>,
|
|||
authorities: initial_authorities.iter().map(|x| (x.1.clone(), 1)).collect(),
|
||||
}),
|
||||
sudo: Some(SudoConfig {
|
||||
// Assign network admin rights.
|
||||
key: root_key,
|
||||
}),
|
||||
}
|
||||
|
|
|
@ -18,46 +18,48 @@
|
|||
use crate::chain_spec;
|
||||
use crate::cli::Cli;
|
||||
use crate::service;
|
||||
use sc_cli::SubstrateCli;
|
||||
use sc_cli::{SubstrateCli, RuntimeVersion, Role, ChainSpec};
|
||||
use sc_service::ServiceParams;
|
||||
use crate::service::new_full_params;
|
||||
|
||||
impl SubstrateCli for Cli {
|
||||
fn impl_name() -> &'static str {
|
||||
"Substrate Node"
|
||||
fn impl_name() -> String {
|
||||
"Substrate Node".into()
|
||||
}
|
||||
|
||||
fn impl_version() -> &'static str {
|
||||
env!("SUBSTRATE_CLI_IMPL_VERSION")
|
||||
fn impl_version() -> String {
|
||||
env!("SUBSTRATE_CLI_IMPL_VERSION").into()
|
||||
}
|
||||
|
||||
fn description() -> &'static str {
|
||||
env!("CARGO_PKG_DESCRIPTION")
|
||||
fn description() -> String {
|
||||
env!("CARGO_PKG_DESCRIPTION").into()
|
||||
}
|
||||
|
||||
fn author() -> &'static str {
|
||||
env!("CARGO_PKG_AUTHORS")
|
||||
fn author() -> String {
|
||||
env!("CARGO_PKG_AUTHORS").into()
|
||||
}
|
||||
|
||||
fn support_url() -> &'static str {
|
||||
"support.anonymous.an"
|
||||
fn support_url() -> String {
|
||||
"support.anonymous.an".into()
|
||||
}
|
||||
|
||||
fn copyright_start_year() -> i32 {
|
||||
2017
|
||||
}
|
||||
|
||||
fn executable_name() -> &'static str {
|
||||
env!("CARGO_PKG_NAME")
|
||||
}
|
||||
|
||||
fn load_spec(&self, id: &str) -> Result<Box<dyn sc_service::ChainSpec>, String> {
|
||||
Ok(match id {
|
||||
"dev" => Box::new(chain_spec::development_config()),
|
||||
"" | "local" => Box::new(chain_spec::local_testnet_config()),
|
||||
"dev" => Box::new(chain_spec::development_config()?),
|
||||
"" | "local" => Box::new(chain_spec::local_testnet_config()?),
|
||||
path => Box::new(chain_spec::ChainSpec::from_json_file(
|
||||
std::path::PathBuf::from(path),
|
||||
)?),
|
||||
})
|
||||
}
|
||||
|
||||
fn native_runtime_version(_: &Box<dyn ChainSpec>) -> &'static RuntimeVersion {
|
||||
&node_template_runtime::VERSION
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse and run command line arguments
|
||||
|
@ -67,15 +69,18 @@ pub fn run() -> sc_cli::Result<()> {
|
|||
match &cli.subcommand {
|
||||
Some(subcommand) => {
|
||||
let runner = cli.create_runner(subcommand)?;
|
||||
runner.run_subcommand(subcommand, |config| Ok(new_full_start!(config).0))
|
||||
runner.run_subcommand(subcommand, |config| {
|
||||
let (ServiceParams { client, backend, task_manager, import_queue, .. }, ..)
|
||||
= new_full_params(config)?;
|
||||
Ok((client, backend, import_queue, task_manager))
|
||||
})
|
||||
}
|
||||
None => {
|
||||
let runner = cli.create_runner(&cli.run)?;
|
||||
runner.run_node(
|
||||
service::new_light,
|
||||
service::new_full,
|
||||
node_template_runtime::VERSION
|
||||
)
|
||||
runner.run_node_until_exit(|config| match config.role {
|
||||
Role::Light => service::new_light(config),
|
||||
_ => service::new_full(config),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,10 +2,9 @@
|
|||
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
use sc_client_api::ExecutorProvider;
|
||||
use sc_consensus::LongestChain;
|
||||
use node_template_runtime::{self, opaque::Block, RuntimeApi};
|
||||
use sc_service::{error::{Error as ServiceError}, AbstractService, Configuration, ServiceBuilder};
|
||||
use sc_client_api::{ExecutorProvider, RemoteBackend};
|
||||
use node_template_runtime::{self, Block, RuntimeApi};
|
||||
use sc_service::{error::Error as ServiceError, Configuration, ServiceComponents, TaskManager};
|
||||
use sp_inherents::InherentDataProviders;
|
||||
use sc_executor::native_executor_instance;
|
||||
pub use sc_executor::NativeExecutor;
|
||||
|
@ -21,134 +20,143 @@ native_executor_instance!(
|
|||
node_template_runtime::native_version,
|
||||
);
|
||||
|
||||
/// Starts a `ServiceBuilder` for a full service.
|
||||
///
|
||||
/// Use this macro if you don't actually need the full service, but just the builder in order to
|
||||
/// be able to perform chain operations.
|
||||
macro_rules! new_full_start {
|
||||
($config:expr) => {{
|
||||
use std::sync::Arc;
|
||||
use sp_consensus_aura::sr25519::AuthorityPair as AuraPair;
|
||||
type FullClient = sc_service::TFullClient<Block, RuntimeApi, Executor>;
|
||||
type FullBackend = sc_service::TFullBackend<Block>;
|
||||
type FullSelectChain = sc_consensus::LongestChain<FullBackend, Block>;
|
||||
|
||||
let mut import_setup = None;
|
||||
let inherent_data_providers = sp_inherents::InherentDataProviders::new();
|
||||
pub fn new_full_params(config: Configuration) -> Result<(
|
||||
sc_service::ServiceParams<
|
||||
Block, FullClient,
|
||||
sc_consensus_aura::AuraImportQueue<Block, FullClient>,
|
||||
sc_transaction_pool::FullPool<Block, FullClient>,
|
||||
(), FullBackend,
|
||||
>,
|
||||
FullSelectChain,
|
||||
sp_inherents::InherentDataProviders,
|
||||
sc_finality_grandpa::GrandpaBlockImport<FullBackend, Block, FullClient, FullSelectChain>,
|
||||
sc_finality_grandpa::LinkHalf<Block, FullClient, FullSelectChain>
|
||||
), ServiceError> {
|
||||
let inherent_data_providers = sp_inherents::InherentDataProviders::new();
|
||||
|
||||
let builder = sc_service::ServiceBuilder::new_full::<
|
||||
node_template_runtime::opaque::Block,
|
||||
node_template_runtime::RuntimeApi,
|
||||
crate::service::Executor
|
||||
>($config)?
|
||||
.with_select_chain(|_config, backend| {
|
||||
Ok(sc_consensus::LongestChain::new(backend.clone()))
|
||||
})?
|
||||
.with_transaction_pool(|builder| {
|
||||
let pool_api = sc_transaction_pool::FullChainApi::new(
|
||||
builder.client().clone(),
|
||||
);
|
||||
Ok(sc_transaction_pool::BasicPool::new(
|
||||
builder.config().transaction_pool.clone(),
|
||||
std::sync::Arc::new(pool_api),
|
||||
builder.prometheus_registry(),
|
||||
))
|
||||
})?
|
||||
.with_import_queue(|
|
||||
_config,
|
||||
client,
|
||||
mut select_chain,
|
||||
_transaction_pool,
|
||||
spawn_task_handle,
|
||||
registry,
|
||||
| {
|
||||
let select_chain = select_chain.take()
|
||||
.ok_or_else(|| sc_service::Error::SelectChainRequired)?;
|
||||
let (client, backend, keystore, task_manager) =
|
||||
sc_service::new_full_parts::<Block, RuntimeApi, Executor>(&config)?;
|
||||
let client = Arc::new(client);
|
||||
|
||||
let (grandpa_block_import, grandpa_link) = sc_finality_grandpa::block_import(
|
||||
client.clone(),
|
||||
&(client.clone() as Arc<_>),
|
||||
select_chain,
|
||||
)?;
|
||||
let select_chain = sc_consensus::LongestChain::new(backend.clone());
|
||||
|
||||
let aura_block_import = sc_consensus_aura::AuraBlockImport::<_, _, _, AuraPair>::new(
|
||||
grandpa_block_import.clone(), client.clone(),
|
||||
);
|
||||
let pool_api = sc_transaction_pool::FullChainApi::new(
|
||||
client.clone(), config.prometheus_registry(),
|
||||
);
|
||||
let transaction_pool = sc_transaction_pool::BasicPool::new_full(
|
||||
config.transaction_pool.clone(),
|
||||
std::sync::Arc::new(pool_api),
|
||||
config.prometheus_registry(),
|
||||
task_manager.spawn_handle(),
|
||||
client.clone(),
|
||||
);
|
||||
|
||||
let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _>(
|
||||
sc_consensus_aura::slot_duration(&*client)?,
|
||||
aura_block_import,
|
||||
Some(Box::new(grandpa_block_import.clone())),
|
||||
None,
|
||||
client,
|
||||
inherent_data_providers.clone(),
|
||||
spawn_task_handle,
|
||||
registry,
|
||||
)?;
|
||||
let (grandpa_block_import, grandpa_link) = sc_finality_grandpa::block_import(
|
||||
client.clone(), &(client.clone() as Arc<_>), select_chain.clone(),
|
||||
)?;
|
||||
|
||||
import_setup = Some((grandpa_block_import, grandpa_link));
|
||||
let aura_block_import = sc_consensus_aura::AuraBlockImport::<_, _, _, AuraPair>::new(
|
||||
grandpa_block_import.clone(), client.clone(),
|
||||
);
|
||||
|
||||
Ok(import_queue)
|
||||
})?;
|
||||
let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _>(
|
||||
sc_consensus_aura::slot_duration(&*client)?,
|
||||
aura_block_import,
|
||||
Some(Box::new(grandpa_block_import.clone())),
|
||||
None,
|
||||
client.clone(),
|
||||
inherent_data_providers.clone(),
|
||||
&task_manager.spawn_handle(),
|
||||
config.prometheus_registry(),
|
||||
)?;
|
||||
|
||||
(builder, import_setup, inherent_data_providers)
|
||||
}}
|
||||
let provider = client.clone() as Arc<dyn StorageAndProofProvider<_, _>>;
|
||||
let finality_proof_provider =
|
||||
Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), provider));
|
||||
|
||||
let params = sc_service::ServiceParams {
|
||||
backend, client, import_queue, keystore, task_manager, transaction_pool,
|
||||
config,
|
||||
block_announce_validator_builder: None,
|
||||
finality_proof_request_builder: None,
|
||||
finality_proof_provider: Some(finality_proof_provider),
|
||||
on_demand: None,
|
||||
remote_blockchain: None,
|
||||
rpc_extensions_builder: Box::new(|_| ()),
|
||||
};
|
||||
|
||||
Ok((
|
||||
params, select_chain, inherent_data_providers,
|
||||
grandpa_block_import, grandpa_link,
|
||||
))
|
||||
}
|
||||
|
||||
/// Builds a new service for a full client.
|
||||
pub fn new_full(config: Configuration) -> Result<impl AbstractService, ServiceError> {
|
||||
let role = config.role.clone();
|
||||
let force_authoring = config.force_authoring;
|
||||
let name = config.network.node_name.clone();
|
||||
let disable_grandpa = config.disable_grandpa;
|
||||
pub fn new_full(config: Configuration) -> Result<TaskManager, ServiceError> {
|
||||
let (
|
||||
params, select_chain, inherent_data_providers,
|
||||
block_import, grandpa_link,
|
||||
) = new_full_params(config)?;
|
||||
|
||||
let (builder, mut import_setup, inherent_data_providers) = new_full_start!(config);
|
||||
let (
|
||||
role, force_authoring, name, enable_grandpa, prometheus_registry,
|
||||
client, transaction_pool, keystore,
|
||||
) = {
|
||||
let sc_service::ServiceParams {
|
||||
config, client, transaction_pool, keystore, ..
|
||||
} = ¶ms;
|
||||
|
||||
let (block_import, grandpa_link) =
|
||||
import_setup.take()
|
||||
.expect("Link Half and Block Import are present for Full Services or setup failed before. qed");
|
||||
(
|
||||
config.role.clone(),
|
||||
config.force_authoring,
|
||||
config.network.node_name.clone(),
|
||||
!config.disable_grandpa,
|
||||
config.prometheus_registry().cloned(),
|
||||
|
||||
let service = builder
|
||||
.with_finality_proof_provider(|client, backend| {
|
||||
// GenesisAuthoritySetProvider is implemented for StorageAndProofProvider
|
||||
let provider = client as Arc<dyn StorageAndProofProvider<_, _>>;
|
||||
Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _)
|
||||
})?
|
||||
.build_full()?;
|
||||
client.clone(), transaction_pool.clone(), keystore.clone(),
|
||||
)
|
||||
};
|
||||
|
||||
let ServiceComponents {
|
||||
task_manager, network, telemetry_on_connect_sinks, ..
|
||||
} = sc_service::build(params)?;
|
||||
|
||||
if role.is_authority() {
|
||||
let proposer = sc_basic_authorship::ProposerFactory::new(
|
||||
service.client(),
|
||||
service.transaction_pool(),
|
||||
service.prometheus_registry().as_ref(),
|
||||
client.clone(),
|
||||
transaction_pool,
|
||||
prometheus_registry.as_ref(),
|
||||
);
|
||||
|
||||
let client = service.client();
|
||||
let select_chain = service.select_chain()
|
||||
.ok_or(ServiceError::SelectChainRequired)?;
|
||||
|
||||
let can_author_with =
|
||||
sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone());
|
||||
|
||||
let aura = sc_consensus_aura::start_aura::<_, _, _, _, _, AuraPair, _, _, _>(
|
||||
sc_consensus_aura::slot_duration(&*client)?,
|
||||
client,
|
||||
client.clone(),
|
||||
select_chain,
|
||||
block_import,
|
||||
proposer,
|
||||
service.network(),
|
||||
network.clone(),
|
||||
inherent_data_providers.clone(),
|
||||
force_authoring,
|
||||
service.keystore(),
|
||||
keystore.clone(),
|
||||
can_author_with,
|
||||
)?;
|
||||
|
||||
// the AURA authoring task is considered essential, i.e. if it
|
||||
// fails we take down the service with it.
|
||||
service.spawn_essential_task_handle().spawn_blocking("aura", aura);
|
||||
task_manager.spawn_essential_handle().spawn_blocking("aura", aura);
|
||||
}
|
||||
|
||||
// if the node isn't actively participating in consensus then it doesn't
|
||||
// need a keystore, regardless of which protocol we use below.
|
||||
let keystore = if role.is_authority() {
|
||||
Some(service.keystore() as sp_core::traits::BareCryptoStorePtr)
|
||||
Some(keystore as sp_core::traits::BareCryptoStorePtr)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
@ -163,7 +171,6 @@ pub fn new_full(config: Configuration) -> Result<impl AbstractService, ServiceEr
|
|||
is_authority: role.is_network_authority(),
|
||||
};
|
||||
|
||||
let enable_grandpa = !disable_grandpa;
|
||||
if enable_grandpa {
|
||||
// start the full GRANDPA voter
|
||||
// NOTE: non-authorities could run the GRANDPA observer protocol, but at
|
||||
|
@ -174,95 +181,76 @@ pub fn new_full(config: Configuration) -> Result<impl AbstractService, ServiceEr
|
|||
let grandpa_config = sc_finality_grandpa::GrandpaParams {
|
||||
config: grandpa_config,
|
||||
link: grandpa_link,
|
||||
network: service.network(),
|
||||
inherent_data_providers: inherent_data_providers.clone(),
|
||||
telemetry_on_connect: Some(service.telemetry_on_connect_stream()),
|
||||
network,
|
||||
inherent_data_providers,
|
||||
telemetry_on_connect: Some(telemetry_on_connect_sinks.on_connect_stream()),
|
||||
voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(),
|
||||
prometheus_registry: service.prometheus_registry(),
|
||||
prometheus_registry,
|
||||
shared_voter_state: SharedVoterState::empty(),
|
||||
};
|
||||
|
||||
// the GRANDPA voter task is considered infallible, i.e.
|
||||
// if it fails we take down the service with it.
|
||||
service.spawn_essential_task_handle().spawn_blocking(
|
||||
task_manager.spawn_essential_handle().spawn_blocking(
|
||||
"grandpa-voter",
|
||||
sc_finality_grandpa::run_grandpa_voter(grandpa_config)?
|
||||
);
|
||||
} else {
|
||||
sc_finality_grandpa::setup_disabled_grandpa(
|
||||
service.client(),
|
||||
client,
|
||||
&inherent_data_providers,
|
||||
service.network(),
|
||||
network,
|
||||
)?;
|
||||
}
|
||||
|
||||
Ok(service)
|
||||
Ok(task_manager)
|
||||
}
|
||||
|
||||
/// Builds a new service for a light client.
|
||||
pub fn new_light(config: Configuration) -> Result<impl AbstractService, ServiceError> {
|
||||
let inherent_data_providers = InherentDataProviders::new();
|
||||
pub fn new_light(config: Configuration) -> Result<TaskManager, ServiceError> {
|
||||
let (client, backend, keystore, task_manager, on_demand) =
|
||||
sc_service::new_light_parts::<Block, RuntimeApi, Executor>(&config)?;
|
||||
|
||||
let transaction_pool_api = Arc::new(sc_transaction_pool::LightChainApi::new(
|
||||
client.clone(), on_demand.clone(),
|
||||
));
|
||||
let transaction_pool = sc_transaction_pool::BasicPool::new_light(
|
||||
config.transaction_pool.clone(),
|
||||
transaction_pool_api,
|
||||
config.prometheus_registry(),
|
||||
task_manager.spawn_handle(),
|
||||
);
|
||||
|
||||
ServiceBuilder::new_light::<Block, RuntimeApi, Executor>(config)?
|
||||
.with_select_chain(|_config, backend| {
|
||||
Ok(LongestChain::new(backend.clone()))
|
||||
})?
|
||||
.with_transaction_pool(|builder| {
|
||||
let fetcher = builder.fetcher()
|
||||
.ok_or_else(|| "Trying to start light transaction pool without active fetcher")?;
|
||||
let grandpa_block_import = sc_finality_grandpa::light_block_import(
|
||||
client.clone(), backend.clone(), &(client.clone() as Arc<_>),
|
||||
Arc::new(on_demand.checker().clone()) as Arc<_>,
|
||||
)?;
|
||||
let finality_proof_import = grandpa_block_import.clone();
|
||||
let finality_proof_request_builder =
|
||||
finality_proof_import.create_finality_proof_request_builder();
|
||||
|
||||
let pool_api = sc_transaction_pool::LightChainApi::new(
|
||||
builder.client().clone(),
|
||||
fetcher.clone(),
|
||||
);
|
||||
let pool = sc_transaction_pool::BasicPool::with_revalidation_type(
|
||||
builder.config().transaction_pool.clone(),
|
||||
Arc::new(pool_api),
|
||||
builder.prometheus_registry(),
|
||||
sc_transaction_pool::RevalidationType::Light,
|
||||
);
|
||||
Ok(pool)
|
||||
})?
|
||||
.with_import_queue_and_fprb(|
|
||||
_config,
|
||||
client,
|
||||
backend,
|
||||
fetcher,
|
||||
_select_chain,
|
||||
_tx_pool,
|
||||
spawn_task_handle,
|
||||
prometheus_registry,
|
||||
| {
|
||||
let fetch_checker = fetcher
|
||||
.map(|fetcher| fetcher.checker().clone())
|
||||
.ok_or_else(|| "Trying to start light import queue without active fetch checker")?;
|
||||
let grandpa_block_import = sc_finality_grandpa::light_block_import(
|
||||
client.clone(),
|
||||
backend,
|
||||
&(client.clone() as Arc<_>),
|
||||
Arc::new(fetch_checker),
|
||||
)?;
|
||||
let finality_proof_import = grandpa_block_import.clone();
|
||||
let finality_proof_request_builder =
|
||||
finality_proof_import.create_finality_proof_request_builder();
|
||||
let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _>(
|
||||
sc_consensus_aura::slot_duration(&*client)?,
|
||||
grandpa_block_import,
|
||||
None,
|
||||
Some(Box::new(finality_proof_import)),
|
||||
client.clone(),
|
||||
InherentDataProviders::new(),
|
||||
&task_manager.spawn_handle(),
|
||||
config.prometheus_registry(),
|
||||
)?;
|
||||
|
||||
let import_queue = sc_consensus_aura::import_queue::<_, _, _, AuraPair, _>(
|
||||
sc_consensus_aura::slot_duration(&*client)?,
|
||||
grandpa_block_import,
|
||||
None,
|
||||
Some(Box::new(finality_proof_import)),
|
||||
client,
|
||||
inherent_data_providers.clone(),
|
||||
spawn_task_handle,
|
||||
prometheus_registry,
|
||||
)?;
|
||||
let finality_proof_provider =
|
||||
Arc::new(GrandpaFinalityProofProvider::new(backend.clone(), client.clone() as Arc<_>));
|
||||
|
||||
Ok((import_queue, finality_proof_request_builder))
|
||||
})?
|
||||
.with_finality_proof_provider(|client, backend| {
|
||||
// GenesisAuthoritySetProvider is implemented for StorageAndProofProvider
|
||||
let provider = client as Arc<dyn StorageAndProofProvider<_, _>>;
|
||||
Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _)
|
||||
})?
|
||||
.build_light()
|
||||
sc_service::build(sc_service::ServiceParams {
|
||||
block_announce_validator_builder: None,
|
||||
finality_proof_request_builder: Some(finality_proof_request_builder),
|
||||
finality_proof_provider: Some(finality_proof_provider),
|
||||
on_demand: Some(on_demand),
|
||||
remote_blockchain: Some(backend.remote_blockchain()),
|
||||
rpc_extensions_builder: Box::new(|_| ()),
|
||||
transaction_pool: Arc::new(transaction_pool),
|
||||
config, client, import_queue, keystore, backend, task_manager
|
||||
}).map(|ServiceComponents { task_manager, .. }| task_manager)
|
||||
}
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
[package]
|
||||
authors = ['Substrate DevHub <https://github.com/substrate-developer-hub>']
|
||||
description = 'FRAME pallet template'
|
||||
description = 'FRAME pallet template for defining custom runtime logic.'
|
||||
edition = '2018'
|
||||
homepage = 'https://substrate.dev'
|
||||
license = 'Unlicense'
|
||||
name = 'pallet-template'
|
||||
repository = 'https://github.com/substrate-developer-hub/substrate-node-template/'
|
||||
version = '2.0.0-rc4'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ['x86_64-unknown-linux-gnu']
|
||||
|
||||
[dependencies.codec]
|
||||
default-features = false
|
||||
features = ['derive']
|
||||
|
@ -18,31 +20,32 @@ version = '1.3.1'
|
|||
[dependencies.frame-support]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.frame-system]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dev-dependencies.sp-core]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dev-dependencies.sp-io]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dev-dependencies.sp-runtime]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[features]
|
||||
default = ['std']
|
||||
|
|
|
@ -1,16 +1,11 @@
|
|||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
|
||||
/// A FRAME pallet template with necessary imports
|
||||
/// Edit this file to define custom logic or remove it if it is not needed.
|
||||
/// Learn more about FRAME and the core library of Substrate FRAME pallets:
|
||||
/// https://substrate.dev/docs/en/knowledgebase/runtime/frame
|
||||
|
||||
/// Feel free to remove or edit this file as needed.
|
||||
/// If you change the name of this file, make sure to update its references in runtime/src/lib.rs
|
||||
/// If you remove this file, you can remove those references
|
||||
|
||||
/// For more guidance on Substrate FRAME, see the example pallet
|
||||
/// https://github.com/paritytech/substrate/blob/master/frame/example/src/lib.rs
|
||||
|
||||
use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch};
|
||||
use frame_system::{self as system, ensure_signed};
|
||||
use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch, traits::Get};
|
||||
use frame_system::ensure_signed;
|
||||
|
||||
#[cfg(test)]
|
||||
mod mock;
|
||||
|
@ -18,88 +13,87 @@ mod mock;
|
|||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
/// The pallet's configuration trait.
|
||||
pub trait Trait: system::Trait {
|
||||
// Add other types and constants required to configure this pallet.
|
||||
|
||||
/// The overarching event type.
|
||||
type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
|
||||
/// Configure the pallet by specifying the parameters and types on which it depends.
|
||||
pub trait Trait: frame_system::Trait {
|
||||
/// Because this pallet emits events, it depends on the runtime's definition of an event.
|
||||
type Event: From<Event<Self>> + Into<<Self as frame_system::Trait>::Event>;
|
||||
}
|
||||
|
||||
// This pallet's storage items.
|
||||
// The pallet's runtime storage items.
|
||||
// https://substrate.dev/docs/en/knowledgebase/runtime/storage
|
||||
decl_storage! {
|
||||
// It is important to update your storage name so that your pallet's
|
||||
// storage items are isolated from other pallets.
|
||||
// A unique name is used to ensure that the pallet's storage items are isolated.
|
||||
// This name may be updated, but each pallet in the runtime must use a unique name.
|
||||
// ---------------------------------vvvvvvvvvvvvvv
|
||||
trait Store for Module<T: Trait> as TemplateModule {
|
||||
// Just a dummy storage item.
|
||||
// Here we are declaring a StorageValue, `Something` as a Option<u32>
|
||||
// `get(fn something)` is the default getter which returns either the stored `u32` or `None` if nothing stored
|
||||
// Learn more about declaring storage items:
|
||||
// https://substrate.dev/docs/en/knowledgebase/runtime/storage#declaring-storage-items
|
||||
Something get(fn something): Option<u32>;
|
||||
}
|
||||
}
|
||||
|
||||
// The pallet's events
|
||||
// Pallets use events to inform users when important changes are made.
|
||||
// https://substrate.dev/docs/en/knowledgebase/runtime/events
|
||||
decl_event!(
|
||||
pub enum Event<T> where AccountId = <T as system::Trait>::AccountId {
|
||||
/// Just a dummy event.
|
||||
/// Event `Something` is declared with a parameter of the type `u32` and `AccountId`
|
||||
/// To emit this event, we call the deposit function, from our runtime functions
|
||||
pub enum Event<T> where AccountId = <T as frame_system::Trait>::AccountId {
|
||||
/// Event documentation should end with an array that provides descriptive names for event
|
||||
/// parameters. [something, who]
|
||||
SomethingStored(u32, AccountId),
|
||||
}
|
||||
);
|
||||
|
||||
// The pallet's errors
|
||||
// Errors inform users that something went wrong.
|
||||
decl_error! {
|
||||
pub enum Error for Module<T: Trait> {
|
||||
/// Value was None
|
||||
/// Error names should be descriptive.
|
||||
NoneValue,
|
||||
/// Value reached maximum and cannot be incremented further
|
||||
/// Errors should have helpful documentation associated with them.
|
||||
StorageOverflow,
|
||||
}
|
||||
}
|
||||
|
||||
// The pallet's dispatchable functions.
|
||||
// Dispatchable functions allows users to interact with the pallet and invoke state changes.
|
||||
// These functions materialize as "extrinsics", which are often compared to transactions.
|
||||
// Dispatchable functions must be annotated with a weight and must return a DispatchResult.
|
||||
decl_module! {
|
||||
/// The module declaration.
|
||||
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
|
||||
// Initializing errors
|
||||
// this includes information about your errors in the node's metadata.
|
||||
// it is needed only if you are using errors in your pallet
|
||||
// Errors must be initialized if they are used by the pallet.
|
||||
type Error = Error<T>;
|
||||
|
||||
// Initializing events
|
||||
// this is needed only if you are using events in your pallet
|
||||
// Events must be initialized if they are used by the pallet.
|
||||
fn deposit_event() = default;
|
||||
|
||||
/// Just a dummy entry point.
|
||||
/// function that can be called by the external world as an extrinsics call
|
||||
/// takes a parameter of the type `AccountId`, stores it, and emits an event
|
||||
#[weight = 10_000]
|
||||
/// An example dispatchable that takes a singles value as a parameter, writes the value to
|
||||
/// storage and emits an event. This function must be dispatched by a signed extrinsic.
|
||||
#[weight = 10_000 + T::DbWeight::get().writes(1)]
|
||||
pub fn do_something(origin, something: u32) -> dispatch::DispatchResult {
|
||||
// Check it was signed and get the signer. See also: ensure_root and ensure_none
|
||||
// Check that the extrinsic was signed and get the signer.
|
||||
// This function will return an error if the extrinsic is not signed.
|
||||
// https://substrate.dev/docs/en/knowledgebase/runtime/origin
|
||||
let who = ensure_signed(origin)?;
|
||||
|
||||
// Code to execute when something calls this.
|
||||
// For example: the following line stores the passed in u32 in the storage
|
||||
// Update storage.
|
||||
Something::put(something);
|
||||
|
||||
// Here we are raising the Something event
|
||||
// Emit an event.
|
||||
Self::deposit_event(RawEvent::SomethingStored(something, who));
|
||||
// Return a successful DispatchResult
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Another dummy entry point.
|
||||
/// takes no parameters, attempts to increment storage value, and possibly throws an error
|
||||
#[weight = 10_000]
|
||||
/// An example dispatchable that may throw a custom error.
|
||||
#[weight = 10_000 + T::DbWeight::get().reads_writes(1,1)]
|
||||
pub fn cause_error(origin) -> dispatch::DispatchResult {
|
||||
// Check it was signed and get the signer. See also: ensure_root and ensure_none
|
||||
let _who = ensure_signed(origin)?;
|
||||
|
||||
// Read a value from storage.
|
||||
match Something::get() {
|
||||
// Return an error if the value has not been set.
|
||||
None => Err(Error::<T>::NoneValue)?,
|
||||
Some(old) => {
|
||||
// Increment the value read from storage; will error in the event of overflow.
|
||||
let new = old.checked_add(1).ok_or(Error::<T>::StorageOverflow)?;
|
||||
// Update the value in storage with the incremented result.
|
||||
Something::put(new);
|
||||
Ok(())
|
||||
},
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
// Creating mock runtime here
|
||||
|
||||
use crate::{Module, Trait};
|
||||
use sp_core::H256;
|
||||
use frame_support::{impl_outer_origin, parameter_types, weights::Weight};
|
||||
|
@ -12,9 +10,8 @@ impl_outer_origin! {
|
|||
pub enum Origin for Test {}
|
||||
}
|
||||
|
||||
// For testing the pallet, we construct most of a mock runtime. This means
|
||||
// first constructing a configuration type (`Test`) which `impl`s each of the
|
||||
// configuration traits of pallets we want to use.
|
||||
// Configure a mock runtime to test the pallet.
|
||||
|
||||
#[derive(Clone, Eq, PartialEq)]
|
||||
pub struct Test;
|
||||
parameter_types! {
|
||||
|
@ -23,6 +20,7 @@ parameter_types! {
|
|||
pub const MaximumBlockLength: u32 = 2 * 1024;
|
||||
pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);
|
||||
}
|
||||
|
||||
impl system::Trait for Test {
|
||||
type BaseCallFilter = ();
|
||||
type Origin = Origin;
|
||||
|
@ -48,14 +46,16 @@ impl system::Trait for Test {
|
|||
type AccountData = ();
|
||||
type OnNewAccount = ();
|
||||
type OnKilledAccount = ();
|
||||
type SystemWeightInfo = ();
|
||||
}
|
||||
|
||||
impl Trait for Test {
|
||||
type Event = ();
|
||||
}
|
||||
|
||||
pub type TemplateModule = Module<Test>;
|
||||
|
||||
// This function basically just builds a genesis storage key/value store according to
|
||||
// our desired mockup.
|
||||
// Build genesis storage according to the mock runtime.
|
||||
pub fn new_test_ext() -> sp_io::TestExternalities {
|
||||
system::GenesisConfig::default().build_storage::<Test>().unwrap().into()
|
||||
}
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
// Tests to be written here
|
||||
|
||||
use crate::{Error, mock::*};
|
||||
use frame_support::{assert_ok, assert_noop};
|
||||
|
||||
#[test]
|
||||
fn it_works_for_default_value() {
|
||||
new_test_ext().execute_with(|| {
|
||||
// Just a dummy test for the dummy function `do_something`
|
||||
// calling the `do_something` function with a value 42
|
||||
// Dispatch a signed extrinsic.
|
||||
assert_ok!(TemplateModule::do_something(Origin::signed(1), 42));
|
||||
// asserting that the stored value is equal to what we stored
|
||||
// Read pallet storage and assert an expected result.
|
||||
assert_eq!(TemplateModule::something(), Some(42));
|
||||
});
|
||||
}
|
||||
|
@ -17,7 +14,7 @@ fn it_works_for_default_value() {
|
|||
#[test]
|
||||
fn correct_error_for_none_value() {
|
||||
new_test_ext().execute_with(|| {
|
||||
// Ensure the correct error is thrown on None value
|
||||
// Ensure the expected error is thrown when no value is present.
|
||||
assert_noop!(
|
||||
TemplateModule::cause_error(Origin::signed(1)),
|
||||
Error::<Test>::NoneValue
|
||||
|
|
|
@ -1,3 +1,178 @@
|
|||
[package]
|
||||
authors = ['Substrate DevHub <https://github.com/substrate-developer-hub>']
|
||||
edition = '2018'
|
||||
homepage = 'https://substrate.dev'
|
||||
license = 'Unlicense'
|
||||
name = 'node-template-runtime'
|
||||
repository = 'https://github.com/substrate-developer-hub/substrate-node-template/'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
targets = ['x86_64-unknown-linux-gnu']
|
||||
|
||||
[dependencies.aura]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-aura'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.balances]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-balances'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.codec]
|
||||
default-features = false
|
||||
features = ['derive']
|
||||
package = 'parity-scale-codec'
|
||||
version = '1.3.1'
|
||||
|
||||
[dependencies.frame-executive]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.frame-support]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.grandpa]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-grandpa'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.randomness-collective-flip]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-randomness-collective-flip'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.serde]
|
||||
features = ['derive']
|
||||
optional = true
|
||||
version = '1.0.101'
|
||||
|
||||
[dependencies.sp-api]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-block-builder]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-consensus-aura]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '0.8.0-rc5'
|
||||
|
||||
[dependencies.sp-core]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-inherents]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-io]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-offchain]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-runtime]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-session]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-std]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-transaction-pool]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sp-version]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.sudo]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-sudo'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.system]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'frame-system'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.template]
|
||||
default-features = false
|
||||
package = 'pallet-template'
|
||||
path = '../pallets/template'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.timestamp]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-timestamp'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[dependencies.transaction-payment]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-transaction-payment'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '2.0.0-rc5'
|
||||
|
||||
[build-dependencies.wasm-builder-runner]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'substrate-wasm-builder-runner'
|
||||
tag = 'v2.0.0-rc5'
|
||||
version = '1.0.5'
|
||||
|
||||
[features]
|
||||
default = ['std']
|
||||
std = [
|
||||
|
@ -27,175 +202,3 @@ std = [
|
|||
'transaction-payment/std',
|
||||
'template/std',
|
||||
]
|
||||
[dependencies.aura]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-aura'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.balances]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-balances'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.codec]
|
||||
default-features = false
|
||||
features = ['derive']
|
||||
package = 'parity-scale-codec'
|
||||
version = '1.3.1'
|
||||
|
||||
[dependencies.frame-executive]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.frame-support]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.grandpa]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-grandpa'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.randomness-collective-flip]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-randomness-collective-flip'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.serde]
|
||||
features = ['derive']
|
||||
optional = true
|
||||
version = '1.0.101'
|
||||
|
||||
[dependencies.sp-api]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-block-builder]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-consensus-aura]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '0.8.0-rc4'
|
||||
|
||||
[dependencies.sp-core]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-inherents]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-io]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-offchain]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-runtime]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-session]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-std]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-transaction-pool]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sp-version]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.sudo]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-sudo'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.system]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'frame-system'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.template]
|
||||
default-features = false
|
||||
package = 'pallet-template'
|
||||
path = '../pallets/template'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.timestamp]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-timestamp'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[dependencies.transaction-payment]
|
||||
default-features = false
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'pallet-transaction-payment'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '2.0.0-rc4'
|
||||
|
||||
[package]
|
||||
authors = ['Substrate DevHub <https://github.com/substrate-developer-hub>']
|
||||
edition = '2018'
|
||||
homepage = 'https://substrate.dev'
|
||||
license = 'Unlicense'
|
||||
name = 'node-template-runtime'
|
||||
repository = 'https://github.com/substrate-developer-hub/substrate-node-template/'
|
||||
version = '2.0.0-rc4'
|
||||
[package.metadata.docs.rs]
|
||||
targets = ['x86_64-unknown-linux-gnu']
|
||||
[build-dependencies.wasm-builder-runner]
|
||||
git = 'https://github.com/paritytech/substrate.git'
|
||||
package = 'substrate-wasm-builder-runner'
|
||||
tag = 'v2.0.0-rc4'
|
||||
version = '1.0.5'
|
||||
|
|
|
@ -3,7 +3,7 @@ use wasm_builder_runner::WasmBuilder;
|
|||
fn main() {
|
||||
WasmBuilder::new()
|
||||
.with_current_project()
|
||||
.with_wasm_builder_from_crates("1.0.11")
|
||||
.with_wasm_builder_from_crates("2.0.0")
|
||||
.export_heap_base()
|
||||
.import_memory()
|
||||
.build()
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
//! The Substrate Node Template runtime. This can be compiled with `#[no_std]`, ready for Wasm.
|
||||
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.
|
||||
#![recursion_limit="256"]
|
||||
|
@ -40,7 +38,7 @@ pub use frame_support::{
|
|||
},
|
||||
};
|
||||
|
||||
/// Importing a template pallet
|
||||
/// Import the template pallet.
|
||||
pub use template;
|
||||
|
||||
/// An index to a block.
|
||||
|
@ -93,7 +91,6 @@ pub mod opaque {
|
|||
}
|
||||
}
|
||||
|
||||
/// This runtime version.
|
||||
pub const VERSION: RuntimeVersion = RuntimeVersion {
|
||||
spec_name: create_runtime_str!("node-template"),
|
||||
impl_name: create_runtime_str!("node-template"),
|
||||
|
@ -108,7 +105,7 @@ pub const MILLISECS_PER_BLOCK: u64 = 6000;
|
|||
|
||||
pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;
|
||||
|
||||
// These time units are defined in number of blocks.
|
||||
// Time is measured by number of blocks.
|
||||
pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);
|
||||
pub const HOURS: BlockNumber = MINUTES * 60;
|
||||
pub const DAYS: BlockNumber = HOURS * 24;
|
||||
|
@ -134,6 +131,8 @@ parameter_types! {
|
|||
pub const Version: RuntimeVersion = VERSION;
|
||||
}
|
||||
|
||||
// Configure FRAME pallets to include in runtime.
|
||||
|
||||
impl system::Trait for Runtime {
|
||||
/// The basic call filter to use in dispatchable.
|
||||
type BaseCallFilter = ();
|
||||
|
@ -189,6 +188,8 @@ impl system::Trait for Runtime {
|
|||
type OnKilledAccount = ();
|
||||
/// The data to be stored in an account.
|
||||
type AccountData = balances::AccountData<Balance>;
|
||||
/// Weight information for the extrinsics of this pallet.
|
||||
type SystemWeightInfo = ();
|
||||
}
|
||||
|
||||
impl aura::Trait for Runtime {
|
||||
|
@ -221,6 +222,7 @@ impl timestamp::Trait for Runtime {
|
|||
type Moment = u64;
|
||||
type OnTimestampSet = Aura;
|
||||
type MinimumPeriod = MinimumPeriod;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
@ -235,6 +237,7 @@ impl balances::Trait for Runtime {
|
|||
type DustRemoval = ();
|
||||
type ExistentialDeposit = ExistentialDeposit;
|
||||
type AccountStore = System;
|
||||
type WeightInfo = ();
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
@ -254,11 +257,12 @@ impl sudo::Trait for Runtime {
|
|||
type Call = Call;
|
||||
}
|
||||
|
||||
/// Used for the module template in `./template.rs`
|
||||
/// Configure the pallet template in pallets/template.
|
||||
impl template::Trait for Runtime {
|
||||
type Event = Event;
|
||||
}
|
||||
|
||||
// Create the runtime by composing the FRAME pallets that were previously configured.
|
||||
construct_runtime!(
|
||||
pub enum Runtime where
|
||||
Block = Block,
|
||||
|
@ -268,12 +272,12 @@ construct_runtime!(
|
|||
System: system::{Module, Call, Config, Storage, Event<T>},
|
||||
RandomnessCollectiveFlip: randomness_collective_flip::{Module, Call, Storage},
|
||||
Timestamp: timestamp::{Module, Call, Storage, Inherent},
|
||||
Aura: aura::{Module, Config<T>, Inherent(Timestamp)},
|
||||
Aura: aura::{Module, Config<T>, Inherent},
|
||||
Grandpa: grandpa::{Module, Call, Storage, Config, Event},
|
||||
Balances: balances::{Module, Call, Storage, Config<T>, Event<T>},
|
||||
TransactionPayment: transaction_payment::{Module, Storage},
|
||||
Sudo: sudo::{Module, Call, Config<T>, Storage, Event<T>},
|
||||
// Used for the module template in `./template.rs`
|
||||
// Include the custom logic from the template pallet in the runtime.
|
||||
TemplateModule: template::{Module, Call, Storage, Event<T>},
|
||||
}
|
||||
);
|
||||
|
@ -393,7 +397,7 @@ impl_runtime_apis! {
|
|||
Grandpa::grandpa_authorities()
|
||||
}
|
||||
|
||||
fn submit_report_equivocation_extrinsic(
|
||||
fn submit_report_equivocation_unsigned_extrinsic(
|
||||
_equivocation_proof: fg_primitives::EquivocationProof<
|
||||
<Block as BlockT>::Hash,
|
||||
NumberFor<Block>,
|
||||
|
|
Loading…
Reference in New Issue