Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to polkadot-v0.9.40 #7

Merged
merged 8 commits into from
Aug 2, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,109 changes: 1,918 additions & 1,191 deletions Cargo.lock

Large diffs are not rendered by default.

119 changes: 60 additions & 59 deletions node/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "frontier-parachain-node"
version = "0.1.0"
version = "0.9.400"
authors = ["Anonymous"]
description = "A new Cumulus FRAME-based Substrate Node, ready for hacking together a parachain."
license = "Unlicense"
Expand All @@ -11,81 +11,82 @@ build = "build.rs"

[dependencies]
async-trait = "0.1"
clap = { version = "4.1", features = ["derive", "deprecated"] }
clap = { version = "4.2.3", features = ["derive", "deprecated"] }
futures = "0.3.25"
log = "0.4.17"
codec = { package = "parity-scale-codec", version = "3.0.0" }
serde = { version = "1.0.152", features = ["derive"] }
serde = { version = "1.0.160", features = ["derive"] }
jsonrpsee = { version = "0.16.2", features = ["server", "macros"] }

# Local
frontier-parachain-runtime = { path = "../runtime" }

# Substrate
frame-benchmarking = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-basic-authorship = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-chain-spec = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-cli = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-client-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-consensus = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-executor = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-network = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-network-common = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-rpc = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-service = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-sysinfo = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-telemetry = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-tracing = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-transaction-pool = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-block-builder = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-blockchain = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-consensus-aura = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-core = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-keystore = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-offchain = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-io = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-runtime = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-session = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-timestamp = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
sp-transaction-pool = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true , "branch" = "polkadot-v0.9.37" }
frame-benchmarking = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
frame-benchmarking-cli = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-basic-authorship = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-chain-spec = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-cli = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-client-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-consensus = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-executor = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-network = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-network-common = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-network-sync = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-rpc = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-service = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-sysinfo = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-telemetry = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-tracing = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-transaction-pool = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sc-transaction-pool-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-api = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-block-builder = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-blockchain = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-consensus-aura = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-core = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-keystore = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-offchain = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-io = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-runtime = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-session = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-timestamp = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
sp-transaction-pool = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
substrate-frame-rpc-system = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
substrate-prometheus-endpoint = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }
try-runtime-cli = { git = "https://github.com/paritytech/substrate", optional = true , "branch" = "polkadot-v0.9.40" }

# Polkadot
polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.37" }
xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.37" }
polkadot-cli = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.40" }
polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.40" }
polkadot-service = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.40" }
xcm = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "release-v0.9.40" }

# Cumulus
cumulus-client-cli = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-client-consensus-aura = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-client-consensus-common = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-client-network = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-client-service = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.37" }
cumulus-client-cli = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-client-consensus-aura = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-client-consensus-common = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-client-network = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-client-service = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-primitives-core = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-primitives-parachain-inherent = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }
cumulus-relay-chain-interface = { git = "https://github.com/paritytech/cumulus.git", branch = "polkadot-v0.9.40" }

# Frontier
fc-cli = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fc-consensus = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fc-db = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fc-mapping-sync = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fc-rpc = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37", features = [ "rpc-binary-search-estimate" ] }
fc-rpc-core = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fp-dynamic-fee = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fp-evm = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fp-rpc = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fp-storage = { git = "https://github.com/paritytech/frontier", branch = "polkadot-v0.9.37" }
fc-cli = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fc-consensus = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fc-db = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fc-mapping-sync = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fc-rpc = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40", features = [ "rpc-binary-search-estimate" ] }
fc-rpc-core = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fp-dynamic-fee = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fp-evm = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fp-rpc = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
fc-storage = { git = "https://github.com/paritytech/frontier", branch = "fpt/polkadot-v0.9.40" }
stiiifff marked this conversation as resolved.
Show resolved Hide resolved

[build-dependencies]
substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.37" }
substrate-build-script-utils = { git = "https://github.com/paritytech/substrate", "branch" = "polkadot-v0.9.40" }

