Final tweaks for PoC-2 runtime upgrade (#348)

* Final tweaks for PoC-2 runtime upgrade

* Address grumble

* Avoid slow wasm

* New poc-2-era bootnodes

* Fix warning

* Typo

* Fix for allocation in wasm

* Fix & runtimes.

* PoC-1 should be default.

* Name testnet Krumme Lanke, update README

* YML update

* Use the right port
This commit is contained in:
Gav Wood
2018-07-17 18:55:28 +02:00
committed by GitHub
parent 428682d3b5
commit 07fbd871d9
22 changed files with 76 additions and 51 deletions
+17 -17
View File
@@ -12,15 +12,26 @@ curl https://sh.rustup.rs -sSf | sh
sudo apt install make clang sudo apt install make clang
``` ```
Then, install Polkadot PoC-1: Then, install Polkadot PoC-2:
``` ```
cargo install --git https://github.com/paritytech/polkadot.git --branch v0.1 cargo install --git https://github.com/paritytech/polkadot.git --branch v0.2
``` ```
You'll now have a `polkadot` binary installed to your `PATH`. You can drop the You'll now have a `polkadot` binary installed to your `PATH`. You can drop the
`--branch v0.1` or run `cargo install --git https://github.com/paritytech/polkadot.git polkadot` `--branch v0.2` or run `cargo install --git https://github.com/paritytech/polkadot.git polkadot`
to get the very latest version of Polkadot, but these instructions will not work in that case. to get the very latest version of Polkadot, but these instructions might not work in that case.
### Krumme Lanke Testnet
You will connect to the global Krumme Lanke testnet by default. To do this, just use:
```
polkadot
```
If you want to do anything on it (not that there's much to do), then you'll need
to get some Krumme Lanke DOTs. Ask in the Polkadot watercooler.
### Development ### Development
@@ -28,22 +39,11 @@ You can run a simple single-node development "network" on your machine by
running in a terminal: running in a terminal:
``` ```
polkadot --chain=dev --validator --key Alice polkadot --dev
``` ```
You can muck around by cloning and building the http://github.com/paritytech/polka-ui and http://github.com/paritytech/polkadot-ui or just heading to https://polkadot.js.org/apps. You can muck around by cloning and building the http://github.com/paritytech/polka-ui and http://github.com/paritytech/polkadot-ui or just heading to https://polkadot.js.org/apps.
### PoC-1 Testnet
You can also connect to the global PoC-1 testnet. To do this, just use:
```
polkadot --chain=poc-1
```
If you want to do anything on it (not that there's much to do), then you'll need
to get some PoC-1 testnet DOTs. Ask in the Polkadot watercooler.
## Local Two-node Testnet ## Local Two-node Testnet
If you want to see the multi-node consensus algorithm in action locally, then If you want to see the multi-node consensus algorithm in action locally, then
@@ -99,5 +99,5 @@ cargo test --all
You can start a development chain with: You can start a development chain with:
``` ```
cargo run -- --chain=dev --validator --key Alice cargo run -- --dev
``` ```
+1
View File
@@ -847,6 +847,7 @@ name = "substrate-runtime-primitives"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)",
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",
+6 -5
View File
@@ -27,8 +27,8 @@ pub enum ChainSpec {
Development, Development,
/// Whatever the current runtime is, with simple Alice/Bob auths. /// Whatever the current runtime is, with simple Alice/Bob auths.
LocalTestnet, LocalTestnet,
/// The PoC-1 testnet. /// The PoC-1 & PoC-2 era testnet.
PoC1Testnet, KrummeLanke,
/// Whatever the current runtime is with the "global testnet" defaults. /// Whatever the current runtime is with the "global testnet" defaults.
StagingTestnet, StagingTestnet,
/// Custom Genesis file. /// Custom Genesis file.
@@ -39,7 +39,7 @@ pub enum ChainSpec {
impl ChainSpec { impl ChainSpec {
pub(crate) fn load(self) -> Result<service::ChainSpec, String> { pub(crate) fn load(self) -> Result<service::ChainSpec, String> {
Ok(match self { Ok(match self {
ChainSpec::PoC1Testnet => service::chain_spec::poc_1_testnet_config()?, ChainSpec::KrummeLanke => service::chain_spec::poc_1_testnet_config()?,
ChainSpec::Development => service::chain_spec::development_config(), ChainSpec::Development => service::chain_spec::development_config(),
ChainSpec::LocalTestnet => service::chain_spec::local_testnet_config(), ChainSpec::LocalTestnet => service::chain_spec::local_testnet_config(),
ChainSpec::StagingTestnet => service::chain_spec::staging_testnet_config(), ChainSpec::StagingTestnet => service::chain_spec::staging_testnet_config(),
@@ -53,7 +53,8 @@ impl<'a> From<&'a str> for ChainSpec {
match s { match s {
"dev" => ChainSpec::Development, "dev" => ChainSpec::Development,
"local" => ChainSpec::LocalTestnet, "local" => ChainSpec::LocalTestnet,
"poc-1" => ChainSpec::PoC1Testnet, "poc-1" => ChainSpec::KrummeLanke,
"krummelanke" => ChainSpec::KrummeLanke,
"staging" => ChainSpec::StagingTestnet, "staging" => ChainSpec::StagingTestnet,
s => ChainSpec::Custom(s.into()), s => ChainSpec::Custom(s.into()),
} }
@@ -65,7 +66,7 @@ impl From<ChainSpec> for String {
match s { match s {
ChainSpec::Development => "dev".into(), ChainSpec::Development => "dev".into(),
ChainSpec::LocalTestnet => "local".into(), ChainSpec::LocalTestnet => "local".into(),
ChainSpec::PoC1Testnet => "poc-1".into(), ChainSpec::KrummeLanke => "krummelanke".into(),
ChainSpec::StagingTestnet => "staging".into(), ChainSpec::StagingTestnet => "staging".into(),
ChainSpec::Custom(f) => format!("custom ({})", f), ChainSpec::Custom(f) => format!("custom ({})", f),
} }
+2 -2
View File
@@ -69,7 +69,7 @@ args:
- chain: - chain:
long: chain long: chain
value_name: CHAIN_SPEC value_name: CHAIN_SPEC
help: Specify the chain specification (one of poc-1, dev, local or staging) help: Specify the chain specification (one of krummelanke, dev, local or staging)
takes_value: true takes_value: true
- pruning: - pruning:
long: pruning long: pruning
@@ -118,7 +118,7 @@ subcommands:
- chain: - chain:
long: chain long: chain
value_name: CHAIN_SPEC value_name: CHAIN_SPEC
help: Specify the chain specification (one of poc-1, dev, local or staging) help: Specify the chain specification (one of krummelanke, dev, local or staging)
takes_value: true takes_value: true
- export-blocks: - export-blocks:
about: Export blocks to a file about: Export blocks to a file
+2 -2
View File
@@ -111,9 +111,9 @@ impl substrate_rpc::system::SystemApi for SystemConfiguration {
fn load_spec(matches: &clap::ArgMatches) -> Result<(service::ChainSpec, bool), String> { fn load_spec(matches: &clap::ArgMatches) -> Result<(service::ChainSpec, bool), String> {
let chain_spec = matches.value_of("chain") let chain_spec = matches.value_of("chain")
.map(ChainSpec::from) .map(ChainSpec::from)
.unwrap_or_else(|| if matches.is_present("dev") { ChainSpec::Development } else { ChainSpec::StagingTestnet }); .unwrap_or_else(|| if matches.is_present("dev") { ChainSpec::Development } else { ChainSpec::KrummeLanke });
let is_global = match chain_spec { let is_global = match chain_spec {
ChainSpec::PoC1Testnet | ChainSpec::StagingTestnet => true, ChainSpec::KrummeLanke | ChainSpec::StagingTestnet => true,
_ => false, _ => false,
}; };
let spec = chain_spec.load()?; let spec = chain_spec.load()?;
+1
View File
@@ -847,6 +847,7 @@ name = "substrate-runtime-primitives"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)",
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -23,7 +23,7 @@ use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyC
use service::ChainSpec; use service::ChainSpec;
pub fn poc_1_testnet_config() -> Result<ChainSpec<GenesisConfig>, String> { pub fn poc_1_testnet_config() -> Result<ChainSpec<GenesisConfig>, String> {
ChainSpec::from_embedded(include_bytes!("../res/poc-1.json")) ChainSpec::from_embedded(include_bytes!("../res/krummelanke.json"))
} }
fn staging_testnet_config_genesis() -> GenesisConfig { fn staging_testnet_config_genesis() -> GenesisConfig {
@@ -20,7 +20,7 @@ use std::cmp::Ordering;
use parking_lot::Mutex; use parking_lot::Mutex;
use std::collections::HashMap; use std::collections::HashMap;
use wasmi::{ use wasmi::{
Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, self
}; };
use wasmi::RuntimeValue::{I32, I64}; use wasmi::RuntimeValue::{I32, I64};
use wasmi::memory_units::{Pages, Bytes}; use wasmi::memory_units::{Pages, Bytes};
@@ -28,7 +28,7 @@ use state_machine::{Externalities, CodeExecutor};
use error::{Error, ErrorKind, Result}; use error::{Error, ErrorKind, Result};
use wasm_utils::UserError; use wasm_utils::UserError;
use primitives::{blake2_256, twox_128, twox_256}; use primitives::{blake2_256, twox_128, twox_256};
use primitives::hexdisplay::{HexDisplay, ascii_format}; use primitives::hexdisplay::HexDisplay;
use primitives::sandbox as sandbox_primitives; use primitives::sandbox as sandbox_primitives;
use triehash::ordered_trie_root; use triehash::ordered_trie_root;
use sandbox; use sandbox;
@@ -200,9 +200,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?; let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_set_storage"))?;
let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?; let value = this.memory.get(value_data, value_len as usize).map_err(|_| UserError("Invalid attempt to determine value in ext_set_storage"))?;
if let Some(_preimage) = this.hash_lookup.get(&key) { if let Some(_preimage) = this.hash_lookup.get(&key) {
debug_trace!(target: "wasm-trace", "*** Setting storage: %{} -> {} [k={}]", ascii_format(&_preimage), HexDisplay::from(&value), HexDisplay::from(&key)); debug_trace!(target: "wasm-trace", "*** Setting storage: %{} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&_preimage), HexDisplay::from(&value), HexDisplay::from(&key));
} else { } else {
debug_trace!(target: "wasm-trace", "*** Setting storage: {} -> {} [k={}]", ascii_format(&key), HexDisplay::from(&value), HexDisplay::from(&key)); debug_trace!(target: "wasm-trace", "*** Setting storage: {} -> {} [k={}]", ::primitives::hexdisplay::ascii_format(&key), HexDisplay::from(&value), HexDisplay::from(&key));
} }
this.ext.set_storage(key, value); this.ext.set_storage(key, value);
Ok(()) Ok(())
@@ -211,9 +211,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?; let key = this.memory.get(key_data, key_len as usize).map_err(|_| UserError("Invalid attempt to determine key in ext_clear_storage"))?;
debug_trace!(target: "wasm-trace", "*** Clearing storage: {} [k={}]", debug_trace!(target: "wasm-trace", "*** Clearing storage: {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) { if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage)) format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else { } else {
format!(" {}", ascii_format(&key)) format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
}, HexDisplay::from(&key)); }, HexDisplay::from(&key));
this.ext.clear_storage(&key); this.ext.clear_storage(&key);
Ok(()) Ok(())
@@ -234,9 +234,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) { if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage)) format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else { } else {
format!(" {}", ascii_format(&key)) format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
}, },
if let Some(ref b) = maybe_value { if let Some(ref b) = maybe_value {
format!("{}", HexDisplay::from(b)) format!("{}", HexDisplay::from(b))
@@ -264,9 +264,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
let maybe_value = this.ext.storage(&key); let maybe_value = this.ext.storage(&key);
debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]", debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) { if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage)) format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else { } else {
format!(" {}", ascii_format(&key)) format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
}, },
if let Some(ref b) = maybe_value { if let Some(ref b) = maybe_value {
format!("{}", HexDisplay::from(b)) format!("{}", HexDisplay::from(b))
@@ -557,7 +557,7 @@ impl WasmExecutor {
let size = data.len() as u32; let size = data.len() as u32;
let offset = fec.heap.allocate(size); let offset = fec.heap.allocate(size);
memory.set(offset, &data).expect("heap always gives a sensible offset to write"); memory.set(offset, &data).map_err(|_: wasmi::Error| Error::from(ErrorKind::PleaseRetry))?;
let result = instance.invoke_export( let result = instance.invoke_export(
method, method,
+3 -3
View File
@@ -68,11 +68,11 @@ pub fn clear_storage(key: &[u8]) {
); );
} }
/// Clear the storage of some particular key. /// Check whether a given `key` exists in storage.
pub fn exists_storage(key: &[u8]) { pub fn exists_storage(key: &[u8]) -> bool {
ext::with(|ext| ext::with(|ext|
ext.exists_storage(key) ext.exists_storage(key)
); ).unwrap_or(false)
} }
/// Clear the storage entries key of which starts with the given prefix. /// Clear the storage entries key of which starts with the given prefix.
@@ -101,12 +101,12 @@ pub fn clear_storage(key: &[u8]) {
} }
} }
/// Clear the storage of some particular key. /// Determine whether a particular key exists in storage.
pub fn exists_storage(key: &[u8]) { pub fn exists_storage(key: &[u8]) -> bool {
unsafe { unsafe {
ext_exists_storage( ext_exists_storage(
key.as_ptr(), key.len() as u32 key.as_ptr(), key.len() as u32
) != 0; ) != 0
} }
} }
@@ -39,6 +39,22 @@ impl<'a> Input for IncrementalInput<'a> {
} }
} }
// TODO: only introduce this wrapper for types where it makes sense, ideally have it within the module declaration.
struct AppendZeroes<'a, I: Input + 'a> {
input: &'a mut I,
}
impl<'a, I: Input + 'a> Input for AppendZeroes<'a, I> {
fn read(&mut self, into: &mut [u8]) -> usize {
let r = self.input.read(into);
for z in &mut into[r..] {
*z = 0;
};
into.len()
}
}
/// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry.
pub fn get<T: Codec + Sized>(key: &[u8]) -> Option<T> { pub fn get<T: Codec + Sized>(key: &[u8]) -> Option<T> {
let key = twox_128(key); let key = twox_128(key);
@@ -47,7 +63,7 @@ pub fn get<T: Codec + Sized>(key: &[u8]) -> Option<T> {
key: &key[..], key: &key[..],
pos: 0, pos: 0,
}; };
Decode::decode(&mut input).expect("storage is not null, therefore must be a valid type") Decode::decode(&mut AppendZeroes { input: &mut input } ).expect("storage is not null, therefore must be a valid type")
}) })
} }
@@ -103,8 +119,7 @@ pub fn take_or_else<T: Codec + Sized, F: FnOnce() -> T>(key: &[u8], default_valu
/// Check to see if `key` has an explicit entry in storage. /// Check to see if `key` has an explicit entry in storage.
pub fn exists(key: &[u8]) -> bool { pub fn exists(key: &[u8]) -> bool {
let mut x = [0u8; 0]; runtime_io::exists_storage(&twox_128(key)[..])
runtime_io::read_storage(&twox_128(key)[..], &mut x[..], 0).is_some()
} }
/// Ensure `key` has no explicit entry in storage. /// Ensure `key` has no explicit entry in storage.
+1 -1
View File
@@ -71,7 +71,7 @@ impl<G: Serialize + DeserializeOwned + BuildStorage> Configuration<G> {
pruning: PruningMode::ArchiveAll, pruning: PruningMode::ArchiveAll,
execution_strategy: ExecutionStrategy::Both, execution_strategy: ExecutionStrategy::Both,
min_heap_pages: 8, min_heap_pages: 8,
max_heap_pages: 512, max_heap_pages: 1024,
}; };
configuration.network.boot_nodes = configuration.chain_spec.boot_nodes().to_vec(); configuration.network.boot_nodes = configuration.chain_spec.boot_nodes().to_vec();
configuration configuration
+1
View File
@@ -700,6 +700,7 @@ name = "substrate-runtime-primitives"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)",
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)",