Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all 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
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,37 @@ 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.

### Development
### Krumme Lanke Testnet

You can run a simple single-node development "network" on your machine by
running in a terminal:
You will connect to the global Krumme Lanke testnet by default. To do this, just use:

```
polkadot --chain=dev --validator --key Alice
polkadot
```

You can muck around by cloning and building the https://github.com/paritytech/polka-ui and https://github.com/paritytech/polkadot-ui or just heading to https://polkadot.js.org/apps.
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.

### PoC-1 Testnet
### Development

You can also connect to the global PoC-1 testnet. To do this, just use:
You can run a simple single-node development "network" on your machine by
running in a terminal:

```
polkadot --chain=poc-1
polkadot --dev
```

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.
You can muck around by cloning and building the https://github.com/paritytech/polka-ui and https://github.com/paritytech/polkadot-ui or just heading to https://polkadot.js.org/apps.

## Local Two-node Testnet

Expand Down Expand Up @@ -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 change: 1 addition & 0 deletions demo/runtime/wasm/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file not shown.
11 changes: 6 additions & 5 deletions polkadot/cli/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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(),
Expand All @@ -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()),
}
Expand All @@ -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),
}
Expand Down
4 changes: 2 additions & 2 deletions polkadot/cli/src/cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions polkadot/cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()?;
Expand Down
1 change: 1 addition & 0 deletions polkadot/runtime/wasm/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file not shown.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion polkadot/service/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
22 changes: 11 additions & 11 deletions substrate/executor/src/wasm_executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ 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};
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;
Expand Down Expand Up @@ -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(())
Expand All @@ -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(())
Expand All @@ -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))
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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,
Expand Down
Binary file not shown.
Binary file not shown.
6 changes: 3 additions & 3 deletions substrate/runtime-io/with_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions substrate/runtime-io/without_std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down
21 changes: 18 additions & 3 deletions substrate/runtime-support/src/storage/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Virtual dispatch here is really unnecessary and it might have a significant cost if it occurs on every call to storage::get

})
}

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion substrate/service/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions substrate/test-runtime/wasm/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file not shown.