[features]
default = []
Expand Down
23 changes: 12 additions & 11 deletions node/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ fn testnet_genesis(
safe_xcm_version: Some(SAFE_XCM_VERSION),
},
sudo: frontier_parachain_runtime::SudoConfig { key: root_key },
transaction_payment: Default::default(),
// EVM compatibility
evm_chain_id: frontier_parachain_runtime::EVMChainIdConfig { chain_id: 1000 },
evm: frontier_parachain_runtime::EVMConfig {
Expand Down Expand Up @@ -295,18 +296,18 @@ fn testnet_genesis(
},
);
map.insert(
// H160 address of dev account
// H160 address of dev account
// Private key : 0xb9d2ea9a615f3165812e8d44de0d24da9bbd164b65c4f0573e1ce2c8dbd9c8df
H160::from_str("C0F0f4ab324C46e55D02D0033343B4Be8A55532d")
.expect("internal H160 is valid; qed"),
fp_evm::GenesisAccount {
balance: U256::from_str("0xef000000000000000000000000000")
.expect("internal U256 is valid; qed"),
code: Default::default(),
nonce: Default::default(),
storage: Default::default(),
},
);
H160::from_str("C0F0f4ab324C46e55D02D0033343B4Be8A55532d")
.expect("internal H160 is valid; qed"),
fp_evm::GenesisAccount {
balance: U256::from_str("0xef000000000000000000000000000")
.expect("internal U256 is valid; qed"),
code: Default::default(),
nonce: Default::default(),
storage: Default::default(),
},
);
map
},
},
Expand Down
53 changes: 36 additions & 17 deletions node/src/command.rs
stiiifff marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::net::SocketAddr;
use std::{net::SocketAddr, sync::Arc};

