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
```
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
`--branch v0.1` 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.
`--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 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
@@ -28,22 +39,11 @@ You can run a simple single-node development "network" on your machine by
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.
### 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
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:
```
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"
dependencies = [
"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)",
"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)",
+6 -5
View File
@@ -27,8 +27,8 @@ pub enum ChainSpec {
Development,
/// Whatever the current runtime is, with simple Alice/Bob auths.
LocalTestnet,
/// The PoC-1 testnet.
PoC1Testnet,
/// The PoC-1 & PoC-2 era testnet.
KrummeLanke,
/// Whatever the current runtime is with the "global testnet" defaults.
StagingTestnet,
/// Custom Genesis file.
@@ -39,7 +39,7 @@ pub enum ChainSpec {
impl ChainSpec {
pub(crate) fn load(self) -> Result<service::ChainSpec, String> {
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::LocalTestnet => service::chain_spec::local_testnet_config(),
ChainSpec::StagingTestnet => service::chain_spec::staging_testnet_config(),
@@ -53,7 +53,8 @@ impl<'a> From<&'a str> for ChainSpec {
match s {
"dev" => ChainSpec::Development,
"local" => ChainSpec::LocalTestnet,
"poc-1" => ChainSpec::PoC1Testnet,
"poc-1" => ChainSpec::KrummeLanke,
"krummelanke" => ChainSpec::KrummeLanke,
"staging" => ChainSpec::StagingTestnet,
s => ChainSpec::Custom(s.into()),
}
@@ -65,7 +66,7 @@ impl From<ChainSpec> for String {
match s {
ChainSpec::Development => "dev".into(),
ChainSpec::LocalTestnet => "local".into(),
ChainSpec::PoC1Testnet => "poc-1".into(),
ChainSpec::KrummeLanke => "krummelanke".into(),
ChainSpec::StagingTestnet => "staging".into(),
ChainSpec::Custom(f) => format!("custom ({})", f),
}
+2 -2
View File
@@ -69,7 +69,7 @@ args:
- chain:
long: chain
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
- pruning:
long: pruning
@@ -118,7 +118,7 @@ subcommands:
- chain:
long: chain
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
- export-blocks:
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> {
let chain_spec = matches.value_of("chain")
.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 {
ChainSpec::PoC1Testnet | ChainSpec::StagingTestnet => true,
ChainSpec::KrummeLanke | ChainSpec::StagingTestnet => true,
_ => false,
};
let spec = chain_spec.load()?;
+1
View File
@@ -847,6 +847,7 @@ name = "substrate-runtime-primitives"
version = "0.1.0"
dependencies = [
"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)",
"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)",
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;
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 {
@@ -20,7 +20,7 @@ use std::cmp::Ordering;
use parking_lot::Mutex;
use std::collections::HashMap;
use wasmi::{
Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder,
Module, ModuleInstance, MemoryInstance, MemoryRef, TableRef, ImportsBuilder, self
};
use wasmi::RuntimeValue::{I32, I64};
use wasmi::memory_units::{Pages, Bytes};
@@ -28,7 +28,7 @@ use state_machine::{Externalities, CodeExecutor};
use error::{Error, ErrorKind, Result};
use wasm_utils::UserError;
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 triehash::ordered_trie_root;
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 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) {
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 {
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);
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"))?;
debug_trace!(target: "wasm-trace", "*** Clearing storage: {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage))
format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else {
format!(" {}", ascii_format(&key))
format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
}, HexDisplay::from(&key));
this.ext.clear_storage(&key);
Ok(())
@@ -234,9 +234,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage))
format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else {
format!(" {}", ascii_format(&key))
format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
},
if let Some(ref b) = maybe_value {
format!("{}", HexDisplay::from(b))
@@ -264,9 +264,9 @@ impl_function_executor!(this: FunctionExecutor<'e, E>,
let maybe_value = this.ext.storage(&key);
debug_trace!(target: "wasm-trace", "*** Getting storage: {} == {} [k={}]",
if let Some(_preimage) = this.hash_lookup.get(&key) {
format!("%{}", ascii_format(&_preimage))
format!("%{}", ::primitives::hexdisplay::ascii_format(&_preimage))
} else {
format!(" {}", ascii_format(&key))
format!(" {}", ::primitives::hexdisplay::ascii_format(&key))
},
if let Some(ref b) = maybe_value {
format!("{}", HexDisplay::from(b))
@@ -557,7 +557,7 @@ impl WasmExecutor {
let size = data.len() as u32;
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(
method,
+3 -3
View File
@@ -68,11 +68,11 @@ pub fn clear_storage(key: &[u8]) {
);
}
/// Clear the storage of some particular key.
pub fn exists_storage(key: &[u8]) {
/// Check whether a given `key` exists in storage.
pub fn exists_storage(key: &[u8]) -> bool {
ext::with(|ext|
ext.exists_storage(key)
);
).unwrap_or(false)
}
/// 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.
pub fn exists_storage(key: &[u8]) {
/// Determine whether a particular key exists in storage.
pub fn exists_storage(key: &[u8]) -> bool {
unsafe {
ext_exists_storage(
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.
pub fn get<T: Codec + Sized>(key: &[u8]) -> Option<T> {
let key = twox_128(key);
@@ -47,7 +63,7 @@ pub fn get<T: Codec + Sized>(key: &[u8]) -> Option<T> {
key: &key[..],
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.
pub fn exists(key: &[u8]) -> bool {
let mut x = [0u8; 0];
runtime_io::read_storage(&twox_128(key)[..], &mut x[..], 0).is_some()
runtime_io::exists_storage(&twox_128(key)[..])
}
/// 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,
execution_strategy: ExecutionStrategy::Both,
min_heap_pages: 8,
max_heap_pages: 512,
max_heap_pages: 1024,
};
configuration.network.boot_nodes = configuration.chain_spec.boot_nodes().to_vec();
configuration
+1
View File
@@ -700,6 +700,7 @@ name = "substrate-runtime-primitives"
version = "0.1.0"
dependencies = [
"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)",
"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)",