mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 18:41:05 +00:00
Dump genesis to JSON file (#218)
* Merge remote-tracking branch 'origin/master' into gav-xts-dont-panic * Update wasm. * consensus, session and staking all panic-safe. * Democracy doesn't panic in apply. * Fix tests. * Extra helper macro, council depanicked. * Fix one test. * Fix up all council tests. No panics! * Council voting depanicked. * Dispatch returns result. * session & staking tests updated * Fix democracy tests. * Fix council tests. * Fix up polkadot parachains in runtime * Fix borked merge * More Slicable support Support general `Option` and array types. * Basic storage types. * Existential deposit for contract creation * Basic implemnetation along with removals * Fix tests. * externalities builder fix. * Tests. * Fix up the runtime. * Fix tests. * Add generic `Address` type. * Initial function integration of Address into Extrinsic. * Fix build * All tests compile. * Fix (some) tests. * Fix signing. * Push error. * transfer can accept Address * Make Address generic over AccountIndex * Fix test * Make Council use Address for dispatch. * Fix build * Bend over backwards to support braindead derive. * Repot some files. * Fix tests. * Fix grumbles * Remove Default bound * Fix build for new nightly. * Make `apply_extrinsic` never panic, return useful Result. * More merge hell * Doesn't build, but might do soon * Serde woes * get substrate-runtime-staking compiling * Polkadot builds again! * Fix all build. * Fix tests & binaries. * Reserve some extra initial byte values of address for future format changes * Make semantic of `ReservedBalance` clear. * Fix panic handler. * Integrate other balance transformations into the new model Fix up staking tests. * Fix runtime tests. * Fix panic build. * Tests for demonstrating interaction between balance types. * Repot some runtime code * Fix checkedblock in non-std builds * Get rid of `DoLookup` phantom. * Attempt to make transaction_pool work with lookups. * Remove vscode settings * New attempt at making transaction pool work. * It builds again! * --all builds * Fix tests. * New build. * Test account nonce reset. * polkadot transaction pool tests/framework. * Initial draft (working). * Address grumbles. * Revert bad `map_or` * Rebuild binaries, workaround. * Avoid checking in vscode * reconnecting, shared, slog * CLI options for name and telemetry url * ensure telemetry url imples enabled * Avoid casting to usize early. * Provide on-connect event for session message * Better port * heartbeat and some renaming * transaction pool stuff * minor renaming. * report telemetry * cleanups. * Fix for previous cleanup * dump genesis, dev mode, renaming * Rework chain spec/config &c. to allow for genesis file loading. * Avoid producing genesis storage when unneeded * Allow reading JSON genesis state dumps * tests work again * better logging. * Fix wasm build. * Introduce PoC-1 spec * Made block message compatible with poc-1 * Squashed changes for dumping genesis block. * Binaries. * Made block message compatible with poc-1 * Remove dead code. * Fix bad merge. * Argument passing and returning values when invoking sandboxed funcs (#189) * Fixed block download sequence (#223) * Trie-based execution proof (#177) * TrieBasedBackend * trie tests * redunant return_value removed * use Trie::get_with to record trie proofs * Relaying tx/blocks by light clients (#190) * do not import external transactions into light tx pool * do not announce blocks on light clients * blocks_are_not_announced_by_light_nodes
This commit is contained in:
@@ -31,13 +31,18 @@ extern crate fdlimit;
|
||||
extern crate ed25519;
|
||||
extern crate triehash;
|
||||
extern crate parking_lot;
|
||||
extern crate serde;
|
||||
extern crate serde_json;
|
||||
|
||||
extern crate substrate_primitives;
|
||||
extern crate substrate_state_machine as state_machine;
|
||||
extern crate substrate_client as client;
|
||||
extern crate substrate_network as network;
|
||||
extern crate substrate_rpc;
|
||||
extern crate substrate_rpc_servers as rpc;
|
||||
extern crate substrate_runtime_primitives as runtime_primitives;
|
||||
extern crate polkadot_primitives;
|
||||
extern crate polkadot_runtime;
|
||||
extern crate polkadot_service as service;
|
||||
#[macro_use]
|
||||
extern crate slog; // needed until we can reexport `slog_info` from `substrate_telemetry`
|
||||
@@ -53,26 +58,40 @@ extern crate clap;
|
||||
extern crate error_chain;
|
||||
#[macro_use]
|
||||
extern crate log;
|
||||
#[macro_use]
|
||||
extern crate hex_literal;
|
||||
|
||||
pub mod error;
|
||||
mod informant;
|
||||
mod chain_spec;
|
||||
mod preset_config;
|
||||
|
||||
pub use chain_spec::ChainSpec;
|
||||
pub use preset_config::PresetConfig;
|
||||
|
||||
use std::io;
|
||||
use std::fs::File;
|
||||
use std::net::SocketAddr;
|
||||
use std::path::{Path, PathBuf};
|
||||
use polkadot_primitives::Block;
|
||||
use std::collections::HashMap;
|
||||
use substrate_primitives::hexdisplay::HexDisplay;
|
||||
use substrate_primitives::storage::{StorageData, StorageKey};
|
||||
use substrate_telemetry::{init_telemetry, TelemetryConfig};
|
||||
use runtime_primitives::StorageMap;
|
||||
use polkadot_primitives::Block;
|
||||
|
||||
use futures::sync::mpsc;
|
||||
use futures::{Sink, Future, Stream};
|
||||
use tokio_core::reactor;
|
||||
use service::{OptionChainSpec, ChainSpec};
|
||||
|
||||
const DEFAULT_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io:443";
|
||||
|
||||
struct Configuration(service::Configuration);
|
||||
#[derive(Clone)]
|
||||
struct SystemConfiguration {
|
||||
chain_name: String,
|
||||
}
|
||||
|
||||
impl substrate_rpc::system::SystemApi for Configuration {
|
||||
impl substrate_rpc::system::SystemApi for SystemConfiguration {
|
||||
fn system_name(&self) -> substrate_rpc::system::error::Result<String> {
|
||||
Ok("parity-polkadot".into())
|
||||
}
|
||||
@@ -82,14 +101,16 @@ impl substrate_rpc::system::SystemApi for Configuration {
|
||||
}
|
||||
|
||||
fn system_chain(&self) -> substrate_rpc::system::error::Result<String> {
|
||||
Ok(match self.0.chain_spec {
|
||||
ChainSpec::Development => "dev",
|
||||
ChainSpec::LocalTestnet => "local",
|
||||
ChainSpec::PoC2Testnet => "poc-2",
|
||||
}.into())
|
||||
Ok(self.chain_name.clone())
|
||||
}
|
||||
}
|
||||
|
||||
fn read_storage_json(filename: &str) -> Option<StorageMap> {
|
||||
let file = File::open(PathBuf::from(filename)).ok()?;
|
||||
let h: HashMap<StorageKey, StorageData> = ::serde_json::from_reader(&file).ok()?;
|
||||
Some(h.into_iter().map(|(k, v)| (k.0, v.0)).collect())
|
||||
}
|
||||
|
||||
/// Parse command line arguments and start the node.
|
||||
///
|
||||
/// IANA unassigned port ranges that we could use:
|
||||
@@ -131,9 +152,16 @@ pub fn run<I, T>(args: I) -> error::Result<()> where
|
||||
info!("Node name: {}", config.name);
|
||||
}
|
||||
|
||||
let chain_spec = matches.value_of("chain")
|
||||
.map(ChainSpec::from)
|
||||
.unwrap_or_else(|| if matches.is_present("dev") { ChainSpec::Development } else { ChainSpec::PoC2Testnet });
|
||||
info!("Chain specification: {}", chain_spec);
|
||||
|
||||
config.chain_name = chain_spec.clone().into();
|
||||
|
||||
let _guard = if matches.is_present("telemetry") || matches.value_of("telemetry-url").is_some() {
|
||||
let name = config.name.clone();
|
||||
let chain = config.chain_spec.clone();
|
||||
let chain_name = config.chain_name.clone();
|
||||
Some(init_telemetry(TelemetryConfig {
|
||||
url: matches.value_of("telemetry-url").unwrap_or(DEFAULT_TELEMETRY_URL).into(),
|
||||
on_connect: Box::new(move || {
|
||||
@@ -142,7 +170,7 @@ pub fn run<I, T>(args: I) -> error::Result<()> where
|
||||
"implementation" => "parity-polkadot",
|
||||
"version" => crate_version!(),
|
||||
"config" => "",
|
||||
"chain" => <&'static str>::from(chain)
|
||||
"chain" => chain_name.clone(),
|
||||
);
|
||||
}),
|
||||
}))
|
||||
@@ -162,32 +190,46 @@ pub fn run<I, T>(args: I) -> error::Result<()> where
|
||||
|
||||
config.database_path = db_path(&base_path).to_string_lossy().into();
|
||||
|
||||
let mut role = service::Role::FULL;
|
||||
if matches.is_present("collator") {
|
||||
info!("Starting collator");
|
||||
role = service::Role::COLLATOR;
|
||||
} else if matches.is_present("validator") {
|
||||
info!("Starting validator");
|
||||
role = service::Role::VALIDATOR;
|
||||
} else if matches.is_present("light") {
|
||||
info!("Starting (light)");
|
||||
role = service::Role::LIGHT;
|
||||
} else {
|
||||
info!("Starting (heavy)");
|
||||
let (mut genesis_storage, boot_nodes) = PresetConfig::from_spec(chain_spec)
|
||||
.map(PresetConfig::deconstruct)
|
||||
.unwrap_or_else(|f| (Box::new(move ||
|
||||
read_storage_json(&f)
|
||||
.map(|s| { info!("{} storage items read from {}", s.len(), f); s })
|
||||
.unwrap_or_else(|| panic!("Bad genesis state file: {}", f))
|
||||
), vec![]));
|
||||
|
||||
if matches.is_present("build-genesis") {
|
||||
info!("Building genesis");
|
||||
for (i, (k, v)) in genesis_storage().iter().enumerate() {
|
||||
print!("{}\n\"0x{}\": \"0x{}\"", if i > 0 {','} else {'{'}, HexDisplay::from(k), HexDisplay::from(v));
|
||||
}
|
||||
println!("\n}}");
|
||||
return Ok(())
|
||||
}
|
||||
|
||||
match matches.value_of("chain") {
|
||||
None => (),
|
||||
Some(n) => config.chain_spec = OptionChainSpec::from(n).inner()
|
||||
.unwrap_or_else(|| panic!("Invalid chain name: {}", n)),
|
||||
}
|
||||
info!("Chain specification: {}", config.chain_spec);
|
||||
config.genesis_storage = genesis_storage;
|
||||
|
||||
let role =
|
||||
if matches.is_present("collator") {
|
||||
info!("Starting collator");
|
||||
service::Role::COLLATOR
|
||||
} else if matches.is_present("light") {
|
||||
info!("Starting (light)");
|
||||
service::Role::LIGHT
|
||||
} else if matches.is_present("validator") || matches.is_present("dev") {
|
||||
info!("Starting validator");
|
||||
service::Role::VALIDATOR
|
||||
} else {
|
||||
info!("Starting (heavy)");
|
||||
service::Role::FULL
|
||||
};
|
||||
|
||||
config.roles = role;
|
||||
{
|
||||
config.network.boot_nodes = matches
|
||||
.values_of("bootnodes")
|
||||
.map_or(Default::default(), |v| v.map(|n| n.to_owned()).collect());
|
||||
config.network.boot_nodes.extend(boot_nodes);
|
||||
config.network.config_path = Some(network_path(&base_path).to_string_lossy().into());
|
||||
config.network.net_config_path = config.network.config_path.clone();
|
||||
|
||||
@@ -206,14 +248,21 @@ pub fn run<I, T>(args: I) -> error::Result<()> where
|
||||
}
|
||||
|
||||
config.keys = matches.values_of("key").unwrap_or_default().map(str::to_owned).collect();
|
||||
if matches.is_present("dev") {
|
||||
config.keys.push("Alice".into());
|
||||
}
|
||||
|
||||
let sys_conf = SystemConfiguration {
|
||||
chain_name: config.chain_name.clone(),
|
||||
};
|
||||
|
||||
match role == service::Role::LIGHT {
|
||||
true => run_until_exit(core, service::new_light(config.clone())?, &matches, config),
|
||||
false => run_until_exit(core, service::new_full(config.clone())?, &matches, config),
|
||||
true => run_until_exit(core, service::new_light(config)?, &matches, sys_conf),
|
||||
false => run_until_exit(core, service::new_full(config)?, &matches, sys_conf),
|
||||
}
|
||||
}
|
||||
|
||||
fn run_until_exit<C>(mut core: reactor::Core, service: service::Service<C>, matches: &clap::ArgMatches, config: service::Configuration) -> error::Result<()>
|
||||
fn run_until_exit<C>(mut core: reactor::Core, service: service::Service<C>, matches: &clap::ArgMatches, sys_conf: SystemConfiguration) -> error::Result<()>
|
||||
where
|
||||
C: service::Components,
|
||||
client::error::Error: From<<<<C as service::Components>::Backend as client::backend::Backend<Block>>::State as state_machine::Backend>::Error>,
|
||||
@@ -240,7 +289,7 @@ fn run_until_exit<C>(mut core: reactor::Core, service: service::Service<C>, matc
|
||||
service.client(),
|
||||
chain,
|
||||
service.transaction_pool(),
|
||||
Configuration(config.clone()),
|
||||
sys_conf.clone(),
|
||||
)
|
||||
};
|
||||
(
|
||||
|
||||
Reference in New Issue
Block a user