use codec::Encode;
use cumulus_client_cli::generate_genesis_block;
Expand All @@ -10,7 +10,10 @@ use sc_cli::{
ChainSpec, CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams,
NetworkParams, Result, RuntimeVersion, SharedParams, SubstrateCli,
};
use sc_service::config::{BasePath, /*DatabaseSource,*/ PrometheusConfig};
use sc_service::{
config::{BasePath, /*DatabaseSource,*/ PrometheusConfig},
PartialComponents,
};
use sp_core::hexdisplay::HexDisplay;
use sp_runtime::traits::{AccountIdConversion, Block as BlockT};
// Frontier
Expand All @@ -33,7 +36,7 @@ fn load_spec(id: &str) -> std::result::Result<Box<dyn ChainSpec>, String> {

impl SubstrateCli for Cli {
fn impl_name() -> String {
"Parachain Collator Template".into()
"Frontier Parachain Collator Template".into()
}

fn impl_version() -> String {
Expand All @@ -42,7 +45,7 @@ impl SubstrateCli for Cli {

fn description() -> String {
format!(
"Parachain Collator Template\n\nThe command-line arguments provided first will be \
"Frontier Parachain Collator Template\n\nThe command-line arguments provided first will be \
passed to the parachain node, while the arguments provided after -- will be passed \
to the relay chain node.\n\n\
{} <parachain-args> -- <relay-chain-args>",
Expand Down Expand Up @@ -73,7 +76,7 @@ impl SubstrateCli for Cli {

impl SubstrateCli for RelayChainCli {
fn impl_name() -> String {
"Parachain Collator Template".into()
"Frontier Parachain Collator Template".into()
}

fn impl_version() -> String {
Expand All @@ -82,7 +85,7 @@ impl SubstrateCli for RelayChainCli {

fn description() -> String {
format!(
"Parachain Collator Template\n\nThe command-line arguments provided first will be \
"Frontier Parachain Collator Template\n\nThe command-line arguments provided first will be \
passed to the parachain node, while the arguments provided after -- will be passed \
to the relay chain node.\n\n\
{} <parachain-args> -- <relay-chain-args>",
Expand Down Expand Up @@ -210,35 +213,38 @@ pub fn run() -> Result<()> {
let runner = cli.create_runner(cmd)?;
// Switch on the concrete benchmark sub-command-
match cmd {
BenchmarkCmd::Pallet(cmd) =>
BenchmarkCmd::Pallet(cmd) => {
if cfg!(feature = "runtime-benchmarks") {
runner.sync_run(|config| cmd.run::<Block, ParachainNativeExecutor>(config))
} else {
Err("Benchmarking wasn't enabled when building the node. \
You can enable it with `--features runtime-benchmarks`."
.into())
},
}
},
BenchmarkCmd::Block(cmd) => runner.sync_run(|config| {
let partials = new_partial(&config, &eth_cfg)?;
cmd.run(partials.client)
}),
#[cfg(not(feature = "runtime-benchmarks"))]
BenchmarkCmd::Storage(_) =>
BenchmarkCmd::Storage(_) => {
return Err(sc_cli::Error::Input(
"Compile with --features=runtime-benchmarks \
to enable storage benchmarks."
.into(),
)
.into()),
.into())
},
#[cfg(feature = "runtime-benchmarks")]
BenchmarkCmd::Storage(cmd) => runner.sync_run(|config| {
let partials = new_partial(&config, &eth_cfg)?;
let db = partials.backend.expose_db();
let storage = partials.backend.expose_storage();
cmd.run(config, partials.client.clone(), db, storage)
}),
BenchmarkCmd::Machine(cmd) =>
runner.sync_run(|config| cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone())),
BenchmarkCmd::Machine(cmd) => {
runner.sync_run(|config| cmd.run(&config, SUBSTRATE_REFERENCE_HARDWARE.clone()))
},
// NOTE: this allows the Client to leniently implement
// new benchmark commands without requiring a companion MR.
#[allow(unreachable_patterns)]
Expand All @@ -247,9 +253,12 @@ pub fn run() -> Result<()> {
},
#[cfg(feature = "try-runtime")]
Some(Subcommand::TryRuntime(cmd)) => {
use frontier_parachain_runtime::MILLISECS_PER_BLOCK;
use sc_executor::{sp_wasm_interface::ExtendedHostFunctions, NativeExecutionDispatch};
use try_runtime_cli::block_building_info::timestamp_with_aura_info;

let runner = cli.create_runner(cmd)?;

use sc_executor::{sp_wasm_interface::ExtendedHostFunctions, NativeExecutionDispatch};
type HostFunctionsOf<E> = ExtendedHostFunctions<
sp_io::SubstrateHostFunctions,
<E as NativeExecutionDispatch>::ExtendHostFunctions,
Expand All @@ -260,9 +269,15 @@ pub fn run() -> Result<()> {
let task_manager =
sc_service::TaskManager::new(runner.config().tokio_handle.clone(), *registry)
.map_err(|e| format!("Error: {:?}", e))?;
let info_provider = timestamp_with_aura_info(MILLISECS_PER_BLOCK);

runner.async_run(|_| {
Ok((cmd.run::<Block, HostFunctionsOf<ParachainNativeExecutor>>(), task_manager))
Ok((
cmd.run::<Block, HostFunctionsOf<ParachainNativeExecutor>, _>(Some(
info_provider,
)),
task_manager,
))
})
},
#[cfg(not(feature = "try-runtime"))]
Expand All @@ -272,9 +287,13 @@ pub fn run() -> Result<()> {
Some(Subcommand::FrontierDb(cmd)) => {
let runner = cli.create_runner(cmd)?;
runner.sync_run(|config| {
let params = crate::service::new_partial(&config, &cli.eth)?;
let client = params.client;
let (_, _, _, frontier_backend) = params.other;
let PartialComponents { client, other, .. } =
crate::service::new_partial(&config, &cli.eth)?;
let (_, _, _, frontier_backend, _) = other;
let frontier_backend = match frontier_backend {
fc_db::Backend::KeyValue(kv) => Arc::new(kv),
_ => panic!("Only fc_db::Backend::KeyValue supported"),
};
cmd.run(client, frontier_backend)
})
},
stiiifff marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Loading