From ab710bf94c3cfa456828122b7924b190ab2ad99c Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 4 Sep 2018 14:08:24 +0200 Subject: [PATCH 01/14] Updating substrate-demo --- Cargo.lock | 852 +++++++++++------- Cargo.toml | 6 + demo/Cargo.toml | 18 + demo/api/Cargo.toml | 13 + demo/api/src/lib.rs | 154 ++++ demo/build.rs | 24 + demo/cli/Cargo.toml | 23 +- demo/cli/src/lib.rs | 295 ++---- demo/consensus/Cargo.toml | 27 + demo/consensus/README.adoc | 5 + demo/consensus/src/error.rs | 55 ++ demo/consensus/src/evaluation.rs | 96 ++ demo/consensus/src/lib.rs | 508 +++++++++++ demo/consensus/src/offline_tracker.rs | 137 +++ demo/consensus/src/service.rs | 193 ++++ demo/network/Cargo.toml | 19 + demo/network/src/consensus.rs | 286 ++++++ demo/network/src/lib.rs | 119 +++ demo/primitives/Cargo.toml | 2 + demo/primitives/src/lib.rs | 45 +- demo/runtime/src/checked_block.rs | 94 ++ demo/runtime/src/lib.rs | 16 +- demo/runtime/wasm/Cargo.lock | 1 + demo/runtime/wasm/build.sh | 2 +- .../release/demo_runtime.compact.wasm | Bin 276611 -> 215780 bytes .../release/demo_runtime.wasm | Bin 276696 -> 276735 bytes demo/service/Cargo.toml | 27 + demo/service/src/chain_spec.rs | 196 ++++ demo/service/src/lib.rs | 214 +++++ demo/src/main.rs | 41 +- demo/transaction-pool/Cargo.toml | 19 + demo/transaction-pool/src/error.rs | 73 ++ demo/transaction-pool/src/lib.rs | 237 +++++ substrate/client/src/client.rs | 47 +- substrate/client/src/light/call_executor.rs | 9 + substrate/primitives/src/hasher.rs | 2 +- substrate/service/src/lib.rs | 2 +- 37 files changed, 3297 insertions(+), 560 deletions(-) create mode 100644 demo/Cargo.toml create mode 100644 demo/api/Cargo.toml create mode 100644 demo/api/src/lib.rs create mode 100644 demo/build.rs create mode 100644 demo/consensus/Cargo.toml create mode 100644 demo/consensus/README.adoc create mode 100644 demo/consensus/src/error.rs create mode 100644 demo/consensus/src/evaluation.rs create mode 100644 demo/consensus/src/lib.rs create mode 100644 demo/consensus/src/offline_tracker.rs create mode 100644 demo/consensus/src/service.rs create mode 100644 demo/network/Cargo.toml create mode 100644 demo/network/src/consensus.rs create mode 100644 demo/network/src/lib.rs create mode 100644 demo/runtime/src/checked_block.rs create mode 100644 demo/service/Cargo.toml create mode 100644 demo/service/src/chain_spec.rs create mode 100644 demo/service/src/lib.rs create mode 100644 demo/transaction-pool/Cargo.toml create mode 100644 demo/transaction-pool/src/error.rs create mode 100644 demo/transaction-pool/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 47dbf267959c0..08cbf892bfc03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,34 @@ +[[package]] +name = "aes-ctr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aes-soft 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aesni 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aes-soft" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "aesni" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "aho-corasick" version = "0.6.4" @@ -12,12 +43,12 @@ version = "0.1.0" source = "git+https://github.com/paritytech/aio-limited.git#1f42497dcd2a6f85b83af97cd80314b26a1e4a9e" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -80,7 +111,7 @@ name = "atty" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -92,7 +123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -103,14 +134,9 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base-x" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "base58" version = "0.1.0" @@ -160,6 +186,11 @@ dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "bitflags" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bitflags" version = "0.9.1" @@ -188,6 +219,14 @@ dependencies = [ "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "block-cipher-trait" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bs58" version = "0.2.0" @@ -221,9 +260,6 @@ dependencies = [ name = "cc" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "cfg-if" @@ -249,16 +285,6 @@ dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "cid" -version = "0.2.3" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" -dependencies = [ - "integer-encoding 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.8.1-pre (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", -] - [[package]] name = "clap" version = "2.32.0" @@ -301,7 +327,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -309,7 +335,7 @@ name = "core-foundation-sys" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -383,60 +409,93 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crunchy" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ctr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ctrlc" version = "1.1.1" source = "git+https://github.com/paritytech/rust-ctrlc.git#b523017108bb2d571a7a69bd97bc406e63bc7a9d" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "datastore" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "chashmap 2.2.1 (git+https://github.com/redox-os/tfs)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "demo-api" +version = "0.1.0" +dependencies = [ + "demo-primitives 0.1.0", + "demo-runtime 0.1.0", + "substrate-client 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", ] [[package]] name = "demo-cli" version = "0.1.0" dependencies = [ - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", - "demo-executor 0.1.0", + "demo-service 0.1.0", + "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-cli 0.3.0", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "demo-consensus" +version = "0.1.0" +dependencies = [ + "demo-api 0.1.0", "demo-primitives 0.1.0", "demo-runtime 0.1.0", + "demo-transaction-pool 0.1.0", "ed25519 0.1.0", - "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bft 0.1.0", "substrate-client 0.1.0", "substrate-codec 0.1.0", - "substrate-executor 0.1.0", - "substrate-extrinsic-pool 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", - "substrate-rpc 0.1.0", - "substrate-rpc-servers 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-state-machine 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-support 0.1.0", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -463,6 +522,24 @@ dependencies = [ "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "demo-network" +version = "0.1.0" +dependencies = [ + "demo-api 0.1.0", + "demo-consensus 0.1.0", + "demo-primitives 0.1.0", + "ed25519 0.1.0", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-bft 0.1.0", + "substrate-network 0.1.0", + "substrate-primitives 0.1.0", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "demo-primitives" version = "0.1.0" @@ -471,6 +548,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-codec-derive 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -508,6 +586,52 @@ dependencies = [ "substrate-runtime-version 0.1.0", ] +[[package]] +name = "demo-service" +version = "0.1.0" +dependencies = [ + "demo-api 0.1.0", + "demo-consensus 0.1.0", + "demo-executor 0.1.0", + "demo-network 0.1.0", + "demo-primitives 0.1.0", + "demo-runtime 0.1.0", + "demo-transaction-pool 0.1.0", + "ed25519 0.1.0", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 0.1.0", + "substrate-network 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-service 0.3.0", + "substrate-telemetry 0.3.0", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "demo-transaction-pool" +version = "0.1.0" +dependencies = [ + "demo-api 0.1.0", + "demo-primitives 0.1.0", + "demo-runtime 0.1.0", + "ed25519 0.1.0", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 0.1.0", + "substrate-codec 0.1.0", + "substrate-extrinsic-pool 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", +] + [[package]] name = "difference" version = "1.0.0" @@ -626,7 +750,7 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "timer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -661,6 +785,19 @@ dependencies = [ "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ethereum-types" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ethereum-types-serialize" version = "0.2.1" @@ -715,7 +852,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -724,20 +861,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "fixed-hash" -version = "0.2.2" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +version = "0.2.3" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -763,7 +900,7 @@ name = "fs-swap" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -820,7 +957,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -828,7 +965,7 @@ dependencies = [ [[package]] name = "hashdb" version = "0.2.1" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -898,7 +1035,7 @@ dependencies = [ "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -942,7 +1079,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -965,7 +1102,7 @@ version = "8.0.2" source = "git+https://github.com/paritytech/jsonrpc.git#7e5df8ca2acc01c608b2d2bd8cdcdb19d8cbaa90" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", @@ -979,7 +1116,7 @@ dependencies = [ "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1000,7 +1137,7 @@ version = "8.0.1" source = "git+https://github.com/paritytech/jsonrpc.git#7e5df8ca2acc01c608b2d2bd8cdcdb19d8cbaa90" dependencies = [ "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1012,7 +1149,7 @@ dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1025,9 +1162,9 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "ws 0.7.5 (git+https://github.com/tomusdrw/ws-rs)", ] @@ -1053,7 +1190,7 @@ dependencies = [ [[package]] name = "kvdb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)", @@ -1062,7 +1199,7 @@ dependencies = [ [[package]] name = "kvdb-memorydb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1070,19 +1207,18 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +version = "0.1.3" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fs-swap 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rocksdb 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)", ] [[package]] @@ -1107,32 +1243,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.41" +version = "0.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-dns 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-floodsub 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-identify 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-kad 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-mplex 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-peerstore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-ping 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-ratelimit 0.1.1 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-relay 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-secio 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-tcp-transport 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-transport-timeout 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-websocket 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-yamux 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1142,20 +1279,20 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "multihash 0.8.1-pre (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "multistream-select 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1163,12 +1300,12 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "tokio-dns-unofficial 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1176,96 +1313,96 @@ dependencies = [ [[package]] name = "libp2p-floodsub" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-identify" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-peerstore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-kad" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-identify 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-ping 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-mplex" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-peerstore" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1274,14 +1411,14 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "multistream-select 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1291,12 +1428,12 @@ dependencies = [ [[package]] name = "libp2p-ratelimit" version = "0.1.1" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "aio-limited 0.1.0 (git+https://github.com/paritytech/aio-limited.git)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1304,37 +1441,37 @@ dependencies = [ [[package]] name = "libp2p-relay" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "libp2p-peerstore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-secio" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ + "aes-ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1342,12 +1479,12 @@ dependencies = [ [[package]] name = "libp2p-tcp-transport" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "tk-listen 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1356,24 +1493,36 @@ dependencies = [ [[package]] name = "libp2p-transport-timeout" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libp2p-uds" +version = "0.1.0" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "tokio-uds 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-websocket" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "rw-stream-sink 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1382,12 +1531,13 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "yamux 0.1.0 (git+https://github.com/paritytech/yamux)", ] @@ -1421,12 +1571,12 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.1" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1447,7 +1597,7 @@ name = "memchr" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1463,13 +1613,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memorydb" version = "0.2.1" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "plain_hasher 0.2.0 (git+https://github.com/paritytech/parity-common)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "rlp 0.2.4 (git+https://github.com/paritytech/parity-common)", ] [[package]] @@ -1498,14 +1648,24 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-uds" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "miow" version = "0.2.1" @@ -1520,25 +1680,19 @@ dependencies = [ [[package]] name = "multiaddr" version = "0.3.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ + "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cid 0.2.3 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", "integer-encoding 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "multibase" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base-x 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "multihash" version = "0.8.1-pre" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "sha1 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1548,14 +1702,14 @@ dependencies = [ [[package]] name = "multistream-select" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1577,7 +1731,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1591,7 +1745,7 @@ version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1618,7 +1772,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1630,6 +1784,11 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "opaque-debug" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "openssl" version = "0.9.24" @@ -1638,7 +1797,7 @@ dependencies = [ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.33 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1648,7 +1807,7 @@ version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1664,20 +1823,49 @@ dependencies = [ [[package]] name = "parity-bytes" version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" [[package]] name = "parity-crypto" version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-rocksdb" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-rocksdb-sys 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-rocksdb-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-snappy-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parity-snappy-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parity-wasm" version = "0.31.0" @@ -1728,7 +1916,7 @@ name = "parking_lot_core" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1737,7 +1925,7 @@ dependencies = [ [[package]] name = "patricia-trie" version = "0.2.1" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common)", @@ -1759,7 +1947,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "plain_hasher" version = "0.2.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1834,7 +2022,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1862,7 +2050,7 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1872,7 +2060,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1883,7 +2071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1917,7 +2105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2008,15 +2196,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rlp" -version = "0.2.1" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2026,34 +2214,13 @@ dependencies = [ [[package]] name = "rlp" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" +version = "0.2.4" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rocksdb" -version = "0.4.5" -source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" -dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)", -] - -[[package]] -name = "rocksdb-sys" -version = "0.3.0" -source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" -dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)", + "ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2062,7 +2229,7 @@ version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2099,7 +2266,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.1.0" -source = "git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779#5159f3aeae2ba6cc7015c511816a5f965c444779" +source = "git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69#02576eecf140a06134519ed9438d061d99bb2e69" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2145,7 +2312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2155,7 +2322,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2242,7 +2409,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "slab" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2304,15 +2471,6 @@ dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "snappy-sys" -version = "0.1.0" -source = "git+https://github.com/paritytech/rust-snappy#40ac9a0d9fd613e7f38df800a11a589b7296da73" -dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "stable_deref_trait" version = "1.0.0" @@ -2323,6 +2481,14 @@ name = "stdweb" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "stream-cipher" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "strsim" version = "0.7.0" @@ -2401,7 +2567,7 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "rlp 0.2.4 (git+https://github.com/paritytech/parity-common)", "slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-bft 0.1.0", "substrate-codec 0.1.0", @@ -2424,7 +2590,7 @@ dependencies = [ "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common)", - "kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity-common)", + "kvdb-rocksdb 0.1.3 (git+https://github.com/paritytech/parity-common)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "memorydb 0.2.1 (git+https://github.com/paritytech/parity-common)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2456,6 +2622,17 @@ dependencies = [ "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-demo" +version = "0.1.0" +dependencies = [ + "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", + "demo-cli 0.1.0", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-executor" version = "0.1.0" @@ -2576,8 +2753,8 @@ dependencies = [ "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2587,8 +2764,8 @@ dependencies = [ "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2599,13 +2776,13 @@ dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "fixed-hash 0.2.2 (git+https://github.com/paritytech/parity-common)", + "fixed-hash 0.2.3 (git+https://github.com/paritytech/parity-common)", "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", "plain_hasher 0.2.0 (git+https://github.com/paritytech/parity-common)", "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "rlp 0.2.4 (git+https://github.com/paritytech/parity-common)", "rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2615,7 +2792,7 @@ dependencies = [ "substrate-serializer 0.1.0", "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.3.0 (git+https://github.com/paritytech/parity-common)", + "uint 0.4.1 (git+https://github.com/paritytech/parity-common)", "wasmi 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2984,7 +3161,7 @@ name = "substrate-state-db" version = "0.1.0" dependencies = [ "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-codec-derive 0.1.0", @@ -3003,10 +3180,10 @@ dependencies = [ "memorydb 0.2.1 (git+https://github.com/paritytech/parity-common)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.2.1 (git+https://github.com/paritytech/parity-common)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "rlp 0.2.4 (git+https://github.com/paritytech/parity-common)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", - "triehash 0.2.0 (git+https://github.com/paritytech/parity-common)", + "triehash 0.2.3 (git+https://github.com/paritytech/parity-common)", ] [[package]] @@ -3081,7 +3258,7 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3112,14 +3289,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "2.2.0" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3127,7 +3304,7 @@ name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3154,7 +3331,7 @@ name = "time" version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3181,7 +3358,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3199,7 +3376,7 @@ dependencies = [ "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3221,14 +3398,14 @@ dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3276,7 +3453,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3302,9 +3479,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3337,7 +3514,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3345,10 +3522,12 @@ dependencies = [ [[package]] name = "tokio-timer" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3370,12 +3549,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-uds" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trace-time" version = "0.1.0" @@ -3395,7 +3590,7 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "trace-time 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3413,12 +3608,12 @@ dependencies = [ [[package]] name = "triehash" -version = "0.2.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +version = "0.2.3" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common)", - "rlp 0.2.1 (git+https://github.com/paritytech/parity-common)", + "rlp 0.2.4 (git+https://github.com/paritytech/parity-common)", ] [[package]] @@ -3462,11 +3657,22 @@ dependencies = [ [[package]] name = "uint" -version = "0.3.0" -source = "git+https://github.com/paritytech/parity-common#22209e14805e5764f7fe81259324d34eab179264" +version = "0.4.1" +source = "git+https://github.com/paritytech/parity-common#5b31d79589162f2871173ca5f05668cf855aa766" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3519,11 +3725,10 @@ dependencies = [ [[package]] name = "unsigned-varint" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3557,6 +3762,15 @@ name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "vergen" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "version_check" version = "0.1.3" @@ -3593,7 +3807,7 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3700,7 +3914,7 @@ source = "git+https://github.com/paritytech/yamux#4e3ae609ad29cae56c249353be37a4 dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3708,6 +3922,9 @@ dependencies = [ ] [metadata] +"checksum aes-ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f65958ff3692041c36fc009261ccd63f24cd8e0dc1164266f068c2387e8b4e4f" +"checksum aes-soft 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "67cc03b0a090a05cb01e96998a01905d7ceedce1bc23b756c0bb7faa0682ccb1" +"checksum aesni 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6810b7fb9f2bb4f76f05ac1c170b8dde285b6308955dc3afd89710268c958d9e" "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum aio-limited 0.1.0 (git+https://github.com/paritytech/aio-limited.git)" = "" "checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" @@ -3721,17 +3938,18 @@ dependencies = [ "checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" "checksum backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbdd17cd962b570302f5297aea8648d5923e22e555c2ed2d8b2e34eca646bf6d" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" -"checksum base-x 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f59103b47307f76e03bef1633aec7fa9e29bfb5aa6daf5a334f94233c71f6c1" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum base64 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30e93c03064e7590d0466209155251b90c22e37fab1daf2771582598b5827557" "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" "checksum base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5032d51da2741729bfdaeb2664d9b8c6d9fd1e2b90715c660b6def36628499c2" "checksum base64 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9263aa6a38da271eec5c91a83ce1e800f093c8535788d403d626d8d5c3f8f007" "checksum bigint 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da1dde4308822ffaa13665757273a1b787481212f3f9b1c470a864b179a01f1b" +"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" +"checksum block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "370424437b9459f3dfd68428ed9376ddfe03d8b70ede29cc533b3557df186ab4" "checksum bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e6ea4851598d7433fbdba71fa2509d9b0df68124b9c0effe7588f5149692d9f" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" "checksum byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96c8b41881888cc08af32d47ac4edd52bc7fa27fef774be47a92443756451304" @@ -3741,7 +3959,6 @@ dependencies = [ "checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum chashmap 2.2.1 (git+https://github.com/redox-os/tfs)" = "" "checksum chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cce36c92cb605414e9b824f866f5babe0a0368e39ea07393b9b63cf3844c0e6" -"checksum cid 0.2.3 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" @@ -3756,9 +3973,11 @@ dependencies = [ "checksum crossbeam-epoch 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9b4e2817eb773f770dcb294127c011e22771899c21d18fce7dd739c0b9832e81" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" +"checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" +"checksum ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50ac3add446ec1f8fe3dc007cd838f5b22bbf33186394feac505451ecc43c018" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" -"checksum datastore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" +"checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3cae2388d706b52f2f2f9afe280f9d768be36544bd71d1b8120cb34ea6450b55" @@ -3774,6 +3993,7 @@ dependencies = [ "checksum ethcore-io 1.12.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "35b3c5a18bc5e73a32a110ac743ec04b02bbbcd3b71d3118d40a6113d509378a" "checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum etrace 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "5a3eb49b4ae7e88cc23caa812e8072c9f83a3e202e0b789ff4f9319cf796d8ca" @@ -3781,7 +4001,7 @@ dependencies = [ "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" -"checksum fixed-hash 0.2.2 (git+https://github.com/paritytech/parity-common)" = "" +"checksum fixed-hash 0.2.3 (git+https://github.com/paritytech/parity-common)" = "" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" @@ -3819,33 +4039,34 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity-common)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity-common)" = "" -"checksum kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity-common)" = "" +"checksum kvdb-rocksdb 0.1.3 (git+https://github.com/paritytech/parity-common)" = "" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" -"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" -"checksum libp2p 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-dns 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-floodsub 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-identify 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-kad 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-mplex 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-peerstore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-ping 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-relay 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-secio 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-websocket 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum libp2p-yamux 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" +"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ceb20f39ff7ae42f3ff9795f3986b1daad821caaa1e1732a0944103a5a1a66" "checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" "checksum mem 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" @@ -3855,11 +4076,11 @@ dependencies = [ "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b28683d0b09bbc20be1c9b3f6f24854efb1356ffcffee08ea3f6e65596e85fa" "checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" +"checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9c35dac080fd6e16a99924c8dfdef0af89d797dd851adab25feaffacf7850d6" -"checksum multihash 0.8.1-pre (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" -"checksum multistream-select 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" +"checksum multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" +"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" @@ -3869,11 +4090,15 @@ dependencies = [ "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" +"checksum opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d620c9c26834b34f039489ac0dfdb12c7ac15ccaf818350a64c9b5334a452ad7" "checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985" "checksum openssl-sys 0.9.33 (registry+https://github.com/rust-lang/crates.io-index)" = "d8abc04833dcedef24221a91852931df2f63e3369ae003134e70aff3645775cc" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)" = "" "checksum parity-crypto 0.1.0 (git+https://github.com/paritytech/parity-common)" = "" +"checksum parity-rocksdb 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cd55d2d6d6000ec99f021cf52c9acc7d2a402e14f95ced4c5de230696fabe00b" +"checksum parity-rocksdb-sys 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ae07d4bfb2759541957c19f471996b807fc09ef3a5bdce14409b57f038de49f" +"checksum parity-snappy-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c2086caac40c79289cb70d7e1c64f5888e1c53f5d38399d3e95101493739f423" "checksum parity-wasm 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1c91199d14bd5b78ecade323d4a891d094799749c1b9e82d9c590c2e2849a40" "checksum parity-wordlist 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0dec124478845b142f68b446cbee953d14d4b41f1bc0425024417720dce693" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" @@ -3912,17 +4137,15 @@ dependencies = [ "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e20523445e693f394c0e487113ae656071311c9ee4c1e914441bece8c929b21d" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (git+https://github.com/paritytech/parity-common)" = "" "checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" -"checksum rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)" = "" -"checksum rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)" = "" +"checksum rlp 0.2.4 (git+https://github.com/paritytech/parity-common)" = "" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b03280c2813907a030785570c577fb27d3deec8da4c18566751ade94de0ace" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" -"checksum rw-stream-sink 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=5159f3aeae2ba6cc7015c511816a5f965c444779)" = "" +"checksum rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=02576eecf140a06134519ed9438d061d99bb2e69)" = "" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum schannel 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "85fd9df495640643ad2d00443b3d78aae69802ad488debab4f1dd52fc1806ade" @@ -3941,7 +4164,7 @@ dependencies = [ "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" "checksum skeptic 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24ebf8a06f5f8bae61ae5bbc7af7aac4ef6907ae975130faba1199e5fe82256a" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" -"checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" +"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" "checksum slog 2.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2f7bfce6405155042d42ec0e645efe43eddedd7be280063ce0623b120014e7f9" "checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" "checksum slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddd14b8df2df39378b3e933c79784350bf715b11444d99f903df0253bbe524e5" @@ -3950,9 +4173,9 @@ dependencies = [ "checksum smallvec 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f90c5e5fe535e48807ab94fc611d323935f39d4660c52b26b96446a7b33aef10" "checksum smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1347484b6f8bc4b32a9323d9800b6d934376391002ad9c528cc659fe8afc08ee" "checksum smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "26df3bb03ca5eac2e64192b723d51f56c1b1e0860e7c766281f4598f181acdc8" -"checksum snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)" = "" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" "checksum stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" +"checksum stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "30dc6118470d69ce0fdcf7e6f95e95853f7f4f72f80d835d4519577c323814ab" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7f6353c2ee5407358d063a14cccc1630804527090a6fb5a9489ce4924280fb" "checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" @@ -3961,7 +4184,7 @@ dependencies = [ "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0" +"checksum tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b103c6d08d323b92ff42c8ce62abcd83ca8efa7fd5bf7927efefec75f58c76" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" @@ -3982,21 +4205,23 @@ dependencies = [ "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" "checksum tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c3873a6d8d0b636e024e77b9a82eaab6739578a06189ecd0e731c7308fbc5d" -"checksum tokio-timer 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1c76b4e97a4f61030edff8bd272364e4f731b9f54c7307eb4eb733c3926eb96a" +"checksum tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d03fa701f9578a01b7014f106b47f0a363b4727a7f3f75d666e312ab7acbbf1c" "checksum tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "772f4b04e560117fe3b0a53e490c16ddc8ba6ec437015d91fa385564996ed913" "checksum tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "137bda266504893ac4774e0ec4c2108f7ccdbcb7ac8dced6305fe9e4e0b5041a" +"checksum tokio-uds 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "424c1ed15a0132251813ccea50640b224c809d6ceafb88154c1a8775873a0e89" "checksum trace-time 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5aea07da6582e957c6e737eeb63a5af79e648eeeaaaba8fd9a417f1124bafa41" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum transaction-pool 1.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fdb8870eea404a57e2f62056ac45067a53a6207fd31866122356481d3c2e1a30" "checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" -"checksum triehash 0.2.0 (git+https://github.com/paritytech/parity-common)" = "" +"checksum triehash 0.2.3 (git+https://github.com/paritytech/parity-common)" = "" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" -"checksum uint 0.3.0 (git+https://github.com/paritytech/parity-common)" = "" +"checksum uint 0.4.1 (git+https://github.com/paritytech/parity-common)" = "" +"checksum uint 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "754ba11732b9161b94c41798e5197e5e75388d012f760c42adb5000353e98646" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" @@ -4004,12 +4229,13 @@ dependencies = [ "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5c1441164e5da61f00acd15f5a9e61939693c2c6e8b9fae36a220b82de7e212" +"checksum unsigned-varint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9d184b340077c4fdf63bc884a71c3c7d01e905167daf9003eb8131aaddb605" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum vcpkg 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7ed0f6789c8a85ca41bbc1c9d175422116a9869bd1cf31bb08e1493ecce60380" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +"checksum vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c3365f36c57e5df714a34be40902b27a992eeddb9996eca52d0584611cf885d" "checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2" diff --git a/Cargo.toml b/Cargo.toml index d853608a8f99d..6ad5efc0de402 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,10 +38,16 @@ members = [ "substrate/test-runtime", "substrate/telemetry", "substrate/keystore", + "demo", "demo/cli", + "demo/api", + "demo/consensus", "demo/executor", + "demo/network", "demo/primitives", "demo/runtime", + "demo/service", + "demo/transaction-pool", "subkey", ] exclude = [ diff --git a/demo/Cargo.toml b/demo/Cargo.toml new file mode 100644 index 0000000000000..5cf15a0d56e2f --- /dev/null +++ b/demo/Cargo.toml @@ -0,0 +1,18 @@ +[[bin]] +name = "substrate-demo" +path = "src/main.rs" + +[package] +name = "substrate-demo" +version = "0.1.0" +authors = ["Parity Technologies "] +build = "build.rs" + +[dependencies] +error-chain = "0.12" +demo-cli = { path = "cli" } +futures = "0.1" +ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } + +[build-dependencies] +vergen = "0.1" diff --git a/demo/api/Cargo.toml b/demo/api/Cargo.toml new file mode 100644 index 0000000000000..b03eb27a72541 --- /dev/null +++ b/demo/api/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "demo-api" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +demo-runtime = { path = "../runtime" } +demo-primitives = { path = "../primitives" } +substrate-client = { path = "../../substrate/client" } +substrate-primitives = { path = "../../substrate/primitives" } + +[dev-dependencies] +substrate-keyring = { path = "../../substrate/keyring" } diff --git a/demo/api/src/lib.rs b/demo/api/src/lib.rs new file mode 100644 index 0000000000000..cdf0de9b62a5e --- /dev/null +++ b/demo/api/src/lib.rs @@ -0,0 +1,154 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Strongly typed API for Substrate Demo runtime. + +#![warn(missing_docs)] +#![warn(unused_extern_crates)] + +extern crate demo_primitives as primitives; +extern crate demo_runtime as runtime; +extern crate substrate_client as client; +extern crate substrate_primitives; + +pub use client::error::{Error, ErrorKind, Result}; +use runtime::Address; +use client::backend::Backend; +use client::block_builder::BlockBuilder as ClientBlockBuilder; +use client::{Client, CallExecutor}; +use primitives::{ + AccountId, Block, BlockId, Hash, Index, InherentData, + SessionKey, Timestamp, UncheckedExtrinsic, +}; +use substrate_primitives::{KeccakHasher, RlpCodec}; + +/// Build new blocks. +pub trait BlockBuilder { + /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()>; + + /// Bake the block with provided extrinsics. + fn bake(self) -> Result; +} + +/// Trait encapsulating the demo API. +/// +/// All calls should fail when the exact runtime is unknown. +pub trait Api { + /// The block builder for this API type. + type BlockBuilder: BlockBuilder; + + /// Get session keys at a given block. + fn session_keys(&self, at: &BlockId) -> Result>; + + /// Get validators at a given block. + fn validators(&self, at: &BlockId) -> Result>; + + /// Get the value of the randomness beacon at a given block. + fn random_seed(&self, at: &BlockId) -> Result; + + /// Get the timestamp registered at a block. + fn timestamp(&self, at: &BlockId) -> Result; + + /// Get the nonce (né index) of an account at a block. + fn index(&self, at: &BlockId, account: AccountId) -> Result; + + /// Get the account id of an address at a block. + fn lookup(&self, at: &BlockId, address: Address) -> Result>; + + /// Evaluate a block. Returns true if the block is good, false if it is known to be bad, + /// and an error if we can't evaluate for some reason. + fn evaluate_block(&self, at: &BlockId, block: Block) -> Result; + + /// Build a block on top of the given, with inherent extrinsics pre-pushed. + fn build_block(&self, at: &BlockId, inherent_data: InherentData) -> Result; + + /// Attempt to produce the (encoded) inherent extrinsics for a block being built upon the given. + /// This may vary by runtime and will fail if a runtime doesn't follow the same API. + fn inherent_extrinsics(&self, at: &BlockId, inherent_data: InherentData) -> Result>; +} + +impl BlockBuilder for ClientBlockBuilder +where + B: Backend, + E: CallExecutor+ Clone, +{ + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { + self.push(extrinsic).map_err(Into::into) + } + + /// Bake the block with provided extrinsics. + fn bake(self) -> Result { + ClientBlockBuilder::bake(self).map_err(Into::into) + } +} + +impl Api for Client +where + B: Backend, + E: CallExecutor + Clone, +{ + type BlockBuilder = ClientBlockBuilder; + + fn session_keys(&self, at: &BlockId) -> Result> { + Ok(self.authorities_at(at)?) + } + + fn validators(&self, at: &BlockId) -> Result> { + self.call_api(at, "validators", &()) + } + + fn random_seed(&self, at: &BlockId) -> Result { + self.call_api(at, "random_seed", &()) + } + + fn timestamp(&self, at: &BlockId) -> Result { + self.call_api(at, "timestamp", &()) + } + + fn evaluate_block(&self, at: &BlockId, block: Block) -> Result { + let res: Result<()> = self.call_api(at, "execute_block", &block); + match res { + Ok(()) => Ok(true), + Err(err) => match err.kind() { + &client::error::ErrorKind::Execution(_) => Ok(false), + _ => Err(err) + } + } + } + + fn index(&self, at: &BlockId, account: AccountId) -> Result { + self.call_api(at, "account_nonce", &account) + } + + fn lookup(&self, at: &BlockId, address: Address) -> Result> { + self.call_api(at, "lookup_address", &address) + } + + fn build_block(&self, at: &BlockId, inherent_data: InherentData) -> Result { + let mut block_builder = self.new_block_at(at)?; + for inherent in self.inherent_extrinsics(at, inherent_data)? { + block_builder.push(inherent)?; + } + + Ok(block_builder) + } + + fn inherent_extrinsics(&self, at: &BlockId, inherent_data: InherentData) -> Result> { + self.call_api(at, "inherent_extrinsics", &inherent_data) + } +} + diff --git a/demo/build.rs b/demo/build.rs new file mode 100644 index 0000000000000..2e420107c8142 --- /dev/null +++ b/demo/build.rs @@ -0,0 +1,24 @@ +// Copyright 2015-2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +extern crate vergen; + +const ERROR_MSG: &'static str = "Failed to generate metadata files"; + +fn main() { + vergen::vergen(vergen::SHORT_SHA).expect(ERROR_MSG); + println!("cargo:rerun-if-changed=../.git/HEAD"); +} diff --git a/demo/cli/Cargo.toml b/demo/cli/Cargo.toml index 0a9ba64315f98..5c5b0f7a36f41 100644 --- a/demo/cli/Cargo.toml +++ b/demo/cli/Cargo.toml @@ -5,25 +5,8 @@ authors = ["Parity Technologies "] description = "Substrate Demo node implementation in Rust." [dependencies] -clap = { version = "2.27", features = ["yaml"] } -ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } -ed25519 = { path = "../../substrate/ed25519" } -env_logger = "0.4" -futures = "0.1.17" -error-chain = "0.12" -hex-literal = "0.1" log = "0.3" tokio = "0.1.7" -triehash = "0.1" -substrate-client = { path = "../../substrate/client" } -substrate-codec = { path = "../../substrate/codec" } -substrate-extrinsic-pool = { path = "../../substrate/extrinsic-pool" } -substrate-runtime-io = { path = "../../substrate/runtime-io" } -substrate-state-machine = { path = "../../substrate/state-machine" } -substrate-executor = { path = "../../substrate/executor" } -substrate-primitives = { path = "../../substrate/primitives" } -substrate-rpc-servers = { path = "../../substrate/rpc-servers" } -substrate-rpc = { path = "../../substrate/rpc" } -demo-primitives = { path = "../primitives" } -demo-executor = { path = "../executor" } -demo-runtime = { path = "../runtime" } +exit-future = "0.1" +substrate-cli = { path = "../../substrate/cli" } +demo-service = { path = "../service" } diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 3ab2701c8c079..917c93f00f326 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -17,250 +17,107 @@ //! Substrate Demo CLI library. #![warn(missing_docs)] +#![warn(unused_extern_crates)] -extern crate ctrlc; -extern crate ed25519; -extern crate env_logger; -extern crate futures; extern crate tokio; -extern crate triehash; -extern crate substrate_client as client; -extern crate substrate_codec as codec; -extern crate substrate_primitives as primitives; -extern crate substrate_rpc; -extern crate substrate_rpc_servers as rpc; -extern crate substrate_runtime_io as runtime_io; -extern crate substrate_state_machine as state_machine; -extern crate substrate_extrinsic_pool as extrinsic_pool; -extern crate demo_executor; -extern crate demo_primitives; -extern crate demo_runtime; -#[macro_use] -extern crate hex_literal; -#[macro_use] -extern crate clap; -#[macro_use] -extern crate error_chain; +extern crate substrate_cli as cli; +extern crate demo_service as service; +extern crate exit_future; + #[macro_use] extern crate log; -pub mod error; +pub use cli::error; -use std::sync::Arc; -use demo_primitives::{AccountId, Hash}; -use demo_runtime::{Block, BlockId, GenesisConfig, - BalancesConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, - StakingConfig, TimestampConfig}; -use futures::{Future, Sink, Stream}; use tokio::runtime::Runtime; -use demo_executor::NativeExecutor; -use extrinsic_pool::{Pool as ExtrinsicPool, ExtrinsicFor, VerifiedFor, scoring, Readiness}; - -#[derive(Debug, Clone)] -struct VerifiedExtrinsic { - sender: AccountId, - hash: Hash, -} - -impl extrinsic_pool::VerifiedTransaction for VerifiedExtrinsic { - type Hash = Hash; - type Sender = AccountId; - - fn hash(&self) -> &Self::Hash { - &self.hash - } - - fn sender(&self) -> &Self::Sender { - &self.sender - } - - fn mem_usage(&self) -> usize { - 0 - } +pub use service::{Components as ServiceComponents, Service, CustomConfiguration}; +pub use cli::{VersionInfo, IntoExit}; + +/// The chain specification option. +#[derive(Clone, Debug)] +pub enum ChainSpec { + /// Whatever the current runtime is, with just Alice as an auth. + Development, + /// Whatever the current runtime is, with simple Alice/Bob auths. + LocalTestnet, + /// The PoC-1 & PoC-2 era testnet. + Testnet, + /// Whatever the current runtime is with the "global testnet" defaults. + StagingTestnet, } -struct Pool; -impl extrinsic_pool::ChainApi for Pool { - type Block = Block; - type Hash = Hash; - type Sender = AccountId; - type VEx = VerifiedExtrinsic; - type Ready = (); - type Error = extrinsic_pool::Error; - type Score = u64; - type Event = (); - - fn verify_transaction(&self, _at: &BlockId, _xt: &ExtrinsicFor) -> Result { - unimplemented!() - } - - fn ready(&self) -> Self::Ready { } - - fn is_ready(&self, _at: &BlockId, _ready: &mut Self::Ready, _xt: &VerifiedFor) -> Readiness { - unimplemented!() - } - - fn compare(_old: &VerifiedFor, _other: &VerifiedFor) -> ::std::cmp::Ordering { - unimplemented!() - } - - fn choose(_old: &VerifiedFor, _new: &VerifiedFor) -> scoring::Choice { - unimplemented!() - } - - fn update_scores( - _xts: &[extrinsic_pool::Transaction>], - _scores: &mut [Self::Score], - _change: scoring::Change<()> - ) { - unimplemented!() +/// Get a chain config from a spec setting. +impl ChainSpec { + pub(crate) fn load(self) -> Result { + Ok(match self { + ChainSpec::Testnet => service::chain_spec::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(), + }) } - fn should_replace(_old: &VerifiedFor, _new: &VerifiedFor) -> scoring::Choice { - unimplemented!() + pub(crate) fn from(s: &str) -> Option { + match s { + "dev" => Some(ChainSpec::Development), + "local" => Some(ChainSpec::LocalTestnet), + "" | "test" => Some(ChainSpec::Testnet), + "staging" => Some(ChainSpec::StagingTestnet), + _ => None, + } } } -struct DummySystem; -impl substrate_rpc::system::SystemApi for DummySystem { - fn system_name(&self) -> substrate_rpc::system::error::Result { - Ok("substrate-demo".into()) - } - fn system_version(&self) -> substrate_rpc::system::error::Result { - Ok(crate_version!().into()) - } - fn system_chain(&self) -> substrate_rpc::system::error::Result { - Ok("default".into()) - } +fn load_spec(id: &str) -> Result, String> { + Ok(match ChainSpec::from(id) { + Some(spec) => Some(spec.load()?), + None => None, + }) } -/// Parse command line arguments and start the node. -/// -/// IANA unassigned port ranges that we could use: -/// 6717-6766 Unassigned -/// 8504-8553 Unassigned -/// 9556-9591 Unassigned -/// 9803-9874 Unassigned -/// 9926-9949 Unassigned -pub fn run(args: I) -> error::Result<()> where +/// Parse command line arguments into service configuration. +pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Result<()> where I: IntoIterator, T: Into + Clone, + E: IntoExit, { - let yaml = load_yaml!("./cli.yml"); - let matches = clap::App::from_yaml(yaml).version(crate_version!()).get_matches_from_safe(args)?; - - // TODO [ToDr] Split parameters parsing from actual execution. - let log_pattern = matches.value_of("log").unwrap_or(""); - init_logger(log_pattern); - - // Create client - let executor = NativeExecutor::new(); - - let god_key = hex!["3d866ec8a9190c8343c2fc593d21d8a6d0c5c4763aaab2349de3a6111d64d124"]; - let genesis_config = GenesisConfig { - consensus: Some(ConsensusConfig { - code: vec![], // TODO - authorities: vec![god_key.clone().into()], - }), - system: None, - balances: Some(BalancesConfig { - transaction_base_fee: 100, - transaction_byte_fee: 1, - transfer_fee: 0, - creation_fee: 0, - reclaim_rebate: 0, - existential_deposit: 500, - balances: vec![(god_key.clone().into(), 1u64 << 63)].into_iter().collect(), - }), - session: Some(SessionConfig { - validators: vec![god_key.clone().into()], - session_length: 720, // that's 1 hour per session. - }), - staking: Some(StakingConfig { - current_era: 0, - intentions: vec![], - validator_count: 12, - minimum_validator_count: 4, - sessions_per_era: 24, // 24 hours per era. - bonding_duration: 90 * 24 * 720, // 90 days per bond. - early_era_slash: 10000, - session_reward: 100, - offline_slash_grace: 0, - }), - democracy: Some(DemocracyConfig { - launch_period: 120 * 24 * 14, // 2 weeks per public referendum - voting_period: 120 * 24 * 28, // 4 weeks to discuss & vote on an active referendum - minimum_deposit: 1000, // 1000 as the minimum deposit for a referendum - }), - council: Some(CouncilConfig { - active_council: vec![], - candidacy_bond: 1000, // 1000 to become a council candidate - voter_bond: 100, // 100 down to vote for a candidate - present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. - carry_count: 24, // carry over the 24 runners-up to the next council election - presentation_duration: 120 * 24, // one day for presenting winners. - approval_voting_period: 7 * 120 * 24, // one week period between possible council elections. - term_duration: 180 * 120 * 24, // 180 day term duration for the council. - desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. - inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. - - cooloff_period: 90 * 120 * 24, // 90 day cooling off period if council member vetoes a proposal. - voting_period: 7 * 120 * 24, // 7 day voting period for council members. - }), - timestamp: Some(TimestampConfig { - period: 5, // 5 second block time. - }), - }; - let client = Arc::new(client::new_in_mem::, Block, _>(executor, genesis_config)?); - let mut runtime = Runtime::new()?; - let _rpc_servers = { - let handler = || { - let state = rpc::apis::state::State::new(client.clone(), runtime.executor()); - let chain = rpc::apis::chain::Chain::new(client.clone(), runtime.executor()); - let author = rpc::apis::author::Author::new(client.clone(), Arc::new(ExtrinsicPool::new(Default::default(), Pool)), runtime.executor()); - rpc::rpc_handler::(state, chain, author, DummySystem) - }; - let http_address = "127.0.0.1:9933".parse().unwrap(); - let ws_address = "127.0.0.1:9944".parse().unwrap(); - - ( - rpc::start_http(&http_address, handler())?, - rpc::start_ws(&ws_address, handler())? - ) - }; - - if let Some(_) = matches.subcommand_matches("validator") { - info!("Starting validator."); - let (exit_send, exit) = futures::sync::mpsc::channel(1); - ctrlc::CtrlC::set_handler(move || { - exit_send.clone().send(()).wait().expect("Error sending exit notification"); - }); - - runtime.block_on(exit.into_future()).expect("Error running informant event loop"); - return Ok(()) + match cli::prepare_execution::(args, exit, version, load_spec, "substrate-demo")? { + cli::Action::ExecutedInternally => (), + cli::Action::RunService((config, exit)) => { + info!("Parity ·:· Substrate Demo"); + info!(" version {}", config.full_version()); + info!(" by Parity Technologies, 2017, 2018"); + info!("Chain specification: {}", config.chain_spec.name()); + info!("Node name: {}", config.name); + info!("Roles: {:?}", config.roles); + let mut runtime = Runtime::new()?; + let executor = runtime.executor(); + match config.roles == service::Roles::LIGHT { + true => run_until_exit(&mut runtime, service::new_light(config, executor)?, exit)?, + false => run_until_exit(&mut runtime, service::new_full(config, executor)?, exit)?, + } + } } - - println!("No command given.\n"); - let _ = clap::App::from_yaml(yaml).print_long_help(); - Ok(()) } -fn init_logger(pattern: &str) { - let mut builder = env_logger::LogBuilder::new(); - // Disable info logging by default for some modules: - builder.filter(Some("hyper"), log::LogLevelFilter::Warn); - // Enable info for others. - builder.filter(None, log::LogLevelFilter::Info); - - if let Ok(lvl) = std::env::var("RUST_LOG") { - builder.parse(&lvl); - } - - builder.parse(pattern); +fn run_until_exit( + runtime: &mut Runtime, + service: service::Service, + e: E, +) -> error::Result<()> + where + C: service::Components, + E: IntoExit, +{ + let (exit_send, exit) = exit_future::signal(); + let executor = runtime.executor(); + cli::informant::start(&service, exit.clone(), executor.clone()); - builder.init().expect("Logger initialized only once."); + let _ = runtime.block_on(e.into_exit()); + exit_send.fire(); + Ok(()) } diff --git a/demo/consensus/Cargo.toml b/demo/consensus/Cargo.toml new file mode 100644 index 0000000000000..1dc8eb8367711 --- /dev/null +++ b/demo/consensus/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "demo-consensus" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +futures = "0.1.17" +parking_lot = "0.4" +tokio = "0.1.7" +ed25519 = { path = "../../substrate/ed25519" } +error-chain = "0.12" +log = "0.3" +exit-future = "0.1" +rhododendron = "0.3" +demo-api = { path = "../api" } +demo-primitives = { path = "../primitives" } +demo-runtime = { path = "../runtime" } +demo-transaction-pool = { path = "../transaction-pool" } +substrate-bft = { path = "../../substrate/bft" } +substrate-codec = { path = "../../substrate/codec" } +substrate-primitives = { path = "../../substrate/primitives" } +substrate-runtime-support = { path = "../../substrate/runtime-support" } +substrate-client = { path = "../../substrate/client" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } + +[dev-dependencies] +substrate-keyring = { path = "../../substrate/keyring" } diff --git a/demo/consensus/README.adoc b/demo/consensus/README.adoc new file mode 100644 index 0000000000000..a3ac5f631c38c --- /dev/null +++ b/demo/consensus/README.adoc @@ -0,0 +1,5 @@ + += Polkadot Consensus + +placeholder +//TODO Write content :) diff --git a/demo/consensus/src/error.rs b/demo/consensus/src/error.rs new file mode 100644 index 0000000000000..a423f98fccb9b --- /dev/null +++ b/demo/consensus/src/error.rs @@ -0,0 +1,55 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Errors that can occur during the consensus process. + +use primitives::AuthorityId; + +error_chain! { + links { + Api(::demo_api::Error, ::demo_api::ErrorKind); + Bft(::bft::Error, ::bft::ErrorKind); + } + + errors { + InvalidDutyRosterLength(expected: usize, got: usize) { + description("Duty Roster had invalid length"), + display("Invalid duty roster length: expected {}, got {}", expected, got), + } + NotValidator(id: AuthorityId) { + description("Local account ID not a validator at this block."), + display("Local account ID ({:?}) not a validator at this block.", id), + } + PrematureDestruction { + description("Proposer destroyed before finishing proposing or evaluating"), + display("Proposer destroyed before finishing proposing or evaluating"), + } + Timer(e: ::tokio::timer::Error) { + description("Failed to register or resolve async timer."), + display("Timer failed: {}", e), + } + Executor(e: ::futures::future::ExecuteErrorKind) { + description("Unable to dispatch agreement future"), + display("Unable to dispatch agreement future: {:?}", e), + } + } +} + +impl From<::bft::InputStreamConcluded> for Error { + fn from(err: ::bft::InputStreamConcluded) -> Self { + ::bft::Error::from(err).into() + } +} diff --git a/demo/consensus/src/evaluation.rs b/demo/consensus/src/evaluation.rs new file mode 100644 index 0000000000000..df192eda586ad --- /dev/null +++ b/demo/consensus/src/evaluation.rs @@ -0,0 +1,96 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Polkadot block evaluation and evaluation errors. + +use super::MAX_TRANSACTIONS_SIZE; + +use codec::{Decode, Encode}; +use demo_runtime::{Block as GenericBlock, CheckedBlock}; +use demo_primitives::{Block, Hash, BlockNumber, Timestamp}; + +error_chain! { + links { + Api(::demo_api::Error, ::demo_api::ErrorKind); + } + + errors { + BadProposalFormat { + description("Proposal provided not a block."), + display("Proposal provided not a block."), + } + TimestampInFuture { + description("Proposal had timestamp too far in the future."), + display("Proposal had timestamp too far in the future."), + } + WrongParentHash(expected: Hash, got: Hash) { + description("Proposal had wrong parent hash."), + display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), + } + WrongNumber(expected: BlockNumber, got: BlockNumber) { + description("Proposal had wrong number."), + display("Proposal had wrong number. Expected {:?}, got {:?}", expected, got), + } + ProposalTooLarge(size: usize) { + description("Proposal exceeded the maximum size."), + display( + "Proposal exceeded the maximum size of {} by {} bytes.", + MAX_TRANSACTIONS_SIZE, MAX_TRANSACTIONS_SIZE.saturating_sub(*size) + ), + } + } +} + +/// Attempt to evaluate a substrate block as a demo block, returning error +/// upon any initial validity checks failing. +pub fn evaluate_initial( + proposal: &Block, + now: Timestamp, + parent_hash: &Hash, + parent_number: BlockNumber, +) -> Result { + const MAX_TIMESTAMP_DRIFT: Timestamp = 60; + + let encoded = Encode::encode(proposal); + let proposal = GenericBlock::decode(&mut &encoded[..]) + .and_then(|b| CheckedBlock::new(b).ok()) + .ok_or_else(|| ErrorKind::BadProposalFormat)?; + + let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { + a + Encode::encode(tx).len() + }); + + if transactions_size > MAX_TRANSACTIONS_SIZE { + bail!(ErrorKind::ProposalTooLarge(transactions_size)) + } + + if proposal.header.parent_hash != *parent_hash { + bail!(ErrorKind::WrongParentHash(*parent_hash, proposal.header.parent_hash)); + } + + if proposal.header.number != parent_number + 1 { + bail!(ErrorKind::WrongNumber(parent_number + 1, proposal.header.number)); + } + + let block_timestamp = proposal.timestamp(); + + // lenient maximum -- small drifts will just be delayed using a timer. + if block_timestamp > now + MAX_TIMESTAMP_DRIFT { + bail!(ErrorKind::TimestampInFuture) + } + + Ok(proposal) +} diff --git a/demo/consensus/src/lib.rs b/demo/consensus/src/lib.rs new file mode 100644 index 0000000000000..cd55ea4a790c5 --- /dev/null +++ b/demo/consensus/src/lib.rs @@ -0,0 +1,508 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! This service uses BFT consensus provided by the substrate. + +extern crate ed25519; +extern crate parking_lot; +extern crate demo_api; +extern crate demo_transaction_pool as transaction_pool; +extern crate demo_runtime; +extern crate demo_primitives; + +extern crate substrate_bft as bft; +extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; +extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; +extern crate substrate_client as client; + +extern crate exit_future; +extern crate tokio; +extern crate rhododendron; + +#[macro_use] +extern crate error_chain; +#[macro_use] +extern crate futures; + +#[macro_use] +extern crate log; + +#[cfg(test)] +extern crate substrate_keyring; + +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use codec::{Decode, Encode}; +use demo_api::Api; +use demo_primitives::{AccountId, Hash, Block, BlockId, BlockNumber, Header, Timestamp, SessionKey}; +use primitives::AuthorityId; +use transaction_pool::TransactionPool; +use tokio::runtime::TaskExecutor; +use tokio::timer::{Delay, Interval}; + +use futures::prelude::*; +use futures::future; +use parking_lot::RwLock; + +pub use self::error::{ErrorKind, Error}; +pub use self::offline_tracker::OfflineTracker; +pub use service::Service; + +mod evaluation; +mod error; +mod offline_tracker; +mod service; + +/// Shared offline validator tracker. +pub type SharedOfflineTracker = Arc>; + +// block size limit. +const MAX_TRANSACTIONS_SIZE: usize = 4 * 1024 * 1024; + +/// A long-lived network which can create BFT message routing processes on demand. +pub trait Network { + /// The input stream of BFT messages. Should never logically conclude. + type Input: Stream,Error=Error>; + /// The output sink of BFT messages. Messages sent here should eventually pass to all + /// current authorities. + type Output: Sink,SinkError=Error>; + + /// Instantiate input and output streams. + fn communication_for(&self, validators: &[SessionKey], local_id: SessionKey, parent_hash: Hash, task_executor: TaskExecutor) -> (Self::Input, Self::Output); +} + +/// Proposer factory. +pub struct ProposerFactory + where + P: Api + Send + Sync + 'static +{ + /// The client instance. + pub client: Arc

, + /// The transaction pool. + pub transaction_pool: Arc>, + /// The backing network handle. + pub network: N, + /// handle to remote task executor + pub handle: TaskExecutor, + /// Offline-tracker. + pub offline: SharedOfflineTracker, +} + +impl bft::Environment for ProposerFactory + where + N: Network, + P: Api + Send + Sync + 'static, +{ + type Proposer = Proposer

; + type Input = N::Input; + type Output = N::Output; + type Error = Error; + + fn init( + &self, + parent_header: &Header, + authorities: &[AuthorityId], + sign_with: Arc, + ) -> Result<(Self::Proposer, Self::Input, Self::Output), Error> { + use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; + + let parent_hash = parent_header.hash().into(); + + let id = BlockId::hash(parent_hash); + let random_seed = self.client.random_seed(&id)?; + let random_seed = BlakeTwo256::hash(&*random_seed); + + let validators = self.client.validators(&id)?; + self.offline.write().note_new_block(&validators[..]); + + info!("Starting consensus session on top of parent {:?}", parent_hash); + + let local_id = sign_with.public().0.into(); + let (input, output) = self.network.communication_for( + authorities, + local_id, + parent_hash.clone(), + self.handle.clone(), + ); + let now = Instant::now(); + let proposer = Proposer { + client: self.client.clone(), + start: now, + local_key: sign_with, + parent_hash, + parent_id: id, + parent_number: parent_header.number, + random_seed, + transaction_pool: self.transaction_pool.clone(), + offline: self.offline.clone(), + validators, + }; + + Ok((proposer, input, output)) + } +} + +/// The proposer logic. +pub struct Proposer { + client: Arc, + start: Instant, + local_key: Arc, + parent_hash: Hash, + parent_id: BlockId, + parent_number: BlockNumber, + random_seed: Hash, + transaction_pool: Arc>, + offline: SharedOfflineTracker, + validators: Vec, +} + +impl Proposer { + fn primary_index(&self, round_number: usize, len: usize) -> usize { + use primitives::uint::U256; + + let big_len = U256::from(len); + let offset = U256::from_big_endian(&self.random_seed.0) % big_len; + let offset = offset.low_u64() as usize + round_number; + offset % len + } +} + +impl bft::Proposer for Proposer + where + C: Api + Send + Sync, +{ + type Error = Error; + type Create = future::Either< + CreateProposal, + future::FutureResult, + >; + type Evaluate = Box>; + + fn propose(&self) -> Self::Create { + const ATTEMPT_PROPOSE_EVERY: Duration = Duration::from_millis(100); + + let now = Instant::now(); + let timing = ProposalTiming { + start: self.start.clone(), + attempt_propose: Interval::new(now + ATTEMPT_PROPOSE_EVERY, ATTEMPT_PROPOSE_EVERY), + }; + + future::Either::A(CreateProposal { + parent_hash: self.parent_hash.clone(), + parent_number: self.parent_number.clone(), + parent_id: self.parent_id.clone(), + client: self.client.clone(), + transaction_pool: self.transaction_pool.clone(), + offline: self.offline.clone(), + validators: self.validators.clone(), + timing, + }) + } + + fn evaluate(&self, unchecked_proposal: &Block) -> Self::Evaluate { + debug!(target: "bft", "evaluating block on top of parent ({}, {:?})", self.parent_number, self.parent_hash); + + let current_timestamp = current_timestamp(); + + // do initial serialization and structural integrity checks. + let maybe_proposal = evaluation::evaluate_initial( + unchecked_proposal, + current_timestamp, + &self.parent_hash, + self.parent_number, + ); + + let proposal = match maybe_proposal { + Ok(p) => p, + Err(e) => { + // TODO: these errors are easily re-checked in runtime. + debug!(target: "bft", "Invalid proposal: {:?}", e); + return Box::new(future::ok(false)); + } + }; + + let vote_delays = { + let now = Instant::now(); + + // the duration until the given timestamp is current + let proposed_timestamp = proposal.timestamp(); + let timestamp_delay = if proposed_timestamp > current_timestamp { + Some(now + Duration::from_secs(proposed_timestamp - current_timestamp)) + } else { + None + }; + + match timestamp_delay { + Some(duration) => future::Either::A( + Delay::new(duration).map_err(|e| Error::from(ErrorKind::Timer(e))) + ), + None => future::Either::B(future::ok(())), + } + }; + + // refuse to vote if this block says a validator is offline that we + // think isn't. + let offline = proposal.noted_offline(); + if !self.offline.read().check_consistency(&self.validators[..], offline) { + return Box::new(futures::empty()); + } + + // evaluate whether the block is actually valid. + // TODO: is it better to delay this until the delays are finished? + let evaluated = self.client + .evaluate_block(&self.parent_id, unchecked_proposal.clone()) + .map_err(Into::into); + + let future = future::result(evaluated).and_then(move |good| { + let end_result = future::ok(good); + if good { + // delay a "good" vote. + future::Either::A(vote_delays.and_then(|_| end_result)) + } else { + // don't delay a "bad" evaluation. + future::Either::B(end_result) + } + }); + + Box::new(future) as Box<_> + } + + fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { + let offset = self.primary_index(round_number, authorities.len()); + let proposer = authorities[offset].clone(); + trace!(target: "bft", "proposer for round {} is {}", round_number, proposer); + + proposer + } + + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { + use rhododendron::Misbehavior as GenericMisbehavior; + use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use runtime_primitives::MaybeUnsigned; + use demo_primitives::UncheckedExtrinsic as GenericExtrinsic; + use demo_runtime::{Call, Extrinsic, BareExtrinsic, UncheckedExtrinsic, ConsensusCall}; + + let local_id = self.local_key.public().0.into(); + let mut next_index = { + let cur_index = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending| pending + .filter(|tx| tx.verified.sender == local_id) + .last() + .map(|tx| Ok(tx.verified.index())) + .unwrap_or_else(|| self.client.index(&self.parent_id, local_id)) + ); + + match cur_index { + Ok(Ok(cur_index)) => cur_index + 1, + Ok(Err(e)) => { + warn!(target: "consensus", "Error computing next transaction index: {}", e); + return; + } + Err(e) => { + warn!(target: "consensus", "Error computing next transaction index: {}", e); + return; + } + } + }; + + for (target, misbehavior) in misbehavior { + let report = MisbehaviorReport { + parent_hash: self.parent_hash, + parent_number: self.parent_number, + target, + misbehavior: match misbehavior { + GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, + GenericMisbehavior::DoublePropose(_, _, _) => continue, + GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoublePrepare(round as u32, (h1, s1.signature), (h2, s2.signature)), + GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoubleCommit(round as u32, (h1, s1.signature), (h2, s2.signature)), + } + }; + let extrinsic = BareExtrinsic { + signed: local_id, + index: next_index, + function: Call::Consensus(ConsensusCall::report_misbehavior(report)), + }; + + next_index += 1; + + let signature = MaybeUnsigned(self.local_key.sign(&extrinsic.encode()).into()); + + let extrinsic = Extrinsic { + signed: extrinsic.signed.into(), + index: extrinsic.index, + function: extrinsic.function, + }; + let uxt: GenericExtrinsic = Decode::decode(&mut UncheckedExtrinsic::new(extrinsic, signature).encode().as_slice()).expect("Encoded extrinsic is valid"); + self.transaction_pool.submit_one(&BlockId::hash(self.parent_hash), uxt) + .expect("locally signed extrinsic is valid; qed"); + } + } + + fn on_round_end(&self, round_number: usize, was_proposed: bool) { + let primary_validator = self.validators[ + self.primary_index(round_number, self.validators.len()) + ]; + + + // alter the message based on whether we think the empty proposer was forced to skip the round. + // this is determined by checking if our local validator would have been forced to skip the round. + if !was_proposed { + let public = ::ed25519::Public::from_raw(primary_validator.0); + info!( + "Potential Offline Validator: {} failed to propose during assigned slot: {}", + public, + round_number, + ); + } + + self.offline.write().note_round_end(primary_validator, was_proposed); + } +} + +fn current_timestamp() -> Timestamp { + use std::time; + + time::SystemTime::now().duration_since(time::UNIX_EPOCH) + .expect("now always later than unix epoch; qed") + .as_secs() +} + +struct ProposalTiming { + start: Instant, + attempt_propose: Interval, +} + +impl ProposalTiming { + // whether it's time to attempt a proposal. + // shouldn't be called outside of the context of a task. + fn poll(&mut self) -> Poll<(), ErrorKind> { + // first drain from the interval so when the minimum delay is up + // we don't have any notifications built up. + if let Async::Ready(x) = self.attempt_propose.poll().map_err(ErrorKind::Timer)? { + x.expect("timer still alive; intervals never end; qed"); + } + Ok(Async::Ready(())) + } +} + +/// Future which resolves upon the creation of a proposal. +pub struct CreateProposal { + parent_hash: Hash, + parent_number: BlockNumber, + parent_id: BlockId, + client: Arc, + transaction_pool: Arc>, + timing: ProposalTiming, + validators: Vec, + offline: SharedOfflineTracker, +} + +impl CreateProposal where C: Api + Send + Sync { + fn propose(&self) -> Result { + use demo_api::BlockBuilder; + use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; + use demo_primitives::InherentData; + + const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); + + // TODO: handle case when current timestamp behind that in state. + let timestamp = current_timestamp(); + + let elapsed_since_start = self.timing.start.elapsed(); + let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { + Vec::new() + } else { + self.offline.read().reports(&self.validators[..]) + }; + + if !offline_indices.is_empty() { + info!( + "Submitting offline validators {:?} for slash-vote", + offline_indices.iter().map(|&i| self.validators[i as usize]).collect::>(), + ) + } + + let inherent_data = InherentData { + timestamp, + offline_indices, + }; + + let mut block_builder = self.client.build_block(&self.parent_id, inherent_data)?; + + { + let mut unqueue_invalid = Vec::new(); + let result = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending_iterator| { + let mut pending_size = 0; + for pending in pending_iterator { + if pending_size + pending.verified.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } + + match block_builder.push_extrinsic(pending.original.clone()) { + Ok(()) => { + pending_size += pending.verified.encoded_size(); + } + Err(e) => { + trace!(target: "transaction-pool", "Invalid transaction: {}", e); + unqueue_invalid.push(pending.verified.hash().clone()); + } + } + } + }); + if let Err(e) = result { + warn!("Unable to get the pending set: {:?}", e); + } + + self.transaction_pool.remove(&unqueue_invalid, false); + } + + let block = block_builder.bake()?; + + info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", + block.header.number, + Hash::from(block.header.hash()), + block.header.parent_hash, + block.extrinsics.iter() + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) + .collect::>() + .join(", ") + ); + + let substrate_block = Decode::decode(&mut block.encode().as_slice()) + .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + + assert!(evaluation::evaluate_initial( + &substrate_block, + timestamp, + &self.parent_hash, + self.parent_number, + ).is_ok()); + + Ok(substrate_block) + } +} + +impl Future for CreateProposal where C: Api + Send + Sync { + type Item = Block; + type Error = Error; + + fn poll(&mut self) -> Poll { + try_ready!(self.timing.poll()); + self.propose().map(Async::Ready) + } +} diff --git a/demo/consensus/src/offline_tracker.rs b/demo/consensus/src/offline_tracker.rs new file mode 100644 index 0000000000000..243b801bcec0c --- /dev/null +++ b/demo/consensus/src/offline_tracker.rs @@ -0,0 +1,137 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Tracks offline validators. + +use demo_primitives::AccountId; + +use std::collections::HashMap; +use std::time::{Instant, Duration}; + +// time before we report a validator. +const REPORT_TIME: Duration = Duration::from_secs(60 * 5); + +struct Observed { + last_round_end: Instant, + offline_since: Instant, +} + +impl Observed { + fn new() -> Observed { + let now = Instant::now(); + Observed { + last_round_end: now, + offline_since: now, + } + } + + fn note_round_end(&mut self, was_online: bool) { + let now = Instant::now(); + + self.last_round_end = now; + if was_online { + self.offline_since = now; + } + } + + fn is_active(&self) -> bool { + // can happen if clocks are not monotonic + if self.offline_since > self.last_round_end { return true } + self.last_round_end.duration_since(self.offline_since) < REPORT_TIME + } +} + +/// Tracks offline validators and can issue a report for those offline. +pub struct OfflineTracker { + observed: HashMap, +} + +impl OfflineTracker { + /// Create a new tracker. + pub fn new() -> Self { + OfflineTracker { observed: HashMap::new() } + } + + /// Note new consensus is starting with the given set of validators. + pub fn note_new_block(&mut self, validators: &[AccountId]) { + use std::collections::HashSet; + + let set: HashSet<_> = validators.iter().cloned().collect(); + self.observed.retain(|k, _| set.contains(k)); + } + + /// Note that a round has ended. + pub fn note_round_end(&mut self, validator: AccountId, was_online: bool) { + self.observed.entry(validator) + .or_insert_with(Observed::new) + .note_round_end(was_online); + } + + /// Generate a vector of indices for offline account IDs. + pub fn reports(&self, validators: &[AccountId]) -> Vec { + validators.iter() + .enumerate() + .filter_map(|(i, v)| if self.is_online(v) { + None + } else { + Some(i as u32) + }) + .collect() + } + + /// Whether reports on a validator set are consistent with our view of things. + pub fn check_consistency(&self, validators: &[AccountId], reports: &[u32]) -> bool { + reports.iter().cloned().all(|r| { + let v = match validators.get(r as usize) { + Some(v) => v, + None => return false, + }; + + // we must think all validators reported externally are offline. + let thinks_online = self.is_online(v); + !thinks_online + }) + } + + fn is_online(&self, v: &AccountId) -> bool { + self.observed.get(v).map(Observed::is_active).unwrap_or(true) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn validator_offline() { + let mut tracker = OfflineTracker::new(); + let v = [0; 32].into(); + let v2 = [1; 32].into(); + let v3 = [2; 32].into(); + tracker.note_round_end(v, true); + tracker.note_round_end(v2, true); + tracker.note_round_end(v3, true); + + let slash_time = REPORT_TIME + Duration::from_secs(5); + tracker.observed.get_mut(&v).unwrap().offline_since -= slash_time; + tracker.observed.get_mut(&v2).unwrap().offline_since -= slash_time; + + assert_eq!(tracker.reports(&[v, v2, v3]), vec![0, 1]); + + tracker.note_new_block(&[v, v3]); + assert_eq!(tracker.reports(&[v, v2, v3]), vec![0]); + } +} diff --git a/demo/consensus/src/service.rs b/demo/consensus/src/service.rs new file mode 100644 index 0000000000000..f20532e86d4ab --- /dev/null +++ b/demo/consensus/src/service.rs @@ -0,0 +1,193 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Consensus service. + +/// Consensus service. A long running service that manages BFT agreement +/// the network. +use std::thread; +use std::time::{Duration, Instant}; +use std::sync::Arc; + +use bft::{self, BftService}; +use client::{BlockchainEvents, ChainHead, BlockBody}; +use ed25519; +use futures::prelude::*; +use demo_api::Api; +use demo_primitives::{Block, Header}; +use transaction_pool::TransactionPool; + +use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; +use tokio::runtime::TaskExecutor as ThreadPoolHandle; +use tokio::runtime::current_thread::Runtime as LocalRuntime; +use tokio::timer::{Delay, Interval}; + +use super::{Network, ProposerFactory}; +use error; + +const TIMER_DELAY_MS: u64 = 5000; +const TIMER_INTERVAL_MS: u64 = 500; + +// spin up an instance of BFT agreement on the current thread's executor. +// panics if there is no current thread executor. +fn start_bft( + header: Header, + bft_service: Arc>, +) where + F: bft::Environment + 'static, + C: bft::BlockImport + bft::Authorities + 'static, + F::Error: ::std::fmt::Debug, + >::Error: ::std::fmt::Display + Into, + >::Error: ::std::fmt::Display +{ + const DELAY_UNTIL: Duration = Duration::from_millis(5000); + + let mut handle = LocalThreadHandle::current(); + let work = Delay::new(Instant::now() + DELAY_UNTIL) + .then(move |res| { + if let Err(e) = res { + warn!(target: "bft", "Failed to force delay of consensus: {:?}", e); + } + + match bft_service.build_upon(&header) { + Ok(maybe_bft_work) => { + if maybe_bft_work.is_some() { + debug!(target: "bft", "Starting agreement. After forced delay for {:?}", + DELAY_UNTIL); + } + + maybe_bft_work + } + Err(e) => { + warn!(target: "bft", "BFT agreement error: {}", e); + None + } + } + }) + .map(|_| ()); + + if let Err(e) = handle.spawn_local(Box::new(work)) { + debug!(target: "bft", "Couldn't initialize BFT agreement: {:?}", e); + } +} + +/// Consensus service. Starts working when created. +pub struct Service { + thread: Option>, + exit_signal: Option<::exit_future::Signal>, +} + +impl Service { + /// Create and start a new instance. + pub fn new( + client: Arc, + api: Arc, + network: N, + transaction_pool: Arc>, + thread_pool: ThreadPoolHandle, + key: ed25519::Pair, + ) -> Service + where + A: Api + Send + Sync + 'static, + C: BlockchainEvents + ChainHead + BlockBody, + C: bft::BlockImport + bft::Authorities + Send + Sync + 'static, + N: Network + Send + 'static, + { + use parking_lot::RwLock; + use super::OfflineTracker; + + let (signal, exit) = ::exit_future::signal(); + let thread = thread::spawn(move || { + let mut runtime = LocalRuntime::new().expect("Could not create local runtime"); + let key = Arc::new(key); + + let factory = ProposerFactory { + client: api.clone(), + transaction_pool: transaction_pool.clone(), + network, + handle: thread_pool.clone(), + offline: Arc::new(RwLock::new(OfflineTracker::new())), + }; + let bft_service = Arc::new(BftService::new(client.clone(), key, factory)); + + let notifications = { + let client = client.clone(); + let bft_service = bft_service.clone(); + + client.import_notification_stream().for_each(move |notification| { + if notification.is_new_best { + start_bft(notification.header, bft_service.clone()); + } + Ok(()) + }) + }; + + let interval = Interval::new( + Instant::now() + Duration::from_millis(TIMER_DELAY_MS), + Duration::from_millis(TIMER_INTERVAL_MS), + ); + + let mut prev_best = match client.best_block_header() { + Ok(header) => header.hash(), + Err(e) => { + warn!("Cant's start consensus service. Error reading best block header: {:?}", e); + return; + } + }; + + let timed = { + let c = client.clone(); + let s = bft_service.clone(); + + interval.map_err(|e| debug!(target: "bft", "Timer error: {:?}", e)).for_each(move |_| { + if let Ok(best_block) = c.best_block_header() { + let hash = best_block.hash(); + + if hash == prev_best { + debug!(target: "bft", "Starting consensus round after a timeout"); + start_bft(best_block, s.clone()); + } + prev_best = hash; + } + Ok(()) + }) + }; + + runtime.spawn(notifications); + runtime.spawn(timed); + + if let Err(e) = runtime.block_on(exit) { + debug!("BFT event loop error {:?}", e); + } + }); + Service { + thread: Some(thread), + exit_signal: Some(signal), + } + } +} + +impl Drop for Service { + fn drop(&mut self) { + if let Some(signal) = self.exit_signal.take() { + signal.fire(); + } + + if let Some(thread) = self.thread.take() { + thread.join().expect("The service thread has panicked"); + } + } +} diff --git a/demo/network/Cargo.toml b/demo/network/Cargo.toml new file mode 100644 index 0000000000000..2709d728a307a --- /dev/null +++ b/demo/network/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "demo-network" +version = "0.1.0" +authors = ["Parity Technologies "] +description = "Substrate demo networking protocol" + +[dependencies] +parking_lot = "0.4" +demo-api = { path = "../api" } +demo-consensus = { path = "../consensus" } +demo-primitives = { path = "../primitives" } +substrate-bft = { path = "../../substrate/bft" } +substrate-network = { path = "../../substrate/network" } +substrate-primitives = { path = "../../substrate/primitives" } +ed25519 = { path = "../../substrate/ed25519" } +futures = "0.1" +tokio = "0.1.7" +log = "0.4" +rhododendron = "0.3" diff --git a/demo/network/src/consensus.rs b/demo/network/src/consensus.rs new file mode 100644 index 0000000000000..e7323dc8e6d5c --- /dev/null +++ b/demo/network/src/consensus.rs @@ -0,0 +1,286 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! The "consensus" networking code built on top of the base network service. +//! This fulfills the `demo_consensus::Network` trait, providing a hook to be called +//! each time consensus begins on a new chain head. + +use bft; +use ed25519; +use substrate_network::{self as net, generic_message as msg}; +use substrate_network::consensus_gossip::ConsensusMessage; +use demo_api::Api; +use demo_consensus::Network; +use demo_primitives::{Block, Hash, SessionKey}; + +use futures::prelude::*; +use futures::sync::mpsc; + +use std::sync::Arc; + +use tokio::runtime::TaskExecutor; + +use super::NetworkService; + +/// Sink for output BFT messages. +pub struct BftSink { + network: Arc, + parent_hash: Hash, + _marker: ::std::marker::PhantomData, +} + +impl Sink for BftSink { + type SinkItem = bft::Communication; + // TODO: replace this with the ! type when that's stabilized + type SinkError = E; + + fn start_send(&mut self, message: bft::Communication) -> ::futures::StartSend, E> { + let network_message = net::LocalizedBftMessage { + message: match message { + ::rhododendron::Communication::Consensus(c) => msg::BftMessage::Consensus(match c { + ::rhododendron::LocalizedMessage::Propose(proposal) => msg::SignedConsensusMessage::Propose(msg::SignedConsensusProposal { + round_number: proposal.round_number as u32, + proposal: proposal.proposal, + digest: proposal.digest, + sender: proposal.sender, + digest_signature: proposal.digest_signature.signature, + full_signature: proposal.full_signature.signature, + }), + ::rhododendron::LocalizedMessage::Vote(vote) => msg::SignedConsensusMessage::Vote(msg::SignedConsensusVote { + sender: vote.sender, + signature: vote.signature.signature, + vote: match vote.vote { + ::rhododendron::Vote::Prepare(r, h) => msg::ConsensusVote::Prepare(r as u32, h), + ::rhododendron::Vote::Commit(r, h) => msg::ConsensusVote::Commit(r as u32, h), + ::rhododendron::Vote::AdvanceRound(r) => msg::ConsensusVote::AdvanceRound(r as u32), + } + }), + }), + ::rhododendron::Communication::Auxiliary(justification) => { + let unchecked: bft::UncheckedJustification<_> = justification.uncheck().into(); + msg::BftMessage::Auxiliary(unchecked.into()) + } + }, + parent_hash: self.parent_hash, + }; + self.network.with_spec( + move |spec, ctx| spec.consensus_gossip.multicast_bft_message(ctx, network_message) + ); + Ok(::futures::AsyncSink::Ready) + } + + fn poll_complete(&mut self) -> ::futures::Poll<(), E> { + Ok(Async::Ready(())) + } +} + +// check signature and authority validity of message. +fn process_bft_message(msg: msg::LocalizedBftMessage, local_id: &SessionKey, authorities: &[SessionKey]) -> Result>, bft::Error> { + Ok(Some(match msg.message { + msg::BftMessage::Consensus(c) => ::rhododendron::Communication::Consensus(match c { + msg::SignedConsensusMessage::Propose(proposal) => ::rhododendron::LocalizedMessage::Propose({ + if &proposal.sender == local_id { return Ok(None) } + let proposal = ::rhododendron::LocalizedProposal { + round_number: proposal.round_number as usize, + proposal: proposal.proposal, + digest: proposal.digest, + sender: proposal.sender, + digest_signature: ed25519::LocalizedSignature { + signature: proposal.digest_signature, + signer: ed25519::Public(proposal.sender.into()), + }, + full_signature: ed25519::LocalizedSignature { + signature: proposal.full_signature, + signer: ed25519::Public(proposal.sender.into()), + } + }; + bft::check_proposal(authorities, &msg.parent_hash, &proposal)?; + + trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender.0)); + proposal + }), + msg::SignedConsensusMessage::Vote(vote) => ::rhododendron::LocalizedMessage::Vote({ + if &vote.sender == local_id { return Ok(None) } + let vote = ::rhododendron::LocalizedVote { + sender: vote.sender, + signature: ed25519::LocalizedSignature { + signature: vote.signature, + signer: ed25519::Public(vote.sender.0), + }, + vote: match vote.vote { + msg::ConsensusVote::Prepare(r, h) => ::rhododendron::Vote::Prepare(r as usize, h), + msg::ConsensusVote::Commit(r, h) => ::rhododendron::Vote::Commit(r as usize, h), + msg::ConsensusVote::AdvanceRound(r) => ::rhododendron::Vote::AdvanceRound(r as usize), + } + }; + bft::check_vote::(authorities, &msg.parent_hash, &vote)?; + + trace!(target: "bft", "importing vote {:?} from {}", vote.vote, Hash::from(vote.sender.0)); + vote + }), + }), + msg::BftMessage::Auxiliary(a) => { + let justification = bft::UncheckedJustification::from(a); + // TODO: get proper error + let justification: Result<_, bft::Error> = bft::check_prepare_justification::(authorities, msg.parent_hash, justification) + .map_err(|_| bft::ErrorKind::InvalidJustification.into()); + ::rhododendron::Communication::Auxiliary(justification?) + }, + })) +} + +// task that processes all gossipped consensus messages, +// checking signatures +struct MessageProcessTask { + inner_stream: mpsc::UnboundedReceiver>, + bft_messages: mpsc::UnboundedSender>, + validators: Vec, + local_id: SessionKey, +} + +impl MessageProcessTask { + fn process_message(&self, msg: ConsensusMessage) -> Option> { + match msg { + ConsensusMessage::Bft(msg) => { + match process_bft_message(msg, &self.local_id, &self.validators[..]) { + Ok(Some(msg)) => { + if let Err(_) = self.bft_messages.unbounded_send(msg) { + // if the BFT receiving stream has ended then + // we should just bail. + trace!(target: "bft", "BFT message stream appears to have closed"); + return Some(Async::Ready(())); + } + } + Ok(None) => {} // ignored local message + Err(e) => { + debug!("Message validation failed: {:?}", e); + } + } + } + ConsensusMessage::ChainSpecific(_, _) => { + panic!("ChainSpecific messages are not allowed by the top level message handler"); + } + } + + None + } +} + +impl Future for MessageProcessTask { + type Item = (); + type Error = (); + + fn poll(&mut self) -> Poll<(), ()> { + loop { + match self.inner_stream.poll() { + Ok(Async::Ready(Some(val))) => if let Some(async) = self.process_message(val) { + return Ok(async); + }, + Ok(Async::Ready(None)) => return Ok(Async::Ready(())), + Ok(Async::NotReady) => return Ok(Async::NotReady), + Err(e) => debug!(target: "demo-network", "Error getting consensus message: {:?}", e), + } + } + } +} + +/// Input stream from the consensus network. +pub struct InputAdapter { + input: mpsc::UnboundedReceiver>, +} + +impl Stream for InputAdapter { + type Item = bft::Communication; + type Error = ::demo_consensus::Error; + + fn poll(&mut self) -> Poll, Self::Error> { + match self.input.poll() { + Err(_) | Ok(Async::Ready(None)) => Err(bft::InputStreamConcluded.into()), + Ok(x) => Ok(x) + } + } +} + +/// Wrapper around the network service +pub struct ConsensusNetwork

{ + network: Arc, + api: Arc

, +} + +impl

ConsensusNetwork

{ + /// Create a new consensus networking object. + pub fn new(network: Arc, api: Arc

) -> Self { + ConsensusNetwork { network, api } + } +} + +impl

Clone for ConsensusNetwork

{ + fn clone(&self) -> Self { + ConsensusNetwork { + network: self.network.clone(), + api: self.api.clone(), + } + } +} + +/// A long-lived network which can create parachain statement and BFT message routing processes on demand. +impl Network for ConsensusNetwork

{ + /// The input stream of BFT messages. Should never logically conclude. + type Input = InputAdapter; + /// The output sink of BFT messages. Messages sent here should eventually pass to all + /// current validators. + type Output = BftSink<::demo_consensus::Error>; + + /// Instantiate a table router using the given shared table. + fn communication_for( + &self, validators: &[SessionKey], + local_id: SessionKey, + parent_hash: Hash, + task_executor: TaskExecutor + ) -> (Self::Input, Self::Output) + { + let sink = BftSink { + network: self.network.clone(), + parent_hash, + _marker: Default::default(), + }; + + let (bft_send, bft_recv) = mpsc::unbounded(); + + // spin up a task in the background that processes all incoming statements + // TODO: propagate statements on a timer? + let process_task = self.network.with_spec(|spec, _ctx| { + spec.new_consensus(parent_hash); + MessageProcessTask { + inner_stream: spec.consensus_gossip.messages_for(parent_hash), + bft_messages: bft_send, + validators: validators.to_vec(), + local_id, + } + }); + + match process_task { + Some(task) => task_executor.spawn(task), + None => warn!(target: "demo-network", "Cannot process incoming messages: network appears to be down"), + } + + (InputAdapter { input: bft_recv }, sink) + } +} + +/// Error when the network appears to be down. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct NetworkDown; diff --git a/demo/network/src/lib.rs b/demo/network/src/lib.rs new file mode 100644 index 0000000000000..2c62124e5b731 --- /dev/null +++ b/demo/network/src/lib.rs @@ -0,0 +1,119 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Substrate Demo-specific network implementation. +//! +//! This manages gossip of consensus messages for BFT and for parachain statements, +//! parachain block and extrinsic data fetching, communication between collators and validators, +//! and more. + +extern crate substrate_bft as bft; +extern crate substrate_network; +extern crate substrate_primitives; + +extern crate demo_api; +extern crate demo_consensus; +extern crate demo_primitives; + +extern crate ed25519; +extern crate futures; +extern crate parking_lot; +extern crate tokio; +extern crate rhododendron; + +#[macro_use] +extern crate log; + +pub mod consensus; + +use demo_primitives::{Block, Hash, Header}; +use substrate_network::{NodeIndex, Context, Severity}; +use substrate_network::consensus_gossip::ConsensusGossip; +use substrate_network::{message, generic_message}; +use substrate_network::specialization::Specialization; +use substrate_network::StatusMessage as GenericFullStatus; + +/// Demo protocol id. +pub const PROTOCOL_ID: ::substrate_network::ProtocolId = *b"sub"; + +type FullStatus = GenericFullStatus; + +/// Specialization of the network service for the demo protocol. +pub type NetworkService = ::substrate_network::Service; + + +/// Demo protocol attachment for substrate. +pub struct Protocol { + consensus_gossip: ConsensusGossip, + live_consensus: Option, +} + +impl Protocol { + /// Instantiate a demo protocol handler. + pub fn new() -> Self { + Protocol { + consensus_gossip: ConsensusGossip::new(), + live_consensus: None, + } + } + + /// Note new consensus session. + fn new_consensus(&mut self, hash: Hash) { + let old_consensus = self.live_consensus.take(); + self.live_consensus = Some(hash); + self.consensus_gossip.collect_garbage(old_consensus.as_ref()); + } +} + +impl Specialization for Protocol { + fn status(&self) -> Vec { + Vec::new() + } + + fn on_connect(&mut self, ctx: &mut Context, who: NodeIndex, status: FullStatus) { + self.consensus_gossip.new_peer(ctx, who, status.roles); + } + + fn on_disconnect(&mut self, ctx: &mut Context, who: NodeIndex) { + self.consensus_gossip.peer_disconnected(ctx, who); + } + + fn on_message(&mut self, ctx: &mut Context, who: NodeIndex, message: message::Message) { + match message { + generic_message::Message::BftMessage(msg) => { + trace!(target: "demo-network", "BFT message from {}: {:?}", who, msg); + // TODO: check signature here? what if relevant block is unknown? + self.consensus_gossip.on_bft_message(ctx, who, msg) + } + generic_message::Message::ChainSpecific(_) => { + trace!(target: "demo-network", "Bad message from {}", who); + ctx.report_peer(who, Severity::Bad("Invalid demo protocol message format")); + } + _ => {} + } + } + + fn on_abort(&mut self) { + self.consensus_gossip.abort(); + } + + fn maintain_peers(&mut self, _ctx: &mut Context) { + } + + fn on_block_imported(&mut self, _ctx: &mut Context, _hash: Hash, _header: &Header) { + } +} + diff --git a/demo/primitives/Cargo.toml b/demo/primitives/Cargo.toml index 1a359e06e7463..b517210d1951b 100644 --- a/demo/primitives/Cargo.toml +++ b/demo/primitives/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../substrate/codec", default_features = false } +substrate-codec-derive = { path = "../../substrate/codec/derive", default_features = false } substrate-primitives = { path = "../../substrate/primitives", default_features = false } substrate-runtime-std = { path = "../../substrate/runtime-std", default_features = false } substrate-runtime-primitives = { path = "../../substrate/runtime/primitives", default_features = false } @@ -18,6 +19,7 @@ pretty_assertions = "0.4" [features] default = ["std"] std = [ + "substrate-codec-derive/std", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index a435edd3696e2..6e635074ee1ce 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -21,13 +21,27 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[macro_use] +extern crate substrate_codec_derive; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_primitives as primitives; extern crate substrate_codec as codec; +use rstd::prelude::*; +use runtime_primitives::generic; +#[cfg(feature = "std")] +use primitives::bytes; +use runtime_primitives::traits::BlakeTwo256; + /// An index to a block. pub type BlockNumber = u64; @@ -54,3 +68,32 @@ pub type Hash = primitives::H256; /// Alias to 512-bit hash when used in the context of a signature on the relay chain. pub type Signature = runtime_primitives::MaybeUnsigned; + +/// A timestamp: seconds since the unix epoch. +pub type Timestamp = u64; + +/// Header type. +pub type Header = generic::Header; +/// Block type. +pub type Block = generic::Block; +/// Block ID. +pub type BlockId = generic::BlockId; + +/// A log entry in the block. +#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +/// Opaque, encoded, unchecked extrinsic. +#[derive(PartialEq, Eq, Clone, Default, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct UncheckedExtrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); +/// +/// Inherent data to include in a block. +#[derive(Encode, Decode)] +pub struct InherentData { + /// Current timestamp. + pub timestamp: Timestamp, + /// Indices of offline validators. + pub offline_indices: Vec, +} diff --git a/demo/runtime/src/checked_block.rs b/demo/runtime/src/checked_block.rs new file mode 100644 index 0000000000000..41b9e7400c82a --- /dev/null +++ b/demo/runtime/src/checked_block.rs @@ -0,0 +1,94 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Typesafe block interaction. + +use super::{Call, Block, TIMESTAMP_SET_POSITION, NOTE_OFFLINE_POSITION}; +use timestamp::Call as TimestampCall; +use consensus::Call as ConsensusCall; + +/// Provides a type-safe wrapper around a structurally valid block. +pub struct CheckedBlock { + inner: Block, + file_line: Option<(&'static str, u32)>, +} + +impl CheckedBlock { + /// Create a new checked block. Fails if the block is not structurally valid. + pub fn new(block: Block) -> Result { + let has_timestamp = block.extrinsics.get(TIMESTAMP_SET_POSITION as usize).map_or(false, |xt| { + !xt.is_signed() && match xt.extrinsic.function { + Call::Timestamp(TimestampCall::set(_)) => true, + _ => false, + } + }); + + if !has_timestamp { return Err(block) } + + Ok(CheckedBlock { + inner: block, + file_line: None, + }) + } + + // Creates a new checked block, asserting that it is valid. + #[doc(hidden)] + pub fn new_unchecked(block: Block, file: &'static str, line: u32) -> Self { + CheckedBlock { + inner: block, + file_line: Some((file, line)), + } + } + + /// Extract the timestamp from the block. + pub fn timestamp(&self) -> ::demo_primitives::Timestamp { + let x = self.inner.extrinsics.get(TIMESTAMP_SET_POSITION as usize).and_then(|xt| match xt.extrinsic.function { + Call::Timestamp(TimestampCall::set(x)) => Some(x), + _ => None + }); + + match x { + Some(x) => x, + None => panic!("Invalid block asserted at {:?}", self.file_line), + } + } + + /// Extract the noted missed proposal validator indices (if any) from the block. + pub fn noted_offline(&self) -> &[u32] { + self.inner.extrinsics.get(NOTE_OFFLINE_POSITION as usize).and_then(|xt| match xt.extrinsic.function { + Call::Consensus(ConsensusCall::note_offline(ref x)) => Some(&x[..]), + _ => None, + }).unwrap_or(&[]) + } + + /// Convert into inner block. + pub fn into_inner(self) -> Block { self.inner } +} + +impl ::std::ops::Deref for CheckedBlock { + type Target = Block; + + fn deref(&self) -> &Block { &self.inner } +} + +/// Assert that a block is structurally valid. May lead to panic in the future +/// in case it isn't. +#[macro_export] +macro_rules! assert_demo_block { + ($block: expr) => { + $crate::CheckedBlock::new_unchecked($block, file!(), line!()) + } +} diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index f0c39af85d198..9786b5b43fa1a 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -53,6 +53,9 @@ extern crate substrate_runtime_timestamp as timestamp; extern crate substrate_runtime_version as version; extern crate demo_primitives; +#[cfg(feature = "std")] +mod checked_block; + use rstd::prelude::*; use demo_primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; @@ -61,6 +64,13 @@ use version::RuntimeVersion; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; +pub use consensus::Call as ConsensusCall; +pub use timestamp::Call as TimestampCall; +#[cfg(any(feature = "std", test))] +pub use checked_block::CheckedBlock; + +const TIMESTAMP_SET_POSITION: u32 = 0; +const NOTE_OFFLINE_POSITION: u32 = 1; // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] @@ -115,7 +125,7 @@ impl balances::Trait for Concrete { pub type Balances = balances::Module; impl consensus::Trait for Concrete { - const NOTE_OFFLINE_POSITION: u32 = 1; + const NOTE_OFFLINE_POSITION: u32 = NOTE_OFFLINE_POSITION; type SessionKey = SessionKey; type OnOfflineValidator = Staking; } @@ -124,7 +134,7 @@ impl consensus::Trait for Concrete { pub type Consensus = consensus::Module; impl timestamp::Trait for Concrete { - const TIMESTAMP_SET_POSITION: u32 = 0; + const TIMESTAMP_SET_POSITION: u32 = TIMESTAMP_SET_POSITION; type Moment = u64; } @@ -203,6 +213,8 @@ impl_outer_dispatch! { } } +/// The address format for describing accounts. +pub use balances::address::Address as RawAddress; /// The address format for describing accounts. pub type Address = balances::Address; /// Block header type as expected by this runtime. diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 69c9a94694d4f..da5ecb853ff84 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -88,6 +88,7 @@ dependencies = [ "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)", "substrate-codec 0.1.0", + "substrate-codec-derive 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", diff --git a/demo/runtime/wasm/build.sh b/demo/runtime/wasm/build.sh index 0769faeba9b3e..cf1607689e6a2 100755 --- a/demo/runtime/wasm/build.sh +++ b/demo/runtime/wasm/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -cargo +nightly build --target=wasm32-unknown-unknown --release +cargo +nightly-2018-08-27 build --target=wasm32-unknown-unknown --release for i in demo_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 8720f2c749ab4abd1cb3738b8042bf7551cb99b5..6697174a78d7a8359706434f7dc539739444ec54 100644 GIT binary patch delta 25975 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 NBUlv(z-`&={|_uxvDW|q delta 85206 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 C)$D2j diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 1f2754cb57775845bf48353ed4f22ea213fd492f..be302908d52a54fbdcad5234cb795f21e878c110 100755 GIT binary patch delta 30131 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"] + +[dependencies] +parking_lot = "0.4" +error-chain = "0.12" +lazy_static = "1.0" +log = "0.3" +slog = "^2" +tokio = "0.1.7" +hex-literal = "0.1" +ed25519 = { path = "../../substrate/ed25519" } +demo-api = { path = "../api" } +demo-primitives = { path = "../primitives" } +demo-runtime = { path = "../runtime" } +demo-executor = { path = "../executor" } +demo-consensus = { path = "../consensus" } +demo-network = { path = "../network" } +demo-transaction-pool = { path = "../transaction-pool" } +substrate-runtime-io = { path = "../../substrate/runtime-io" } +substrate-primitives = { path = "../../substrate/primitives" } +substrate-network = { path = "../../substrate/network" } +substrate-client = { path = "../../substrate/client" } +substrate-service = { path = "../../substrate/service" } +substrate-telemetry = { path = "../../substrate/telemetry" } diff --git a/demo/service/src/chain_spec.rs b/demo/service/src/chain_spec.rs new file mode 100644 index 0000000000000..34d436f50193b --- /dev/null +++ b/demo/service/src/chain_spec.rs @@ -0,0 +1,196 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +//! Substrate Demo chain configurations. + +use ed25519; +use primitives::AuthorityId; +use demo_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, + SessionConfig, StakingConfig, TimestampConfig, BalancesConfig}; +use service::ChainSpec; + +const STAGING_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/"; + +pub fn testnet_config() -> Result, String> { + //ChainSpec::from_embedded(include_bytes!("../res/demo.json")) + Ok(staging_testnet_config()) +} + +fn staging_testnet_config_genesis() -> GenesisConfig { + let initial_authorities = vec![ + hex!["82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5"].into(), + hex!["4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7"].into(), + hex!["063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5"].into(), + hex!["8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c"].into(), + ]; + let endowed_accounts = vec![ + hex!["f295940fa750df68a686fcf4abd4111c8a9c5a5a5a83c4c8639c451a94a7adfd"].into(), + ]; + GenesisConfig { + consensus: Some(ConsensusConfig { + code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm").to_vec(), // TODO change + authorities: initial_authorities.clone(), + }), + system: None, + balances: Some(BalancesConfig { + transaction_base_fee: 100, + transaction_byte_fee: 1, + existential_deposit: 500, + transfer_fee: 0, + creation_fee: 0, + reclaim_rebate: 0, + balances: endowed_accounts.iter().map(|&k|(k, 1u64 << 60)).collect(), + }), + session: Some(SessionConfig { + validators: initial_authorities.iter().cloned().map(Into::into).collect(), + session_length: 60, // that's 5 minutes per session. + }), + staking: Some(StakingConfig { + current_era: 0, + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), + early_era_slash: 10000, + session_reward: 100, + validator_count: 12, + sessions_per_era: 12, // 1 hour per era + bonding_duration: 24 * 60 * 12, // 1 day per bond. + offline_slash_grace: 4, + minimum_validator_count: 4, + }), + democracy: Some(DemocracyConfig { + launch_period: 12 * 60 * 24, // 1 day per public referendum + voting_period: 12 * 60 * 24 * 3, // 3 days to discuss & vote on an active referendum + minimum_deposit: 5000, // 12000 as the minimum deposit for a referendum + }), + council: Some(CouncilConfig { + active_council: vec![], + candidacy_bond: 5000, // 5000 to become a council candidate + voter_bond: 1000, // 1000 down to vote for a candidate + present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. + carry_count: 6, // carry over the 6 runners-up to the next council election + presentation_duration: 12 * 60 * 24, // one day for presenting winners. + approval_voting_period: 12 * 60 * 24 * 2, // two days period between possible council elections. + term_duration: 12 * 60 * 24 * 24, // 24 day term duration for the council. + desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. + inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. + + cooloff_period: 12 * 60 * 24 * 4, // 4 day cooling off period if council member vetoes a proposal. + voting_period: 12 * 60 * 24, // 1 day voting period for council members. + }), + timestamp: Some(TimestampConfig { + period: 5, // 5 second block time. + }), + } +} + +/// Staging testnet config. +pub fn staging_testnet_config() -> ChainSpec { + let boot_nodes = vec![]; + ChainSpec::from_genesis( + "Staging Testnet", + "staging_testnet", + staging_testnet_config_genesis, + boot_nodes, + Some(STAGING_TELEMETRY_URL.into()), + ) +} + +fn testnet_genesis(initial_authorities: Vec) -> GenesisConfig { + let endowed_accounts = vec![ + ed25519::Pair::from_seed(b"Alice ").public().0.into(), + ed25519::Pair::from_seed(b"Bob ").public().0.into(), + ed25519::Pair::from_seed(b"Charlie ").public().0.into(), + ed25519::Pair::from_seed(b"Dave ").public().0.into(), + ed25519::Pair::from_seed(b"Eve ").public().0.into(), + ed25519::Pair::from_seed(b"Ferdie ").public().0.into(), + ]; + GenesisConfig { + consensus: Some(ConsensusConfig { + code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm").to_vec(), + authorities: initial_authorities.clone(), + }), + system: None, + balances: Some(BalancesConfig { + transaction_base_fee: 1, + transaction_byte_fee: 0, + existential_deposit: 500, + transfer_fee: 0, + creation_fee: 0, + reclaim_rebate: 0, + balances: endowed_accounts.iter().map(|&k|(k, (1u64 << 60))).collect(), + }), + session: Some(SessionConfig { + validators: initial_authorities.iter().cloned().map(Into::into).collect(), + session_length: 10, + }), + staking: Some(StakingConfig { + current_era: 0, + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), + minimum_validator_count: 1, + validator_count: 2, + sessions_per_era: 5, + bonding_duration: 2 * 60 * 12, + early_era_slash: 0, + session_reward: 0, + offline_slash_grace: 0, + }), + democracy: Some(DemocracyConfig { + launch_period: 9, + voting_period: 18, + minimum_deposit: 10, + }), + council: Some(CouncilConfig { + active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|&b| a.0 == b.0).is_none()).map(|a| (a.clone(), 1000000)).collect(), + candidacy_bond: 10, + voter_bond: 2, + present_slash_per_voter: 1, + carry_count: 4, + presentation_duration: 10, + approval_voting_period: 20, + term_duration: 1000000, + desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32, + inactive_grace_period: 1, + + cooloff_period: 75, + voting_period: 20, + }), + timestamp: Some(TimestampConfig { + period: 5, // 5 second block time. + }), + } +} + +fn development_config_genesis() -> GenesisConfig { + testnet_genesis(vec![ + ed25519::Pair::from_seed(b"Alice ").public().into(), + ]) +} + +/// Development config (single validator Alice) +pub fn development_config() -> ChainSpec { + ChainSpec::from_genesis("Development", "development", development_config_genesis, vec![], None) +} + +fn local_testnet_genesis() -> GenesisConfig { + testnet_genesis(vec![ + ed25519::Pair::from_seed(b"Alice ").public().into(), + ed25519::Pair::from_seed(b"Bob ").public().into(), + ]) +} + +/// Local testnet config (multivalidator Alice + Bob) +pub fn local_testnet_config() -> ChainSpec { + ChainSpec::from_genesis("Local Testnet", "local_testnet", local_testnet_genesis, vec![], None) +} diff --git a/demo/service/src/lib.rs b/demo/service/src/lib.rs new file mode 100644 index 0000000000000..f763748153e7f --- /dev/null +++ b/demo/service/src/lib.rs @@ -0,0 +1,214 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +#![warn(unused_extern_crates)] + +//! Substrate Demo service. Specialized wrapper over substrate service. + +extern crate ed25519; +extern crate demo_api; +extern crate demo_primitives; +extern crate demo_runtime; +extern crate demo_executor; +extern crate demo_network; +extern crate demo_transaction_pool as transaction_pool; +extern crate demo_consensus as consensus; +extern crate substrate_primitives as primitives; +extern crate substrate_network as network; +extern crate substrate_client as client; +extern crate substrate_service as service; +extern crate tokio; + +#[macro_use] +extern crate log; +#[macro_use] +extern crate hex_literal; + +pub mod chain_spec; + +use std::sync::Arc; + +use transaction_pool::TransactionPool; +use demo_api::Api; +use demo_primitives::{Block, Hash}; +use demo_runtime::GenesisConfig; +use client::Client; +use demo_network::{Protocol as DemoProtocol, consensus::ConsensusNetwork}; +use tokio::runtime::TaskExecutor; +use service::FactoryFullConfiguration; +use primitives::{KeccakHasher, RlpCodec}; + +pub use service::{Roles, PruningMode, ExtrinsicPoolOptions, + ErrorKind, Error, ComponentBlock, LightComponents, FullComponents}; +pub use client::ExecutionStrategy; + +/// Specialised `ChainSpec`. +pub type ChainSpec = service::ChainSpec; +/// Client type for specialised `Components`. +pub type ComponentClient = Client<::Backend, ::Executor, Block>; +pub type NetworkService = network::Service::NetworkProtocol, Hash>; + +/// A collection of type to generalise specific components over full / light client. +pub trait Components: service::Components { + /// Demo API. + type Api: 'static + Api + Send + Sync; + /// Client backend. + type Backend: 'static + client::backend::Backend; + /// Client executor. + type Executor: 'static + client::CallExecutor + Send + Sync; +} + +impl Components for service::LightComponents { + type Api = service::LightClient; + type Executor = service::LightExecutor; + type Backend = service::LightBackend; +} + +impl Components for service::FullComponents { + type Api = service::FullClient; + type Executor = service::FullExecutor; + type Backend = service::FullBackend; +} + +/// All configuration for the node. +pub type Configuration = FactoryFullConfiguration; + +/// Demo-specific configuration. +#[derive(Default)] +pub struct CustomConfiguration; + +/// Config for the substrate service. +pub struct Factory; + +impl service::ServiceFactory for Factory { + type Block = Block; + type ExtrinsicHash = Hash; + type NetworkProtocol = DemoProtocol; + type RuntimeDispatch = demo_executor::Executor; + type FullExtrinsicPoolApi = transaction_pool::ChainApi>; + type LightExtrinsicPoolApi = transaction_pool::ChainApi>; + type Genesis = GenesisConfig; + type Configuration = CustomConfiguration; + + const NETWORK_PROTOCOL_ID: network::ProtocolId = ::demo_network::PROTOCOL_ID; + + fn build_full_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc>) + -> Result>, Error> + { + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + } + + fn build_light_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc>) + -> Result>, Error> + { + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) + } + + fn build_network_protocol(_config: &Configuration) + -> Result + { + Ok(DemoProtocol::new()) + } +} + +/// Demo service. +pub struct Service { + inner: service::Service, + client: Arc>, + network: Arc, + api: Arc<::Api>, + _consensus: Option, +} + +impl Service { + pub fn client(&self) -> Arc> { + self.client.clone() + } + + pub fn network(&self) -> Arc { + self.network.clone() + } + + pub fn api(&self) -> Arc<::Api> { + self.api.clone() + } +} + +/// Creates light client and register protocol with the network service +pub fn new_light(config: Configuration, executor: TaskExecutor) + -> Result>, Error> +{ + let service = service::Service::>::new(config, executor.clone())?; + let api = service.client(); + Ok(Service { + client: service.client(), + network: service.network(), + api: api, + inner: service, + _consensus: None, + }) +} + +/// Creates full client and register protocol with the network service +pub fn new_full(config: Configuration, executor: TaskExecutor) + -> Result>, Error> +{ + let is_validator = (config.roles & Roles::AUTHORITY) == Roles::AUTHORITY; + let service = service::Service::>::new(config, executor.clone())?; + // Spin consensus service if configured + let consensus = if is_validator { + // Load the first available key + let key = service.keystore().load(&service.keystore().contents()?[0], "")?; + info!("Using authority key {}", key.public()); + + let client = service.client(); + + let consensus_net = ConsensusNetwork::new(service.network(), client.clone()); + Some(consensus::Service::new( + client.clone(), + client.clone(), + consensus_net, + service.extrinsic_pool(), + executor, + key, + )) + } else { + None + }; + + Ok(Service { + client: service.client(), + network: service.network(), + api: service.client(), + inner: service, + _consensus: consensus, + }) +} + +/// Creates bare client without any networking. +pub fn new_client(config: Configuration) + -> Result>>, Error> +{ + service::new_client::(config) +} + +impl ::std::ops::Deref for Service { + type Target = service::Service; + + fn deref(&self) -> &Self::Target { + &self.inner + } +} diff --git a/demo/src/main.rs b/demo/src/main.rs index 82e48dfc70cf8..f20f48f210b11 100644 --- a/demo/src/main.rs +++ b/demo/src/main.rs @@ -19,12 +19,51 @@ #![warn(missing_docs)] extern crate demo_cli as cli; +extern crate ctrlc; +extern crate futures; #[macro_use] extern crate error_chain; +use cli::VersionInfo; +use futures::sync::oneshot; +use futures::{future, Future}; + +use std::cell::RefCell; + +mod vergen { + #![allow(unused)] + include!(concat!(env!("OUT_DIR"), "/version.rs")); +} + +// handles ctrl-c +struct Exit; +impl cli::IntoExit for Exit { + type Exit = future::MapErr, fn(oneshot::Canceled) -> ()>; + fn into_exit(self) -> Self::Exit { + // can't use signal directly here because CtrlC takes only `Fn`. + let (exit_send, exit) = oneshot::channel(); + + let exit_send_cell = RefCell::new(Some(exit_send)); + ctrlc::CtrlC::set_handler(move || { + if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { + exit_send.send(()).expect("Error sending exit notification"); + } + }); + + exit.map_err(drop) + } +} + quick_main!(run); fn run() -> cli::error::Result<()> { - cli::run(::std::env::args()) + let version = VersionInfo { + commit: vergen::short_sha(), + version: env!("CARGO_PKG_VERSION"), + executable_name: "substrate-demo", + author: "Parity Team ", + description: "Substrate Demo Implementation", + }; + cli::run(::std::env::args(), Exit, version) } diff --git a/demo/transaction-pool/Cargo.toml b/demo/transaction-pool/Cargo.toml new file mode 100644 index 0000000000000..94eaae111ae7d --- /dev/null +++ b/demo/transaction-pool/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "demo-transaction-pool" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +log = "0.3.0" +error-chain = "0.12" +parking_lot = "0.4" +demo-api = { path = "../api" } +demo-primitives = { path = "../primitives" } +demo-runtime = { path = "../runtime" } +substrate-client = { path = "../../substrate/client" } +substrate-codec = { path = "../../substrate/codec" } +substrate-keyring = { path = "../../substrate/keyring" } +substrate-extrinsic-pool = { path = "../../substrate/extrinsic-pool" } +substrate-primitives = { path = "../../substrate/primitives" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } +ed25519 = { path = "../../substrate/ed25519" } diff --git a/demo/transaction-pool/src/error.rs b/demo/transaction-pool/src/error.rs new file mode 100644 index 0000000000000..2303372084e13 --- /dev/null +++ b/demo/transaction-pool/src/error.rs @@ -0,0 +1,73 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +use extrinsic_pool; +use demo_api; +use primitives::Hash; +use runtime::{Address, UncheckedExtrinsic}; + +error_chain! { + links { + Pool(extrinsic_pool::Error, extrinsic_pool::ErrorKind); + Api(demo_api::Error, demo_api::ErrorKind); + } + errors { + /// Unexpected extrinsic format submitted + InvalidExtrinsicFormat { + description("Invalid extrinsic format."), + display("Invalid extrinsic format."), + } + /// Attempted to queue an inherent transaction. + IsInherent(xt: UncheckedExtrinsic) { + description("Inherent transactions cannot be queued."), + display("Inherent transactions cannot be queued."), + } + /// Attempted to queue a transaction with bad signature. + BadSignature(e: &'static str) { + description("Transaction had bad signature."), + display("Transaction had bad signature: {}", e), + } + /// Attempted to queue a transaction that is already in the pool. + AlreadyImported(hash: Hash) { + description("Transaction is already in the pool."), + display("Transaction {:?} is already in the pool.", hash), + } + /// Import error. + Import(err: Box<::std::error::Error + Send>) { + description("Error importing transaction"), + display("Error importing transaction: {}", err.description()), + } + /// Runtime failure. + UnrecognisedAddress(who: Address) { + description("Unrecognised address in extrinsic"), + display("Unrecognised address in extrinsic: {}", who), + } + /// Extrinsic too large + TooLarge(got: usize, max: usize) { + description("Extrinsic too large"), + display("Extrinsic is too large ({} > {})", got, max), + } + } +} + +impl extrinsic_pool::IntoPoolError for Error { + fn into_pool_error(self) -> ::std::result::Result { + match self { + Error(ErrorKind::Pool(e), c) => Ok(extrinsic_pool::Error(e, c)), + e => Err(e), + } + } +} diff --git a/demo/transaction-pool/src/lib.rs b/demo/transaction-pool/src/lib.rs new file mode 100644 index 0000000000000..7e068e551cc27 --- /dev/null +++ b/demo/transaction-pool/src/lib.rs @@ -0,0 +1,237 @@ +// Copyright 2018 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate Demo is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate Demo. If not, see . + +extern crate ed25519; +extern crate substrate_client as client; +extern crate substrate_codec as codec; +extern crate substrate_extrinsic_pool as extrinsic_pool; +extern crate substrate_primitives; +extern crate substrate_runtime_primitives; +extern crate demo_runtime as runtime; +extern crate demo_primitives as primitives; +extern crate demo_api; +extern crate parking_lot; + +#[cfg(test)] +extern crate substrate_keyring; + +#[macro_use] +extern crate error_chain; + +#[macro_use] +extern crate log; + +mod error; + +use std::{ + cmp::Ordering, + collections::HashMap, + sync::Arc, +}; + +use codec::{Decode, Encode}; +use extrinsic_pool::{Readiness, scoring::{Change, Choice}, VerifiedFor, ExtrinsicFor}; +use demo_api::Api; +use primitives::{AccountId, BlockId, Block, Hash, Index}; +use runtime::{Address, UncheckedExtrinsic, RawAddress}; +use substrate_runtime_primitives::traits::{Bounded, Checkable, Hash as HashT, BlakeTwo256}; + +pub use extrinsic_pool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; +pub use error::{Error, ErrorKind, Result}; + +/// Maximal size of a single encoded extrinsic. +const MAX_TRANSACTION_SIZE: usize = 4 * 1024 * 1024; + +/// Type alias for convenience. +pub type CheckedExtrinsic = std::result::Result>>::Checked; + +/// Type alias for the transaction pool. +pub type TransactionPool = extrinsic_pool::Pool>; + +/// A verified transaction which should be includable and non-inherent. +#[derive(Clone, Debug)] +pub struct VerifiedTransaction { + /// Transaction hash. + pub hash: Hash, + /// Transaction sender. + pub sender: AccountId, + /// Transaction index. + pub index: Index, + encoded_size: usize, +} + +impl VerifiedTransaction { + /// Get the 256-bit hash of this transaction. + pub fn hash(&self) -> &Hash { + &self.hash + } + + /// Get the account ID of the sender of this transaction. + pub fn index(&self) -> Index { + self.index + } + + /// Get encoded size of the transaction. + pub fn encoded_size(&self) -> usize { + self.encoded_size + } +} + +impl extrinsic_pool::VerifiedTransaction for VerifiedTransaction { + type Hash = Hash; + type Sender = AccountId; + + fn hash(&self) -> &Self::Hash { + &self.hash + } + + fn sender(&self) -> &Self::Sender { + &self.sender + } + + fn mem_usage(&self) -> usize { + self.encoded_size // TODO + } +} + +/// The transaction pool logic. +pub struct ChainApi { + api: Arc, +} + +impl ChainApi where + A: Api, +{ + /// Create a new instance. + pub fn new(api: Arc) -> Self { + ChainApi { + api, + } + } +} + + +impl extrinsic_pool::ChainApi for ChainApi where + A: Api + Send + Sync, +{ + type Block = Block; + type Hash = Hash; + type Sender = AccountId; + type VEx = VerifiedTransaction; + type Ready = HashMap; + type Error = Error; + type Score = u64; + type Event = (); + + fn verify_transaction(&self, _at: &BlockId, xt: &ExtrinsicFor) -> Result { + let encoded = xt.encode(); + let uxt = UncheckedExtrinsic::decode(&mut encoded.as_slice()).ok_or_else(|| ErrorKind::InvalidExtrinsicFormat)?; + if !uxt.is_signed() { + bail!(ErrorKind::IsInherent(uxt)) + } + + let (encoded_size, hash) = (encoded.len(), BlakeTwo256::hash(&encoded)); + if encoded_size > MAX_TRANSACTION_SIZE { + bail!(ErrorKind::TooLarge(encoded_size, MAX_TRANSACTION_SIZE)); + } + + debug!(target: "transaction-pool", "Transaction submitted: {}", ::substrate_primitives::hexdisplay::HexDisplay::from(&encoded)); + let checked = uxt.clone().check_with(|a| { + match a { + RawAddress::Id(id) => Ok(id), + RawAddress::Index(_) => Err("Index based addresses are not supported".into()),// TODO: Make index addressing optional in substrate + } + })?; + let sender = checked.signed.clone(); + + + if encoded_size < 1024 { + debug!(target: "transaction-pool", "Transaction verified: {} => {:?}", hash, uxt); + } else { + debug!(target: "transaction-pool", "Transaction verified: {} ({} bytes is too large to display)", hash, encoded_size); + } + + Ok(VerifiedTransaction { + index: checked.index, + sender, + hash, + encoded_size, + }) + } + + fn ready(&self) -> Self::Ready { + HashMap::default() + } + + fn is_ready(&self, at: &BlockId, known_nonces: &mut Self::Ready, xt: &VerifiedFor) -> Readiness { + let sender = xt.verified.sender().clone(); + trace!(target: "transaction-pool", "Checking readiness of {} (from {})", xt.verified.hash, sender); + + // TODO: find a way to handle index error properly -- will need changes to + // transaction-pool trait. + let api = &self.api; + let next_index = known_nonces.entry(sender) + .or_insert_with(|| api.index(at, sender).ok().unwrap_or_else(Bounded::max_value)); + + trace!(target: "transaction-pool", "Next index for sender is {}; xt index is {}", next_index, xt.verified.index); + + let result = match xt.verified.index.cmp(&next_index) { + // TODO: this won't work perfectly since accounts can now be killed, returning the nonce + // to zero. + // We should detect if the index was reset and mark all transactions as `Stale` for cull to work correctly. + // Otherwise those transactions will keep occupying the queue. + // Perhaps we could mark as stale if `index - state_index` > X? + Ordering::Greater => Readiness::Future, + Ordering::Equal => Readiness::Ready, + // TODO [ToDr] Should mark transactions referencing too old blockhash as `Stale` as well. + Ordering::Less => Readiness::Stale, + }; + + // remember to increment `next_index` + *next_index = next_index.saturating_add(1); + + result + } + + fn compare(old: &VerifiedFor, other: &VerifiedFor) -> Ordering { + old.verified.index().cmp(&other.verified.index()) + } + + fn choose(old: &VerifiedFor, new: &VerifiedFor) -> Choice { + if old.verified.index() == new.verified.index() { + return Choice::ReplaceOld; + } + Choice::InsertNew + } + + fn update_scores( + xts: &[extrinsic_pool::Transaction>], + scores: &mut [Self::Score], + _change: Change<()> + ) { + for i in 0..xts.len() { + // all the same score since there are no fees. + // TODO: prioritize things like misbehavior or fishermen reports + scores[i] = 1; + } + } + + fn should_replace(_old: &VerifiedFor, _new: &VerifiedFor) -> Choice { + // Don't allow new transactions if we are reaching the limit. + Choice::RejectNew + } +} + diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 2bd53d1a881ff..f1941270a2bd8 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -25,7 +25,7 @@ use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One, use runtime_primitives::BuildStorage; use primitives::{KeccakHasher, RlpCodec}; use primitives::storage::{StorageKey, StorageData}; -use codec::Decode; +use codec::{Encode, Decode}; use state_machine::{ Ext, OverlayedChanges, Backend as StateBackend, CodeExecutor, ExecutionStrategy, ExecutionManager, prove_read @@ -298,6 +298,51 @@ impl Client where block_builder::BlockBuilder::at_block(parent, &self) } + /// Call a runtime function at given block. + pub fn call_api(&self, at: &BlockId, function: &'static str, args: &A) -> error::Result + where + A: Encode, + R: Decode, + { + let parent = at; + let header = <::Header as HeaderT>::new( + self.block_number_from_id(&parent)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))? + As::sa(1), + Default::default(), + Default::default(), + self.block_hash_from_id(&parent)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))?, + Default::default() + ); + self.state_at(&parent).and_then(|state| { + let mut overlay = Default::default(); + let execution_manager = || ExecutionManager::Both(|wasm_result, native_result| { + warn!("Consensus error between wasm and native runtime execution at block {:?}", at); + warn!(" Function {:?}", function); + warn!(" Native result {:?}", native_result); + warn!(" Wasm result {:?}", wasm_result); + wasm_result + }); + self.executor().call_at_state( + &state, + &mut overlay, + "initialise_block", + &header.encode(), + execution_manager() + )?; + let (r, _) = args.using_encoded(|input| + self.executor().call_at_state( + &state, + &mut overlay, + function, + input, + execution_manager() + ))?; + Ok(R::decode(&mut &r[..]) + .ok_or_else(|| error::Error::from(error::ErrorKind::CallResultDecode(function)))?) + }) + } + /// Check a header's justification. pub fn check_justification( &self, diff --git a/substrate/client/src/light/call_executor.rs b/substrate/client/src/light/call_executor.rs index 8d3cd98f9f84e..c7dc3a920b1de 100644 --- a/substrate/client/src/light/call_executor.rs +++ b/substrate/client/src/light/call_executor.rs @@ -45,6 +45,15 @@ pub struct RemoteCallExecutor { fetcher: Arc, } +impl Clone for RemoteCallExecutor { + fn clone(&self) -> Self { + RemoteCallExecutor { + blockchain: self.blockchain.clone(), + fetcher: self.fetcher.clone() + } + } +} + impl RemoteCallExecutor { /// Creates new instance of remote call executor. pub fn new(blockchain: Arc, fetcher: Arc) -> Self { diff --git a/substrate/primitives/src/hasher.rs b/substrate/primitives/src/hasher.rs index 16b14ef25fc39..7cc00a917e743 100644 --- a/substrate/primitives/src/hasher.rs +++ b/substrate/primitives/src/hasher.rs @@ -85,4 +85,4 @@ pub mod keccak { keccak256(x).into() } } -} \ No newline at end of file +} diff --git a/substrate/service/src/lib.rs b/substrate/service/src/lib.rs index e8319d8fd88ce..e1cd2acc48d80 100644 --- a/substrate/service/src/lib.rs +++ b/substrate/service/src/lib.rs @@ -423,4 +423,4 @@ impl network::TransactionPool, ComponentBlock< fn on_broadcasted(&self, propagations: HashMap, Vec>) { self.pool.on_broadcasted(propagations) } -} \ No newline at end of file +} From a5604d6bc2696a6e2323bc76cc2cd246877aedd4 Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 4 Sep 2018 16:08:01 +0200 Subject: [PATCH 02/14] Consenus fixes --- Cargo.lock | 2 +- demo/api/src/lib.rs | 3 +- demo/network/src/lib.rs | 2 +- demo/runtime/src/lib.rs | 40 +++++++++++++++--- demo/runtime/wasm/genesis.wasm | Bin 76656 -> 0 bytes .../release/demo_runtime.compact.wasm | Bin 215780 -> 246583 bytes .../release/demo_runtime.wasm | Bin 276735 -> 307545 bytes 7 files changed, 38 insertions(+), 9 deletions(-) delete mode 100644 demo/runtime/wasm/genesis.wasm diff --git a/Cargo.lock b/Cargo.lock index 08cbf892bfc03..6cc4cd658b08f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3064,7 +3064,7 @@ dependencies = [ "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/demo/api/src/lib.rs b/demo/api/src/lib.rs index cdf0de9b62a5e..34cda3a2bd8de 100644 --- a/demo/api/src/lib.rs +++ b/demo/api/src/lib.rs @@ -148,7 +148,8 @@ where } fn inherent_extrinsics(&self, at: &BlockId, inherent_data: InherentData) -> Result> { - self.call_api(at, "inherent_extrinsics", &inherent_data) + let runtime_version = self.runtime_version_at(at)?; + self.call_api(at, "inherent_extrinsics", &(inherent_data, runtime_version.spec_version)) } } diff --git a/demo/network/src/lib.rs b/demo/network/src/lib.rs index 2c62124e5b731..a4bb3e993aa88 100644 --- a/demo/network/src/lib.rs +++ b/demo/network/src/lib.rs @@ -47,7 +47,7 @@ use substrate_network::specialization::Specialization; use substrate_network::StatusMessage as GenericFullStatus; /// Demo protocol id. -pub const PROTOCOL_ID: ::substrate_network::ProtocolId = *b"sub"; +pub const PROTOCOL_ID: ::substrate_network::ProtocolId = *b"dot"; type FullStatus = GenericFullStatus; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 9786b5b43fa1a..d3dcdc54ddeda 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -39,6 +39,7 @@ extern crate substrate_codec as codec; #[macro_use] extern crate substrate_codec_derive; +#[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_balances as balances; extern crate substrate_runtime_consensus as consensus; @@ -57,7 +58,7 @@ extern crate demo_primitives; mod checked_block; use rstd::prelude::*; -use demo_primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; +use demo_primitives::{AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature, InherentData}; use runtime_primitives::generic; use runtime_primitives::traits::{Convert, HasPublicAux, BlakeTwo256}; use version::RuntimeVersion; @@ -81,7 +82,7 @@ pub struct Concrete; /// Runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: ver_str!("demo"), - impl_name: ver_str!("parity-demo"), + impl_name: ver_str!("substrate-demo"), authoring_version: 1, spec_version: 1, impl_version: 0, @@ -135,7 +136,6 @@ pub type Consensus = consensus::Module; impl timestamp::Trait for Concrete { const TIMESTAMP_SET_POSITION: u32 = TIMESTAMP_SET_POSITION; - type Moment = u64; } @@ -231,7 +231,7 @@ pub type Extrinsic = generic::Extrinsic; pub type BareExtrinsic = generic::Extrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; + ((((((), Council), Democracy), Staking), Session), Timestamp)>; impl_outer_config! { pub struct GenesisConfig for Concrete { @@ -250,12 +250,40 @@ pub mod api { impl_stubs!( version => |()| super::Version::version(), authorities => |()| super::Consensus::authorities(), - events => |()| super::System::events(), initialise_block => |header| super::Executive::initialise_block(&header), apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), execute_block => |block| super::Executive::execute_block(block), finalise_block => |()| super::Executive::finalise_block(), + inherent_extrinsics => |(inherent, spec_version)| super::inherent_extrinsics(inherent, spec_version), validator_count => |()| super::Session::validator_count(), - validators => |()| super::Session::validators() + validators => |()| super::Session::validators(), + timestamp => |()| super::Timestamp::get(), + random_seed => |()| super::System::random_seed(), + account_nonce => |account| super::System::account_nonce(&account), + lookup_address => |address| super::Balances::lookup_address(address) ); } + +/// Produces the list of inherent extrinsics. +fn inherent_extrinsics(data: InherentData, _spec_version: u32) -> Vec { + let make_inherent = |function| UncheckedExtrinsic::new( + Extrinsic { + signed: Default::default(), + function, + index: 0, + }, + Default::default(), + ); + + let mut inherent = vec![ + make_inherent(Call::Timestamp(TimestampCall::set(data.timestamp))), + ]; + + if !data.offline_indices.is_empty() { + inherent.push(make_inherent( + Call::Consensus(ConsensusCall::note_offline(data.offline_indices)) + )); + } + + inherent +} diff --git a/demo/runtime/wasm/genesis.wasm b/demo/runtime/wasm/genesis.wasm deleted file mode 100644 index bc0cb89235c570beee9e2749b796933e05e9f774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76656 zcmeFaf3RK0ap!l=xxepyKkftG!*7yvFG2Ew0!fG>0Scr@9Eji#Q8H;;^2)nTNJWBW zUGN78LNvY663;eQORr^{cBv9pB0I=NRpeHgS=hxm+>O?TyUHw*V#i&F7?3D?4g{jma>$W+n=YihcXo=?bs80mgP?yu%{o&@)O0+ zH#Rg5Kl|Tf9%+&K6^N8D1U?U z4}a#yn{R&q2OoU$@UhSRg_~Fkyc>LJs4nKJ8vB!>QEj{k) z@lPH*d^l_CcB^hbd-(W+pL+P=$3AT@q-rufUrx_s?t`Cu^!Q_0N00h?^oYHeb*CAJ zANlknM>BibOOSE&XFOwIuN;2lk;k4qJX_?6!^b^iUPX=`qnZbQ>hM$E)>cZCtm$*gKK|2>J@w%GZ@dL!fAqdayTQMLU#n;h zS_PfoZRdHO<$0sUuTX)xe7?=UMxQ@L(daMuzeXcpY!u4qH(G;!vy~ssd%ad8&z3qT z^FjNO!;d_6>}QH>>DcF=pqCGS_H&Ou`1wbF`g4zdCfm`DRJ^Kb9dkA9J^bm3N*vU0XQ-CN{90;vL^I6D+NFG{c>-ean!rf7~aR7K>67u1XC}-!Wtt5;J-tC44 zZ;V@xV-}ja>rO%uTEp?S(4;_XGVXc}ZPic=n**90CREcYADWCi^Vwh!8vbf7jKP0b zBOCYk>6(@V%k72!zD6k3xIHwyIrwm1oB(fV*&XLf=ElWc)ZnjxLVg7J=BQc?YM1m9T?UOCW#hhab2}}jc{ymej)=58 z4{bHIWlb#(`2S#)b%k1^Jn_-_W@sFm=dEF9+@vLq;m&!aVgSn2n9UV~G9N*nW@rJq z(C=g8&h~NJDx<&2YabDb=%Ub8qi9pd8WbABf*#OgBLNxNT%Lf3CheupE?h;)#XxSE5 znaOAerC!S>Wqu6yxT8GB{$DOhy~y z<@{u{953f4qm_6$n2a{X%l>4vIbQZAqb>2WGZ}4-m+i@DTfA&eM%x<)xVdE#E-Sxv zMcEx*&K)EY)oy{I^a#R=A3qM!FXwj!KNx*9;y31ZCBL2guHtt!ziard^4rDlT7K{2 zx0~N}{I2JB1HV1|-p}twejng>6Th4J?d7+R-!1$;$ZtQtTlw9_??ZIx9oJ>|l=;<7l3ih_C40gqCGQWLmE0J%DEUCRNy$xNtCE|;HYIywTU!&|?F-wL+#&)!G5VmA zW25~_9v|JRKT}_hOjs#*DNVcN0?2DHkh6Hkx<-^fs%(}GG?lD?>twbQRc^)OL2ey z_HkZj_skdZP3A33D|naIFoC(7;>}UPjD`6?XI#wZbFFyE>;>@peQf)1JYr%uv}q59 z5VJo+T{9WY=?2U~_LNJ*_h*B0PLmNx_J4GWc5Oa#Iy)lDHkm6j7lB@yi)4<}^sjgS z30hLN@0;gwC>A>SAeyaqhhE@ai6dI8#q1Asu5FMyrY? z^h_@>ZPg2*yAO8gTpDmO1Hk8uF{x2)S@pIA?u<>F!^;Gj`_*Dq%+ZiQb(o85o=<6} zy`bQaZI;)OgMb#beA3sk*T+2C!)rj4kYk3A3x zS}s8(anYspmKl!ky0>7#O95{7>AMErxHRBq2Fsa%Xh$Zi>79mkcEy!Q2{b{-X3%~M z`pMLmewr!!7Tj(VgLj36;6?_7=fo({SJRQNraSAa=^z~qrl7oYI)gWwgTH7O&6-$; zBl48s=WwZRts~VTXTnvQOt+Fuw_TK~3mhXDpqQ)Xlln&6(8cu9SGp(OUiKj_Y7jWY<^?VjG7 zxU5d^jkY_d_a;7JdT;%`V|p)Z0H9I)=0X$nHFS011P0^zFb5JEiKiIi7nw&W{7EdV zQtP+lrdm5*&r(IPAz!a$SW9ruMO50(Ca=~qtS#uYs)RM>w&}e!=9Y9{Z_Hcc_wgEj zOvWqNM(FRDfP z4$ZHX2Ii_4!m@;GuQ<9w|JPEdHfp=Q(2K@ZYB?PaBLDkh9MmK|KPz?ky$e`+n zo_q9J5@;xQ=cunXyE|P5br*xWt<`|;0P=dnRH3S8VgyD;YluUiv_sqK!3^`sjn#Bu zjC(MeVpMVGDCf1l2#QTc3Guei9mnGUexh83Pt-N9LR`kbZOfr1# z8|_@H4nB~bt2)KUW=&KpSb^8o^Bwg(bCP|w2H5sBK)Ty0^u;1?RqJ>aaTqjMXcJYy z*{LA)!W|Nos6e61tQFqG=H%dC{P~~!?|<=2|Lt$@*9b#PXs;Kap@pGov_KMSwBS1M z7W7&cT|^5K(IS@88mU#<^fgaR8{o_4=N-{P)fWB?bTePg^DC!C?zCVg9O%W07WDaV z|NnqZG#jnh#I3K$CU9wfLzdkNeOmG$=KNujfED}w@Xq;SW@_?%a*wZht;;yp!7Sk$ zvq*^I3cWGQ&{yc!WgLIQI06gjGK^4LXD<*=!7|~@%#9OGhd8CFY%DF{)orXe#aT|K zMxnvLM*lPgGCKl)MY=aL0)3qB&5FR2;P*4D_q5DMP+0SABo}V&!`lHfd)S*^_NSMF zL7M`@jwj7Q*NP8U2QLotg}SsaB46b-qk(BbIjP23`P{$DSTIs9_QE1F!@xM)EuWqs zPCPq0?v>xpj^ghszgkRg$c?GGV0JT4s%}AfWjQ&jD8Bs^6NMc%4OJ=!sP6zlO+ea-N!xig6kfU@~6#7;~IK z*?oK-9t#UcMy(QS>bh*tn64-rcWo~lk3(z1E(kq1ge}t=VL6UkOjc=CwBF!C3^lxi zZXhg5`R)#jp|L;P%@_p?FMOtj3Hj+7+01!FER4m1t~y5fF19J0f;0r{az03_zI{*gUJ|IjgXFeV@R zi}nhDKbUXed7$n&pA+X#5}^Ud(6vuuitu3INUfTn$}od@-pugszz(SKRr-5@ckOXj zt_|@}m&Is->~?uNAN9*CMxEO8wWbO*C{R!!9}UVgDwK^n<>F{wNC39n@ML)|KPKo+ zN;W82P;yNrb4uPZnipEDSi{G{Jmu$}d_43i4+1K4$B6#5=Lm9#=k4^|bD0NaJhvW++YW0X^rs}2RXycj@3snNB4rXJ`tAZD5*a=I=xqcD z61A-pg(6jtyOO_5*c-B~`;q)9KNQ9f6|yP}GYn*E%Jrz%_yZ;up%t>J%6_w#_bZi+ z_s{$gh%s}8q=w!q)v`lZI!#e2eI`cCE||xFdWLHWq&5H2h%@Jtnmn+iVb*E#bA-N( zKfObVWh`HfnsXWxHOClUr^(0;)1P!DId*sO{s&MvZrZ+H#0YN*cTX zm<`7v`nl}!V`vGW9E)9mCvT3{=R~@7#Z%l5Vt*TxQa5DHMREelC;)Z5!-W26&{@mx zVz?*26+2OV)p*;!BK8hI^nm}THwQ;TPx^&ys6~wk-@B@j?uP+@G8r|HicI5XAB5t# z+1I#9w;n>oq?KR;Ib+|Fn|RicCS@WKbt=KL!rJsbG!tKUg}z`k$Ni{Uq2>OJ@qN^z zxIOMysg=0pZ6(#(;<-5@c#dj?=S;QQa}!J~5b|oORiv>F?}sRAgi)eeGhuD&wIAA2 zuO_*OhL2!<*ub#pi7;sdGp7X;3VK>Vr2O>AI^3i`G^G5dprrijplZsm?;X*X@{=n_ z^S%C}gtj23KfFF0{9LQ(XadhrMhD3jV&UPMG(?~X$Bm_2wKJ4?bLxK$aa>$KjcHh3 z&VX5d7c)yey>LY@W70>c^hN)Or!Ij|BOf_A+`DWujiBS3aV!5k4 zH7rjR<(UoT9~Q%X^Myw7Kd;QV9I?bM$S8bjr5u%Oo67$xFHdeR&#G`Pp3TeWzIXS8 zKZAQASzi9xFCL$i|M8c0-^cZT_afK7u|=2v;m^37*VSLY`DXTb`5Wi@cXRX4fBW;3 za#h)X{Ht8`?|WST5DSef?SYsL{dw%OvSm9@ymWAlf3IiH7{{U4%+1j|7@mD$l!x96 zqmBsIfX0b0oRFwFj8y7gejdwI!9wwO1Ep*oLiwW(P)?<4D5xE3LAbD@>7h}_Vy zMxmnof0(D!Pb_VsdnJ3p^5HPgmL9g3g}R=h0WjnIq0A#HV&QK)z&d4de556^6O2g8 zVmXlI@NddR341^OWVtBgx_|HXfZ6X53aAZ-2$TPmFv%G>kUi!7-zm?=WEfB^rZ=U+ z+k+tuH%`)@=J49VuQc-R3Ddfx9<4QtjD>q7R^nj8kJgJ#;dp?9d`vXk)l9?3GQtEj zD4@Yd-K0Wji__WOW>B*5ga(T1y3B?cme^rRkw;!C8&c%pH6XFWY6BJ|i5&(!nUoGs z0i_zR@CyNqaiWVXYb@%DCh8r7-WFJZ+mjjKKA^ol@CxwU6foATrdy0ef=ZAX+YLGz4B&B5?5xU^NN^2CgJ~t^bBgMnHn(6Nu`}P|I@o!>3VpX@ z*wJA`Lctg`0qq7w<&q2CBRHS#8vEF3>NluwJc0=3G^s9J*yXdv@}y5g#?A&;6S6=t zI+OWn6KZTs#M)k^^Lfj_xc!O@fQmG|=Ahyzt^LE+&8QG$m7CDFOz1&UcgzE^2zVKe z#2&F1JMj$|P-Phw9b=r9DBsPv2-hGi2GW|N8)=2axI2*?4ez`mOIc&Nu7|oN zv_scx&3m`IWZ{v9@gRmeb2pt4SupZMWWm@6&Vm$@ap66`lPm9eai90Rcwn~Yc}48- zQ>3gUCU*D=m5UuL% z^=hjYT7d4GZ6uj6aD62hOHweJ@+d-0x=scXecabV#SSeuM8H<6#C3Ea^bg7qSZivp z6qA0r=q(8jZIy(|_Bf24^0o?^SHpu_xV;VjEltw;<+quVew4g#kls_Cyn2+EubfCI zY=P-{b{Yqo?ATk-G)d>Bv~fT#Fl^7&;vOPWNIrTOb3CSRQCj8Qw~zw;Va%Z(3az*G3a+3O1<}3-Z61IWOv z-7S%o-|_m`_y)1YOdJ_wMYcj@gSP0G)F-w?>)O2h zE+iw6lnjk5Fk5J_5=m0*Yphy+n21upa6zA0FByZt+iIT%#9E)By3}Xl4G(!OVz=1? zMH28_{2>IyW3@ihOWtS3de&!F;F*QLSyUF@1uBa|<(zFf%}4W7RW6Gmx|djZk`?5BHKnf#J>B;JLggYF5bbh(ZjS zyvXdtc{+n@r2>YnQEpf>ICq(QpO9&3Wl$RE2MC7H&>L(5E{Ja5CZh7H3xD>~n3Y*Z zx@TUn-Xxl()ax=jV0G|2x2?QG(eA&M7mDU64h(;IjB3_|Nm>A8paK8U8}t*3Rkynu zL-|%iA-}Djg|ThBs-ML)#0^v5Aie-p!EXj>b z0W2BB|@<#%cssKdqbY%PQC zSuDR@%RoUcmS<`i_zo7!Z&ewKrZdJ7<6VuDIoo{=WA(-b7~_IjQDBBvlu+AnkeXSZ zX$U4H5ch0Tlg==YjZhl8Kie2*f)%X6w0*(i!FYQ?k6$Z@Fh#Xx;-{=kDu8TDnD|b4s2U*@vb#>S&~X@WwYL-Z2N&H0{zrkk>0sFL{2|kM_Pg&j4bz z@xIIl+tONBUDNBZ@_=~CDYz(pPRKZwDrgiD(- zS;_uvlP8-4LkgGl;}VIGRX$)X91=Pd9O;=}AS`%`pRQL*@+K?4GP$DE}GS zT{7ju5b~}TU*TAaWho-ve65&YncJjQT^BiwDeNEb>+iP}IHm(rKNgMPfG{NLK92*)> zA~1}GwpP`gHQ%|BrVuY^WU)>opQVw7H}Y8;r^Y_lB2uAs9PNpT3Ip@jf|}UWilpn! zj%lgZXaO>G!h-zQ66s9M9yiMD?w7*K7tmwqRauXT1~QSn%)+$Hg33(k^bTbfMB*-# zcQ{zeR@Zpt1x*GH&G*nsZ}M;P=c&Fa#EGr(9>PniQQF9=!I^oXj1GC0)TL4=8WX&0 zX_35^Q*1+nwZ#CkO!2)*%>L#4Klwhhgx1p{=S;8ERmfS(c^m!lI?AM>Az-mo*RaUC zY6?2CGJRwUg+5wv1^s&As`<6TRP!*be0;vo+u~klmRSg}vhfD2oF@nz&Vh1&t>9!1 zNh7tMyS82{`xL|&LoaVNjbMdcjn|9OvNP43#v>hk5|+Uy+s?@z2Fg*m5S)o#1UK7& z(NYbbSw+iX>Bq1;Hvo2{HE|i<8ZU+APvS3G3^e#3?Q6UU=b~O2&?*JX`jS~VQn5&F z%wJ|6n65XmwsDc79rrxTj0T8NAEGpUa zv&cof+$1r)h+(PFcvrPMiKXx{noZfQ7GL5H-$14Qm*zG|+dxy~S#h8mw8qG-tVW|L zvgi5G6#V@fn$n011}~AEtn%gSr;5KC_kAdUuH#A#umlK#CF6c%woR|;<%A2JTC=37PDoVsPej9=kzFzLpDmYGS$$qgznOM6K2&t6HS^lOrg7^ zhwB3hy6cT=qwa#MIe$j_t~!6lSRG$VPG)udOyd6rnKov-b(TR9`9y5|_zJ-;g+hm< zlPxU%WAo}{^%9k6Cfkt49V=FL+_YEKKs~2Et<92%$ZiTMAMWUrPclgP9{$VVZW^4) z)PezR@LVI0%C>dA%r)@lbiD*w8me_(P+;U9Vn~A4@=$P_c+9gK3fB?&bNG1t3ZHbm zlATJedTctHiUO_)4I~T0+sShi&{f_=CZHM4~SB^Lfh>`Al4#l5azOo?+R1%s=bZG0@k8kL5nr%;gDD2@qAVJRnXzIMH3zVbe-injcwK+{}8Oa*h$Z*+=h(f>@}XR=@q+zBa5eag;S zn@6h`fWdZz^fa+%9c<)EoH(hJV7ylB6GtwXWIBiAI&>DY&~JkY>xh>t=3+>nvJ~v2 zXL7uF06XGqd_|2&UE(Vgnppy{4y`+1g0{?36Iw$>)=emmdK1M${wXb>a)dE5b$&2H;3Dl7Qmes6p>kuJqRIWlQ&F zzZ38ORZPET>Hh3@WBPkgk5PW3^forc#uCd;{km~i_DVip7H@9U!AQ#UJ3TsOk6s6c zGM_V8_&=1Y?9k!hJd2S_LhTn|R!K+}84Qb94Goo|#fX^6qNXKRo@z3U zEROCgjGCedFl2lt7|H_1d>GDT0b?O7r7XcX#m=0HEC87c8`5K^lm?RdnJj=XaY$JL z@;X3_#(NAAV%O4BExm#VD+=`-AP~lpas=TyAnZ}6u;2?8jL7M!WdVW(@tG`O;OtLX zg0W{Gi_42)5c7r=jHT(TD))eq4f7@z>{LYRUQ8RBwV`UxeASGFi_wRQy^456MYI0J zq&muYn7W%$I-=3NsB@`%v8sDm)xC6a-KT_QYR|OO*YE2~#S;CoY;NJUOj{QmW7Q-X ziTH_8Bvmj!9X|7fo|4?^i7y+~_?ISDGB9m{XVK|QODa$j3qTEL`$&vK>s>8?-BQ&B zo&}IPT*(DMYH-C7l@Q>=HR)(bso=LVS+E28azVioDio+?j;UZ+9v0TtAInAEKZ@-ge?!h_lVkbSq z8RJDo@i)vAB@35(qx?p-4}6HGAOn@L>U+9|kcN!u_V}Utu%RfGsst|gMmgOcKh&_% zP?SVf!ovSFBD*nZ`w4sgpDl#!8~)Dk1_ZNyuI_J&W_e# zYdcO@-OQt=1&bm^CWL#4vmJrt{u{QGvcY8%8seKd?e6+WIT|xVx-kbQHcIx-s~j%- z4RW%XqYjR^ZDKv3YR1;X4SHC!9C-ZYoW|l=7Ai~hosX|eTAx{BL6>43Vu#PNVQfzE zYA^()EG(SxCko6x%$#>HDL0GxSd4mP+l!V>ZEE63tKzmWV)m}EYlNXC(3zr3LQNiVCf$o+gBA)4t-D3s zN(Fjr#|@x`G;B#=E_*USdWqNvknS8S7ai&DBjf%{2aAMsuRk9%@0gW2#Uf> z$;f!ucmu7~0Rx5!;FdTJt86^UT42xHV1YC>d>2(1M~05gTEZ6wf@~94BXHMP^w&^X zpooD!CBu9YPQgO&}Xzm&2blo zbRDo8?+Qd(J?+MLbDe}Oq^L{eR$!~R zOySMitBgOGOzEw8H2(5v{N>U3%hxgfD8D~DZSU>Rem|yv5YvAX(^q5qZ)5t0G5w>M zz82H}HKzYtO#e8hUytdZ#Pr|A^iQ?Y++$j6B0H1`E0JZKF#&mv!AI&#c{W-hG^cBM z(1MX~SMiGH%?vfq8Jue76z$SD${19YKs(KtYYaQsN-!$j$F$n5eA|0t#~ipacJypi z#tTu*nw2u81-UjzpR$S=S^dfEAbs%wnPYkA#az109KBVcBbb$h|dU_+vt z2^SBxM`?5>?Jv^Hm|zGbE8b`zgd*j0mz4_~ouGkn&Wq`aCBW*YJ8!X|=ChMw1B@o5 zl(s?!3mw)Wur5p@vZCIkY_*zh9FE6jF|JFSD%N@@6DN?;VNN>Gp&2%46(20)p$K0| zha!~U*kyq?9YD4llwg(m{plS>>+VNA`M4*a@Z`rl`Foxa`l^yY z?#bWxoq{$X46uHqic z($#@|#Y2=2ro%WYC29xD0RU&^)pK~CUQIcA|Dk4Jsb1@6_-BpBr z>L|To7)}veA0JeLp@IfbRJdbdHz+_uKsSy+L;R7IH)$5yyGz}ziY`z9T~h$cof}ZR zR!DnvR0~$J39BMS$}e3mw*1xR%t4NlD}v5-4u-rNxHH-k7C*aSlp`i+p^y!?EB~nx zgZ^r9R713^+C55c&2I9$y?(dfliQT+&u;hR4o@U@WR{*B^yI^y-08_7Pww*MZcpy< zmrUeAJVVdGbS^+>bJpfwE`9=9+ezajTy*;}g$<8PEW`G8iV6f*ZKpm07GF z=FYCnX54l%3mur|;&x9TrWw55(~TAGVR_z@T?VC4U0DH6}dkp@pQ_R<#Ur1`-K-#90{^8**c3tk2V2Q_JY1k5TIa5w9@LLV3Nu z8?aE`sOYitX#?1gflw5dg@aq||nW6J3fJ*C5n*1>{7qQb)Bbj-{w$Zdvs zM}@AM_oe^Kfo98ez``mA`z}UoLwv2cH`CuN^XSf)U85*0toHD16|HP{^S~B?@ZQbY z1wiEwT~zlhU=DB}{03i1wyFoWXf0+R@vQcIIArmKh&A<)XvZ);k5Og|$5sM+Sv6oU ztNrX_W=`x^(|iKrF$AndwT{z%Zm8x>V>5sv>II51##^RN@usR@Qr=C~)n2Y@ZB{>} zW^2WYHmiA@ND$tgI3nTyt0s9};KQ+s&<69J!XO)Yq_$7zMTw zqrf&|6xas;oY)4ciES8b6x_(oTd<8-&)DXjnMTW;pz%)J0z{FNxQB{A7~aJn;uaV~ zNj^h48xdLiMm@bpvY|W)!AS(OMRc+zBbY{$sd*L)9>RSq`#_Q@)rTw(zHy+~UX$_X z8b`+4B;(uE?dJ-mw`Sk9bZ_>T@&2!3`aMhcXMY{jHw#~#-Bz9}#PQqI``dP9=Zo=n z@%uL0Gee%=>Cw6LNO|{IwZ-#!EIA})LXM}}>^o_V^gnE4nI}&%pQgUH1tL1PhwbKc z=I^t&7smr1wb_f-GdTQ3_YLol?`|%;if6S)m}`=ARZNATt-H1gekHfKp6%ugG_r0h zzsmxVb>g=2FLkNj-B$k9G?(TBF_rmiJ&>48iTY;DT8~~LUX++irkZviNl`fZukB>{ z?-LPwS}0P%2>uZHw-1{H?lp!xAy<^1%z3L>p6y^_NNwAz$6*(q9km>pAKZM!BymOB z=<_czf41}JNP}Sov{L~MD?`JI9)Q2B4G7eT-HV1JE((9|WbTKC zHKiE(AVl}T@76bbUB)_w+0C}{d*q8L=?@%H+e$itV3px$tDpv$tN|Y78q{YJN#G9& z3d$K*xn^WGNoH~xZ*;hVsW>Z(F`&2BBorqdSQb{IA?aB_TB)o}&jO4Yie4Y00f2qQ zNdXZ*fDxX~3W%}*LKMqP7C@LSq$~kB2@n%wjrsuDR4ox$?+Xa)*6EFCJODQt$J+$t z96%&Prx6Wc%!N(W3(5jU9jvlIqy|R^=xj2c+Mkb8kZ z+->Ci?n_%E%MtW@pC5tNWp$um@E9Uzr}k!R$`7I&7% z$}{3u8R#`5y)yJVq;HrigLmRPU%7#ZDD5X=#U74cE0D^0R})oGj42iz%o-%{0M_+} zxq~uL=k1z`h16Y*q%+!rK74yEt9F>$2-{Gw9apTv%Fa8HkKLxA=&b#j6f}#-V8%wuGU4 z3!AHx2{_xHiPB4fMF-YFN85qWiN;9Ab+H8ftSNd2@yy-AS8~%qiKQ zNtclFYzjQ-=jHN?)LKli5To*{-0A@oSR>Nj|nu@jAjBB*b zC1+54^_o(ls5wvD^Bqp37~Z8~EgfO=p7H)o!cu;~c-wLH?-?P*$^3v3YUt!|PSfA( zX3V?n*{}To5yFI4m+5$r;T_(6cKXMAMownM4~klboE&Dh-QNQUogrgjlT>KqWX|q@ zgA5zHkP`(hy*GIg$R8Bq1SUnv5jPKi6rnam$J-VE5fS|nU7C2E@!-7eu{BkRAKw1M zDpP3y76%nOnCm@0>5ySm+I1gGA?358qdA1-6Gj8-CDwAfg(vj0i^DX3>fmol6+?ZP;~HRa4~eSar?NjFI_f zzqnmErajSmC7m%eHRmVK4OVlPTE7rwyvg5z?1ZT^ReA&`gq4(SXx1iC#JruAR~#$v zum!P~4z4~u*39Asc8YI*L9-8iB$6{P^+^>i9 z3(t2O4cj97JMvHSUp0HM@kDzG~LZK+~@k*+8-}sX%Mt72vP^il>om0Hm~o~cT%$QzOf*FtJrr?dG0W7%1I3%T zN(9*6B*#c&RizxL%U5wz8EcSsG}{*~42Yd=A?2v4oK|~GQ`#3U?71CB=+Cj{wVvWP z#7Wrmc$S0S$DoqkuIHw-`ADWJTy^y5P2Lbot;!bWzbSui&=Go=`Gd@?Xv<0&nu1$) z%JAY9tW7)>vj9s@zD;3SmgzEn92VU$URiE)Ggn^94Hho5L?5Dwh;;^WG+StX_Q>$> zN1S9~3_oGo$+Vq94``DVo}Z1t)@)u|eHb6OEM#vM-O<5=6nqC)%C#=BuZ^aD657@+ zh4fX-CCaP82WFxdMqNvkLwab915mxU)n1^iINL?;XdI1P9~q0?!WE3jSehXxOq2x- z&5#osHaOQgY?HHY;wP|>PclJ(=KwIz?63yl9&s2nalu$%CY*{Z3kaK-L)NnZK|Djs ziadjURcM@-8&p6vDX!JUwA;i1g4Hpl5{;s%5-QLR`%B9DF6B>JiBfq?vW;&?c#KJ>zofy@}$Av1rdA){Fy0omTVv z)CassZuN4s9n3of1lGV)mfG)rpRM5J-J501w$ZjW1lSF#)m$;UiL~W%oAyJzinAwd z-CLZN(}(4W*NWmmn5XsS)1%F07%_dflSFZ~>tGcr>PkgL2cC02qcD|L%nt*bLSn0G z%-dAy32oP?3DX5yr=||vdm_^(Nm@0;%G{~JfR43sZNpR@Xr!Y7VR9GFr ztkzMOXM}Ew2nfX0&13-r&t}Sksv4=#Iz%hQOd_J<6+toef;Fu(tYJzeGS5=IRKOxt zx>W_HbqE2Bc`MbsEX&l(nbvt1gpXP$624L~;1da7Wr0&9yt0JTg<3}qO6)2{6dP5~ ziVcfd;z!Ialm_eUDIB*~L19TP!BfdfwVZJwoUds#Wf{&>dsA74bMizAXHzX_YM#TxErrKo2-?D1K9=2LO;K^l5}1OzSGMT$T2<((NsR_ch@RM$?~%g9C-IzB*v zDdLCi1;-uHEDv!)nEMtm9rxm5SoXV3o)E{F9MRAkU#{+&@I>L24WlFcq;M@%X*`BI#1?Re*aGelTfiM+3%EmTSa8Qe*gDGKP+y*U zYYypBJaUMpD(i3vPW~yW<1Q&i#&uZ3)+hjIMDDPHZ)AigMAs=#h_;a#q8o~33=tQb z>jy$hW-s!$CHAld1@g44ZOjb|YC5zcS&z+!RbJd(wuiy7XRg8PNbW78x0TeB%%zz5 z&r*2?5UmnfZy8;>pxOJESBTjAm&WbWn%CoYooaN6Y$nDL12qmHui5a&6Wt;er{se- zECzn7%^m^&oId8Gh|cvRF{jyUSHwuqFIz+>ez5rpOXw;`K96k2U!i+iMSQ$|7Q4-uN9;DP4D>w{ zS~fN_DfEwDsYW}2u9Wp{r##WP3TM#%op+6P`}jI&<4>%ky{0e3{f*-N%Dcw3A4RYW+k1ymmDrUaqIHwOwBn{H{~_0ehSx|AhHIesPsltTs( zELNfj;g)q|ysuOC^bPN-O&3O1|6XpN*1D)+v?R7ldnsB}M@4ZzOKM3z+Y%;f))I3n zT1$kXPS;Evb}3&Yr%m1xq!}ZwYKhLGRZA{xz`5Scw%wBiv9gZ}znJX+`g+iU4Ld=Y z`8?zcOI&@@*Ofl0#dZbmk=&Z?_Pgu-?nX~;QnEkW>&d=S@VK_%z76G?Tk~v2BsO%s zQO=MJHbun5XLo_!>)EQFt!d99={>Q`kW`zLw7L|LWsTQXmmEc{C^_Of;&B7PZ)~lJ zF#^}aYr-pCv%8$6k3E<(sk!t94;fdyqo$^*@j%$HT6~fY zCwT}HjN}=K2I(5(5kXaXaX@!Jp=rrb(~=FE$mGO2k=q?*{&?tz23oLVVu_q%7Ab8p zql}PZ0`$WMkAPIyW58_i2*?eJfMoKe2*^GLHJ=$CEj6fEQ>~#NEoSJeQa)|rU#J@l zKd#!Z%RUL?*x8hC7s2RDdw?{t={t83_DRl+NZ7q*28p^!EZ$KloX8R^W{DcltCcYq zH>Scm6th|xtAvolH@rfZx}2(A=ET~-nyywEvjd0STyc7u*k4{-pV~_9=)HX$(il~< z_dKLbvtQ3(=9;GRouU=imTlT> zLph58*1S&aRAR59*#_UcyjVWbtj>9Su76~_V#Zd;@seenihU;Vl_zFuxX(0Uvn7m` z@(m_}E5jd4s(zY=70$QGef!BuJg^Z?T8T$B!cF*f-^iJ2uas*X54ECG9yz*R>mDoR zd0K4wRSt6@&#!X8;JlVDtt?}lw#KT~<~XO@II6ROL)5@AVq|<(NN5j(;#Cn2{rB;a zSI%=#*h>eW&z~M|u~pf2*z$spq!!OK{Xp+$$wEuOgZ&$IAK%5{>8E0KSdw)bi#6dB{-XOSE>gTW-7b zWG6j>`?alds39Q&T5yb3J#>g{0gG7xFPUL%JjK-(<0CdBW|0YPj%W;5aU1>-F&mrR zjMo69&GC^h#lf+p)n}XCs1M^4?zQ38SZa7HBv@;!tOi;U`g}`wgc`dvw3S7tqNy2V z{hHksBAv2P)bc&(Qr`=Umxxc)Y!KD7rV8xwt=t`b%!DvWEQg*pT;fltgzcT%>8>Ml zfUK0y^d?#k5i)1O-ohA#`|qi880Z-xtdrZ1j51w|E)q%3*}jCRf(!F9o`$Qs9809id8O z=JLU8v{_xa(9Svqk&zmzqze@UC5^V2zOvxCgh_2AcYbmM-xbbjKQ}!)t^iHWwHXMb ztz4N=V51bx1KnlvRx4oKuuvqcKqNb7^@SmdUCt}dz*(^IhCJ4SLOTUv&nXZ`ItyL3 zoJwm6%vO^&YYZB(DnDAbshM!#V4#%E=?QQ^$thh@hwHWy&jt(D*8cb2QmN$iTgt~w zg^}ss_tfUWTeX=Ml`T8Q(LPJ;ay~5EaxJFMYT8j7;u`-7B-W2QUc#-@H#kLMZr*nP zi#AT7S-{L)`8)UiEj+IN#pXrR(L*!jHPf6?WGBQPV?rNm<`in(~vBm^riw;Af`8B0(7lya)^ zJ7t^%GMKRut3pXxpu}obU9`^QA3UjQo^xEZfxd>si!}AQB&UpIOH~+yH!Pa(@eOM$ z^qNLph+fcYU&F)~!Njo&(M2 z^;mQVO%An4t*|W6tYfZH0MW#w*4A^KeGTgt7y(eygbB}cPEOiY;i)X}1ob+eFG^F1 zUT2(~G^1X{^Hgz0kDqruYt67M@T{Y*Qs7xbUF19uIWY)~XZQ=Y6`pT6o;0k&Q(52% z>UBKNLC-gY$ZL)#&8Xvf2711x$Kp`vS!;%6f#(!;os3i?BbJ9Vt}*45OZ#EjGpRqI2B6w&gSaZL|-`Y>sCF>$5nFlUtQoU|5Ro!64uOT(D+- zhJi++lQ64B=@^2lCv@^<#pQ_fF3{B*8o6n1>T|~CAseUJu7Hs})>L6I7=Cj2K^xdK zaLa9iPmA~0deZCkOqcP`M``(W(!=ql2V_s{`N8~0>m`JDw!H&8Z~s-lFGPY z1|=(N>HC6Xti7u1mwJ^@$c;qx4pFNC@ZeG+XspP>ATUvm7! zuEui(_GGs_3)^(duU7LIzFXK=4*7Am(G{Cnc9rouD$lC3$?F@P5=P2F(#`>Cxh+~$ z)V%~-)M5s0O}$%wiA7ekMZ0E;p6yZ<_s{f6QAFR-y=>8El_6VnjSF4s6G+b~^UG5R zG$z`jUV^_M4=ZReueUYjNKJZUQ;t)J&FwzXOD{=7r6SMs{n}ZQT@1#%h>{f?2V95a zbfsifX4)C4uHVGb;*Ci7RNa$`dfbmCJ1%=os@S=wa6D?TODMF~s}{!v+h% z_QYqCdZL(^Z?tg7;g{5OG98nvQ!PAJI+NmLI%#oacC!;4al!R%I=PzJG*Qa|TL|jS zcHs786-8gU=vpiaP(dY`&=v8AZi#!3SAdns2ty zz5un!X8fq4MD`Ls%95B6@>g97s|@!ub*CmB#8RkPZ7qA+2e;HLErKFJJM=7|5Lo5( z4=SZ*5vm)TrB>1)X2kq87ZxY>pgu2k8qLa#H>)E}Y#aX+*9&yHc&wh;sdN;6mn1Po z;!8;|@zeGlL=+v$$vzy|RR>80h^M3hB=!8gSinS=?V)=!CJfu=r1Wks&UWp9vbw%% zzZ-qk4?Vs=Ov`LThE6^zjYsu0P8?MJ$(&zVC|WgF>dAImx4uA`w_TaHU75Gb^CfwiyOY?q%V*Iwh^^Mag~!g>Cy1>Ma?z6=)e{|D@=SAI@hmme z#kP>xS`>c<6H9FER2;iOY6re0 zO#dLJ|0brd#`NFD^bceDM@pdx2Rk`S+86`JoMw0s$4uFDSMf?M4=xg2ic_AaOFCYx z$vaROIPgUrq&&+8DPvQIOevtCQ&TAcfm7vtcdBr?G&G9sS%1( zXF^zv9PxZh^v*KSUVxsmKreSGGW3)Mda%}o=$+-PqVj8u^p2va^fGtT#{MRERXc^y zS%mhh&7>caU`r60Fd=lvGeeIiI+cjZ`lf&mf0JYpTO%oKN(w1vpBPU{Ciqwk-?d&2 ztZu=pW^vp| zDA|G$MuG{0&f>zBF4dIc0D+P0mXzA$m{3iMQ0Dq3qiHZH0vR_H`mo+hP{$0JO~}yD z3c9f>XY1flz#d{{o0s%0NzA2}0?UEywO<^t+V^W7r~@?kl8pgJF#af{jR3UIfnJw4rtXOWAP0`C3BHoO(dO;yLWkYD*TnzPx1xWVzx4g9P`vipdo^~au z>ek@b7mGV<$L*XZK;@909MVWFtYX~Xp;bZ_$KycyqCyv?`?>zAE!T~O#vy6^ZaAb9 zhcn#~<9w&ebVqj<2Pked<~|E|5_ojNRjryUl*lVCmyuR$O*=gx3d)QO%&HCKhJXR@g2>TpfU3Ws(T z2W<7rTTw{Bc1(4Nh>x-8H$SzG> zyp({P1js{>G+}pDSdEXb4!i0FA2N)mh)(f)E3}056)fH1bW=B4!!Bo;M)z06`^)e* z>i+6@&!@WOq#Iom@3-Si)ctC_--e4#_q*c#R$PO+zc#d$yf0?6c|dC?quueI@AoX} z{>%QL#)6Yu%f(u(fiAMZKNca!dK3>_sOh}mp-->mza z;yrufx9I-nc+W}FTXnxT-m`z614^>dzIZ>FjJNClmUz!z`yIOfV7%{5#+T`Szb*NX zZjIS2k6o_p+u}Vg?kjZvp?Ke#jDzlPkN4=Qk?!vZhpx;1hkOL*Uzh!}d{ip^@AJ_? zr6=>zhmnc9rpHW;!X0u|hH$%*E5e7A90~{b^A72U_wx>ExgS`h2lfLyTpn&yv2M6k z$z@@`k{#iLO16hvlxz$8lxz)qm23$&E7=@wQql<@P_il9sAMI)U&(UVqhw>aLCJ=2 zy^^JHoswbLt)v~^r(`i)t7IYUQZgS_mCS`}lnlbvO8Vg{CB3kd#J_936LoYIzpMFO z!*7+}E`HbYdmlee5*%H}?|ObW@Y}=h{rqm^_W^!4@w=JdUVi)d-NNsK{Py#^mEUdr zKE&^Kes}OYz^~+Ykl%*~;YtN@Tv^a7tHn*y^7b*Su?U=nF%Ly@T`>iN*t%kp0=adC zv1Pq9E*YV$qsDS6TVIV!+-}w#W7LWF$e7hi@02m|{@yQRjtTd!8EfWjy)$Ns(>rL) zP5|$tF^i$zO=Ar{)>GqhY2uwV<_l%sU*nSXFYB_g&V;vK8<#5+@3?WfY2tl1E;moS z`^Fl?tp~^D)`@rGxZF1JejJzEC*GA~=7Zjwqbf<BQSo2%NSEs&E&+-t?j0-`reWQ}gF) zcwW`;ylSULpB>>&|3p{~tEg$0brG* zQsA@?>O+LQ2KlepIQ%G96Rg{(HcS9cm|8u^cfX$_ z6_%VIc*twQe*|RA)5a7YClwQd%MO#q0ao6x^~&d1N1B6I<-oboy zt%4vAen7S2RuT!+PzLe7T8Gi1 zR?1~;q#bpc{pd(W>*dq8n?5R-veD`t23t4%rRbm09>ZY2}-evKsLB~XzH?$8K)DPx1Bs1uEdla}Vcs@%m7b2XZ z5>wA;pLb<|_O(+{GBWCafAK0%c{u z^rzd%SS_9!GiJl+Sm^4ozVweZ(43W?h3eW&MSg?6v*&)YgS~>PyrO!JezoU*vV%QG zgfP}pTH=Yw456Wp9S?gcWYz6(^j_C;(PI#rc0~E`FMxl zfV=P79awyv&136RxjDSdaMquv#?WZao3784sOhn__GO8_e_$dulB{VXH^)Yjs*yaa zH_7uIpR%b)bSf9S~o zYo;OgXFnU$pNr|w$CQD>-ulNe{bEf2NlbAX+4EnB=|7F>FUIssG5w{O{&GxzC8uSZ zc^9r7%Jf0V%nK@iO<;uW?&@=(lFt|2t*j?4Mj2@Wk0PbPDixj|~;y^I@ z?Ath@@5o|h)y51dRm#}RPfi;)TbPV;ZjMy;YWbH0vuz;#E7Fam-y>Zn{cF+{(l<#r zk^U?u(H7F5Bi%~+^Q0(K4(Xqawv+y2(jBB66FjPFk6CK6ILk`={}DS(}XSR>uB$I$}I zJe(cY5Kpq>QTAS?us8et7EiW%!VX9k+V05?PcHN1a!(up8vF{s51x!X8GCZ2Cz!rJlBRz@Zg0bZ5J~&-d?eTUM$Iw!T zu2O)iK^F`SP7f3ZB-SsR9TT;?vw528CN@u-$n73BuW%PAjz-@zV7n=n&O&J3&w#zC zq-AGnjIKrG^qCdL_;HdR<{Xl*h0wmAPi6DDoclS4QbG5W<|qe(=~X&~`fr9%<#FN1y8$^qBUorKt zmoR@D)*kTQ;xDGzkS>tTXQtm#GvGu}AW8=h_z02|qyBsn)~Brl(~h)_nJU8wF!??P zdxoKPr3YdKgY|*)?hJ5QdJ5wjYlE-8jT9^CL1!w#h|Okz4`ld3$%U6jyLey=a5g{M z6|Q~8>_>fhBq%IZ?MOEDwb;~O8{5||I5mK=dr&?zwr<5|#z!{GFOSu+c9|a7*EjWm zKC}nl_V0sy)!?ibj`1I^DK?yFPopnd{*lIz+nP|>RMH&FeoS-|+M_(;j=CMtt`ImZFml*6jMecVu=nTs4pp;e*^ z^*twfE14?Gy0*`yC^oL`Fu24+AOZI$*tI&|Nwsp>i9u5q?06bxJI5D#c4dFsL}!!! zk%C4ymTL_wTyXjCv1NS4%(KC~8^K*sRYc@u_Dz7T37zxIyg-NJKPxtF>qJ+>_BKoV0OdgD9*&kEpa zRyP6IpJJs$B-U8aIIU*B<^YMSsQ@YqfYgxymaljgQCtSk&Af#BS*m(XRjCwJ5oDQQ z36sd&0VL)Ye0mg?J7#oX!MG5jbR)RzW!8CdD=UUFU3cQ z?6gT-`8` z;_61(4dUvKadj(kHGFBp69oyhX83v+07i_K%sm-T`F2$j5}6~}-D88JfCA(XZ7I<( z5K=s{Tf~ds0yjRO$erIFrm z9MMPK*Kh0>COg9{w*F9>pXx6)PXdY4SU*1@YpJy5%6n4A)WnM zmunD#WcsXF!UkV@JgLBtnR%HY;FbZKsv%QFEjHh9F6HPxwr~}rzU4I+##u4@uiI$N zWVCZoc?S*FSWklu%D_n3kp^pRA2(B9lh>@eiGF8d02w(em`ctW*Wr$^cCMqpl4hen zET%G#+9K(%@=u$Z8)IHtAL?>5mr;u;)a_y=rZ6MhLtvVcusJEYy8fb%6Jwi7qjHv| zDpe5m7uumNUl;4IW&&b@c7gt)&(h9J)2ZW@e@R;m-`44^-Q zV5NN#*0?n!f6b(t`b;IJ`Zx?JQW}k1hw~Xbzzdz2YOd)oEW4P?&e7CS32{ah#BTbQ zt13FYU-bdHr2dvj&)9&>P2ch%NSY}2`>O~fpGjf&{H)3wpzLDWhB?nRT|iSgy5tyGy96ZC<0RKz z4+l@G>q5C^?K-_NW0yp^=7Y)UaT(>BFDEB%O>%99naj0~hf!~soLwl_oNSh$CGjx1 zmQFwnr@I0;ZY|cqzLGjbi8Hd%4qC#Sk|D{nG%tW?b9~$i$?(JmtOJr&gb)I122e6c z-f*>6GXu5Tm~IcP)Ob?>aN!$LT+&RKB$ehCEoG8?<^u5~)*iv;`=s}c3r?TVD8(n( zYL*0si49S1N0>BiVJR$PDep41#Q{bd%&|&1MJ|d6&6)yNK|?Uhjhu@t$(!08IZW*hX+sKXYl zJ~oAao07h?TAV*BeQ4k7MDA^TcD`%W(NpKXu5OW8ibX7N5@jx1afb!`shYvmNRk+^ z>cGU>jC*y+uZxI6N#Y7P6#fiALKYz(1dKFoRJ%p0fd{%V#Mj?)f&ny+Zy2qqOVaoT zlhn~r17R&=1h7z8mv0=Ynq@uhRx~f-FY+&o+8hm6ls5o&c5AxEDU18FFVeuUaBKdI zQhM%`H(Jeh(>r0OhhNo0H92XX#;n!u11I4+bqv>_(`m8qw|qp$Pm*9-7Ja*Taf^R~ z7vhn)`ZoLpExt#{UI+5~v%7S81NiGxkk$l^_y>5M&wfF#rCC9R{>4oQS+Xi{B-Dxh z6QXrdZFB+NE*%s}qpiZb_GiBfuc^X2Z?zBLiYy0g(uFf8wM!b|CITWD*58R#>oSMh z_PcrP9P0X7KJB1ayn~3Us@DdQHRsyMYL1j5ANWa6m19QJMNGAu;ya8+i%wxz_wD+^$JC)X(+b-yUCDLuY@D86B8ABqsCK}~~(6j??H&2T3l*VdhR zJvim%wAS%E#cejdrNvC)rH== z5b_0Z2>y;8%SYSljJw;$%A#`8i*t(|@SqfYGKg8XtG}~s`mL=4RMPmWoxwhGI4-m` zV#jJ0Q^r8Bg>MwY7ngV})8fCeSC&yg`oGwl_1I{@Dgo?DrWW>X&TKo(EW%zJ6WGk9 z&z`BkDkExi^s=S~9o%uEM>x*y_<*duopqmxtnI}}+w(H^a;si3qTaYepFbBeHMX6o@pj`zE#fx)^V zPeUhq8rFH>o`%^6ta{*SQ0v^&&`I#L@edN(4t;#rG6hsWQR6*o&>Nu4$3bHCzE2R} z!XEb^^gyMx@ct~H{a5s6@AYA#dQJy-0;C)+o4-#-!YqiVu%k-)fNuiPX>yLwEl^I* zBZ!23R{4!O+x2NEC>hbm7^Y(gR@N9IzhWQ8d ziWqe&j5^7=!8E`y(w6T+t3Tc-jnd{vzO+UqbF4?NF+J>w!`~w`3>1gf8TBykQ0|II zVQtYx6AO|}5t)b=dqbzbdB4zvc*Q(2UYQ_TubI&4Ng2{NZ*#iz_N>g9k3HfUAHBn97FjvV+tTqB<*sPjg zGG?U7*?MNQKh}s6%Ff+P_#7jhdd1f!f7^ zGSG5cmT8tjO=)Ta9N@e~B$W8Dg=*^$!QyZjLjhhvYHMgbw6iDDJ!|edo1uEn7;1-6 zq~{u4VW#Ri!6KYNI=x5Kv@fE1j&&hD67QSHkite#e*mGJ;}p9>@0!5EQ=AE68&@C; zT>?F5o`lbc@y~GS)wX13*-*Iw^2Ue86ufM268McPUH{dfpyRbP$kAM}4vTCrA$^cqnwl6a zMxE-!*>ARsxf;WqLMyR6s^Bh&bX3W$*>S&n((nGECtpya2og(97?Bn%fc=heu*jC zqLBJ-E`B9^7dGHahuT=r+vfX99lE|I+Xz+q=18js)P9&RqPy}aZYs$ z*`eAyZD!g8rpeSgjheQFHPZ-YJ6&5t_ubvWM+^=qkN?s_xk)FDpt+|PY`~?Nd%nFt% zpS)U8|A8wXS9=n&r~pm*a4kg=AHG}V!*R4GNxY8okvvw)2jztFvBm$X^3g}nbGoHf z@0K`HN<~K^aU~*MtbAVEQEaLy=rtDk32STe0RlOB;n8Ts_&ppNjTpa&Kie+Yo0Xi& z{XI=!IL4?%q!qIe7vq?}+qYG7c(8Xw@dIiR9FOx1{9G%~{`Cp`=JF&HY;a*Pip=R* zpu^h9Ocog7{76}f8#+Tg&&dMBG)o7FOyUA$^^pZ-0fZI%nJj?dkWX0xV&B3LkTnN_ zH#|MIEPyOjA#Pp@Ak*)}Z5EKzd?jK{K+ZUj>9;UE3m_=&3a&~4WJ5J;Hz4|c#~Evm z_m4h|QZ>g_*>V+pM+?aU2*LpJ*^`_tcSg2@4j7`0y zNJQ)SHg3!%d^lcBgM_OloMzyxXxOSq*RJ$gMKNP4H%{yQPY(1#&Jqr87NFWM>iqyx zsn79!RY+B@iX_3pFoqRQOBGHV*1<^~fB`loJ=Ru=c-$nyZ@5GkZ<7XXN5bm@bc=OlLGWJxRZxFqT9AedP0S|DfX z!9slS90f#Q^CxQUgcRRX$ik`Qub5K8M3M^Mi~J>X{O#m#`msV|g!d|csk19?fIwP31kFX-fl-bMs3M$2@dp;Z&Z(}q+{6qT`_I1+Q{q7x-%-C?YOpy+TP1f^G( zQBIMOj57C>v>>kto~}6#voVzxK0}lS(Wz=U=_8JcMUkyEg^3j8>&9nXCiXD)y?7w2 zG~IL{OGd2A79d!_tM~ndf`o!ekJCWbuQXpZkWJ5%URRI^F|B}T)PgOhZ0h0$CKrqs z;zHAg8lq5T%hkZ)qZU9`su83b$TrQg@);k<+STx-L&2P>yL`yZuN-F|$XMo$xdh+F ztEm}oB}F3C#Ci;SfmNU;AV^CU4L4Mz+c;H~61mfAEc#m^xN0oRK?ym_qOpzXm|a#^nV!6^6P=3nIe#+=V{AF!%IW?*12u$J+V=&R@1y;Rx1d z=?;FA=6nk?pZNs!blp2>SLPkGEAtN86^C~=wS8-|BAdU8novaZ$pSBL#}R!I4}kf` z<@lAs**L(1(_k*|Fc_U?*i)m#%d|MjlI9`c4U_2WV|$Bl3$_*4eixc=V|4Uk)9K&l zLu1rLtt^ffIK6>%vX~528!4cHD5O?FPZ-lyHYv$O-KvQ+k>6HdEG#>k7vzaDi=Y=; zxTDOG9zoC;KkZ0h`4u%o**1juddzefDahs zR~C!(taElMWW)rpw5+rE%o6}>U~yhgPi)Y1{lOf{{EzWOM0M00Y>D%YR!JH(>19dE z+wL2?EN?g56&c8uv%Em{&EBls$q`{yfglLqu>num5llZgpRqm20 zYrfB<9?bU%T2elO!Mwau7@6ka)zFY>&Rr?-Oml3t=cHb&W{_RYAR$fqkkSQ53jQ*S zEtPBibarHnu*hG_E-F#z^_@mHR`PH{nnRyV_;_~^YPX;f_K=>u+Womm7avt5L&xf^ zl0L@+`FnAk@Va@P^mvuWfplleQ-QNr>-gv2$cy|$tD60@-X?@NY%-_3zTnPTl6)_- zOGv9eo5?a;W}li*+2F2hoWAx&5&L?H${(a&9_Y{_c?X%VbM^GN`G9RZ#2g^6@FR_y zKj)`V-XY2fcM#BbUarwzg8wpaROA9V*h)HcdT56EotY)!3g*ZRcD?G-PN?vsN3c7x zkD2Q-ONUw0`-N6P8>JN>uw+6)lyKQ7ggm&KDTCi3;FW${vVJ6_htm`(Z`PoLcR;~{@y+%K1& z41J}o<4U*kWk(#2lg~am-uO7VfD4qqcl!~h9=zEOJIWXH3B0n&zVggpIY%~;(YFl# z4zJ|1dS1?-a(edtj4oSM=hpwXxoZz@t2*=_sT@oxC4kvwfuSvRw#90AI(Hs5B9v@0!&9n4|6eK|ciH1WUm25`#D1=#6|&?;3vQ zYp`~Au)-hop%fTeg5ni^Y{5{AOAsYsYfyVCROtrBKY(5gR-AF6 z($X_Jb-Tnsfw?mL?GmgmM<&?fgP1TeL?A(OO&(an<0CvQACC`s%KTU$LQy&Jl%s&c z@h}4qO~azMy?%_HLhazmP~0o9AhCu(>Q!Nc!kv$T0Y$k#K+S_CYNq$RD#Mlm*o6Qc zevDpXL=$@nUUJD7>d@#sYpTjx`5O@I|nYi@|^8k~`EIzNS@c-8W8Oa;c??+gg6YU!=w1ReNsEUL7_nSBY!ZMXszjvL|o#48j@3I700 z{E)3OA)Y`f{0N=uP54m}-0eoBQA(1ecm}26a~RwtQv3+MFjbh4t9~~k5wnUp0{D+4 z&W&CM53q_(w|rsfR5MhOnhjEkAa;9MYx|sEO4LH%@u=MGh&_m7K_@4UL{hT{c~u~j z0uvty#@6~`f*DUl=s@a=NF^^3!oi8YaPWE}RTeuSH)<>fB%BSaXOhE0Spe6k4Dy;# zP=hsldMUMvA9H-%3>dUkB4D`H3O$!60Y*U{SSke=)X&mrBN)f=4eC7$c1Y17`w-KM ze1>2?ujG3;p`D|{Os!SekOE}+bwCPmw1sw2aH=)@*nOaOb;F>%d_?s_lCw$x*S;I%Il{M@mU)BJ$Qr2LA&R1R5PJ=o_)~k5e zs4-uYHI&SNK}ldgwy9W=#I?@QDxLq3b*Z5NSmLF<;xiamMI~3sIv<;mbv`m7Yj>^+ zIxhHC-Y~#5X#%f^(s?}Sx{$2Jav#XMhF3<&`$o7kUEYu`DGSM4t>7L2dE~svwQ`Y@ z`5Cn#vok70=4R9hzAPv5T(^jOj&is#XaM?j2w%x9kwxojf7)2$kF^RZO;ec(A0&T&_E|#6jeZ< zPh3R+KfZ9#;_HCd5e`CAJy&<(>k7xvsC?n*>XZ`>%ti;dj&M9{gj2LeIK^wpCH_D- z*a(1c=);BMCF`l+?RdU1a|13Q1IF?7!hkV-QIA1DC$0B`15n7$(J~cW!+kzXT*1nB zgb?uTns1=60|ols6nzx-yIs6(fQn?zJi?%G7P}FUz62^Mu^eq$0XJhuzy};&)i+L# zC_zy#H~G@&6HBJ6f^H%`n*9Qr3v3(a?8l~IN`J5<6=Vn{;TibeMCH(>5(HhiU>&lb zPPA5)E8P5qQi^I3Vj(0d!@10qY^JcNoEkTZSST?mK`PdBXTW z1d0il!b{}d0PAV%IqIyX4G2Jq7!H$bh(%mHJUe@Pii!|Egteep!-}2)hgw3wjGUDq zQBezR^})I50^>_mv15~;;&DG9;!;WaqfKcHV=!;=9yFKVMP}Ep9;4X7{5#Rv^rs*Obr-H-XV1_T{mAYW5W^J)C?;nu^ z14q3C(JRI^==fg*A1UqxoKP*%yFk+~q6DIk8f?@CJi#rm7;bmNZ;(mxawgH&!EljQ zadQ87piT(5fCmv|5|fB0U=nZr){aU96et0-f&>QIQ4{o2%4rq0&@VxiV0T`N$O+^T zSRELg-y*{D6ybiUs&EgYsufh#3a(=)4pqZ=Gj2$uw5kG(cAKjzsU%T8fR3A%A0+pN zhYzf3o_13EE3{LqDwsZi&YllFzf&y)oNtxEZ_WJnYzwqR+@7Zb;`T%f(aj6+Tcdzp z_ULAcAH=>J1_Wr1mqh^)TBv7frDy^i?dt&*^m@8XEDB^0E-&?N3qK|0EH-Y8ns|yW zPz^zWxz&)3XlgG0zgk`3kgaybX2J%(7@85{(|JbB;jV(@30I+qkU~w!pQAAuz)50+ z6PqP#?*%Y)iUiD5r$A7x+3m)XQzW461fW}B30k+hwBL=bh>_!>cezmUt{DkXG!7b* z^zno~77g6MV^EJis6(~6>_+FS#0dW@jes0}7x*cNqW#khZ-KDQ@D`j9kO3nH9(2j5 zxq_O3M(zu^xhk9hFr4;Qp_*Aad+C5VBAyQhRMX^hE1tl53oa%sAfSK3Oki>3TPbFt zBkOoeNsgYzM>HFTiJ)p^kUZj8+0jRnvtH+KosK?n>VrD^m8ucl>zzNp!8$Jebvn*# zI)8eoCtNzBQdb^W^74pR%W`1#NE0#qdeY%XDdjp0t73S>G@2Bvv=~0W4v6Z3E3XPV zF6!tDhXx*#huQ%LQ9`lKN9pAY1%<04enMrT83>q2m6ZH0pF&+eoje7MH`su7CD-MH z>Xzs+7Gh2^accLVJ}|g>{>6gb&CF%Si2D*|*?MWn-AnTZqwnzV0b1CI2>m4H{!^sB zVCLieIIjSY`1okT3{YIRn6P6Ke||`NepI_+$0VfpnI6-wUpGfjv_|bn#5_~XUKZ%^ zQPJCEdc+*WM&KV+kM%Y=id&u!7k(WqWp zsfmslt|w`WPFx=}gB7@n{XGMAhzw6+gDb3ALRo@@Z>?oO$#ZB*1K2|k0LH(#;Pxao z;6x%G(NI&%i*foO)&b)4g^S1BG{YT6SSA4hCk{O=I))RwCfgy)Cb65O$bwqa@*r4K zek$*Y*`aiLDn74MK5>K3Y6e6oi}rC&Byj`Lx0n-20F#?Li)!G21+bFKkJt?$xpT8M z_U6yn(}jW+j{1Z)4n*u-N#j2RA~#=;r+|#ybUmH|DsnUQH~>r|*5ruyb5r%WWbr=E z(>7`bS>yd;W0nwqA2WL~XBsX{Om3jV?Zh2UY1iMR+J=PQ&^+W-gi;bP(Q$L)O|QNI zBpp?#B@qaaI;b)O0X7xWa^1OCsoWsvtAb_$FT;WzXcoksQ!o!{I`d#sny#5>;g?W5 z6Fyd91qLnWFQYDd8Tvt_lCTpf7TtPEqO)y$3oc59{O!DJk4$JXDIty*SIcNBKb9u( z$p%P>4&6#a_Vk&Upr9n*@{3Q==XFM-@zpj@fOP!E0JoPx3~qbr!~%>9!^}Z<^dUUB z$@b~tQ9SS&`SgJ8%Yub^vB&U$wIEOS^*9*n2efTIFeXu>+VISLld7r}KFuPx(!0_riZCVbhvE+uo8i$FVOVW-WZP$(Q~4|Rk( zLtUZnP$bk7>J5j&;c$DnBitG83U`Mi;hu1Bd#F9!-rnBP-r3&O-rXK)?`iMt2z7)z z+B-TrIy<^Lx;r8rJsrKBq0Vq;duK;yXJ=PucW0!tr?a;!)D`Y(@9OC4?CR?3?uvBv zboF+Jy2IV=-5uSX-Cf5N#o}QlGUXa)e^t}Mxi`ROQgeeCS^Mt_RVlZc$ESO}%xk$`6h}34JW^pCf4S;oJ zxSFC5V%?tpP6ys;e<+WO9UydP!!@!_a{Eh&nVdl^IJW`ue65 zhf=Yr#-<@PnNVZu(5_@6KBOLuO-#p4(X5pf>41{_1rBH4%B-JlZEgLWDY{^VDq5kU zK&;wKCNHjYcm{RO#F_b zo5U%skz7V<0l^2A;1t3F{BX@td)~(8%tQwLsr>(olS1V_tjvdzOE8EH9|Xq~eb=6= z(zB=%>H*fyD$F;JThfaqTvzJFR~6P6LMn-6JFXjXox&Bbo3gl~?s*kIrLYtK?JTQ}FlNSO zo_$R7T4L*(*D_-T`{D=266z&e)p%k=Z3H?Olj#x2T+Gv?9vY1&)bzyI@L1vikudLK zUZOTRogt!lCGf<_TXeC4%aW;7^3XNYnH{*M&>Xm!rL`5amjG>wv;lvExRT1EsxGE1 zXsM>?dnhx9CsMJ$gBYMcC^P3?m-q!Y^DLsUiZbVLB|`+C(c2b0UqN7>ni-9&6Q~ME z$CM&BD^~ZR29zp_^YnKCbGuz=?I5l}4s*7EVF`lCREnn}gRJ=iR;s%!;!oTV{$c^M z>2hBxU_qT%saWDbT-~2cael^$X`tvpW)u{?3mo&nL2hjkSGT~7V*_=}i;A1VosqsRTl+uxx!L=Wb>jISzVeeZubuz3Np=_T+`cV4cJ_br=8^d917G>t zt7l%5-9=41`ftGVy$?Kz;xE7Y_W55gBXvjrNIW|;`@I)leCdrhmw$i9onO5Bo}-V< zAA9`xlTSbY;!7|8_{?i>{mYe){OD(|oO!K(*T4;*xq0v1_uc>Ob3b_LA7AI8 z&))RM|9byI);)Rauih>wtW6}Vs`q~W_U}IPCvSO8?anK94cxfrrkij7!uMZ3`^GPq zfB&DU^!=IXhaP^lZSTg`wkMwX!An1W?aj9z-Tv?+ZK3;XFFf=9g)T`BZ5 zwEgyXiDYE!w##J4t&)#{{t%ZBV}>yZVi(sty}(r4^ttlUxR zDs|mrbJ{9xH!986oz527C7Y!%YmqB$Ov*lutlH?+@@6TcTp|@pmqZk0lkLcbBA?P$ zv{_O;fx_%j`N+c+tn98mlD9(kWZ$*6S-03N1wKdisqTy``}0bdHG9FDea>3%`pPTL ze`+q9y;q7jW^O9Yo>a0Yw{^)*TaU666NfXbM%p8P#*w|lSLO6Nb~>|Pwtf4Ut6UC$ zL!NnSquph-X1`T5GwHdlag*(8IeV|1eNpmDh3L~Rl(EZ9*iiyiwm`EjPV9-{F&D|j z){^22P=0Z8Jl)Gc&v7n!?Kq zD(p_%CtMAVX|^r8$+pGnw0+8Ewt6IM_MV%AS1Qiz<2MI)FsIF3(xW)LD_SBbOm~FfN^&?k&;~$Rn+BeCTp^eU+ z&PHp=9aB44o2O{IrRL%PC^_zr<#iue16)Ei(lz@`&qtr(3#7-r8I3Zjl|( zOk4KRJKkUfFyp$e*(HN+Tcc9*X_vfJsw(w0nhVRnSb<4Yl??MTM8JdjqpJd*`O1&m z_ExUjd@Wb9ZRt!h6+@Gd9!*Y9jHtuOL?(vDIHr!ohm#|*eG_pJAFE^gsijJxtxBuu zhEX1?T9rup|wzPrC9x&_=(ozG;)`5+nSgAB<@Aid(O|4^x<@00>L>N zVn1t*PE4p7G*ao_8$uf-XrFNJRyz@<@HoAa$;q60?4bGZxL_Q=e@CLys=o#>UZa=f@+P$)l?F}*W`3Mqk;rJas=-(a z3{^)7g;wXh5=U#$^C%Qu9-YZ&3``3(tnpe+jyVLAvCQx&c!o9^{h;CLiC891*nUw1 zre|V(hsGwr^m8@LPEYA6aPuAQA)bnXD(zt+J`CqnyKZ;&!CL0af-Z`d7I0nJIbW!~ zNN4ucI>$Oj z`wpvr6;CB0A!O&P$5bp8L*R=rm#fGNDk=|52!SwNUVoTCeSfMwAcg{uRHmE*Y91uw zph>1I;>phmSXNm*Mep>d^8YUuy+0UWo&~(;L@DAEe=E8WU{0biHZ>-+Ho*Ls#YPZT zO(8ZMiDhD>sZ^^Gsvw97Fk8Kvh)t5b0?dvo^$jPdA+G={Y*`&n{Y6YRT_aPLQqXubu8F6JQ^P!N8H>-Oj$p+Jyj?4BXL^> z`tj2`A;ZK3WO%j?HmuPXLNrdH>^Ocxa?5pp5q%5whc==Np)%52kRefmxyZ zBd~<08-yE6r15Y}a6Kr=f$?C_FF*D51co8{ylb3=N=TNuw!_d!ZNSkh_f3?!4SlBlkVz z&LKCPmpf+U&NZ>{TAj)y_X2SY&8OO|we6R}wdjdZnx>1_W4VcSuLZd;iBW_D@kYJn zPNtfu|E?#GKzW;>v71=K+IRP-l9M`a_0p~SXxuM0!CJtT+Ps=&jG8TP(m2Qihio&e zy*!qnaSb$O;|NjqtGfO11Zwu?o8j0XZ*pcjn~&h0TT1j~GxIC~T@Wcb7rE5@(L7SN zg>BFXm`)fZ@NpK+4H#q`Z(+8+*mPzTl3!?H5^s7=w7|kZTOF`Jfgib4C~IEocaad{ zsb`VuDPK+L`MlJeGk>>*`IZ2eLYieX+JGwcC^#K@lHHSaHnbm!e7lz9g zR=Bj8Rjn20yym^TmcI=2|}*V^6dSw~8hZmfVVP%O?!QgDXV@WXM8-XOTOH zREiDs+{=yJ-ynAgxtsHHcN)2~Z7@OPQVgrV+i&E4wT&slw@*Q6$53_&{Ey_7y~ZfJ z*v2rp7+q>(k(@E8ld;2M)NP8|^0>;|^r>VzhG6#)hHcQ=V?-Jubt(o;oeQlDT7WyA zN|3>FSF#XdoAP06!DLK?lhpWApb!(N0Pb9fZ5ENc9(U%UC&Vdglvlhm7iLWY04O|| y#26x;CdLqgplw3ry?J;VQ8>a?LGWUjHE0-6(PRQaHDXt)5Cz%1nh3Rd;r|6N+dEYN diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 6697174a78d7a8359706434f7dc539739444ec54..9e940b49d4ae7cba256e5901cbe1cbca2661dd71 100644 GIT binary patch literal 246583 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ξRf)C2J6WA3 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 AW&i*H literal 215780 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index be302908d52a54fbdcad5234cb795f21e878c110..156dce2e4696ff4979b8f6a29294ede16ffbf7b6 100755 GIT binary patch literal 307545 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 From d5a02709ca8b0ee40704941822937f362fdfc4e6 Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 4 Sep 2018 17:02:38 +0200 Subject: [PATCH 03/14] Reverted toolchain change --- demo/runtime/wasm/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/runtime/wasm/build.sh b/demo/runtime/wasm/build.sh index cf1607689e6a2..0769faeba9b3e 100755 --- a/demo/runtime/wasm/build.sh +++ b/demo/runtime/wasm/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -e -cargo +nightly-2018-08-27 build --target=wasm32-unknown-unknown --release +cargo +nightly build --target=wasm32-unknown-unknown --release for i in demo_runtime do wasm-gc target/wasm32-unknown-unknown/release/$i.wasm target/wasm32-unknown-unknown/release/$i.compact.wasm From eab11ad64a186f295ce93d81d8ad3e4a008d264e Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 23 Aug 2018 14:47:07 +0200 Subject: [PATCH 04/14] Adjusted timeout formula --- substrate/bft/src/lib.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 9e465f852cec7..9a19728d3c28a 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -235,10 +235,12 @@ impl> BftInstance { fn round_timeout_duration(&self, round: usize) -> Duration { - const ROUND_INCREMENT_STEP: usize = 10000; + // 2^(min(6, x/8)) * 10 + // Grows exponentially starting from 10 seconds, capped at 640 seconds. + const ROUND_INCREMENT_STEP: usize = 8; let round = round / ROUND_INCREMENT_STEP; - let round = ::std::cmp::min(63, round) as u32; + let round = ::std::cmp::min(6, round) as u32; let timeout = 1u64.checked_shl(round) .unwrap_or_else(u64::max_value) @@ -866,7 +868,7 @@ mod tests { hash: None, start_round: 0, })), - round_timeout_multiplier: 4, + round_timeout_multiplier: 10, key: Arc::new(Keyring::One.into()), factory: DummyFactory } From 04eb18438ecb5d6df6806ae9048a433b4eb571a9 Mon Sep 17 00:00:00 2001 From: arkpar Date: Tue, 4 Sep 2018 18:21:21 +0200 Subject: [PATCH 05/14] Simplfied proposal creation --- demo/build.rs | 2 +- demo/consensus/src/lib.rs | 238 +++++++++++++--------------------- demo/consensus/src/service.rs | 37 ++---- substrate/bft/src/lib.rs | 2 +- 4 files changed, 98 insertions(+), 181 deletions(-) diff --git a/demo/build.rs b/demo/build.rs index 2e420107c8142..0f2f3b9bdcaf8 100644 --- a/demo/build.rs +++ b/demo/build.rs @@ -20,5 +20,5 @@ const ERROR_MSG: &'static str = "Failed to generate metadata files"; fn main() { vergen::vergen(vergen::SHORT_SHA).expect(ERROR_MSG); - println!("cargo:rerun-if-changed=../.git/HEAD"); + println!("cargo:rerun-if-changed=../../.git/HEAD"); } diff --git a/demo/consensus/src/lib.rs b/demo/consensus/src/lib.rs index cd55ea4a790c5..938f4286ba3e7 100644 --- a/demo/consensus/src/lib.rs +++ b/demo/consensus/src/lib.rs @@ -36,7 +36,6 @@ extern crate rhododendron; #[macro_use] extern crate error_chain; -#[macro_use] extern crate futures; #[macro_use] @@ -46,7 +45,7 @@ extern crate log; extern crate substrate_keyring; use std::sync::Arc; -use std::time::{Duration, Instant}; +use std::time::{self, Duration, Instant}; use codec::{Decode, Encode}; use demo_api::Api; @@ -54,7 +53,7 @@ use demo_primitives::{AccountId, Hash, Block, BlockId, BlockNumber, Header, Time use primitives::AuthorityId; use transaction_pool::TransactionPool; use tokio::runtime::TaskExecutor; -use tokio::timer::{Delay, Interval}; +use tokio::timer::Delay; use futures::prelude::*; use futures::future; @@ -122,6 +121,9 @@ impl bft::Environment for ProposerFactory ) -> Result<(Self::Proposer, Self::Input, Self::Output), Error> { use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; + // force delay in evaluation this long. + const FORCE_DELAY: Timestamp = 5; + let parent_hash = parent_header.hash().into(); let id = BlockId::hash(parent_hash); @@ -152,6 +154,7 @@ impl bft::Environment for ProposerFactory transaction_pool: self.transaction_pool.clone(), offline: self.offline.clone(), validators, + minimum_timestamp: current_timestamp() + FORCE_DELAY, }; Ok((proposer, input, output)) @@ -170,6 +173,7 @@ pub struct Proposer { transaction_pool: Arc>, offline: SharedOfflineTracker, validators: Vec, + minimum_timestamp: u64, } impl Proposer { @@ -187,32 +191,89 @@ impl bft::Proposer for Proposer where C: Api + Send + Sync, { + type Create = Result; type Error = Error; - type Create = future::Either< - CreateProposal, - future::FutureResult, - >; type Evaluate = Box>; - fn propose(&self) -> Self::Create { - const ATTEMPT_PROPOSE_EVERY: Duration = Duration::from_millis(100); + fn propose(&self) -> Result { + use demo_api::BlockBuilder; + use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; + use demo_primitives::InherentData; - let now = Instant::now(); - let timing = ProposalTiming { - start: self.start.clone(), - attempt_propose: Interval::new(now + ATTEMPT_PROPOSE_EVERY, ATTEMPT_PROPOSE_EVERY), + const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); + + // TODO: handle case when current timestamp behind that in state. + let timestamp = ::std::cmp::max(self.minimum_timestamp, current_timestamp()); + + let elapsed_since_start = self.start.elapsed(); + let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { + Vec::new() + } else { + self.offline.read().reports(&self.validators[..]) }; - future::Either::A(CreateProposal { - parent_hash: self.parent_hash.clone(), - parent_number: self.parent_number.clone(), - parent_id: self.parent_id.clone(), - client: self.client.clone(), - transaction_pool: self.transaction_pool.clone(), - offline: self.offline.clone(), - validators: self.validators.clone(), - timing, - }) + if !offline_indices.is_empty() { + info!( + "Submitting offline validators {:?} for slash-vote", + offline_indices.iter().map(|&i| self.validators[i as usize]).collect::>(), + ) + } + + let inherent_data = InherentData { + timestamp, + offline_indices, + }; + + let mut block_builder = self.client.build_block(&self.parent_id, inherent_data)?; + + { + let mut unqueue_invalid = Vec::new(); + let result = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending_iterator| { + let mut pending_size = 0; + for pending in pending_iterator { + if pending_size + pending.verified.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } + + match block_builder.push_extrinsic(pending.original.clone()) { + Ok(()) => { + pending_size += pending.verified.encoded_size(); + } + Err(e) => { + trace!(target: "transaction-pool", "Invalid transaction: {}", e); + unqueue_invalid.push(pending.verified.hash().clone()); + } + } + } + }); + if let Err(e) = result { + warn!("Unable to get the pending set: {:?}", e); + } + + self.transaction_pool.remove(&unqueue_invalid, false); + } + + let block = block_builder.bake()?; + + info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", + block.header.number, + Hash::from(block.header.hash()), + block.header.parent_hash, + block.extrinsics.iter() + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) + .collect::>() + .join(", ") + ); + + let substrate_block = Decode::decode(&mut block.encode().as_slice()) + .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + + assert!(evaluation::evaluate_initial( + &substrate_block, + timestamp, + &self.parent_hash, + self.parent_number, + ).is_ok()); + + Ok(substrate_block) } fn evaluate(&self, unchecked_proposal: &Block) -> Self::Evaluate { @@ -241,9 +302,11 @@ impl bft::Proposer for Proposer let now = Instant::now(); // the duration until the given timestamp is current - let proposed_timestamp = proposal.timestamp(); + let proposed_timestamp = ::std::cmp::max(self.minimum_timestamp, proposal.timestamp()); let timestamp_delay = if proposed_timestamp > current_timestamp { - Some(now + Duration::from_secs(proposed_timestamp - current_timestamp)) + let delay_s = proposed_timestamp - current_timestamp; + debug!(target: "bft", "Delaying evaluation of proposal for {} seconds", delay_s); + Some(now + Duration::from_secs(delay_s)) } else { None }; @@ -377,132 +440,7 @@ impl bft::Proposer for Proposer } fn current_timestamp() -> Timestamp { - use std::time; - time::SystemTime::now().duration_since(time::UNIX_EPOCH) .expect("now always later than unix epoch; qed") .as_secs() } - -struct ProposalTiming { - start: Instant, - attempt_propose: Interval, -} - -impl ProposalTiming { - // whether it's time to attempt a proposal. - // shouldn't be called outside of the context of a task. - fn poll(&mut self) -> Poll<(), ErrorKind> { - // first drain from the interval so when the minimum delay is up - // we don't have any notifications built up. - if let Async::Ready(x) = self.attempt_propose.poll().map_err(ErrorKind::Timer)? { - x.expect("timer still alive; intervals never end; qed"); - } - Ok(Async::Ready(())) - } -} - -/// Future which resolves upon the creation of a proposal. -pub struct CreateProposal { - parent_hash: Hash, - parent_number: BlockNumber, - parent_id: BlockId, - client: Arc, - transaction_pool: Arc>, - timing: ProposalTiming, - validators: Vec, - offline: SharedOfflineTracker, -} - -impl CreateProposal where C: Api + Send + Sync { - fn propose(&self) -> Result { - use demo_api::BlockBuilder; - use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; - use demo_primitives::InherentData; - - const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); - - // TODO: handle case when current timestamp behind that in state. - let timestamp = current_timestamp(); - - let elapsed_since_start = self.timing.start.elapsed(); - let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { - Vec::new() - } else { - self.offline.read().reports(&self.validators[..]) - }; - - if !offline_indices.is_empty() { - info!( - "Submitting offline validators {:?} for slash-vote", - offline_indices.iter().map(|&i| self.validators[i as usize]).collect::>(), - ) - } - - let inherent_data = InherentData { - timestamp, - offline_indices, - }; - - let mut block_builder = self.client.build_block(&self.parent_id, inherent_data)?; - - { - let mut unqueue_invalid = Vec::new(); - let result = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending_iterator| { - let mut pending_size = 0; - for pending in pending_iterator { - if pending_size + pending.verified.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - - match block_builder.push_extrinsic(pending.original.clone()) { - Ok(()) => { - pending_size += pending.verified.encoded_size(); - } - Err(e) => { - trace!(target: "transaction-pool", "Invalid transaction: {}", e); - unqueue_invalid.push(pending.verified.hash().clone()); - } - } - } - }); - if let Err(e) = result { - warn!("Unable to get the pending set: {:?}", e); - } - - self.transaction_pool.remove(&unqueue_invalid, false); - } - - let block = block_builder.bake()?; - - info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", - block.header.number, - Hash::from(block.header.hash()), - block.header.parent_hash, - block.extrinsics.iter() - .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) - .collect::>() - .join(", ") - ); - - let substrate_block = Decode::decode(&mut block.encode().as_slice()) - .expect("blocks are defined to serialize to substrate blocks correctly; qed"); - - assert!(evaluation::evaluate_initial( - &substrate_block, - timestamp, - &self.parent_hash, - self.parent_number, - ).is_ok()); - - Ok(substrate_block) - } -} - -impl Future for CreateProposal where C: Api + Send + Sync { - type Item = Block; - type Error = Error; - - fn poll(&mut self) -> Poll { - try_ready!(self.timing.poll()); - self.propose().map(Async::Ready) - } -} diff --git a/demo/consensus/src/service.rs b/demo/consensus/src/service.rs index f20532e86d4ab..310e46ee55ec5 100644 --- a/demo/consensus/src/service.rs +++ b/demo/consensus/src/service.rs @@ -33,7 +33,7 @@ use transaction_pool::TransactionPool; use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; use tokio::runtime::TaskExecutor as ThreadPoolHandle; use tokio::runtime::current_thread::Runtime as LocalRuntime; -use tokio::timer::{Delay, Interval}; +use tokio::timer::Interval; use super::{Network, ProposerFactory}; use error; @@ -53,35 +53,14 @@ fn start_bft( >::Error: ::std::fmt::Display + Into, >::Error: ::std::fmt::Display { - const DELAY_UNTIL: Duration = Duration::from_millis(5000); - let mut handle = LocalThreadHandle::current(); - let work = Delay::new(Instant::now() + DELAY_UNTIL) - .then(move |res| { - if let Err(e) = res { - warn!(target: "bft", "Failed to force delay of consensus: {:?}", e); - } - - match bft_service.build_upon(&header) { - Ok(maybe_bft_work) => { - if maybe_bft_work.is_some() { - debug!(target: "bft", "Starting agreement. After forced delay for {:?}", - DELAY_UNTIL); - } - - maybe_bft_work - } - Err(e) => { - warn!(target: "bft", "BFT agreement error: {}", e); - None - } - } - }) - .map(|_| ()); - - if let Err(e) = handle.spawn_local(Box::new(work)) { - debug!(target: "bft", "Couldn't initialize BFT agreement: {:?}", e); - } + match bft_service.build_upon(&header) { + Ok(Some(bft_work)) => if let Err(e) = handle.spawn_local(Box::new(bft_work)) { + warn!(target: "bft", "Couldn't initialize BFT agreement: {:?}", e); + } + Ok(None) => trace!(target: "bft", "Could not start agreement on top of {}", header.hash()), + Err(e) => warn!(target: "bft", "BFT agreement error: {}", e), + } } /// Consensus service. Starts working when created. diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 9a19728d3c28a..be6da011be295 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -472,7 +472,7 @@ impl BftService hash: None, start_round: 0, })), - round_timeout_multiplier: 4, + round_timeout_multiplier: 10, key: key, // TODO: key changing over time. factory, } From 67107bf7b75ae830f5342e5990811a49f9b53bde Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 5 Sep 2018 12:22:54 +0200 Subject: [PATCH 06/14] Fixed tests --- Cargo.lock | 218 +++++++++++++++++++++------------------ demo/executor/Cargo.toml | 1 + demo/executor/src/lib.rs | 63 ++++++++--- 3 files changed, 163 insertions(+), 119 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f305bd135a4d9..9d48c5841946a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,7 +441,7 @@ dependencies = [ [[package]] name = "datastore" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "chashmap 2.2.1 (git+https://github.com/redox-os/tfs)", @@ -518,6 +518,7 @@ dependencies = [ "substrate-runtime-staking 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", + "substrate-runtime-timestamp 0.1.0", "substrate-state-machine 0.1.0", "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1249,27 +1250,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libp2p" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1279,20 +1280,20 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "smallvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1300,12 +1301,12 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-dns-unofficial 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1313,16 +1314,16 @@ dependencies = [ [[package]] name = "libp2p-floodsub" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1334,15 +1335,15 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1353,20 +1354,20 @@ dependencies = [ [[package]] name = "libp2p-kad" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "bigint 4.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1380,12 +1381,12 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1396,13 +1397,13 @@ dependencies = [ [[package]] name = "libp2p-peerstore" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1411,14 +1412,14 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1428,11 +1429,11 @@ dependencies = [ [[package]] name = "libp2p-ratelimit" version = "0.1.1" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "aio-limited 0.1.0 (git+https://github.com/paritytech/aio-limited.git)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1441,14 +1442,14 @@ dependencies = [ [[package]] name = "libp2p-relay" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1459,32 +1460,34 @@ dependencies = [ [[package]] name = "libp2p-secio" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "aes-ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "protobuf 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-tcp-transport" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tk-listen 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1493,10 +1496,10 @@ dependencies = [ [[package]] name = "libp2p-transport-timeout" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1504,25 +1507,25 @@ dependencies = [ [[package]] name = "libp2p-uds" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "tokio-uds 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libp2p-websocket" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", - "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", + "rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "stdweb 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "websocket 0.20.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1531,11 +1534,11 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1680,19 +1683,19 @@ dependencies = [ [[package]] name = "multiaddr" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bs58 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "integer-encoding 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "multihash" version = "0.8.1-pre" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "sha1 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1702,7 +1705,7 @@ dependencies = [ [[package]] name = "multistream-select" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2266,7 +2269,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e#a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e" +source = "git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88#e2960b4317b22d64c4fca7fa77c6124a44a92f88" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2580,7 +2583,7 @@ dependencies = [ "substrate-state-machine 0.1.0", "substrate-telemetry 0.3.0", "substrate-test-client 0.1.0", - "triehash 0.2.0 (git+https://github.com/paritytech/parity-common)", + "triehash 0.2.3 (git+https://github.com/paritytech/parity-common)", ] [[package]] @@ -2754,7 +2757,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)", + "libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parity-bytes 0.1.0 (git+https://github.com/paritytech/parity-common)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3656,6 +3659,16 @@ name = "try-lock" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "twofish" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twox-hash" version = "1.1.0" @@ -4012,7 +4025,7 @@ dependencies = [ "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50ac3add446ec1f8fe3dc007cd838f5b22bbf33186394feac505451ecc43c018" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" -"checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3cae2388d706b52f2f2f9afe280f9d768be36544bd71d1b8120cb34ea6450b55" @@ -4080,23 +4093,23 @@ dependencies = [ "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" -"checksum libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum libp2p 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-core 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-dns 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-floodsub 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-identify 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-kad 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-mplex 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-peerstore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-ping 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-ratelimit 0.1.1 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-relay 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-secio 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-tcp-transport 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-transport-timeout 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-uds 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-websocket 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum libp2p-yamux 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ceb20f39ff7ae42f3ff9795f3986b1daad821caaa1e1732a0944103a5a1a66" "checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" @@ -4113,9 +4126,9 @@ dependencies = [ "checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" "checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" -"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum multiaddr 0.3.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" +"checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" @@ -4180,7 +4193,7 @@ dependencies = [ "checksum rustc-hex 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b03280c2813907a030785570c577fb27d3deec8da4c18566751ade94de0ace" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" -"checksum rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=a6c82e6ca17ba5afc6e0aa849acb54bbb32d7e8e)" = "" +"checksum rw-stream-sink 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum schannel 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "85fd9df495640643ad2d00443b3d78aae69802ad488debab4f1dd52fc1806ade" @@ -4250,6 +4263,7 @@ dependencies = [ "checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum triehash 0.2.3 (git+https://github.com/paritytech/parity-common)" = "" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" +"checksum twofish 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eef327f05b0d0ec1b9d7d119d8f4d9f602ceee37e0540aff8071e8e66c2e22e" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" diff --git a/demo/executor/Cargo.toml b/demo/executor/Cargo.toml index c07fb3887841d..95a9a114a57be 100644 --- a/demo/executor/Cargo.toml +++ b/demo/executor/Cargo.toml @@ -25,3 +25,4 @@ substrate-runtime-session = { path = "../../substrate/runtime/session" } substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 38fe909ba2698..9c409617b2115 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -35,6 +35,7 @@ extern crate triehash; #[cfg(test)] extern crate substrate_runtime_staking as staking; #[cfg(test)] extern crate substrate_runtime_system as system; #[cfg(test)] extern crate substrate_runtime_consensus as consensus; +#[cfg(test)] extern crate substrate_runtime_timestamp as timestamp; #[cfg(test)] #[macro_use] extern crate hex_literal; pub use substrate_executor::NativeExecutor; @@ -53,7 +54,7 @@ mod tests { use demo_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::Header as HeaderT; use runtime_primitives::{ApplyOutcome, ApplyError, ApplyResult, MaybeUnsigned}; - use {balances, staking, session, system, consensus}; + use {balances, staking, session, system, consensus, timestamp}; use system::{EventRecord, Phase}; use demo_runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Runtime, Balances, BuildStorage, GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, BareExtrinsic, System, Event}; @@ -229,8 +230,8 @@ mod tests { use triehash::ordered_trie_root; let extrinsics = extrinsics.into_iter().map(|extrinsic| { - let signature = MaybeUnsigned(Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed.0.clone())).unwrap()) - .sign(&extrinsic.encode()).into()); + let public = Keyring::from_public(Public::from_raw(extrinsic.signed.0.clone())); + let signature = MaybeUnsigned(public.map(|p| Pair::from(p).sign(&extrinsic.encode()).into()).unwrap_or_default()); let extrinsic = Extrinsic { signed: extrinsic.signed.into(), index: extrinsic.index, @@ -260,12 +261,20 @@ mod tests { // Blake // hex!("3437bf4b182ab17bb322af5c67e55f6be487a77084ad2b4e27ddac7242e4ad21").into(), // Keccak - hex!("508a68a0918f614b86b2ccfd0975754f6d2abe1026a34e42d6d8d5abdf4db010").into(), - vec![BareExtrinsic { - signed: alice(), - index: 0, - function: Call::Balances(balances::Call::transfer(bob().into(), 69)), - }] + + hex!("3f39c78ad382abdf07e22d8850c4d5ed82c64671d4f3cb34bbfad159ac7f870e").into(), + vec![ + BareExtrinsic { + signed: Default::default(), + index: 0, + function: Call::Timestamp(timestamp::Call::set(42)), + }, + BareExtrinsic { + signed: alice(), + index: 0, + function: Call::Balances(balances::Call::transfer(bob().into(), 69)), + }, + ] ) } @@ -276,8 +285,13 @@ mod tests { // Blake // hex!("741fcb660e6fa9f625fbcd993b49f6c1cc4040f5e0cc8727afdedf11fd3c464b").into(), // Keccak - hex!("171f1b2c01c9c616e40ee2d842a699286b50a5a74874b56d826094dadedffb27").into(), + hex!("a4b56027b5f889d9dd3d144b3f8a337f4354321415bdd4ad064f2fe274021af6").into(), vec![ + BareExtrinsic { + signed: Default::default(), + index: 0, + function: Call::Timestamp(timestamp::Call::set(52)), + }, BareExtrinsic { signed: bob(), index: 0, @@ -299,12 +313,19 @@ mod tests { // Blake // hex!("2c7231a9c210a7aa4bea169d944bc4aaacd517862b244b8021236ffa7f697991").into(), // Keccak - hex!("e45221804da3a3609454d4e09debe6364cc6af63c2ff067d802d1af62fea32ae").into(), - vec![BareExtrinsic { - signed: alice(), - index: 0, - function: Call::Consensus(consensus::Call::remark(vec![0; 60000])), - }] + hex!("208c206ba9721c99cdc9ccaef941d867f75441866ca58db73fae289d8c504892").into(), + vec![ + BareExtrinsic { + signed: Default::default(), + index: 0, + function: Call::Timestamp(timestamp::Call::set(42)), + }, + BareExtrinsic { + signed: alice(), + index: 0, + function: Call::Consensus(consensus::Call::remark(vec![0; 60000])), + } + ] ) } @@ -320,10 +341,14 @@ mod tests { assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), + event: Event::system(system::Event::ExtrinsicSuccess) + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), event: Event::balances(balances::RawEvent::NewAccount(bob(), 1, balances::NewAccountOutcome::NoHint)) }, EventRecord { - phase: Phase::ApplyExtrinsic(0), + phase: Phase::ApplyExtrinsic(1), event: Event::system(system::Event::ExtrinsicSuccess) } ]); @@ -343,6 +368,10 @@ mod tests { phase: Phase::ApplyExtrinsic(1), event: Event::system(system::Event::ExtrinsicSuccess) }, + EventRecord { + phase: Phase::ApplyExtrinsic(2), + event: Event::system(system::Event::ExtrinsicSuccess) + }, EventRecord { phase: Phase::Finalization, event: Event::session(session::RawEvent::NewSession(1)) From f3e9299266688beb4777bc47eddd3349f4dc5f63 Mon Sep 17 00:00:00 2001 From: arkpar Date: Wed, 5 Sep 2018 13:27:19 +0200 Subject: [PATCH 07/14] Fixed a few small issues --- demo/consensus/src/evaluation.rs | 2 +- demo/network/src/consensus.rs | 7 +++++-- demo/network/src/lib.rs | 8 +++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/demo/consensus/src/evaluation.rs b/demo/consensus/src/evaluation.rs index df192eda586ad..5718bb17ca194 100644 --- a/demo/consensus/src/evaluation.rs +++ b/demo/consensus/src/evaluation.rs @@ -48,7 +48,7 @@ error_chain! { description("Proposal exceeded the maximum size."), display( "Proposal exceeded the maximum size of {} by {} bytes.", - MAX_TRANSACTIONS_SIZE, MAX_TRANSACTIONS_SIZE.saturating_sub(*size) + MAX_TRANSACTIONS_SIZE, size.saturating_sub(MAX_TRANSACTIONS_SIZE) ), } } diff --git a/demo/network/src/consensus.rs b/demo/network/src/consensus.rs index e7323dc8e6d5c..1334b24809a66 100644 --- a/demo/network/src/consensus.rs +++ b/demo/network/src/consensus.rs @@ -191,7 +191,10 @@ impl Future for MessageProcessTask { }, Ok(Async::Ready(None)) => return Ok(Async::Ready(())), Ok(Async::NotReady) => return Ok(Async::NotReady), - Err(e) => debug!(target: "demo-network", "Error getting consensus message: {:?}", e), + Err(e) => { + debug!(target: "demo-network", "Error getting consensus message: {:?}", e); + return Err(e); + }, } } } @@ -244,7 +247,7 @@ impl Network for ConsensusNetwork

{ /// current validators. type Output = BftSink<::demo_consensus::Error>; - /// Instantiate a table router using the given shared table. + /// Get input and output streams of BFT messages. fn communication_for( &self, validators: &[SessionKey], local_id: SessionKey, diff --git a/demo/network/src/lib.rs b/demo/network/src/lib.rs index a4bb3e993aa88..8dc572644c58f 100644 --- a/demo/network/src/lib.rs +++ b/demo/network/src/lib.rs @@ -16,9 +16,7 @@ //! Substrate Demo-specific network implementation. //! -//! This manages gossip of consensus messages for BFT and for parachain statements, -//! parachain block and extrinsic data fetching, communication between collators and validators, -//! and more. +//! This manages gossip of consensus messages for BFT. extern crate substrate_bft as bft; extern crate substrate_network; @@ -71,9 +69,9 @@ impl Protocol { } /// Note new consensus session. - fn new_consensus(&mut self, hash: Hash) { + fn new_consensus(&mut self, parent_hash: Hash) { let old_consensus = self.live_consensus.take(); - self.live_consensus = Some(hash); + self.live_consensus = Some(parent_hash); self.consensus_gossip.collect_garbage(old_consensus.as_ref()); } } From dbf6d0ca1e9549e69be298e8753bf5e9b6ebf412 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 6 Sep 2018 12:25:08 +0200 Subject: [PATCH 08/14] 2017->2018 --- demo/api/src/lib.rs | 2 +- demo/cli/src/error.rs | 2 +- demo/cli/src/lib.rs | 2 +- demo/consensus/src/error.rs | 2 +- demo/consensus/src/evaluation.rs | 2 +- demo/consensus/src/lib.rs | 2 +- demo/consensus/src/service.rs | 2 +- demo/executor/src/lib.rs | 2 +- demo/network/src/consensus.rs | 2 +- demo/network/src/lib.rs | 2 +- demo/primitives/src/lib.rs | 2 +- demo/runtime/src/checked_block.rs | 2 +- demo/runtime/src/lib.rs | 2 +- demo/service/src/chain_spec.rs | 2 +- demo/service/src/lib.rs | 2 +- demo/src/main.rs | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/demo/api/src/lib.rs b/demo/api/src/lib.rs index 34cda3a2bd8de..fbcba1cf9acee 100644 --- a/demo/api/src/lib.rs +++ b/demo/api/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/cli/src/error.rs b/demo/cli/src/error.rs index 8de348c4ef1b2..c8b4fdedde099 100644 --- a/demo/cli/src/error.rs +++ b/demo/cli/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 917c93f00f326..88fa9082aa796 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/consensus/src/error.rs b/demo/consensus/src/error.rs index a423f98fccb9b..5afd76ad68036 100644 --- a/demo/consensus/src/error.rs +++ b/demo/consensus/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/consensus/src/evaluation.rs b/demo/consensus/src/evaluation.rs index 5718bb17ca194..8876c852f18bd 100644 --- a/demo/consensus/src/evaluation.rs +++ b/demo/consensus/src/evaluation.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify diff --git a/demo/consensus/src/lib.rs b/demo/consensus/src/lib.rs index 938f4286ba3e7..f9e895ee70dd8 100644 --- a/demo/consensus/src/lib.rs +++ b/demo/consensus/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/consensus/src/service.rs b/demo/consensus/src/service.rs index 310e46ee55ec5..e70bc78ab2154 100644 --- a/demo/consensus/src/service.rs +++ b/demo/consensus/src/service.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 5e02b1f2ffd07..cd6b0e5bf8abd 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/network/src/consensus.rs b/demo/network/src/consensus.rs index 1334b24809a66..b1b09995e8108 100644 --- a/demo/network/src/consensus.rs +++ b/demo/network/src/consensus.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/network/src/lib.rs b/demo/network/src/lib.rs index 8dc572644c58f..37d22ebceeb7a 100644 --- a/demo/network/src/lib.rs +++ b/demo/network/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 6d14ee40387f0..8f623d14c2314 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/runtime/src/checked_block.rs b/demo/runtime/src/checked_block.rs index 41b9e7400c82a..1d2431e644263 100644 --- a/demo/runtime/src/checked_block.rs +++ b/demo/runtime/src/checked_block.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index dea50ff6bb77a..a06c709d5ee1b 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/service/src/chain_spec.rs b/demo/service/src/chain_spec.rs index 34d436f50193b..c640ba393b65f 100644 --- a/demo/service/src/chain_spec.rs +++ b/demo/service/src/chain_spec.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/service/src/lib.rs b/demo/service/src/lib.rs index f763748153e7f..68810e256de73 100644 --- a/demo/service/src/lib.rs +++ b/demo/service/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify diff --git a/demo/src/main.rs b/demo/src/main.rs index f20f48f210b11..698a0aff78bb0 100644 --- a/demo/src/main.rs +++ b/demo/src/main.rs @@ -1,4 +1,4 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate Demo. // Substrate Demo is free software: you can redistribute it and/or modify From 7d8ef2c848fc06bbe4cce337c85c21cf2070a974 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 6 Sep 2018 12:41:17 +0200 Subject: [PATCH 09/14] Style --- Cargo.lock | 28 +++++++++++++++++++--------- demo/Cargo.toml | 2 +- demo/consensus/src/evaluation.rs | 10 +++++----- demo/consensus/src/lib.rs | 8 +++++++- demo/network/Cargo.toml | 2 -- demo/network/src/lib.rs | 4 ++-- demo/service/src/chain_spec.rs | 4 +++- demo/src/main.rs | 4 ++-- 8 files changed, 39 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 756b590dc8bdc..7ec0cdbe7670d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -430,12 +430,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "1.1.1" -source = "git+https://github.com/paritytech/rust-ctrlc.git#b523017108bb2d571a7a69bd97bc406e63bc7a9d" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -533,11 +532,9 @@ dependencies = [ "ed25519 0.1.0", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-bft 0.1.0", "substrate-network 0.1.0", - "substrate-primitives 0.1.0", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1731,6 +1728,18 @@ dependencies = [ "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "nix" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nodrop" version = "0.1.12" @@ -2597,7 +2606,7 @@ dependencies = [ name = "substrate-demo" version = "0.1.0" dependencies = [ - "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", + "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "demo-cli 0.1.0", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3972,7 +3981,7 @@ dependencies = [ "checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50ac3add446ec1f8fe3dc007cd838f5b22bbf33186394feac505451ecc43c018" -"checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" +"checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum datastore 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=e2960b4317b22d64c4fca7fa77c6124a44a92f88)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" @@ -4079,6 +4088,7 @@ dependencies = [ "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" +"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-integer 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "6ac0ea58d64a89d9d6b7688031b3be9358d6c919badcf7fbb0527ccfd891ee45" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" diff --git a/demo/Cargo.toml b/demo/Cargo.toml index 5cf15a0d56e2f..4a91badd50a49 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -12,7 +12,7 @@ build = "build.rs" error-chain = "0.12" demo-cli = { path = "cli" } futures = "0.1" -ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } +ctrlc = { version = "3.0", features = ["termination"] } [build-dependencies] vergen = "0.1" diff --git a/demo/consensus/src/evaluation.rs b/demo/consensus/src/evaluation.rs index 8876c852f18bd..0d073aa52109c 100644 --- a/demo/consensus/src/evaluation.rs +++ b/demo/consensus/src/evaluation.rs @@ -1,20 +1,20 @@ // Copyright 2018 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. +// This file is part of Substrate Demo. -// Polkadot is free software: you can redistribute it and/or modify +// Substrate Demo is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Polkadot is distributed in the hope that it will be useful, +// Substrate Demo is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . +// along with Substrate Demo. If not, see . -//! Polkadot block evaluation and evaluation errors. +//! Block evaluation and evaluation errors. use super::MAX_TRANSACTIONS_SIZE; diff --git a/demo/consensus/src/lib.rs b/demo/consensus/src/lib.rs index f9e895ee70dd8..a41882e6c96ba 100644 --- a/demo/consensus/src/lib.rs +++ b/demo/consensus/src/lib.rs @@ -83,7 +83,13 @@ pub trait Network { type Output: Sink,SinkError=Error>; /// Instantiate input and output streams. - fn communication_for(&self, validators: &[SessionKey], local_id: SessionKey, parent_hash: Hash, task_executor: TaskExecutor) -> (Self::Input, Self::Output); + fn communication_for( + &self, + validators: &[SessionKey], + local_id: SessionKey, + parent_hash: Hash, + task_executor: TaskExecutor + ) -> (Self::Input, Self::Output); } /// Proposer factory. diff --git a/demo/network/Cargo.toml b/demo/network/Cargo.toml index 2709d728a307a..3329f779b4719 100644 --- a/demo/network/Cargo.toml +++ b/demo/network/Cargo.toml @@ -5,13 +5,11 @@ authors = ["Parity Technologies "] description = "Substrate demo networking protocol" [dependencies] -parking_lot = "0.4" demo-api = { path = "../api" } demo-consensus = { path = "../consensus" } demo-primitives = { path = "../primitives" } substrate-bft = { path = "../../substrate/bft" } substrate-network = { path = "../../substrate/network" } -substrate-primitives = { path = "../../substrate/primitives" } ed25519 = { path = "../../substrate/ed25519" } futures = "0.1" tokio = "0.1.7" diff --git a/demo/network/src/lib.rs b/demo/network/src/lib.rs index 37d22ebceeb7a..f32c039669f3a 100644 --- a/demo/network/src/lib.rs +++ b/demo/network/src/lib.rs @@ -18,9 +18,10 @@ //! //! This manages gossip of consensus messages for BFT. +#![warn(unused_extern_crates)] + extern crate substrate_bft as bft; extern crate substrate_network; -extern crate substrate_primitives; extern crate demo_api; extern crate demo_consensus; @@ -28,7 +29,6 @@ extern crate demo_primitives; extern crate ed25519; extern crate futures; -extern crate parking_lot; extern crate tokio; extern crate rhododendron; diff --git a/demo/service/src/chain_spec.rs b/demo/service/src/chain_spec.rs index c640ba393b65f..07f4f7790ba35 100644 --- a/demo/service/src/chain_spec.rs +++ b/demo/service/src/chain_spec.rs @@ -152,7 +152,9 @@ fn testnet_genesis(initial_authorities: Vec) -> GenesisConfig { minimum_deposit: 10, }), council: Some(CouncilConfig { - active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|&b| a.0 == b.0).is_none()).map(|a| (a.clone(), 1000000)).collect(), + active_council: endowed_accounts.iter() + .filter(|a| initial_authorities.iter().find(|&b| a.0 == b.0).is_none()) + .map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, present_slash_per_voter: 1, diff --git a/demo/src/main.rs b/demo/src/main.rs index 698a0aff78bb0..96df5535f402d 100644 --- a/demo/src/main.rs +++ b/demo/src/main.rs @@ -45,11 +45,11 @@ impl cli::IntoExit for Exit { let (exit_send, exit) = oneshot::channel(); let exit_send_cell = RefCell::new(Some(exit_send)); - ctrlc::CtrlC::set_handler(move || { + ctrlc::set_handler(move || { if let Some(exit_send) = exit_send_cell.try_borrow_mut().expect("signal handler not reentrant; qed").take() { exit_send.send(()).expect("Error sending exit notification"); } - }); + }).expect("Error setting Ctrl-C handler"); exit.map_err(drop) } From 73534741ab5e52a05169cf28cde9034298adeb02 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 6 Sep 2018 12:45:00 +0200 Subject: [PATCH 10/14] More style --- demo/network/src/consensus.rs | 44 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/demo/network/src/consensus.rs b/demo/network/src/consensus.rs index b1b09995e8108..d7c5fd92c570a 100644 --- a/demo/network/src/consensus.rs +++ b/demo/network/src/consensus.rs @@ -25,6 +25,7 @@ use substrate_network::consensus_gossip::ConsensusMessage; use demo_api::Api; use demo_consensus::Network; use demo_primitives::{Block, Hash, SessionKey}; +use rhododendron; use futures::prelude::*; use futures::sync::mpsc; @@ -47,11 +48,13 @@ impl Sink for BftSink { // TODO: replace this with the ! type when that's stabilized type SinkError = E; - fn start_send(&mut self, message: bft::Communication) -> ::futures::StartSend, E> { + fn start_send(&mut self, message: bft::Communication) + -> ::futures::StartSend, E> + { let network_message = net::LocalizedBftMessage { message: match message { - ::rhododendron::Communication::Consensus(c) => msg::BftMessage::Consensus(match c { - ::rhododendron::LocalizedMessage::Propose(proposal) => msg::SignedConsensusMessage::Propose(msg::SignedConsensusProposal { + rhododendron::Communication::Consensus(c) => msg::BftMessage::Consensus(match c { + rhododendron::LocalizedMessage::Propose(proposal) => msg::SignedConsensusMessage::Propose(msg::SignedConsensusProposal { round_number: proposal.round_number as u32, proposal: proposal.proposal, digest: proposal.digest, @@ -59,17 +62,17 @@ impl Sink for BftSink { digest_signature: proposal.digest_signature.signature, full_signature: proposal.full_signature.signature, }), - ::rhododendron::LocalizedMessage::Vote(vote) => msg::SignedConsensusMessage::Vote(msg::SignedConsensusVote { + rhododendron::LocalizedMessage::Vote(vote) => msg::SignedConsensusMessage::Vote(msg::SignedConsensusVote { sender: vote.sender, signature: vote.signature.signature, vote: match vote.vote { - ::rhododendron::Vote::Prepare(r, h) => msg::ConsensusVote::Prepare(r as u32, h), - ::rhododendron::Vote::Commit(r, h) => msg::ConsensusVote::Commit(r as u32, h), - ::rhododendron::Vote::AdvanceRound(r) => msg::ConsensusVote::AdvanceRound(r as u32), + rhododendron::Vote::Prepare(r, h) => msg::ConsensusVote::Prepare(r as u32, h), + rhododendron::Vote::Commit(r, h) => msg::ConsensusVote::Commit(r as u32, h), + rhododendron::Vote::AdvanceRound(r) => msg::ConsensusVote::AdvanceRound(r as u32), } }), }), - ::rhododendron::Communication::Auxiliary(justification) => { + rhododendron::Communication::Auxiliary(justification) => { let unchecked: bft::UncheckedJustification<_> = justification.uncheck().into(); msg::BftMessage::Auxiliary(unchecked.into()) } @@ -88,12 +91,17 @@ impl Sink for BftSink { } // check signature and authority validity of message. -fn process_bft_message(msg: msg::LocalizedBftMessage, local_id: &SessionKey, authorities: &[SessionKey]) -> Result>, bft::Error> { +fn process_bft_message( + msg: msg::LocalizedBftMessage, + local_id: &SessionKey, + authorities: &[SessionKey] + ) -> Result>, bft::Error> +{ Ok(Some(match msg.message { - msg::BftMessage::Consensus(c) => ::rhododendron::Communication::Consensus(match c { - msg::SignedConsensusMessage::Propose(proposal) => ::rhododendron::LocalizedMessage::Propose({ + msg::BftMessage::Consensus(c) => rhododendron::Communication::Consensus(match c { + msg::SignedConsensusMessage::Propose(proposal) => rhododendron::LocalizedMessage::Propose({ if &proposal.sender == local_id { return Ok(None) } - let proposal = ::rhododendron::LocalizedProposal { + let proposal = rhododendron::LocalizedProposal { round_number: proposal.round_number as usize, proposal: proposal.proposal, digest: proposal.digest, @@ -112,18 +120,18 @@ fn process_bft_message(msg: msg::LocalizedBftMessage, local_id: &Se trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender.0)); proposal }), - msg::SignedConsensusMessage::Vote(vote) => ::rhododendron::LocalizedMessage::Vote({ + msg::SignedConsensusMessage::Vote(vote) => rhododendron::LocalizedMessage::Vote({ if &vote.sender == local_id { return Ok(None) } - let vote = ::rhododendron::LocalizedVote { + let vote = rhododendron::LocalizedVote { sender: vote.sender, signature: ed25519::LocalizedSignature { signature: vote.signature, signer: ed25519::Public(vote.sender.0), }, vote: match vote.vote { - msg::ConsensusVote::Prepare(r, h) => ::rhododendron::Vote::Prepare(r as usize, h), - msg::ConsensusVote::Commit(r, h) => ::rhododendron::Vote::Commit(r as usize, h), - msg::ConsensusVote::AdvanceRound(r) => ::rhododendron::Vote::AdvanceRound(r as usize), + msg::ConsensusVote::Prepare(r, h) => rhododendron::Vote::Prepare(r as usize, h), + msg::ConsensusVote::Commit(r, h) => rhododendron::Vote::Commit(r as usize, h), + msg::ConsensusVote::AdvanceRound(r) => rhododendron::Vote::AdvanceRound(r as usize), } }; bft::check_vote::(authorities, &msg.parent_hash, &vote)?; @@ -137,7 +145,7 @@ fn process_bft_message(msg: msg::LocalizedBftMessage, local_id: &Se // TODO: get proper error let justification: Result<_, bft::Error> = bft::check_prepare_justification::(authorities, msg.parent_hash, justification) .map_err(|_| bft::ErrorKind::InvalidJustification.into()); - ::rhododendron::Communication::Auxiliary(justification?) + rhododendron::Communication::Auxiliary(justification?) }, })) } From 946e5e4c5720ac900f84a5a818dcca38713016a7 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 6 Sep 2018 12:53:09 +0200 Subject: [PATCH 11/14] Renamed demo executable to substrate --- Cargo.lock | 22 +++++++++++----------- demo/Cargo.toml | 4 ++-- demo/cli/src/lib.rs | 2 +- demo/src/main.rs | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7ec0cdbe7670d..20cc63c469170 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2483,6 +2483,17 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "substrate" +version = "0.1.0" +dependencies = [ + "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "demo-cli 0.1.0", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-bft" version = "0.1.0" @@ -2602,17 +2613,6 @@ dependencies = [ "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "substrate-demo" -version = "0.1.0" -dependencies = [ - "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "demo-cli 0.1.0", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "substrate-executor" version = "0.1.0" diff --git a/demo/Cargo.toml b/demo/Cargo.toml index 4a91badd50a49..326844dc9002f 100644 --- a/demo/Cargo.toml +++ b/demo/Cargo.toml @@ -1,9 +1,9 @@ [[bin]] -name = "substrate-demo" +name = "substrate" path = "src/main.rs" [package] -name = "substrate-demo" +name = "substrate" version = "0.1.0" authors = ["Parity Technologies "] build = "build.rs" diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 88fa9082aa796..e3efa9803f082 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -86,7 +86,7 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul match cli::prepare_execution::(args, exit, version, load_spec, "substrate-demo")? { cli::Action::ExecutedInternally => (), cli::Action::RunService((config, exit)) => { - info!("Parity ·:· Substrate Demo"); + info!("Parity ·:· Substrate"); info!(" version {}", config.full_version()); info!(" by Parity Technologies, 2017, 2018"); info!("Chain specification: {}", config.chain_spec.name()); diff --git a/demo/src/main.rs b/demo/src/main.rs index 96df5535f402d..7b219728c38c7 100644 --- a/demo/src/main.rs +++ b/demo/src/main.rs @@ -61,9 +61,9 @@ fn run() -> cli::error::Result<()> { let version = VersionInfo { commit: vergen::short_sha(), version: env!("CARGO_PKG_VERSION"), - executable_name: "substrate-demo", + executable_name: "substrate", author: "Parity Team ", - description: "Substrate Demo Implementation", + description: "Generic substrate node", }; cli::run(::std::env::args(), Exit, version) } From c17c8b418edef1a9f26cfa8c5b87d1c8b4b709d6 Mon Sep 17 00:00:00 2001 From: arkpar Date: Fri, 7 Sep 2018 21:40:49 +0200 Subject: [PATCH 12/14] Style --- demo/consensus/src/error.rs | 4 ---- demo/consensus/src/lib.rs | 10 +++++----- demo/service/src/lib.rs | 12 ++++++------ substrate/client/src/client.rs | 4 ++-- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/demo/consensus/src/error.rs b/demo/consensus/src/error.rs index 5afd76ad68036..e8b60c847c34d 100644 --- a/demo/consensus/src/error.rs +++ b/demo/consensus/src/error.rs @@ -25,10 +25,6 @@ error_chain! { } errors { - InvalidDutyRosterLength(expected: usize, got: usize) { - description("Duty Roster had invalid length"), - display("Invalid duty roster length: expected {}, got {}", expected, got), - } NotValidator(id: AuthorityId) { description("Local account ID not a validator at this block."), display("Local account ID ({:?}) not a validator at this block.", id), diff --git a/demo/consensus/src/lib.rs b/demo/consensus/src/lib.rs index 70e63bf0c9bdc..7f55bc1e68fef 100644 --- a/demo/consensus/src/lib.rs +++ b/demo/consensus/src/lib.rs @@ -273,11 +273,11 @@ impl bft::Proposer for Proposer .expect("blocks are defined to serialize to substrate blocks correctly; qed"); assert!(evaluation::evaluate_initial( - &substrate_block, - timestamp, - &self.parent_hash, - self.parent_number, - ).is_ok()); + &substrate_block, + timestamp, + &self.parent_hash, + self.parent_number, + ).is_ok()); Ok(substrate_block) } diff --git a/demo/service/src/lib.rs b/demo/service/src/lib.rs index 68810e256de73..14cd91d643acf 100644 --- a/demo/service/src/lib.rs +++ b/demo/service/src/lib.rs @@ -178,12 +178,12 @@ pub fn new_full(config: Configuration, executor: TaskExecutor) let consensus_net = ConsensusNetwork::new(service.network(), client.clone()); Some(consensus::Service::new( - client.clone(), - client.clone(), - consensus_net, - service.extrinsic_pool(), - executor, - key, + client.clone(), + client.clone(), + consensus_net, + service.extrinsic_pool(), + executor, + key, )) } else { None diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 3e119e066aa19..c736ed2af7cf1 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -347,7 +347,7 @@ impl Client where "initialise_block", &header.encode(), execution_manager() - )?; + )?; let (r, _) = args.using_encoded(|input| self.executor().call_at_state( &state, @@ -355,7 +355,7 @@ impl Client where function, input, execution_manager() - ))?; + ))?; Ok(R::decode(&mut &r[..]) .ok_or_else(|| error::Error::from(error::ErrorKind::CallResultDecode(function)))?) }) From f882159829a4ead8c518a8eeff50520ddc9d8459 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 10 Sep 2018 10:21:07 +0200 Subject: [PATCH 13/14] Fixed compilation after merge --- substrate/client/src/light/call_executor.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/substrate/client/src/light/call_executor.rs b/substrate/client/src/light/call_executor.rs index f9c3773f6ed72..354a2dbe33e71 100644 --- a/substrate/client/src/light/call_executor.rs +++ b/substrate/client/src/light/call_executor.rs @@ -47,11 +47,13 @@ pub struct RemoteCallExecutor { _codec: PhantomData, } -impl Clone for RemoteCallExecutor { +impl Clone for RemoteCallExecutor { fn clone(&self) -> Self { RemoteCallExecutor { blockchain: self.blockchain.clone(), - fetcher: self.fetcher.clone() + fetcher: self.fetcher.clone(), + _hasher: Default::default(), + _codec: Default::default(), } } } From b3295d6242ef8c2c57d80b11a3fc31001cd2d75a Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 10 Sep 2018 15:10:52 +0200 Subject: [PATCH 14/14] Style --- demo/executor/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index aec954e9f8809..54421aa36e163 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -362,8 +362,8 @@ mod tests { assert_eq!(Balances::total_balance(&bob()), 78); assert_eq!(System::events(), vec![ EventRecord { - phase: Phase::ApplyExtrinsic(0), - event: Event::system(system::Event::ExtrinsicSuccess) + phase: Phase::ApplyExtrinsic(0), + event: Event::system(system::Event::ExtrinsicSuccess) }, EventRecord { phase: Phase::ApplyExtrinsic(1),