From 2e263226da50a67044a79fe9d416931ab456df05 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 6 Jun 2018 17:58:45 +0200 Subject: [PATCH] Make substrate generic (#169) * Some initial work on RPC and client * Rephrase as params * More work on traitifying substrate. * Traitify in_mem.rs * traitify client.rs * Make new primitives (mainly traits) build again. * Many (superficial) build fixes throughout. * Fix remaining build issues up to bft interface. * Make bft primitives be generic. * Switch out MisBehaviorReport for generic version. * Merge Hashing into Header. * Update runtime for new generics (with Hashing). * Update demo runtime. * Make runtime compile. * Build fixes for runtime * Remove old modules. * port substrate-bft to use generic substrate types * port client * port substrate-test-runtime * mostly port test-runtime to get compiling for std * Ensure `AccountId` has a `Default`. * Fix type deps. * finish porting * initialize test_runtime from genesis correctly * remove commented code * maybe unsigned signatures * runtimes compile * port over most of network * serialization for generic types * fix comment * remove some unnecessary trait bounds * network compiles * tests compile for sync * fix deserialization * temporarily remove deserialize derives * workarounds for serde issues for deriving deserialization * get demo-runtime compiling on std * port extrinsic-pool * primitives reshuffling * get network compiling again * remove debugging file * runtime tests now passing * port client-db * start to port over substrate-rpc * mostly port over PolkadotApi * test_runtime follows normal conventions * substrate runtime tests pass * deal with inherent extrinsics correctly in polkadot-api * port transaction-pool * port polkadot-consensus * port substrate-rpc * everything compiles * tests compile * fix grumbles * test-runtime uses its own transfer type * switch to master branch of jsonrpc * fix network tests and some warnings * all tests pass locally * [ci-skip] add another comment about issue * remove some curlies --- Cargo.lock | 1250 +++++++++-------- demo/cli/src/lib.rs | 23 +- demo/executor/src/lib.rs | 78 +- demo/primitives/src/lib.rs | 2 +- demo/runtime/src/lib.rs | 32 +- demo/runtime/wasm/Cargo.lock | 428 +++--- .../release/demo_runtime.compact.wasm | Bin 414072 -> 402944 bytes .../release/demo_runtime.wasm | Bin 444089 -> 436992 bytes polkadot/api/src/full.rs | 241 ++-- polkadot/api/src/lib.rs | 49 +- polkadot/api/src/light.rs | 48 +- polkadot/cli/Cargo.toml | 8 +- polkadot/cli/src/informant.rs | 11 +- polkadot/cli/src/lib.rs | 14 +- polkadot/collator/Cargo.toml | 3 +- polkadot/collator/src/lib.rs | 5 +- polkadot/consensus/Cargo.toml | 1 + polkadot/consensus/src/error.rs | 4 +- polkadot/consensus/src/evaluation.rs | 16 +- polkadot/consensus/src/lib.rs | 73 +- polkadot/consensus/src/service.rs | 102 +- polkadot/consensus/src/shared_table/mod.rs | 4 +- polkadot/executor/Cargo.toml | 12 - polkadot/executor/src/lib.rs | 7 - polkadot/primitives/src/lib.rs | 72 +- polkadot/primitives/src/parachain.rs | 89 +- polkadot/runtime/Cargo.toml | 4 +- polkadot/runtime/src/lib.rs | 191 ++- polkadot/runtime/src/parachains.rs | 19 +- polkadot/runtime/wasm/Cargo.lock | 428 +++--- polkadot/runtime/wasm/Cargo.toml | 4 +- .../release/polkadot_runtime.compact.wasm | Bin 428387 -> 419388 bytes .../release/polkadot_runtime.wasm | Bin 464443 -> 460905 bytes polkadot/service/src/lib.rs | 106 +- polkadot/statement-table/src/lib.rs | 4 +- polkadot/transaction-pool/src/lib.rs | 145 +- substrate/bft/Cargo.toml | 1 + substrate/bft/src/error.rs | 6 +- substrate/bft/src/lib.rs | 311 ++-- substrate/client/Cargo.toml | 1 + substrate/client/db/Cargo.toml | 1 + substrate/client/db/src/lib.rs | 164 ++- substrate/client/src/backend.rs | 30 +- substrate/client/src/block_builder.rs | 113 +- substrate/client/src/blockchain.rs | 28 +- substrate/client/src/call_executor.rs | 47 +- substrate/client/src/client.rs | 238 ++-- substrate/client/src/error.rs | 12 +- substrate/client/src/genesis.rs | 87 +- substrate/client/src/in_mem.rs | 220 +-- substrate/client/src/lib.rs | 1 + substrate/client/src/light.rs | 116 +- .../release/runtime_test.compact.wasm | Bin 13648 -> 13363 bytes .../release/runtime_test.wasm | Bin 13773 -> 13800 bytes substrate/extrinsic-pool/Cargo.toml | 1 - substrate/extrinsic-pool/src/api.rs | 18 +- substrate/extrinsic-pool/src/lib.rs | 1 - substrate/extrinsic-pool/src/listener.rs | 23 +- substrate/extrinsic-pool/src/pool.rs | 20 +- substrate/extrinsic-pool/src/watcher.rs | 27 +- substrate/misbehavior-check/Cargo.toml | 3 +- substrate/misbehavior-check/src/lib.rs | 55 +- substrate/network/Cargo.toml | 1 + substrate/network/src/blocks.rs | 53 +- substrate/network/src/chain.rs | 64 +- substrate/network/src/consensus.rs | 208 +-- substrate/network/src/lib.rs | 14 +- substrate/network/src/message.rs | 487 +++---- substrate/network/src/on_demand.rs | 69 +- substrate/network/src/protocol.rs | 169 +-- substrate/network/src/service.rs | 112 +- substrate/network/src/sync.rs | 111 +- substrate/network/src/test/consensus.rs | 12 +- substrate/network/src/test/mod.rs | 37 +- substrate/primitives/src/block.rs | 276 ---- substrate/primitives/src/hash.rs | 4 +- substrate/primitives/src/lib.rs | 19 +- substrate/rpc-servers/Cargo.toml | 1 + substrate/rpc-servers/src/lib.rs | 11 +- substrate/rpc/Cargo.toml | 1 + substrate/rpc/src/author/mod.rs | 12 +- substrate/rpc/src/author/tests.rs | 19 +- substrate/rpc/src/chain/mod.rs | 40 +- substrate/rpc/src/chain/tests.rs | 7 +- substrate/rpc/src/lib.rs | 1 + substrate/rpc/src/state/mod.rs | 56 +- substrate/runtime-io/Cargo.toml | 2 +- substrate/runtime-io/src/lib.rs | 34 - substrate/runtime-io/with_std.rs | 19 +- substrate/runtime-io/without_std.rs | 21 + substrate/runtime-std/with_std.rs | 1 + substrate/runtime-std/without_std.rs | 1 + substrate/runtime-support/src/dispatch.rs | 73 +- substrate/runtime-support/src/lib.rs | 8 - substrate/runtime/consensus/Cargo.toml | 2 + substrate/runtime/consensus/src/lib.rs | 18 +- substrate/runtime/council/Cargo.toml | 2 + substrate/runtime/council/src/lib.rs | 22 +- substrate/runtime/council/src/voting.rs | 14 +- substrate/runtime/democracy/Cargo.toml | 2 + substrate/runtime/democracy/src/lib.rs | 23 +- .../runtime/democracy/src/vote_threshold.rs | 2 +- substrate/runtime/executive/src/lib.rs | 13 +- substrate/runtime/primitives/Cargo.toml | 3 + substrate/{ => runtime}/primitives/src/bft.rs | 99 +- substrate/runtime/primitives/src/generic.rs | 392 ++++-- substrate/runtime/primitives/src/lib.rs | 87 +- substrate/runtime/primitives/src/testing.rs | 48 +- substrate/runtime/primitives/src/traits.rs | 268 ++-- substrate/runtime/session/Cargo.toml | 2 + substrate/runtime/session/src/lib.rs | 12 +- substrate/runtime/staking/Cargo.toml | 2 + substrate/runtime/staking/src/lib.rs | 17 +- substrate/runtime/system/src/lib.rs | 21 +- substrate/runtime/timestamp/Cargo.toml | 2 + substrate/runtime/timestamp/src/lib.rs | 10 +- substrate/state-machine/Cargo.toml | 2 +- substrate/state-machine/src/lib.rs | 4 - substrate/test-client/Cargo.toml | 1 + substrate/test-client/src/client_ext.rs | 31 +- substrate/test-client/src/lib.rs | 5 +- substrate/test-runtime/Cargo.toml | 6 + substrate/test-runtime/src/genesismap.rs | 11 +- substrate/test-runtime/src/lib.rs | 121 +- substrate/test-runtime/src/system.rs | 140 +- substrate/test-runtime/src/transaction.rs | 83 -- .../test-runtime/src/unchecked_transaction.rs | 97 -- substrate/test-runtime/wasm/Cargo.lock | 400 +++--- substrate/test-runtime/wasm/Cargo.toml | 2 + substrate/test-runtime/wasm/genesis.wasm | Bin 17273 -> 20332 bytes .../substrate_test_runtime.compact.wasm | Bin 21385 -> 20332 bytes .../release/substrate_test_runtime.wasm | Bin 22955 -> 22430 bytes 132 files changed, 4648 insertions(+), 4256 deletions(-) delete mode 100644 substrate/primitives/src/block.rs rename substrate/{ => runtime}/primitives/src/bft.rs (75%) delete mode 100644 substrate/test-runtime/src/transaction.rs delete mode 100644 substrate/test-runtime/src/unchecked_transaction.rs diff --git a/Cargo.lock b/Cargo.lock index 8209509e4fab5..763bbbf3db65a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,38 +45,38 @@ dependencies = [ [[package]] name = "assert_matches" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "atty" -version = "0.2.6" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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)", ] [[package]] name = "backtrace" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", + "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)", ] [[package]] name = "backtrace-sys" -version = "0.1.16" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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]] @@ -86,26 +86,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "base64" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -119,29 +109,29 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -149,9 +139,9 @@ name = "chrono" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -160,41 +150,93 @@ version = "2.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cmake" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-deque" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-epoch" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 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)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] -name = "crossbeam" +name = "crossbeam-utils" +version = "0.2.2" +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)", +] + +[[package]] +name = "crossbeam-utils" version = "0.3.2" 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)", +] [[package]] name = "crunchy" @@ -207,7 +249,7 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -223,8 +265,8 @@ dependencies = [ "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (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)", "substrate-client 0.1.0", "substrate-codec 0.1.0", @@ -235,8 +277,8 @@ dependencies = [ "substrate-rpc-servers 0.1.0", "substrate-runtime-io 0.1.0", "substrate-state-machine 0.1.0", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -246,7 +288,7 @@ dependencies = [ "demo-primitives 0.1.0", "demo-runtime 0.1.0", "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", @@ -257,7 +299,7 @@ dependencies = [ "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -265,8 +307,8 @@ name = "demo-primitives" version = "0.1.0" dependencies = [ "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -279,12 +321,12 @@ name = "demo-runtime" version = "0.1.0" dependencies = [ "demo-primitives 0.1.0", - "hex-literal 0.1.0 (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)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -318,7 +360,7 @@ version = "0.1.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -331,16 +373,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "elastic-array" -version = "0.9.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "elastic-array" @@ -356,7 +390,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -368,7 +402,7 @@ name = "error-chain" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -377,7 +411,7 @@ version = "0.5.7" source = "git+https://github.com/paritytech/rust-secp256k1#db81cfea59014b4d176f10f86ed52e1a130b6822" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -389,82 +423,70 @@ dependencies = [ "crunchy 0.1.6 (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.63 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ethcore-bigint" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (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 = "ethcore-bytes" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" [[package]] name = "ethcore-crypto" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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.0 (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 = "ethcore-io" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (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.3 (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)", - "time 0.1.39 (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)", ] [[package]] name = "ethcore-logger" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.0 (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.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ethcore-network" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-io 1.12.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", - "ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", "snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)", ] @@ -472,50 +494,50 @@ dependencies = [ [[package]] name = "ethcore-network-devp2p" version = "1.12.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-io 1.12.0 (git+https://github.com/paritytech/parity.git)", "ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)", "ethcore-network 1.12.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", "igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "path 0.1.0 (git+https://github.com/paritytech/parity.git)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)", - "tiny-keccak 1.4.0 (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 = "ethereum-types" -version = "0.3.1" +version = "0.3.2" 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)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -523,27 +545,27 @@ name = "ethereum-types-serialize" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ethkey" version = "0.3.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-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)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mem 0.1.0 (git+https://github.com/paritytech/parity.git)", "parity-wordlist 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.2 (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)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -551,7 +573,7 @@ name = "exit-future" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -560,7 +582,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -578,7 +600,7 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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)", ] @@ -593,7 +615,7 @@ name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -604,7 +626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "futures" -version = "0.1.18" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -612,7 +634,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -628,23 +650,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "globset" -version = "0.3.0" +version = "0.4.0" 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)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hashdb" version = "0.1.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -657,21 +679,21 @@ dependencies = [ [[package]] name = "hex" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -684,26 +706,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "hyper" -version = "0.11.25" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "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)", - "mime 0.3.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)", "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -713,7 +737,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -721,11 +745,11 @@ name = "igd" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -747,13 +771,13 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ipnetwork" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -761,104 +785,103 @@ name = "itertools" version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "8.0.2" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ - "futures 0.1.18 (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)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ - "hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", - "net2 0.2.31 (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)", ] [[package]] name = "jsonrpc-macros" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" 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)", - "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-server-utils" version = "8.0.1" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ - "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-ws-server" version = "8.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#0fd13be062625c6d4c89859c8686d4da3bbb552c" +source = "git+https://github.com/paritytech/jsonrpc.git#3e358b48b71bf90dc60b4099de47e65b030dc319" dependencies = [ "error-chain 0.11.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)", - "parking_lot 0.5.3 (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)", "ws 0.7.5 (git+https://github.com/tomusdrw/ws-rs)", ] [[package]] name = "keccak-hash" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (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 = "keccak-hash" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +version = "0.1.2" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -873,7 +896,7 @@ dependencies = [ [[package]] name = "kvdb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -883,25 +906,25 @@ dependencies = [ [[package]] name = "kvdb-memorydb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", - "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "kvdb-rocksdb" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.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.git)", "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.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (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)", ] @@ -917,7 +940,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -927,7 +950,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -958,7 +981,7 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -969,16 +992,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mem" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" [[package]] name = "memchr" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -987,20 +1015,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memorydb" version = "0.1.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "plain_hasher 0.1.0 (git+https://github.com/paritytech/parity.git)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", ] [[package]] name = "mime" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1008,7 +1036,7 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.13" +version = "0.6.14" 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)", @@ -1016,11 +1044,11 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (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)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.3.0 (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)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1030,21 +1058,19 @@ version = "0.2.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)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "net2" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 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)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (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)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1054,17 +1080,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num-integer" -version = "0.1.36" +version = "0.1.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "num-traits" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "num-traits" version = "0.2.4" @@ -1075,7 +1096,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1097,12 +1118,12 @@ dependencies = [ [[package]] name = "parity-wasm" -version = "0.27.4" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (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.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1110,7 +1131,7 @@ name = "parity-wasm" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1129,45 +1150,45 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 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)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "path" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" [[package]] name = "patricia-trie" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1183,18 +1204,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "plain_hasher" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" -dependencies = [ - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "plain_hasher" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1229,45 +1242,40 @@ version = "0.2.0" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", "ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)", "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.0 (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)", + "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)", - "polkadot-executor 0.1.0", "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", "polkadot-service 0.1.0", "polkadot-transaction-pool 0.1.0", - "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0", - "substrate-codec 0.1.0", - "substrate-executor 0.1.0", "substrate-network 0.1.0", - "substrate-primitives 0.1.0", "substrate-rpc 0.1.0", "substrate-rpc-servers 0.1.0", - "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "polkadot-collator" version = "0.1.0" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-parachain 0.1.0", "polkadot-primitives 0.1.0", + "polkadot-runtime 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", ] @@ -1279,7 +1287,7 @@ dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (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)", "polkadot-api 0.1.0", @@ -1295,26 +1303,17 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-network 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "polkadot-executor" version = "0.1.0" dependencies = [ - "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-primitives 0.1.0", "polkadot-runtime 0.1.0", - "substrate-codec 0.1.0", "substrate-executor 0.1.0", - "substrate-keyring 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-io 0.1.0", - "substrate-runtime-support 0.1.0", - "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1324,13 +1323,13 @@ dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", - "hex 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", "subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1339,8 +1338,8 @@ version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1348,8 +1347,8 @@ name = "polkadot-primitives" version = "0.1.0" dependencies = [ "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -1361,13 +1360,13 @@ dependencies = [ name = "polkadot-runtime" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (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)", "polkadot-primitives 0.1.0", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -1393,8 +1392,8 @@ dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (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)", "polkadot-api 0.1.0", @@ -1412,7 +1411,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-state-machine 0.1.0", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1463,6 +1462,14 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pulldown-cmark" version = "0.0.3" @@ -1476,7 +1483,7 @@ name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1488,20 +1495,23 @@ name = "pwasm-utils" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quick-error" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -1509,7 +1519,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1519,7 +1529,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1528,33 +1538,33 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon" -version = "0.9.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" -version = "0.1.37" +version = "0.1.39" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1562,41 +1572,43 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "0.2.5" +version = "0.2.11" 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)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.4.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "relay" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "remove_dir_all" -version = "0.3.0" +version = "0.5.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)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1606,7 +1618,7 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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)", ] @@ -1614,23 +1626,22 @@ dependencies = [ [[package]] name = "rlp" version = "0.2.1" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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.1 (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 = "rlp" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] @@ -1639,7 +1650,7 @@ name = "rocksdb" version = "0.4.5" source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" dependencies = [ - "libc 0.2.36 (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)", "rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)", ] @@ -1649,8 +1660,8 @@ name = "rocksdb-sys" version = "0.3.0" source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] @@ -1661,15 +1672,15 @@ 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.36 (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)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1689,17 +1700,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safe-mix" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1709,7 +1720,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "scoped-tls" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1719,7 +1730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1732,37 +1743,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.9" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1785,7 +1786,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1815,7 +1816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1823,7 +1824,7 @@ name = "snappy" version = "0.1.0" source = "git+https://github.com/paritytech/rust-snappy#40ac9a0d9fd613e7f38df800a11a589b7296da73" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)", ] @@ -1832,8 +1833,8 @@ name = "snappy-sys" version = "0.1.0" source = "git+https://github.com/paritytech/rust-snappy#40ac9a0d9fd613e7f38df800a11a589b7296da73" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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]] @@ -1861,15 +1862,16 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (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-codec 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1879,8 +1881,8 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (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)", "substrate-bft 0.1.0", @@ -1889,17 +1891,18 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-client 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-client-db" version = "0.1.0" dependencies = [ - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", "kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity.git)", @@ -1911,6 +1914,7 @@ dependencies = [ "substrate-client 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-state-machine 0.1.0", ] @@ -1923,23 +1927,23 @@ version = "0.1.0" name = "substrate-executor" version = "0.1.0" dependencies = [ - "assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (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)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1947,10 +1951,9 @@ name = "substrate-extrinsic-pool" version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (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-primitives 0.1.0", "transaction-pool 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1959,8 +1962,8 @@ name = "substrate-keyring" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.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)", ] [[package]] @@ -1972,32 +1975,34 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", ] [[package]] name = "substrate-network" version = "0.1.0" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-io 1.12.0 (git+https://github.com/paritytech/parity.git)", "ethcore-network 1.12.0 (git+https://github.com/paritytech/parity.git)", "ethcore-network-devp2p 1.12.0 (git+https://github.com/paritytech/parity.git)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.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)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (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-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", @@ -2009,26 +2014,26 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "substrate-serializer 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-rpc" version = "0.1.0" dependencies = [ - "assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", @@ -2039,9 +2044,10 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-extrinsic-pool 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-state-machine 0.1.0", "substrate-test-client 0.1.0", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2054,14 +2060,16 @@ dependencies = [ "jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-rpc 0.1.0", + "substrate-runtime-primitives 0.1.0", ] [[package]] name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -2075,7 +2083,7 @@ dependencies = [ name = "substrate-runtime-contract" version = "0.1.0" dependencies = [ - "assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", @@ -2088,10 +2096,11 @@ dependencies = [ name = "substrate-runtime-council" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -2110,9 +2119,10 @@ dependencies = [ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -2129,8 +2139,8 @@ dependencies = [ name = "substrate-runtime-executive" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -2149,12 +2159,12 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2163,8 +2173,9 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (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", @@ -2176,21 +2187,22 @@ dependencies = [ name = "substrate-runtime-sandbox" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (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", "substrate-runtime-std 0.1.0", - "wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-session" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -2206,9 +2218,10 @@ dependencies = [ name = "substrate-runtime-staking" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -2230,7 +2243,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2238,9 +2251,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -2251,9 +2264,9 @@ dependencies = [ name = "substrate-runtime-system" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (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", @@ -2266,8 +2279,9 @@ dependencies = [ name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -2281,18 +2295,18 @@ dependencies = [ name = "substrate-serializer" version = "0.1.0" dependencies = [ - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2305,6 +2319,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-support 0.1.0", "substrate-test-runtime 0.1.0", ] @@ -2314,12 +2329,15 @@ name = "substrate-test-runtime" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (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)", + "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-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] @@ -2331,20 +2349,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "synom" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2354,11 +2364,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "tempdir" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2366,8 +2376,8 @@ name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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)", ] @@ -2376,7 +2386,7 @@ name = "textwrap" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2384,17 +2394,17 @@ name = "thread_local" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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)", ] @@ -2408,32 +2418,73 @@ dependencies = [ [[package]] name = "tiny-keccak" -version = "1.4.0" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "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.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "tokio-core" -version = "0.1.12" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", - "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (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.6 (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.6 (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.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-fs" +version = "0.1.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)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-io" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] [[package]] @@ -2441,26 +2492,39 @@ name = "tokio-proto" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.4 (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.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-reactor" +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)", + "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)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-retry" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2469,7 +2533,33 @@ name = "tokio-service" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.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)", + "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)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (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-threadpool" +version = "0.1.3" +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)", + "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)", ] [[package]] @@ -2477,10 +2567,32 @@ name = "tokio-timer" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-timer" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.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)", + "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)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.6 (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" @@ -2503,24 +2615,30 @@ dependencies = [ [[package]] name = "triehash" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#0ecbb3ec02a5b36c95f09a20d5958a374c32511f" +source = "git+https://github.com/paritytech/parity.git#93054ef24b590a8d854cd6b2d1de6567667d39da" dependencies = [ "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", ] [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (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)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "try-lock" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "twox-hash" version = "1.1.0" @@ -2529,25 +2647,30 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ucd-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "uint" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 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_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2568,17 +2691,17 @@ dependencies = [ [[package]] name = "unicode-normalization" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-width" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2611,7 +2734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "vec_map" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2629,10 +2752,10 @@ name = "wabt" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2641,18 +2764,28 @@ name = "wabt-sys" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cmake 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "want" +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)", + "try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmi" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-wasm 0.27.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2689,11 +2822,11 @@ name = "ws" version = "0.7.5" source = "git+https://github.com/tomusdrw/ws-rs#f12d19c4c19422fc79af28a3181f598bc07ecd1e" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.6 (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)", "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2719,7 +2852,7 @@ name = "xml-rs" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2742,45 +2875,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" "checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e772942dccdf11b368c31e044e4fca9189f80a773d2f0808379de65894cbf57" -"checksum atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8352656fd42c30a0c3c89d26dea01e3b77c0ab2af18230835c15e2e13cd51859" -"checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2" -"checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" +"checksum assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "664470abf00fae0f31c0eb6e1ca12d82961b2a2541ef898bc9dd51a9254d218b" +"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 base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" -"checksum base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "229d032f1a99302697f10b27167ae6d03d49d032e6a8e2550e8d3fc13356d2b4" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum base64 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9263aa6a38da271eec5c91a83ce1e800f093c8535788d403d626d8d5c3f8f007" +"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 byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cce36c92cb605414e9b824f866f5babe0a0368e39ea07393b9b63cf3844c0e6" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" -"checksum cmake 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "5cf678ceebedde428000cb3a34465cf3606d1a48da17014948a916deac39da7c" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"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 crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3bd26878c3d921f89797a4e1a1711919f999a9f6946bb6f5a4ffda126d297b7e" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" +"checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)" = "" "checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" "checksum ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "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 ethcore-network 1.12.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-network-devp2p 1.12.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3ae691a36ce5d25b433e63128ce5579f4a18457b6a9c849832b2c9e0fec92a" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" "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 exit-future 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c30ec160f83d938faf4dd6fdaba4f42316f1bd3df76b902df2d824f47fa9db7" @@ -2790,43 +2925,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7" +"checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" -"checksum globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e96ab92362c06811385ae9a34d2698e8a1160745e0c78fbb434a44c8de3fabc" +"checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" "checksum hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)" = "" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "459d3cf58137bb02ad4adeef5036377ff59f066dbb82517b7192e3a5462a2abc" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" -"checksum hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)" = "549dbb86397490ce69d908425b9beebc85bbaad25157d67479d4995bb56fdf9a" +"checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a254e265e8810deb357a9de757f784787ec415d056ededf410c0aa460afee9e" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" "checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)" = "2134e210e2a024b5684f90e1556d5f71a1ce7f8b12e9ac9924c67fb36f63b336" +"checksum ipnetwork 0.12.8 (registry+https://github.com/rust-lang/crates.io-index)" = "70783119ac90828aaba91eae39db32c6c1b8838deea3637e5238efa0130801ab" "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc" -"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" +"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" "checksum jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum jsonrpc-macros 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum jsonrpc-pubsub 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum jsonrpc-server-utils 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)" = "" "checksum jsonrpc-ws-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git)" = "" -"checksum keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" +"checksum keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)" = "" "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.git)" = "" "checksum kvdb-memorydb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "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.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" +"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.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "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 log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" @@ -2834,68 +2969,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "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" +"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)" = "" -"checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" -"checksum mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7da01a5e23070d92d99b1ecd1cd0af36447c6fd44b0fe283c2db199fa136724f" +"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 miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" +"checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" -"checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe" -"checksum num-traits 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9936036cc70fe4a8b2d338ab665900323290efb03983c86cbe235ae800ad8017" +"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" "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 owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" -"checksum parity-wasm 0.27.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1ba1ceaec13865445bcf05117867e4c6456d91c3617cdff2f3ef77b92b18cd12" +"checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" "checksum parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41083957b80abb8a01fac4d2773d5f92653aed8f0b740c8d3da1da62c7857abe" "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" -"checksum parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3e7f7c9857874e54afeb950eebeae662b1e51a2493666d2ea4c0a5d91dcf0412" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum path 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum patricia-trie 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum plain_hasher 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" "checksum pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28ea5118e2f41bfbc974b28d88c07621befd1fa5d6ec23549be96302a1a59dd2" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" "checksum pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8361e81576d2e02643b04950e487ec172b687180da65c731c03cf336784e6c07" "checksum pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3a822d2a1624b10c46572c231c149575bcc261c37d84fd3f1a2f5ae1f65515" -"checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed02d09394c94ffbdfdc755ad62a132e94c3224a8354e78a1200ced34df12edf" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" -"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" +"checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" +"checksum redox_syscall 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "6b8493950b18ff11387fef7fd9a9979f4dd77a36e182f754385838c70404b73e" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" -"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" +"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" +"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" -"checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" +"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "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.git)" = "" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"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 rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" -"checksum rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e" +"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 (git+https://github.com/rphmeier/rustc-hex.git)" = "" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" -"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" +"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.63 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4a07014dd9a6845448a9e62f6f27595847f09828caabf1b1d50bb6755fa4d2" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c9db7266c7d63a4c4b7fe8719656ccdd51acf1bed6124b174f933b009fb10bcb" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum serde_json 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)" = "93aee34bb692dde91e602871bc792dd319e489c7308cdbbe5f27cf27c64280f5" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "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" @@ -2904,50 +3038,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" "checksum smallvec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ee4f357e8cd37bf8822e1b964e96fd39e2cb5a0424f8aaa284ccaccc2162411c" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)" = "" "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 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.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" -"checksum tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f73eebdb68c14bcb24aef74ea96079830e7fa7b31a6106e42ea7ee887c1e134e" +"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" -"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" +"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum timer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31d42176308937165701f50638db1c31586f183f1aab416268216577aec7306b" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" -"checksum tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "514aae203178929dbf03318ad7c683126672d4d96eccb77b29603d33c9e25743" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" +"checksum tokio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d00555353b013e170ed8bc4e13f648a317d1fd12157dbcae13f7013f6cf29f5" +"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" +"checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113" +"checksum tokio-fs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "76766830bbf9a2d5bfb50c95350d56a2e79e2c80f675967fff448bc615899708" +"checksum tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6af9eb326f64b2d6b68438e1953341e00ab3cf54de7e35d92bfc73af8555313a" "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" +"checksum tokio-reactor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3cedc8e5af5131dc3423ffa4f877cce78ad25259a9a62de0613735a13ebc64b" "checksum tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f05746ae87dca83a2016b4f5dba5b237b897dd12fd324f60afe282112f16969a" "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5783254b10c7c84a56f62c74766ef7e5b83d1f13053218c7cab8d3f2c826fa0e" "checksum tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc" +"checksum tokio-timer 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535fed0ccee189f3d48447587697ba3fd234b3dbbb091f0ec4613ddfec0a7c4c" +"checksum tokio-udp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "137bda266504893ac4774e0ec4c2108f7ccdbcb7ac8dced6305fe9e4e0b5041a" "checksum trace-time 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5aea07da6582e957c6e737eeb63a5af79e648eeeaaaba8fd9a417f1124bafa41" "checksum transaction-pool 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd61073aadeb282056e97180e5d0dd9774413f954bd221c07692578dab466b26" "checksum triehash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" +"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 ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" -"checksum uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6477b2716357758c176c36719023e1f9726974d762150e4fc0a9c8c75488c343" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" "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" -"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" -"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" +"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 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 vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" +"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "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.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "e902997144209c90311321b90dd658d964dd8e58b23a5919e66a1d068a0050e5" "checksum wabt-sys 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fc67b1d96cd7839be6996edf94be66351d83f614e9cc7c6edc33accd9f5e6529" -"checksum wasmi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba06def0c95a653122299e68a44f2f227eeac2d1f707df61f33abbaf6dd55992" +"checksum want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a05d9d966753fa4b5c8db73fcab5eed4549cfe0e1e4e66911e5564a0085c35d1" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 5d7fbfe0856cc..e80caa1e95d0e 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -49,17 +49,18 @@ pub mod error; use std::sync::Arc; use client::genesis; -use codec::Slicable; +use demo_primitives::Hash; use demo_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; +use demo_runtime::{Block, Header, UncheckedExtrinsic}; use futures::{Future, Sink, Stream}; struct DummyPool; -impl extrinsic_pool::api::ExtrinsicPool for DummyPool { +impl extrinsic_pool::api::ExtrinsicPool for DummyPool { type Error = extrinsic_pool::txpool::Error; - fn submit(&self, _: Vec) - -> Result, Self::Error> + fn submit(&self, _: Vec) + -> Result, Self::Error> { Err("unimplemented".into()) } @@ -102,8 +103,8 @@ pub fn run(args: I) -> error::Result<()> where struct GenesisBuilder; - impl client::GenesisBuilder for GenesisBuilder { - fn build(self) -> (primitives::Header, Vec<(Vec, Vec)>) { + impl client::GenesisBuilder for GenesisBuilder { + fn build(self) -> (Header, Vec<(Vec, Vec)>) { let god_key = hex!["3d866ec8a9190c8343c2fc593d21d8a6d0c5c4763aaab2349de3a6111d64d124"]; let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { @@ -113,7 +114,7 @@ pub fn run(args: I) -> error::Result<()> where system: None, // block_time: 5, // 5 second block time. session: Some(SessionConfig { - validators: vec![god_key.clone()], + validators: vec![god_key.clone().into()], session_length: 720, // that's 1 hour per session. }), staking: Some(StakingConfig { @@ -121,7 +122,7 @@ pub fn run(args: I) -> error::Result<()> where intentions: vec![], transaction_base_fee: 100, transaction_byte_fee: 1, - balances: vec![(god_key.clone(), 1u64 << 63)].into_iter().collect(), + balances: vec![(god_key.clone().into(), 1u64 << 63)].into_iter().collect(), validator_count: 12, sessions_per_era: 24, // 24 hours per era. bonding_duration: 90, // 90 days per bond. @@ -149,8 +150,8 @@ pub fn run(args: I) -> error::Result<()> where }; let storage = genesis_config.build_externalities(); - let block = genesis::construct_genesis_block(&storage); - (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } @@ -160,7 +161,7 @@ pub fn run(args: I) -> error::Result<()> where let _rpc_servers = { let handler = || { let chain = rpc::apis::chain::Chain::new(client.clone(), core.remote()); - rpc::rpc_handler(client.clone(), chain, Arc::new(DummyPool), DummySystem) + rpc::rpc_handler::(client.clone(), chain, Arc::new(DummyPool), DummySystem) }; let http_address = "127.0.0.1:9933".parse().unwrap(); let ws_address = "127.0.0.1:9944".parse().unwrap(); diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 85bc248e2ae3d..009e5f2de0676 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -42,7 +42,7 @@ mod tests { use super::Executor; use substrate_executor::WasmExecutor; use codec::{Slicable, Joiner}; - use keyring::Keyring::{self, Alice, Bob}; + use keyring::Keyring; use runtime_support::{Hashable, StorageValue, StorageMap}; use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; @@ -63,13 +63,21 @@ mod tests { ) } + fn alice() -> Hash { + Keyring::Alice.to_raw_public().into() + } + + fn bob() -> Hash { + Keyring::Bob.to_raw_public().into() + } + fn xt() -> UncheckedExtrinsic { let extrinsic = Extrinsic { - signed: Alice.into(), + signed: alice(), index: 0, - function: Call::Staking(staking::Call::transfer::(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer::(bob(), 69)), }; - let signature = Keyring::from_raw_public(extrinsic.signed).unwrap() + let signature = Keyring::from_raw_public(extrinsic.signed.0).unwrap() .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } @@ -82,7 +90,7 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -97,7 +105,7 @@ mod tests { #[test] fn panic_execution_with_native_equivalent_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -112,7 +120,7 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -124,15 +132,15 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -144,26 +152,26 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } fn new_test_ext() -> TestExternalities { use keyring::Keyring::*; - let three = [3u8; 32]; + let three = [3u8; 32].into(); GenesisConfig { consensus: Some(Default::default()), system: Some(Default::default()), session: Some(SessionConfig { session_length: 2, - validators: vec![One.into(), Two.into(), three], + validators: vec![One.to_raw_public().into(), Two.to_raw_public().into(), three], }), staking: Some(StakingConfig { sessions_per_era: 2, current_era: 0, - balances: vec![(Alice.into(), 111)], - intentions: vec![Alice.into(), Bob.into(), Charlie.into()], + balances: vec![(alice(), 111)], + intentions: vec![alice(), bob(), Charlie.to_raw_public().into()], validator_count: 3, bonding_duration: 0, transaction_base_fee: 1, @@ -178,7 +186,7 @@ mod tests { use triehash::ordered_trie_root; let extrinsics = extrinsics.into_iter().map(|extrinsic| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed)).unwrap()) + let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed.0)).unwrap()) .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } @@ -204,9 +212,9 @@ mod tests { [69u8; 32].into(), hex!("76b0393b4958d3cb98bb51d9f4edb316af48485142b8721e94c3b52c75ec3243").into(), vec![Extrinsic { - signed: Alice.into(), + signed: alice(), index: 0, - function: Call::Staking(staking::Call::transfer(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer(bob(), 69)), }] ) } @@ -218,14 +226,14 @@ mod tests { hex!("8ae9828a5988459d35fb428086170dead660176ee0766e89bc1a4b48153d4e88").into(), vec![ Extrinsic { - signed: Bob.into(), + signed: bob(), index: 0, - function: Call::Staking(staking::Call::transfer(Alice.into(), 5)), + function: Call::Staking(staking::Call::transfer(alice(), 5)), }, Extrinsic { - signed: Alice.into(), + signed: alice(), index: 1, - function: Call::Staking(staking::Call::transfer(Bob.into(), 15)), + function: Call::Staking(staking::Call::transfer(bob(), 15)), } ] ) @@ -238,15 +246,15 @@ mod tests { Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 41); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 41); + assert_eq!(Staking::balance(&bob()), 69); }); Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 30); - assert_eq!(Staking::balance(&Bob), 78); + assert_eq!(Staking::balance(&alice()), 30); + assert_eq!(Staking::balance(&bob()), 78); }); } @@ -257,22 +265,22 @@ mod tests { WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 41); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 41); + assert_eq!(Staking::balance(&bob()), 69); }); WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 30); - assert_eq!(Staking::balance(&Bob), 78); + assert_eq!(Staking::balance(&alice()), 30); + assert_eq!(Staking::balance(&bob()), 78); }); } #[test] fn panic_execution_gives_error() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![69u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![70u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -288,7 +296,7 @@ mod tests { #[test] fn successful_execution_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&>::key_for(alice())).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(>::key()).to_vec() => vec![0u8; 8], twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] @@ -301,8 +309,8 @@ mod tests { assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(Staking::balance(&Alice), 42); - assert_eq!(Staking::balance(&Bob), 69); + assert_eq!(Staking::balance(&alice()), 42); + assert_eq!(Staking::balance(&bob()), 69); }); } } diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 86945c733f528..d9b4f66e58e4b 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -33,7 +33,7 @@ pub type BlockNumber = u64; /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = primitives::AuthorityId; +pub type AccountId = ::primitives::H256; /// Balance of an account. pub type Balance = u64; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 86de60abce687..83503885a6737 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -22,11 +22,18 @@ extern crate substrate_runtime_io as runtime_io; #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(feature = "std")] +extern crate serde; + extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; @@ -39,10 +46,9 @@ extern crate substrate_runtime_timestamp as timestamp; extern crate demo_primitives; use rstd::prelude::*; -use runtime_io::BlakeTwo256; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; -use runtime_primitives::traits::{Identity, HasPublicAux}; +use runtime_primitives::traits::{Convert, HasPublicAux, BlakeTwo256}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; @@ -61,7 +67,7 @@ impl system::Trait for Concrete { type Hashing = BlakeTwo256; type Digest = generic::Digest>; type AccountId = AccountId; - type Header = generic::Header>; + type Header = generic::Header>; } /// System module for this concrete runtime. @@ -84,8 +90,16 @@ impl timestamp::Trait for Concrete { /// Timestamp module for this concrete runtime. pub type Timestamp = timestamp::Module; +/// Session key conversion. +pub struct SessionKeyConversion; +impl Convert for SessionKeyConversion { + fn convert(a: AccountId) -> SessionKey { + a.0 + } +} + impl session::Trait for Concrete { - type ConvertAccountIdToSessionKey = Identity; + type ConvertAccountIdToSessionKey = SessionKeyConversion; } /// Session module for this concrete runtime. @@ -114,6 +128,8 @@ pub type Council = council::Module; pub type CouncilVoting = council::voting::Module; impl_outer_dispatch! { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { Consensus = 0, Session = 1, @@ -124,6 +140,8 @@ impl_outer_dispatch! { CouncilVoting = 7, } + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum PrivCall { Consensus = 0, Session = 1, @@ -135,9 +153,9 @@ impl_outer_dispatch! { } /// Block header type as expected by this runtime. -pub type Header = generic::Header>; +pub type Header = generic::Header>; /// Block type as expected by this runtime. -pub type Block = generic::Block, AccountId, Index, Call, Signature>; +pub type Block = generic::Block; /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Extrinsic type as expected by this runtime. diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index f8c0de993c7d2..e5f973ab5307d 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -11,19 +11,9 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -37,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" 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)", +] [[package]] name = "crunchy" @@ -73,8 +85,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "demo-primitives" version = "0.1.0" dependencies = [ - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -110,20 +122,15 @@ version = "0.1.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -134,15 +141,37 @@ name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" +name = "ethbloom" +version = "0.5.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)", + "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.64 (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 = "ethereum-types" +version = "0.3.2" +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)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -154,12 +183,23 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +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)", + "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 = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -183,16 +223,16 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -205,12 +245,12 @@ source = "git+https://github.com/paritytech/integer-sqrt-rs.git#886e9cb983c46498 [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -220,12 +260,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -241,9 +281,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -264,7 +309,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -280,9 +325,9 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (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.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -290,37 +335,29 @@ name = "parity-wasm" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 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)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.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)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -334,12 +371,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -351,15 +396,18 @@ name = "pwasm-utils" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -367,7 +415,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -377,7 +425,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -386,19 +434,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -408,20 +456,19 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] @@ -437,17 +484,17 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safe-mix" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,7 +504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -470,31 +517,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -511,8 +549,8 @@ name = "substrate-keyring" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.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)", ] [[package]] @@ -520,25 +558,26 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -563,10 +602,11 @@ dependencies = [ name = "substrate-runtime-council" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -585,9 +625,10 @@ dependencies = [ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -604,8 +645,8 @@ dependencies = [ name = "substrate-runtime-executive" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -620,12 +661,12 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -634,8 +675,8 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -647,21 +688,22 @@ dependencies = [ name = "substrate-runtime-sandbox" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (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", "substrate-runtime-std 0.1.0", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-session" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -677,9 +719,10 @@ dependencies = [ name = "substrate-runtime-staking" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -700,7 +743,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -708,9 +751,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -721,9 +764,9 @@ dependencies = [ name = "substrate-runtime-system" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (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", @@ -736,8 +779,9 @@ dependencies = [ name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -751,43 +795,39 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (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)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -803,14 +843,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.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)", + "heapsize 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_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -820,10 +871,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -850,32 +901,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"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 byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "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 memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" @@ -883,39 +938,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" "checksum parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41083957b80abb8a01fac4d2773d5f92653aed8f0b740c8d3da1da62c7857abe" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" "checksum pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3a822d2a1624b10c46572c231c149575bcc261c37d84fd3f1a2f5ae1f65515" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 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 1b85c4a9d6c8e3e153721fdca33902797413c800..fbbd57cbdeca27609f7317bff71af0541bfd4101 100644 GIT binary patch literal 402944 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 literal 414072 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
  • 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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 00fdb710714228ec99c9621db068a6c771bee092..595bb32153d9deb56729f0da6e8e24526e5ed603 100755 GIT binary patch literal 436992 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 literal 444089 zcmeFa37}n7eeb{bKJz{2kKGSxM7eGP+Ll_ z5|LU59MCw&5hpBKwOFmjp)IXL(Nc{qwrSN@Uey*~U;pLx+4?@;-&%V(=kA-_ga8l! zm&?iCd;Rua>$iT>`mMEoYpvk2>#q)jAP8R_9&u^3ZCh|@ZJYiJw_O_QpNhNJB_JiZ zGzc!O>ILq?oArggbTiL&CFeP03CikbeQfV@7j3(lG<|xr%gdDmq`K{9Wncw_H%EU^ zU0B(4&5eg{dcoF9p1W!5CD(7gcFSeY-E_&7*KEBu2n8Aw=<3U^y6W0z2ayt*N_fte zO`C$69y@y6`uuBOaLK8stq!V68duWwd2T^Nsq>Zk?5j3iwk0hk2$b#$*mU)?uYO)o zQNrQ&`DNE!{wy-Rdeha{Zh7G)*KB%z&=PQQ32-ZUUViQKuW<-1)Ek?wx#8+fTQ1wW z>GDgqZn<*PC0nk&cB?~Up1{xBLIp3mVe4~NI~=-sA|D3xhVXjc3mslBv_==88=(a0nh@8GD*sdCm1(FS};zl~gb2DjUoH`V4yGwVOA&{Ewdg*|RrYGEA>B zaw7^ZgEF9Mdr0Mh@UO$5Qmxm6N)SY~AgBgGJ!sZyEpGX5tXi*D10I5)rUd@wzo=TR zRP|_2LABk{+pVBgt#zxl3i(v()fUgKiv8cJjqBTL&}g*z3xZyCTxE@qlUX&GzkqCO zwH`UtsudLxQCtsHYPEWge}D=_vIv4kt1c8e)kgKuPNPu|Y744|1`DbS7TE7FV6DR& zwTAwy*23q7OP16sVKBemLa~yaU)>e78(#^>>rN!2KsTbrk-B*{QgTcqm5z(%Z@J<6 zt(QD&({r!9=8_w(dH$8xTpm2vUPH*QsC#v~vTABH*}m+Ctyf&T<;tyBZn{2rAnaXv z4Y!wFb>;P&E_oJew>kLRaQw38J@2X)UIIIj-0QD=cJOy0VzTMkH*8Jc*%Qut&Xv~` zzxs!8{6?NHzYLweJK7q{9 zPQret9gp$7E3gCE($czd*Gl6WhZhvein|wdqnPX}F&Rwu+i`f8D06Gv+}@{tu_01D zPo#r}Ved^Uj>8y631lL-{&v9>v`CC7rT zlUM(CC9b9Di!im#Qdvn4fXP7(WF3+7f64b)Q{-e%IGHS*96%BktlP@cO0cRzbq&^= z95g(P+vX6gIXP%~7`J073`wj^MXM@%gg}+lL0kDXYcVi02+!lOiQJS|oG~u1wahs>E@$js(j= zgs;W*q^TcNuVzGr=agQLtDBt$B4{y55(D0CT!iFVol$(pzY4tKw{O;v!xRKzOP(6h?Rh*%|py4ngR{&;q9D+1>*@yElsotMH2tfF{Q9eY}_812|IFBW45 z<1Vi$${~YVTzICiUdlSbL2SNfoo5w%oPtD3G)nJ*;V^4{ibkRYxYZj8tSAf;*3L{zmNiw~S$yBxi$DZTV;qMeGm zqgQ=DpwbR~;>nSx7B@9Wo5=O;)7xdamHnPnH0q@aP@+%7X{J4i~JCaDUb=Ok^ zT2~`86%CqZXFJx`H{#BngPNMuMqHCIt$EAZ=+;tW??nwBr((M_@X{zN1L~=D8A_)H zF1d$x%h4wb9zRNi$1YRi@6h486CjL2-Oh!(WxdA@jY*L;$PlYHzNE7-{y>*<&&! zcbq=wiPWZfA_fhF6}&Z11PPF}T}4J%MGPvH^4*~F;Y?|6K$ z3X(<4@WRPVj-4==3ksk&46r7_zCavCjG1aFqcH+OwLsXLlc8@YUZUeHPX?g~wO~$r zvQ%=Bv2;q7rIN!upPJV|)QO!{)9t0!>KVm%BDA;*@^_nDtm(pIS`~E=AO71 zpt~#|;K>>agWb;)Xc=r+%goiRN_^z@Niq=A>a5(xn%u_PklR>IJXmqWoT;VZ#w= zC}ZRZpF=LbYz1%1|7pt0j$JNd9Ym45oUWBZf2*`PdshiCy zrc%I)UX~10(;OJt7e1CRlefBnFb#5t1>!b$hXHw8A`rKxV;BIl1-o0TDtML7!!k=S zvopM>Vc%C$k4n#G*1R*UXRs26{Dzuqr^VJ=^PI9ivG1+XQj-benf=2Yn`oG0 z{q`*hFh7+w%&;WEH*o+^LD{2*B;h17c9L+oE22zekMJPavoKXleFgiD^dN2*rJ!76 z7sf~U#6|Iu{;m-pp1zpuSYVmRvw!K>dvcP%{6T$y! z^^cNu``xkr(Yn5Ttba@#Ee~EX)*sXJtH%0h^YY-;WBqYGzjmy@K-bre^^aBh9b%a3Vg@-<^=zPHa+!$qr|mtMTHr z_n0Wj)ILgHHJ0^=Eg9{XA0qQ~>@b8ns1EP%{X^pD)Zo8b{X_YBw=*w!6_qe#fRr#aXs3j@*tRHP zVzQtXN?0+O>5eO9^<=!Th~*B9*lv^Fe`xio_OjsbTYadqEZEcPqn69VzisuY_p;#I zEj)6r548GJcp}=}>YwZ?9xq8^{ckM+Z9C+M&wiv;`X!@l-rXP@p7MdT70U%ds4hCeKEOb$e!%Q zn%uJ>ev+)o3D85>1c;4lnI%~s_v1m*+q$K{D(=LG z#D}iy-MXFGn(c`3>G2r`k&`yf+VnGO0z!3U5T%0Lo>By%Y--^I;`WRp2=!d;LEN6{ zLCfM)4wlC$+fR*4xZHOG>gETW5)b%%U_Qbb@#(rhOa8-|@oL?#(Y=#^!P&ZZ5;Ay- z?wyPbo~nD;;B3!1ap4&OTpQcF4vwrQvE}2Q!G2wAWw>W5`n1@}chAt|+@k-2Nm=jx zPHV#ClbXN6)%=w`CZO?3-?E$aGd@1yO#ena=@X>R`Xn0+THzD2VXV`9 zLOw`k81z)(B)ow3-KlEl%+g-dklRh4X~gNa(S>omIw@^)fRA=T_w;COT%T79jy(K`LtR(Q4a=G* zSHqLzht+JPPL`=+EpB9f7K11>Us6n*!PJi%EYOI{vUtIIT<`^c#AU48Plqw6bl#WT zpDv$aUe?v~{ypABtl!2#ZT~xa&bp|pXVuZvqPOvd-b3C3IvbyM08z2L(*y{^o^}Aa z%_eYi8}E8~(pe2RyCG4??eCBpr^o80;WO^V#-n&u*?5|7v+*EnHr_lzY&@Q$*?4O^ zvGKH(X5+!!Y`nFZ*m&AZv+?Fx;xU50*?7ocHeN2UWR~h27PpE%qx8^*D(;>qaD3Ph z5QV*a9)k}@nk{CCyWi^6OXYW{*FU|_pUN+)DEVbR4z+UHC z^&;dRl56!(oDisYqC1;OlJ{h)n>nl4&up+oAef(u2)9FiEYwP!JBdWf-dqk`FH&;g z#*uXArdo&Wx$@tq98@F+6lZc^e50+$2eP)Fo`A^#Jp*g&jo-BO<~z}IfWOw(i|^_= zn7kkdk{`A8)(xcRAc=Q!5Z8tn?WCXr(bOD+@X`oZjNut`#m19L|EP`v4)&q@(;08w zL<|>BlNir9Zd+3&VtiGMKb@@Wo#wu?h85FBlH8ap`Iea#nt`DKw0uI@j{z^D)0vO| zYTOL5!99E+g2sJ4kcTSNM4=2tx8NW-gTR+P(Uks zuPpNyd5a(c=h;Q6?+_(BNjD5-%nEc@x>ZQ&1wJVqn-?X{_+@;ZO7q!Glv5!erCUBq zFXW?i%SY)&FJpP|aBEHYMQ~PC?w-d)u)p8U@X%Bf;jgR<`|ZxWeJj8W;*W08SMf%* z?To5yE4rmVjAk&ofSrx(Almymx`1aJG zxh}k=-&RdKM07cxm532W-O<))oC$`KjkHGMG#P427#_x@iY%N>_LaOHA0^*`I?A<` zbey;@IE#)G*Q3v(bmeOI#684)?ie* zHqT->hO6TxV?Nwh*I;0EO?o$;#pq1jN}>%KBypzKX=C!bvB~9OAbY(uq+1RhmWH>E znSl*oX?EU>iK&2$My}MBZW^O>j6moo@MV-HCaJX2(Xe8A(a03jjqctk71NzilMg~& zOgGBweS|tqA2lXnHXatH21m6^_127x)e8>hs%^i?S=x&M zvls(~L|?m!0Hlbo551m~N$dBa^02@xJ4SGcv_=#}8*@is_CY z&dB(5(Yjz*LT6awlMzP-5>HN=H})AYNv5WL+_+9@M_~e{G|2*BA@Q8){gF6#mCo{m zuA%B&Ju=^pAOIVEwouh+u|nhIZj`i$1DOjvyird-b>r~xGB-|N;nv}L+W-N#CG$DC zU*~29K4k^3a`^h_K1TR;UHFIjqB~sahiEQinz^pXdYfZ-${}I87wEj&Y-w{ zlS?lepkjK_U=`Dg2CkSsQ80+bbh9*K7N(|{ZiY$exxtogH`Z;Mh#p_N2M1H zT$(;=;EL%*16NEh8aSU`G`^DLg0ZW3V>f=6V!W$&ZO6~3W5p(>o1A^j9v9}KYzAb3 zjad%7$*~Ek`B|ruL3SAr*%@y<9*0h)x^nw8Io7Gf{~H=ypz~;*N=%V;Dy>@@ZN=b%OI00i{OT3qh z0jm&~&~|a>nf+pHT>(D3dx8!1D;2JT`8T0y=su0pC`4(v01a0v9nP$qSyKh+Us^X) z&95pkXC*ZfKG)Zj^*p#%l7W}I)-7a)rFm;yNq!PuXZEs+*b&)!EWfxjkObmG(SJ8QW5Yxffb>^$30V5XEfeP=J;oQrp>{!~2OMTMVn{))$ zMRYvk(YVxbV(@HK_K_M+e6*PiXW3|6armk}v*Anwzhqh5vIsMrXpuLU1-q!&uXJ8u zh;POWe8E@0Qi?9=C_9VU8JdvO6S;7E4=U0kRP*$i~@oimiQQ% zUT4dR%T_CgPhdC;_tN={)SfqTypJXi8@A{ip5`_^ry&ZYp-x$hOD?%!#U!h*y{X5n zV_b%!oh-)121I?dlf}DOjEk$MT#B@-QqqgjKn^;GS;!|Pq)&8RXq(esOtzXM*Nj#+ zOEKRC9a}FZ*Dl|Sk$UdarLbPiqoo-%!{$;P4<@@^ccFZ?B5&#?HmOLrhD^~Sgu1nP za9G;#wtNh&i5Uz%192V}j(U6;dGSNcvgw6Is6aZmKw&0hhe=Ww$4lbl%{4(c$V@(H zTXWZ=8bYV2bC^mJ^Gb#*98ZCp$beV~JbA9&^TN^yKSl=&=IyP^TYpJ=( zF6MsFbZ&C0w3!ulv8GO2sbOx+ebaNYdHT#B3HSBg1@V|)Bf3EHke79U1Kl>+bO{C3bNzk;MX#R35!pi2Jf`*izSb_ratV{AFC2NTUK) z=N)%$hk_7S5DDh#%uU> zXTf7G&`54=KZ{eEC<|S*W;|^$k{t|h;WDV3UJ|}YlWP(;J$zAOS`xk}5xsLHP7zv3 zJWIkCPxRS8vhYQQ=}tsoE&S2P2j#MD2@{i<0$?Kv2V#UU)dQD6!<%x!CD6Od;z;ci zS;AE5q%b=)D^B>Lmq{0$lF1{Z>iY^q^pd#9*))^HCAzoJgxuwmx8q!cX<>+|sepe& z!iW(_O$E1uBG%3xJSje&L>GwGH%hobw1JVy1)@cHFrp7AQ*a_h)zg47J!7y=@Bw9J zMU*G8iILJY^JR`2#LaAtB|zN5D7o`whKTEe3)RGV0xy!%>mQsi-|3VUP_J`Z!19ve zUT4gH0e%1ph&3FG6sp{cPl}&x9@_K(Lo>#xzt|w+b33Hdh_p0DAa3*cO^h+>pK1-a zsk&Q+sDEmwxlKa|kI&R~ah$U8IExyzI1!Q6aqSehe8j>Emzi|Bu)^ggx{jMGjM8aX zp>f%`=eca5f}YETFhZo{#F4PViIK3vr6Xa5C#6!L?g15j@<>?WsUu;9r_Cm;FiQTh zl}1Dzml?ywacYH+&jPhih)?ojy(E6Jzgv`r)YgZhGK0UH7FtM)_BTFg_WP|q{8|?L zpw&m!mIps<_0g+k!N0WnDABUup;jNJEf0Rwa>29z+Uidz{eQJw@a(^}`qo1Id#i83 zvjit2HOqp(ZuL)%Pmu;-Z?XvlwFFAYW*RgNuLPzuUAvqHC}t5L(?S^2xJagB-6sQ| z2lKGmusD-C7Q#q#cd7}wMP|v`V=hyn&a9@=SET6~Zj3h?bN%}niZ0z|S)>6OrY;?A zPc2r8j&EgrdWN@q-+D31Cr3ZI4T@O0i#Nq5lx563njQGM(u+OBAm1h%EFrXdp@2*y zdn#D6Rg2_8t@Jicg6U+TQc5mNBNsEVI+00X!b5Lk$1IaVjg)Md^LC*^+o_NRrHI#g zP>R`1A7YD)?e47!x2ryT#(iIK2d@_jRk{_b^g^jhw^Eg!7pv@dAO?Fh54tPO^Pb^6 zm2P<|y^yEUEl;Hn=Xno#?i%mlZFlcn-yNrm;Pzu-6PuLvjxeB}&fSZ{1$q^e3-t2I zAnyCI>J<6*?_g!A9ge(JcUdAaMRZnpt|BqT&_e9Pj{J3u_NPRV7bRZQ+qtC*(Y(Mai0kn$oP2f#HmHmcge%d(bY`RGtf zG5D_1iokbwioc&mt?HwV$ML>QHQBCoHQ3YesI=2Hlh@IF2Z(G05+{47hJLUEI%G4wKS3X~Z#@)@Hal&5{=8kw?U8(i+3? zQxg>%*ECPbjMu&;l5t5UGW+v8HN_qk47UyA>=-glXZ`?upm>M zz1!sMDas2WqtAL8ce}|72Pd`60O+x5;hO-3S^}UOXDg}z6e?-*I#}tyDAW-ERb1@> zg(?D|hPD=qtO_**Kn2h7Ulc0%07D7p9y>od?U%@ZRoEyqN@_Z`;~qbt+WC=(wcN_{ zEfnp?C=w4Tlr0E_uk(;X;XB+o#?yc}A2}nIAk^es4=Lm(2)V8IkUTe`yoY_)Y!HO| zUEJ?jU}N~Uq#=+bCXphr!wx&sM9CC2psmz$PB(<51RB+JEWo{iZ5U*D=?!d1J|v+8 z+VgxMLJ64KeE2~L*yME3Axa)1ev5=ti=w1)hAH|ARtfr656uHVHC5o3t#h;l@Y7mG z8=J#u=IrIkjX~|>$3HYT;E7RcYY&l_+e26?uB%Exd)Dda~ceC)wMB;%3 zYr+o+%iDOJ64FJ8E`bt~tVq2`PjXP=;d%jid#4-Kt_*gx%@?;C)k=$)zZhTznwJd$UOV{iPG2u3^EwzW#sZ6AG zHgf>QU3x)h^*)48B_u`7-nTZ!3Cd79L~`#Jv_|<*S(jdva?+`@OV4FI@18p$DvHpQ zdZAuQ zw|XhPP_L|)?u0L;zgVrnLQS#B4t;3eXgA$SUskU@PWw_J97?xxoh+v5%KtX0-FTE%xd66xfLoWh!ITbdF2wn z3>gC3*hEnP_tG3bi2}s>)wx8`BGDY$h#G)`2m+vj1OG*#f&hGzudE971K?YH0SeUv zK<(7v3s9&X0IQsm3zc&Q&-{S>Y7S4O1W8_@Xf=A2EkD4?WX3^3tZ=0l3RlBMHRK>j zvI=<#LSFI^1S!-*5X(#Hd0rC1vZfG&$L=x==Oyn$l(BcURM9K}Lw8h$rrwyCjK_x( zFagI7C7}E9Py&k58%i+roHS+WJILFS!0;~$ks8AHG3RSlz{v05KGFIuuuV4sa0y_W zH`ICqYzJ8pN&wrup;iLe<_)zHz&3BFm0(zzbYwZ*PcqHnij-8sOzXxKEPzQ;J9t0$ z$=$AibaM%pKmmp3J1xM8Kw5$_RC9Q@a=G2*k~i^6AeX#}SAwDGm|x6At>W#S*tQaH zrL5kOYO*+*%ShfQRC-aS%vyLEDM}&f)&%JNg7ztYNbh87B3E#w!y}ho&~K%~%v1(* zvMvu_*~wQ)z7G?+L-SbK!X_s*sj%d$Bpu&UI#@acb3#(6R~EbKBw^@%tC!LX_0s!R zFQpgim30i2UZ|JStzJrBozX$u-9cUaVo8gQA6_l#1T3XPVIdRw6zIQ`{HHTV$5tX}0#@+#mg2=!DqQIJAC z1%YbnCJIuZ%{?x+bwH+ua}$Kz)J+tmkeeXnrf#Ajd2Zs`7n^IsACI}(?3Bg!_fy>8 zGe%^rj&NwW_E0*D@aL_a63~*oEmH#OG~5PZH}=s6tr%^CFcHgA3JOcvJX}Si`F+|< zP_2M#AmZhjNI6HP(1~;oO*Zf9JRI=LTN}LretAox1PofN*SyT|e#&pq6$18t5Bn4q7w$!Dheu9frY1rc(sqE9ah5LIWxPkfPM z)q9My-s8!x_c$Ko#bey0BCaztIGI}~NLi__`(sYIlc*sG$|I-TiPjJVg_kiDq@eK1 z4TU#v8c0Fm1wrA>od!}+ctKG3fzNH&u&ser%J#W<>pig7^6YT9Z_Hp^7R*mPEn4A*8ui(6s0DieS)f?cKn^Pr#UuI5)lMMJn1fl4jR_1PQlMnG8wsK`!kK{HI zC_J;WmH>MBkeuG2M!7Y8kRwj`Bp+i_0-xm8R0({tF6D{I3vSDYJT|uO-`}f`^`J%_ z?seJb7FP*mn^|0YgKUS!-sBnF%i2p;C?ORzp$b@@VWX}$ROn>d77Xfj-l3;8fo@;T zZOe_izJ^|R0c$9UiTWetxsoTlv&4c;*pnp|6#Bs| zv0ytN$`T89^WiLUMb;@vrU)T-rRNPoa*Or^%$W5eJvnA==hmVn;SRS;99iz*_IP*u zdTtjx67JykIG6fHZclKxZ{qeu_rhDaop7md<#wsNeH*tYxfgbF`(&4TJGZHVXX<^M z5|^T9j*#E7cbqm#`i*;E%Mx9sE%DE?L`NP={9Kmk2x*C*%n}{RE%75+qGOIFzCTNJ zY_!C8C=m-)cgTFl-uZAn-x25UmBMhQr|)-pwDmBsq^24>6Orn2@~~x~#DZ8nlqD7f z=s_hirs-+3({ht-D2UFEEU}Q=?O9?Wx7(D+XlBh(dY8T9j7EmrJy~KQx4W~%JU8WZ zFFC!hW}E3N%3b4}ZjG)sMc`0@T?CW6P*apC;E#mLW^Bx~P*e6+PgfPOm@8YTOtRuk zBehmUno7}V-*68!lAy+w+c3i&(29JK7Pplm2seabXZwoVEJ{`x;=1628i?Ck@hjS2 zEfi5%+~&cye1$1v5x0T3&DVJWq6KEXw}H6LHp39jWUZTV=#GRkLs)TV4w-GKx*g2T zB-Y{uU^2iq5uh6%t$Pbub^9i}kkzK`4eLTyor^_ztzrl%sErjvNU6pA;*RK6cPk@x z(WtOD$#U5sFG+%-+RqEve@IW!QN#3c{otK_2j5Kp-bKgd%q?0b01wPH6< zx%%A4Q>JG|TxfW26nll7%9I!DKD4uEs-xhETC5%p1f;@hbOEdw20)pr156A9jD+?D z*4;;PWxDCUz%mvAFhx$Ksp}8`?rEi`DQgO#W-eM1sc~YJVJt)?pc$q@&4{y$AAH=O0 z-pRgb-+EN7VJ86U=tF-}=dN(`AY8&ixG7=HO#RM~E2j^|I=YY}5V`177B)W1Hm6oQpVwqt?NK zStjp6LJMsNgShh&G1Te$aCYB3+-J?Ljun9^q-YIYR%eNoBxz_ZtYyl+YPQ%yb$82Q zIcMM^WiY|#I*)W=dLHQ!*?FW#s8a0ik)Hn8UC=p3o3&K6jCHRyVHG%}&uU{k3#i#C z)aJ;vHc91z?vW6xHm@3tahxt$Yxj{trSknpGQ(tf(`;vzifjdmt)eIArF`CJ5oJHp z4w!pIwSZVQ%sIw>Rgq4yA7#~x-2kY^-1yN8g0!*5;0rX|EbJrewm$nmQw zKjFBcTkjm9Y)ub(f5YLOXot!iaMY{~z-#_T(lh1GzOz?lI3f!Kaq0B+TsjuUr;`if zLf1Ns!m~%2wJms#A904oHEj#UgtEHqgXjecWLx)3Z*_RC^Tb524nk{%rO)_70ZKK z5BBP2re~~-(EF*^<0*o~YDL;{0%04HhZgd{4|&*!oj_VSMOiX|M<)ZQmDBsrIE47= z=mBQqLM}!+uL@TA0J)h$Ly&TH!arFx*_i4BHNmAZ{7 z3+Q7w7;aVSg%=1+8y0xq95>0|wX$6@?9C}Vz*CY!RzK#nLk4xhW?AsgP@@N7@}Ql7 zs59@9KL}Hg$t4RTkHE2Mx13CuhdaYH;Z4Ts;P=S?3WO(k7s3N&gF9((_=qzCHJ}&Z z*SK=-wQ@4=H%yd(X-%UmEaRKjgqJ%Jx&ot`F$cPlrR+)O^`$iP>6!DF(#xl3KA?yZ zIAU}fI!K)0#!yG#No0}S^ED02M`+U1VIUj8ia7TLlYI{N?vJsJfgunF{_ITDWhxx7 z#bA|;qwTKJu((s$p6CM-M`NB{q zeJ|uJ?;4Fv#HIu8SZ>Zvq{E?>gHgjt`YqgblnK(M)Untd?w#c#Bq;qtOr&i&o5~l( zODbp4-r>2NZ;Zi6q$XN>hD3L5H%rZ_uCN`0JqER^9o8^4S$ZXJ)|OsDYpap!u4L6p zao_!*vX(UI5fv9i?yCRB0KE)ArE?gcES&5sqbsPioeW6{7b=ISP~_7^_GQ6^l71o3 zBGx)xmy)$nP9wa;X7cI?V|w94*Xvg*c%~XohEs@CmbUOTnQ`DbuqR6M2`a6aq3t3KabXFkI_O=u5)RMwC>gcG z#0tx3?)j?vSg9%2rU|}2R(uK&SC`~m#oOB%CM$ejz{#xCQhg}XJ|s}5aX`Z5h{BqH zJ||oVI$TiVo&aipRz(XD;x?lL9yMAVPXbgp&?vmspNBBXY8O+x^fZfGqp-3qTB|=( zn*kzDSI>tu(NpEQI>13vKb2k*WOO>D6xBXcr-Igrc*_EIOmXiw(=KbSm*Z{93*nDS zGi~;Hp=3_4O{eL7rK-!GCk36>{xBq%st)UPB%M|!xlX4DiwFgTIrAjX^J8Iw4zAP~ z^z{iAk*aRQLSWgA0O3|fP+?JA!8>A1G`fIm5}e-+jgFzvQr>i6BhO>%$k?ggMgElC z;O2>lN~8PAiEavYHL%3ras!egJtzz4tog4Rc1T3m<9=163zQa+gQa zP`Eckp(1lYb6iNUYA~LrF&?W1+7l)Ww`B=v5PnP{VTBSHtjpeD?kUt*o=;FkcLj_; zf_fww$1z44oNEQ)8AIpDWKrEt&5fKys>PK|JM+WIy;XJ(zSA-LlVKQTD(Xa2%-9@9 zI;9tB^70va`J@d` zvdO3G<4ZoNZJB)j!^x3Gnf&9{3vI6s zwQ}tHsI1JV(nma|id2j3&4yIK?Rh7OjR(pCImm>Ey;EtA6SujHvXsaM$%0h4YErx) zS(HAL$r2nG@vZJF>gq(ce*Y*H#C#}6!ln$xY91OlorBXkbnj%Ut6~|MoRq>jHiDF0 zp&bHYnjXgtj$}GKS_=zm!GhlWapM57>qE3ttc^M_#su@~v)tW@mqxh&limA(IkTdZ z?Scp;5SWQ*f`K8&Q#>4FAY>F~2IVaV0)16MMii1cuBQ&2d_D>n)kItqfYdUkv_qnm zA^o9=NDM$*)#Z+ctD+n-d1AV{j8M5W@hWC-UGR(p6{!GpWjHmzX2O-)PA^;>?}8gB zyv-cObV1{mSyBlJX;xRd7Af&m^+7WZa^fK;h+`@zbUWD0)XT{}s&AX5Wt^N*P6m}k zryFnR!nlMLL41)^H1sN73{%$&is=pQ6z-51lJ`#}BH|+zGd^a`ncm`N-0!?L?}leU!jM47ZY_&($YKV%A!Gppi*g(Nb> z!%z0)Nj&Y&o@7i-!{y$%>>0=9&?kCi&OtHzU(X&S%Gm=1tonzFQ(8X60K~~u+HN~! z=^~}>&T64u^OJvu^$KBK^K)sIf(&Y>!ikg>xQCbt{>gHIH9{7SWu}k5vj} zHkXN}C1pU6yob@8dQRXVd8;L?NU0GdcUVG3-XM8}C1mssl9yOQS~6AmPf#IzD9_{H zEFmK?O@I;mYVdLba#zS_A15CvnrB3i{E;OT^7&&+NJ}Di$=8vlU_Q-?7~<;)CB2YU zl9w<>HzY*=Nj5_=^lz4s)v=QN&=RsbR+8^oLRvD^{I(@zxWOSy$gszDT0OoJYV_Li zm}86{H6E+a{nO6l-v6^ambs4!mq=a_rR^Qh$nt=Gl>C?q5byq2dvESfU9bCYjCTOd zAvA9&bKa2T{cwrqWiF8&S+)xqnd3EmaS zy#zZ_p$tjaj+=L(xr##jW=@ll+xu9(-`NjO-0hL;n)!YE;^?<`X=yaDzZr8KdY-vz z7@hk7+3@93*A}Umhz`xUDM`TgI&S)J@oGjK+$=%>t2UN#(>CFnM&Ha4u&}w5P--)A z1Z*dBBUBB4z?BL@acnPxvKpvXYHoest)D-ei*scDY%b9J^qEbD5ph>Ypawbj{b@}L z#i_3+6`&0;e_wW5iXpd0{N+RS@FV)?rq#BV-=E$ee3&3ZP!N&K>l^V3eW{hKe%?iASfk(*YW#=i%qNsf#dGEp+9*_zq&^|6GRLFf z5F;qAehexF$?@KuhXzH=Y($U^$~FE*4#O_BdLd2}(~gK~N>QV|rnrH{f~KGXLddE% zF-WNnW!+dns^*Nkc!|c1NsSdr)@${>bT8)!zi=<*pA+(&f0>Zup3uqh{IdR^)AqF2>CHDg?~kHbGIU_3yNv2tQNyDLsm{9&?tT@u4E2XGS@iRsv^VDm+{Q^J65~5OS0pmEHL_mO$)}ecoP{A>}oqYm@DNXen4_ z&4|Rt9I>8`J%vC`0U`l%yB>Ro132F~Bdh(rosI-5|_@I5Pam#uvFub?t4p>J%%y zBKdY!;T4lveX&_I!9(?3!Kg2Sr|xyK*Sh*w(khJ96S1I{%-(yV4v~KbY#gJep>wG( zqSt$g>a{MsQ}d2BVgc6$+%n3>ZSpT46fd6Kd%xa65k{ZibC=+Q6yE!Q-s{_Z><}Z0 zRJ%0!i;QX@myr!(BT!88jS7mZt$1H#1S>IA#Bk2vD9L%YIWl$Fqq-7VGc&1tYL3k2 zCJ9O2iq~B0bBM7{*FYxRa1&5CBh7`X>zHZ299%_rJj&GIWeTIIVNDe~%g1*U(WR5? z{`Jql@|WLv#oPYyEDb&TiW)I^S&Gk}Y0cUs9YQ1iMTIi`twQ5sp=q-cy0QqZB8Ex1 zj9F=ewpLIymb&4rF$rsff3j!ViUxw3J>#1+@_{Pwy}aLXILZlApour?6VX~SR@$IT zYzzS3i;T4C!sMU}4$<0}LpXxCotk#?JJ<4a{BIRhb_ED`DQQ%<24r0n5~p3{yjT4) z4&Xb?^Cj3b!;Rzac}S3aPF%#sI90Um&NF)tgG%=%rz{;LbB@xM?k|82PLtQ<jj_+!5yD@64F4j7}l(e%B7GF9h&VF5mqFXkd*k57K|v z08em7qby$TDK@}g3Zp2W29ArZFRzX?zP;qVD4T11Igco9dq*20cqA1>aQ4#T`ld>6 zQBErS^lE%t3#*A02_U<72O_54_t7+bQ`7PJjCSb149P@Q@h!C}VVr!|n{h#XRa`iO z7q?Jq6CDR7G+cMNJh)yk)U`Ld-Ecj!A)V&o69piH4xjE-+9!Gp^-Za3 zN11X?g>@v4mTG&?4>7A=1Xob~jyu~l4e*F7u;YJXTM918_lC(IIrIwTXCy{dhcsxS zBfqIyPJRjkB=R%5z-pKR`K6`|uMj-vNk-RonEVjcET77NXgJcPljCBWNXl!HVeV`M z1A`a3UKcc1m(Y=YI+Z_C$)zmsE{MeWpKI-nscs1sVzbanC1-q?WZQ*Z20|zW4-KCM z$?+mu>qeZyjYj+O3(_C8pC;*j+&!3DFc@i&>j$r>R59O~ao81X9#m5C%(?c{ zd8bH5i*KnW9|$iPjyC!!t#NhU2g6`&@p$;b@O|M2!gq&Dx`)0$tR8mMo5P!h0iA#U$ zcf;nqiIWdG@^#@G!sFf;zBPPr_#5vEk9bRX$+5pW|Lx(acd`7h`!*l_+S3wMM^ zKkL*x!dHhc50@=k^``JCCq4VZU%GtLMK_6~$*a$~_R{BV4__Rf`O@&|&$uOg;d8HeQMmcCv;W)LD=$9ps%KvP%hyc) z%&+|Xul+hPNfixGuaI?9uQ=>|L|$6w+ct?v7|S%s13;u)vNj6%wTM*gP9-^e`rDSN zEMo7Y=KNs@mIkM;s>JB4m4_8}lg=l`m1V(-K|NV?UibYpcpwvFYD&HvdOu1QZRq|@ zi1{T-J6;v&&IT$?t10Y6^}9@FTN}E65_VGb(R5tPO7cb8ztK8o{XfDD9tc6Bp-f~V zs5J2aYS(mE-JCQp7Pgux9}vm7vHR^%?ke$y48AFW)4>t~4VApU`={6;Pp=kngszXt zm=$Gko-br-@>k764ZS1Xx!0Jncsin;Z_UVzHPhcdFlM}OKbf(6w#@iKxEJ(Kdc4s8 z=4{dbeAwANBlS;tywLx~Y|;N**!iZ3)z?ZCpz~KV*6fUfRkJ(yQ?BlxZOuL#I`oNG zHM4{{7*%l7gmt@Kbjz(j{=1+2*G=eeWor^&f7iN)!&`2<6RY$4Gg&JeJMp&4Y|md( z4H-4;3`?4w6;dFmw?azjnOVX_=)EI~_UJQV=YC_tAD1!V>jwIM8R%=qpWO8JW~k%d zP4BeI+&5bqe=6(7i@13M2t=T*F zQ_#OMTPEBScD`y%_-+{!zHFc$l!3lvpuZ{u{kd3|wdux0O%D@ERLaD?6Qd|!RWtJ<8)cv`8t8wQfxZAJ(^zI-OPPIe z4Cdz_iN@X)b_~@_LMuss25e_9n#Q!x&6a5&3Ok=SLjKP(LhceF3)rz^St%{|6T8pO z7P}9G9idQ3{-F%J&lut|=`h5f4Uk3W9f&Qfo^brF+Tn4(^K=iMt$w}w;40L-L=)(qjQyJ(k1O2bEvOZ*> zmzI6?K?A*|4DYrHjXKDZB+Cul_j`Hq_lGk@%JVW<{ z{P)^Dxy9=7lM*aDuQt#vWmUZ0KyN4my~;qpUj}-mf!R(y^qa$BmF&FO zzWPkrS1&TqXUjlS2KshchT9}De_sZB7YOqDGRX4<`9K-uMnOJU2Dw3ykCs8U3i5|#kn07xs|>P5kdK!^t`p=B z${^1ZpO*oaxvWn>RLM+e_=VvCz6*RXV3d>iX`lm5;n_-h0dT>%(os=StY)2&Dec$7gN9 zu9zj6ey($+c>m>+Vmr?jV>PmtYZ-xw=?R0dhE zZ~nRra;_l%rwsD6VJRF;uNYtM%YIDj)U2B&J(qPTze2F~^kO@SAb(Q^Sv!;XoH;$4 zSzuo>+P=hnHe2g=&Md2YQU}!83Zbl0PZi|9mqDH~Q*}=}Sk)cuUviVM zhgK48wa^a*v~3}#tf5U&+WoMy*0D~}(S@vScMyw7bGw81_zuhT48ysvx#*jSRkK}D zO~qLcGdtWu;dYvE({bECsa&VH<$RS)vdGpKC%b|y0-GYs#wO01iA?)DOVHmx0bV^z zDLAfkrljD3GAUSD4qOvfep%w%;x4teEYqM|PIa_SJ=*C(ZWNBRb1w`|9DHQ-)u)5#>^H9M(B`_|=&y zcWCFN*}i&6XX$KTUC^1B?W^-UC(icOUgw0_zB=AHezvd9>nthC&Y`pYuG3+a;q1h- z-RU1t5v|!va+6a}3K}r$TGTs7&9)Y`&f?j=YKO1Pjy9Ffk*L2S8iykvwK3%EatL*f z$ZTF^N5HK0$ePf@QrqVi3u1|i4QOstKqu`M5@`*6)geq*L9tV--=5StC@evtLrCDc zSw(do*%V&E-CEd^ZW_`X%5nZIb7a+o+IgR&)~@6^c87AbeUxT_ovbTHSP+ z>X7KA8;Pe|Q-3rHYqnc4sIg2daBE~@TRWI;na57r>}SOiD3)rmjtR%omRGy2`}Bbk zMJoR8 zwo;>&lgux%7M1Lqy6y^}!B~!uF`YM>$)aZqVas(Aj{3>K_zn z#&7e;*i^gTa$%1P@y4eh@zr|i0XwY+u0rGd?O3s3A~jg znP5N@_C+{fsiH}0TAOhrCySQ5kU%A?aU&;7x~nq8Pz6~plzwdlDrCSLrn=fp)Ltr* ziIqXQ@wDxE@(m@+sq;W&OY~}clOopa{v^2N&VF4&!b9Vwg9evf!7YPu`_t*8AyC^S zP>prlo*9Qv-!f<}?z5$}uXTjdRs_ zl)9z6!e>TUQ4~FqZi_Q){i&8iO`1%XBdp)hAg=FAsmFul2cN?vru!2;SdF^*MgfI& zrm;paP+%@iRyJ2rR_&C)W3}H*MbF5O^#>J=n1oyU*fz|WJw=oFwiT`PWrU=o5t1&W zBQjHCT0CoqC%RflbC(Cfns9|xZ7`3ip$%+NQo(qzj(jj4x3d~omWM0WgdMnD)wyo{ zo+}J5%8vnwS}4Qvu%jjJ4AiitM)tLh165+y_MdL3*~gf~d;APwM{XI5Ybxwqp*>Dm zaI-9kL5KksGt4aN9gHCg>~KR(2AEJz+z{8aJAfWHbi;PVS_M~^v4mBDY@b4v^d=nj zLoYM8_GwlW({5upXee0oo%#aKT(gfyY~GSv`V&*J088$?C9MGBJ8>;}9_M=t0W9^T zhNp~WVe$g10adUEhF-gX9(*6d?IxM>v~=NyjE!+o)j@CwJ?L3H+?rjLOV3KrnwkZ zFt?_8WM{0oHO)4d=Kp&zw(K_>HW^-$rZQj{U)Nbg`t!WXJDBxi!txVsPiyG^abp&aG(GvqJS`mmidpss=GHV5H`AG0)11t$X+E#JpUbi5)-(@@jh|c7Jew`# z=hieUvT@(-*4&!rG~RD$lxl8Gvt~4PTEyI%=6$Hq+?wY7IWuH#P4kBC+?wX;I|JB6 z_}rT2>~Nf!mlV&fX`WltJhODnt!d7C2QyP?ZcTH#N_uWhvm3bkXWa?t01Sw&l#cUGX2a#!0a_x?=XFLTJUzqLhgr#u<(^#6Foke6n(}b_tbx8?aB4G zhqs2;9`~y7Z5(TQTC;mwxa!T}JHu+YI=OD+^M3w!!>D!cp*OzZoEL>R3{H6dOT$Lz z_)~g^zb1TLc)f;=@F;19sP-yU+@c?p7k@oz4o`B^s?|J;mI!#UmG5^;i=1B5ni+An42y+|Aj9O zPdatQ%BNiYYgbK$+s?Qp{Mn0dzWzCv{pOXwe&)}e{oD(mHhIzJ|8~W*&-=xv|I#nN z-8TAI&7$Jor@hT*X{|LbW0Olm)(ES`VGV4Q{CP0BJY?-M37GQmECVeIRN`6W8p}Q4VgQc|0rNSZa(p@HXXjoI6Kh_-(c$ovQKEgs6YYO^qP@OIG$?rBMEmdv(LU^m#$iIE zI6Qicn*j$HH;TjWdpdmI(*b$Oh3Acr0v!ljPM!i!I3DG(!{x3Kp4{blB3w=d7XlR7 z0+t(&SQ$lXW+pX;v`dHP+NL4Z8MLc`^j4jAMbcdKE08+H)m+6kcE1k>Z7_LtwVgbb zE62BtVw8&R!PocqkC5s8x#;c|dENvv_vwZMR+7)@hT~L5(fd6wQ4e~Fx}zvjsM&#N z)-b^eHfdw`f3U?tCC0h`l$>%b(W--BiB`?R63Ga$iG?}>+I>QHaG~z}E)rm~JXp9U zJQOSC-Fn)FF`eaJFk6|czdSs2O(65u$T#j7He|uD)lbPh-GCvN1p{`F(+R8g9O)8xDsV6^;*h;rN~xj@M+u0oJe0h2tP$ z{olc$2PWIW`fr62C(n$c^!~>lr9;5v#h~<6p~SH^$^X_30iVfV>V^Yj*g}e%mvQsQ zO5vQCWQ;54os6RYE|2~mPtjLo6s7flWlqrs_G$lG|JRRLgV#H2z>!zUnc%_!D~}y6 zcZ}e2M}`Y(_Xr)Z-`#Hq>>R4kaWKhQTsixNV;Z>Oq!;$R=7w`!ST)Mcwl)VIaJ{+B ze(GF*yUn&ITyJV8Ki2iP+MLS5^*7sWrOow)ZMK}}`hs@yQeB@vjli$>%;vCXbM>Z* z%zn`$VfIT$2>ennLO9YcCwPomF?t5dc0y<6<+1Z$f?H0;{RPFiWy= zIKM?y`Gxj6yf*19+c(Z*>oK+|yr4TXKCO-20zRUQ?Ve~({-AM} zKELj+TjR0qxPrbL-7-htc06PwCpOZfJ6*-{Uq`x?roPsCJpFiV-8P>ApC?ZOy+46g zKM3Tss z`HIqirp;MhTsO8k!JF&(?c@!5KChkpvz|A!llSU*eVZeNxSrcieyHoy+MMLYbzM7o zo32Sad5^AZ+Z>0(^_+I{4qczx<`^EXPiZHw(Dm##=Z$b()8+gRgtpC~w>%Zn$|J(uw7#r;g$Dqmkt<~DleXmD@l5+|CtNlh}CT>#_Xu)m% zZ6)G1gDwoYbUw%yZ)Uof4fts`UEh!ptZZ|>6W24^$zSRD^mekE%ahy5>0C~0Cu_Kz z+D^{kvZBrTQCyd|Ibn+HliJDu)Hlo897o6Xly>rvo=UIU7X!j~ybP8bRb!86w{iNsetN|4Uc497hN27^HzygGYTBu{coZ#}XqO zHMCB--;q{>q{E%>e;2w(wUhtUb#a?h?YS;1&5PnUVblS<+b!|_>=xGk4TRcV|En)O&a4&tXK9jN8Jmm5%&B zYBZSv18DN+qD3<^rhnw8J#0GNMbz5#hdVZ=9!C=qrbn06Y$D3urd>0`%!%k_#=A6T zTA238xANA8_tL|BuxwZ(M@aFgF#`u-h#BwAm~pR2QJcn;M-3A^rXft;lVLJKiy6fN z9WJQKLDFGXo+b?_@$XR^_o~4zw}|MFn0ks#SKUVqpC)+x8;I2Vjdtf>*>^Y4`7i}J ztFbSw_QD;KDZKQS=D}*o3oh>dz0{dK$p67<^3p(qz0Fu*BFPG}{}*ztGTdwLGwa5C z_WpNr&9C|Q<^N4F$dnv5ih~_FFp5K-CwW<(-+jb+)*PNUUEC!v%kz6K&k5?KUF5A^ z%c<8t8~?hh+tz_Yyp}{a3_5qMi*6l^-N`P`bZH)l=)AAvRou%1Uxs`EW4 z!-n!__B%$JG@EN@wSUcBIp|4Wsh6P(oeo{-gIJaa zc2!r#K7UHP^TiaqG>z_#!G^Eu4O#N+uIfbbx{k^--~Ul}dN99DxXh)hgA8PP!=wh) zvA;~87W4x9Yk^P}a#YFeul0F{<#Y~nrhE1^U(KXYf#$6lX>Rl#p}FzlaijSY7xPC$ z&J{8ENTVC3#S5Az|-eTPjvb}Hon1}wO2oOe9j+3Gk==Bnn%Mocx*Iu4)dah&RO-JZaw9E zHbvKs;}^F(w`#=Tv5PT&G&Jookk?M<#ZP=X&Dqku$G<;8Ws`xXxxVdBQ?GnZPak_d zed5ymF=+iBRSWaP#XmWPDHi7EPG%mAS-DQp=bCvV1D zq%yBxVS<^!1wWox(TT^3W6;6JL^0jO;iigd>n72ST7KMBPVC#pT&_R=k>|EO+rly8 zGbu#R^&H-byGowNv_z-h)yeRrZ0vqFjJxZ*M=Eb-pYoGYzeD&`Jdg8DI|5XMU4B05 zJeRGD$6$J@-vR%cqP&jb#p(vO;j^W{A5#3IR!k3=c)TlQhTbg(4w?V5r8{tWYE9K@`O=**k7eE1T}d78B93oDvs}=b`Rx*1RytfLKF8(5 z2OXDH9+wj}#Wo`@s~j#ApX0*1l7mc_)gG6_!9~kR%IUJ&;bO~LQXa81@*v}KrpIL= zxUh0)23*c`xKMmfmyaBDT+Z^i^ugu98F4ww;X?5_F04sA$aGobaT$QiKhB8D8i$K5 ziA#CJ0>Xog%h?{6L%~H0c*^DFY=?`jUrcfN*g?nTDIS-jz~y^0;_?)S3&rO=B4X=6 z=#s?!#$Ig9Qyo5?@6L$JQynf8pX2h01H)x6c%0+uas+hw&WyO6<8Yz)9G5>h=(w!) zxGVvef0z*$8apkHruZC}dk#7-OzB%2uoPVWenwmphYQ8$xP0=UocDoDP<&oY(zUm?#4Nucu>rv{2j7eQYsZ z3@+a`Oj)RlC$OG>kf7_ex;Ja}YZrrd=Nr>eKI-v6c@Zf8&5XD_%`qC@=8Psz_dtx) zUJS#zp3%pZv(nS$T!#zA=eQ8Oe2{Tj?{PUAT)s6UUDi8XC_cyKj}AI68$2$@gUjw2 zaoON-q4*pZR_h#Ox}4{6IR;$5IU_FTIb0|{$A$Ge2N{?1JuXLr%glOozQcv$b6j>E zbX+!iTuuO&znYOQ8yzkbpX2hmgO1D3cwCMJm-`KuE?U=7FUog!)RAkMcZ4|B{PkLWwXSkao4)|*0_6@);G00Srz(*VYMOsCsfzEoBV|T zD%Y*=vi`Q^I-OKw`hHwaLjFt=!q!uNJ}exzUrD&WdmaIyhmQt?vWRgcC{>N3Z!W*g z7A@T`g`NAL9t+UIydA1u&;@9FN^qsE`m?a}Wu!)=W=()DED_MwYqYI06bYTsT zF3X;XLNLtlC!P?`;Xk|G{7~$4@1aLKI`0W(1n1;uPJWVu8=X2Q|8p^tamh-A*+w_d z$pzLgiBXgOl+B8DM<8wrPD%|zTbO`Z#94LSz6K_|EN7x8=93`Xj>U1X3uAqY_njc zd{C^Td79BJ7KR2k(lE>6fz=>xkA5{iym$1_`yJ-mJT9e}B+G~ZZEGJCTOuB?(MjCV zT$AmAWm}=x_5*$+0{o3JPAE{G+3Z&Pw*yTo#sM2#4}zp}T@vbal^}`E>xObq7A7Bl zJ=97R-Eoxm_uyu)7T&iuk1_Ja248_A*l_DWdab{x4;!iwySA9IWP z6*u3R{;R|)TQ62@0}~E_QRHe}^PAfeK&NQ z*l6C(Qo2mIHTreUS`x<^85t^+LG>F+kHcjElP5E*jf;6mLW}%l_al{{09?x2b|KTQ zE&(E1xNP0Wx7NC0CU*W)C?D5XMjbB97dH72zV&o=1X-?()MG~QAl%qzfujWDT9ViVM^KJu3}D;2wpD5GntMBsk5^#P+_kHe<0I^!2N+t zE4XEIjMKUJ1DRGEVUC3`=iA-A0k^7gtfMzpznrRNE&UkDkr$}CCx|~8qaARi2}CxF_d3(x^>|n5EZSdcYlbG;sGX4K{?p`h)q8MgNM4Xk)z<`KOr~z^gtoA+^F=^1JbYD% zGzs0FKPU>$JN2!yPnNs$33ckIgQKXRKR7C^>tQHwN@q(__T$n^Q_X2*lj^f$r=&_+ zQep?r4P~Uyqq5I~vc#$CwA7hQ>x0dx$I)J1<9Fr9dYJ%;@?rq{tHK$Je=r3fmbK9* z)ZfCwH8C$cFlZ_kqAB*W2a;kT>Ok1?731Ldd5xQjh8Q$w2!d#q1wk}NgCN#-ouCi| z5my1~OZ;_r+_ zk2|yj%fLSqUJ=s%H0_owi&>3S<&m9ep~=|voq)@dC&r{e`-Y=^Gaj3n_Vq1hu`Mcpl=kru-K&O(kckPUk)VSS z4T3JJH%EVMTyL{HR9H4wu4*G`qDvYZv;og5&o2q-=W-_tac;)DGR)pKoRxx@3|a_xk#VY}}6 z0Fg%|AA1!J?N}6p1ec@So>2??5T`$1Qp3)FwqJK$9#Jdvh+0E_SZR9dzoiYGY@Xj~ zibkg?a*Q}2ZuhBpe$w0;*S5$RBKj#zqo0u5U4?V-f_U7yOWwU9&rX(S&oySn_X}UQ zcZOk@He3bIBGOJ+RrJZXg|VF&_);}?F2ANFMDF1zj{b0W{*5JI_>kI4*L(w{F;BMt zp{1B|u8d;S)+#!RCIgMR(=sn|p85hW_I~7=)*GU5TO~DxpcuMVIS!Uay*>yoWqYrR zE;`X%K8y462p7`6LE*Y^6%`4S+u5xVbb4{fgSL5~jfyL)DlwO6Rb|4`NL@xRkpgt;P)_>I^+? z^C$Ig-nFiJ>!5QdVN0lYCGMo^jmH=_6inCl3eKt{sdtMH>-@D--9`t~NUt{AHe;jH zFIwxnG|#QLu5!oJM7F7ja9qC19vEf=^$9(&gPuHyI?fvQOSs~Hj@jy{I@qHOGI`pE z&1B1*@?0luZBjvEu_F+3B09xBar6mVLkea11j&4veY5X6d<;Z_)7-!;;!PB;%5m~bxOk*4a-yGy-%Ay=GO8(xdUB~TD`?!P{@+@ybP%p6 zRlMHjLB&h8YuMvT5}Xyxi#e1GIfAKbfd}O6P znHo#wD@2Wq1`TLM`>m&{obLX3inqWlsI%95g&Krb1LZ>v>SZ;kOHxz=qriAPE}P~YPr%y zkQ%74>gG7Qm_jhd%A3eiMXu7ABM1D|QFJWN`ASs_LBA6-1WM*G4d`m|4h^^bi%Q%` zHG2_l^ou1jYOa+v6tGY0N+^6y*P5k^vX(;4Rtl>1Lf0*nQvuOf&Zze`WwwZ}k{_x_ zo4OzVYPEr=ADMfzJFB_0)6%Ytv|}r+&02&`Rl^9JU!+NTk4kY0pXi4ha38iic}vAR zik0Nu`K|X9f1o$Kt9UzgSA+XHUA?ntXT4RD`$C$62YDCBgSy|TyQv7rKe@e-GpE#&wGQJn;(T9kdc6TEk9VLQC%}QRJ|&M)!gsnfm-!zArlm{x@-upvDXS zU#fz-5m`05wu5a*t-`K){8o!7XxZ}=!S#JykK~FZ^cQj6$yN3UA;JHwBs;j8m#*^pRb`gMa$2WBh%cTUUWQ}7 zJm9oSq~dUC(^2u!x-5miIRVS=u&BI8ce$2~T`-9CdR&{=4jR>3)NIwqDs3#JML`b^OIWxYUUyNK z&ARinKxr3r$BJn*B6@F(Zc6s8HNzKmTiVq+&Cj~)7j>JRMxJJ{ix3ZlJbjODq4KM< z4Rn?kxwIP1LY7u{X;lr=rQfpZN#9n?{OF!~v|L)`Mjc!lhxzC|hLsNKH@!fX5^Nfc z+LbYAU>wYzuk-n)CTyI3st0i6HEf_N?gkRU*j zw8TFoyhzca9ko%Xo?3pi;{nvE2_veL@rZClE3zXyjHA|e?PQq7E$v#I(uv!+w%Qd1*4tF7ZGuG1>5GF2OO%1+&>r}m8d`TlBm$ucy>EP!E`b^ zXiPK*gTZ8LcB_zVH0w|2rbGnwy^!K$3gpX*6c-0v4hAVsgF%X;H^%vwc|t7` z@c7o6aG9z2NIMe3vP7Sr_nuR6=>6JQ?_JPJo$TDdPFnA5WZt_m!E`MRAewUxM#F7- zKkdDrqVEFU9k7C_s{xBeVpE5y$SSB!os67m2bB3-LVLi3+M?$-%f1l~=zn|Cl&_+yg=C|FL{S9% z#k9~t+TRnFvkXp{jixof8C6V6VL+g1=-zSPCll$GCGLw1pt~4cp&^ABY!*qatD9+E zP5V+*zova%r`}~@kCsx40bAeqSR?c*lBj!ZXu$>-Aq17J!ADjtai&CO>({V_g&3R7 zo7llILLo7*;1QKNaErXh1#?iF3&}+~T##hCTsRV;#RaS8Bo|KhAbkd-WB-?|>G_PT z+9qF0>ag2W!^w|~_J+NonN$JRXG~4P`Z4jp?^e9@H9AC(3X$3- zNSs0~Gt{9jndgknVA8~!A(O2K%#y9A85Z2svPbTkW;h_zPBR=l*IMH;knyJ(R?oFI zxU9(lgj?WR2#{_80|EIIfOxXOD5Y=;VhD!(e;c_HCU3%|86?`rknshOZa(~|nYFPl zb{sCy2CK#?dzSGF*%17K=`b)ed1ByTY&1A2`~!afwF$9J38CuD2T_uvZfCm@Q%)D~ zbuwhgw@sIzvDYNutk(#P^ADq3YjRbw%?{O3Yd;U#jmX4cnWY~cppefxzNBq z#1QM7YWh&DX`8xW&*OEWatKI_8>R0zY(RkGXloJ5BDn+#aZ4#)K%L$iA2bb!`ChhKjDJo zYZtnocnMJ*8Sb^0bm&~fMWDun88pB>BbWdYW{qU{2~lyb%@`aeUVBL{O8hqGTBf(+pSI4h9=zMbFQ^aL zKMJ*f0G`-tqV7}8m)lSBrw&{h*@)kV7z$L3w6wIxpZh9l;lvA!hl#ZGOVUC~AulyO z4W^|Ap)dm|jOYMrx;zayrV@o&37trh!M3(~_2AWa)b_qQeG9c6?4-XkS+dq~HE*}p zTUzTat#xU~>#%AM-pJlQ|DVgF^jenqD*f)!^3=UInEc@H3 zEG+C)8~)RA&j}z3aqEfQ&DB`2ynDHdy6l`o>c>g=yVlY z!w5htP~j@wkRMoPEB-~B^iktjSkABTy5Lx5H5Xk3P@INkba@KAaeRiDkc9#x7PX?o zjHEDhO7x17hbfNb7n%^cl-O0OqhU z26`dB*I4(b*oc~W9&md1ei}tl&&vqX1emWk^H_(T_()YHFQ7blNrM(o-vqghN>7A zA6yiZjk;Y+x}9M@l-An!mcghODW(qaEwV&~hgl~?LyX+gO4*6dHl65HIx$HnsLVUT zjVqYjbprm$@XLSJ4-lf(4|r+p$Am_!emMV=4i#x5R(YitRy%DNQmh zN#y8^%5%YvJ9Aa{EN0msVbxJfZsi}bi9m|Pvl{C}dXjuD43@?zD;8~mWs)sa;qnOj zY*i19@3n4btx{&+t})_+M77Cm=d+Fo0{WOpo?2~qs|&O$Eq#$zC$haXxPUS~TGn(z z^sV6q)5yI=L0^&#pLKAQXtaGFE$JA_(VAk}k``_q$dmhc-^IZ&?7P6S5Rs&bxVHD} z`GQ;w(_z0kjS^A>b!D^y0GKUEPqrHNWlLPw!v1WX>jC}_wm{&pGLl)HfrwgVA=Thl zDM1bO`lftE!1rU<^0ti6&EY@LD$O#G!&o@wKsZ3H4^^8wfK&S#M)=87&B?4qPb5rP zfmjH{kdT77ENRU;zP@Z+z%8}8;aS+1A z*f;rq-h9C&Ixj&NAy}1{hVLR3?VHy$Z#E%RbO|+C!^xVw!+8M_VZQiv5L1<@nI`P^ z)h?2j3Q@t=8x(=$ipuKSnQ#!4p9z>t!$B)yXg+FTz6%5vsZ}-EK>!hyL~W5gg!l3x zfcb)s{!zuMux3?!1U=#EAm|4L2N{j;;ekfjBXBK0Y`Tma={P&pxL&aw9NhAyoT&FdR^SK`!<8fcndQ zwZDhb0bM|ZjEsOD?mb6W^`pnL{`FATtjzUE})mzNqx<%?7n7JN~EG>bf+pig5^8rOVjNl~VB8Tw!1p01#2I?jK;16!Y5oo-XfkIK6DhmFNz;wE#x59yNfFB8z(vm>)lY(ng z$7Sk5cV`U>BAhsWq6xf^RC3~#307cwSrlO*EJ8qqTXrXR!a(xyAk3-zG%*i@RtMVo z?>9}s5$pW2-)ep_IM|OQu-}b#%4ep_CQFOd%nfQfY6g`y9bmM>eMyJ zj>w7uwp5f34LDgs;&URZ38`)KTxN-8av=8GJ*UC6<-Rca#nKLxIANIPS)SmW5T>E9an1TGoogG^ zVTWENE3iUk)Oo(mw19{o0PC@UX^lJYAwWthVl+02#z3?|;Oz~Lu7fL0Ua~d{B1pfn zj}6#J3#A-c-U*N^%BH)6qUOG%t>}QwI!4o)j1jYdnS3O*#am22pU`*^*7~w^nh)LX znp*FK-Yfc1AH>^yGJYW51j!UK<7vWYEd^XX6V1Y8lsASJ(>V%?5O2!&F@;9kMC4aj zSi?A|X=!4#;_2-@*ydzqhDa2vtTM6r zzxXkRoSz&1q5#vFx#RC&w(@6-@^8R6%RNxFU+SsQl7;sMI75gj>!VOljn`X96A>is z3op_BZC3Et0aVy{ccY<+)IXua*PA0Po;M=hhijUa3G0!vqgXEs+{UEAzdni&rYOaF z0VC=@O5_p?v0oBig3kbWKj16~{n9{IwZGa&Ev@CscTBv|7dnYqSP@a`mS_Q1YH>o5 zE_!q=Y{E9K!<+d?P2v9_qS{g|K-8UyCyrZsWqvk4p*m zrd1nz|Zt8pfho4HF79ZKg-z z+UP*&Ce~?`Zdu~MRP7N0-CCHgJwoO=7_#(81XZqqTS5WuZ?zOut2pU!P-W}~JbbPA z!G4E9@grOd2Z|p@uZ7hZ4BKK9VIcyG@wufy)8z2w|4jezztQU99y28(8NT#NnAEaC zSGN4k#?uhT6~bQdE8B#F6(S?@V1j6V*HTQ(q~DvMlnOyugl?Ml`-2zIWr-CJ0w)-~ zO)WUFycH+*Y{iL%tvIo|6(fGbkU$6`uLTh7*RjY+czp#=aAt%jn@=e|%ISbbuV9LRfW6Ox`m8)J9m|Ri z@Zp#6i3eJ;-~i!^#FA|=C6Ns%NFp0hkVH11Ac<@!$|2SO1zAp*f|-r=UQiDajDmWI zU=-9t1f!rHA{YhrkZWKE>d_JPs9*|ckp^kV1N8tc#;M0RT0lL<(E{pGK?|!3>aiA< zHN8n<-+_9R1OrSd(FRN@(FRN@(FROesA5V|9+7b(^|(h&0hQVi`fYFpdb@%+!t2Kk zrIM1slT*#7o@_o2N*Mc$!qnHA5ebd4;Dn~i^IGO4xxzk=kCOZNOag0tSi*2NvI zn>Yw+qksI#CW*v-DAXji#n_M_qhTQJqPQYZA@GVx^u!?=((;0sI1-(|(%!~X&1K&h zF$I@T71hLJNyP*r$Q*4zErZ<~`44OFqhMCRVCJ)=vDVgxS^lQ^>+;v;uh{DFrCWr5 zw_N(Rxsq@pNfLIeurawFU~a%hyYo&)rK!3nFvfRxcpbyLgFa9&NwE{qcNA%}FqKK3 z(YD!Ny(PGSZ+`5!Hj#YxmIVhKZSf8v1U;bu5yFIItRy)B1SLZ7eH5jT^G>^?lZfd; zeKw7lTM5|8Stm?T#Qr<2!@KtfA=6GNA`W`ySq*FZf5b-jQ*1PGzfF)5iSjz+Up_U( zu@IWmf&~Z+Suby9isvd0O4@@+ICJgd0GTdKLr^acz8mmyAk%k+o`RJmKYBMvg57ul z^GR_=QjAZURx{c~tJZjLTQmp0J(iywqVPl*lpA9|FnEHUgw6gQ?Gu8;Hiy4s)I>kr zVx>KZ`eCLQ+>_wy28uYBAb-t|HhFzk>n7t)ebf#yLQB{mE9-$ana!SW^~0>BbssHX zEYe8^j;SQ;wx0$JLJUrdT0mPMGx|}MGT8H-Tx9fPAK2jEz%lA6(E*Kb`5+V;81NnE zM0E+(=a%6T?nj?Hamc8L8ggfR$kY9WorkP3?L6ey$|1A#HDuPTkM{F+!>)@j*bM_` zUB{tocOJ0@cB)rLV_g)Z*I3a?FActf3u7g;?b*S<&RCn`3MkkbBE=bE`-YE8O3Dnw zj2mz1E6qlGX2*wH*@Ejc-0d&!Jlx%9_=n5k#u@hEGRHn#W_g?83a@*yZ`;rHUZ3k@ zKG*+RWv)MTf9HCtzjx=s?>^VRSPuSP=348V@-{Ixcm+7vq%TPWyfirGlm4&zq))Jk zdGN2KNoSTLf_u(?pZ%E|(jjcCCkQTa#STK_ks)|{9Ki?ur8hTdb`!AOuG9aIVKh6@ zgx!JmH{Kl3gfTUsK^Yuq%U}vXJK;e4_5?Jj!nf@XG@}YT0qrLNVijsXNdz7HyqDkH zu-SHDV0-0FgYB=rIk0V^D=SV{PCB%{)uCl{<+%i{H%C`~0-93=*iQ&xUC#U45l=Lo zI}_6Xpd2uFB_V}=?nYU(xb&r{Ua`20d#s8*UK(tIHBi)Nxfu6gaXrJx{glD6#pT?? z7FWSNWCQZWW!&RaV|el@#}m#<+-Z4iH*5@N#xmK0Lj?0&|EKPZCvN;MsIz#iG2RVW zU0E42fo(ue5+mZ3NeZ@)-*@jzvYcv`9yeb{EqkZ9hAB-?nHsPS6rNGlB-pYp7;0@ATPnojNnDc1B@Qwa(0Y zXAXO3E>t>`-+O0}acZ6UQ6WI5KVNoczS@}uI-^Btu}Na|Yzh=w9&@zRX>6b+NcHUC z-2u;{F?u#+74qETjSShqMK@VhF;VNxOBdgM1P@Ym5&noeGsp2F1!M@tG+<1Zpx8WT0H4xSV@vi5CXH$9V}F?|CGGEz+m8rmaG`-t*3Hw_x(VcChRgX0#Ae@UT5 za;Jcj$r6L=atmVwBIaKwuzM~;Df?l={0F30-8OZK=w|6vvqaD~`?stk(=+{>f|bCSHW8k_@C*2oLQ1uQ0dxR)4}hiUj{J_!WF#O0Rgn8`hQx` zdb?(Bci7<0bl7wSn~DC%Vpkr7K|%-wmn|0#HdF76k^hPQpL++u#c*b(|Ir5z7hhN? zxxTRGK$TAa2h@*u=EB1KV8Nd={eR~H&l~hEt@Q$*Cxy@b{`ChuZ*;}y4YK0%racvN z{qK7_K_Yyp5I`C<)}izTiYST*V~z+JcrX$klR-hLb{dk}D#k!j3t*{84Kt%EI!oWc za(^(fTq>-}c*p{x7Etv@e(P3q_%kx^tV9WAAf$k0TTm@>hR5Dxn3}5=;9jBx2#(}1 zGn%-L&@xT-Bh`l_!T<3F<01Y~Kq`<0gL^{O6<)0zYFL$s!jfspGjk~U7M*TAt$z~B zuZN~w&6qi5>LIPj_Y$r|%xVukW+L>cyeC&PPh|$}MHlnp#lgQB7O|IM7~@|rxtI~1 z;wFsHgOKa=VjRq>90CgD^)S^z`jqcs*BK(1_p|6C!49&&O=Ib^4VSW0DK5^mjBlq` zWUTu(U7pjqslk)exwh^K1yTF*0h>8Wwz$y@)6mXu5f|MccbEEuWLVWdud>B59AqfjG!(^r#ft#!m^y9JM|bh25z3F#s2IYx9GU zOAl7OpIS_vxR?x&m5GPfi>#rzk<*l$cni?E|-b0QZAQ8jLE^1&*)>q8Lny>Xt^}Q9{y=9vb?Y8sg}!18Lswk z(co%WVbLsxm14Q@EC#L6bBn8@V&WtgvlT6u^gZFY-%D66kn}zl-P2B}H5`4<5r-0Y zwg|JpGocQNPgYowd%$I_BnQqOR0#vxOc=_^GSmWT1~RyQx9)F36`TAMoY;N2_Oa1y z+*kbFE`ey5C?z$#6#Pr}sPCa8EFWrE`v^W9l$^>KQ}QtOm1>Mb4DvJC(BfeufXE~E zUCJY-&()g&=>SLM$y84UQi_{lzX#m2TUbGUK!U9_AGKGYw6+^lNFikV{BH4@%^c5g zWU~F(2bw7+xr;-j|D2H)*4f3u71nPg)2wi<>!VJDh4k$8;eo9j@si;`_O)}Waaf^$ zNAlrKnFbB$M0g7Ju(!>|2E;_`hd>?F@(T`fP#Y2}phqPXMEq{u-yCUobTcdh^u^aM z^mhO{aHdoQ8M|A)2Yf<>q=x=SMoS8(uK+zNfuV_!2%t;%;*!3Gr~z;ZnTy(ruJB%H z82K-5r$7Z8-#+D-@}ALMulzR5)^%N1l}qhr}bw>`)p51TBYAvuF~%;W_u42dmo+w zt}@l^lP$rft<7dH==>U3u*WzolT0TZFwi0KNiHJm>e5WK3eJ-S*5Y@5ZckUhYV^RYMNTfRLD%DwX zS_9P)mjGH&ok)M6I(Blf1}aI&sm?{B!HL;(k|NmwE(;<^ve@HyNET~Ml>BoN6zBNc zJ4S+j*U)8;(4`yJbU`XH$6z8ecXKt=5@N~XSmI)(@_k-;#KqO(gC-x?5;l1ODW+J_ zqeXfnd4}jija#G%fq?XS;1 zC$zg~o6>0nAgwg?w7f7WiT}4i;bh}FMlPszL8l8?N$J7Nie1y7UcMA z2&LP{T3Tf`CI++bfG$I&Fx&QL*q&!Y(-75JjlG{Qf0T~)mD+^JN+nLVko-MLy}9md z7R?sn#F6VEO7ZKk@KSS(|oC`!I;}hgHw$mYQP?=(j5U1ca%Lr9%$51-I{;FkOFm4mYWh53@ z0Xu7wrJD??p$(lChhRBqlRLg9F*RG$MVctFwe zwLrc<<#p|UztEhmK-1Qg@s2`7Vj0OPB*6?}6&*wlAWOeI#vd#{ttAeyOs9% z)tYN>+Zs{zTRo_MyJNe%e@mQArAvdNPSCsZyf}!3#n`n(h2Sn2zhBg#AC}Ru_OTjB z!4qZ%L-{~dZWbNV$|ZWgqP=e@ZdudTNfX)Fw?5r%&b*Fx>vIGMn7C$yh?*@JxJZCJ zMELC^4=a!QV6doQ5bpySz(l!txIlOe{hL-Im6nYCuOg@yB1V;8d>#!fc}Kojx&L7i z9WB5j7ErQ2b+IGLZoWX_l5q~cmR6e|4O3vqQgMp|wi2~TC3w_+@ z^S=K+%zKVV#-x*Dud@3R5qE2XwSag4=N5D@;B-r4s9D>PZ^Wo45$|Bz=*csq?se$v zq}e*9nBM9l#UMr!*@n$;WR_0ZD4~UNR6!_Z3xw^s>Bgl=6oi_I6LXr3KdeESICTO- zVdCVe)Qe=Egp)jq*h9)A>R=06p<46IxdhhCc0jF=c7duy$e)x8Jxq0=0G(mmL)c>C zlw?KD^vP$XQ(52pn2`UeONU8#%t;~-NSc7xw7uBuO#hHAgi$)@qyk;zyZO5Q6!F~p8@>?H!0n)%U zen8vKVC)6SgLW17dLEe&;Gpz%VnI1hr~xFP%-R;`sm3Ovc?4Ste(~ujUC;t)@WUrU z`?Z%4)!9mny`3tPmG89?;_xTJ`b&s8STNp`tl0hc%%r1zs(}4QEpYdrBt0q;qZzjO zkzi1(-S&fN)HBj(0WS&Pjj}5vIRtHFdEPM;%J9RMa)|$1Cj0`tlS?h{m<~OOQ4`8Y zBLtrCjf_?V>`3pma~fk4CNZ;5PEyjuyn=nO1kl=NJVdt8BHk|ek0}xit7HVpjV2Q& zz*gE+$M+Q>y3G9WGNZ0U@I~-Xee;1Ivd7lAG(TkFMbI6PsG#q(1<0GoY>Q6bE5oQF z;A9%+$l)*Of1Um*8Jx8E=lC-QDS8AJvXUSoy7QP7$OT;5n1lHRW8+kATLN1;5xt{=2A3Vc3Qf>)I>7KvO-J5i3d{hy%M^emoWByoShfmhL9}$6jT$vR zqpcca>rrgQ#2kWG7@(P&8T>aRt{bls9csA4CX8zau3geMLTFW!sSeC7mz)bBU_Fnc%oPZ3JWA zC%|G9!gB3xS2&1b7tc2iu_AE^ljc~p(!E?<2t^9~>5!W}hRqDWZF7+VAahJdq zuL9S^_m@PIlG;FK%F&3@mej@^7xi(NjTp68FI0P;mGwx zoXE;&-it2Y4Oy-Tm53C}wX?1NPu6{0L9*_{_`kDA$BRE?FInfV|Wq}j*K%L4o-sRiJVrmmxB^~OVuP@m;SQ0rk=S9lr^9Ku{=i7ha>E@R=GleWgc z;?yD(n>j~hy3Sh|A1b)2_w#Axf#9J`wrs;;=G|&ijp`s7__a|F^_wrLy8r-kDvpxy z36#Wb;i^p7Ny*;POr;5~pp5<8O&+2EXvTtcW0jS!qRwvis?!%pP&D;%Aq!MyL;{`V zPe_YB{VFV9XXp^6nXtw+d9eGjRzqqq-^jQnt;<+s1S*h*U`_XIqj#{X;BroymI*wd?aEf- zQGWs|$HO++J?bt=NQsh#%lte74YA&XGYSa6li=xrt2+T!Zh(k!CxC2HaVG%Kn$Wf{ zMdJ6W+W}Y^T0=znU>@W~vY6>UuAcW?>fTw2eV}yap~R<;KweNNj@S;-$#8^iqTwOb zx84i@Bus})9V3zMw6OuD&;OOATE`<{O(RQeV?+{3W=J42Tc}K#%k7lQ^tBH#%PUvLFvdwTjdsv=7&I5GTX~%j)xhi`21BHDJ!aJ}| z8NI8cnIPF^hKJ-h9uixnW^^=gb#XpMof_NlVA}CKj4FY06AF}D^*}i$QdE;``iL{C6mIYr87<{qpLBrNO(kz@Ygo6PIZYYu>c2+iIv-uy7tXtwJAm#A)G~`)i_(O4i0*@S(Xg{WVI*xFJ}{+ zeU<1=R?5L}Hbpd$*_p~MhiS?c%}JLd>RjVf;>&K19t)3^nd4bPF^Y+{*R)F0XKNP+ z%)u&jp3I-d_!VcTdMmQWCJ?3oFUgc`CGR1LoGYv)-8U)t(i!5f_tLM=rsx0oa}n=hHx@2m*jorI-Laq78{gi3Ub`3Ob747!JEh z@{*Er2=&Iz60A5l3#?pA(dA<K6JA|EZahDVZ~${N{C^a~6C!EYm+xhqYsPT|$Dz<|l>D{!QE3pQ6?mA;@;GG^IHe1zW8v<j`&BlW<{fOva%Yb*>8tek@5^uMdmXJJKWzKkphH&a$92DShnCR zV-Wq4K~S>FAh7gkON0Djdq}a5P{lrs3WG?2SK3GjgV@6)@6Yy#VkHKFlT~&<``nUu zXa&Mq#2~QCOR}Djj6v`|Q|-Bc>`HM*Z;p%#&_5L*QaQX^x1BD6p$|2gC? zA(bPJUMliDq6g)ptH&c$d4)AFw1tpuBT3By8Sgg8peDtr zDd{|H-~ezr&)Q!RiwE_ULqcW=oMp{0?+yq~3nQ$m9D%tV_M1JbYiE(i8-) zcaa2^3w4WWL$RAm7zux6RG2P*rHU9oTBhNj0$!Jlg*S43knYx?0=ZYgZNb z)m;+!rw~I@{53ji5<_g9O;lj>fXMecgcr*7&$+fYw*>5`wHggbJw)hGH0s=>p`Cb2;6wvDV%io90U_haHv$&g>qNlcD;>n$kvGahHME( zAi=Q_P0B`-)BcY<~I&lFR|(MFJgH zpzyXEfa)s#0>Kw(kst9{tSc#<*HR^&SMLVshnZZ5gzE?*+L_cvCoQmV6ortkE>*KU z$%%l1T5hT&UI{b8s!F;wq@$mb#SrP;;bsbQsT3@@QUIQ6LR-1<1(EL}Y%%Ct_l(;# zmP$eNU76fZp)%UNstK@1qjbK(1>9$#)NhM2oz4MQ+kK1*x15Wrq|;v|-(yG)3tTn>blT;!m%dz9B5>>t|gHdhG7Jab_p z&|?Y4OHAaV%}enyEBYb55Cg@&pnyF(_~H*}tCe_w0XjraWew6E$6$ucG?iDeRxR_ZS z#>B8Yt-AR~t8{oX!^fOnM1vH@7QK*3%#gU)TTz-zw8u6Y8&r$oCQW&mlr;%R?DoTpaLLTcmK8nih00r|h?rXDMvQ$@%Y0X%%#~8f#E0IRLUyNM z8jr(*Ku3uLfS4s|Kg$tXz5CuQ=o)a59-B-*LSjKTLUJG1A_z{6SDBs(a_w`F^*bOCH^P+YyzJzS7B!L+D89TcOp|cgfONnkLB?J?iQL+{4#&s@7EL#st#)1&6tZlA{ z6pbq_1&z~jHO{%uMdPb)u5oRuwZ>cZ##`FjG}bswQH{&qLF0QXjW4~q#dymf5F<-V(%FM*kO{-lVIfsrq0@(Xyn0;-a*Xf z7Ld!P6@{$UT(yC;2oe|?ZcrWDGqX(;d#uVfN(qG9d9myI~vRZ5_63{}zQnu!uu zpbOf%!DXkm-r`=YNpO+fJ>|Tc)b|z@yL%B(Ov2E9vov3K*q#y%-_;zMfrMvly*1aN zAMaJHJ)Ac?Pw#eBIqV%%b^`gX)4N@zZR_8JpLVl_z$*0wDMnb!?YX>4bsW*#H9J_{@qI$&qL}&gTyyfpq_u5#4Gm1( zB!QiKAs-Mv$xJtAXB(|{XJT@yJ3ZT*>C0&$f{3k2F)%s|tS~#ta#Frj?|6xaeSWliW9 zuC=iUGKK7rkRu@x=quJQ#}!dhzZ3|ya>{T4ZVVlaj4eBo9)2BjTB2bJZHW1}Z^k)qlLZopC2xkgG<)6gp@npu2hURNai1aqju#KN?5 z!W7uPd8#>?$t+NW>a?Hc7nbBOEu103SfTjSvZ-P}&0oyPdnD|#Xk*13UsB$8@Czw| zJqDCy?*^V@?G!^Dexh+yaaTukGOC*h=mZA1#F>p5-HK)F&}OOtSAqhEonp zZ!~y}97SD$VUh5`u=iZ+aVomqytZL5HG*w29=Sx#zDXS|>iBv?xI_R#Q*1?mRgk7_ z9Tb#MfmJKnOVtB{0MrAesuGMw(?kz|_Sykzup@4p;jtz3nuU5O6+Wq_hMfI=t6@ia zNs1FmhN+UR6k|dh3cpnsg?XCFw_PEfwpUd9Bn4_iDkmQc1?vF>RNQwJs2;qDD6zE1BP@S1V0LDN!M z7?vACC?R(r{m~hjfIT>ZZ1B)Tbp(5sfviu%-xCs0jWAxbWor^DCnL-4hEuzzuHj8< zaZ0i5tXi`y$3dH1WB0u8&Bifi&bCdaE`p`8i$_~06}}9!6gn7U z*bjx72ulpD83Rxg)-#OlJ8s=J(W{PuKbM>_M#|eeke*M+bZVk4PRoGYM*;|fyT|rkxy7x=x1jgb)_+x?j)2FB@wQ%l=)o2A!etuct_Tkh#?u^R4ZA$ zZO~P^F#I`9Ok?KuiRQUPfL|^NFaQ}|yI{v(x6n~+6ZGx)^Jwwn@%jtqGkx-<^7gCT ziWu>^Ag}&X%5ML-`U)DWD5RH~?76q@Uf?7VK1d(43#z3@OqMQCJYBBXrS%A8ha2!W%ikP-Y^%!l=wpy_A)D8s z0A86@DC+m3z<&|}T01l_BXd-_5Vx^G>`dq^3qnAd4Y; z*QO{OCqkcWuMjROfvk7qkV>U(N^~LQP3y*pZXBW;b9l+9azn*t?SDy5YLh-=K3ky7 zEM+(7`eEX?l-85-52>i7LMrTLW%&W+AENvb%Fp4hro3W2xfmroD#rvNj=K(%k(qL} zDCNqBa!hUZV)q!z@i>&DG&0Y(bMJ^;I{Vw2ef2*vqhK^SJ3kp_|GE{rQ9b#HSQ~*qH@3eG=&JQjg4_00r?bJq6~2%8ZIj{$^p00FV31_S|#T;EzT+EHx;j|Jfr#P)KhjmW^q z(#;YL)(FdKhKRN!aKwM<`?#2@3?|)&_1W2JIL-9*bh|TSCR1Tvtr0cBrpH(xPQ>gY zQ9ZbMNr>oth)C~y;6sE}&V*o}UnFae(&|Hbcdvs!-8F;3|2Gp(Sk&3CGnvWk{ii#(j2&!8rGUNfJ3^pR*m^#wk-zWt{JL3IUx%byx2JL(7IB zlU#KOg=F&%<%rrE95&T^hM<`0l}MrrYucE-6~oOIBu9_-$Z&=b8wdg|3}<_)V_%fvj2$#u%MxY)S_7OeCpgisXgFJx;moD1 zJta3HAXSVhl|>XpEJ2R2jzI*i5qcFV(mggrTrPtvNoSo9Mna0pE@>KRk6?+DIg*@? z%XrvtR$(%UhIO{iO!%=Q}t7rzt{AL-U1<^(F(j$IzCYXN-C3SZs^zn z%r>N#SVdtWidx<1Vg2AV@KyAh0XHo6j6}^ID8B$~6RzOGvl3*sLTY*`XOkKZ z8>m=wb)Y5X1|B6|z9W>?%0Mwu#Tl&(^be{7#d7scKBM61Ep4DM6#m1l18xq#noPH{ z$=T6-T21y@IeYxZ!g|8(iqIW`ekf%d(=w0l#G-gtLCj(hleSmX#3J{T2k$ z`9&HvOCp(H!64r<(#ipNIOhdGrSO>FG9hm1#pCZ!FlNf!-UzDdQ|WjP?q5zWo|*sf zNPGUp=Ev5P758-EMU&7Zi@g{byV%%N7-cpdblv`WGP=>wnK6dbYJ>Dsc}tdMjMnGa z>V&EJTtfy?S!paMu`^Za;mQN!EDM2vO8ZJFl-h^}D6`T~_$HfjxLg~}hS@M+590uP zDKv*55TF$rViu8Z{tInu>pcDHnKh=qcK8{IGK8=Qt}<0l2^!z3uT4NG3sb45Bj}a z{x)w1`;jfkN7JMcnkku`a5^#uS}#I@egb%wvw7fHGuyKIn$#*WlW)@O=1KkD*Y6DNCiwm+D>>ZlE9J| zHo}pF(gS8;&Jq+XNm`FT1>u-dc0^sg*sB5I{WRDj^$A3SFfWJ>ST8_yK+ZBCIv9f^ z5#Mnh2JU95LToSw)WI0g`Pioid|Qg}6B`HK2GN*&X;u)Ob%@Ri zqTCA`1yLa)dsudYD5hkVMT965GzBv5<+IssAiB4N=q$nHdohgzv~*j6CiU=wgM6#d zv?DVIP#}ZmK8NQ1w-uTT6=<65XTFNo>9Kr-O$e> zx=Uz+tbiYQ>IhNrQ^zD0_=(3X`W#r{L#2R4Z2(DU1yWt^1kOoE&J_pe-Uk8B)e1Oo zyR5LLRsR%9Pcz#;hM`f6Hs8#2xL+uWw`PhQ6awmYC>mi3JPj|&*hkMoLQ^I1tH71I z0QSK;nv$AOi+&QB+Eq%@=OT?6tRb<7lG#xg8Y(!Qams=p~N;p_9{W-Ep9?Uj?>p^w$gNg&`XbV?- zQH3zIVh-4-LzoLK-7g43dAo^y6_m9E^8QM{0i8gO1SF8hyys9?)Oxfm zbbBKKWOSX>{aum(Xdm1-64b-O*2BP+)xHfu-6&c85EiwO9j*e8kAdppI`HhsZSq4& z$lHYrMV11?lAv1Q@R9idrGn{4{$wmG$^j)8GtOP|eVNW8P) zjY^^U67L@cz`HmVjsex}DZt?pQ^lDMXUEd&*KK9>QxB{ESRK3;aWDu+95)|w+&p@} zaI*w?V)-Rvk`k?%f|ia8p5KRgsF`hy!8Gch<}BT^`nRyE`s%NVQnl3|@$}dZtN&OD zQ!Vmi*72@bR^durz;z65N!_kBf5PE<+~IoiLBMrWaCPku(;{%aS+4X*QKPC0 zLLlC1?Kj{2+ArDvDdFiU!_)27eg#jppblrJ1kZF^!Bgtt#i=@;T1GID0TZSkc6c6p z5b)d(JW-cLG7k%$x0=}?At{Q_^mX2&)bU;v4@vdk9t}U>kd;I=O|lu6PfvqwQ{go7 z>FLCzFmPVsb-|=4DRO!yl2ddz_Td54GtT^_Xq`!#6F@xWc&c8|_B9Z$&?gUD1|x(5 zwYtq)i&Lz$qf;!l7Naw$58ld5emiAV#aq)1jSIIv_gnvR$#!^130C|UG_`;2!qA>^ z7fzd^E0PSJ5tfC{8^2QQj}kc$kjQJdOwfB%1z|}F``}_II)}+z_BEzIn`%GJ^#mrFZW4?d_YX!uD8{Og+Nzk{ z61VD8OKSHkWL@Rygpb-|dgLzQ z$gy1^$v1a&mrN^w%%QBvEsjJrilM&6uqq2|oit()z&IxeB>*7cX>nO=2Jf`^Eh%S8 zo~Ovw)7Lf>=-8OsvTOH0n_x<}{tKj(=cEaO2OIf+(j;_vYmsmClhBy`rRFn@>VHlB z*KT(@6BCn@Q&ZjU^z^g6-powDKN!6Kx!Kvdx#4inp85HOg~i3adzY5>?OR^nzkg+A zb#-lRef_|Jg9k(S)+`&1K5*#J#>Vr94?pzKkt0Ws9y@mY__v)naq{Hm=ED!4I(7Q= znKO?(^5~;y&p!6pxpU{wKmPc;-u1*2Pd@q7Q{VC}?|%2Uzvn$qKb_|nF1+`>?|a|H ziCBhuLI{6#&*V*N7f_K%wNq$f9H**hveade42M**-{@U?RzsLV} zdryj*{LTE$@tyu=<2C&rzwY7vJbxPh0)LDAsei4?b#~_GnCOaGx$WppFf%zzEFpq; zbQ=R695(+8LVbT=j6Ju+Cfbsf?qZ1zK6&}?Sz&ft=w+YFOTT7MhSc6>0V=4RJ8f{# zgTRAju8QU!{-0{8G4q?vb_>IIGj8@|F&W{~&b{lQC84SrT5O~VWQJ0nD0EaFNRU9N z;;bh!=uNze2!>EaV&|m!H?`t?X>0oliJVfbH~YEdI^cnNc$0Q$DaltWVbY0~&E5@=%!+@-9gs#)!i*Q_`pA{kojc5$^3IO&0Jq0!U| z6tqLAc8*cvdL5uxHv~{w9t*&bT{t?J`La>$ODdsb@c@DjXu}a6wn}W@2EQ1%L2NY1 zfgX8_PAAy#l|}8vv6-hPy;KHNJDR8jjbH+M1o?aw+TH+m(y0DPI}~N^<1gvZkOUzK z;7lSTVWu5R^M+(~Z6Zu8ixG+2*(ujTATKAT=(8d)Gz5_1Rr&SIe=*VS8p5WnT#eER z)uIvbal_0`Z5D$TvHT*krs#KQ9&0Vy9RemVwSZm1)Ux3<&#bJX=CuLL;H}Q)O%g%5ftetLQ0%$)FJU04;wdu-2etl?#=(BhN*7&&#Ym+)7sF{4=g<})IEfL zxS90uPM1fR+m1}M2l z%~9M?t>%ms{JaILOkMSP(7b>^6B?yW5}==qKcEjj2|yh+&XgsP;#}*4)F#)hkz2rZ zyHVizIO%=kr<$D^aQEFWwj;3}wL$fEehdHOhhG>?_yTe8ww}(1arANLj~oqoh|gS_ z3=^jswyU4m(SKVaw(m64y4_@P47hHl|ba9G}dcT7L4u3Vgh@@+qNQqC~4m5_67AVXw?9?){{*z zL3IO$<}5g(FMXyMIZo8x@HcEFumU#3b08{lF)H(*X_t1;b^&d04chIEb<4)Ou`$kN z@qs9BN34Lp#ULt;LaTKI(NqdX?v-Dd9fo!k7AbP@|8WKdTY#?cx;TTvHu<<8=~g zFq141Oj+#`N~uHGRqvU~-uOpEZU*S^o2fv z2cVSbLrFNt5!w#oNeCU5pTmkROeTsL4!9qh+0~&4)%rvdcdpOTr1pV!CU5ybIBhG+ zIzUgclyI7}3M$~j77S~Y1%t6jxE$sodysf7{K=BsuBp!^dMtS)!sdrn*cGqu07{ko{4afZ!?4tO={66Uo( zc_M$MeT`eXCW0i^({R>P5P5p?ZgND!za@34jXvj4sA-a@OGNq=rR0-jP4tO+F1{*S z2)DXCBJ>JSdjuA5bQ*5rK@C8n4c`6O_?jIDQ-}_8VLz<#Xlv04RF7uaq1i(PviM|a zG|&i87Q|T zzBU6!rMDIG%SwvgPuSRG zlYn(G$K=8(C|d2@Ze8uX`YcD84;+^#@?VXD<|4$5HbdxN9ehalH%D2}e;FEzpH_;9 z79^s5s1(sCskDi<-m*g>3F6q)|8&R#52z`gdJsza?2wDnB;Vc@tYHgS1&nRcaH+49 z@*0`p<;B5c-X|x9`43%FK3!z#I`ZySl4OSml73@^*ZBlQYfeOkW^6$~N7zpxY6m6J zHXBM%7GV^UXxgnU3%-g=1v0gL9~U{gqtZufL?>jNgbbgBP3|AM6Bz1?5vN0atWt^UZf^G&j~Q&drwO%m2kw#uqhj zjjZ1V1m_)NoHJ>{4mkNg@a*6??$iWCb7WnIaFJf_v2Y;F35f9}9K$#*0vtku0SKJ8 z8J2D1pzu{Vl+CqG8reg=V!N6Xs(Xm)n3JpE)elKV=0lykk<Hs^O*LbKTVtF4S9 z6QYz8f)d@v=qsnORC+o7z1})9icsv{7u+pXIxVh-h_sbX}21Pd%)$k?^Rc4!0ZAEVi|;RcTtm0FWIdo(m;>HbVsf|!7ke>6M3I%hC>mK zCu*$y3((`Vb}|9hNSx6_unoQYvRt;8N9`9Rj`Bnwf@2a?iK3TOiY#oF5v0<-q|$?t zNfK1ZLTBRnMCr0?a*jn{RNzI-VSPzU*e;he^K)m~i!m3Wc9lkDYqAfLv1uP-?231U zz2!RLjU9T|M*G47T1Ed!%;IV107Cndj2qKr<7ng8KZO`~4n`;2Lf$ym_*;6QWK}Xi z=)o_Q4~F*OZQ`;XP2dY*3`s((o^s6zEGlpu1b z{>fh~dgf65f650w?*F5Fz_|aH_^S%lNBd`I@&hGQ&(Z#pjr$*$&3Wy=T|V&I|9<&^ z+W$`cb>Xi8nXj}BGLQ5hWw9Jz7sGG&g4f*V4R}(K?BA=D@W$Q z_}%h>1LGf+4;&c3Q9b|||5f~TK_?2l;lMc2KUwSD!*}Z4dad~8orPX1WgqIcor zF{5e zkO!_pwgxg3RQoY1`mqDm;h?2Tx3fDH=V+u#@o=Z&#B5aN@F2zSZ4PO!0;L0de{Ykr zueOxd`Tl+{CC;3zELM)Dz3(l6DU}vh--Z@sY>51CPHIxLd<>+PSLbg(ZQtAc^=jy% zFqvIhAcy@`uxsC)igQM5rTEgFici#v@4ZuTjvTDizIdnN>;$V6U$|3of*vX>W1iyo z2HARZxK(zA?97Fqkia8Ru$WyXAglHPo$lWHFmr+Ix3}JqY+6(*@wFs;EE=k-y)UoD%Y2|9_RWpS6Qb%&GiJ=SGdYx`8rowD{pfRT))CK z}~lUa?QDZlJ+lf{b{c6<@#x^@8kLlTrZk0;~})pT+XEM5F580 z_}q0ymjJ%aTD~Ch z?U<(%Sk344>$v|~_fJoFMBah?yxtwmU+OB6Z;*Q4;HcW@cjp!hHtovZhgExTGG?pF z+c>aP=jSmB=Ad?vDkyL*VwUFBwk0X~2(s9xhX(&aDUob=;}8B842@A@hAZqBjV$nG4-Z zqs7(XKlg5K5{6=!MHG>>78aG%iEoeL@l|M=kje+hjm4vBub4pX<}5=b8XIWm%s^3u zkPr;pp?iHqEKM`)19|A(pBY^le$g6L2XXT)hbycG*>GuYiCi4qrbOY(K9{}A>?)tb zLUn~u32klOM@@6F8bbjeE#X$vR`o;|ugSAi!7&1o`#p#Xw$O)0u<1D@BHGW zQ7?9WY^rF-Fq+OADqXEl7%oAprohJPgc-KZ#|bkmu1}c2M#}}*Vp|5NIAL-4^$ELb z=rfuJB8fA4a$(G-fiR4D0j3)QGM?v{#=y|och3-{4{4D)1ORp5AAFYq;Y^~T@QS7mLv17Gj zt3|PM^v03Iv!F0*+b!o|C*5d!BG1!mAG)k6A0DuuweoDA}0jzEBxFA zcjdrG6w%a==I$vVxvMrI+LBU+MR4$t%E0x-teZk8S@5vL)vQkp9&IV32XW7e8GZS` zgq`S>h3!K8q999z96`^F1=7QwWd)}a_bYfIIY?6U_02;C@}-s#IMD`m@XWc^^Xv{H z`22&k?TvI-M@mHmk6N`|tnX*>_Sya^GMCg6Q%@y5LY!A~WxniWSNS{2pA@La_)`|l zz~6|!wL2=pNk#E7 z;=GBftltxi;fF-qMx;YyVOu)jr0_^18pt z77Yn~lSD2ZO2_q@1T1h-oE$bArVJbC9l9?A+77;NP;)S^qiTALO z4FN)7MqPy{Ph0pdA(*iIzGsTCowT7Fr8&+!BHRGDbJh_6;JJK&((!=pxz% zeHqi7wxVT<&kX~&F_fMLTjXBIL18EtCRWU<#nU zXk+P-R+2X71Vj~aVA^!sX;=DaqWH+p;W2@@3nyMj7A%6Wq{B;{_CJ;mL zog@Cf$0j`f$LUW4pru2urUeRLp;B_r>h-5vz)Pd`=g%PH+c{TIXq_qKdKG2Rg?h-u*Tiu6eH#g-LJ1~y~yu&nB2Esjl=y1DawO{0BkzBIW)e)Q#7zMQIQ zIEU*l(>_(xK2_5;RZ^iA`I^(T2G+EG=s+#~K$V?FhHmRjErBT>XGWZ=CQe{cg0QZ@2CY2I!Ws7-5h9*o- zlItKj>9swg5`qY8kEmo2o=J~XiBw_CjJ?R~SjpA_B*$Z-d%h)7WEdmZGrVNMI*Y*u zM&sB9V{NBHKi-`w8&wN0w``+;VYAl`9W)$*UHtcMauWNo-JQ_h0e0B915|dg{Qx6M zpOgIXY@9N;g#GrI&S%1S$egh^Pi@!@S9}>L+)2Uy4W0Oc63mdqos91-Ga}oU$WU!i zVbP6!Xlx=y_j`OUv`lCV{P)jIu8 z?Z<^X(K`ECnMlupMSKi+KdmSJ#+bY)(YaD4bxJ%^)rc{c%h1?}9GQBAP!Bcv~2xq4|glynRP z($Ak~6->l5oO7;XNs6Pq@c0|FCoguSpYOISt_N2!m5XUd$|Ew;R4%%0XHO!WVPPrw znqp&3=S-uw1q_XntIWn*rBp}H!%lc%S(8 zuJRjRTC%DX7hpx7t1~u@3NSKx+2#Jmn@19{9w4wooC_jFc z(0HVvFep!6Wx@4Km{yE#AR(Mkr6x=-8i&|Mm|k*c-TvrLTyZbm8MGORMaTtOq8flX z`W91CQUqngA|%NZ?$KLwAK)|o%ir?p=(IP$(S=&#tL}wdk6uVluaGVEpnDU8`xdVz zJ+AI~e81P6c{?MomXI%1dnh^?ANKA?2k0V{e55Uy2*!v5U2Q~NVXfLge} zi9`a2V$;v+sGpn#=tx(1T{sJdCNCmA!-=AvN%mmvjL;F6V1kkvz+RHNEToFM2YnNH zO`oarI8T(g9Q9gU3YAm*4GXtHZ90d6xjb8JUJ}MBWLtZ&rCgZfqiy2=r`ZE;G>!Hd z__K<3pjH`#+3qUO4r2s)`PXBNZz)j}4R&r4MbHgGf!+fr#zEY#4F#l`lv60>UPWu|<$0 z1>qSz-@q;*XA}R26_r`~i+!zNuF%xN0}RR$z-2yvTTiwL93O~uQ9JB*FOmaFtn4iH zHONTm8#%@qu4`#AJuk5}4OSc<^0qK-_(t&pG%Nye1#w0@Rm(zVNJtq7ixCMY%6|6G zu&ozGT&S{T5D5tNPfQybFI#|yk+A$7FBbA!AA5n|g6C{I@vU1=e|+>@XutLni{$7h zUh;?imuP;@K^gm6^hR1w+0|`(10dx`a@PTTrJ8GlpGB^XZX_SucHRfW|Hm8j_2Y+9 zoN}$x7ZoRVcVrph=q3~DY^4QOg?>HjZr)3-c|7XJO>m}c6l7hks*Gm%+mdo<-sK*7 zddpES=143q8ZYY5Ydg}y7yj+&Q5tj8nC4SDhn5QPjQMHKK=R9C`-@`E){crHRy8Fz4uTt!C zt+vunB^O+!*zvMhTC$&NzJz&Bx-#PSzHrh#yPzM-TvQ#yADib{@5tp+75)7Anf!B~ zmYQ^{nF3t+!ZfL)ar!`ZGho;0D^E+c?Kh+7Z_nU3bk1Yi!0%t}j1-5eh{B~9VvE?+hAk4#?m8pIi^{39&jgrxUNQgAq^-)#$=@=M&IFkD z!NXyt91&845^~oW$pxh>uL}mi8BRd)IpJ<-(3O6+4DjYh+FpkDOaTpV3c7Mz!TIh% zWqAAHtI+BaxX8oX09Qd3+W=PqHN@JPY!qg2k^xI?y%UV3Q11;({>wJ~VfT_*JX$GY zESY{I)g5i2!5wW~aT|pToXBD_WdJV(VN$YatD@&Ldre8?4!rgf+=`D)RnjA;KFs{z|C=&Lwm-I< za$A0d?bStk#j5J__T4LA8Oke326MJ`YdoFV*~aX`{GmaA&-A`-Yq^JSS_9GK;$~-k z=#K1@tU2B3WJ5W3Q5R1mBu^GAfFv!M zF^Xz3n5NWWb47&xgR!O`i|#3r%_X1x1>)BE!FF@L3?yoCq0; z+-Bo6&H}(;UP#TG&}_kTSOF;f+4Rn+AAT^s$3!ivHqYIn-OY06(N^SWbR!;FH~D7B z@d4gCAJjTvGmE*TQ^m+iXH=TaWN0Vm@U;Q4O-A+s?FV5%mI2JiM6ByAJ}5`xCB*K) zj5y@-weU(9GbFdlFWaZ2ou4QU=)ul>c`(&SA>orp^WjZK+CJ4dgCDDdo(S&38qa2Z zKw!%6LBUu@ zVj~UcePSJACt@8X+c+-ykz*G{J#`z8BAT_HAdk|a=glxI7U%>8lGn-qr11ily<5#2 zEW}Pe_0dsxRRtj4RsPr&DUmkt-wzKBe^sTo*8V`5jHWQrXG zY*Ll2PUA?blR|5;THZyQiwP6Vr^fP@gsm+-H)Lvt{Ww4o=7K4xlS(!OC%DOjLL6%6 zK|mSnBF5*AHgO_zIA*6B0EX3N$#@nukKh;4p#L9x?;dQ~b=P<9z0dRBbI!fzcDMSe z$G%4`>9#FdG6;2B_Qburte0hBkx?g8-A51c-P9OfYyp-`{Vowf8=c+uiE+s|u-ZpS{;! zd+oJ;>$iUI^;=H(G!2VE`WGcT29y9HT2s)1qbvx3aXSd&w!s3jBGbjNDH+?~Gcb#& zNE6DPBzJ@RVGWV+RpMwSK21?q+)kf}qOI1MGJ9#u47|ZNS+1WcyB5M$Dn}kJqsglk zPazkQ&K#5r376WvDs`e{0y5+}hJu2&H&c-U7CCVq(I<8|YRQs|MKFY36Wui4gyFI| zNh?z|+%An&2hT<-(54htuMgxftW{6wCe?*mn%%~EE;z8D;StFbe&nFK)&QPV7AN>? zXNv~RxV=W+_Umi}y)(O&+9rS1fgl~cnQj;`vsS#cjYW49Z{dZHc^C-9L=Qzwq!b&i zGIqx0t&HGaej}9$oAV-B(C`ln0Uq*Y_#hHN4~lp#s0*4pYL-~EKub*tXK5I0SrDvx zy^VAsUdo;vT^OK(e?gG2`ylhLUx8)HXT|Gj*@WWtGzHOqbkHRGXmCMHU_IDCGRXaI z<5>4`;Gw_JIM%M{IPk<}7yyEBZ=^xO{Xy~D#-Y1W`$RmH_8EjCm&=$y#~sZ_q^1%0 zSJ~FF^)!P@{Hl5oo-~6z9UD-&*lh+u^vfo+e3ls$y4VaRZHIlbZu2Y34G~TNfY_ca zX<~*!Y)9B^GKJvml>T$brFJ_f)1-Ey>6S_DN0QXe5xN;tJ47fMe=@F@O6}tviRlhK zT{-@nygqh$UHiW}X0j>`R99YJmo+NM>s*grW_N-o0g*jzOXPFZ4A_dxxQfeouv~2o zLasTMy*66Qj3&9Uj43l2*UV)QQDKqb0BP|FK`b{)@_Er+0vtr+p|q6EWN&PB3rnprQPMOe4B z6;r@#sZQ;w;Rqk06t$c^*E+?rE1#dCsZu7OJdf09Z)5RWck>qTFtc*<28(tOU()zU zqZuf^2$9ucTI-H9>RIb?R?pJ2dS+MEfKaJr_`E!z@c&{i!7Bihh7E?X=n+CEwR zi|?GUWJST~X4@a6eK3t=Q?yP>r)xl~(M_aM$JgQ{k_}9DzI*DCW%8C!GW5uLNRNn;RgY-%zR3f4daOtG zjo2ef75Zd7I-Gh$FX?JY0Wl$0HG33}0J{t z@kl~y!RUeAVMNBI#;m=C9wFpOBos_8vPbtX?GdGSO@Qt~kKVF-k4R1yd&I2W&#ZM? zJz6zu0Y)}!Z(cfUl#*C`$*j@U-DZt+5RD$anI4(hGQsF#dUW5?9#MMNgj7?4Q45dW zynBxh*F6G{$VU(Zqb_0A?p-=-l-@Nl*=!Dv?%RFV$om&zM33&JM}B0lwrHtuLLIHO2JoZaldj2hkByTDm$PA)8Q$}y2BOQ`5L6> zjU!Uj1TPPJ@gMRnd9)ARI$ds}9}8(A0#Fj^I5AAhh`-cYW-4m35{fa^sno<64>glL zEwD&?N#?!uQgv7yQ&q+iID;V^&UZ`pWtL@Tcvjc1)%D}Ll1u1u#J=fQ6q&rsoBTcr zM;q%Kcav^j;A$DdV0|)o!0qNk_0`U1IirY&5@)vrQyHGR}4Nw zV|5qz4SQiQ-lze}LcQe*FVxRHN$MHzUq0l3?sG_L1MkWU9WjZ4W0Ae0%>Hvf@M6)| zHAjmXp!9Fd{Dmu*YZ!{y6CytvW`-rGg_XEP%<<9oqrX}i`xkI=?gg~puGH;*RJUQ% z?o1|d1xaDAI{?)Woy!>&U@V=OMCq9M+Dxi2R}zikYjay1UCC2dP{_Rvdy&wKJPuKw zS92Tc3(}qKZ78F;o0IF^03)?Ny1ivl2ySl-BN7qKg4A$(Ph@d?Wo9%oJSDfc#ffYL zBP-?!1$c1;yG#_g5Dj`QW5w28+c*KK68jf|X+m$!G^zfE78&X2F8n=c@ytUO=fPY7 zz(C~*2<)+OE2U+hGAkv9*xE`taoZ%qU5~I0`YIPa(w&+8GJcoZCMlNw4kJDBjdpxwlF(C}1{Gb2nXa6U8`{Y!wrhl#abpF^oLZ{3p z9=j5Mn_Wuk6tlmB&8n@I@8c`@c=zgu6>Epd>X2;?mc6MYegmgBeqG&j$hK@Kl*+1P z$V+rVu%Uo&JJg~8865vuZ9|D$b8u5jdtkX}dCQ(JX^0@SQmNZ?bT|8)WiK!t#*KM1 z+nZ0=oBNNa=JHWzq=U?g*Jp%-u_T2|9L3g(N3(TA89;mG@o21Oj(rOX#>mtmD4jVn zZTy9du?-O1AXmI?skex|hYYMDL39~&AzhI!r|3i1<$|@4LAQeaHtr}ClR>(`mBD^3 zP84jcj^$%_HKUg}d?kXJPsqD32Nz(eL)tuFixANAoCx#GM>tU}Wr}Hfw5|wLji$=& zWW+MY=BP_fgSTuGIUBg3tnTzzRL5pJbZw#Agsy49*x=^7eMQ_jsoQNgPTg(UjpI?V z0o&y{XLf|}q5_86>ZMe0)6jJjrwWJ|tQo2J)WQhA;1jc_EEJst1A(Wdtz}_dL}!&~ zY13O3Sw@+aEZCeMORsBuz?ZHf%UB-M#0U2I6)|RtJA)%Aj%+DMz=;PWztAydijr>m zsKk``GsY!dB6>>>B(5a>vmi5btE`~ki~B?0H5@kF%wZEXQ(sd zDwdQQ27P+AQI77L9ED)RRR}BM|0!H$Dy~AQx@c5&KY<3GOcVlf1GOlCf)?ep<|@JJ zBl>IaZ0M@-+V!Hu@Cz792|0aeL^C6Tc5aCzSRK;i;83T}7AyocG%a+yvInuDAK(MW?0cawd&hm;y6}N@kz~3Degv*I4m|%E2%MC?7?YmH9 z(N+v^qj^|Mm{sE2+Tm?XZxAIE-ln>Ag)DROwbNuL1(1kTwb;pIF_z7Zoa&8@3enMc zw&l|xQ2P084(b-o(j02Ql5Hf#C<4tsZ3*u9G~naojXfR))uxCnAbde0Lq%j(u40~T zVn(3*5!qQF8i=qj2*oAgvrgfN84XdilcuCwBnr2YDBQ>?oCMef3MW%)Bpvl`2svqM zfmXXLSQ>^n7wu$i3$zLbl!K7bt@^)#*_oJBy~a&K_2mzCYy@&*Y7tv=C$p`pC-)-P z+L#SJ8G;-9bm4(UUD#3*Ry*-FNAY+Gc(EU4A+of`PEwmmJRq0?LNZk()lCGZK}cBU z{J#%ELN*+UrJJg~;@+PN5ABk~K(Zv@D$y9`-@!E|N-dr*jJ%Nz$ zaoop&kPt={2ua*yY=lI56hLVb5|%*_0i?7y0BSo7gi3oIc(e?yF(uX7TKDi*HP?uL zwRI!KHFqMz)}uAwd9Nc>YxOHa*K*cuSs;<=u9 zD2UKc%4;NxAzar^I@fNF;p5tnqO&!LLu?I;auzP1F>8N_lRhB+a+MvBuBa8hjLub# zkT*?{zVsgOX(FJ#cZ=4o{jNV9Fevif(4ny#MEG#XZ=LKL))xh|GX7W88Mt4x)Id!z zgbS9tvYGw!Y-WFx%^XT>=BmVI4mg_;e;bO|NEYE6Uuel$CY)V)F3-i6)BZzwh9XO> zZ9Ix#s#zlb;>%@;Xz{jHd@glPq%4{rc{XCyu!x3Us2m~P|rGE-9E#Lx$xB#VzVs6qQ=K@%oj#7&P zoO_e9s3~UDk0Zq#i3>Ddo5@^jd6aCkBkY!spSFz|lBtw--nl>sAf?a9?Q?G5G&O^A z!>2_1V=!dNOzS4;K=<5BX-Z_$&4WnpDiG6QW)x=J=w54XjY;dtD!P|Gip{`mibg>bVHh&LLkvOJgs7n9qRbtv%XJKF z%eq`!6@v7QRY4YKtP0whwjgs;Ci*y4RKgdYJ{ELkDSeb*Dbm4puAI22tfqrRJ6$Fn ztSLoWQko8130-nWD0Bqh3_3uF{?%d>>-QOp;%|D{$sn4j_SMX6&o9j(DAgW>F9M(o zFO~wGa!p9u6u%gzAjQgLrp9VRqtTuq5WBsUuq@BlqD~ACzYx}wyeu!Xvc`J&N$pb^ zCJ`X`RAh=uxGtI#k>~1!JPPG?qvPsFV(5kM}hCd^lI~Y0a;!)dV$blSEJ-gb&m1&ShLf+cE4dv0d%Kdd{5HGN*0+aG&$dAK;HIJA?Rtbx+Ju9N z3Z}0`*3FK*#JbIYmW<%W&gQg7EgyS*;LT#nT1&5EHp`OuI1kA7Jt|K}J86}j9Q48( z#05W{dlVBZxGL^>nVuQk5C>OlqU7ceydRvz55%xFFK3WU zPuiw!kh&9|ZE}W54pGjaRJlq_t>2df2AJ6EkuN9!CL2vTBeFtm)YQnLST(OfliaB8 z_nq_`=c8svGTUt5^wx&>VW!{a)iS4?LK783F_CdKM8n54aiLZO-Rt>>U5fm-lWeE37 zh#u>bRTu8M#g7Y@eNJX;Ao#0T?JcX%1y^P;xY^3QWhq8bnlymc%6!f47y%Cov(Hrn zbT?lC(5<$XtjSt(Re7Cc6s~0wbzsyJTMKXglEo;Pa zvy^S(b=L2~!v!&p@e7+kB_UFp{>3<^{Sv#Dd~2?VI&K0J5Q7QKfwbiP)sRkEZBl3O4xuh6q2@m6`Rl4qyE7ZCyVzbkVw zDyhzP1yOHiyOPN4d;cT~JK2+S&#fc`{3!R4TTYfJfKDpmOo2`=CKD09Bso`%t`!i2 z<3#~6IC578#H5!c6`_T$a?EN_<{%lH{t8A}yq#W|5TpaL^8TWPfae$2l&Gbmq;O=i z4FCfisX#NAjL{|HYRL^#I-L8aQA!b$mRbX`-Pn#fGfYvt3hv<@#>LuDNW^)n! zW-X{f(rbF<0NIlC9$iKJbG&KEh5RYxsX0Rbooa~mrdLemp$(4%GC$8;R<7U!AnvC- zGc)8RXXUyQ@k{{Sm{IC@N@K+u%4)($_@!ZvGGuUUm$GtgIsSyursi-k8PrL}E;=jM zx{&!YF^bo%---99;h4#=k(Db92h-!yxF@`wE)CeCcaou1nIxs)?BQ_LNQ5lz=}T-j zadm0|&ILsoK0{)in5+tj+B@&Z+1oVYgfJ-WdP-a{1VoA1By$ee3n8**n)-tCM0IO{ zCrSg18_BQY%4OkkvOdX~<7{O=S3R@Ibh)z3QFhj%m;h?bZM1#})!$GmaL6h~V=^CO z6rtby$dCU>ALz9$A@yB(KsFIT={6C z46O5nd|9R}oGHg|C8C3YsB3IhmIaKi;eY3UJLW)LJ4nc%xpx2#7T|#n#ytcDm!C%+ zBLQy=s))Pb(d&WN9Yt9x`-0MuE<$hrD}vskrO-PRL7;e~NLHX`SEDB_!0&JbpFl?? zZL@QbZERC{cd&KHlMr_)67VbO#By`)V|T7%X-MX;D4Bf-32gi5!11hnwpUvut_Hyf zMcFn?&4${F8?q>Yi9%#Q11%XMNk=+!Q`f7+evd+@*46^IeHk1fO_-M6Q4EENw zr0gaKv7l{I)J$h&$+u6|BgtsWhood|F}L1^VXO?BVC;x6Z^u|rK^QB9k-jO6<@)T5 ziu}I;#%>tKqP96&;8qf%8`IN9TcSyTJG=7BjT$uqmlVtqRU(=aHBQfn9?~ok^ zf3LRGo@D>&mIqN|1Ym)?+`PwFGZRE;#T*J71M_3!l(EPU2w;l+)9m40@o7E>f<1^w zSegH6oR?m9~L2!GfoZDR&b@IVeG#7$^>BuURaFBe?)tIQF@XoVfo z&xf&1U!-Bph+2;77qsYcf(Y50JknYwvJD{?RAuy>FYivsb)x-=;xZe7II`I?kn)Gt zYIJS~PtaH=_og6guuZOK5jzv8b(!-0=uLnux|~Fv_Vi=%_a$jS%q-d~Kw&Q>B)%EX7+RrCN7NC2KHV42w49L!uMVThWTh;Q4a* zOu0uX*x2(FIIj+JZLv3_W1Qt1>6mC3J|~@ww1kE+&e%U%KMhLmiP*S_pAQvghs3*vMUvvr@Ez4{61~c611@ zt;m!n@KTVCRl#w&;#o9B3YoyrltfZiq!F$tKrL$#9H?u%Lv-yn0p&~+%h2Z?6E5Y` zfxq#JS_#}R5-kuR5e67*APkt)jtB%YLB*91UMnjc)&db(9efzV3b%|jpL!BLaGnFe z#VD{Wyup_}|H3FPDTBIFwu`Koh^q@bDw!lb(K4m0P5q+;GTU3S3DTw2shh+VZ7&3F z51GA;ujvX}LLP?E<0_8n@%gwm8Gy^y0U5>?)BwuFO>C!}Htj~qT5`9C4AdJDjE!dl>wBqjne zVhruP^NYEo9xAm&IR6j_js{ADGK~X6@k`6MEm+#d;2~t7OSdgdmu_32RD*%JlI)|o z|6mKrhXP>P+O}|@Mq7Jle%k_5w0YUv77_#$S$r{@6_C1=;~QDa+48E*3gQ^R*;V;g zm{i)V0L@@iNf;&0*RWZ^num#pS-+&s3N+bEO)gmQ=laAs^qHJ9GF2HZmJLEk;b}`u zO`0pB1*=`|uMO@N(u5nr`)$Ix@dUvKM1{q7fmV=Z;^PI^Fl;_j6FX)Dp^Jll5L8ofeBAuy0FKRUxHjnY)<+Z8S-+d3Lm-zP zj#SVujoA1I8T(7w>2wSVWJ6MApqXMxfoKMJ*fTSV`yR=VCr=equDQHADx0!2<&au$ z>8CKQ9kk|bZN=uC4hqkdKioyDwT4Vh!*y4J?bA6hq;hOhwhYaeZ4zV|kin9)xLlaE zMnlxns5^ibA!#q{;7lM(N!6E*8n>W!#F??jFIP_n(xS{ko<5x9)sIOSlE)iSh+tZb zJt2C@>sgyiKZ;>U+%J4IF~X&F5w2yO3@tBCi=822;0@47(C=P3=o{EWcLnwaj6|St z+4#&DCfdy4iwStKVp?QkYcw;5_h?$=s!yXfkuHi0(%g2Ea986Z6tRJe!NF}SVGd33 zUK?nLoO1OqO@&fUuI?1QAlWii5+qu+lSz?kR5C1GI;997Te}UeUNB1s2f~@6(Kxgu zbtyUWmVVgOiBvb`&0JcS9STY}v=Z-RVG86xTb*r&Oghr^)FZg%GW<%m+u0GzCM6(N zoa7aVm3FBu9Tw^_cDdEV`chp^+L5;!bCD1yjZrTwr+vFGCopcGFPTRcmW*<4$XsKecTN>P?=qawomPrfL0$}|?mQaAY8 z9Aym8B;$sayllu7A>@)?OzE4GXx8<>G(^pc|9{y+O``PUixiEdJ!Mi(EK;rY&3z0^kb$Ld+f{kQd25fi3E?F{g9*i$v?Qyh6w2Z}Aymd4hb1SQv{bXz}bR#`w!x`D_<5n>p#ZdX-rgo}}9mH^4a*~XA zCpnSXeW#dJdub1h(UTOIWXCz&bUY&vTekM{c!%ww`uKPzDrLChuUb#RHY|FaBO$p4 zBL)VqE?y*lbUG`(-#as$+S>(ks&b9V4W+Z%A18%vAvaW)!{|;De`n)Kftp=L*p<_| zkKuWk((;*GG(}dCOIR+fBz)$acxyX2X$(hXGDO*kjvvo%@)6y3oQ|CIn5kVyot31! zllK5HOzoINMkxp%AkiKzgh6Z0HERF1cxf{7ghd{oG`cl3-}9N+Ri})*en=Amjl1Bb(99_&~P|2;M)3YLl$)MFxfz$8t1gNxb!k;cVxE7=>$Hmh$;F+M3$U0v? z4$a=lpMlZQff?3{5s+kbTn^06r3_LEVjSeM3A6q=0f^`_zH*~ygc!ViglRR2tz8gf zic1;fm+DOBi-Qycuu`Y_uFi_Jq0Z)IPAHrVJX1y6%2D!ol+bEZfVJ2+pGOhSd{yYh$hwMXe$2tSLkRyQ0E& ziTFWW(#wyXEeDUYIiOb!P80t>M1Xos+`p)vJ(tUK&((+giVvs>9OuUhijH@vQBBxB zpgxqt|A8IZwzar>AA*=2B|xZ3K@(M0ojaFLzehID!`gF?sHyQO5{%HJ?LnpU?FpJN zNp9_oA_C4xmOGczHvbZ$)VmL*wnqfwj13j{;aFnC_hFAw`;3an#9oZ`LA0Zv5oYvn zc&6+r&}dlpPR}@C_CCUg_~uzO+?@Xv0mbgidsV7QT?@ep7{wJVKzIXf49c|>1~nkc z&85Ksr=Ah$qK3CEhA6&^MURMqwQaHjDiF@QnR0Vj_>PD;NF?lzyeYk?;p>4 zJYld!^>=yGw5d$^*H6gR9&Pmmi1|-6S#p-6mpz}Z`>7mdCzj9q@cB>;ywM+b^KPU@ zFQXv_ViXsRenpOkk^-flS%|#B`;9b2a;ga3Pu72TQF;87Iany;DczBIvdfX#si9$OBKhr*AeJFKa(zz+HOrm~$F-3c%MMg~52Q zP+opT@aAquR1q>_y`?#Vz7^qYWbq-oq0ER6YGXTdu4SsLtv1JCGBuCdRbsjG7%=VsA_M8nMNOxVAVs zz^=*Fh~~eK=vBTauBMb5;%b}XYLtqrg)JhA|K>|@rA=VculI()jv`lEYj8E*-rm%z zitoeO%vG_3t%*U4ojt&+SqDF8Qpen;dDS)ovW53)E->yfp}qgw*A>J@i>3$Yak9f7 zqMQeFXwc81IzLPt0EXGC8K!vPZv0ZuFT^f~kfW!32|lH3<;n^c}v=2W>3vs1v~+|(ZpPoD}TqA^;&B)K4d zvBB;5{v5MwjP*mh7OT^5MP7Std#Y8rG6iYaRhq5C`~>kepVbF%~Brh)%2iF1&CvQ62VdM5?ol7e*`^{nT2% z9!ZjnrAt_0lP$*U73}dkKu2J6oR5#ymw`RrPKAJlC%9x{-oQ_omy~~`|4-fG`_;dx17Ei<&u(YX{0sL?U6810>t{f0w6T=h0lh)`InlM{!4rKNJd~_ zB2&7lDb*^uiE`m>dP_I;TffoI2a$xmw3>viAX&FEKfhGdsfKVLNYHWc0BCipA!qt6I6_e+oQ^@ns6Qub`QT3s7gAo$6@L3e`#^bruM)N?i zKSxz$`9S8!E|Nc1{aOBiJgJO`uelBY=Y=F+Hk?Gz+i;@MMIiZF6AcIyVkMB44GF*v zT@hjjRu`c#C_?OQ7A2GP&H{sA`WOdg-|3%Ib5${F&RQ&}>W(U`Nq_CmET;^&8~tj< zV;fk_ohMwlG4LNKo^%mEBN~2#=3{MP_bbDRQ+@cFJYbB}mEmJKTxza)aDSXV^E-VF$G-HkwjUy2&q=tugU-V?>U@;T3%XP79e{~2Qi zV;|gqWV<8CcEFzae~JI%^sFZy)2|Mmtqy+O3^Ryuv`2W6gmdFbs8A>a7=m09l#QtR zrf1Kc%WQUfo}r32vbgtZ9OK)R5)0@?KF!~(U-VRxlKt6K4 zU<~V^-&?QT3S0Kz_>WiTzVY2pzVk8b5IQb3QGvosd?UVu(yZ<`yG<<`rvDw12%M7S zUw4gF>OD~!6gn_)y}Bp$*OuF@4Lp zi8jRa>W5!BVUe>NF90QdIlzFr^o?C2RVUPt1+WdJoE*S&13(a(8^GH|6nfR$AG7{H zCsX>|0A}prr+e4=5Jn3_V7UG2`@=y0M{mwhBaCpJr8=nof~osGGbN<)f91pgtU<(K z5)RZF1f~ZGFSa|JDbd_u3UGESN#6Oa6pu~EHKC2>O&Z9#^UPkvAvT@}7WzjN#Vfqj zsGyeFob+Vbec{R4&N2E24K@EcY~B5%YB^)j!5=sq+?w~Hw(CCAAR99wL({st&3P~w zM=j?;xqfE)b9(nMMRq{i03{EZL}{~G(QM`6m$wI1pW<6t!s}-!s$c48xZtD4&xTiO z=o4$Nr{^xSE&Tt=FBRdSOF$`?JG&CDq_e)*{ zmysCPZTr5IUV0=u{A~F8T!&?uag&7Os)Xjud}~simdeA3Q3x{<9W}WL(I`-&;84|l zzk04=`;>8xjrk_16S`e}Aa1EcKc`)NrpjKAWXX@-9?Qgv5PG_LCU-+QYjhyiBT;{o zO9V7U{6k) z!XBj{HS8HSv4>Tv*4T4xu$13s5OIgSKqfAOH$Kz`-qb)~{I&~Nvq^_Xf-bHPU1?(U z;jt!bUBe!xVdp+<%@;MuE6d7JSG98Js#k6d8-J2I3W3+6S+^R3f39JZSA;QYz>jE) zHGAx6MV@^d@LF@gP$9L$S`Gu&yz?T`rf*qZTqri{VWBWXVWE^;E_(!i%_IkJ0V^k1 z36N^S-dq$9J73ED2Em$eP$!nrl?*?MztLJwaiiNa<9ss-(j9zI3v{b5x;1dR)z>UQ zd_}j`1RtX#5HFoA1&C0dhs7zufl|5#yy^B0B?|-laU> zfk+IbTq$rO-2;&hy@~gP5;-}k3En_+*RP&|^L5B4BXU4y6wTbgXAZJi6FRsk-PH1Q zLT3yNVsg5AwsRVH;hHJ>1I?dEu*NQgMP$+F23oZPh-BDxmIcFcpmMT^F#vN&n%LK% za=q%MPO|R_w28`%p>iMX)F}#RRNrta$B#Zd(y-9bPgfuA1d1am%3_Szd}>b)%GBDg z-d{w^y_J#;VM^(f?Na7$Hzi6mR7DRQ9M zHW0yBbsG>y9e|xtMWb%5MdTjGZAb=El0gZQYEYurp?(b|?FnsC3vC!{Qj4`YDB(<8 zpcW<`?WKFnU?)&|W>S=D5lF$D2S*W^2S_Z$lD9sC`Z)kdOUQ&_ZXgqkC6f7I1x8jC zsb*@7oEVL$iF+XU`&j8hTdT?{vnDgFqzy`MOWQK}pG!jukA)?^acLBVY z3h601GH#U}%l_~?0jHc3VnHhS-MWCg-wJoca%9F~xWIzU7a|GdvzjS&0F8`&b2B`n zmY%E2!FnDe=ud0+@H^u|1+tF+`Tv4r49){m~V2K z+)xi0w2DLiAPs)J>qEZA8vOIWnHnSs8Et;LE>OtDvFzo#z=86qx`4+og*#B}1H#5^ zRDIy5_?2a0`mS?1>{N7*RO6SNK9~rWH7M|ta|7) z(b_#+?iQhRGt`k62DfBcW#?r=vdvOPB|EWjz`~GJAj37R;|MB_x60Jmw+7YI|5!cc z(fY-H$wE(!s}L^!&on&6WDn7>_!;9WwQr)%wLdiqpBf!eUasc<7c)Fgejv;v49~+z z3vKTvm@$Aqk)gh&Exw1HF$!1XOKz%)c(MuLiDvopf&Xcrye= z#!FfuKRKivg|8EGCLa$yQXtq4v@lGOI$+2xi;SH%!l!fPzstFR_1}%zjEH2XRsHF=so*22 z0Qp=Y?qRr2qe={s`qbPv)Jf_8VVnSm4y%C5x&ad5D%5xrg}+)u0tO>UJo%3dHV%n> zX3mZDLla`10R-f)MY1^~vmO(c$v5)pLJ~51hU=%U+*}e7_5U z1AO}cwHBUsXp2aOtorOv{mQNPV^;5N^9m?RYr5kHlPKD`-;*Goi?39YnI7F+d$XU} zc=20m)7>9<^{6taugWobZw= z#`5ba*O8JAhnu;B#mXLlSUu~Xy7sB(CnQ%tRlHB)^%HNIaHf={SvR^L#pxa?WyB?# z`&uDFpv+m;a!+m=xh)_eqJau9XDLHa#YVN@XB`%}IyXKY60-N71e$B~hSMcdpR2tT zaL7k0h=aJ6@_kFn_ft-i&s4wKqF_(6U_^n=r}yD^xPx)k^@kL|I8s6U;11VZ$+5Rkel_K| zYyy_PhC7s*RI9qh3Z~yHnw2GSlNn*M%p&N9O|zhf@Bt}}m@-EH;o>>SU$T$OWFLRj z>-J1R&fgVy_VmoGt9eAu%DJUwI;N-&&B;$yk;idL~iJpO_! zm35k7dsQ62UYEVJkKWGG-Ij!VyIo<4Kpkfd_bYd2R7ja!IHWZyUEB7jl-ZZ(-BacJ z%H9i4TJkeId?a2KuYSS8oceq>*SEp65b8gCKDaN3r^=_E#}bl<-gGVMxML!|g~j?O z2*o6Rwd^*()c6A53fnqMwXE-#b1jSTm<7hnO&TbilL8IB8^&jj)(C}egaQEM^Q2*` z0L_^>z+%vUv z5RB>`vgp}ZQYGhQ^u{Y`oZ*z18KBkEv@17Oq3o#Ekdl^kE3=q4zc7KVSSzM*dmAPj zgfGPQm2@a18Ed{i7WXm!+Ot;NVq?gr$OBs#>8MS z(JdAtJ0yECot~_9kT@`@u9n1Zlo0&Pr68a`>nlF$b5!}~I zMne1}uH=kGeab@48sr0;m;?9Om3EupWS3KqoVv^YM-DZoT41)wQbQTAnR_C6VU)u& z+nox;RU&PLns)9!LIkC3y;yop)~Cw@X_S3%5n1z(r8%fn-IWnn2!82g(|TeA-W1*KQ}C>Vnd6ajdAKlEwVF{EcH0R{6Z zz7^BDTo~H>Yx5ZT%+$ac5oK+!Lq~H9Sg7<4jPP8&V;hm4spWG_Enn(lBl&D*o_cA_ zoC!_9pNajS-E^OJQN2-7qL1I1T_bd>`tM*n2GdQ!)yVB@!YiENKv2B|f}tx+OAWpX z;~O93Tc7QOkELd>jm@^dGk%8z-AUq= z?!jgTJvi-TxM4ZNsRMnRxo-~bl|amQhzLQ6wzc`&PUQkp(z&8n449Hw=8WWj1M5f{ zexb-DTGQr8G(#P2WTzG3RJS8RD3yaSoC`8z!yr)^CA$e}jT4Zf!<@LrxTlfhUCK@0 z*QmxlKwgEh4Sco82MSNag*1wRI&uroi2iT}(}7SRkj(N^7Di*Y1lAOdTdEJkt$s>c zL?2+$l&7cPEP}%&juG1fOu&uQNe}V28;n;m*aoMH2j#G!%zPO)L~_qgI-=?#6QLDF zGh`WrBu0M3`xyBV?-lLBkV1WPTsh@ij2HNF+Jj8es7YSaZ?WD>oW>M7{nl`Iu)f1W zx4}CgQ!#y?9*@?!b?o!YcU$R4a`v7x-^K~Iv9`KXCmj%Hqs0uXorZ=f2>%S)4ZC28 zA}q88gn{Vq{v!}hke-6t1FjV)519SkmySOR#sLu-bbK(B=9rx#PB)+w;pV%-YVeTf zu*}-i9d{D`+AyC+e%)NC9hB%9;RWteyWOJ9ftcupg|c+2&YhV&hB(%#N%$uz!9lP- z3w+k+TlC-*P&#+6D`N%&6U($8c^tVb-3GGbKkP{nbyp}SrXU%z-Lc&!6Vmfc2{dIW zw}BZEtByXRh~y5~xjp9R1ZjWyx$U%0YLMuygU?ZPr>uL(fRQ=;t(Ij(kt$<8XkRr* z=|&ctnz=G5WDmO~E4AH%?$Z$^sjw?zeIQnn7yW;u*)z^VFym6W1#<_>w<@R!Cw0*5 zY>$aoDxDHWENOxRl^A|y*d|)X9p4~y8Rq7eWJ5CEl%_Y^dMi7tH@M>U4w7Z_<)ZPj zVTPmUmeK-axwaW2#*~w47>TAYL?_J;VS1&9ppMu5=RmxR>p!)&Tb(Cf$~sT*BV({7 zC0Mz@m2-raKE#$x{Q#(ee@KXlP_GqZbAW%83U~8Z;gU87vH%>Fv@YTg!&N5Y?VR8R zmKJE)LKHj`nD9#Uk zM1;Q2*(f0#rusA&+4Ltx|L_<;W6$?Ao-dSqD9`gIfytaqGt4j73d*YY$_^`WJ_~OA zC)K#HQv@3s#l88Ont1hIuW>UqKBWGLv}Ag?kDuVzKL~NiY+iTl>IAC{ftIozu1bDs z{6!nh@B3)}TRK{tWb$#sIa)cT4#c=K$y1mR>Bj(GnMZ=Vozt?#D%2F$$!+lXFriH0 z!Rp=G22~-x%uDa1ebf-;poh%Y^iR~M(ZfZKBo$l{s8dA%o;F$F_fwhxIB;S6@QdoX ze`>Ihya0hCQMmFuP zA-Jb*#8x+u1I*^Hc~qQ(0SviN0{~|dxDX~4WGQed$g<<$0yOY#&4Y5_*v3^^^`){< z0ML-Z7Quz0Xz#e4qlPkOM=X}Um_kIQtqQdd3hN!yb$u5hGM}Me#-#F&7*C@M@*!DF zCN0obh|_fLqPAFUHa>lgAt4U3c*!^8yJ<9^(O)6;DheQRO`WaDL<7-5U%Dt!rl5Hm zU@CmK0Ai*U@ljDl7KGxynJT-I0N-VQhK2K~-t>2b_^i_c(s-2XbF8<~rzF9(&|IIJ z@lV%r94Gx5?Ml>$3JF2B_0$kuDx~fMqBG*g-DDz*mDuQf9Xa3`~@MM>ntO#j%J3>!m*Coz$60(UVsWG7J(7Cs0m*uSUaHK zcV^=X2@V0KI0>nhy+iokN%T#Ws54Ix>-uiVXucqVXfH(4`C(So~$;7>S(V4!;heZXW-B82L9M7wHoQg$#w z)VEbO`gN=VQRt{W_-btGd&Qe;e%ZD601A!1OmJLoUOy9=SY|GzxiVyl_K*|S=_CdM zKdw7xWAO}w#Jvdo>@&z8BORV7v4+O`EZ%wB9n>RH$Fi&8@Ucp}AFVB-4BkAEFCSBm zSvq9JE=YSY_?d_n32)Zy8;=iLIhD#po@{V@;hYyFwb?(sp_h$r#dT zt@9|(SsFKSUs%7)$QZ`Q1dar_34z3V*W@N%wU%gB0M!0Z8{&FsXoFz^K=#0i`Ah`0 zaT=r&X3;9!Fwd474z;>bhgfV*5M%R8XmzB<#x&P}7~r>tCJl&L*J_9%!YCFULFY_~ zmcz_L5eG8LD+HW9WC60wzpO?q5s-+{b0n`gG?W8#7%;3(628j1QOpZZ$}S;Wa7xT5 zM`S5MzT)3tm*;z7p<#27nq@{ox}c$ibORb%2*x3I1XeM6L$hmVN-TU9=5sQDC@RiCI?mnnhIEXd41bSF3MQZ2f<~80hZNzp}nC`b?XWkVX)6ToJ+wc{RY3GqI$}#mWXP$ajbe{g@ zMePG6W*nwkqh03+u4+)n(e4wO%~7!w?~+3wyo(|1;385kcqenpC$dMtVK96t;x%3| z#0#c|V8B?iCG?6R-oeX3yn|O1@jhA9nT?wk5wTv(8ytAkF&5y4K$hk7gJ#u;HeXB^ zGSXzC7>bRW0Yx(eR%N3mjEomJAV=P){8-kN`%P{ECW(~5p77F~dpcYq-OKX_I|=vN z+F0UE~t1udM@1XjIr9+-0Zm|ME z{UX6KONc6&l}kQI;$Ug-fG`;-?xvf`&In3b(WudeA4TgW{NCM{z!k#_VJ28ZI)Krev8PMkt-O{5M7WTQxU7Dqgl<)**SQIs|I*M9#kSgoMyjo=|X<-T=!| z4B2OS&67gd#7i-yBU%;YLqW4(3egxfXQVi(r`+9w(vgb0UEY@j3%d0;KP z(ymFh3O?ucRiU6qna;^3J8H`et%TB zXpOi*yCQ!Jj&RGE;js>44&_e_| z6})T(9vi_ccwoY#ITG+5R*(^h%#!_QF^LyFABb)6s#4lRYOU*kor3PM?49Y9FDZR- zeBJ8l!5l%cJZMf(p6dsXge)M8-v|mnnnWX$-Rjfq>3y~zR=Mm~&=J5p6Y*fF8@bR5 zRxyz(6N*1ER}2ACW}J^Viq$H`n`)#RA><#UktxNWnk(j$TNJ-MR}6Q8-Y~@@^=I51aUcf`@?hj3 zjo7$oW5md1VZ^ZEFk)~QAi*k$Wr$yBj+jJ!ZOZT|D`-%Lm#m;c8CX2VT*5f(5i>@i zsR;*0!Ob5iBp?HN4&jB+t{Y7dN$mL*lzGjsZc7xM^fgfHhnzZ}Fp3U?73pRpyWww& z*~+S|P~<%n#iEjOsVm(j9B^||SMHZK*2CH$~zcopCGjq-OU3XfvoVxr1m$KnD}%&1

    pO$gk{=i)XJs2`C}T_mBjb%S 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 z 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 diff --git a/polkadot/api/src/full.rs b/polkadot/api/src/full.rs index 68c79819e5e89..101f59f5a70a1 100644 --- a/polkadot/api/src/full.rs +++ b/polkadot/api/src/full.rs @@ -17,20 +17,20 @@ //! Strongly typed API for full Polkadot client. use client::backend::{Backend, LocalBackend}; -use client::{self, Client, LocalCallExecutor}; +use client::block_builder::BlockBuilder as ClientBlockBuilder; +use client::{Client, LocalCallExecutor}; use polkadot_executor::Executor as LocalDispatch; use substrate_executor::{NativeExecutionDispatch, NativeExecutor}; -use state_machine::{self, OverlayedChanges}; +use state_machine; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{self, Block, Header, UncheckedExtrinsic, Extrinsic, Call, TimestampCall, ParachainsCall}; +use primitives::{AccountId, Block, Header, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; use {CheckedBlockId, BlockBuilder, PolkadotApi, LocalPolkadotApi, ErrorKind, Error, Result}; /// A checked block ID used for the substrate-client implementation of CheckedBlockId; #[derive(Debug, Clone, Copy)] -pub struct CheckedId(pub BlockId); +pub struct CheckedId(pub(crate) BlockId); impl CheckedBlockId for CheckedId { fn block_id(&self) -> &BlockId { @@ -44,14 +44,16 @@ macro_rules! with_runtime { ($client: ident, $at: expr, $exec: expr) => {{ let parent = $at.block_id(); let header = Header { - parent_hash: $client.block_hash_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))?, - number: $client.block_number_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))? + 1, + parent_hash: $client.block_hash_from_id(&parent)? + .ok_or_else(|| ErrorKind::UnknownBlock(format!("{:?}", parent)))?, + number: $client.block_number_from_id(&parent)? + .ok_or_else(|| ErrorKind::UnknownBlock(format!("{:?}", parent)))? + 1, state_root: Default::default(), extrinsics_root: Default::default(), digest: Default::default(), }; - $client.state_at(parent).map_err(Error::from).and_then(|state| { + $client.state_at(&parent).map_err(Error::from).and_then(|state| { let mut changes = Default::default(); let mut ext = state_machine::Ext::new(&mut changes, &state); @@ -63,105 +65,28 @@ macro_rules! with_runtime { }} } -/// A polkadot block builder. -#[derive(Debug, Clone)] -pub struct ClientBlockBuilder { - parent: BlockId, - changes: OverlayedChanges, - state: S, - header: Header, - timestamp: Timestamp, - extrinsics: Vec, -} - -impl ClientBlockBuilder - where S::Error: Into -{ - // initialises a block, ready to allow extrinsics to be applied. - fn initialise_block(&mut self) -> Result<()> { - let result = { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - let h = self.header.clone(); - - ::substrate_executor::with_native_environment( - &mut ext, - || runtime::Executive::initialise_block(&h), - ).map_err(Into::into) - }; - - match result { - Ok(_) => { - self.changes.commit_prospective(); - Ok(()) - } - Err(e) => { - self.changes.discard_prospective(); - Err(e) - } - } - } - - // executes a extrinsic, inherent or otherwise, without appending to the list. - fn apply_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { - let result = { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - - ::substrate_executor::with_native_environment( - &mut ext, - move || runtime::Executive::apply_extrinsic(extrinsic), - ).map_err(Into::into) - }; - - match result { - Ok(_) => { - self.changes.commit_prospective(); - Ok(()) - } - Err(e) => { - self.changes.discard_prospective(); - Err(e) - } - } - } -} - -impl BlockBuilder for ClientBlockBuilder - where S::Error: Into +impl> BlockBuilder for ClientBlockBuilder>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { - // Check that this is not an "inherent" extrinsic. - if extrinsic.signature == Default::default() { - bail!(ErrorKind::PushedInherentTransaction(extrinsic)); - } else { - self.apply_extrinsic(extrinsic.clone())?; - self.extrinsics.push(extrinsic); - Ok(()) - } + self.push(extrinsic).map_err(Into::into) } - fn bake(mut self) -> Block { - let mut ext = state_machine::Ext::new(&mut self.changes, &self.state); - - let final_header = ::substrate_executor::with_native_environment( - &mut ext, - move || runtime::Executive::finalise_block() - ).expect("all inherent extrinsics pushed; all other extrinsics executed correctly; qed"); - Block { - header: final_header, - extrinsics: self.extrinsics, - } + /// Bake the block with provided extrinsics. + fn bake(self) -> Result { + ClientBlockBuilder::bake(self).map_err(Into::into) } } -impl PolkadotApi for Client>> - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl> PolkadotApi for Client>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; - type BlockBuilder = ClientBlockBuilder; + type BlockBuilder = ClientBlockBuilder>, Block>; fn check_id(&self, id: BlockId) -> Result { // bail if the code is not the same as the natively linked. - if self.code_at(&id)? != LocalDispatch::native_equivalent() { + if self.code_at(&id.into())? != LocalDispatch::native_equivalent() { bail!("This node is out of date. Block authoring may not work correctly. Bailing.") } @@ -190,8 +115,16 @@ impl PolkadotApi for Client Result { use substrate_executor::error::ErrorKind as ExecErrorKind; + use codec::Slicable; + use runtime::Block as RuntimeBlock; + + let encoded = block.encode(); + let runtime_block = match RuntimeBlock::decode(&mut &encoded[..]) { + Some(x) => x, + None => return Ok(false), + }; - let res = with_runtime!(self, at, || ::runtime::Executive::execute_block(block)); + let res = with_runtime!(self, at, || ::runtime::Executive::execute_block(runtime_block)); match res { Ok(()) => Ok(true), Err(err) => match err.kind() { @@ -217,85 +150,65 @@ impl PolkadotApi for Client) -> Result { - let parent = parent.block_id(); - let header = Header { - parent_hash: self.block_hash_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))?, - number: self.block_number_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))? + 1, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }; - - let extrinsics = vec![ - UncheckedExtrinsic { - extrinsic: Extrinsic { - signed: Default::default(), - index: Default::default(), - function: Call::Timestamp(TimestampCall::set(timestamp)), - }, - signature: Default::default(), - }, - UncheckedExtrinsic { - extrinsic: Extrinsic { - signed: Default::default(), - index: Default::default(), - function: Call::Parachains(ParachainsCall::set_heads(parachains)), - }, - signature: Default::default(), - } - ]; - - let mut builder = ClientBlockBuilder { - parent: *parent, - changes: OverlayedChanges::default(), - state: self.state_at(parent)?, - header, - timestamp, - extrinsics: extrinsics.clone(), - }; + fn build_block(&self, at: &CheckedId, timestamp: Timestamp, new_heads: Vec) -> Result { + let mut block_builder = self.new_block_at(at.block_id())?; + for inherent in self.inherent_extrinsics(at, timestamp, new_heads)? { + block_builder.push(inherent)?; + } - builder.initialise_block()?; + Ok(block_builder) + } - for inherent in extrinsics { - builder.apply_extrinsic(inherent)?; - } + fn inherent_extrinsics(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result> { + use codec::Slicable; - Ok(builder) + with_runtime!(self, at, || { + let extrinsics = ::runtime::inherent_extrinsics(timestamp, new_heads); + extrinsics.into_iter() + .map(|x| x.encode()) // get encoded representation + .map(|x| Slicable::decode(&mut &x[..])) // get byte-vec equivalent to extrinsic + .map(|x| x.expect("UncheckedExtrinsic has encoded representation equivalent to Vec; qed")) + .collect() + }) } } -impl LocalPolkadotApi for Client>> - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl> LocalPolkadotApi for Client>, Block> + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> {} #[cfg(test)] mod tests { use super::*; use keyring::Keyring; - use codec::Slicable; use client::{self, LocalCallExecutor}; use client::in_mem::Backend as InMemory; use substrate_executor::NativeExecutionDispatch; - use substrate_primitives::{self, Header}; use runtime::{GenesisConfig, ConsensusConfig, SessionConfig, BuildExternalities}; fn validators() -> Vec { + vec![ + Keyring::One.to_raw_public().into(), + Keyring::Two.to_raw_public().into(), + ] + } + + fn session_keys() -> Vec { vec![ Keyring::One.to_raw_public(), Keyring::Two.to_raw_public(), ] } - fn client() -> Client>> { + fn client() -> Client, LocalCallExecutor, NativeExecutor>, Block> { struct GenesisBuilder; - impl client::GenesisBuilder for GenesisBuilder { + impl client::GenesisBuilder for GenesisBuilder { fn build(self) -> (Header, Vec<(Vec, Vec)>) { let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { code: LocalDispatch::native_equivalent().to_vec(), - authorities: validators(), + authorities: session_keys(), }), system: None, session: Some(SessionConfig { @@ -309,8 +222,8 @@ mod tests { }; let storage = genesis_config.build_externalities(); - let block = ::client::genesis::construct_genesis_block(&storage); - (substrate_primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = ::client::genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } @@ -320,18 +233,36 @@ mod tests { #[test] fn gets_session_and_validator_keys() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); - assert_eq!(client.session_keys(&id).unwrap(), validators()); + let id = client.check_id(BlockId::number(0)).unwrap(); + assert_eq!(client.session_keys(&id).unwrap(), session_keys()); assert_eq!(client.validators(&id).unwrap(), validators()); } #[test] - fn build_block() { + fn build_block_implicit_succeeds() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); + let id = client.check_id(BlockId::number(0)).unwrap(); let block_builder = client.build_block(&id, 1_000_000, Vec::new()).unwrap(); - let block = block_builder.bake(); + let block = block_builder.bake().unwrap(); + + assert_eq!(block.header.number, 1); + assert!(block.header.extrinsics_root != Default::default()); + } + + #[test] + fn build_block_with_inherent_succeeds() { + let client = client(); + + let id = client.check_id(BlockId::number(0)).unwrap(); + let inherent = client.inherent_extrinsics(&id, 1_000_000, Vec::new()).unwrap(); + + let mut block_builder = client.new_block_at(id.block_id()).unwrap(); + for extrinsic in inherent { + block_builder.push(extrinsic).unwrap(); + } + + let block = block_builder.bake().unwrap(); assert_eq!(block.header.number, 1); assert!(block.header.extrinsics_root != Default::default()); @@ -339,14 +270,14 @@ mod tests { #[test] fn fails_to_check_id_for_unknown_block() { - assert!(client().check_id(BlockId::Number(100)).is_err()); + assert!(client().check_id(BlockId::number(100)).is_err()); } #[test] fn gets_random_seed_with_genesis() { let client = client(); - let id = client.check_id(BlockId::Number(0)).unwrap(); + let id = client.check_id(BlockId::number(0)).unwrap(); assert!(client.random_seed(&id).is_ok()); } } diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index bef92d4d9f509..c92f568f7b59c 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -18,8 +18,8 @@ //! runtime. extern crate polkadot_executor; -extern crate polkadot_runtime as runtime; extern crate polkadot_primitives as primitives; +extern crate polkadot_runtime as runtime; extern crate substrate_codec as codec; extern crate substrate_runtime_io as runtime_io; extern crate substrate_client as client; @@ -37,9 +37,8 @@ extern crate substrate_keyring as keyring; pub mod full; pub mod light; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{Block, UncheckedExtrinsic}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; error_chain! { errors { @@ -49,19 +48,9 @@ error_chain! { display("Unknown runtime code") } /// Unknown block ID. - UnknownBlock(b: BlockId) { + UnknownBlock(b: String) { description("Unknown block") - display("Unknown block") - } - /// Attempted to push an inherent extrinsic manually. - PushedInherentTransaction(xt: UncheckedExtrinsic) { - description("Attempted to push an inherent extrinsic to a block."), - display("Pushed inherent extrinsic to a block: {:?}", xt), - } - /// Badly-formed extrinsic. - BadlyFormedTransaction(xt: UncheckedExtrinsic) { - description("Attempted to push a badly-formed extrinsic to a block."), - display("Pushed badly-formed extrinsic to a block: {:?}", xt), + display("Unknown block {}", b) } /// Some other error. // TODO: allow to be specified as associated type of PolkadotApi @@ -85,28 +74,28 @@ impl From for Error { } } -/// A builder for blocks. -pub trait BlockBuilder: Sized { - /// Push a non-inherent extrinsic. - fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()>; - - /// Finalise the block. - fn bake(self) -> Block; -} - /// A checked block identifier. pub trait CheckedBlockId: Clone + 'static { /// Yield the underlying block ID. fn block_id(&self) -> &BlockId; } +/// 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 Polkadot API. /// /// All calls should fail when the exact runtime is unknown. pub trait PolkadotApi { /// A checked block ID. Used to avoid redundancy of code check. type CheckedBlockId: CheckedBlockId; - /// The type used to build blocks. + /// The block builder for this API type. type BlockBuilder: BlockBuilder; /// Check whether requests at the given block ID can be served. @@ -146,8 +135,12 @@ pub trait PolkadotApi { /// and an error if we can't evaluate for some reason. fn evaluate_block(&self, at: &Self::CheckedBlockId, block: Block) -> Result; - /// Create a block builder on top of the parent block. - fn build_block(&self, parent: &Self::CheckedBlockId, timestamp: Timestamp, parachains: Vec) -> Result; + /// Build a block on top of the given, with inherent extrinsics pre-pushed. + fn build_block(&self, at: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> 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: &Self::CheckedBlockId, timestamp: Timestamp, new_heads: Vec) -> Result>; } /// Mark for all Polkadot API implementations, that are making use of state data, stored locally. diff --git a/polkadot/api/src/light.rs b/polkadot/api/src/light.rs index 6038a8ec1fbcd..560c18669922a 100644 --- a/polkadot/api/src/light.rs +++ b/polkadot/api/src/light.rs @@ -21,20 +21,30 @@ use client::backend::{Backend, RemoteBackend}; use client::{Client, CallExecutor}; use codec::Slicable; use state_machine; -use primitives::{AccountId, BlockId, Hash, Index, SessionKey, Timestamp}; -use primitives::parachain::{DutyRoster, CandidateReceipt, Id as ParaId}; -use runtime::{Block, UncheckedExtrinsic}; +use primitives::{AccountId, Block, BlockId, Hash, Index, SessionKey, Timestamp, UncheckedExtrinsic}; +use primitives::parachain::{CandidateReceipt, DutyRoster, Id as ParaId}; use full::CheckedId; -use {PolkadotApi, RemotePolkadotApi, BlockBuilder, CheckedBlockId, Result, ErrorKind}; +use {PolkadotApi, BlockBuilder, RemotePolkadotApi, CheckedBlockId, Result, ErrorKind}; -/// Remote polkadot API implementation. -pub struct RemotePolkadotApiWrapper(pub Arc>); - -/// Block builder for light client. +/// Light block builder. TODO: make this work (efficiently) +#[derive(Clone, Copy)] pub struct LightBlockBuilder; -impl PolkadotApi for RemotePolkadotApiWrapper - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> +impl BlockBuilder for LightBlockBuilder { + fn push_extrinsic(&mut self, _xt: UncheckedExtrinsic) -> Result<()> { + Err(ErrorKind::UnknownRuntime.into()) + } + + fn bake(self) -> Result { + Err(ErrorKind::UnknownRuntime.into()) + } +} + +/// Remote polkadot API implementation. +pub struct RemotePolkadotApiWrapper, E: CallExecutor>(pub Arc>); + +impl, E: CallExecutor> PolkadotApi for RemotePolkadotApiWrapper + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { type CheckedBlockId = CheckedId; type BlockBuilder = LightBlockBuilder; @@ -86,21 +96,15 @@ impl PolkadotApi for RemotePolkadotApiWrapper Err(ErrorKind::UnknownRuntime.into()) } - fn build_block(&self, _parent: &CheckedId, _timestamp: Timestamp, _parachains: Vec) -> Result { + fn build_block(&self, _at: &Self::CheckedBlockId, _timestamp: Timestamp, _new_heads: Vec) -> Result { Err(ErrorKind::UnknownRuntime.into()) } -} - -impl RemotePolkadotApi for RemotePolkadotApiWrapper - where ::client::error::Error: From<<::State as state_machine::backend::Backend>::Error> -{} -impl BlockBuilder for LightBlockBuilder { - fn push_extrinsic(&mut self, _extrinsic: UncheckedExtrinsic) -> Result<()> { + fn inherent_extrinsics(&self, _at: &Self::CheckedBlockId, _timestamp: Timestamp, _new_heads: Vec) -> Result>> { Err(ErrorKind::UnknownRuntime.into()) } - - fn bake(self) -> Block { - unimplemented!() - } } + +impl, E: CallExecutor> RemotePolkadotApi for RemotePolkadotApiWrapper + where ::client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> +{} diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index f80b3b1d9fc18..8cc19b0f66e2e 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -24,16 +24,10 @@ ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } fdlimit = "0.1" parking_lot = "0.4" substrate-client = { path = "../../substrate/client" } -substrate-network = { path = "../../substrate/network" } -substrate-codec = { path = "../../substrate/codec" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-state-machine = { path = "../../substrate/state-machine" } -substrate-executor = { path = "../../substrate/executor" } -substrate-primitives = { path = "../../substrate/primitives" } substrate-rpc = { path = "../../substrate/rpc" } substrate-rpc-servers = { path = "../../substrate/rpc-servers" } +substrate-network = { path = "../../substrate/network" } polkadot-primitives = { path = "../primitives" } -polkadot-executor = { path = "../executor" } -polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } polkadot-transaction-pool = { path = "../transaction-pool" } diff --git a/polkadot/cli/src/informant.rs b/polkadot/cli/src/informant.rs index 54affa839ee61..c5bbe0c2a26b9 100644 --- a/polkadot/cli/src/informant.rs +++ b/polkadot/cli/src/informant.rs @@ -21,8 +21,7 @@ use futures::stream::Stream; use service::Service; use tokio_core::reactor; use network::{SyncState, SyncProvider}; -use runtime_support::Hashable; -use primitives::block::HeaderHash; +use polkadot_primitives::Block; use state_machine; use client::{self, BlockchainEvents}; @@ -31,9 +30,9 @@ const TIMER_INTERVAL_MS: u64 = 5000; /// Spawn informant on the event loop pub fn start(service: &Service, handle: reactor::Handle) where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { let interval = reactor::Interval::new_at(Instant::now(), Duration::from_millis(TIMER_INTERVAL_MS), &handle) .expect("Error creating informant timer"); @@ -45,7 +44,7 @@ pub fn start(service: &Service, handle: reactor::Handle) let sync_status = network.status(); if let Ok(best_block) = client.best_block_header() { - let hash: HeaderHash = best_block.blake2_256().into(); + let hash = best_block.hash(); let status = match (sync_status.sync.state, sync_status.sync.best_seen_block) { (SyncState::Idle, _) => "Idle".into(), (SyncState::Downloading, None) => "Syncing".into(), diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index f734b154cd0d8..0d56f0d11e323 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -32,17 +32,12 @@ extern crate ed25519; extern crate triehash; extern crate parking_lot; -extern crate substrate_codec as codec; extern crate substrate_state_machine as state_machine; extern crate substrate_client as client; -extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_rpc; extern crate substrate_rpc_servers as rpc; -extern crate substrate_runtime_support as runtime_support; extern crate polkadot_primitives; -extern crate polkadot_executor; -extern crate polkadot_runtime; extern crate polkadot_service as service; extern crate polkadot_transaction_pool as txpool; @@ -61,6 +56,7 @@ mod informant; use std::io; use std::net::SocketAddr; use std::path::{Path, PathBuf}; +use polkadot_primitives::Block; use futures::sync::mpsc; use futures::{Sink, Future, Stream}; @@ -188,9 +184,9 @@ pub fn run(args: I) -> error::Result<()> where fn run_until_exit(mut core: reactor::Core, service: service::Service, matches: &clap::ArgMatches, config: service::Configuration) -> error::Result<()> where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { let exit = { // can't use signal directly here because CtrlC takes only `Fn`. @@ -210,7 +206,7 @@ fn run_until_exit(mut core: reactor::Core, service: service::Service let handler = || { let chain = rpc::apis::chain::Chain::new(service.client(), core.remote()); - rpc::rpc_handler( + rpc::rpc_handler::( service.client(), chain, service.transaction_pool(), diff --git a/polkadot/collator/Cargo.toml b/polkadot/collator/Cargo.toml index 42fc14c666c18..161121eefad0b 100644 --- a/polkadot/collator/Cargo.toml +++ b/polkadot/collator/Cargo.toml @@ -8,5 +8,6 @@ description = "Abstract collation logic" futures = "0.1.17" substrate-codec = { path = "../../substrate/codec", version = "0.1" } substrate-primitives = { path = "../../substrate/primitives", version = "0.1" } -polkadot-primitives = { path = "../primitives", version = "0.1" } +polkadot-runtime = { path = "../runtime", version = "0.1" } polkadot-parachain = { path = "../parachain", version = "0.1" } +polkadot-primitives = { path = "../primitives", version = "0.1" } diff --git a/polkadot/collator/src/lib.rs b/polkadot/collator/src/lib.rs index 967a8e6de6fc7..55eca734d269b 100644 --- a/polkadot/collator/src/lib.rs +++ b/polkadot/collator/src/lib.rs @@ -47,12 +47,13 @@ extern crate futures; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; +extern crate polkadot_runtime; extern crate polkadot_primitives; use std::collections::{BTreeSet, BTreeMap}; use futures::{stream, Stream, Future, IntoFuture}; -use polkadot_primitives::parachain::{self, ConsolidatedIngress, Message, Id as ParaId}; +use polkadot_primitives::parachain::{self, CandidateSignature, ConsolidatedIngress, Message, Id as ParaId}; /// Parachain context needed for collation. /// @@ -62,7 +63,7 @@ pub trait ParachainContext { fn produce_candidate>( &self, ingress: I, - ) -> (parachain::BlockData, polkadot_primitives::AccountId, polkadot_primitives::Signature); + ) -> (parachain::BlockData, polkadot_primitives::AccountId, CandidateSignature); } /// Relay chain context needed to collate. diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml index 5be758a91bd60..9941a21b33a7a 100644 --- a/polkadot/consensus/Cargo.toml +++ b/polkadot/consensus/Cargo.toml @@ -25,3 +25,4 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-network = { path = "../../substrate/network" } substrate-keyring = { path = "../../substrate/keyring" } substrate-client = { path = "../../substrate/client" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } diff --git a/polkadot/consensus/src/error.rs b/polkadot/consensus/src/error.rs index ebc998ab69ec9..acafa88f5e426 100644 --- a/polkadot/consensus/src/error.rs +++ b/polkadot/consensus/src/error.rs @@ -16,7 +16,7 @@ //! Errors that can occur during the consensus process. -use polkadot_primitives::AccountId; +use primitives::AuthorityId; error_chain! { links { @@ -29,7 +29,7 @@ error_chain! { description("Duty Roster had invalid length"), display("Invalid duty roster length: expected {}, got {}", expected, got), } - NotValidator(id: AccountId) { + 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/polkadot/consensus/src/evaluation.rs b/polkadot/consensus/src/evaluation.rs index b5ef81d2446a1..c7c4fe2c25dcc 100644 --- a/polkadot/consensus/src/evaluation.rs +++ b/polkadot/consensus/src/evaluation.rs @@ -19,11 +19,9 @@ use super::MAX_TRANSACTIONS_SIZE; use codec::Slicable; -use polkadot_runtime::Block as PolkadotGenericBlock; -use polkadot_primitives::Timestamp; +use polkadot_runtime::{Block as PolkadotGenericBlock, CheckedBlock}; +use polkadot_primitives::{Block, Hash, BlockNumber, Timestamp}; use polkadot_primitives::parachain::Id as ParaId; -use primitives::block::{Block as SubstrateBlock, HeaderHash, Number as BlockNumber}; -use transaction_pool::PolkadotBlock; error_chain! { links { @@ -51,7 +49,7 @@ error_chain! { description("Proposal included unregistered parachain."), display("Proposal included unregistered parachain {:?}", id), } - WrongParentHash(expected: HeaderHash, got: HeaderHash) { + WrongParentHash(expected: Hash, got: Hash) { description("Proposal had wrong parent hash."), display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), } @@ -72,17 +70,17 @@ error_chain! { /// Attempt to evaluate a substrate block as a polkadot block, returning error /// upon any initial validity checks failing. pub fn evaluate_initial( - proposal: &SubstrateBlock, + proposal: &Block, now: Timestamp, - parent_hash: &HeaderHash, + parent_hash: &Hash, parent_number: BlockNumber, active_parachains: &[ParaId], -) -> Result { +) -> Result { const MAX_TIMESTAMP_DRIFT: Timestamp = 60; let encoded = Slicable::encode(proposal); let proposal = PolkadotGenericBlock::decode(&mut &encoded[..]) - .and_then(|b| PolkadotBlock::from(b).ok()) + .and_then(|b| CheckedBlock::new(b).ok()) .ok_or_else(|| ErrorKind::ProposalNotForPolkadot)?; let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index def896548e400..2e23b256b28e4 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -35,14 +35,15 @@ extern crate polkadot_api; extern crate polkadot_collator as collator; extern crate polkadot_statement_table as table; extern crate polkadot_parachain as parachain; -extern crate polkadot_primitives; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_runtime; +extern crate polkadot_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_network; extern crate exit_future; @@ -68,10 +69,9 @@ use std::time::{Duration, Instant}; use codec::Slicable; use table::generic::Statement as GenericStatement; use runtime_support::Hashable; -use polkadot_api::{PolkadotApi, BlockBuilder}; -use polkadot_primitives::{Hash, Timestamp}; -use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic, CandidateReceipt}; -use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId, Number as BlockNumber}; +use polkadot_api::PolkadotApi; +use polkadot_primitives::{Hash, Block, BlockId, BlockNumber, Header, Timestamp}; +use polkadot_primitives::parachain::{Id as ParaId, Chain, DutyRoster, BlockData, Extrinsic as ParachainExtrinsic, CandidateReceipt}; use primitives::AuthorityId; use transaction_pool::{Ready, TransactionPool}; use tokio_core::reactor::{Handle, Timeout, Interval}; @@ -105,10 +105,10 @@ pub trait TableRouter: Clone { /// Future that resolves when candidate data is fetched. type FetchCandidate: IntoFuture; /// Future that resolves when extrinsic candidate data is fetched. - type FetchExtrinsic: IntoFuture; + type FetchExtrinsic: IntoFuture; /// Note local candidate data, making it available on the network to other validators. - fn local_candidate_data(&self, hash: Hash, block_data: BlockData, extrinsic: Extrinsic); + fn local_candidate_data(&self, hash: Hash, block_data: BlockData, extrinsic: ParachainExtrinsic); /// Fetch block data for a specific candidate. fn fetch_block_data(&self, candidate: &CandidateReceipt) -> Self::FetchCandidate; @@ -236,7 +236,7 @@ pub struct ProposerFactory { pub parachain_empty_duration: Duration, } -impl bft::ProposerFactory for ProposerFactory +impl bft::ProposerFactory for ProposerFactory where C: PolkadotApi, N: Network, @@ -245,14 +245,14 @@ impl bft::ProposerFactory for ProposerFactory type Proposer = Proposer; type Error = Error; - fn init(&self, parent_header: &SubstrateHeader, authorities: &[AuthorityId], sign_with: Arc) -> Result { + fn init(&self, parent_header: &Header, authorities: &[AuthorityId], sign_with: Arc) -> Result { use std::time::Duration; const DELAY_UNTIL: Duration = Duration::from_millis(5000); let parent_hash = parent_header.blake2_256().into(); - let checked_id = self.client.check_id(BlockId::Hash(parent_hash))?; + let checked_id = self.client.check_id(BlockId::hash(parent_hash))?; let duty_roster = self.client.duty_roster(&checked_id)?; let random_seed = self.client.random_seed(&checked_id)?; @@ -312,7 +312,7 @@ pub struct Proposer { handle: Handle, local_duty: LocalDuty, local_key: Arc, - parent_hash: HeaderHash, + parent_hash: Hash, parent_id: C::CheckedBlockId, parent_number: BlockNumber, random_seed: Hash, @@ -321,7 +321,7 @@ pub struct Proposer { transaction_pool: Arc, } -impl bft::Proposer for Proposer +impl bft::Proposer for Proposer where C: PolkadotApi, R: TableRouter, @@ -330,7 +330,7 @@ impl bft::Proposer for Proposer type Error = Error; type Create = future::Either< CreateProposal, - future::FutureResult, + future::FutureResult, >; type Evaluate = Box>; @@ -385,7 +385,7 @@ impl bft::Proposer for Proposer }) } - fn evaluate(&self, proposal: &SubstrateBlock) -> Self::Evaluate { + fn evaluate(&self, unchecked_proposal: &Block) -> Self::Evaluate { debug!(target: "bft", "evaluating block on top of parent ({}, {:?})", self.parent_number, self.parent_hash); let active_parachains = match self.client.active_parachains(&self.parent_id) { @@ -397,7 +397,7 @@ impl bft::Proposer for Proposer // do initial serialization and structural integrity checks. let maybe_proposal = evaluation::evaluate_initial( - proposal, + unchecked_proposal, current_timestamp, &self.parent_hash, self.parent_number, @@ -461,7 +461,10 @@ impl bft::Proposer for Proposer // 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, proposal.into()).map_err(Into::into); + 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 { @@ -489,13 +492,13 @@ impl bft::Proposer for Proposer proposer } - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { use bft::generic::Misbehavior as GenericMisbehavior; - use primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use runtime_primitives::MaybeUnsigned; use polkadot_runtime::{Call, Extrinsic, UncheckedExtrinsic, ConsensusCall}; - - let local_id = self.local_key.public().0; + let local_id = self.local_key.public().0.into(); let mut next_index = { let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); let cur_index = self.transaction_pool.cull_and_get_pending(readiness_evaluator, |pending| pending @@ -536,10 +539,11 @@ impl bft::Proposer for Proposer next_index += 1; - let signature = self.local_key.sign(&extrinsic.encode()).into(); + let signature = MaybeUnsigned(self.local_key.sign(&extrinsic.encode()).into()); let uxt = UncheckedExtrinsic { extrinsic, signature }; - self.transaction_pool.import_unchecked_extrinsic(uxt).expect("locally signed extrinsic is valid; qed"); + self.transaction_pool.import_unchecked_extrinsic(uxt) + .expect("locally signed extrinsic is valid; qed"); } } } @@ -603,7 +607,7 @@ impl ProposalTiming { /// Future which resolves upon the creation of a proposal. pub struct CreateProposal { - parent_hash: HeaderHash, + parent_hash: Hash, parent_number: BlockNumber, parent_id: C::CheckedBlockId, client: Arc, @@ -620,14 +624,13 @@ impl CreateProposal R: TableRouter, P: Collators, { - fn propose_with(&self, candidates: Vec) -> Result { + fn propose_with(&self, candidates: Vec) -> Result { + use polkadot_api::BlockBuilder; + use runtime_primitives::traits::{Hashing, BlakeTwo256}; + // TODO: handle case when current timestamp behind that in state. let timestamp = current_timestamp(); - let mut block_builder = self.client.build_block( - &self.parent_id, - timestamp, - candidates, - )?; + let mut block_builder = self.client.build_block(&self.parent_id, timestamp, candidates)?; { let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); @@ -643,7 +646,7 @@ impl CreateProposal if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - match block_builder.push_extrinsic(pending.as_transaction().clone()) { + match block_builder.push_extrinsic(pending.primitive_extrinsic()) { Ok(()) => { pending_size += pending.encoded_size(); } @@ -658,14 +661,14 @@ impl CreateProposal self.transaction_pool.remove(&unqueue_invalid, false); } - let polkadot_block = block_builder.bake(); + let polkadot_block = block_builder.bake()?; info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", polkadot_block.header.number, - Hash::from(polkadot_block.header.blake2_256()), + Hash::from(polkadot_block.header.hash()), polkadot_block.header.parent_hash, polkadot_block.extrinsics.iter() - .map(|xt| format!("{}", Hash::from(xt.blake2_256()))) + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) .collect::>() .join(", ") ); @@ -693,10 +696,10 @@ impl Future for CreateProposal R: TableRouter, P: Collators, { - type Item = SubstrateBlock; + type Item = Block; type Error = Error; - fn poll(&mut self) -> Poll { + fn poll(&mut self) -> Poll { // 1. poll local collation future. match self.collation.poll() { Ok(Async::Ready((collation, extrinsic))) => { diff --git a/polkadot/consensus/src/service.rs b/polkadot/consensus/src/service.rs index dedab9213516f..f1ee7f49fe3b2 100644 --- a/polkadot/consensus/src/service.rs +++ b/polkadot/consensus/src/service.rs @@ -29,10 +29,9 @@ use ed25519; use futures::prelude::*; use futures::{future, Canceled}; use polkadot_api::LocalPolkadotApi; -use polkadot_primitives::AccountId; +use polkadot_primitives::{BlockId, Block, Header, Hash, AccountId}; use polkadot_primitives::parachain::{Id as ParaId, BlockData, Extrinsic, CandidateReceipt}; -use primitives::{Hash, AuthorityId}; -use primitives::block::{Id as BlockId, HeaderHash, Header}; +use primitives::AuthorityId; use runtime_support::Hashable; use substrate_network as net; use tokio_core::reactor; @@ -45,19 +44,19 @@ const TIMER_DELAY_MS: u64 = 5000; const TIMER_INTERVAL_MS: u64 = 500; struct BftSink { - network: Arc, - parent_hash: HeaderHash, + network: Arc>, + parent_hash: Hash, _e: ::std::marker::PhantomData, } struct Messages { - network_stream: net::BftMessageStream, + network_stream: net::BftMessageStream, local_id: AuthorityId, authorities: Vec, } impl Stream for Messages { - type Item = bft::Communication; + type Item = bft::Communication; type Error = bft::Error; fn poll(&mut self) -> Poll, Self::Error> { @@ -81,10 +80,10 @@ impl Stream for Messages { } } -fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, authorities: &[AuthorityId]) -> Result, bft::Error> { +fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, authorities: &[AuthorityId]) -> Result>, bft::Error> { Ok(Some(match msg.message { - net::BftMessage::Consensus(c) => bft::generic::Communication::Consensus(match c { - net::SignedConsensusMessage::Propose(proposal) => bft::generic::LocalizedMessage::Propose({ + net::generic_message::BftMessage::Consensus(c) => bft::generic::Communication::Consensus(match c { + net::generic_message::SignedConsensusMessage::Propose(proposal) => bft::generic::LocalizedMessage::Propose({ if &proposal.sender == local_id { return Ok(None) } let proposal = bft::generic::LocalizedProposal { round_number: proposal.round_number as usize, @@ -105,7 +104,7 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender)); proposal }), - net::SignedConsensusMessage::Vote(vote) => bft::generic::LocalizedMessage::Vote({ + net::generic_message::SignedConsensusMessage::Vote(vote) => bft::generic::LocalizedMessage::Vote({ if &vote.sender == local_id { return Ok(None) } let vote = bft::generic::LocalizedVote { sender: vote.sender, @@ -114,21 +113,21 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author signer: ed25519::Public(vote.sender), }, vote: match vote.vote { - net::ConsensusVote::Prepare(r, h) => bft::generic::Vote::Prepare(r as usize, h), - net::ConsensusVote::Commit(r, h) => bft::generic::Vote::Commit(r as usize, h), - net::ConsensusVote::AdvanceRound(r) => bft::generic::Vote::AdvanceRound(r as usize), + net::generic_message::ConsensusVote::Prepare(r, h) => bft::generic::Vote::Prepare(r as usize, h), + net::generic_message::ConsensusVote::Commit(r, h) => bft::generic::Vote::Commit(r as usize, h), + net::generic_message::ConsensusVote::AdvanceRound(r) => bft::generic::Vote::AdvanceRound(r as usize), } }; - bft::check_vote(authorities, &msg.parent_hash, &vote)?; + bft::check_vote::(authorities, &msg.parent_hash, &vote)?; trace!(target: "bft", "importing vote {:?} from {}", vote.vote, Hash::from(vote.sender)); vote }), }), - net::BftMessage::Auxiliary(a) => { - let justification = bft::UncheckedJustification::from(a); + net::generic_message::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) + let justification: Result<_, bft::Error> = bft::check_prepare_justification::(authorities, msg.parent_hash, justification) .map_err(|_| bft::ErrorKind::InvalidJustification.into()); bft::generic::Communication::Auxiliary(justification?) }, @@ -136,15 +135,15 @@ fn process_message(msg: net::LocalizedBftMessage, local_id: &AuthorityId, author } impl Sink for BftSink { - type SinkItem = bft::Communication; + 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 { - let network_message = net::LocalizedBftMessage { + fn start_send(&mut self, message: bft::Communication) -> ::futures::StartSend, E> { + let network_message = net::generic_message::LocalizedBftMessage { message: match message { - bft::generic::Communication::Consensus(c) => net::BftMessage::Consensus(match c { - bft::generic::LocalizedMessage::Propose(proposal) => net::SignedConsensusMessage::Propose(net::SignedConsensusProposal { + bft::generic::Communication::Consensus(c) => net::generic_message::BftMessage::Consensus(match c { + bft::generic::LocalizedMessage::Propose(proposal) => net::generic_message::SignedConsensusMessage::Propose(net::generic_message::SignedConsensusProposal { round_number: proposal.round_number as u32, proposal: proposal.proposal, digest: proposal.digest, @@ -152,17 +151,17 @@ impl Sink for BftSink { digest_signature: proposal.digest_signature.signature, full_signature: proposal.full_signature.signature, }), - bft::generic::LocalizedMessage::Vote(vote) => net::SignedConsensusMessage::Vote(net::SignedConsensusVote { + bft::generic::LocalizedMessage::Vote(vote) => net::generic_message::SignedConsensusMessage::Vote(net::generic_message::SignedConsensusVote { sender: vote.sender, signature: vote.signature.signature, vote: match vote.vote { - bft::generic::Vote::Prepare(r, h) => net::ConsensusVote::Prepare(r as u32, h), - bft::generic::Vote::Commit(r, h) => net::ConsensusVote::Commit(r as u32, h), - bft::generic::Vote::AdvanceRound(r) => net::ConsensusVote::AdvanceRound(r as u32), + bft::generic::Vote::Prepare(r, h) => net::generic_message::ConsensusVote::Prepare(r as u32, h), + bft::generic::Vote::Commit(r, h) => net::generic_message::ConsensusVote::Commit(r as u32, h), + bft::generic::Vote::AdvanceRound(r) => net::generic_message::ConsensusVote::AdvanceRound(r as u32), } }), }), - bft::generic::Communication::Auxiliary(justification) => net::BftMessage::Auxiliary(justification.uncheck().into()), + bft::generic::Communication::Auxiliary(justification) => net::generic_message::BftMessage::Auxiliary(justification.uncheck().into()), }, parent_hash: self.parent_hash, }; @@ -175,7 +174,7 @@ impl Sink for BftSink { } } -struct Network(Arc); +struct Network(Arc>); impl super::Network for Network { type TableRouter = Router; @@ -189,20 +188,20 @@ impl super::Network for Network { fn start_bft( header: &Header, handle: reactor::Handle, - client: &bft::Authorities, - network: Arc, - bft_service: &BftService, + client: &bft::Authorities, + network: Arc>, + bft_service: &BftService, ) where - F: bft::ProposerFactory + 'static, - C: bft::BlockImport + bft::Authorities + 'static, - ::Error: ::std::fmt::Debug, - ::Error: ::std::fmt::Display + Into, + F: bft::ProposerFactory + 'static, + C: bft::BlockImport + bft::Authorities + 'static, + >::Error: ::std::fmt::Debug, + >::Error: ::std::fmt::Display + Into, { - let parent_hash = header.blake2_256().into(); + let parent_hash = header.hash(); if bft_service.live_agreement().map_or(false, |h| h == parent_hash) { return; } - let authorities = match client.authorities(&BlockId::Hash(parent_hash)) { + let authorities = match client.authorities(&BlockId::hash(parent_hash)) { Ok(authorities) => authorities, Err(e) => { debug!("Error reading authorities: {:?}", e); @@ -235,14 +234,14 @@ impl Service { pub fn new( client: Arc, api: Arc, - network: Arc, + network: Arc>, transaction_pool: Arc, parachain_empty_duration: Duration, key: ed25519::Pair, ) -> Service where A: LocalPolkadotApi + Send + Sync + 'static, - C: BlockchainEvents + ChainHead + bft::BlockImport + bft::Authorities + Send + Sync + 'static, + C: BlockchainEvents + ChainHead + bft::BlockImport + bft::Authorities + Send + Sync + 'static, { let (signal, exit) = ::exit_future::signal(); let thread = thread::spawn(move || { @@ -346,36 +345,25 @@ impl ::collation::Collators for NoCollators { fn note_bad_collator(&self, _collator: AccountId) { } } -type FetchCandidateAdapter = future::Map) -> BlockData>; - #[derive(Clone)] struct Router { - network: Arc, -} - -impl Router { - fn fetch_candidate_adapter(data: Vec) -> BlockData { - BlockData(data) - } + network: Arc>, } impl TableRouter for Router { type Error = Canceled; - type FetchCandidate = FetchCandidateAdapter; + type FetchCandidate = future::Empty; type FetchExtrinsic = future::FutureResult; - fn local_candidate_data(&self, hash: Hash, block_data: BlockData, _extrinsic: Extrinsic) { - let data = block_data.0; - self.network.set_local_candidate(Some((hash, data))) + fn local_candidate_data(&self, _hash: Hash, _block_data: BlockData, _extrinsic: Extrinsic) { + // TODO } - fn fetch_block_data(&self, candidate: &CandidateReceipt) -> Self::FetchCandidate { - let hash = candidate.hash(); - self.network.fetch_candidate(&hash).map(Self::fetch_candidate_adapter) + fn fetch_block_data(&self, _candidate: &CandidateReceipt) -> Self::FetchCandidate { + future::empty() } fn fetch_extrinsic_data(&self, _candidate: &CandidateReceipt) -> Self::FetchExtrinsic { future::ok(Extrinsic) } } - diff --git a/polkadot/consensus/src/shared_table/mod.rs b/polkadot/consensus/src/shared_table/mod.rs index 23e936eefea80..120fbb7fec365 100644 --- a/polkadot/consensus/src/shared_table/mod.rs +++ b/polkadot/consensus/src/shared_table/mod.rs @@ -486,7 +486,7 @@ mod tests { let candidate = CandidateReceipt { parachain_index: para_id, - collator: [1; 32], + collator: [1; 32].into(), head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), balance_uploads: Vec::new(), egress_queue_roots: Vec::new(), @@ -536,7 +536,7 @@ mod tests { let candidate = CandidateReceipt { parachain_index: para_id, - collator: [1; 32], + collator: [1; 32].into(), head_data: ::polkadot_primitives::parachain::HeadData(vec![1, 2, 3, 4]), balance_uploads: Vec::new(), egress_queue_roots: Vec::new(), diff --git a/polkadot/executor/Cargo.toml b/polkadot/executor/Cargo.toml index cca94287b0c75..e7cfc5b77203d 100644 --- a/polkadot/executor/Cargo.toml +++ b/polkadot/executor/Cargo.toml @@ -5,17 +5,5 @@ authors = ["Parity Technologies "] description = "Polkadot node implementation in Rust." [dependencies] -hex-literal = "0.1" -triehash = { version = "0.1" } -ed25519 = { path = "../../substrate/ed25519" } -substrate-codec = { path = "../../substrate/codec" } -substrate-runtime-io = { path = "../../substrate/runtime-io" } -substrate-runtime-support = { path = "../../substrate/runtime-support" } -substrate-state-machine = { path = "../../substrate/state-machine" } substrate-executor = { path = "../../substrate/executor" } -substrate-primitives = { path = "../../substrate/primitives" } -polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime" } - -[dev-dependencies] -substrate-keyring = { path = "../../substrate/keyring" } diff --git a/polkadot/executor/src/lib.rs b/polkadot/executor/src/lib.rs index e5e096418bec4..be44d8afbae9e 100644 --- a/polkadot/executor/src/lib.rs +++ b/polkadot/executor/src/lib.rs @@ -19,12 +19,5 @@ extern crate polkadot_runtime; #[macro_use] extern crate substrate_executor; -extern crate substrate_codec as codec; -extern crate substrate_state_machine as state_machine; -extern crate substrate_runtime_io as runtime_io; -extern crate substrate_primitives as primitives; -extern crate polkadot_primitives as polkadot_primitives; -extern crate ed25519; -extern crate triehash; native_executor_instance!(pub Executor, polkadot_runtime::api::dispatch, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm")); diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index a140e6ccee928..4deded2969293 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -21,12 +21,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; -#[cfg(feature = "std")] -extern crate serde; - extern crate substrate_runtime_std as rstd; extern crate substrate_primitives as primitives; extern crate substrate_runtime_primitives as runtime_primitives; @@ -35,27 +29,43 @@ extern crate substrate_serializer; extern crate substrate_codec as codec; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +use primitives::bytes; + +use rstd::prelude::*; +use runtime_primitives::traits::BlakeTwo256; +use runtime_primitives::generic; +use codec::{Input, Slicable}; + pub mod parachain; -/// Virtual account ID that represents the idea of a dispatch/statement being signed by everybody -/// (who matters). Essentially this means that a majority of validators have decided it is -/// "correct". -pub const EVERYBODY: AccountId = [255u8; 32]; +/// Block header type as expected by this runtime. +pub type Header = generic::Header; -/// Something that identifies a block. -pub use primitives::block::Id as BlockId; +/// Opaque, encoded, unchecked extrinsic. +pub type UncheckedExtrinsic = Vec; -/// The type of digest item. -pub use primitives::block::Log as Log; +/// A "future-proof" block type for Polkadot. This will be resilient to upgrades in transaction +/// format, because it doesn't attempt to decode extrinsics. +/// +/// Specialized code needs to link to (at least one version of) the runtime directly +/// in order to handle the extrinsics within. +pub type Block = generic::Block; /// An index to a block. /// 32-bits will allow for 136 years of blocks assuming 1 block per second. /// TODO: switch to u32 pub type BlockNumber = u64; -/// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost -/// certainly continue to be the same as the substrate's `AuthorityId`. -pub type AccountId = primitives::AuthorityId; +/// Alias to Ed25519 pubkey that identifies an account on the relay chain. +pub type AccountId = primitives::hash::H256; /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is /// exactly equivalent to what the substrate calls an "authority". @@ -64,14 +74,15 @@ pub type SessionKey = primitives::AuthorityId; /// Indentifier for a chain. 32-bit should be plenty. pub type ChainId = u32; -/// Index of a transaction in the relay chain. 32-bit should be plenty. -pub type Index = u32; - /// A hash of some data used by the relay chain. pub type Hash = primitives::H256; +/// Index of a transaction in the relay chain. 32-bit should be plenty. +pub type Index = u32; + /// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = runtime_primitives::Ed25519Signature; +/// Equipped with logic for possibly "unsigned" messages. +pub type Signature = runtime_primitives::MaybeUnsigned; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; @@ -84,3 +95,22 @@ pub type Timestamp = u64; /// We round denomination to 10^12 (12 sdf), and leave the other redundancy at the upper end so /// that 32 bits may be multiplied with a balance in 128 bits without worrying about overflow. pub type Balance = u128; + +/// "generic" block ID for the future-proof block type. +// TODO: parameterize blockid only as necessary. +pub type BlockId = generic::BlockId; + +/// A log entry in the block. +#[derive(PartialEq, Eq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); + +impl Slicable for Log { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(Log) + } + + fn using_encoded R>(&self, f: F) -> R { + self.0.using_encoded(f) + } +} diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index 3a87b1faa2d11..9f803810e4538 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -14,19 +14,22 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Parachain data types. +//! Polkadot parachain types. + +use codec::{Slicable, Input}; +use rstd::prelude::*; +use rstd::cmp::Ordering; +use super::Hash; #[cfg(feature = "std")] use primitives::bytes; -use primitives; -use codec::{Input, Slicable}; -use rstd::cmp::{PartialOrd, Ord, Ordering}; -use rstd::vec::Vec; -use ::Hash; + +/// Signature on candidate's block data by a collator. +pub type CandidateSignature = ::runtime_primitives::Ed25519Signature; /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Id(u32); impl From for u32 { @@ -67,7 +70,6 @@ pub enum Chain { impl Slicable for Chain { fn decode(input: &mut I) -> Option { let disc = input.read_byte()?; - match disc { 0 => Some(Chain::Relay), 1 => Some(Chain::Parachain(Slicable::decode(input)?)), @@ -84,7 +86,6 @@ impl Slicable for Chain { id.using_encoded(|s| v.extend(s)); } } - v } @@ -128,7 +129,7 @@ impl Slicable for DutyRoster { /// Extrinsic data for a parachain. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Extrinsic; @@ -137,14 +138,14 @@ pub struct Extrinsic; /// /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Candidate { /// The ID of the parachain this is a proposal for. pub parachain_index: Id, /// Collator's signature - pub collator_signature: ::Signature, + pub collator_signature: CandidateSignature, /// Unprocessed ingress queue. /// /// Ordered by parachain ID and block number. @@ -155,20 +156,20 @@ pub struct Candidate { /// Candidate receipt type. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct CandidateReceipt { /// The ID of the parachain this is a candidate for. pub parachain_index: Id, /// The collator's relay-chain account ID - pub collator: ::AccountId, + pub collator: super::AccountId, /// The head-data pub head_data: HeadData, /// Balance uploads to the relay chain. - pub balance_uploads: Vec<(::AccountId, u64)>, + pub balance_uploads: Vec<(super::AccountId, u64)>, /// Egress queue roots. - pub egress_queue_roots: Vec<(Id, primitives::H256)>, + pub egress_queue_roots: Vec<(Id, Hash)>, /// Fees paid from the chain to the relay chain validators pub fees: u64, } @@ -203,8 +204,8 @@ impl CandidateReceipt { /// Get the blake2_256 hash #[cfg(feature = "std")] pub fn hash(&self) -> Hash { - let encoded = self.encode(); - primitives::hashing::blake2_256(&encoded).into() + use runtime_primitives::traits::{BlakeTwo256, Hashing}; + BlakeTwo256::hash_of(self) } } @@ -224,7 +225,7 @@ impl Ord for CandidateReceipt { /// Parachain ingress queue message. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Consolidated ingress queue data. @@ -232,34 +233,34 @@ pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec /// This is just an ordered vector of other parachains' egress queues, /// obtained according to the routing rules. #[derive(Default, PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); /// Parachain block data. /// /// contains everything required to validate para-block, may contain block and witness data #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain header raw bytes wrapper type. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain head data included in the chain. #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain validation code. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Activitiy bit field #[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); impl Slicable for Activity { @@ -339,41 +340,3 @@ impl Slicable for Statement { } } } - -#[cfg(test)] -mod tests { - use super::*; - use substrate_serializer as ser; - - #[test] - fn test_candidate() { - assert_eq!(ser::to_string_pretty(&Candidate { - parachain_index: 5.into(), - collator_signature: primitives::hash::H512::from(10).into(), - unprocessed_ingress: ConsolidatedIngress(vec![ - (Id(1), vec![Message(vec![2])]), - (Id(2), vec![Message(vec![2]), Message(vec![3])]), - ]), - block: BlockData(vec![1, 2, 3]), - }), r#"{ - "parachainIndex": 5, - "collatorSignature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a", - "unprocessedIngress": [ - [ - 1, - [ - "0x02" - ] - ], - [ - 2, - [ - "0x02", - "0x03" - ] - ] - ], - "block": "0x010203" -}"#); - } -} diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index 95044242fef1b..9ac1f50175300 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -9,6 +9,7 @@ log = { version = "0.3", optional = true } serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../safe-mix", default_features = false} +polkadot-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../../substrate/codec" } substrate-serializer = { path = "../../substrate/serializer" } substrate-runtime-std = { path = "../../substrate/runtime-std" } @@ -25,7 +26,6 @@ substrate-runtime-session = { path = "../../substrate/runtime/session" } substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } -polkadot-primitives = { path = "../primitives" } [dev-dependencies] hex-literal = "0.1.0" @@ -33,6 +33,7 @@ hex-literal = "0.1.0" [features] default = ["std"] std = [ + "polkadot-primitives/std", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", @@ -47,7 +48,6 @@ std = [ "substrate-runtime-staking/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", - "polkadot-primitives/std", "serde_derive", "serde/std", "log", diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index 9b86eb91cb338..16d080cb9ee4e 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -18,11 +18,18 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[cfg(feature = "std")] +extern crate serde; + #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; @@ -37,7 +44,10 @@ extern crate substrate_serializer; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_primitives; +#[macro_use] extern crate substrate_runtime_std as rstd; + +extern crate polkadot_primitives as primitives; extern crate substrate_codec as codec; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; @@ -47,14 +57,13 @@ extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; -extern crate polkadot_primitives; mod parachains; -use runtime_io::BlakeTwo256; -use polkadot_primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; -use runtime_primitives::generic; -use runtime_primitives::traits::{Identity, HasPublicAux}; +use rstd::prelude::*; +use primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; +use primitives::parachain::CandidateReceipt; +use runtime_primitives::{generic, traits::{HasPublicAux, BlakeTwo256, Convert}}; #[cfg(feature = "std")] pub use runtime_primitives::BuildExternalities; @@ -62,13 +71,113 @@ pub use runtime_primitives::BuildExternalities; pub use consensus::Call as ConsensusCall; pub use timestamp::Call as TimestampCall; pub use parachains::Call as ParachainsCall; - +pub use primitives::Header; /// The position of the timestamp set extrinsic. pub const TIMESTAMP_SET_POSITION: u32 = 0; /// The position of the parachains set extrinsic. pub const PARACHAINS_SET_POSITION: u32 = 1; +/// Block Id type for this block. +pub type BlockId = generic::BlockId; +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type as expected by this runtime. +pub type Extrinsic = generic::Extrinsic; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// Provides a type-safe wrapper around a structurally valid block. +#[cfg(feature = "std")] +pub struct CheckedBlock { + inner: Block, + file_line: Option<(&'static str, u32)>, +} + +#[cfg(feature = "std")] +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) } + + let has_heads = block.extrinsics.get(PARACHAINS_SET_POSITION as usize).map_or(false, |xt| { + !xt.is_signed() && match xt.extrinsic.function { + Call::Parachains(ParachainsCall::set_heads(_)) => true, + _ => false, + } + }); + + if !has_heads { 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) -> ::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 polkadot block asserted at {:?}", self.file_line), + } + } + + /// Extract the parachain heads from the block. + pub fn parachain_heads(&self) -> &[CandidateReceipt] { + let x = self.inner.extrinsics.get(PARACHAINS_SET_POSITION as usize).and_then(|xt| match xt.extrinsic.function { + Call::Parachains(ParachainsCall::set_heads(ref x)) => Some(&x[..]), + _ => None + }); + + match x { + Some(x) => x, + None => panic!("Invalid polkadot block asserted at {:?}", self.file_line), + } + } + + /// Convert into inner block. + pub fn into_inner(self) -> Block { self.inner } +} + +#[cfg(feature = "std")] +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. +#[cfg(feature = "std")] +#[macro_export] +macro_rules! assert_polkadot_block { + ($block: expr) => { + $crate::CheckedBlock::new_unchecked($block, file!(), line!()) + } +} + /// Concrete runtime type used to parameterize the various modules. pub struct Concrete; @@ -83,7 +192,7 @@ impl system::Trait for Concrete { type Hashing = BlakeTwo256; type Digest = generic::Digest; type AccountId = AccountId; - type Header = generic::Header; + type Header = Header; } /// System module for this concrete runtime. pub type System = system::Module; @@ -102,8 +211,16 @@ impl timestamp::Trait for Concrete { /// Timestamp module for this concrete runtime. pub type Timestamp = timestamp::Module; +/// Session key conversion. +pub struct SessionKeyConversion; +impl Convert for SessionKeyConversion { + fn convert(a: AccountId) -> SessionKey { + a.0 + } +} + impl session::Trait for Concrete { - type ConvertAccountIdToSessionKey = Identity; + type ConvertAccountIdToSessionKey = SessionKeyConversion; } /// Session module for this concrete runtime. pub type Session = session::Module; @@ -135,6 +252,9 @@ impl parachains::Trait for Concrete { pub type Parachains = parachains::Module; impl_outer_dispatch! { + /// Call type for polkadot transactions. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { Consensus = 0, Session = 1, @@ -146,6 +266,9 @@ impl_outer_dispatch! { Parachains = 8, } + /// Internal calls. + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub enum PrivCall { Consensus = 0, Session = 1, @@ -156,14 +279,6 @@ impl_outer_dispatch! { } } -/// Block header type as expected by this runtime. -pub type Header = generic::Header; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; -/// Extrinsic type as expected by this runtime. -pub type Extrinsic = generic::Extrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; @@ -180,6 +295,35 @@ impl_outer_config! { } } +/// Produces the list of inherent extrinsics. +pub fn inherent_extrinsics(timestamp: ::primitives::Timestamp, parachain_heads: Vec) -> Vec { + vec![ + UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: Default::default(), + function: Call::Timestamp(TimestampCall::set(timestamp)), + index: 0, + }, + signature: Default::default(), + }, + UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: Default::default(), + function: Call::Parachains(ParachainsCall::set_heads(parachain_heads)), + index: 0, + }, + signature: Default::default(), + }, + ] +} + +/// Checks an unchecked extrinsic for validity. +pub fn check_extrinsic(xt: UncheckedExtrinsic) -> bool { + use runtime_primitives::traits::Checkable; + + xt.check().is_ok() +} + pub mod api { impl_stubs!( authorities => |()| super::Consensus::authorities(), @@ -187,6 +331,7 @@ pub mod api { apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), execute_block => |block| super::Executive::execute_block(block), finalise_block => |()| super::Executive::finalise_block(), + inherent_extrinsics => |(timestamp, heads)| super::inherent_extrinsics(timestamp, heads), validator_count => |()| super::Session::validator_count(), validators => |()| super::Session::validators() ); @@ -290,9 +435,9 @@ mod tests { }); let raw = block.encode(); - let decoded_substrate = primitives::block::Block::decode(&mut &raw[..]).unwrap(); - let encoded_substrate = decoded_substrate.encode(); - let decoded = Block::decode(&mut &encoded_substrate[..]).unwrap(); + let decoded_primitive = ::primitives::Block::decode(&mut &raw[..]).unwrap(); + let encoded_primitive = decoded_primitive.encode(); + let decoded = Block::decode(&mut &encoded_primitive[..]).unwrap(); assert_eq!(block, decoded); } @@ -301,11 +446,11 @@ mod tests { fn serialize_unchecked() { let tx = UncheckedExtrinsic { extrinsic: Extrinsic { - signed: [1; 32], + signed: [1; 32].into(), index: 999, function: Call::Timestamp(TimestampCall::set(135135)), }, - signature: primitives::hash::H512([0; 64]).into(), + signature: runtime_primitives::Ed25519Signature(primitives::hash::H512([0; 64])).into(), }; // 71000000 // 0101010101010101010101010101010101010101010101010101010101010101 @@ -322,7 +467,7 @@ mod tests { #[test] fn serialize_checked() { let xt = Extrinsic { - signed: hex!["0d71d1a9cad6f2ab773435a7dec1bac019994d05d1dd5eb3108211dcf25c9d1e"], + signed: hex!["0d71d1a9cad6f2ab773435a7dec1bac019994d05d1dd5eb3108211dcf25c9d1e"].into(), index: 0, function: Call::CouncilVoting(council::voting::Call::propose(Box::new( PrivCall::Consensus(consensus::PrivCall::set_code( diff --git a/polkadot/runtime/src/parachains.rs b/polkadot/runtime/src/parachains.rs index 50da4306cb2fc..5bd62afcf246c 100644 --- a/polkadot/runtime/src/parachains.rs +++ b/polkadot/runtime/src/parachains.rs @@ -16,17 +16,16 @@ //! Main parachains logic. For now this is just the determination of which validators do what. -use polkadot_primitives; +use primitives; use rstd::prelude::*; use codec::{Slicable, Joiner}; -use runtime_support::Hashable; use runtime_primitives::traits::{Executable, RefInto, MaybeEmpty}; -use polkadot_primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; +use primitives::parachain::{Id, Chain, DutyRoster, CandidateReceipt}; use {system, session}; -use runtime_support::{StorageValue, StorageMap}; -use runtime_support::dispatch::Result; +use substrate_runtime_support::{Hashable, StorageValue, StorageMap}; +use substrate_runtime_support::dispatch::Result; #[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; @@ -34,7 +33,7 @@ use rstd::marker::PhantomData; #[cfg(any(feature = "std", test))] use {runtime_io, runtime_primitives}; -pub trait Trait: system::Trait + session::Trait { +pub trait Trait: system::Trait + session::Trait { /// The position of the set_heads call in the block. const SET_POSITION: u32; @@ -42,7 +41,11 @@ pub trait Trait: system::Trait + session::Trai } decl_module! { + /// Parachains module. pub struct Module; + + /// Call type for parachains. + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: ::PublicAux { // provide candidate receipts for parachains, in ascending order by id. fn set_heads(aux, heads: Vec) -> Result = 0; @@ -227,7 +230,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use runtime_primitives::BuildExternalities; - use runtime_primitives::traits::{HasPublicAux, Identity}; + use runtime_primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; use consensus; @@ -243,7 +246,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index 9d8f465e4acfb..40e3acb37a1ea 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -11,19 +11,9 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -37,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" 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)", +] [[package]] name = "crunchy" @@ -75,20 +87,15 @@ version = "0.1.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -99,15 +106,37 @@ name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" +name = "ethbloom" +version = "0.5.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)", + "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.64 (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 = "ethereum-types" +version = "0.3.2" +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)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -119,12 +148,23 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +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)", + "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 = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -148,16 +188,16 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -170,12 +210,12 @@ source = "git+https://github.com/paritytech/integer-sqrt-rs.git#886e9cb983c46498 [[package]] name = "keccak-hash" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -185,12 +225,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -206,9 +246,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -229,7 +274,7 @@ name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -245,9 +290,9 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (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.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -255,43 +300,35 @@ name = "parity-wasm" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 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)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.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)", -] - [[package]] name = "polkadot-primitives" version = "0.1.0" dependencies = [ - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -334,12 +371,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -351,15 +396,18 @@ name = "pwasm-utils" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -367,7 +415,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -377,7 +425,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -386,19 +434,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -408,20 +456,19 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] @@ -437,17 +484,17 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "safe-mix" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -457,7 +504,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -470,31 +517,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -511,8 +549,8 @@ name = "substrate-keyring" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.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)", ] [[package]] @@ -520,25 +558,26 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -563,10 +602,11 @@ dependencies = [ name = "substrate-runtime-council" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -585,9 +625,10 @@ dependencies = [ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -604,8 +645,8 @@ dependencies = [ name = "substrate-runtime-executive" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -620,12 +661,12 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -634,8 +675,8 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -647,21 +688,22 @@ dependencies = [ name = "substrate-runtime-sandbox" version = "0.1.0" dependencies = [ - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (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", "substrate-runtime-std 0.1.0", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-runtime-session" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -677,9 +719,10 @@ dependencies = [ name = "substrate-runtime-staking" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -700,7 +743,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -708,9 +751,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -721,9 +764,9 @@ dependencies = [ name = "substrate-runtime-system" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (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", @@ -736,8 +779,9 @@ dependencies = [ name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -751,43 +795,39 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (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)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -803,14 +843,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.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)", + "heapsize 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_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -820,10 +871,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -850,32 +901,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"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 byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "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 memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775393e285254d2f5004596d69bb8bc1149754570dcc08cf30cabeba67955e28" @@ -883,39 +938,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" "checksum parity-wasm 0.30.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41083957b80abb8a01fac4d2773d5f92653aed8f0b740c8d3da1da62c7857abe" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" "checksum pwasm-utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3a822d2a1624b10c46572c231c149575bcc261c37d84fd3f1a2f5ae1f65515" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/polkadot/runtime/wasm/Cargo.toml b/polkadot/runtime/wasm/Cargo.toml index a75bd649adff0..f5dc280e6f6b2 100644 --- a/polkadot/runtime/wasm/Cargo.toml +++ b/polkadot/runtime/wasm/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib"] [dependencies] integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } +polkadot-primitives = { path = "../../primitives", default-features = false } safe-mix = { path = "../../../safe-mix", default-features = false } substrate-codec = { path = "../../../substrate/codec", default-features = false } substrate-primitives = { path = "../../../substrate/primitives", default-features = false } @@ -23,11 +24,11 @@ substrate-runtime-session = { path = "../../../substrate/runtime/session", defau substrate-runtime-staking = { path = "../../../substrate/runtime/staking", default-features = false } substrate-runtime-system = { path = "../../../substrate/runtime/system", default-features = false } substrate-runtime-timestamp = { path = "../../../substrate/runtime/timestamp", default-features = false } -polkadot-primitives = { path = "../../primitives", default-features = false } [features] default = [] std = [ + "polkadot-primitives/std", "safe-mix/std", "substrate-codec/std", "substrate-primitives/std", @@ -43,7 +44,6 @@ std = [ "substrate-runtime-staking/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", - "polkadot-primitives/std", ] [profile.release] diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 7ca1577099c7265311bdec5c3735eace6b012de3..9ea43b2f9a1d5c885b5fddb6f6a313aac6f36f0e 100644 GIT binary patch delta 143770 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؛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 OU?2?d)}Z(N{Qm&{BxS+? diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 1a254a365da3d72993bcd940549a0640ce99efe9..dc22849a14312914d92ad3f37d955b99f97bdcd2 100755 GIT binary patch delta 140865 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 PI6HzS>BzM~J3Rg$Y$@w< delta 145275 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 L(rtc^`1yYT8qibp diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 13dae55c4ed19..1e86d52112b96 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -19,6 +19,7 @@ extern crate futures; extern crate ed25519; +extern crate exit_future; extern crate parking_lot; extern crate tokio_timer; extern crate polkadot_primitives; @@ -28,17 +29,16 @@ extern crate polkadot_api; extern crate polkadot_consensus as consensus; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_keystore as keystore; -extern crate substrate_client as client; extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_codec as codec; -extern crate substrate_client_db as client_db; extern crate substrate_executor; extern crate substrate_state_machine as state_machine; -extern crate exit_future; extern crate tokio_core; +extern crate substrate_client as client; +extern crate substrate_client_db as client_db; #[macro_use] extern crate error_chain; @@ -56,13 +56,13 @@ use std::thread; use futures::prelude::*; use tokio_core::reactor::Core; use codec::Slicable; -use primitives::block::{Id as BlockId, ExtrinsicHash, HeaderHash, Header}; -use primitives::{AuthorityId}; +use primitives::AuthorityId; use transaction_pool::TransactionPool; use substrate_executor::NativeExecutor; use polkadot_executor::Executor as LocalDispatch; use keystore::Store as Keystore; use polkadot_api::PolkadotApi; +use polkadot_primitives::{Block, BlockId, Hash, Header}; use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; use client::backend::Backend; @@ -78,8 +78,8 @@ type CodeExecutor = NativeExecutor; /// Polkadot service. pub struct Service { thread: Option>, - client: Arc>, - network: Arc, + client: Arc>, + network: Arc>, transaction_pool: Arc, signal: Option, _consensus: Option, @@ -87,18 +87,18 @@ pub struct Service { struct TransactionPoolAdapter where A: Send + Sync, E: Send + Sync { pool: Arc, - client: Arc>, + client: Arc>, api: Arc, } -impl network::TransactionPool for TransactionPoolAdapter +impl network::TransactionPool for TransactionPoolAdapter where - B: Backend + Send + Sync, - E: client::CallExecutor + Send + Sync, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, + B: Backend + Send + Sync, + E: client::CallExecutor + Send + Sync, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, A: PolkadotApi + Send + Sync, { - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)> { + fn transactions(&self) -> Vec<(Hash, Vec)> { let best_block = match self.client.info() { Ok(info) => info.chain.best_hash, Err(e) => { @@ -107,21 +107,25 @@ impl network::TransactionPool for TransactionPoolAdapter } }; - let id = self.api.check_id(BlockId::Hash(best_block)).expect("Best block is always valid; qed."); + let id = match self.api.check_id(BlockId::hash(best_block)) { + Ok(id) => id, + Err(_) => return Vec::new(), + }; + let ready = transaction_pool::Ready::create(id, &*self.api); self.pool.cull_and_get_pending(ready, |pending| pending .map(|t| { - let hash = ::primitives::Hash::from(&t.hash()[..]); - let tx = codec::Slicable::encode(t.as_transaction()); - (hash, tx) + let hash = t.hash().clone(); + (hash, t.primitive_extrinsic()) }) .collect() ) } - fn import(&self, transaction: &[u8]) -> Option { - if let Some(uxt) = codec::Slicable::decode(&mut &transaction[..]) { + fn import(&self, transaction: &Vec) -> Option { + let encoded = transaction.encode(); + if let Some(uxt) = codec::Slicable::decode(&mut &encoded[..]) { match self.pool.import_unchecked_extrinsic(uxt) { Ok(xt) => Some(*xt.hash()), Err(e) => match *e.kind() { @@ -138,7 +142,7 @@ impl network::TransactionPool for TransactionPoolAdapter } } - fn on_broadcasted(&self, propagations: HashMap>) { + fn on_broadcasted(&self, propagations: HashMap>) { self.pool.on_broadcasted(propagations) } } @@ -165,12 +169,12 @@ fn poc_2_testnet_config() -> ChainConfig { }), system: None, session: Some(SessionConfig { - validators: initial_authorities.clone(), + validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 720, // that's 1 hour per session. }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.clone(), + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), transaction_base_fee: 100, transaction_byte_fee: 1, balances: endowed_accounts.iter().map(|&k|(k, 1u128 << 60)).collect(), @@ -210,12 +214,12 @@ fn poc_2_testnet_config() -> ChainConfig { fn testnet_config(initial_authorities: Vec) -> ChainConfig { let endowed_accounts = vec![ - ed25519::Pair::from_seed(b"Alice ").public().into(), - ed25519::Pair::from_seed(b"Bob ").public().into(), - ed25519::Pair::from_seed(b"Charlie ").public().into(), - ed25519::Pair::from_seed(b"Dave ").public().into(), - ed25519::Pair::from_seed(b"Eve ").public().into(), - ed25519::Pair::from_seed(b"Ferdie ").public().into(), + 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(), ]; let genesis_config = GenesisConfig { consensus: Some(ConsensusConfig { @@ -224,12 +228,12 @@ fn testnet_config(initial_authorities: Vec) -> ChainConfig { }), system: None, session: Some(SessionConfig { - validators: initial_authorities.clone(), + validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 10, }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.clone(), + intentions: initial_authorities.iter().cloned().map(Into::into).collect(), transaction_base_fee: 1, transaction_byte_fee: 0, balances: endowed_accounts.iter().map(|&k|(k, (1u128 << 60))).collect(), @@ -243,7 +247,7 @@ fn testnet_config(initial_authorities: Vec) -> ChainConfig { minimum_deposit: 10, }), council: Some(CouncilConfig { - active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|b| a == b).is_none()).map(|a| (a.clone(), 1000000)).collect(), + active_council: endowed_accounts.iter().filter(|a| initial_authorities.iter().find(|&b| &a.0 == b).is_none()).map(|a| (a.clone(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, present_slash_per_voter: 1, @@ -280,16 +284,23 @@ struct GenesisBuilder { config: GenesisConfig, } -impl client::GenesisBuilder for GenesisBuilder { +impl client::GenesisBuilder for GenesisBuilder { fn build(self) -> (Header, Vec<(Vec, Vec)>) { let storage = self.config.build_externalities(); - let block = genesis::construct_genesis_block(&storage); - (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + let block = genesis::construct_genesis_block::(&storage); + (block.header, storage.into_iter().collect()) } } /// Creates light client and register protocol with the network service -pub fn new_light(config: Configuration) -> Result>>, error::Error> { +pub fn new_light(config: Configuration) + -> Result< + Service< + client::light::Backend, + client::RemoteCallExecutor, network::OnDemand>> + >, + error::Error, + > { Service::new(move |_, executor, genesis_builder: GenesisBuilder| { let client_backend = client::light::new_light_backend(); let fetch_checker = Arc::new(client::light::new_fetch_checker(client_backend.clone(), executor)); @@ -303,7 +314,7 @@ pub fn new_light(config: Configuration) -> Result Result>, error::Error> { +pub fn new_full(config: Configuration) -> Result, client::LocalCallExecutor, CodeExecutor>>, error::Error> { let is_validator = (config.roles & Role::VALIDATOR) == Role::VALIDATOR; Service::new(|db_settings, executor, genesis_builder: GenesisBuilder| Ok((Arc::new(client_db::new_client(db_settings, executor, genesis_builder)?), None)), @@ -330,9 +341,9 @@ pub fn new_full(config: Configuration) -> Result Service where - B: Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error> + B: Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error> { /// Creates and register protocol with the network service fn new(client_creator: F, api_creator: G, consensus_creator: C, mut config: Configuration) -> Result @@ -341,13 +352,13 @@ impl Service client_db::DatabaseSettings, CodeExecutor, GenesisBuilder, - ) -> Result<(Arc>, Option>>), error::Error>, + ) -> Result<(Arc>, Option>>>), error::Error>, G: Fn( - Arc>, + Arc>, ) -> Arc, C: Fn( - Arc>, - Arc, + Arc>, + Arc>, Arc, &Keystore ) -> Result, error::Error>, @@ -405,7 +416,6 @@ impl Service on_demand: on_demand.clone().map(|d| d as Arc), transaction_pool: transaction_pool_adapter, }; - let network = network::Service::new(network_params)?; let barrier = ::std::sync::Arc::new(Barrier::new(2)); on_demand.map(|on_demand| on_demand.set_service_link(Arc::downgrade(&network))); @@ -468,12 +478,12 @@ impl Service } /// Get shared client instance. - pub fn client(&self) -> Arc> { + pub fn client(&self) -> Arc> { self.client.clone() } /// Get shared network instance. - pub fn network(&self) -> Arc { + pub fn network(&self) -> Arc> { self.network.clone() } @@ -484,11 +494,11 @@ impl Service } /// Produce a task which prunes any finalized transactions from the pool. -pub fn prune_imported(api: &A, pool: &TransactionPool, hash: HeaderHash) +pub fn prune_imported(api: &A, pool: &TransactionPool, hash: Hash) where A: PolkadotApi, { - match api.check_id(BlockId::Hash(hash)) { + match api.check_id(BlockId::hash(hash)) { Ok(id) => { let ready = transaction_pool::Ready::create(id, api); pool.cull(None, ready); diff --git a/polkadot/statement-table/src/lib.rs b/polkadot/statement-table/src/lib.rs index e3abf95686900..86b95b0d90ff1 100644 --- a/polkadot/statement-table/src/lib.rs +++ b/polkadot/statement-table/src/lib.rs @@ -21,8 +21,8 @@ pub mod generic; pub use generic::Table; -use primitives::parachain::{Id, CandidateReceipt}; -use primitives::{SessionKey, Hash, Signature}; +use primitives::parachain::{Id, CandidateReceipt, CandidateSignature as Signature}; +use primitives::{SessionKey, Hash}; /// Statements about candidates on the network. pub type Statement = generic::Statement; diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 015777a86370e..2c2224b5d3da7 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -40,106 +40,23 @@ use std::{ use codec::Slicable; use extrinsic_pool::{Pool, txpool::{self, Readiness, scoring::{Change, Choice}}}; +use extrinsic_pool::api::ExtrinsicPool; use polkadot_api::PolkadotApi; -use primitives::parachain::CandidateReceipt; -use primitives::{AccountId, Timestamp, Hash}; -use runtime::{Block, UncheckedExtrinsic, TimestampCall, ParachainsCall, Call}; -use substrate_primitives::block::{Extrinsic, ExtrinsicHash}; -use substrate_primitives::hexdisplay::HexDisplay; -use substrate_runtime_primitives::traits::{Bounded, Checkable}; +use primitives::{AccountId, Hash, UncheckedExtrinsic as FutureProofUncheckedExtrinsic}; +use runtime::UncheckedExtrinsic; +use substrate_runtime_primitives::traits::{Bounded, Checkable, BlakeTwo256, Hashing}; pub use extrinsic_pool::txpool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; pub use error::{Error, ErrorKind, Result}; -/// Useful functions for working with Polkadot blocks. -pub struct PolkadotBlock { - block: Block, - location: Option<(&'static str, usize)>, -} - -impl PolkadotBlock { - /// Create a new block, checking high-level well-formedness. - pub fn from(unchecked: Block) -> ::std::result::Result { - if unchecked.extrinsics.len() < 2 { - return Err(unchecked); - } - if unchecked.extrinsics[0].is_signed() { - return Err(unchecked); - } - if unchecked.extrinsics[1].is_signed() { - return Err(unchecked); - } - - match unchecked.extrinsics[0].extrinsic.function { - Call::Timestamp(TimestampCall::set(_)) => {}, - _ => return Err(unchecked), - } - - match unchecked.extrinsics[1].extrinsic.function { - Call::Parachains(ParachainsCall::set_heads(_)) => {}, - _ => return Err(unchecked), - } - - // any further checks... - Ok(PolkadotBlock { block: unchecked, location: None }) - } - - /// Create a new block, skipping any high-level well-formedness checks. WARNING: This could - /// result in internal functions panicking if the block is, in fact, not well-formed. - pub fn force_from(known_good: Block, file: &'static str, line: usize) -> Self { - PolkadotBlock { block: known_good, location: Some((file, line)) } - } - - /// Retrieve the timestamp of a Polkadot block. - pub fn timestamp(&self) -> Timestamp { - if let Call::Timestamp(TimestampCall::set(t)) = self.block.extrinsics[0].extrinsic.function { - t - } else { - if let Some((file, line)) = self.location { - panic!("Invalid block used in `PolkadotBlock::force_from` at {}:{}", file, line); - } else { - panic!("Invalid block made it through the PolkadotBlock verification!?"); - } - } - } - - /// Retrieve the parachain candidates proposed for this block. - pub fn parachain_heads(&self) -> &[CandidateReceipt] { - if let Call::Parachains(ParachainsCall::set_heads(ref t)) = self.block.extrinsics[1].extrinsic.function { - &t[..] - } else { - if let Some((file, line)) = self.location { - panic!("Invalid block used in `PolkadotBlock::force_from` at {}:{}", file, line); - } else { - panic!("Invalid block made it through the PolkadotBlock verification!?"); - } - } - } -} - -#[macro_export] -macro_rules! assert_polkadot_block { - ($known_good:expr) => ( PolkadotBlock::force_from(known_good, file!(), line!()) ) -} - -impl ::std::ops::Deref for PolkadotBlock { - type Target = Block; - fn deref(&self) -> &Block { - &self.block - } -} - -impl From for Block { - fn from(pd: PolkadotBlock) -> Self { - pd.block - } -} +/// Type alias for convenience. +pub type CheckedExtrinsic = ::Checked; /// A verified transaction which should be includable and non-inherent. #[derive(Debug, Clone)] pub struct VerifiedTransaction { - inner: ::Checked, - hash: ExtrinsicHash, + inner: CheckedExtrinsic, + hash: Hash, encoded_size: usize, } @@ -150,10 +67,10 @@ impl VerifiedTransaction { bail!(ErrorKind::IsInherent(xt)) } - let message = codec::Slicable::encode(&xt); + let message = Slicable::encode(&xt); match xt.check() { Ok(xt) => { - let hash = substrate_primitives::hashing::blake2_256(&message); + let hash = BlakeTwo256::hash(&message); Ok(VerifiedTransaction { inner: xt, hash: hash.into(), @@ -169,8 +86,14 @@ impl VerifiedTransaction { self.as_ref().as_unchecked() } + /// Convert to primitive unchecked extrinsic. + pub fn primitive_extrinsic(&self) -> ::primitives::UncheckedExtrinsic { + Slicable::decode(&mut self.as_transaction().encode().as_slice()) + .expect("UncheckedExtrinsic shares repr with Vec; qed") + } + /// Consume the verified transaciton, yielding the unchecked counterpart. - pub fn into_inner(self) -> ::Checked { + pub fn into_inner(self) -> CheckedExtrinsic { self.inner } @@ -190,8 +113,8 @@ impl VerifiedTransaction { } } -impl AsRef< ::Checked > for VerifiedTransaction { - fn as_ref(&self) -> &::Checked { +impl AsRef for VerifiedTransaction { + fn as_ref(&self) -> &CheckedExtrinsic { &self.inner } } @@ -303,15 +226,12 @@ impl<'a, T: 'a + PolkadotApi> txpool::Ready for Ready<'a, T pub struct Verifier; -impl txpool::Verifier for Verifier { +impl txpool::Verifier for Verifier { type VerifiedTransaction = VerifiedTransaction; type Error = Error; - fn verify_transaction(&self, xt: Extrinsic) -> Result { - info!("Extrinsic submitted: {}", HexDisplay::from(&xt.0)); - let uxt = xt.using_encoded(|ref mut s| UncheckedExtrinsic::decode(s)) - .ok_or_else(|| ErrorKind::InvalidExtrinsicFormat)?; - info!("Correctly formatted: {:?}", uxt); + fn verify_transaction(&self, uxt: UncheckedExtrinsic) -> Result { + info!("Extrinsic Submitted: {:?}", uxt); VerifiedTransaction::create(uxt) } } @@ -320,7 +240,7 @@ impl txpool::Verifier for Verifier { /// /// Wraps a `extrinsic_pool::Pool`. pub struct TransactionPool { - inner: Pool, + inner: Pool, } impl TransactionPool { @@ -337,14 +257,25 @@ impl TransactionPool { } impl Deref for TransactionPool { - type Target = Pool; + type Target = Pool; fn deref(&self) -> &Self::Target { &self.inner } } -#[cfg(test)] -mod tests { -} +impl ExtrinsicPool for TransactionPool { + type Error = Error; + fn submit(&self, xts: Vec) -> Result> { + // TODO: more general transaction pool, which can handle more kinds of vec-encoded transactions, + // even when runtime is out of date. + xts.into_iter() + .map(|xt| xt.encode()) + .map(|encoded| UncheckedExtrinsic::decode(&mut &encoded[..])) + .map(|maybe_decoded| maybe_decoded.ok_or_else(|| ErrorKind::InvalidExtrinsicFormat.into())) + .map(|x| x.and_then(|x| self.import_unchecked_extrinsic(x))) + .map(|x| x.map(|x| x.hash().clone())) + .collect() + } +} diff --git a/substrate/bft/Cargo.toml b/substrate/bft/Cargo.toml index 72aac2903e053..68179536b4330 100644 --- a/substrate/bft/Cargo.toml +++ b/substrate/bft/Cargo.toml @@ -8,6 +8,7 @@ futures = "0.1.17" substrate-codec = { path = "../codec" } substrate-primitives = { path = "../primitives" } substrate-runtime-support = { path = "../runtime-support" } +substrate-runtime-primitives = { path = "../runtime/primitives" } ed25519 = { path = "../ed25519" } tokio-timer = "0.1.2" parking_lot = "0.4" diff --git a/substrate/bft/src/error.rs b/substrate/bft/src/error.rs index 22baeece09b00..c18528a3f1e09 100644 --- a/substrate/bft/src/error.rs +++ b/substrate/bft/src/error.rs @@ -18,10 +18,10 @@ error_chain! { errors { - /// Missing state at block with given Id. - StateUnavailable(b: ::primitives::block::Id) { + /// Missing state at block with given descriptor. + StateUnavailable(b: String) { description("State missing at given block."), - display("State unavailable at block {:?}", b), + display("State unavailable at block {}", b), } /// I/O terminated unexpectedly diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index 327cfc0ad0d47..313a0e731cb04 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -22,6 +22,7 @@ pub mod generic; 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 ed25519; extern crate tokio_timer; extern crate parking_lot; @@ -41,9 +42,9 @@ use std::sync::atomic::{AtomicBool, Ordering}; use codec::Slicable; use ed25519::LocalizedSignature; -use runtime_support::Hashable; -use primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction, Justification as PrimitiveJustification}; -use primitives::block::{Block, Id as BlockId, Header, HeaderHash}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{Block, Header}; +use runtime_primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction, Justification as PrimitiveJustification}; use primitives::AuthorityId; use futures::{task, Async, Stream, Sink, Future, IntoFuture}; @@ -56,27 +57,27 @@ pub use error::{Error, ErrorKind}; /// Messages over the proposal. /// Each message carries an associated round number. -pub type Message = generic::Message; +pub type Message = generic::Message::Hash>; /// Localized message type. -pub type LocalizedMessage = generic::LocalizedMessage< - Block, - HeaderHash, +pub type LocalizedMessage = generic::LocalizedMessage< + B, + ::Hash, AuthorityId, LocalizedSignature >; /// Justification of some hash. -pub type Justification = generic::Justification; +pub type Justification = generic::Justification; /// Justification of a prepare message. -pub type PrepareJustification = generic::PrepareJustification; +pub type PrepareJustification = generic::PrepareJustification; /// Unchecked justification. -pub type UncheckedJustification = generic::UncheckedJustification; +pub type UncheckedJustification = generic::UncheckedJustification; -impl From for UncheckedJustification { - fn from(just: PrimitiveJustification) -> Self { +impl From> for UncheckedJustification { + fn from(just: PrimitiveJustification) -> Self { UncheckedJustification { round_number: just.round_number as usize, digest: just.hash, @@ -88,46 +89,46 @@ impl From for UncheckedJustification { } } -impl From for PrimitiveJustification { - fn from(just: UncheckedJustification) -> Self { +impl Into> for UncheckedJustification { + fn into(self) -> PrimitiveJustification { PrimitiveJustification { - round_number: just.round_number as u32, - hash: just.digest, - signatures: just.signatures.into_iter().map(|s| (s.signer.into(), s.signature)).collect(), + round_number: self.round_number as u32, + hash: self.digest, + signatures: self.signatures.into_iter().map(|s| (s.signer.into(), s.signature)).collect(), } } } /// Result of a committed round of BFT -pub type Committed = generic::Committed; +pub type Committed = generic::Committed::Hash, LocalizedSignature>; /// Communication between BFT participants. -pub type Communication = generic::Communication; +pub type Communication = generic::Communication::Hash, AuthorityId, LocalizedSignature>; /// Misbehavior observed from BFT participants. -pub type Misbehavior = generic::Misbehavior; +pub type Misbehavior = generic::Misbehavior; /// Proposer factory. Can be used to create a proposer instance. -pub trait ProposerFactory { +pub trait ProposerFactory { /// The proposer type this creates. - type Proposer: Proposer; + type Proposer: Proposer; /// Error which can occur upon creation. type Error: From; /// Initialize the proposal logic on top of a specific header. // TODO: provide state context explicitly? - fn init(&self, parent_header: &Header, authorities: &[AuthorityId], sign_with: Arc) -> Result; + fn init(&self, parent_header: &B::Header, authorities: &[AuthorityId], sign_with: Arc) -> Result; } /// Logic for a proposer. /// /// This will encapsulate creation and evaluation of proposals at a specific /// block. -pub trait Proposer { +pub trait Proposer { /// Error type which can occur when proposing or evaluating. type Error: From + From + 'static; - /// Future that resolves to a created proposal. - type Create: IntoFuture; + /// Future that resolves to a committed proposal. + type Create: IntoFuture; /// Future that resolves when a proposal is evaluated. type Evaluate: IntoFuture; @@ -135,10 +136,10 @@ pub trait Proposer { fn propose(&self) -> Self::Create; /// Evaluate proposal. True means valid. - fn evaluate(&self, proposal: &Block) -> Self::Evaluate; + fn evaluate(&self, proposal: &B) -> Self::Evaluate; /// Import witnessed misbehavior. - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, Misbehavior)>); + fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, Misbehavior)>); /// Determine the proposer for a given round. This should be a deterministic function /// with consistent results across all authorities. @@ -146,33 +147,37 @@ pub trait Proposer { } /// Block import trait. -pub trait BlockImport { +pub trait BlockImport { /// Import a block alongside its corresponding justification. - fn import_block(&self, block: Block, justification: Justification); + fn import_block(&self, block: B, justification: Justification); } /// Trait for getting the authorities at a given block. -pub trait Authorities { +pub trait Authorities { /// Get the authorities at the given block. - fn authorities(&self, at: &BlockId) -> Result, Error>; + fn authorities(&self, at: &BlockId) -> Result, Error>; } /// Instance of BFT agreement. -struct BftInstance

    { +struct BftInstance { key: Arc, authorities: Vec, - parent_hash: HeaderHash, + parent_hash: B::Hash, timer: Timer, round_timeout_multiplier: u64, proposer: P, } -impl generic::Context for BftInstance

    { +impl> generic::Context for BftInstance + where + B: Clone + Eq, + B::Hash: ::std::hash::Hash, +{ type Error = P::Error; type AuthorityId = AuthorityId; - type Digest = HeaderHash; + type Digest = B::Hash; type Signature = LocalizedSignature; - type Candidate = Block; + type Candidate = B; type RoundTimeout = Box + Send>; type CreateProposal = ::Future; type EvaluateProposal = ::Future; @@ -185,11 +190,11 @@ impl generic::Context for BftInstance

    { self.proposer.propose().into_future() } - fn candidate_digest(&self, proposal: &Block) -> HeaderHash { - proposal.header.blake2_256().into() + fn candidate_digest(&self, proposal: &B) -> B::Hash { + proposal.hash() } - fn sign_local(&self, message: Message) -> LocalizedMessage { + fn sign_local(&self, message: Message) -> LocalizedMessage { sign_message(message, &*self.key, self.parent_hash.clone()) } @@ -197,7 +202,7 @@ impl generic::Context for BftInstance

    { self.proposer.round_proposer(round, &self.authorities[..]) } - fn proposal_valid(&self, proposal: &Block) -> Self::EvaluateProposal { + fn proposal_valid(&self, proposal: &B) -> Self::EvaluateProposal { self.proposer.evaluate(proposal).into_future() } @@ -217,23 +222,27 @@ impl generic::Context for BftInstance

    { /// A future that resolves either when canceled (witnessing a block from the network at same height) /// or when agreement completes. -pub struct BftFuture where - P: Proposer, - InStream: Stream, - OutSink: Sink, +pub struct BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { - inner: generic::Agreement, InStream, OutSink>, + inner: generic::Agreement, InStream, OutSink>, cancel: Arc, send_task: Option>, import: Arc, } -impl Future for BftFuture where - P: Proposer, +impl Future for BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, P::Error: ::std::fmt::Display, - I: BlockImport, - InStream: Stream, - OutSink: Sink, + I: BlockImport, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { type Item = (); type Error = (); @@ -258,7 +267,7 @@ impl Future for BftFuture wher // we will get the block from the network later. if let Some(justified_block) = committed.candidate { info!(target: "bft", "Importing block #{} ({}) directly from BFT consensus", - justified_block.header.number, HeaderHash::from(justified_block.header.blake2_256())); + justified_block.header().number(), justified_block.hash()); self.import.import_block(justified_block, committed.justification) } @@ -267,10 +276,12 @@ impl Future for BftFuture wher } } -impl Drop for BftFuture where - P: Proposer, - InStream: Stream, - OutSink: Sink, +impl Drop for BftFuture where + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: Proposer, + InStream: Stream, Error=P::Error>, + OutSink: Sink, SinkError=P::Error>, { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. @@ -301,24 +312,26 @@ impl Drop for AgreementHandle { /// The BftService kicks off the agreement process on top of any blocks it /// is notified of. -pub struct BftService { +pub struct BftService { client: Arc, - live_agreement: Mutex>, + live_agreement: Mutex>, timer: Timer, round_timeout_multiplier: u64, key: Arc, // TODO: key changing over time. factory: P, } -impl BftService +impl BftService where - P: ProposerFactory, - ::Error: ::std::fmt::Display, - I: BlockImport + Authorities, + B: Block + Clone + Eq, + B::Hash: ::std::hash::Hash, + P: ProposerFactory, + >::Error: ::std::fmt::Display, + I: BlockImport + Authorities, { /// Create a new service instance. - pub fn new(client: Arc, key: Arc, factory: P) -> BftService { + pub fn new(client: Arc, key: Arc, factory: P) -> BftService { BftService { client: client, live_agreement: Mutex::new(None), @@ -340,17 +353,17 @@ impl BftService /// If the local signing key is an authority, this will begin the consensus process to build a /// block on top of it. If the executor fails to run the future, an error will be returned. /// Returns `None` if the agreement on the block with given parent is already in progress. - pub fn build_upon(&self, header: &Header, input: InStream, output: OutSink) - -> Result::Proposer, I, InStream, OutSink>>, P::Error> where - InStream: Stream::Proposer as Proposer>::Error>, - OutSink: Sink::Proposer as Proposer>::Error>, + pub fn build_upon(&self, header: &B::Header, input: InStream, output: OutSink) + -> Result>::Proposer, I, InStream, OutSink>>, P::Error> where + InStream: Stream, Error=<

    >::Proposer as Proposer>::Error>, + OutSink: Sink, SinkError=<

    >::Proposer as Proposer>::Error>, { - let hash = header.blake2_256().into(); - if self.live_agreement.lock().as_ref().map_or(false, |&(h, _)| h == hash) { + let hash = header.hash(); + if self.live_agreement.lock().as_ref().map_or(false, |&(ref h, _)| h == &hash) { return Ok(None); } - let authorities = self.client.authorities(&BlockId::Hash(hash))?; + let authorities = self.client.authorities(&BlockId::Hash(hash.clone()))?; let n = authorities.len(); let max_faulty = max_faulty_of(n); @@ -368,7 +381,7 @@ impl BftService let bft_instance = BftInstance { proposer, - parent_hash: hash, + parent_hash: hash.clone(), round_timeout_multiplier: self.round_timeout_multiplier, timer: self.timer.clone(), key: self.key.clone(), @@ -409,8 +422,8 @@ impl BftService } /// Get current agreement parent hash if any. - pub fn live_agreement(&self) -> Option { - self.live_agreement.lock().as_ref().map(|&(h, _)| h.clone()) + pub fn live_agreement(&self) -> Option { + self.live_agreement.lock().as_ref().map(|&(ref h, _)| h.clone()) } } @@ -427,8 +440,8 @@ pub fn bft_threshold(n: usize) -> usize { n - max_faulty_of(n) } -fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8], just: UncheckedJustification) - -> Result +fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8], just: UncheckedJustification) + -> Result, UncheckedJustification> { // TODO: return additional error information. just.check(authorities.len() - max_faulty_of(authorities.len()), |_, _, sig| { @@ -447,12 +460,12 @@ fn check_justification_signed_message(authorities: &[AuthorityId], message: &[u8 /// Provide all valid authorities. /// /// On failure, returns the justification back. -pub fn check_justification(authorities: &[AuthorityId], parent: HeaderHash, just: UncheckedJustification) - -> Result +pub fn check_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) + -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage { + let message = Slicable::encode(&PrimitiveMessage:: { parent, - action: PrimitiveAction::Commit(just.round_number as u32, just.digest), + action: PrimitiveAction::Commit(just.round_number as u32, just.digest.clone()), }); check_justification_signed_message(authorities, &message[..], just) @@ -462,12 +475,12 @@ pub fn check_justification(authorities: &[AuthorityId], parent: HeaderHash, just /// Provide all valid authorities. /// /// On failure, returns the justification back. -pub fn check_prepare_justification(authorities: &[AuthorityId], parent: HeaderHash, just: UncheckedJustification) - -> Result +pub fn check_prepare_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) + -> Result, UncheckedJustification> { - let message = Slicable::encode(&PrimitiveMessage { + let message = Slicable::encode(&PrimitiveMessage:: { parent, - action: PrimitiveAction::Prepare(just.round_number as u32, just.digest), + action: PrimitiveAction::Prepare(just.round_number as u32, just.digest.clone()), }); check_justification_signed_message(authorities, &message[..], just) @@ -475,10 +488,10 @@ pub fn check_prepare_justification(authorities: &[AuthorityId], parent: HeaderHa /// Check proposal message signatures and authority. /// Provide all valid authorities. -pub fn check_proposal( +pub fn check_proposal( authorities: &[AuthorityId], - parent_hash: &HeaderHash, - propose: &::generic::LocalizedProposal) + parent_hash: &B::Hash, + propose: &::generic::LocalizedProposal) -> Result<(), Error> { if !authorities.contains(&propose.sender) { @@ -487,16 +500,16 @@ pub fn check_proposal( let action_header = PrimitiveAction::ProposeHeader(propose.round_number as u32, propose.digest.clone()); let action_propose = PrimitiveAction::Propose(propose.round_number as u32, propose.proposal.clone()); - check_action(action_header, parent_hash, &propose.digest_signature)?; - check_action(action_propose, parent_hash, &propose.full_signature) + check_action::(action_header, parent_hash, &propose.digest_signature)?; + check_action::(action_propose, parent_hash, &propose.full_signature) } /// Check vote message signatures and authority. /// Provide all valid authorities. -pub fn check_vote( +pub fn check_vote( authorities: &[AuthorityId], - parent_hash: &HeaderHash, - vote: &::generic::LocalizedVote) + parent_hash: &B::Hash, + vote: &::generic::LocalizedVote) -> Result<(), Error> { if !authorities.contains(&vote.sender) { @@ -504,14 +517,14 @@ pub fn check_vote( } let action = match vote.vote { - ::generic::Vote::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), - ::generic::Vote::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Vote::Prepare(r, ref h) => PrimitiveAction::Prepare(r as u32, h.clone()), + ::generic::Vote::Commit(r, ref h) => PrimitiveAction::Commit(r as u32, h.clone()), ::generic::Vote::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), }; - check_action(action, parent_hash, &vote.signature) + check_action::(action, parent_hash, &vote.signature) } -fn check_action(action: PrimitiveAction, parent_hash: &HeaderHash, sig: &LocalizedSignature) -> Result<(), Error> { +fn check_action(action: PrimitiveAction, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { let primitive = PrimitiveMessage { parent: parent_hash.clone(), action, @@ -526,12 +539,12 @@ fn check_action(action: PrimitiveAction, parent_hash: &HeaderHash, sig: &Localiz } /// Sign a BFT message with the given key. -pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedMessage { +pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: B::Hash) -> LocalizedMessage { let signer = key.public(); - let sign_action = |action| { + let sign_action = |action: PrimitiveAction| { let primitive = PrimitiveMessage { - parent: parent_hash, + parent: parent_hash.clone(), action, }; @@ -544,7 +557,7 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa match message { ::generic::Message::Propose(r, proposal) => { - let header_hash: HeaderHash = proposal.header.blake2_256().into(); + let header_hash = proposal.hash(); let action_header = PrimitiveAction::ProposeHeader(r as u32, header_hash.clone()); let action_propose = PrimitiveAction::Propose(r as u32, proposal.clone()); @@ -559,8 +572,8 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa } ::generic::Message::Vote(vote) => { let action = match vote { - ::generic::Vote::Prepare(r, h) => PrimitiveAction::Prepare(r as u32, h), - ::generic::Vote::Commit(r, h) => PrimitiveAction::Commit(r as u32, h), + ::generic::Vote::Prepare(r, ref h) => PrimitiveAction::Prepare(r as u32, h.clone()), + ::generic::Vote::Commit(r, ref h) => PrimitiveAction::Commit(r as u32, h.clone()), ::generic::Vote::AdvanceRound(r) => PrimitiveAction::AdvanceRound(r as u32), }; @@ -577,7 +590,8 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa mod tests { use super::*; use std::collections::HashSet; - use primitives::block; + use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; + use primitives::H256; use self::tokio_core::reactor::{Core}; use self::keyring::Keyring; use futures::stream; @@ -586,19 +600,21 @@ mod tests { extern crate substrate_keyring as keyring; extern crate tokio_core; + type TestBlock = GenericTestBlock<()>; + struct FakeClient { authorities: Vec, - imported_heights: Mutex> + imported_heights: Mutex> } - impl BlockImport for FakeClient { - fn import_block(&self, block: Block, _justification: Justification) { + impl BlockImport for FakeClient { + fn import_block(&self, block: TestBlock, _justification: Justification) { assert!(self.imported_heights.lock().insert(block.header.number)) } } - impl Authorities for FakeClient { - fn authorities(&self, _at: &BlockId) -> Result, Error> { + impl Authorities for FakeClient { + fn authorities(&self, _at: &BlockId) -> Result, Error> { Ok(self.authorities.clone()) } } @@ -607,10 +623,10 @@ mod tests { struct Output(::std::marker::PhantomData); impl Sink for Output { - type SinkItem = Communication; + type SinkItem = Communication; type SinkError = E; - fn start_send(&mut self, _item: Communication) -> ::futures::StartSend { + fn start_send(&mut self, _item: Communication) -> ::futures::StartSend, E> { Ok(::futures::AsyncSink::Ready) } @@ -620,34 +636,35 @@ mod tests { } struct DummyFactory; - struct DummyProposer(block::Number); + struct DummyProposer(u64); - impl ProposerFactory for DummyFactory { + impl ProposerFactory for DummyFactory { type Proposer = DummyProposer; type Error = Error; - fn init(&self, parent_header: &Header, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { + fn init(&self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) -> Result { Ok(DummyProposer(parent_header.number + 1)) } } - impl Proposer for DummyProposer { + impl Proposer for DummyProposer { type Error = Error; - type Create = Result; + type Create = Result; type Evaluate = Result; - fn propose(&self) -> Result { - Ok(Block { - header: Header::from_block_number(self.0), - transactions: Default::default() + fn propose(&self) -> Result { + + Ok(TestBlock { + header: from_block_number(self.0), + extrinsics: Default::default() }) } - fn evaluate(&self, proposal: &Block) -> Result { + fn evaluate(&self, proposal: &TestBlock) -> Result { Ok(proposal.header.number == self.0) } - fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} + fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { authorities[round_number % authorities.len()].clone() @@ -655,7 +672,7 @@ mod tests { } fn make_service(client: FakeClient) - -> BftService + -> BftService { BftService { client: Arc::new(client), @@ -667,13 +684,23 @@ mod tests { } } - fn sign_vote(vote: ::generic::Vote, key: &ed25519::Pair, parent_hash: HeaderHash) -> LocalizedSignature { - match sign_message(vote.into(), key, parent_hash) { + fn sign_vote(vote: ::generic::Vote, key: &ed25519::Pair, parent_hash: H256) -> LocalizedSignature { + match sign_message::(vote.into(), key, parent_hash) { ::generic::LocalizedMessage::Vote(vote) => vote.signature, _ => panic!("signing vote leads to signed vote"), } } + fn from_block_number(num: u64) -> TestHeader { + TestHeader::new( + num, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ) + } + #[test] fn future_gets_preempted() { let client = FakeClient { @@ -690,12 +717,12 @@ mod tests { let service = make_service(client); - let first = Header::from_block_number(2); - let first_hash = first.blake2_256().into(); + let first = from_block_number(2); + let first_hash = first.hash(); - let mut second = Header::from_block_number(3); + let mut second = from_block_number(3); second.parent_hash = first_hash; - let second_hash = second.blake2_256().into(); + let second_hash = second.hash(); let bft = service.build_upon(&first, stream::empty(), Output(Default::default())).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == first_hash); @@ -749,7 +776,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_ok()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_ok()); let unchecked = UncheckedJustification { digest: hash, @@ -759,7 +786,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); // not enough signatures. let unchecked = UncheckedJustification { @@ -770,7 +797,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); // wrong hash. let unchecked = UncheckedJustification { @@ -781,7 +808,7 @@ mod tests { }).collect(), }; - assert!(check_justification(&authorities, parent_hash, unchecked).is_err()); + assert!(check_justification::(&authorities, parent_hash, unchecked).is_err()); } #[test] @@ -793,9 +820,9 @@ mod tests { Keyring::Eve.to_raw_public(), ]; - let block = Block { - header: Header::from_block_number(1), - transactions: Default::default() + let block = TestBlock { + header: from_block_number(1), + extrinsics: Default::default() }; let proposal = sign_message(::generic::Message::Propose(1, block.clone()), &Keyring::Alice.pair(), parent_hash);; @@ -812,7 +839,7 @@ mod tests { } // Not an authority - let proposal = sign_message(::generic::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; + let proposal = sign_message::(::generic::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; if let ::generic::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { @@ -822,28 +849,28 @@ mod tests { #[test] fn vote_check_works() { - let parent_hash = Default::default(); - let hash = [0xff; 32].into(); + let parent_hash: H256 = Default::default(); + let hash: H256 = [0xff; 32].into(); let authorities = vec![ Keyring::Alice.to_raw_public(), Keyring::Eve.to_raw_public(), ]; - let vote = sign_message(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; + let vote = sign_message::(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; if let ::generic::LocalizedMessage::Vote(vote) = vote { - assert!(check_vote(&authorities, &parent_hash, &vote).is_ok()); + assert!(check_vote::(&authorities, &parent_hash, &vote).is_ok()); let mut invalid_sender = vote.clone(); invalid_sender.signature.signer = Keyring::Eve.into(); - assert!(check_vote(&authorities, &parent_hash, &invalid_sender).is_err()); + assert!(check_vote::(&authorities, &parent_hash, &invalid_sender).is_err()); } else { assert!(false); } // Not an authority - let vote = sign_message(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; + let vote = sign_message::(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; if let ::generic::LocalizedMessage::Vote(vote) = vote { - assert!(check_vote(&authorities, &parent_hash, &vote).is_err()); + assert!(check_vote::(&authorities, &parent_hash, &vote).is_err()); } else { assert!(false); } diff --git a/substrate/client/Cargo.toml b/substrate/client/Cargo.toml index 0438a9afaca90..7455c51942165 100644 --- a/substrate/client/Cargo.toml +++ b/substrate/client/Cargo.toml @@ -17,6 +17,7 @@ substrate-executor = { path = "../executor" } substrate-primitives = { path = "../primitives" } substrate-runtime-io = { path = "../runtime-io" } substrate-runtime-support = { path = "../runtime-support" } +substrate-runtime-primitives = { path = "../runtime/primitives" } substrate-state-machine = { path = "../state-machine" } substrate-keyring = { path = "../../substrate/keyring" } diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml index 2cf254aa6417b..b299d838a0b33 100644 --- a/substrate/client/db/Cargo.toml +++ b/substrate/client/db/Cargo.toml @@ -13,6 +13,7 @@ hashdb = { git = "https://github.com/paritytech/parity.git" } patricia-trie = { git = "https://github.com/paritytech/parity.git" } memorydb = { git = "https://github.com/paritytech/parity.git" } substrate-primitives = { path = "../../../substrate/primitives" } +substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives" } substrate-client = { path = "../../../substrate/client" } substrate-state-machine = { path = "../../../substrate/state-machine" } substrate-runtime-support = { path = "../../../substrate/runtime-support" } diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs index 6ba67621d8ecc..36968222915f1 100644 --- a/substrate/client/db/src/lib.rs +++ b/substrate/client/db/src/lib.rs @@ -27,6 +27,7 @@ extern crate patricia_trie; extern crate substrate_state_machine as state_machine; 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_codec as codec; #[macro_use] @@ -47,9 +48,9 @@ use kvdb::{KeyValueDB, DBTransaction}; use memorydb::MemoryDB; use parking_lot::RwLock; use patricia_trie::{TrieDB, TrieDBMut, TrieError, Trie, TrieMut}; -use primitives::blake2_256; -use primitives::block::{self, Id as BlockId, HeaderHash}; -use runtime_support::Hashable; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, Hashing, HashingFor, Zero}; use state_machine::backend::Backend as StateBackend; use state_machine::CodeExecutor; @@ -62,14 +63,17 @@ pub struct DatabaseSettings { } /// Create an instance of db-backed client. -pub fn new_client( +pub fn new_client( settings: DatabaseSettings, executor: E, genesis_builder: F, -) -> Result>, client::error::Error> +) -> Result, client::LocalCallExecutor, E>, Block>, client::error::Error> where + Block: BlockT, + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. E: CodeExecutor, - F: client::GenesisBuilder, + F: client::GenesisBuilder, { let backend = Arc::new(Backend::new(&settings)?); let executor = client::LocalCallExecutor::new(backend.clone(), executor); @@ -90,24 +94,26 @@ mod meta { pub const BEST_BLOCK: &[u8; 4] = b"best"; } -struct PendingBlock { - header: block::Header, - justification: Option, - body: Option, +struct PendingBlock { + header: Block::Header, + justification: Option>, + body: Option>, is_best: bool, } #[derive(Clone)] -struct Meta { - best_hash: HeaderHash, - best_number: block::Number, - genesis_hash: HeaderHash, +struct Meta { + best_hash: H, + best_number: N, + genesis_hash: H, } type BlockKey = [u8; 4]; // Little endian -fn number_to_db_key(n: block::Number) -> BlockKey { +fn number_to_db_key(n: N) -> BlockKey where N: As { + let n: u32 = n.as_(); + [ (n >> 24) as u8, ((n >> 16) & 0xff) as u8, @@ -127,13 +133,13 @@ fn db_err(err: kvdb::Error) -> client::error::Error { } /// Block database -pub struct BlockchainDb { +pub struct BlockchainDb { db: Arc, - meta: RwLock, + meta: RwLock::Number, Block::Hash>>, } -impl BlockchainDb { - fn id(&self, id: BlockId) -> Result, client::error::Error> { +impl BlockchainDb where ::Number: As { + fn id(&self, id: BlockId) -> Result, client::error::Error> { match id { BlockId::Hash(h) => { { @@ -142,7 +148,7 @@ impl BlockchainDb { return Ok(Some(number_to_db_key(meta.best_number))); } } - self.db.get(columns::BLOCK_INDEX, &h).map(|v| v.map(|v| { + self.db.get(columns::BLOCK_INDEX, h.as_ref()).map(|v| v.map(|v| { let mut key: [u8; 4] = [0; 4]; key.copy_from_slice(&v); key @@ -152,21 +158,21 @@ impl BlockchainDb { } } - fn new(db: Arc) -> Result { + fn new(db: Arc) -> Result { let (best_hash, best_number) = if let Some(Some(header)) = db.get(columns::META, meta::BEST_BLOCK).and_then(|id| match id { - Some(id) => db.get(columns::HEADER, &id).map(|h| h.map(|b| block::Header::decode(&mut &b[..]))), + Some(id) => db.get(columns::HEADER, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]))), None => Ok(None), }).map_err(db_err)? { - let hash = header.blake2_256().into(); - debug!("DB Opened blockchain db, best {:?} ({})", hash, header.number); - (hash, header.number) + let hash = header.hash(); + debug!("DB Opened blockchain db, best {:?} ({})", hash, header.number()); + (hash, header.number().clone()) } else { - (Default::default(), Default::default()) + (Default::default(), Zero::zero()) }; - let genesis_hash = db.get(columns::HEADER, &number_to_db_key(0)).map_err(db_err)? - .map(|b| blake2_256(&b)).unwrap_or_default().into(); + let genesis_hash = db.get(columns::HEADER, &number_to_db_key(::Number::zero())).map_err(db_err)? + .map(|b| HashingFor::::hash(&b)).unwrap_or_default().into(); Ok(BlockchainDb { db, @@ -178,7 +184,7 @@ impl BlockchainDb { }) } - fn read_db(&self, id: BlockId, column: Option) -> Result, client::error::Error> { + fn read_db(&self, id: BlockId, column: Option) -> Result, client::error::Error> { self.id(id).and_then(|key| match key { Some(key) => self.db.get(column, &key).map_err(db_err), @@ -186,10 +192,10 @@ impl BlockchainDb { }) } - fn update_meta(&self, hash: block::HeaderHash, number: block::Number, is_best: bool) { + fn update_meta(&self, hash: Block::Hash, number: ::Number, is_best: bool) { if is_best { let mut meta = self.meta.write(); - if number == 0 { + if number == Zero::zero() { meta.genesis_hash = hash; } meta.best_number = number; @@ -198,10 +204,10 @@ impl BlockchainDb { } } -impl client::blockchain::Backend for BlockchainDb { - fn header(&self, id: BlockId) -> Result, client::error::Error> { +impl client::blockchain::Backend for BlockchainDb where ::Number: As { + fn header(&self, id: BlockId) -> Result, client::error::Error> { match self.read_db(id, columns::HEADER)? { - Some(header) => match block::Header::decode(&mut &header[..]) { + Some(header) => match Block::Header::decode(&mut &header[..]) { Some(header) => Ok(Some(header)), None => return Err(client::error::ErrorKind::Backend("Error decoding header".into()).into()), } @@ -209,9 +215,9 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn body(&self, id: BlockId) -> Result, client::error::Error> { + fn body(&self, id: BlockId) -> Result>, client::error::Error> { match self.read_db(id, columns::BODY)? { - Some(body) => match block::Body::decode(&mut &body[..]) { + Some(body) => match Slicable::decode(&mut &body[..]) { Some(body) => Ok(Some(body)), None => return Err(client::error::ErrorKind::Backend("Error decoding body".into()).into()), } @@ -219,9 +225,9 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn justification(&self, id: BlockId) -> Result, client::error::Error> { + fn justification(&self, id: BlockId) -> Result>, client::error::Error> { match self.read_db(id, columns::JUSTIFICATION)? { - Some(justification) => match primitives::bft::Justification::decode(&mut &justification[..]) { + Some(justification) => match Slicable::decode(&mut &justification[..]) { Some(justification) => Ok(Some(justification)), None => return Err(client::error::ErrorKind::Backend("Error decoding justification".into()).into()), } @@ -229,7 +235,7 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn info(&self) -> Result { + fn info(&self) -> Result, client::error::Error> { let meta = self.meta.read(); Ok(client::blockchain::Info { best_hash: meta.best_hash, @@ -238,7 +244,7 @@ impl client::blockchain::Backend for BlockchainDb { }) } - fn status(&self, id: BlockId) -> Result { + fn status(&self, id: BlockId) -> Result { let exists = match id { BlockId::Hash(_) => self.id(id)?.is_some(), BlockId::Number(n) => n <= self.meta.read().best_number, @@ -249,28 +255,28 @@ impl client::blockchain::Backend for BlockchainDb { } } - fn hash(&self, number: block::Number) -> Result, client::error::Error> { + fn hash(&self, number: ::Number) -> Result, client::error::Error> { self.read_db(BlockId::Number(number), columns::HEADER).map(|x| - x.map(|raw| blake2_256(&raw[..])).map(Into::into) + x.map(|raw| HashingFor::::hash(&raw[..])).map(Into::into) ) } } /// Database transaction -pub struct BlockImportOperation { +pub struct BlockImportOperation { old_state: DbState, updates: MemoryDB, - pending_block: Option, + pending_block: Option>, } -impl client::backend::BlockImportOperation for BlockImportOperation { +impl client::backend::BlockImportOperation for BlockImportOperation { type State = DbState; fn state(&self) -> Result, client::error::Error> { Ok(Some(&self.old_state)) } - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_best: bool) -> Result<(), client::error::Error> { + fn set_block_data(&mut self, header: Block::Header, body: Option>, justification: Option>, is_best: bool) -> Result<(), client::error::Error> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { header, @@ -423,15 +429,15 @@ impl state_machine::Backend for DbState { /// Disk backend. Keeps data in a key-value store. In archive mode, trie nodes are kept from all blocks. /// Otherwise, trie nodes are kept only from the most recent block. -pub struct Backend { +pub struct Backend { db: Arc, - blockchain: BlockchainDb, + blockchain: BlockchainDb, archive: bool, } -impl Backend { +impl Backend where ::Number: As { /// Create a new instance of database backend. - pub fn new(config: &DatabaseSettings) -> Result { + pub fn new(config: &DatabaseSettings) -> Result { let mut db_config = DatabaseConfig::with_columns(Some(columns::NUM_COLUMNS)); db_config.memory_budget = config.cache_size; db_config.wal = true; @@ -442,13 +448,13 @@ impl Backend { } #[cfg(test)] - fn new_test() -> Backend { + fn new_test() -> Self { let db = Arc::new(::kvdb_memorydb::create(columns::NUM_COLUMNS)); Backend::from_kvdb(db as Arc<_>, false).expect("failed to create test-db") } - fn from_kvdb(db: Arc, archive: bool) -> Result { + fn from_kvdb(db: Arc, archive: bool) -> Result { let blockchain = BlockchainDb::new(db.clone())?; Ok(Backend { @@ -459,12 +465,15 @@ impl Backend { } } -impl client::backend::Backend for Backend { - type BlockImportOperation = BlockImportOperation; - type Blockchain = BlockchainDb; +impl client::backend::Backend for Backend where + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. +{ + type BlockImportOperation = BlockImportOperation; + type Blockchain = BlockchainDb; type State = DbState; - fn begin_operation(&self, block: BlockId) -> Result { + fn begin_operation(&self, block: BlockId) -> Result { let state = self.state_at(block)?; Ok(BlockImportOperation { pending_block: None, @@ -476,9 +485,9 @@ impl client::backend::Backend for Backend { fn commit_operation(&self, mut operation: Self::BlockImportOperation) -> Result<(), client::error::Error> { let mut transaction = DBTransaction::new(); if let Some(pending_block) = operation.pending_block { - let hash: block::HeaderHash = pending_block.header.blake2_256().into(); - let number = pending_block.header.number;; - let key = number_to_db_key(pending_block.header.number); + let hash = pending_block.header.hash(); + let number = pending_block.header.number().clone(); + let key = number_to_db_key(pending_block.header.number().clone()); transaction.put(columns::HEADER, &key, &pending_block.header.encode()); if let Some(body) = pending_block.body { transaction.put(columns::BODY, &key, &body.encode()); @@ -486,7 +495,7 @@ impl client::backend::Backend for Backend { if let Some(justification) = pending_block.justification { transaction.put(columns::JUSTIFICATION, &key, &justification.encode()); } - transaction.put(columns::BLOCK_INDEX, &hash, &key); + transaction.put(columns::BLOCK_INDEX, hash.as_ref(), &key); if pending_block.is_best { transaction.put(columns::META, meta::BEST_BLOCK, &key); } @@ -504,11 +513,11 @@ impl client::backend::Backend for Backend { Ok(()) } - fn blockchain(&self) -> &BlockchainDb { + fn blockchain(&self) -> &BlockchainDb { &self.blockchain } - fn state_at(&self, block: BlockId) -> Result { + fn state_at(&self, block: BlockId) -> Result { use client::blockchain::Backend as BcBackend; // special case for genesis initialization @@ -527,15 +536,19 @@ impl client::backend::Backend for Backend { } self.blockchain.header(block).and_then(|maybe_hdr| maybe_hdr.map(|hdr| { + let root: [u8; 32] = hdr.state_root().clone().into(); DbState { db: self.db.clone(), - root: hdr.state_root.0.into(), + root: root.into(), } - }).ok_or_else(|| client::error::ErrorKind::UnknownBlock(block).into())) + }).ok_or_else(|| client::error::ErrorKind::UnknownBlock(format!("{:?}", block)).into())) } } -impl client::backend::LocalBackend for Backend {} +impl client::backend::LocalBackend for Backend where + ::Number: As, + Block::Hash: Into<[u8; 32]>, // TODO: remove when patricia_trie generic. +{} #[cfg(test)] mod tests { @@ -543,10 +556,13 @@ mod tests { use client::backend::Backend as BTrait; use client::backend::BlockImportOperation as Op; use client::blockchain::Backend as BCTrait; + use runtime_primitives::testing::{Header, Block as RawBlock}; + + type Block = RawBlock; #[test] fn block_hash_inserted_correctly() { - let db = Backend::new_test(); + let db = Backend::::new_test(); for i in 0..10 { assert!(db.blockchain().hash(i).unwrap().is_none()); @@ -558,7 +574,7 @@ mod tests { }; let mut op = db.begin_operation(id).unwrap(); - let header = block::Header { + let header = Header { number: i, parent_hash: Default::default(), state_root: Default::default(), @@ -581,10 +597,10 @@ mod tests { #[test] fn set_state_data() { - let db = Backend::new_test(); + let db = Backend::::new_test(); { let mut op = db.begin_operation(BlockId::Hash(Default::default())).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 0, parent_hash: Default::default(), state_root: Default::default(), @@ -623,7 +639,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(0)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), @@ -660,11 +676,11 @@ mod tests { #[test] fn delete_only_when_negative_rc() { let key; - let db = Backend::new_test(); + let db = Backend::::new_test(); { let mut op = db.begin_operation(BlockId::Hash(Default::default())).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 0, parent_hash: Default::default(), state_root: Default::default(), @@ -697,7 +713,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(0)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), @@ -729,7 +745,7 @@ mod tests { { let mut op = db.begin_operation(BlockId::Number(1)).unwrap(); - let mut header = block::Header { + let mut header = Header { number: 1, parent_hash: Default::default(), state_root: Default::default(), diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index f6c44275f8aed..64f4a1d57f59e 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -18,18 +18,26 @@ use state_machine::backend::Backend as StateBackend; use error; -use primitives::block::{self, Id as BlockId}; -use primitives; +use runtime_primitives::bft::Justification; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; /// Block insertion operation. Keeps hold if the inserted block state and data. -pub trait BlockImportOperation { +pub trait BlockImportOperation { /// Associated state backend type. type State: StateBackend; /// Returns pending state. Returns None for backends with locally-unavailable state data. fn state(&self) -> error::Result>; /// Append block data to the transaction. - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_new_best: bool) -> error::Result<()>; + fn set_block_data( + &mut self, + header: Block::Header, + body: Option>, + justification: Option>, + is_new_best: bool + ) -> error::Result<()>; + /// Inject storage data into the database. fn update_storage(&mut self, update: ::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. @@ -44,27 +52,27 @@ pub trait BlockImportOperation { /// /// The same applies for live `BlockImportOperation`s: while an import operation building on a parent `P` /// is alive, the state for `P` should not be pruned. -pub trait Backend: Send + Sync { +pub trait Backend: Send + Sync { /// Associated block insertion operation type. - type BlockImportOperation: BlockImportOperation; + type BlockImportOperation: BlockImportOperation; /// Associated blockchain backend type. - type Blockchain: ::blockchain::Backend; + type Blockchain: ::blockchain::Backend; /// Associated state backend type. type State: StateBackend; /// Begin a new block insertion transaction with given parent block id. /// When constructing the genesis, this is called with all-zero hash. - fn begin_operation(&self, block: BlockId) -> error::Result; + fn begin_operation(&self, block: BlockId) -> error::Result; /// Commit block insertion. fn commit_operation(&self, transaction: Self::BlockImportOperation) -> error::Result<()>; /// Returns reference to blockchain backend. fn blockchain(&self) -> &Self::Blockchain; /// Returns state backend with post-state of given block. - fn state_at(&self, block: BlockId) -> error::Result; + fn state_at(&self, block: BlockId) -> error::Result; } /// Mark for all Backend implementations, that are making use of state data, stored locally. -pub trait LocalBackend: Backend {} +pub trait LocalBackend: Backend {} /// Mark for all Backend implementations, that are fetching required state data from remote nodes. -pub trait RemoteBackend: Backend {} +pub trait RemoteBackend: Backend {} diff --git a/substrate/client/src/block_builder.rs b/substrate/client/src/block_builder.rs index 37e26a6a27e3b..5443759f170b2 100644 --- a/substrate/client/src/block_builder.rs +++ b/substrate/client/src/block_builder.rs @@ -17,80 +17,101 @@ //! Utility struct to build a block. use std::vec::Vec; -use codec::{Joiner, Slicable}; +use codec::Slicable; use state_machine; -use primitives::{Header, Block}; -use primitives::block::{Id as BlockId, Extrinsic}; +use runtime_primitives::traits::{Header as HeaderT, Hashing as HashingT, Block as BlockT, One, HashingFor}; +use runtime_primitives::generic::BlockId; use {backend, error, Client, CallExecutor}; -use triehash::ordered_trie_root; -/// Utility for building new (valid) blocks from a stream of transactions. -pub struct BlockBuilder where - B: backend::Backend, - E: CallExecutor + Clone, - error::Error: From<<::State as state_machine::backend::Backend>::Error>, +/// Utility for building new (valid) blocks from a stream of extrinsics. +pub struct BlockBuilder where + B: backend::Backend, + E: CallExecutor + Clone, + Block: BlockT, + error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { - header: Header, - transactions: Vec, + header: ::Header, + extrinsics: Vec<::Extrinsic>, executor: E, state: B::State, changes: state_machine::OverlayedChanges, } -impl BlockBuilder where - B: backend::Backend, - E: CallExecutor + Clone, - error::Error: From<<::State as state_machine::backend::Backend>::Error>, +impl BlockBuilder where + B: backend::Backend, + E: CallExecutor + Clone, + Block: BlockT, + error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(client: &Client) -> error::Result { + pub fn new(client: &Client) -> error::Result { client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. - pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + pub fn at_block(block_id: &BlockId, client: &Client) -> error::Result { + let number = client.block_number_from_id(block_id)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))? + + One::one(); + + let parent_hash = client.block_hash_from_id(block_id)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))?; + + let executor = client.executor().clone(); + let state = client.state_at(block_id)?; + let mut changes = Default::default(); + let header = <::Header as HeaderT>::new( + number, + Default::default(), + Default::default(), + parent_hash, + Default::default() + ); + + executor.call_at_state(&state, &mut changes, "initialise_block", &header.encode())?; + Ok(BlockBuilder { - header: Header { - number: client.block_number_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))? + 1, - parent_hash: client.block_hash_from_id(block_id)?.ok_or(error::ErrorKind::UnknownBlock(*block_id))?, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - }, - transactions: Default::default(), - executor: client.executor().clone(), - state: client.state_at(block_id)?, - changes: Default::default(), + header, + extrinsics: Vec::new(), + executor, + state, + changes, }) } - /// Push a transaction onto the block's list of transactions. This will ensure the transaction + /// Push onto the block's list of extrinsics. This will ensure the extrinsic /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). - pub fn push(&mut self, tx: Extrinsic) -> error::Result<()> { - let (output, _) = self.executor.call_at_state( - &self.state, - &mut self.changes, - "execute_transaction", - &vec![].and(&self.header).and(&tx))?; - self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - self.transactions.push(tx); - Ok(()) + pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { + match self.executor.call_at_state(&self.state, &mut self.changes, "apply_extrinsic", &xt.encode()) { + Ok(_) => { + self.extrinsics.push(xt); + Ok(()) + } + Err(e) => { + self.changes.discard_prospective(); + Err(e) + } + } } - /// Consume the builder to return a valid `Block` containing all pushed transactions. + /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header.extrinsics_root = ordered_trie_root(self.transactions.iter().map(Slicable::encode)).0.into(); let (output, _) = self.executor.call_at_state( &self.state, &mut self.changes, "finalise_block", - &self.header.encode())?; - self.header = Header::decode(&mut &output[..]).expect("Header came straight out of runtime so must be valid"); - Ok(Block { - header: self.header, - transactions: self.transactions, - }) + &[], + )?; + self.header = <::Header as Slicable>::decode(&mut &output[..]) + .expect("Header came straight out of runtime so must be valid"); + + debug_assert_eq!( + self.header.extrinsics_root().clone(), + HashingFor::::ordered_trie_root(self.extrinsics.iter().map(Slicable::encode)), + ); + + Ok(::new(self.header, self.extrinsics)) } } diff --git a/substrate/client/src/blockchain.rs b/substrate/client/src/blockchain.rs index 69a7a2a18a422..73c7107b30ee2 100644 --- a/substrate/client/src/blockchain.rs +++ b/substrate/client/src/blockchain.rs @@ -16,24 +16,26 @@ //! Polkadot blockchain trait -use primitives::block::{self, Id as BlockId}; -use primitives; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; + use error::Result; /// Blockchain database backend. Does not perform any validation. -pub trait Backend: Send + Sync { +pub trait Backend: Send + Sync { /// Get block header. Returns `None` if block is not found. - fn header(&self, id: BlockId) -> Result>; + fn header(&self, id: BlockId) -> Result::Header>>; /// Get block body. Returns `None` if block is not found. - fn body(&self, id: BlockId) -> Result>; + fn body(&self, id: BlockId) -> Result::Extrinsic>>>; /// Get block justification. Returns `None` if justification does not exist. - fn justification(&self, id: BlockId) -> Result>; + fn justification(&self, id: BlockId) -> Result>>; /// Get blockchain info. - fn info(&self) -> Result; + fn info(&self) -> Result>; /// Get block status. - fn status(&self, id: BlockId) -> Result; + fn status(&self, id: BlockId) -> Result; /// Get block hash by number. Returns `None` if the header is not in the chain. - fn hash(&self, number: block::Number) -> Result>; + fn hash(&self, number: <::Header as HeaderT>::Number) -> Result::Header as HeaderT>::Hash>>; } /// Block import outcome @@ -50,13 +52,13 @@ pub enum ImportResult { /// Blockchain info #[derive(Debug)] -pub struct Info { +pub struct Info { /// Best block hash. - pub best_hash: block::HeaderHash, + pub best_hash: <::Header as HeaderT>::Hash, /// Best block number. - pub best_number: block::Number, + pub best_number: <::Header as HeaderT>::Number, /// Genesis block hash. - pub genesis_hash: block::HeaderHash, + pub genesis_hash: <::Header as HeaderT>::Hash, } /// Block status. diff --git a/substrate/client/src/call_executor.rs b/substrate/client/src/call_executor.rs index b1b4e2a15653c..27ae7d9af9edc 100644 --- a/substrate/client/src/call_executor.rs +++ b/substrate/client/src/call_executor.rs @@ -16,10 +16,10 @@ use std::sync::Arc; use futures::{IntoFuture, Future}; -use primitives::block::Id as BlockId; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block as BlockT; use state_machine::{self, OverlayedChanges, Backend as StateBackend, CodeExecutor}; use state_machine::backend::InMemory as InMemoryStateBackend; -use triehash::trie_root; use backend; use blockchain::Backend as ChainBackend; @@ -36,14 +36,14 @@ pub struct CallResult { } /// Method call executor. -pub trait CallExecutor { +pub trait CallExecutor { /// Externalities error type. type Error: state_machine::Error; /// Execute a call to a contract on top of state in a block of given hash. /// /// No changes are made. - fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> Result; + fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> Result; /// Execute a call to a contract on top of given state. /// @@ -81,15 +81,16 @@ impl Clone for LocalCallExecutor where E: Clone { } } -impl CallExecutor for LocalCallExecutor +impl CallExecutor for LocalCallExecutor where - B: backend::LocalBackend, + B: backend::LocalBackend, E: CodeExecutor, - error::Error: From<<::State as StateBackend>::Error>, + Block: BlockT, + error::Error: From<<>::State as StateBackend>::Error>, { type Error = E::Error; - fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { + fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { let mut changes = OverlayedChanges::default(); let (return_data, _) = self.call_at_state(&self.backend.state_at(*id)?, &mut changes, method, call_data)?; Ok(CallResult{ return_data, changes }) @@ -113,19 +114,20 @@ impl RemoteCallExecutor { } } -impl CallExecutor for RemoteCallExecutor +impl CallExecutor for RemoteCallExecutor where - B: backend::RemoteBackend, - F: Fetcher, - error::Error: From<<::State as StateBackend>::Error>, + B: backend::RemoteBackend, + F: Fetcher, + Block: BlockT, + error::Error: From<<>::State as StateBackend>::Error>, { type Error = error::Error; - fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { + fn call(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result { let block_hash = match *id { BlockId::Hash(hash) => hash, BlockId::Number(number) => self.backend.blockchain().hash(number)? - .ok_or_else(|| error::ErrorKind::UnknownBlock(BlockId::Number(number)))?, + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", number)))?, }; self.fetcher.remote_call(RemoteCallRequest { @@ -141,22 +143,25 @@ impl CallExecutor for RemoteCallExecutor } /// Check remote execution proof. -pub fn check_execution_proof(backend: &B, executor: &E, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> Result +pub fn check_execution_proof(backend: &B, executor: &E, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> Result where - B: backend::RemoteBackend, + B: backend::RemoteBackend, E: CodeExecutor, - error::Error: From<<::State as StateBackend>::Error>, + Block: BlockT, + error::Error: From<<>::State as StateBackend>::Error>, { + use runtime_primitives::traits::{Header, Hashing, HashingFor}; + let (remote_result, remote_proof) = remote_proof; let remote_state = state_from_execution_proof(remote_proof); - let remote_state_root = trie_root(remote_state.pairs().into_iter()).0; + let remote_state_root = HashingFor::::trie_root(remote_state.pairs().into_iter()); let local_header = backend.blockchain().header(BlockId::Hash(request.block))?; - let local_header = local_header.ok_or_else(|| error::ErrorKind::UnknownBlock(BlockId::Hash(request.block)))?; - let local_state_root = local_header.state_root; + let local_header = local_header.ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", request.block)))?; + let local_state_root = local_header.state_root().clone(); - if remote_state_root != *local_state_root { + if remote_state_root != local_state_root { return Err(error::ErrorKind::InvalidExecutionProof.into()); } diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 29b7b88f5fe35..27fb80eef58cb 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -19,11 +19,11 @@ use std::sync::Arc; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; -use primitives::{self, block, AuthorityId}; -use primitives::block::{Id as BlockId, HeaderHash}; +use primitives::AuthorityId; +use runtime_primitives::{bft::Justification, generic::BlockId}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, One}; use primitives::storage::{StorageKey, StorageData}; -use runtime_support::Hashable; -use codec::Slicable; +use codec::{Slicable}; use state_machine::{self, Ext, OverlayedChanges, Backend as StateBackend, CodeExecutor}; use backend::{self, BlockImportOperation}; @@ -32,45 +32,45 @@ use call_executor::{CallExecutor, LocalCallExecutor}; use {error, in_mem, block_builder, runtime_io, bft}; /// Type that implements `futures::Stream` of block import events. -pub type BlockchainEventStream = mpsc::UnboundedReceiver; +pub type BlockchainEventStream = mpsc::UnboundedReceiver>; /// Polkadot Client genesis block builder. -pub trait GenesisBuilder { +pub trait GenesisBuilder { /// Build genesis block. - fn build(self) -> (block::Header, Vec<(Vec, Vec)>); + fn build(self) -> (B::Header, Vec<(Vec, Vec)>); } /// Polkadot Client -pub struct Client { +pub struct Client where Block: BlockT { backend: Arc, executor: E, - import_notification_sinks: Mutex>>, + import_notification_sinks: Mutex>>>, import_lock: Mutex<()>, - importing_block: RwLock>, // holds the block hash currently being imported. TODO: replace this with block queue + importing_block: RwLock>, // holds the block hash currently being imported. TODO: replace this with block queue } /// A source of blockchain evenets. -pub trait BlockchainEvents { +pub trait BlockchainEvents { /// Get block import event stream. - fn import_notification_stream(&self) -> BlockchainEventStream; + fn import_notification_stream(&self) -> mpsc::UnboundedReceiver>; } /// Chain head information. -pub trait ChainHead { +pub trait ChainHead { /// Get best block header. - fn best_block_header(&self) -> Result; + fn best_block_header(&self) -> Result<::Header, error::Error>; } /// Client info // TODO: split queue info from chain info and amalgamate into single struct. #[derive(Debug)] -pub struct ClientInfo { +pub struct ClientInfo { /// Best block hash. - pub chain: ChainInfo, + pub chain: ChainInfo, /// Best block number in the queue. - pub best_queued_number: Option, + pub best_queued_number: Option<<::Header as HeaderT>::Number>, /// Best queued block hash. - pub best_queued_hash: Option, + pub best_queued_hash: Option, } /// Block import result. @@ -120,49 +120,51 @@ pub enum BlockOrigin { /// Summary of an imported block #[derive(Clone, Debug)] -pub struct BlockImportNotification { +pub struct BlockImportNotification { /// Imported block header hash. - pub hash: block::HeaderHash, + pub hash: Block::Hash, /// Imported block origin. pub origin: BlockOrigin, /// Imported block header. - pub header: block::Header, + pub header: Block::Header, /// Is this the new best block. pub is_new_best: bool, } /// A header paired with a justification which has already been checked. #[derive(Debug, PartialEq, Eq, Clone)] -pub struct JustifiedHeader { - header: block::Header, - justification: bft::Justification, +pub struct JustifiedHeader { + header: ::Header, + justification: ::bft::Justification, } -impl JustifiedHeader { +impl JustifiedHeader { /// Deconstruct the justified header into parts. - pub fn into_inner(self) -> (block::Header, bft::Justification) { + pub fn into_inner(self) -> (::Header, ::bft::Justification) { (self.header, self.justification) } } /// Create an instance of in-memory client. -pub fn new_in_mem( +pub fn new_in_mem( executor: E, genesis_builder: F -) -> error::Result>> +) -> error::Result, LocalCallExecutor, E>, Block>> where E: CodeExecutor, - F: GenesisBuilder, + F: GenesisBuilder, + Block: BlockT, { let backend = Arc::new(in_mem::Backend::new()); let executor = LocalCallExecutor::new(backend.clone(), executor); Client::new(backend, executor, genesis_builder) } -impl Client where - B: backend::Backend, - E: CallExecutor, - error::Error: From<<::State as StateBackend>::Error>, +impl Client where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, + error::Error: From<<>::State as StateBackend>::Error>, { /// Creates new Polkadot Client with given blockchain and code executor. pub fn new( @@ -171,12 +173,12 @@ impl Client where genesis_builder: F, ) -> error::Result where - F: GenesisBuilder + F: GenesisBuilder { - if backend.blockchain().header(BlockId::Number(0))?.is_none() { + if backend.blockchain().header(BlockId::Number(Zero::zero()))?.is_none() { trace!("Empty database, writing genesis block"); let (genesis_header, genesis_store) = genesis_builder.build(); - let mut op = backend.begin_operation(BlockId::Hash(block::HeaderHash::default()))?; + let mut op = backend.begin_operation(BlockId::Hash(Default::default()))?; op.reset_storage(genesis_store.into_iter())?; op.set_block_data(genesis_header, Some(vec![]), None, true)?; backend.commit_operation(op)?; @@ -191,7 +193,7 @@ impl Client where } /// Get a reference to the state at a given block. - pub fn state_at(&self, block: &BlockId) -> error::Result { + pub fn state_at(&self, block: &BlockId) -> error::Result { self.backend.state_at(*block) } @@ -201,7 +203,7 @@ impl Client where } /// Return single storage entry of contract under given address in state in a block of given hash. - pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result { + pub fn storage(&self, id: &BlockId, key: &StorageKey) -> error::Result { Ok(StorageData(self.state_at(id)? .storage(&key.0)? .ok_or_else(|| error::ErrorKind::NoValueForKey(key.0.clone()))? @@ -209,12 +211,12 @@ impl Client where } /// Get the code at a given block. - pub fn code_at(&self, id: &BlockId) -> error::Result> { + pub fn code_at(&self, id: &BlockId) -> error::Result> { self.storage(id, &StorageKey(b":code".to_vec())).map(|data| data.0) } /// Get the set of authorities at a given block. - pub fn authorities_at(&self, id: &BlockId) -> error::Result> { + pub fn authorities_at(&self, id: &BlockId) -> error::Result> { self.executor.call(id, "authorities",&[]) .and_then(|r| Vec::::decode(&mut &r.return_data[..]) .ok_or(error::ErrorKind::AuthLenInvalid.into())) @@ -229,7 +231,7 @@ impl Client where /// AND returning execution proof. /// /// No changes are made. - pub fn execution_proof(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result<(Vec, Vec>)> { + pub fn execution_proof(&self, id: &BlockId, method: &str, call_data: &[u8]) -> error::Result<(Vec, Vec>)> { use call_executor::state_to_execution_proof; let result = self.executor.call(id, method, call_data); @@ -248,7 +250,7 @@ impl Client where /// Set up the native execution environment to call into a native runtime code. pub fn using_environment_at T, T>( &self, - id: &BlockId, + id: &BlockId, overlay: &mut OverlayedChanges, f: F ) -> error::Result { @@ -256,24 +258,29 @@ impl Client where } /// Create a new block, built on the head of the chain. - pub fn new_block(&self) -> error::Result> where E: Clone { + pub fn new_block(&self) -> error::Result> where E: Clone { block_builder::BlockBuilder::new(self) } /// Create a new block, built on top of `parent`. - pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { + pub fn new_block_at(&self, parent: &BlockId) -> error::Result> where E: Clone { block_builder::BlockBuilder::at_block(parent, &self) } /// Check a header's justification. pub fn check_justification( &self, - header: block::Header, - justification: bft::UncheckedJustification, - ) -> error::Result { - let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; - let just = bft::check_justification(&authorities[..], header.parent_hash, justification) - .map_err(|_| error::ErrorKind::BadJustification(BlockId::Hash(header.blake2_256().into())))?; + header: ::Header, + justification: ::bft::UncheckedJustification, + ) -> error::Result> { + let parent_hash = header.parent_hash().clone(); + let authorities = self.authorities_at(&BlockId::Hash(parent_hash))?; + let just = ::bft::check_justification::(&authorities[..], parent_hash, justification) + .map_err(|_| + error::ErrorKind::BadJustification( + format!("{}", header.hash()) + ) + )?; Ok(JustifiedHeader { header, justification: just, @@ -284,16 +291,16 @@ impl Client where pub fn import_block( &self, origin: BlockOrigin, - header: JustifiedHeader, - body: Option, + header: JustifiedHeader, + body: Option::Extrinsic>>, ) -> error::Result { let (header, justification) = header.into_inner(); - match self.backend.blockchain().status(BlockId::Hash(header.parent_hash))? { + let parent_hash = header.parent_hash().clone(); + match self.backend.blockchain().status(BlockId::Hash(parent_hash))? { blockchain::BlockStatus::InChain => {}, blockchain::BlockStatus::Unknown => return Ok(ImportResult::UnknownParent), } - let hash: block::HeaderHash = header.blake2_256().into(); - + let hash = header.hash(); let _import_lock = self.import_lock.lock(); *self.importing_block.write() = Some(hash); let result = self.execute_and_import_block(origin, hash, header, justification, body); @@ -304,17 +311,18 @@ impl Client where fn execute_and_import_block( &self, origin: BlockOrigin, - hash: HeaderHash, - header: block::Header, - justification: bft::Justification, - body: Option, + hash: Block::Hash, + header: Block::Header, + justification: bft::Justification, + body: Option>, ) -> error::Result { + let parent_hash = header.parent_hash().clone(); match self.backend.blockchain().status(BlockId::Hash(hash))? { blockchain::BlockStatus::InChain => return Ok(ImportResult::AlreadyInChain), blockchain::BlockStatus::Unknown => {}, } - let mut transaction = self.backend.begin_operation(BlockId::Hash(header.parent_hash))?; + let mut transaction = self.backend.begin_operation(BlockId::Hash(parent_hash))?; let storage_update = match transaction.state()? { Some(transaction_state) => { let mut overlay = Default::default(); @@ -322,7 +330,7 @@ impl Client where transaction_state, &mut overlay, "execute_block", - &block::Block { header: header.clone(), transactions: body.clone().unwrap_or_default().clone() }.encode(), + &::new(header.clone(), body.clone().unwrap_or_default()).encode() )?; Some(storage_update) @@ -330,15 +338,15 @@ impl Client where None => None, }; - let is_new_best = header.number == self.backend.blockchain().info()?.best_number + 1; - trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number, is_new_best, origin); + let is_new_best = header.number() == &(self.backend.blockchain().info()?.best_number + One::one()); + trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number(), is_new_best, origin); transaction.set_block_data(header.clone(), body, Some(justification.uncheck().into()), is_new_best)?; if let Some(storage_update) = storage_update { transaction.update_storage(storage_update)?; } self.backend.commit_operation(transaction)?; if origin == BlockOrigin::NetworkBroadcast || origin == BlockOrigin::Own || origin == BlockOrigin::ConsensusBroadcast { - let notification = BlockImportNotification { + let notification = BlockImportNotification:: { hash: hash, origin: origin, header: header, @@ -351,7 +359,7 @@ impl Client where } /// Get blockchain info. - pub fn info(&self) -> error::Result { + pub fn info(&self) -> error::Result> { let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; Ok(ClientInfo { chain: info, @@ -361,7 +369,7 @@ impl Client where } /// Get block status. - pub fn block_status(&self, id: &BlockId) -> error::Result { + pub fn block_status(&self, id: &BlockId) -> error::Result { // TODO: more efficient implementation if let BlockId::Hash(ref h) = id { if self.importing_block.read().as_ref().map_or(false, |importing| h == importing) { @@ -375,12 +383,12 @@ impl Client where } /// Get block hash by number. - pub fn block_hash(&self, block_number: block::Number) -> error::Result> { + pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { self.backend.blockchain().hash(block_number) } /// Convert an arbitrary block ID into a block hash. - pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { match *id { BlockId::Hash(h) => Ok(Some(h)), BlockId::Number(n) => self.block_hash(n), @@ -388,83 +396,91 @@ impl Client where } /// Convert an arbitrary block ID into a block hash. - pub fn block_number_from_id(&self, id: &BlockId) -> error::Result> { + pub fn block_number_from_id(&self, id: &BlockId) -> error::Result::Header as HeaderT>::Number>> { match *id { - BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number)), + BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number().clone())), BlockId::Number(n) => Ok(Some(n)), } } /// Get block header by id. - pub fn header(&self, id: &BlockId) -> error::Result> { + pub fn header(&self, id: &BlockId) -> error::Result::Header>> { self.backend.blockchain().header(*id) } /// Get block body by id. - pub fn body(&self, id: &BlockId) -> error::Result> { + pub fn body(&self, id: &BlockId) -> error::Result::Extrinsic>>> { self.backend.blockchain().body(*id) } /// Get block justification set by id. - pub fn justification(&self, id: &BlockId) -> error::Result> { + pub fn justification(&self, id: &BlockId) -> error::Result>> { self.backend.blockchain().justification(*id) } /// Get best block header. - pub fn best_block_header(&self) -> error::Result { + pub fn best_block_header(&self) -> error::Result<::Header> { let info = self.backend.blockchain().info().map_err(|e| error::Error::from_blockchain(Box::new(e)))?; Ok(self.header(&BlockId::Hash(info.best_hash))?.expect("Best block header must always exist")) } } -impl bft::BlockImport for Client +impl bft::BlockImport for Client where - B: backend::Backend, - E: CallExecutor, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, error::Error: From<::Error> { - fn import_block(&self, block: block::Block, justification: bft::Justification) { + fn import_block(&self, block: Block, justification: ::bft::Justification) { + let (header, extrinsics) = block.deconstruct(); let justified_header = JustifiedHeader { - header: block.header, + header: header, justification, }; - let _ = self.import_block(BlockOrigin::ConsensusBroadcast, justified_header, Some(block.transactions)); + let _ = self.import_block(BlockOrigin::ConsensusBroadcast, justified_header, Some(extrinsics)); } } -impl bft::Authorities for Client +impl bft::Authorities for Client where - B: backend::Backend, - E: CallExecutor, - error::Error: From<::Error> + B: backend::Backend, + E: CallExecutor, + Block: BlockT, + error::Error: From<::Error>, { - fn authorities(&self, at: &BlockId) -> Result, bft::Error> { - self.authorities_at(at).map_err(|_| bft::ErrorKind::StateUnavailable(*at).into()) + fn authorities(&self, at: &BlockId) -> Result, bft::Error> { + self.authorities_at(at).map_err(|_| { + let descriptor = format!("{:?}", at); + bft::ErrorKind::StateUnavailable(descriptor).into() + }) } } -impl BlockchainEvents for Client +impl BlockchainEvents for Client where - B: backend::Backend, - E: CallExecutor, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, error::Error: From<::Error> { /// Get block import event stream. - fn import_notification_stream(&self) -> BlockchainEventStream { + fn import_notification_stream(&self) -> mpsc::UnboundedReceiver> { let (sink, stream) = mpsc::unbounded(); self.import_notification_sinks.lock().push(sink); stream } } -impl ChainHead for Client +impl ChainHead for Client where - B: backend::Backend, - E: CallExecutor, + B: backend::Backend, + E: CallExecutor, + Block: BlockT, error::Error: From<::Error> { - fn best_block_header(&self) -> error::Result { + fn best_block_header(&self) -> error::Result<::Header> { Client::best_block_header(self) } } @@ -474,20 +490,18 @@ mod tests { use super::*; use codec::Slicable; use keyring::Keyring; - use primitives::block::Extrinsic as PrimitiveExtrinsic; use test_client::{self, TestClient}; use test_client::client::BlockOrigin; use test_client::runtime as test_runtime; - use test_client::runtime::{UncheckedTransaction, Transaction}; + use test_client::runtime::{Transfer, Extrinsic}; #[test] fn client_initialises_from_genesis_ok() { let client = test_client::new(); let genesis_hash = client.block_hash(0).unwrap().unwrap(); - assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), genesis_hash); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 1000); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 0); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public().into())).unwrap(), 1000); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public().into())).unwrap(), 0); } #[test] @@ -511,17 +525,11 @@ mod tests { client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().unwrap().chain.best_number, 1); - assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap()); } - trait Signable { - fn signed(self) -> PrimitiveExtrinsic; - } - impl Signable for Transaction { - fn signed(self) -> PrimitiveExtrinsic { - let signature = Keyring::from_raw_public(self.from.clone()).unwrap().sign(&self.encode()); - PrimitiveExtrinsic::decode(&mut UncheckedTransaction { signature, tx: self }.encode().as_ref()).unwrap() - } + fn sign_tx(tx: Transfer) -> Extrinsic { + let signature = Keyring::from_raw_public(tx.from.0.clone()).unwrap().sign(&tx.encode()).into(); + Extrinsic { transfer: tx, signature } } #[test] @@ -530,18 +538,18 @@ mod tests { let mut builder = client.new_block().unwrap(); - builder.push(Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Ferdie.to_raw_public(), + builder.push(sign_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Ferdie.to_raw_public().into(), amount: 42, - nonce: 0 - }.signed()).unwrap(); + nonce: 0, + })).unwrap(); client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap(); assert_eq!(client.info().unwrap().chain.best_number, 1); assert!(client.state_at(&BlockId::Number(1)).unwrap() != client.state_at(&BlockId::Number(0)).unwrap()); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public())).unwrap(), 958); - assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public())).unwrap(), 42); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Alice.to_raw_public().into())).unwrap(), 958); + assert_eq!(client.using_environment(|| test_runtime::system::balance_of(Keyring::Ferdie.to_raw_public().into())).unwrap(), 42); } } diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 9f0e0ac1f8f8e..7db181deae670 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -29,9 +29,9 @@ error_chain! { } /// Unknown block. - UnknownBlock(h: ::primitives::block::Id) { + UnknownBlock(h: String) { description("unknown block"), - display("UnknownBlock: {}", h), + display("UnknownBlock: {}", &*h), } /// Execution error. @@ -77,9 +77,9 @@ error_chain! { } /// Bad justification for header. - BadJustification(h: ::primitives::block::Id) { + BadJustification(h: String) { description("bad justification for header"), - display("bad justification for header: {}", h), + display("bad justification for header: {}", &*h), } /// Not available on light client. @@ -110,8 +110,8 @@ impl From> for Error { } impl From for Error { - fn from(_e: state_machine::backend::Void) -> Self { - unreachable!() + fn from(e: state_machine::backend::Void) -> Self { + match e {} } } diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index c72f6addf7292..d6f86982f56dc 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -17,54 +17,56 @@ //! Tool for creating the genesis block. use std::collections::HashMap; -use primitives::{Block, Header}; -use triehash::trie_root; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing as HashingT, Zero}; /// Create a genesis block, given the initial storage. -pub fn construct_genesis_block(storage: &HashMap, Vec>) -> Block { - let state_root = trie_root(storage.clone().into_iter()).0.into(); - let header = Header { - parent_hash: Default::default(), - number: 0, - state_root, - extrinsics_root: trie_root(vec![].into_iter()).0.into(), - digest: Default::default(), - }; - Block { - header, - transactions: vec![], - } +pub fn construct_genesis_block< + Block: BlockT +> ( + storage: &HashMap, Vec> +) -> Block { + let state_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(storage.clone().into_iter()); + let extrinsics_root = <<::Header as HeaderT>::Hashing as HashingT>::trie_root(::std::iter::empty::<(&[u8], &[u8])>()); + Block::new( + <::Header as HeaderT>::new( + Zero::zero(), + extrinsics_root, + state_root, + Default::default(), + Default::default() + ), + Default::default() + ) } #[cfg(test)] mod tests { use super::*; use codec::{Slicable, Joiner}; - use runtime_support::Hashable; use keyring::Keyring; use executor::WasmExecutor; use state_machine::{execute, OverlayedChanges}; use state_machine::backend::InMemory; use test_client; use test_client::runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; - use test_client::runtime::{Hash, Block, BlockNumber, Header, Digest, Transaction, - UncheckedTransaction}; + use test_client::runtime::{Hash, Transfer, Block, BlockNumber, Header, Digest, Extrinsic}; use ed25519::{Public, Pair}; native_executor_instance!(Executor, test_client::runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm")); - fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { + fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { use triehash::ordered_trie_root; let transactions = txs.into_iter().map(|tx| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from)).unwrap()) - .sign(&tx.encode()); + let signature = Pair::from(Keyring::from_public(Public::from_raw(tx.from.0)).unwrap()) + .sign(&tx.encode()).into(); - UncheckedTransaction { tx, signature } + Extrinsic { transfer: tx, signature } }).collect::>(); let extrinsics_root = ordered_trie_root(transactions.iter().map(Slicable::encode)).0.into(); + println!("root before: {:?}", extrinsics_root); let mut header = Header { parent_hash, number, @@ -72,19 +74,25 @@ mod tests { extrinsics_root, digest: Digest { logs: vec![], }, }; - let hash = header.blake2_256(); - + let hash = header.hash(); let mut overlay = OverlayedChanges::default(); + execute( + backend, + &mut overlay, + &Executor::new(), + "initialise_block", + &header.encode(), + ).unwrap(); + for tx in transactions.iter() { - let (ret_data, _) = execute( + execute( backend, &mut overlay, &Executor::new(), - "execute_transaction", - &vec![].and(&header).and(tx) + "apply_extrinsic", + &tx.encode(), ).unwrap(); - header = Header::decode(&mut &ret_data[..]).unwrap(); } let (ret_data, _) = execute( @@ -92,11 +100,12 @@ mod tests { &mut overlay, &Executor::new(), "finalise_block", - &vec![].and(&header) + &[] ).unwrap(); header = Header::decode(&mut &ret_data[..]).unwrap(); + println!("root after: {:?}", header.extrinsics_root); - (vec![].and(&Block { header, transactions }), hash.into()) + (vec![].and(&Block { header, extrinsics: transactions }), hash) } fn block1(genesis_hash: Hash, backend: &InMemory) -> (Vec, Hash) { @@ -105,9 +114,9 @@ mod tests { 1, genesis_hash, hex!("25e5b37074063ab75c889326246640729b40d0c86932edc527bc80db0e04fe5c").into(), - vec![Transaction { - from: Keyring::One.to_raw_public(), - to: Keyring::Two.to_raw_public(), + vec![Transfer { + from: Keyring::One.to_raw_public().into(), + to: Keyring::Two.to_raw_public().into(), amount: 69, nonce: 0, }] @@ -119,8 +128,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); @@ -141,8 +150,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); @@ -164,8 +173,8 @@ mod tests { let mut storage = GenesisConfig::new_simple( vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 68 ).genesis_map(); - let block = construct_genesis_block(&storage); - let genesis_hash = block.header.blake2_256().into(); + let block = construct_genesis_block::(&storage); + let genesis_hash = block.header.hash(); storage.extend(additional_storage_with_genesis(&block).into_iter()); let backend = InMemory::from(storage); diff --git a/substrate/client/src/in_mem.rs b/substrate/client/src/in_mem.rs index cb9102fb7829c..9bbcf01b6e905 100644 --- a/substrate/client/src/in_mem.rs +++ b/substrate/client/src/in_mem.rs @@ -20,95 +20,136 @@ use std::collections::HashMap; use parking_lot::RwLock; use error; use backend; -use runtime_support::Hashable; -use primitives; -use primitives::block::{self, Id as BlockId, HeaderHash}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero}; +use runtime_primitives::bft::Justification; use blockchain::{self, BlockStatus}; use state_machine::backend::{Backend as StateBackend, InMemory}; -struct PendingBlock { - block: Block, +struct PendingBlock { + block: StoredBlock, is_best: bool, } #[derive(PartialEq, Eq, Clone)] -struct Block { - header: block::Header, - justification: Option, - body: Option, +enum StoredBlock { + Header(B::Header, Option>), + Full(B, Option>), +} + +impl StoredBlock { + fn new(header: B::Header, body: Option>, just: Option>) -> Self { + match body { + Some(body) => StoredBlock::Full(B::new(header, body), just), + None => StoredBlock::Header(header, just), + } + } + + fn header(&self) -> &B::Header { + match *self { + StoredBlock::Header(ref h, _) => h, + StoredBlock::Full(ref b, _) => b.header(), + } + } + + fn justification(&self) -> Option<&Justification> { + match *self { + StoredBlock::Header(_, ref j) | StoredBlock::Full(_, ref j) => j.as_ref() + } + } + + fn extrinsics(&self) -> Option<&[B::Extrinsic]> { + match *self { + StoredBlock::Header(_, _) => None, + StoredBlock::Full(ref b, _) => Some(b.extrinsics()) + } + } + + fn into_inner(self) -> (B::Header, Option>, Option>) { + match self { + StoredBlock::Header(header, just) => (header, None, just), + StoredBlock::Full(block, just) => { + let (header, body) = block.deconstruct(); + (header, Some(body), just) + } + } + } } #[derive(Clone)] -struct BlockchainStorage { - blocks: HashMap, - hashes: HashMap, - best_hash: HeaderHash, - best_number: block::Number, - genesis_hash: HeaderHash, +struct BlockchainStorage { + blocks: HashMap>, + hashes: HashMap<<::Header as HeaderT>::Number, Block::Hash>, + best_hash: Block::Hash, + best_number: <::Header as HeaderT>::Number, + genesis_hash: Block::Hash, } /// In-memory blockchain. Supports concurrent reads. -pub struct Blockchain { - storage: RwLock, +pub struct Blockchain { + storage: RwLock>, } -impl Clone for Blockchain { - fn clone(&self) -> Blockchain { +impl Clone for Blockchain { + fn clone(&self) -> Self { Blockchain { storage: RwLock::new(self.storage.read().clone()), } } } -impl Blockchain { +impl Blockchain { + /// Get header hash of given block. + pub fn id(&self, id: BlockId) -> Option { + match id { + BlockId::Hash(h) => Some(h), + BlockId::Number(n) => self.storage.read().hashes.get(&n).cloned(), + } + } + /// Create new in-memory blockchain storage. - pub fn new() -> Blockchain { + pub fn new() -> Self { Blockchain { storage: RwLock::new( BlockchainStorage { blocks: HashMap::new(), hashes: HashMap::new(), - best_hash: HeaderHash::default(), - best_number: 0, - genesis_hash: HeaderHash::default(), + best_hash: Default::default(), + best_number: Zero::zero(), + genesis_hash: Default::default(), }) } } - /// Get header hash of given block. - pub fn id(&self, id: BlockId) -> Option { - match id { - BlockId::Hash(h) => Some(h), - BlockId::Number(n) => self.storage.read().hashes.get(&n).cloned(), - } - } - - /// Insert block. - pub fn insert(&self, hash: HeaderHash, header: block::Header, justification: Option, body: Option, is_new_best: bool) { - let number = header.number; + /// Insert a block header and associated data. + pub fn insert( + &self, + hash: Block::Hash, + header: ::Header, + justification: Option>, + body: Option::Extrinsic>>, + is_new_best: bool + ) { + let number = header.number().clone(); let mut storage = self.storage.write(); - storage.blocks.insert(hash, Block { - header: header, - body: body, - justification: justification, - }); - storage.hashes.insert(number, hash); + storage.blocks.insert(hash.clone(), StoredBlock::new(header, body, justification)); + storage.hashes.insert(number, hash.clone()); if is_new_best { - storage.best_hash = hash; - storage.best_number = number; + storage.best_hash = hash.clone(); + storage.best_number = number.clone(); } - if number == 0 { + if number == Zero::zero() { storage.genesis_hash = hash; } } /// Compare this blockchain with another in-mem blockchain - pub fn equals_to(&self, other: &Blockchain) -> bool { + pub fn equals_to(&self, other: &Self) -> bool { self.canon_equals_to(other) && self.storage.read().blocks == other.storage.read().blocks } /// Compare canonical chain to other canonical chain. - pub fn canon_equals_to(&self, other: &Blockchain) -> bool { + pub fn canon_equals_to(&self, other: &Self) -> bool { let this = self.storage.read(); let other = other.storage.read(); this.hashes == other.hashes @@ -118,20 +159,27 @@ impl Blockchain { } } -impl blockchain::Backend for Blockchain { - fn header(&self, id: BlockId) -> error::Result> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).map(|b| b.header.clone()))) +impl blockchain::Backend for Blockchain { + fn header(&self, id: BlockId) -> error::Result::Header>> { + Ok(self.id(id).and_then(|hash| { + self.storage.read().blocks.get(&hash).map(|b| b.header().clone()) + })) } - fn body(&self, id: BlockId) -> error::Result> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.body.clone()))) + fn body(&self, id: BlockId) -> error::Result::Extrinsic>>> { + Ok(self.id(id).and_then(|hash| { + self.storage.read().blocks.get(&hash) + .and_then(|b| b.extrinsics().map(|x| x.to_vec())) + })) } - fn justification(&self, id: BlockId) -> error::Result> { - Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| b.justification.clone()))) + fn justification(&self, id: BlockId) -> error::Result>> { + Ok(self.id(id).and_then(|hash| self.storage.read().blocks.get(&hash).and_then(|b| + b.justification().map(|x| x.clone())) + )) } - fn info(&self) -> error::Result { + fn info(&self) -> error::Result> { let storage = self.storage.read(); Ok(blockchain::Info { best_hash: storage.best_hash, @@ -140,40 +188,42 @@ impl blockchain::Backend for Blockchain { }) } - fn status(&self, id: BlockId) -> error::Result { + fn status(&self, id: BlockId) -> error::Result { match self.id(id).map_or(false, |hash| self.storage.read().blocks.contains_key(&hash)) { true => Ok(BlockStatus::InChain), false => Ok(BlockStatus::Unknown), } } - fn hash(&self, number: block::Number) -> error::Result> { + fn hash(&self, number: <::Header as HeaderT>::Number) -> error::Result> { Ok(self.id(BlockId::Number(number))) } } /// In-memory operation. -pub struct BlockImportOperation { - pending_block: Option, +pub struct BlockImportOperation { + pending_block: Option>, old_state: InMemory, new_state: Option, } -impl backend::BlockImportOperation for BlockImportOperation { +impl backend::BlockImportOperation for BlockImportOperation { type State = InMemory; fn state(&self) -> error::Result> { Ok(Some(&self.old_state)) } - fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_new_best: bool) -> error::Result<()> { + fn set_block_data( + &mut self, + header: ::Header, + body: Option::Extrinsic>>, + justification: Option>, + is_new_best: bool + ) -> error::Result<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { - block: Block { - header: header, - body: body, - justification: justification, - }, + block: StoredBlock::new(header, body, justification), is_best: is_new_best, }); Ok(()) @@ -191,14 +241,18 @@ impl backend::BlockImportOperation for BlockImportOperation { } /// In-memory backend. Keeps all states and blocks in memory. Useful for testing. -pub struct Backend { - states: RwLock>, - blockchain: Blockchain, +pub struct Backend where + Block: BlockT, +{ + states: RwLock>, + blockchain: Blockchain, } -impl Backend { +impl Backend where + Block: BlockT, +{ /// Create a new instance of in-mem backend. - pub fn new() -> Backend { + pub fn new() -> Backend { Backend { states: RwLock::new(HashMap::new()), blockchain: Blockchain::new(), @@ -206,14 +260,16 @@ impl Backend { } } -impl backend::Backend for Backend { - type BlockImportOperation = BlockImportOperation; - type Blockchain = Blockchain; +impl backend::Backend for Backend where + Block: BlockT, +{ + type BlockImportOperation = BlockImportOperation; + type Blockchain = Blockchain; type State = InMemory; - fn begin_operation(&self, block: BlockId) -> error::Result { + fn begin_operation(&self, block: BlockId) -> error::Result { let state = match block { - BlockId::Hash(h) if h.is_zero() => Self::State::default(), + BlockId::Hash(ref h) if h.clone() == Default::default() => Self::State::default(), _ => self.state_at(block)?, }; @@ -226,24 +282,26 @@ impl backend::Backend for Backend { fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { if let Some(pending_block) = operation.pending_block { - let hash = pending_block.block.header.blake2_256().into(); let old_state = &operation.old_state; + let (header, body, justification) = pending_block.block.into_inner(); + let hash = header.hash(); + self.states.write().insert(hash, operation.new_state.unwrap_or_else(|| old_state.clone())); - self.blockchain.insert(hash, pending_block.block.header, pending_block.block.justification, pending_block.block.body, pending_block.is_best); + self.blockchain.insert(hash, header, justification, body, pending_block.is_best); } Ok(()) } - fn blockchain(&self) -> &Blockchain { + fn blockchain(&self) -> &Self::Blockchain { &self.blockchain } - fn state_at(&self, block: BlockId) -> error::Result { + fn state_at(&self, block: BlockId) -> error::Result { match self.blockchain.id(block).and_then(|id| self.states.read().get(&id).cloned()) { Some(state) => Ok(state), - None => Err(error::ErrorKind::UnknownBlock(block).into()), + None => Err(error::ErrorKind::UnknownBlock(format!("{}", block)).into()), } } } -impl backend::LocalBackend for Backend {} +impl backend::LocalBackend for Backend {} diff --git a/substrate/client/src/lib.rs b/substrate/client/src/lib.rs index 8045480fbd5c5..d5cc2d3dec071 100644 --- a/substrate/client/src/lib.rs +++ b/substrate/client/src/lib.rs @@ -24,6 +24,7 @@ extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_io as runtime_io; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_state_machine as state_machine; #[cfg(test)] extern crate substrate_keyring as keyring; #[cfg(test)] extern crate substrate_test_client as test_client; diff --git a/substrate/client/src/light.rs b/substrate/client/src/light.rs index 0e9b735be8460..6bd6210facff3 100644 --- a/substrate/client/src/light.rs +++ b/substrate/client/src/light.rs @@ -19,11 +19,11 @@ use std::sync::Arc; use futures::future::IntoFuture; -use primitives; -use primitives::block::{self, Id as BlockId, HeaderHash}; -use runtime_support::Hashable; use state_machine::CodeExecutor; use state_machine::backend::Backend as StateBackend; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use blockchain::{self, BlockStatus}; use backend; use call_executor::{CallResult, RemoteCallExecutor, check_execution_proof}; @@ -32,9 +32,9 @@ use error; use in_mem::Blockchain as InMemBlockchain; /// Remote call request. -pub struct RemoteCallRequest { - /// Call at state of given block. - pub block: HeaderHash, +pub struct RemoteCallRequest { + /// Call at state of block referenced by given header hash. + pub block: H, /// Method to call. pub method: String, /// Call data. @@ -43,62 +43,62 @@ pub struct RemoteCallRequest { /// Light client data fetcher. Implementations of this trait must check if remote data /// is correct (see FetchedDataChecker) and return already checked data. -pub trait Fetcher: Send + Sync { +pub trait Fetcher: Send + Sync { /// Remote call result future. type RemoteCallResult: IntoFuture; /// Fetch remote call result. - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult; + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult; } /// Light client remote data checker. -pub trait FetchChecker: Send + Sync { +pub trait FetchChecker: Send + Sync { /// Check remote method execution proof. - fn check_execution_proof(&self, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> error::Result; + fn check_execution_proof(&self, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> error::Result; } /// Light client backend. -pub struct Backend { - blockchain: Blockchain, +pub struct Backend { + blockchain: Blockchain, } /// Light client blockchain. -pub struct Blockchain { - storage: InMemBlockchain, +pub struct Blockchain { + storage: InMemBlockchain, } /// Block (header and justification) import operation. -pub struct BlockImportOperation { - pending_block: Option, +pub struct BlockImportOperation { + pending_block: Option>, } /// On-demand state. #[derive(Clone)] -pub struct OnDemandState { +pub struct OnDemandState { /// Hash of the block, state is valid for. - _block: HeaderHash, + _block: H, } /// Remote data checker. -pub struct LightDataChecker { +pub struct LightDataChecker { /// Backend reference. - backend: Arc, + backend: Arc>, /// Executor. executor: E, } -struct PendingBlock { - header: block::Header, - justification: Option, +struct PendingBlock { + header: B::Header, + justification: Option>, is_best: bool, } -impl backend::Backend for Backend { - type BlockImportOperation = BlockImportOperation; - type Blockchain = Blockchain; - type State = OnDemandState; +impl backend::Backend for Backend { + type BlockImportOperation = BlockImportOperation; + type Blockchain = Blockchain; + type State = OnDemandState; - fn begin_operation(&self, _block: BlockId) -> error::Result { + fn begin_operation(&self, _block: BlockId) -> error::Result { Ok(BlockImportOperation { pending_block: None, }) @@ -106,34 +106,34 @@ impl backend::Backend for Backend { fn commit_operation(&self, operation: Self::BlockImportOperation) -> error::Result<()> { if let Some(pending_block) = operation.pending_block { - let hash = pending_block.header.blake2_256().into(); + let hash = pending_block.header.hash(); self.blockchain.storage.insert(hash, pending_block.header, pending_block.justification, None, pending_block.is_best); } Ok(()) } - fn blockchain(&self) -> &Blockchain { + fn blockchain(&self) -> &Blockchain { &self.blockchain } - fn state_at(&self, block: BlockId) -> error::Result { + fn state_at(&self, block: BlockId) -> error::Result { Ok(OnDemandState { - _block: self.blockchain.storage.id(block).ok_or(error::ErrorKind::UnknownBlock(block))?, + _block: self.blockchain.storage.id(block).ok_or(error::ErrorKind::UnknownBlock(format!("{:?}", block)))?, }) } } -impl backend::RemoteBackend for Backend {} +impl backend::RemoteBackend for Backend {} -impl backend::BlockImportOperation for BlockImportOperation { - type State = OnDemandState; +impl backend::BlockImportOperation for BlockImportOperation { + type State = OnDemandState; fn state(&self) -> error::Result> { // None means 'locally-stateless' backend Ok(None) } - fn set_block_data(&mut self, header: block::Header, _body: Option, justification: Option, is_new_best: bool) -> error::Result<()> { + fn set_block_data(&mut self, header: B::Header, _body: Option>, justification: Option>, is_new_best: bool) -> error::Result<()> { assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); self.pending_block = Some(PendingBlock { header, @@ -154,34 +154,34 @@ impl backend::BlockImportOperation for BlockImportOperation { } } -impl blockchain::Backend for Blockchain { - fn header(&self, id: BlockId) -> error::Result> { +impl blockchain::Backend for Blockchain { + fn header(&self, id: BlockId) -> error::Result> { self.storage.header(id) } - fn body(&self, _id: BlockId) -> error::Result> { + fn body(&self, _id: BlockId) -> error::Result>> { // TODO [light]: fetch from remote node Ok(None) } - fn justification(&self, id: BlockId) -> error::Result> { + fn justification(&self, id: BlockId) -> error::Result>> { self.storage.justification(id) } - fn info(&self) -> error::Result { + fn info(&self) -> error::Result> { self.storage.info() } - fn status(&self, id: BlockId) -> error::Result { + fn status(&self, id: BlockId) -> error::Result { self.storage.status(id) } - fn hash(&self, number: block::Number) -> error::Result> { + fn hash(&self, number: ::Number) -> error::Result> { self.storage.hash(number) } } -impl StateBackend for OnDemandState { +impl StateBackend for OnDemandState { type Error = error::Error; type Transaction = (); @@ -191,7 +191,8 @@ impl StateBackend for OnDemandState { } fn storage_root(&self, _delta: I) -> ([u8; 32], Self::Transaction) - where I: IntoIterator, Option>)> { + where I: IntoIterator, Option>)> + { ([0; 32], ()) } @@ -201,43 +202,46 @@ impl StateBackend for OnDemandState { } } -impl FetchChecker for LightDataChecker +impl FetchChecker for LightDataChecker where E: CodeExecutor, + B: BlockT, { - fn check_execution_proof(&self, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> error::Result { + fn check_execution_proof(&self, request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> error::Result { check_execution_proof(&*self.backend, &self.executor, request, remote_proof) } } /// Create an instance of light client backend. -pub fn new_light_backend() -> Arc { +pub fn new_light_backend() -> Arc> { let storage = InMemBlockchain::new(); let blockchain = Blockchain { storage }; Arc::new(Backend { blockchain }) } /// Create an instance of light client. -pub fn new_light( - backend: Arc, +pub fn new_light( + backend: Arc>, fetcher: Arc, genesis_builder: B, -) -> error::Result>> +) -> error::Result, RemoteCallExecutor, F>, Block>> where - F: Fetcher, - B: GenesisBuilder, + F: Fetcher, + B: GenesisBuilder, + Block: BlockT, { let executor = RemoteCallExecutor::new(backend.clone(), fetcher); Client::new(backend, executor, genesis_builder) } /// Create an instance of fetch data checker. -pub fn new_fetch_checker( - backend: Arc, +pub fn new_fetch_checker( + backend: Arc>, executor: E, -) -> LightDataChecker +) -> LightDataChecker where E: CodeExecutor, + Block: BlockT, { LightDataChecker { backend, executor } } diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index ddce0fcdfb80e3302c9272fb730261ef313d43de..8b02a415c4c2dc6927ce89cceae521f31a6c046a 100644 GIT binary patch delta 2417 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 diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index d222a1f6b1200d5fa6493271383de163ae599a93..95220fd9db80a7f613104ceaf9a80ec95b3207ec 100755 GIT binary patch delta 1536 zcmZuwTWB0r7@jk;yGeJl$=S?qE}M(9+oV|=lbtj7sa2A|)?$m4q6J0R&gG2FW;dJe zrWadKiWk%eAs)ep7Q7&cTIyx37Ybeq;svah1_~mIpwcIyAof8h{L0`W4&o|%s z&;R}KeY13BN#xvC9dR6o?(1Fa9YoyP<~MJ-S*6o0M|G+GCEvM_e-E>a_0H zSGW!#ZV>gxVS0nPDQVGFj$gZKZ13oLBb`@sm#A7%4U^-dZaopXdZcmm|0tr`9LGHL zoGb`iCOJM96L_9SLOdpPb#=wz)4hpHilP`}8Qz$e(#=CHc!EB(xLi53d}MJs;06*K zqYidK(HU_lqN34;6Lq&%YxrC)*6}#Pp5fPpk9SY96=4-g>{nqbm*GU5<-{Z>b25^7 z922{_`7e9%ILF3f-+}1&*kDo0!C%4TW0A<@BP~B4tD1awU*|T4E^!WL+EekT5#rf9 zi4x$?iLVgfezWUa0S?E-Svb5Qo{j$RPYnYeOXYz&mAZq6!}om(poklQ$MKVZeEI_5 z#q=cLwR8b6*Z&(DU`WcL580@6e=5Z-d~oH`3$J}~?ego7vJ;X8<9;L^Kx3?saiD%M zvlsBK%$<>q4$fqwx|VGK{*Zkc^|MC?wxj;`xq+|I0Jw}{Bq#GoloRu~3NGWgpPd|< z1odY_cD%DIc6}%xZEPOp1yL3{OOse>I0w((J$wzM3%TPP((}2e;E7!$izv&^j?6** z=g2zXk7F({Gh=W6Q_qdJpnh+B2g@S>b9r{Z$@U%|o2OYm@c%kx80UW5fj3yaBO zAueyKLZbxqxVmK+B;wR9NNP_{y%L$ZP_%B0*iPQMz-MZUp5JKFQmeM;(^9<=%r;wW z_wKkXGut*56C78BFz;c(Oqe{0W6N%x zB8J=RGusgRq_mK8DW$4QL*MZXi)uz$>V#zF;S77CRNO}#%c8pDX_l?)p+m~q?oO^6 zjrzcU6E?UJu%Vmzf>d?lmD@of=m(OlN6ZpFl)jzbmG z4GqP!HHYm~3)s=9?Yfqy_`d3^ipP$r6WG*rU)2?Ac~;=LuFKA-g+5bP3_tWqs2G;% z`RpfkJ64EmYoQYmL!+UtsBBuZM?ITTxJ7Kk4-`W6a&b@PfqM+4GO_z!c93Kk(+Zdp zO*bgat`V1-X2?F*e5~kx;CZG;d?m1Si!xhZ#=c`%jz afCO$BuoK4ZX(#kd)ln%7L7IOPGf5ls-+M;G!2zPEvbjXdv ztt031dFX@vr5GY%7CTfBH)w7 zX}~kZw?VlyxqjV#c6E~BakesL%Tgi9?UlJ1ZmOC@azBBYxQbkd!4mc202ycJrxu5# zLPAawEGJ~XE)U9tNX#e|$H0hAVG<`eQBGBpF*)_GV6F58JiM^ulqMBKFbIQTf-Dwe za$g-TiW8_NNiG5A^vUshfrnq@#tBPI--M;DUDL022D~_9Z~ryo&Uub`x13I|($%Bh za;;eo>7nwfw^rLY%F?@BvQqPd)*3CZuharsZnW6GU01p1;;guPPhTdE&o6E9F5g$A0TMOtKQ9t*T0 z2`t61UEMYnM^VDiWY23;L~$(NF?|~>QmiNn*afXPXgHQ@&`|f>PzgQC{?O)#Wf_`D zBTI{X$MFM|E$9w$O`EEoqC~14Mhd0uS$&>F9+bP57f`rVH(d6u9+1G*E!FgW7|Sy? zFJSi=O#(#*H7vt349~F*pItKEBc|h0Ed-My-wq5*VVmZyDb1$3>C-Ussj37tto{u} CQ-}-z diff --git a/substrate/extrinsic-pool/Cargo.toml b/substrate/extrinsic-pool/Cargo.toml index aecd25ba8d5ee..88f639117b286 100644 --- a/substrate/extrinsic-pool/Cargo.toml +++ b/substrate/extrinsic-pool/Cargo.toml @@ -8,5 +8,4 @@ error-chain = "0.11" futures = "0.1" log = "0.3" parking_lot = "0.4" -substrate-primitives = { path = "../primitives" } transaction-pool = "1.12" diff --git a/substrate/extrinsic-pool/src/api.rs b/substrate/extrinsic-pool/src/api.rs index a7841e3ef6e70..ba76c45c046c5 100644 --- a/substrate/extrinsic-pool/src/api.rs +++ b/substrate/extrinsic-pool/src/api.rs @@ -16,12 +16,9 @@ //! External API for extrinsic pool. +use std::fmt; use std::ops::Deref; use txpool::{self, VerifiedTransaction}; -use primitives::{ - Hash, - block::{Extrinsic, ExtrinsicHash}, -}; /// Extrinsic pool error. pub trait Error: ::std::error::Error + Send + Sized { @@ -38,18 +35,19 @@ impl Error for txpool::Error { } /// Extrinsic pool. -pub trait ExtrinsicPool: Send + Sync + 'static { +pub trait ExtrinsicPool: Send + Sync + 'static { /// Error type type Error: Error; /// Submit a collection of extrinsics to the pool. - fn submit(&self, xt: Vec) -> Result, Self::Error>; + fn submit(&self, xt: Vec) -> Result, Self::Error>; } // Blanket implementation for anything that `Derefs` to the pool. -impl ExtrinsicPool for T where - T: Deref> + Send + Sync + 'static, - V: txpool::Verifier, +impl ExtrinsicPool for T where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + T: Deref> + Send + Sync + 'static, + V: txpool::Verifier, S: txpool::Scoring, V::VerifiedTransaction: txpool::VerifiedTransaction, E: From, @@ -58,7 +56,7 @@ impl ExtrinsicPool for T where { type Error = E; - fn submit(&self, xt: Vec) -> Result, Self::Error> { + fn submit(&self, xt: Vec) -> Result, Self::Error> { self.deref().submit(xt).map(|result| result.into_iter().map(|xt| *xt.hash()).collect()) } } diff --git a/substrate/extrinsic-pool/src/lib.rs b/substrate/extrinsic-pool/src/lib.rs index 35ed5e3d6e9e4..c7b44a57096e9 100644 --- a/substrate/extrinsic-pool/src/lib.rs +++ b/substrate/extrinsic-pool/src/lib.rs @@ -20,7 +20,6 @@ extern crate futures; extern crate parking_lot; -extern crate substrate_primitives as primitives; #[macro_use] extern crate log; diff --git a/substrate/extrinsic-pool/src/listener.rs b/substrate/extrinsic-pool/src/listener.rs index 948ad205dde7a..106c1f23e62f2 100644 --- a/substrate/extrinsic-pool/src/listener.rs +++ b/substrate/extrinsic-pool/src/listener.rs @@ -16,29 +16,29 @@ use std::{ sync::Arc, + fmt, collections::HashMap, }; -use primitives::Hash; use txpool; use watcher; #[derive(Default)] -pub struct Listener { - watchers: HashMap +pub struct Listener { + watchers: HashMap> } -impl Listener { - pub fn create_watcher>(&mut self, xt: Arc) -> watcher::Watcher { +impl Listener { + pub fn create_watcher>(&mut self, xt: Arc) -> watcher::Watcher { let sender = self.watchers.entry(*xt.hash()).or_insert_with(watcher::Sender::default); sender.new_watcher() } - pub fn broadcasted(&mut self, hash: &Hash, peers: Vec) { + pub fn broadcasted(&mut self, hash: &H, peers: Vec) { self.fire(hash, |watcher| watcher.broadcast(peers)); } - fn fire(&mut self, hash: &Hash, fun: F) { + fn fire(&mut self, hash: &H, fun: F) where F: FnOnce(&mut watcher::Sender) { let clean = if let Some(h) = self.watchers.get_mut(hash) { fun(h); h.is_done() @@ -52,7 +52,10 @@ impl Listener { } } -impl> txpool::Listener for Listener { +impl txpool::Listener for Listener where + H: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + T: txpool::VerifiedTransaction, +{ fn added(&mut self, tx: &Arc, old: Option<&Arc>) { if let Some(old) = old { let hash = tx.hash(); @@ -81,9 +84,7 @@ impl> txpool::Listener for Listener fn mined(&mut self, tx: &Arc) { // TODO [ToDr] latest block number? - let header_hash = 1.into(); + let header_hash = Default::default(); self.fire(tx.hash(), |watcher| watcher.finalised(header_hash)) } } - - diff --git a/substrate/extrinsic-pool/src/pool.rs b/substrate/extrinsic-pool/src/pool.rs index 433a4dc2b47e2..c0e44b3edb7cc 100644 --- a/substrate/extrinsic-pool/src/pool.rs +++ b/substrate/extrinsic-pool/src/pool.rs @@ -16,6 +16,7 @@ use std::{ collections::HashMap, + fmt, marker::PhantomData, sync::{Arc, Weak}, }; @@ -23,28 +24,29 @@ use std::{ use futures::sync::mpsc; use parking_lot::{RwLock, Mutex}; use txpool; -use primitives::{Hash, block::Extrinsic}; use listener::Listener; use watcher::Watcher; /// Extrinsics pool. -pub struct Pool where - V: txpool::Verifier, +pub struct Pool where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex, + V: txpool::Verifier, S: txpool::Scoring, { _error: Mutex>, pool: RwLock, >>, verifier: V, import_notification_sinks: Mutex>>>, } -impl Pool where - V: txpool::Verifier, +impl Pool where + Hash: ::std::hash::Hash + Eq + Copy + fmt::Debug + fmt::LowerHex + Default, + V: txpool::Verifier, S: txpool::Scoring, V::VerifiedTransaction: txpool::VerifiedTransaction, E: From, @@ -86,7 +88,7 @@ impl Pool where } /// Imports a bunch of extrinsics to the pool - pub fn submit(&self, xts: Vec) -> Result>, E> { + pub fn submit(&self, xts: Vec) -> Result>, E> { xts .into_iter() .map(|xt| self.verifier.verify_transaction(xt)) @@ -97,7 +99,7 @@ impl Pool where } /// Import a single extrinsic and starts to watch their progress in the pool. - pub fn submit_and_watch(&self, xt: Extrinsic) -> Result { + pub fn submit_and_watch(&self, xt: Ex) -> Result, E> { let xt = self.submit(vec![xt])?.pop().expect("One extrinsic passed; one result returned; qed"); Ok(self.pool.write().listener_mut().create_watcher(xt)) } @@ -122,7 +124,7 @@ impl Pool where /// Cull transactions from the queue and then compute the pending set. pub fn cull_and_get_pending(&self, ready: R, f: F) -> T where R: txpool::Ready + Clone, - F: FnOnce(txpool::PendingIterator) -> T, + F: FnOnce(txpool::PendingIterator>) -> T, { let mut pool = self.pool.write(); pool.cull(None, ready.clone()); diff --git a/substrate/extrinsic-pool/src/watcher.rs b/substrate/extrinsic-pool/src/watcher.rs index 3b3dc4cc532a9..e4d8b9921f8ff 100644 --- a/substrate/extrinsic-pool/src/watcher.rs +++ b/substrate/extrinsic-pool/src/watcher.rs @@ -15,17 +15,14 @@ // along with Polkadot. If not, see . use futures::sync::mpsc; -use primitives::{ - block::{HeaderHash, ExtrinsicHash} -}; /// Possible extrinsic status events #[derive(Debug, Clone)] -pub enum Status { +pub enum Status { /// Extrinsic has been finalised in block with given hash. - Finalised(HeaderHash), + Finalised(H), /// Some state change (perhaps another extrinsic was included) rendered this extrinsic invalid. - Usurped(ExtrinsicHash), + Usurped(H), /// The extrinsic has been broadcast to the given peers. Broadcast(Vec), /// Extrinsic has been dropped from the pool because of the limit. @@ -36,19 +33,19 @@ pub enum Status { /// /// Represents a stream of status updates for particular extrinsic. #[derive(Debug)] -pub struct Watcher { - receiver: mpsc::UnboundedReceiver, +pub struct Watcher { + receiver: mpsc::UnboundedReceiver>, } #[derive(Debug, Default)] -pub(crate) struct Sender { - receivers: Vec>, +pub(crate) struct Sender { + receivers: Vec>>, finalised: bool, } -impl Sender { +impl Sender { /// Add a new watcher to this sender object. - pub fn new_watcher(&mut self) -> Watcher { + pub fn new_watcher(&mut self) -> Watcher { let (tx, receiver) = mpsc::unbounded(); self.receivers.push(tx); Watcher { @@ -57,12 +54,12 @@ impl Sender { } /// Some state change (perhaps another extrinsic was included) rendered this extrinsic invalid. - pub fn usurped(&mut self, hash: ExtrinsicHash) { + pub fn usurped(&mut self, hash: H) { self.send(Status::Usurped(hash)) } /// Extrinsic has been finalised in block with given hash. - pub fn finalised(&mut self, hash: HeaderHash) { + pub fn finalised(&mut self, hash: H) { self.send(Status::Finalised(hash)); self.finalised = true; } @@ -82,7 +79,7 @@ impl Sender { self.finalised || self.receivers.is_empty() } - fn send(&mut self, status: Status) { + fn send(&mut self, status: Status) { self.receivers.retain(|sender| sender.unbounded_send(status.clone()).is_ok()) } } diff --git a/substrate/misbehavior-check/Cargo.toml b/substrate/misbehavior-check/Cargo.toml index 58d27f45c7e20..3ab615b2d411a 100644 --- a/substrate/misbehavior-check/Cargo.toml +++ b/substrate/misbehavior-check/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] substrate-codec = { path = "../codec", default-features = false } substrate-primitives = { path = "../primitives", default-features = false } +substrate-runtime-primitives = { path = "../runtime/primitives", default-features = false } substrate-runtime-io = { path = "../runtime-io", default-features = false } [dev-dependencies] @@ -14,4 +15,4 @@ substrate-keyring = { path = "../keyring" } [features] default = ["std"] -std = ["substrate-codec/std", "substrate-primitives/std", "substrate-runtime-io/std"] +std = ["substrate-codec/std", "substrate-primitives/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std"] diff --git a/substrate/misbehavior-check/src/lib.rs b/substrate/misbehavior-check/src/lib.rs index 71236ef457ee6..1c7ff08e4bce0 100644 --- a/substrate/misbehavior-check/src/lib.rs +++ b/substrate/misbehavior-check/src/lib.rs @@ -21,6 +21,7 @@ extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; extern crate substrate_runtime_io as runtime_io; +extern crate substrate_runtime_primitives as runtime_primitives; #[cfg(test)] extern crate substrate_bft; @@ -29,23 +30,27 @@ extern crate substrate_keyring as keyring; use codec::Slicable; use primitives::{AuthorityId, Signature}; -use primitives::block::HeaderHash; -use primitives::bft::{Action, Message, MisbehaviorKind}; + +use runtime_primitives::bft::{Action, Message, MisbehaviorKind}; // check a message signature. returns true if signed by that authority. -fn check_message_sig(message: Message, signature: &Signature, from: &AuthorityId) -> bool { - let msg = message.encode(); +fn check_message_sig( + message: Message, + signature: &Signature, + from: &AuthorityId +) -> bool { + let msg: Vec = message.encode(); runtime_io::ed25519_verify(&signature.0, &msg, from) } -fn prepare(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { +fn prepare(parent: H, round_number: u32, hash: H) -> Message { Message { parent, action: Action::Prepare(round_number, hash), } } -fn commit(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { +fn commit(parent: H, round_number: u32, hash: H) -> Message { Message { parent, action: Action::Commit(round_number, hash), @@ -57,21 +62,21 @@ fn commit(parent: HeaderHash, round_number: u32, hash: HeaderHash) -> Message { /// Doesn't check that the header hash in question is /// valid or whether the misbehaving authority was part of /// the set at that block. -pub fn evaluate_misbehavior( +pub fn evaluate_misbehavior( misbehaved: &AuthorityId, - parent_hash: HeaderHash, - kind: &MisbehaviorKind, + parent_hash: H, + kind: &MisbehaviorKind, ) -> bool { match *kind { MisbehaviorKind::BftDoublePrepare(round, (h_1, ref s_1), (h_2, ref s_2)) => { s_1 != s_2 && - check_message_sig(prepare(parent_hash, round, h_1), s_1, misbehaved) && - check_message_sig(prepare(parent_hash, round, h_2), s_2, misbehaved) + check_message_sig::(prepare::(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig::(prepare::(parent_hash, round, h_2), s_2, misbehaved) } MisbehaviorKind::BftDoubleCommit(round, (h_1, ref s_1), (h_2, ref s_2)) => { s_1 != s_2 && - check_message_sig(commit(parent_hash, round, h_1), s_1, misbehaved) && - check_message_sig(commit(parent_hash, round, h_2), s_2, misbehaved) + check_message_sig::(commit::(parent_hash, round, h_1), s_1, misbehaved) && + check_message_sig::(commit::(parent_hash, round, h_2), s_2, misbehaved) } } } @@ -84,8 +89,12 @@ mod tests { use keyring::ed25519; use keyring::Keyring; - fn sign_prepare(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let msg = substrate_bft::sign_message( + use runtime_primitives::testing::{H256, Block as RawBlock}; + + type Block = RawBlock; + + fn sign_prepare(key: &ed25519::Pair, round: u32, hash: H256, parent_hash: H256) -> (H256, Signature) { + let msg = substrate_bft::sign_message::( generic::Message::Vote(generic::Vote::Prepare(round as _, hash)), key, parent_hash @@ -97,8 +106,8 @@ mod tests { } } - fn sign_commit(key: &ed25519::Pair, round: u32, hash: HeaderHash, parent_hash: HeaderHash) -> (HeaderHash, Signature) { - let msg = substrate_bft::sign_message( + fn sign_commit(key: &ed25519::Pair, round: u32, hash: H256, parent_hash: H256) -> (H256, Signature) { + let msg = substrate_bft::sign_message::( generic::Message::Vote(generic::Vote::Commit(round as _, hash)), key, parent_hash @@ -117,7 +126,7 @@ mod tests { let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -129,7 +138,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_prepare(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -140,7 +149,7 @@ mod tests { ) == false); // misbehavior has wrong target. - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &Keyring::Two.to_raw_public(), parent_hash, &MisbehaviorKind::BftDoublePrepare( @@ -158,7 +167,7 @@ mod tests { let hash_1 = [0; 32].into(); let hash_2 = [1; 32].into(); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoubleCommit( @@ -170,7 +179,7 @@ mod tests { // same signature twice is not misbehavior. let signed = sign_commit(&key, 1, hash_1, parent_hash); - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &key.public().0, parent_hash, &MisbehaviorKind::BftDoubleCommit( @@ -181,7 +190,7 @@ mod tests { ) == false); // misbehavior has wrong target. - assert!(evaluate_misbehavior( + assert!(evaluate_misbehavior::( &Keyring::Two.to_raw_public(), parent_hash, &MisbehaviorKind::BftDoubleCommit( diff --git a/substrate/network/Cargo.toml b/substrate/network/Cargo.toml index ca715c551c1b1..e54b5137808a8 100644 --- a/substrate/network/Cargo.toml +++ b/substrate/network/Cargo.toml @@ -27,6 +27,7 @@ substrate-client = { path = "../../substrate/client" } substrate-state-machine = { path = "../../substrate/state-machine" } substrate-serializer = { path = "../../substrate/serializer" } substrate-runtime-support = { path = "../../substrate/runtime-support" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-bft = { path = "../../substrate/bft" } [dev-dependencies] diff --git a/substrate/network/src/blocks.rs b/substrate/network/src/blocks.rs index 5cff7abd98dd0..49b7c18508a96 100644 --- a/substrate/network/src/blocks.rs +++ b/substrate/network/src/blocks.rs @@ -20,47 +20,47 @@ use std::ops::Range; use std::collections::{HashMap, BTreeMap}; use std::collections::hash_map::Entry; use network::PeerId; -use primitives::block::Number as BlockNumber; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use message; const MAX_PARALLEL_DOWNLOADS: u32 = 1; /// Block data with origin. #[derive(Debug, Clone, PartialEq, Eq)] -pub struct BlockData { - pub block: message::BlockData, +pub struct BlockData { + pub block: message::BlockData, pub origin: PeerId, } #[derive(Debug)] -enum BlockRangeState { +enum BlockRangeState { Downloading { - len: BlockNumber, + len: u64, downloading: u32, }, - Complete(Vec), + Complete(Vec>), } -impl BlockRangeState { - pub fn len(&self) -> BlockNumber { +impl BlockRangeState where B::Header: HeaderT { + pub fn len(&self) -> u64 { match *self { BlockRangeState::Downloading { len, .. } => len, - BlockRangeState::Complete(ref blocks) => blocks.len() as BlockNumber, + BlockRangeState::Complete(ref blocks) => blocks.len() as u64, } } } /// A collection of blocks being downloaded. #[derive(Default)] -pub struct BlockCollection { +pub struct BlockCollection { /// Downloaded blocks. - blocks: BTreeMap, - peer_requests: HashMap, + blocks: BTreeMap>, + peer_requests: HashMap, } -impl BlockCollection { +impl BlockCollection where B::Header: HeaderT { /// Create a new instance. - pub fn new() -> BlockCollection { + pub fn new() -> Self { BlockCollection { blocks: BTreeMap::new(), peer_requests: HashMap::new(), @@ -74,7 +74,7 @@ impl BlockCollection { } /// Insert a set of blocks into collection. - pub fn insert(&mut self, start: BlockNumber, blocks: Vec, peer_id: PeerId) { + pub fn insert(&mut self, start: u64, blocks: Vec>, peer_id: PeerId) { if blocks.is_empty() { return; } @@ -96,13 +96,13 @@ impl BlockCollection { } /// Returns a set of block hashes that require a header download. The returned set is marked as being downloaded. - pub fn needed_blocks(&mut self, peer_id: PeerId, count: usize, peer_best: BlockNumber, common: BlockNumber) -> Option> { + pub fn needed_blocks(&mut self, peer_id: PeerId, count: usize, peer_best: u64, common: u64) -> Option> { // First block number that we need to download let first_different = common + 1; - let count = count as BlockNumber; + let count = count as u64; let (mut range, downloading) = { let mut downloading_iter = self.blocks.iter().peekable(); - let mut prev: Option<(&BlockNumber, &BlockRangeState)> = None; + let mut prev: Option<(&u64, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); break match &(prev, next) { @@ -137,7 +137,7 @@ impl BlockCollection { } /// Get a valid chain of blocks ordered in descending order and ready for importing into blockchain. - pub fn drain(&mut self, from: BlockNumber) -> Vec { + pub fn drain(&mut self, from: u64) -> Vec> { let mut drained = Vec::new(); let mut ranges = Vec::new(); { @@ -145,7 +145,7 @@ impl BlockCollection { for (start, range_data) in &mut self.blocks { match range_data { &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { - prev = *start + blocks.len() as BlockNumber; + prev = *start + blocks.len() as u64; let mut blocks = mem::replace(blocks, Vec::new()); drained.append(&mut blocks); ranges.push(*start); @@ -191,16 +191,19 @@ impl BlockCollection { mod test { use super::{BlockCollection, BlockData}; use message; - use primitives::block::HeaderHash; + use runtime_primitives::testing::Block as RawBlock; + use primitives::H256; - fn is_empty(bc: &BlockCollection) -> bool { + type Block = RawBlock; + + fn is_empty(bc: &BlockCollection) -> bool { bc.blocks.is_empty() && bc.peer_requests.is_empty() } - fn generate_blocks(n: usize) -> Vec { - (0 .. n).map(|_| message::BlockData { - hash: HeaderHash::random(), + fn generate_blocks(n: usize) -> Vec> { + (0 .. n).map(|_| message::generic::BlockData { + hash: H256::random(), header: None, body: None, message_queue: None, diff --git a/substrate/network/src/chain.rs b/substrate/network/src/chain.rs index cb09f88eada54..a2eff9b54d8a5 100644 --- a/substrate/network/src/chain.rs +++ b/substrate/network/src/chain.rs @@ -19,72 +19,74 @@ use client::{self, Client as PolkadotClient, ImportResult, ClientInfo, BlockStatus, BlockOrigin, CallExecutor}; use client::error::Error; use state_machine; -use primitives::block::{self, Id as BlockId}; -use primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::bft::Justification; -pub trait Client: Send + Sync { +pub trait Client: Send + Sync { /// Import a new block. Parent is supposed to be existing in the blockchain. - fn import(&self, is_best: bool, header: block::Header, justification: Justification, body: Option) -> Result; + fn import(&self, is_best: bool, header: Block::Header, justification: Justification, body: Option>) -> Result; /// Get blockchain info. - fn info(&self) -> Result; + fn info(&self) -> Result, Error>; /// Get block status. - fn block_status(&self, id: &BlockId) -> Result; + fn block_status(&self, id: &BlockId) -> Result; /// Get block hash by number. - fn block_hash(&self, block_number: block::Number) -> Result, Error>; + fn block_hash(&self, block_number: ::Number) -> Result, Error>; /// Get block header. - fn header(&self, id: &BlockId) -> Result, Error>; + fn header(&self, id: &BlockId) -> Result, Error>; /// Get block body. - fn body(&self, id: &BlockId) -> Result, Error>; + fn body(&self, id: &BlockId) -> Result>, Error>; /// Get block justification. - fn justification(&self, id: &BlockId) -> Result, Error>; + fn justification(&self, id: &BlockId) -> Result>, Error>; /// Get method execution proof. - fn execution_proof(&self, block: &block::HeaderHash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error>; + fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error>; } -impl Client for PolkadotClient where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - Error: From<<::State as state_machine::backend::Backend>::Error>, { +impl Client for PolkadotClient where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + Block: BlockT, + Error: From<<>::State as state_machine::backend::Backend>::Error>, { - fn import(&self, is_best: bool, header: block::Header, justification: Justification, body: Option) -> Result { + fn import(&self, is_best: bool, header: Block::Header, justification: Justification, body: Option>) -> Result { // TODO: defer justification check. let justified_header = self.check_justification(header, justification.into())?; let origin = if is_best { BlockOrigin::NetworkBroadcast } else { BlockOrigin::NetworkInitialSync }; - (self as &PolkadotClient).import_block(origin, justified_header, body) + (self as &PolkadotClient).import_block(origin, justified_header, body) } - fn info(&self) -> Result { - (self as &PolkadotClient).info() + fn info(&self) -> Result, Error> { + (self as &PolkadotClient).info() } - fn block_status(&self, id: &BlockId) -> Result { - (self as &PolkadotClient).block_status(id) + fn block_status(&self, id: &BlockId) -> Result { + (self as &PolkadotClient).block_status(id) } - fn block_hash(&self, block_number: block::Number) -> Result, Error> { - (self as &PolkadotClient).block_hash(block_number) + fn block_hash(&self, block_number: ::Number) -> Result, Error> { + (self as &PolkadotClient).block_hash(block_number) } - fn header(&self, id: &BlockId) -> Result, Error> { - (self as &PolkadotClient).header(id) + fn header(&self, id: &BlockId) -> Result, Error> { + (self as &PolkadotClient).header(id) } - fn body(&self, id: &BlockId) -> Result, Error> { - (self as &PolkadotClient).body(id) + fn body(&self, id: &BlockId) -> Result>, Error> { + (self as &PolkadotClient).body(id) } - fn justification(&self, id: &BlockId) -> Result, Error> { - (self as &PolkadotClient).justification(id) + fn justification(&self, id: &BlockId) -> Result>, Error> { + (self as &PolkadotClient).justification(id) } - fn execution_proof(&self, block: &block::HeaderHash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { - (self as &PolkadotClient).execution_proof(&BlockId::Hash(block.clone()), method, data) + fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { + (self as &PolkadotClient).execution_proof(&BlockId::Hash(block.clone()), method, data) } } diff --git a/substrate/network/src/consensus.rs b/substrate/network/src/consensus.rs index 1d170ba9cb39f..60abb9b2d4277 100644 --- a/substrate/network/src/consensus.rs +++ b/substrate/network/src/consensus.rs @@ -17,46 +17,35 @@ //! Consensus related bits of the network service. use std::collections::{HashMap, HashSet}; -use futures::sync::{oneshot, mpsc}; +use futures::sync::mpsc; use std::time::{Instant, Duration}; use io::SyncIo; use protocol::Protocol; use network::PeerId; -use primitives::{Hash, block::Id as BlockId, block::Header}; -use message::{self, Message}; -use runtime_support::Hashable; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use message::{self, generic::Message as GenericMessage}; // TODO: Add additional spam/DoS attack protection. const MESSAGE_LIFETIME: Duration = Duration::from_secs(600); -struct CandidateRequest { - id: message::RequestId, - completion: oneshot::Sender>, -} - -struct PeerConsensus { - candidate_fetch: Option, - candidate_available: Option, - known_messages: HashSet, +struct PeerConsensus { + known_messages: HashSet, } /// Consensus network protocol handler. Manages statements and candidate requests. -pub struct Consensus { - peers: HashMap, - our_candidate: Option<(Hash, Vec)>, - statement_sink: Option>, - bft_message_sink: Option<(mpsc::UnboundedSender, Hash)>, - messages: Vec<(Hash, Instant, message::Message)>, - message_hashes: HashSet, +pub struct Consensus { + peers: HashMap>, + bft_message_sink: Option<(mpsc::UnboundedSender>, B::Hash)>, + messages: Vec<(B::Hash, Instant, message::Message)>, + message_hashes: HashSet, } -impl Consensus { +impl Consensus where B::Header: HeaderT { /// Create a new instance. - pub fn new() -> Consensus { + pub fn new() -> Self { Consensus { peers: HashMap::new(), - our_candidate: None, - statement_sink: None, bft_message_sink: None, messages: Default::default(), message_hashes: Default::default(), @@ -65,12 +54,11 @@ impl Consensus { /// Closes all notification streams. pub fn restart(&mut self) { - self.statement_sink = None; self.bft_message_sink = None; } /// Handle new connected peer. - pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, roles: &[message::Role]) { + pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, roles: &[message::Role]) { if roles.iter().any(|r| *r == message::Role::Validator) { trace!(target:"sync", "Registering validator {}", peer_id); // Send out all known messages. @@ -81,14 +69,12 @@ impl Consensus { protocol.send_message(io, peer_id, message.clone()); } self.peers.insert(peer_id, PeerConsensus { - candidate_fetch: None, - candidate_available: None, known_messages, }); } } - fn propagate(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::Message, hash: Hash) { + fn propagate(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::Message, hash: B::Hash) { for (id, ref mut peer) in self.peers.iter_mut() { if peer.known_messages.insert(hash.clone()) { protocol.send_message(io, *id, message.clone()); @@ -96,48 +82,13 @@ impl Consensus { } } - fn register_message(&mut self, hash: Hash, message: message::Message) { + fn register_message(&mut self, hash: B::Hash, message: message::Message) { if self.message_hashes.insert(hash) { self.messages.push((hash, Instant::now(), message)); } } - pub fn on_statement(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, statement: message::Statement, hash: Hash) { - if self.message_hashes.contains(&hash) { - trace!(target:"sync", "Ignored already known statement from {}", peer_id); - } - if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - // TODO: validate signature? - match &statement.statement { - &message::UnsignedStatement::Candidate(ref receipt) => peer.candidate_available = Some(Hash::from(receipt.blake2_256())), - &message::UnsignedStatement::Available(ref hash) => peer.candidate_available = Some(*hash), - &message::UnsignedStatement::Valid(_) | &message::UnsignedStatement::Invalid(_) => (), - } - peer.known_messages.insert(hash); - if let Some(sink) = self.statement_sink.take() { - if let Err(e) = sink.unbounded_send(statement.clone()) { - trace!(target:"sync", "Error broadcasting statement notification: {:?}", e); - } else { - self.statement_sink = Some(sink); - } - } - } else { - trace!(target:"sync", "Ignored statement from unregistered peer {}", peer_id); - return; - } - let message = Message::Statement(statement); - self.register_message(hash.clone(), message.clone()); - // Propagate to other peers. - self.propagate(io, protocol, message, hash); - } - - pub fn statements(&mut self) -> mpsc::UnboundedReceiver{ - let (sink, stream) = mpsc::unbounded(); - self.statement_sink = Some(sink); - stream - } - - pub fn on_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, message: message::LocalizedBftMessage, hash: Hash) { + pub fn on_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, message: message::LocalizedBftMessage, hash: B::Hash) { if self.message_hashes.contains(&hash) { trace!(target:"sync", "Ignored already known BFT message from {}", peer_id); return; @@ -149,7 +100,7 @@ impl Consensus { return; }, (Ok(info), Ok(Some(header))) => { - if header.number < info.chain.best_number { + if header.number() < &info.chain.best_number { trace!(target:"sync", "Ignored ancient BFT message from {}, hash={}", peer_id, message.parent_hash); return; } @@ -174,18 +125,18 @@ impl Consensus { return; } - let message = Message::BftMessage(message); + let message = GenericMessage::BftMessage(message); self.register_message(hash.clone(), message.clone()); // Propagate to other peers. self.propagate(io, protocol, message, hash); } - pub fn bft_messages(&mut self, parent_hash: Hash) -> mpsc::UnboundedReceiver{ + pub fn bft_messages(&mut self, parent_hash: B::Hash) -> mpsc::UnboundedReceiver> { let (sink, stream) = mpsc::unbounded(); for &(_, _, ref message) in self.messages.iter() { let bft_message = match *message { - Message::BftMessage(ref msg) => msg, + GenericMessage::BftMessage(ref msg) => msg, _ => continue, }; @@ -198,90 +149,20 @@ impl Consensus { stream } - pub fn fetch_candidate(&mut self, io: &mut SyncIo, protocol: &Protocol, hash: &Hash) -> oneshot::Receiver> { - // Request from the first peer that has it available. - // TODO: random peer selection. - trace!(target:"sync", "Trying to fetch candidate {:?}", hash); - let (sender, receiver) = oneshot::channel(); - if let Some((peer_id, ref mut peer)) = self.peers.iter_mut() - .find(|&(_, ref peer)| peer.candidate_fetch.is_none() && peer.candidate_available.as_ref().map_or(false, |h| h == hash)) { - - trace!(target:"sync", "Fetching candidate from {}", peer_id); - let id = 0; //TODO: generate unique id - peer.candidate_fetch = Some(CandidateRequest { - id: id, - completion: sender, - }); - let request = message::CandidateRequest { - id: id, - hash: *hash, - }; - protocol.send_message(io, *peer_id, Message::CandidateRequest(request)); - } - // If no peer found `sender` is dropped and `receiver` is canceled immediatelly. - return receiver; - } - - pub fn send_statement(&mut self, io: &mut SyncIo, protocol: &Protocol, statement: message::Statement) { - // Broadcast statement to all validators. - trace!(target:"sync", "Broadcasting statement {:?}", statement); - let message = Message::Statement(statement); - let hash = Protocol::hash_message(&message); - self.register_message(hash.clone(), message.clone()); - self.propagate(io, protocol, message, hash); - } - - pub fn send_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::LocalizedBftMessage) { + pub fn send_bft_message(&mut self, io: &mut SyncIo, protocol: &Protocol, message: message::LocalizedBftMessage) { // Broadcast message to all validators. trace!(target:"sync", "Broadcasting BFT message {:?}", message); - let message = Message::BftMessage(message); + let message = GenericMessage::BftMessage(message); let hash = Protocol::hash_message(&message); self.register_message(hash.clone(), message.clone()); self.propagate(io, protocol, message, hash); } - pub fn set_local_candidate(&mut self, candidate: Option<(Hash, Vec)>) { - trace!(target:"sync", "Set local candidate to {:?}", candidate.as_ref().map(|&(h, _)| h)); - self.our_candidate = candidate; - } - - pub fn on_candidate_request(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, request: message::CandidateRequest) { - let response = match self.our_candidate { - Some((ref hash, ref data)) if *hash == request.hash => Some(data.clone()), - _ => None, - }; - let msg = message::CandidateResponse { - id: request.id, - data: response, - }; - protocol.send_message(io, peer_id, Message::CandidateResponse(msg)); - } - - pub fn on_candidate_response(&mut self, io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId, response: message::CandidateResponse) { - if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - if let Some(request) = peer.candidate_fetch.take() { - if response.id == request.id { - if let Some(data) = response.data { - if let Err(e) = request.completion.send(data) { - trace!(target:"sync", "Error sending candidate data notification: {:?}", e); - } - } - } else { - trace!(target:"sync", "Unexpected candidate response from {}", peer_id); - io.disable_peer(peer_id); - } - } else { - trace!(target:"sync", "Unexpected candidate response from {}", peer_id); - io.disable_peer(peer_id); - } - } - } - - pub fn peer_disconnected(&mut self, _io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId) { + pub fn peer_disconnected(&mut self, _io: &mut SyncIo, _protocol: &Protocol, peer_id: PeerId) { self.peers.remove(&peer_id); } - pub fn collect_garbage(&mut self, best_header: Option<&Header>) { + pub fn collect_garbage(&mut self, best_header: Option<&B::Header>) { let hashes = &mut self.message_hashes; let before = self.messages.len(); let now = Instant::now(); @@ -289,8 +170,7 @@ impl Consensus { if timestamp >= now - MESSAGE_LIFETIME && best_header.map_or(true, |header| match *message { - Message::BftMessage(ref msg) => msg.parent_hash != header.parent_hash, - Message::Statement(ref msg) => msg.parent_hash != header.parent_hash, + GenericMessage::BftMessage(ref msg) => &msg.parent_hash != header.parent_hash(), _ => true, }) { @@ -311,32 +191,33 @@ impl Consensus { #[cfg(test)] mod tests { - use primitives::Hash; - use primitives::bft::Justification; - use primitives::block::{HeaderHash, Header}; + use runtime_primitives::bft::Justification; + use runtime_primitives::testing::{H256, Header, Block as RawBlock}; use std::time::Instant; - use message::{self, Message}; + use message::{self, generic::Message as GenericMessage}; use super::{Consensus, MESSAGE_LIFETIME}; + type Block = RawBlock; + #[test] fn collects_garbage() { - let prev_hash = HeaderHash::random(); - let best_hash = HeaderHash::random(); - let mut consensus = Consensus::new(); + let prev_hash = H256::random(); + let best_hash = H256::random(); + let mut consensus = Consensus::::new(); let now = Instant::now(); - let m1_hash = Hash::random(); - let m2_hash = Hash::random(); - let m1 = Message::BftMessage(message::LocalizedBftMessage { + let m1_hash = H256::random(); + let m2_hash = H256::random(); + let m1 = GenericMessage::BftMessage(message::LocalizedBftMessage { parent_hash: prev_hash, - message: message::BftMessage::Auxiliary(Justification { + message: message::generic::BftMessage::Auxiliary(Justification { round_number: 0, hash: Default::default(), signatures: Default::default(), }), }); - let m2 = Message::BftMessage(message::LocalizedBftMessage { + let m2 = GenericMessage::BftMessage(message::LocalizedBftMessage { parent_hash: best_hash, - message: message::BftMessage::Auxiliary(Justification { + message: message::generic::BftMessage::Auxiliary(Justification { round_number: 0, hash: Default::default(), signatures: Default::default(), @@ -353,7 +234,14 @@ mod tests { assert_eq!(consensus.message_hashes.len(), 2); // random header, nothing should be cleared - let mut header = Header::from_block_number(0); + let mut header = Header { + parent_hash: H256::default(), + number: 0, + state_root: H256::default(), + extrinsics_root: H256::default(), + digest: Default::default(), + }; + consensus.collect_garbage(Some(&header)); assert_eq!(consensus.messages.len(), 2); assert_eq!(consensus.message_hashes.len(), 2); diff --git a/substrate/network/src/lib.rs b/substrate/network/src/lib.rs index f894def9c4f6c..202a081510e8b 100644 --- a/substrate/network/src/lib.rs +++ b/substrate/network/src/lib.rs @@ -30,6 +30,7 @@ extern crate substrate_state_machine as state_machine; extern crate substrate_serializer as ser; extern crate substrate_client as client; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_bft; extern crate serde; extern crate serde_json; @@ -59,19 +60,12 @@ pub mod error; #[cfg(test)] mod test; -pub use service::{Service, FetchFuture, StatementStream, ConsensusService, BftMessageStream, +pub use service::{Service, FetchFuture, ConsensusService, BftMessageStream, TransactionPool, Params, ManageNetwork, SyncProvider}; pub use protocol::{ProtocolStatus}; pub use sync::{Status as SyncStatus, SyncState}; -pub use network::{NonReservedPeerMode, NetworkConfiguration}; -pub use network_devp2p::{ConnectionFilter, ConnectionDirection}; -pub use message::{Statement, BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; +pub use network::{NonReservedPeerMode, NetworkConfiguration, ConnectionFilter, ConnectionDirection}; +pub use message::{generic as generic_message, BftMessage, LocalizedBftMessage, ConsensusVote, SignedConsensusVote, SignedConsensusMessage, SignedConsensusProposal}; pub use error::Error; pub use config::{Role, ProtocolConfig}; pub use on_demand::{OnDemand, OnDemandService, Response as OnDemandResponse}; - -// TODO: move it elsewhere -fn header_hash(header: &primitives::Header) -> primitives::block::HeaderHash { - use runtime_support::Hashable; - header.blake2_256().into() -} diff --git a/substrate/network/src/message.rs b/substrate/network/src/message.rs index 032cd375f0901..1b1b3c1424de0 100644 --- a/substrate/network/src/message.rs +++ b/substrate/network/src/message.rs @@ -16,14 +16,74 @@ //! Network packet message types. These get serialized and put into the lower level protocol payload. -use primitives::{AuthorityId, Hash}; -use primitives::block::{Number as BlockNumber, HeaderHash, Header, Body, Block}; -use primitives::bft::Justification; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; use service::Role as RoleFlags; -use ed25519; + +pub use self::generic::{BlockAnnounce, RemoteCallRequest, ConsensusVote, SignedConsensusVote, FromBlock}; pub type RequestId = u64; -type Bytes = Vec; + +/// Type alias for using the message type using block type parameters. +pub type Message = generic::Message< + B, + ::Header, + ::Hash, + <::Header as HeaderT>::Number, + ::Extrinsic, +>; + +/// Type alias for using the status type using block type parameters. +pub type Status = generic::Status< + ::Hash, + <::Header as HeaderT>::Number, +>; + +/// Type alias for using the block request type using block type parameters. +pub type BlockRequest = generic::BlockRequest< + ::Hash, + <::Header as HeaderT>::Number, +>; + +/// Type alias for using the localized bft message type using block type parameters. +pub type LocalizedBftMessage = generic::LocalizedBftMessage< + B, + ::Hash, +>; + +/// Type alias for using the BlockData type using block type parameters. +pub type BlockData = generic::BlockData< + ::Header, + ::Hash, + ::Extrinsic, +>; + +/// Type alias for using the BlockResponse type using block type parameters. +pub type BlockResponse = generic::BlockResponse< + ::Header, + ::Hash, + ::Extrinsic, +>; + +/// Type alias for using the BftMessage type using block type parameters. +pub type BftMessage = generic::BftMessage< + B, + ::Hash, +>; + +/// Type alias for using the SignedConsensusProposal type using block type parameters. +pub type SignedConsensusProposal = generic::SignedConsensusProposal< + B, + ::Hash, +>; + +/// Type alias for using the SignedConsensusProposal type using block type parameters. +pub type SignedConsensusMessage = generic::SignedConsensusProposal< + B, + ::Hash, +>; + +/// A set of transactions. +pub type Transactions = Vec; /// Configured node role. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] @@ -73,8 +133,8 @@ impl From for Vec where { } } -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Copy, Clone)] /// Bits of block data and associated artefacts to request. +#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Copy, Clone)] pub enum BlockAttribute { /// Include block header. Header, @@ -88,33 +148,6 @@ pub enum BlockAttribute { Justification, } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Block data sent in the response. -pub struct BlockData { - /// Block header hash. - pub hash: HeaderHash, - /// Block header if requested. - pub header: Option

    , - /// Block body if requested. - pub body: Option, - /// Block receipt if requested. - pub receipt: Option, - /// Block message queue if requested. - pub message_queue: Option, - /// Justification if requested. - pub justification: Option, -} - -#[serde(untagged)] -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Identifies starting point of a block sequence. -pub enum FromBlock { - /// Start with given hash. - Hash(HeaderHash), - /// Start with given block number. - Number(BlockNumber), -} - #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] /// Block enumeration direction. pub enum Direction { @@ -124,226 +157,202 @@ pub enum Direction { Descending, } -/// A set of transactions. -pub type Transactions = Vec>; - -/// Statements circulated among peers. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum UnsignedStatement { - /// Broadcast by a authority to indicate that this is his candidate for - /// inclusion. - /// - /// Broadcasting two different candidate messages per round is not allowed. - Candidate(Vec), - /// Broadcast by a authority to attest that the candidate with given digest - /// is valid. - Valid(Hash), - /// Broadcast by a authority to attest that the auxiliary data for a candidate - /// with given digest is available. - Available(Hash), - /// Broadcast by a authority to attest that the candidate with given digest - /// is invalid. - Invalid(Hash), -} - -/// A signed statement. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct Statement { - /// Parent relay chain block header hash. - pub parent_hash: HeaderHash, - /// The statement. - pub statement: UnsignedStatement, - /// The signature. - pub signature: ed25519::Signature, - /// The sender. - pub sender: AuthorityId, -} - - -/// Communication that can occur between participants in consensus. #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum BftMessage { - /// A consensus message (proposal or vote) - Consensus(SignedConsensusMessage), - /// Auxiliary communication (just proof-of-lock for now). - Auxiliary(Justification), +/// Remote call response. +pub struct RemoteCallResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Method return value. + pub value: Vec, + /// Execution proof. + pub proof: Vec>, } -/// BFT Consensus message with parent header hash attached to it. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct LocalizedBftMessage { - /// Consensus message. - pub message: BftMessage, - /// Parent header hash. - pub parent_hash: HeaderHash, -} +/// Generic types. +pub mod generic { + use primitives::AuthorityId; + use runtime_primitives::bft::Justification; + use ed25519; + + use super::{Role, BlockAttribute, RemoteCallResponse, RequestId, Transactions, Direction}; + /// Block data sent in the response. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockData { + /// Block header hash. + pub hash: Hash, + /// Block header if requested. + pub header: Option
    , + /// Block body if requested. + pub body: Option>, + /// Block receipt if requested. + pub receipt: Option>, + /// Block message queue if requested. + pub message_queue: Option>, + /// Justification if requested. + pub justification: Option>, + } -/// A localized proposal message. Contains two signed pieces of data. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusProposal { - /// The round number. - pub round_number: u32, - /// The proposal sent. - pub proposal: Block, - /// The digest of the proposal. - pub digest: Hash, - /// The sender of the proposal - pub sender: AuthorityId, - /// The signature on the message (propose, round number, digest) - pub digest_signature: ed25519::Signature, - /// The signature on the message (propose, round number, proposal) - pub full_signature: ed25519::Signature, -} + /// Identifies starting point of a block sequence. + #[serde(untagged)] + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum FromBlock { + /// Start with given hash. + Hash(Hash), + /// Start with given block number. + Number(Number), + } -/// A localized vote message, including the sender. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct SignedConsensusVote { - /// The message sent. - pub vote: ConsensusVote, - /// The sender of the message - pub sender: AuthorityId, - /// The signature of the message. - pub signature: ed25519::Signature, -} + /// Communication that can occur between participants in consensus. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum BftMessage { + /// A consensus message (proposal or vote) + Consensus(SignedConsensusMessage), + /// Auxiliary communication (just proof-of-lock for now). + Auxiliary(Justification), + } -/// Votes during a consensus round. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum ConsensusVote { - /// Prepare to vote for proposal with digest D. - Prepare(u32, Hash), - /// Commit to proposal with digest D.. - Commit(u32, Hash), - /// Propose advancement to a new round. - AdvanceRound(u32), -} + /// BFT Consensus message with parent header hash attached to it. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct LocalizedBftMessage { + /// Consensus message. + pub message: BftMessage, + /// Parent header hash. + pub parent_hash: Hash, + } -/// A localized message. -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub enum SignedConsensusMessage { - /// A proposal. - Propose(SignedConsensusProposal), - /// A vote. - Vote(SignedConsensusVote), -} + /// A localized proposal message. Contains two signed pieces of data. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct SignedConsensusProposal { + /// The round number. + pub round_number: u32, + /// The proposal sent. + pub proposal: Block, + /// The digest of the proposal. + pub digest: Hash, + /// The sender of the proposal + pub sender: AuthorityId, + /// The signature on the message (propose, round number, digest) + pub digest_signature: ed25519::Signature, + /// The signature on the message (propose, round number, proposal) + pub full_signature: ed25519::Signature, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// A network message. -pub enum Message { - /// Status packet. - Status(Status), - /// Block request. - BlockRequest(BlockRequest), - /// Block response. - BlockResponse(BlockResponse), - /// Block announce. - BlockAnnounce(BlockAnnounce), - /// Transactions. - Transactions(Transactions), - /// Consensus statement. - Statement(Statement), - /// Candidate data request. - CandidateRequest(CandidateRequest), - /// Candidate response. - CandidateResponse(CandidateResponse), - /// BFT Consensus statement. - BftMessage(LocalizedBftMessage), - /// Remote method call request. - RemoteCallRequest(RemoteCallRequest), - /// Remote method call response. - RemoteCallResponse(RemoteCallResponse), -} + /// A localized vote message, including the sender. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct SignedConsensusVote { + /// The message sent. + pub vote: ConsensusVote, + /// The sender of the message + pub sender: AuthorityId, + /// The signature of the message. + pub signature: ed25519::Signature, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct Status { - /// Protocol version. - pub version: u32, - /// Supported roles. - pub roles: Vec, - /// Best block number. - pub best_number: BlockNumber, - /// Best block hash. - pub best_hash: HeaderHash, - /// Genesis block hash. - pub genesis_hash: HeaderHash, - /// Signatue of `best_hash` made with validator address. Required for the validator role. - pub validator_signature: Option, - /// Validator address. Required for the validator role. - pub validator_id: Option, - /// Parachain id. Required for the collator role. - pub parachain_id: Option, -} + /// Votes during a consensus round. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum ConsensusVote { + /// Prepare to vote for proposal with digest D. + Prepare(u32, H), + /// Commit to proposal with digest D.. + Commit(u32, H), + /// Propose advancement to a new round. + AdvanceRound(u32), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Request block data from a peer. -pub struct BlockRequest { - /// Unique request id. - pub id: RequestId, - /// Bits of block data to request. - pub fields: Vec, - /// Start from this block. - pub from: FromBlock, - /// End at this block. An implementation defined maximum is used when unspecified. - pub to: Option, - /// Sequence direction. - pub direction: Direction, - /// Maximum number of blocks to return. An implementation defined maximum is used when unspecified. - pub max: Option, -} + /// A localized message. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum SignedConsensusMessage { + /// A proposal. + Propose(SignedConsensusProposal), + /// A vote. + Vote(SignedConsensusVote), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Request candidate block data from a peer. -pub struct CandidateRequest { - /// Unique request id. - pub id: RequestId, - /// Candidate receipt hash. - pub hash: Hash, -} + /// A network message. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub enum Message { + /// Status packet. + Status(Status), + /// Block request. + BlockRequest(BlockRequest), + /// Block response. + BlockResponse(BlockResponse), + /// Block announce. + BlockAnnounce(BlockAnnounce
    ), + /// Transactions. + Transactions(Transactions), + /// BFT Consensus statement. + BftMessage(LocalizedBftMessage), + /// Remote method call request. + RemoteCallRequest(RemoteCallRequest), + /// Remote method call response. + RemoteCallResponse(RemoteCallResponse), + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Candidate block data response. -pub struct CandidateResponse { - /// Unique request id. - pub id: RequestId, - /// Candidate data. Empty if the peer does not have the candidate anymore. - pub data: Option>, -} + /// Status sent on connection. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct Status { + /// Protocol version. + pub version: u32, + /// Supported roles. + pub roles: Vec, + /// Best block number. + pub best_number: Number, + /// Best block hash. + pub best_hash: Hash, + /// Genesis block hash. + pub genesis_hash: Hash, + /// Signatue of `best_hash` made with validator address. Required for the validator role. + pub validator_signature: Option, + /// Validator address. Required for the validator role. + pub validator_id: Option, + /// Parachain id. Required for the collator role. + pub parachain_id: Option, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Response to `BlockRequest` -pub struct BlockResponse { - /// Id of a request this response was made for. - pub id: RequestId, - /// Block data for the requested sequence. - pub blocks: Vec, -} + /// Request block data from a peer. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockRequest { + /// Unique request id. + pub id: RequestId, + /// Bits of block data to request. + pub fields: Vec, + /// Start from this block. + pub from: FromBlock, + /// End at this block. An implementation defined maximum is used when unspecified. + pub to: Option, + /// Sequence direction. + pub direction: Direction, + /// Maximum number of blocks to return. An implementation defined maximum is used when unspecified. + pub max: Option, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Announce a new complete relay chain block on the network. -pub struct BlockAnnounce { - /// New block header. - pub header: Header, -} + /// Response to `BlockRequest` + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockResponse { + /// Id of a request this response was made for. + pub id: RequestId, + /// Block data for the requested sequence. + pub blocks: Vec>, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Remote call request. -pub struct RemoteCallRequest { - /// Unique request id. - pub id: RequestId, - /// Block at which to perform call. - pub block: HeaderHash, - /// Method name. - pub method: String, - /// Call data. - pub data: Vec, -} + /// Announce a new complete relay chain block on the network. + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + pub struct BlockAnnounce { + /// New block header. + pub header: H, + } -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -/// Remote call response. -pub struct RemoteCallResponse { - /// Id of a request this response was made for. - pub id: RequestId, - /// Method return value. - pub value: Vec, - /// Execution proof. - pub proof: Vec>, + #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] + /// Remote call request. + pub struct RemoteCallRequest { + /// Unique request id. + pub id: RequestId, + /// Block at which to perform call. + pub block: H, + /// Method name. + pub method: String, + /// Call data. + pub data: Vec, + } } diff --git a/substrate/network/src/on_demand.rs b/substrate/network/src/on_demand.rs index 76180f616d0bc..e36bf5deca286 100644 --- a/substrate/network/src/on_demand.rs +++ b/substrate/network/src/on_demand.rs @@ -30,6 +30,7 @@ use io::SyncIo; use message; use network::PeerId; use service; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; /// Remote request timeout. const REQUEST_TIMEOUT: Duration = Duration::from_secs(15); @@ -50,9 +51,9 @@ pub trait OnDemandService: Send + Sync { } /// On-demand requests service. Dispatches requests to appropriate peers. -pub struct OnDemand { - core: Mutex>, - checker: Arc, +pub struct OnDemand> { + core: Mutex>, + checker: Arc>, } /// On-demand response. @@ -61,19 +62,19 @@ pub struct Response { } #[derive(Default)] -struct OnDemandCore { +struct OnDemandCore> { service: Weak, next_request_id: u64, - pending_requests: VecDeque, - active_peers: LinkedHashMap, + pending_requests: VecDeque>, + active_peers: LinkedHashMap>, idle_peers: VecDeque, } -struct Request { +struct Request { id: u64, timestamp: Instant, sender: Sender, - request: RemoteCallRequest, + request: RemoteCallRequest, } impl Future for Response { @@ -86,9 +87,12 @@ impl Future for Response { } } -impl OnDemand where E: service::ExecuteInContext { +impl OnDemand where + E: service::ExecuteInContext, + B::Header: HeaderT, +{ /// Creates new on-demand service. - pub fn new(checker: Arc) -> Self { + pub fn new(checker: Arc>) -> Self { OnDemand { checker, core: Mutex::new(OnDemandCore { @@ -107,7 +111,7 @@ impl OnDemand where E: service::ExecuteInContext { } /// Execute method call on remote node, returning execution result and proof. - pub fn remote_call(&self, request: RemoteCallRequest) -> Response { + pub fn remote_call(&self, request: RemoteCallRequest) -> Response { let (sender, receiver) = channel(); let result = Response { receiver: receiver, @@ -123,7 +127,11 @@ impl OnDemand where E: service::ExecuteInContext { } } -impl OnDemandService for OnDemand where E: service::ExecuteInContext { +impl OnDemandService for OnDemand where + B: BlockT, + E: service::ExecuteInContext, + B::Header: HeaderT, +{ fn on_connect(&self, peer: PeerId, role: service::Role) { if !role.intersects(service::Role::FULL | service::Role::COLLATOR | service::Role::VALIDATOR) { // TODO: correct? return; @@ -175,15 +183,23 @@ impl OnDemandService for OnDemand where E: service::ExecuteInContext { } } -impl Fetcher for OnDemand where E: service::ExecuteInContext { +impl Fetcher for OnDemand where + B: BlockT, + E: service::ExecuteInContext, + B::Header: HeaderT, +{ type RemoteCallResult = Response; - fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { - self.remote_call(request) + fn remote_call(&self, request: RemoteCallRequest) -> Self::RemoteCallResult { + OnDemand::remote_call(self, request) } } -impl OnDemandCore where E: service::ExecuteInContext { +impl OnDemandCore where + B: BlockT, + E: service::ExecuteInContext , + B::Header: HeaderT +{ pub fn add_peer(&mut self, peer: PeerId) { self.idle_peers.push_back(peer); } @@ -214,7 +230,7 @@ impl OnDemandCore where E: service::ExecuteInContext { } } - pub fn insert(&mut self, sender: Sender, request: RemoteCallRequest) { + pub fn insert(&mut self, sender: Sender, request: RemoteCallRequest) { let request_id = self.next_request_id; self.next_request_id += 1; @@ -226,7 +242,7 @@ impl OnDemandCore where E: service::ExecuteInContext { }); } - pub fn remove(&mut self, peer: PeerId, id: u64) -> Option { + pub fn remove(&mut self, peer: PeerId, id: u64) -> Option> { match self.active_peers.entry(peer) { Entry::Occupied(entry) => match entry.get().id == id { true => { @@ -263,7 +279,7 @@ impl OnDemandCore where E: service::ExecuteInContext { data: request.request.call_data.clone(), }; - protocol.send_message(ctx, peer, message::Message::RemoteCallRequest(message)) + protocol.send_message(ctx, peer, message::generic::Message::RemoteCallRequest(message)) }); self.active_peers.insert(peer, request); } @@ -286,16 +302,17 @@ mod tests { use service::{Role, ExecuteInContext}; use test::TestIo; use super::{REQUEST_TIMEOUT, OnDemand, OnDemandService}; + use test_client::runtime::{Block, Hash}; struct DummyExecutor; struct DummyFetchChecker { ok: bool } - impl ExecuteInContext for DummyExecutor { - fn execute_in_context(&self, _closure: F) {} + impl ExecuteInContext for DummyExecutor { + fn execute_in_context)>(&self, _closure: F) {} } - impl FetchChecker for DummyFetchChecker { - fn check_execution_proof(&self, _request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> client::error::Result { + impl FetchChecker for DummyFetchChecker { + fn check_execution_proof(&self, _request: &RemoteCallRequest, remote_proof: (Vec, Vec>)) -> client::error::Result { match self.ok { true => Ok(client::CallResult { return_data: remote_proof.0, @@ -306,19 +323,19 @@ mod tests { } } - fn dummy(ok: bool) -> (Arc, Arc>) { + fn dummy(ok: bool) -> (Arc, Arc>) { let executor = Arc::new(DummyExecutor); let service = Arc::new(OnDemand::new(Arc::new(DummyFetchChecker { ok }))); service.set_service_link(Arc::downgrade(&executor)); (executor, service) } - fn total_peers(on_demand: &OnDemand) -> usize { + fn total_peers(on_demand: &OnDemand) -> usize { let core = on_demand.core.lock(); core.idle_peers.len() + core.active_peers.len() } - fn receive_response(on_demand: &OnDemand, network: &mut TestIo, peer: PeerId, id: message::RequestId) { + fn receive_response(on_demand: &OnDemand, network: &mut TestIo, peer: PeerId, id: message::RequestId) { on_demand.on_remote_response(network, peer, message::RemoteCallResponse { id: id, value: vec![1], diff --git a/substrate/network/src/protocol.rs b/substrate/network/src/protocol.rs index 1c2ab8bb63cba..d49b7be1c8139 100644 --- a/substrate/network/src/protocol.rs +++ b/substrate/network/src/protocol.rs @@ -19,23 +19,21 @@ use std::{mem, cmp}; use std::sync::Arc; use std::time; use parking_lot::{RwLock, Mutex}; -use futures::sync::oneshot; use serde_json; -use primitives::block::{HeaderHash, ExtrinsicHash, Number as BlockNumber, Header, Id as BlockId}; -use primitives::{Hash, blake2_256}; -use runtime_support::Hashable; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hashing, HashingFor}; +use runtime_primitives::generic::BlockId; use network::PeerId; use message::{self, Message}; +use message::generic::Message as GenericMessage; use sync::{ChainSync, Status as SyncStatus, SyncState}; use consensus::Consensus; -use service::{Role, TransactionPool, StatementStream, BftMessageStream}; +use service::{Role, TransactionPool, BftMessageStream}; use config::ProtocolConfig; use chain::Client; use on_demand::OnDemandService; use io::SyncIo; use error; -use super::header_hash; const REQUEST_TIMEOUT_SEC: u64 = 40; const PROTOCOL_VERSION: u32 = 0; @@ -44,25 +42,25 @@ const PROTOCOL_VERSION: u32 = 0; const MAX_BLOCK_DATA_RESPONSE: u32 = 128; // Lock must always be taken in order declared here. -pub struct Protocol { +pub struct Protocol { config: ProtocolConfig, - chain: Arc, + chain: Arc>, on_demand: Option>, - genesis_hash: HeaderHash, - sync: RwLock, - consensus: Mutex, + genesis_hash: B::Hash, + sync: RwLock>, + consensus: Mutex>, // All connected peers - peers: RwLock>, + peers: RwLock>>, // Connected peers pending Status message. handshaking_peers: RwLock>, - transaction_pool: Arc, + transaction_pool: Arc>, } /// Syncing status and statistics #[derive(Clone)] -pub struct ProtocolStatus { +pub struct ProtocolStatus { /// Sync status. - pub sync: SyncStatus, + pub sync: SyncStatus, /// Total number of connected peers pub num_peers: usize, /// Total number of active peers. @@ -70,42 +68,49 @@ pub struct ProtocolStatus { } /// Peer information -struct Peer { +struct Peer { /// Protocol version protocol_version: u32, /// Roles roles: Role, /// Peer best block hash - best_hash: HeaderHash, + best_hash: B::Hash, /// Peer best block number - best_number: BlockNumber, + best_number: ::Number, /// Pending block request if any - block_request: Option, + block_request: Option>, /// Request timestamp request_timestamp: Option, /// Holds a set of transactions known to this peer. - known_transactions: HashSet, + known_transactions: HashSet, /// Holds a set of blocks known to this peer. - known_blocks: HashSet, + known_blocks: HashSet, /// Request counter, next_request_id: message::RequestId, } #[derive(Debug)] -pub struct PeerInfo { +pub struct PeerInfo { /// Roles pub roles: Role, /// Protocol version pub protocol_version: u32, /// Peer best block hash - pub best_hash: HeaderHash, + pub best_hash: B::Hash, /// Peer best block number - pub best_number: BlockNumber, + pub best_number: ::Number, } -impl Protocol { +impl Protocol where + B::Header: HeaderT +{ /// Create a new instance. - pub fn new(config: ProtocolConfig, chain: Arc, on_demand: Option>, transaction_pool: Arc) -> error::Result { + pub fn new( + config: ProtocolConfig, + chain: Arc>, + on_demand: Option>, + transaction_pool: Arc> + ) -> error::Result { let info = chain.info()?; let sync = ChainSync::new(config.roles, &info); let protocol = Protocol { @@ -123,7 +128,7 @@ impl Protocol { } /// Returns protocol status - pub fn status(&self) -> ProtocolStatus { + pub fn status(&self) -> ProtocolStatus { let sync = self.sync.read(); let peers = self.peers.read(); ProtocolStatus { @@ -134,7 +139,7 @@ impl Protocol { } pub fn handle_packet(&self, io: &mut SyncIo, peer_id: PeerId, data: &[u8]) { - let message: Message = match serde_json::from_slice(data) { + let message: Message = match serde_json::from_slice(data) { Ok(m) => m, Err(e) => { debug!("Invalid packet from {}: {}", peer_id, e); @@ -144,9 +149,9 @@ impl Protocol { }; match message { - Message::Status(s) => self.on_status_message(io, peer_id, s), - Message::BlockRequest(r) => self.on_block_request(io, peer_id, r), - Message::BlockResponse(r) => { + GenericMessage::Status(s) => self.on_status_message(io, peer_id, s), + GenericMessage::BlockRequest(r) => self.on_block_request(io, peer_id, r), + GenericMessage::BlockResponse(r) => { let request = { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { @@ -171,22 +176,19 @@ impl Protocol { } self.on_block_response(io, peer_id, request, r); }, - Message::BlockAnnounce(announce) => { + GenericMessage::BlockAnnounce(announce) => { self.on_block_announce(io, peer_id, announce); }, - Message::Statement(s) => self.on_statement(io, peer_id, s, blake2_256(data).into()), - Message::CandidateRequest(r) => self.on_candidate_request(io, peer_id, r), - Message::CandidateResponse(r) => self.on_candidate_response(io, peer_id, r), - Message::BftMessage(m) => self.on_bft_message(io, peer_id, m, blake2_256(data).into()), - Message::Transactions(m) => self.on_transactions(io, peer_id, m), - Message::RemoteCallRequest(request) => self.on_remote_call_request(io, peer_id, request), - Message::RemoteCallResponse(response) => self.on_remote_call_response(io, peer_id, response) + GenericMessage::BftMessage(m) => self.on_bft_message(io, peer_id, m, HashingFor::::hash(data)), + GenericMessage::Transactions(m) => self.on_transactions(io, peer_id, m), + GenericMessage::RemoteCallRequest(request) => self.on_remote_call_request(io, peer_id, request), + GenericMessage::RemoteCallResponse(response) => self.on_remote_call_response(io, peer_id, response) } } - pub fn send_message(&self, io: &mut SyncIo, peer_id: PeerId, mut message: Message) { + pub fn send_message(&self, io: &mut SyncIo, peer_id: PeerId, mut message: Message) { match &mut message { - &mut Message::BlockRequest(ref mut r) => { + &mut GenericMessage::BlockRequest(ref mut r) => { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { r.id = peer.next_request_id; @@ -204,9 +206,9 @@ impl Protocol { } } - pub fn hash_message(message: &Message) -> Hash { + pub fn hash_message(message: &Message) -> B::Hash { let data = serde_json::to_vec(&message).expect("Serializer is infallible; qed"); - blake2_256(&data).into() + HashingFor::::hash(&data) } /// Called when a new peer is connected @@ -232,7 +234,7 @@ impl Protocol { } } - fn on_block_request(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest) { + fn on_block_request(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest) { trace!(target: "sync", "BlockRequest {} from {}: from {:?} to {:?} max {:?}", request.id, peer, request.from, request.to, request.max); let mut blocks = Vec::new(); let mut id = match request.from { @@ -255,9 +257,9 @@ impl Protocol { if blocks.len() >= max{ break; } - let number = header.number; - let hash = header_hash(&header); - let block_data = message::BlockData { + let number = header.number().clone(); + let hash = header.hash(); + let block_data = message::generic::BlockData { hash: hash, header: if get_header { Some(header) } else { None }, body: if get_body { self.chain.body(&BlockId::Hash(hash)).unwrap_or(None) } else { None }, @@ -276,69 +278,34 @@ impl Protocol { } } } - let response = message::BlockResponse { + let response = message::generic::BlockResponse { id: request.id, blocks: blocks, }; - self.send_message(io, peer, Message::BlockResponse(response)) + self.send_message(io, peer, GenericMessage::BlockResponse(response)) } - fn on_block_response(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse) { + fn on_block_response(&self, io: &mut SyncIo, peer: PeerId, request: message::BlockRequest, response: message::BlockResponse) { // TODO: validate response trace!(target: "sync", "BlockResponse {} from {} with {} blocks", response.id, peer, response.blocks.len()); self.sync.write().on_block_data(io, self, peer, request, response); } - fn on_candidate_request(&self, io: &mut SyncIo, peer: PeerId, request: message::CandidateRequest) { - trace!(target: "sync", "CandidateRequest {} from {} for {}", request.id, peer, request.hash); - self.consensus.lock().on_candidate_request(io, self, peer, request); - } - - fn on_candidate_response(&self, io: &mut SyncIo, peer: PeerId, response: message::CandidateResponse) { - trace!(target: "sync", "CandidateResponse {} from {} with {:?} bytes", response.id, peer, response.data.as_ref().map(|d| d.len())); - self.consensus.lock().on_candidate_response(io, self, peer, response); - } - - fn on_statement(&self, io: &mut SyncIo, peer: PeerId, statement: message::Statement, hash: Hash) { - trace!(target: "sync", "Statement from {}: {:?}", peer, statement); - self.consensus.lock().on_statement(io, self, peer, statement, hash); - } - - fn on_bft_message(&self, io: &mut SyncIo, peer: PeerId, message: message::LocalizedBftMessage, hash: Hash) { + fn on_bft_message(&self, io: &mut SyncIo, peer: PeerId, message: message::LocalizedBftMessage, hash: B::Hash) { trace!(target: "sync", "BFT message from {}: {:?}", peer, message); self.consensus.lock().on_bft_message(io, self, peer, message, hash); } /// See `ConsensusService` trait. - pub fn send_bft_message(&self, io: &mut SyncIo, message: message::LocalizedBftMessage) { + pub fn send_bft_message(&self, io: &mut SyncIo, message: message::LocalizedBftMessage) { self.consensus.lock().send_bft_message(io, self, message) } /// See `ConsensusService` trait. - pub fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream { + pub fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream { self.consensus.lock().bft_messages(parent_hash) } - /// See `ConsensusService` trait. - pub fn statements(&self) -> StatementStream { - self.consensus.lock().statements() - } - - /// See `ConsensusService` trait. - pub fn fetch_candidate(&self, io: &mut SyncIo, hash: &Hash) -> oneshot::Receiver> { - self.consensus.lock().fetch_candidate(io, self, hash) - } - - /// See `ConsensusService` trait. - pub fn send_statement(&self, io: &mut SyncIo, statement: message::Statement) { - self.consensus.lock().send_statement(io, self, statement) - } - - /// See `ConsensusService` trait. - pub fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>) { - self.consensus.lock().set_local_candidate(candidate) - } - /// Perform time based maintenance. pub fn tick(&self, io: &mut SyncIo) { self.maintain_peers(io); @@ -367,7 +334,7 @@ impl Protocol { } } - pub fn peer_info(&self, peer: PeerId) -> Option { + pub fn peer_info(&self, peer: PeerId) -> Option> { self.peers.read().get(&peer).map(|p| { PeerInfo { roles: p.roles, @@ -379,7 +346,7 @@ impl Protocol { } /// Called by peer to report status - fn on_status_message(&self, io: &mut SyncIo, peer_id: PeerId, status: message::Status) { + fn on_status_message(&self, io: &mut SyncIo, peer_id: PeerId, status: message::Status) { trace!(target: "sync", "New peer {} {:?}", peer_id, status); if io.is_expired() { trace!(target: "sync", "Status packet from expired session {}:{}", peer_id, io.peer_info(peer_id)); @@ -426,7 +393,7 @@ impl Protocol { } /// Called when peer sends us new transactions - fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { + fn on_transactions(&self, _io: &mut SyncIo, peer_id: PeerId, transactions: message::Transactions) { // Accept transactions only when fully synced if self.sync.read().status().state != SyncState::Idle { trace!(target: "sync", "{} Ignoring transactions while syncing", peer_id); @@ -475,7 +442,7 @@ impl Protocol { } } trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), peer_id); - self.send_message(io, *peer_id, Message::Transactions(to_send)); + self.send_message(io, *peer_id, GenericMessage::Transactions(to_send)); } } self.transaction_pool.on_broadcasted(propagated_to); @@ -484,7 +451,7 @@ impl Protocol { /// Send Status message fn send_status(&self, io: &mut SyncIo, peer_id: PeerId) { if let Ok(info) = self.chain.info() { - let status = message::Status { + let status = message::generic::Status { version: PROTOCOL_VERSION, genesis_hash: info.chain.genesis_hash, roles: self.config.roles.into(), @@ -494,7 +461,7 @@ impl Protocol { validator_id: None, parachain_id: None, }; - self.send_message(io, peer_id, Message::Status(status)) + self.send_message(io, peer_id, GenericMessage::Status(status)) } } @@ -508,9 +475,9 @@ impl Protocol { self.consensus.lock().restart(); } - pub fn on_block_announce(&self, io: &mut SyncIo, peer_id: PeerId, announce: message::BlockAnnounce) { + pub fn on_block_announce(&self, io: &mut SyncIo, peer_id: PeerId, announce: message::BlockAnnounce) { let header = announce.header; - let hash: HeaderHash = header.blake2_256().into(); + let hash = header.hash(); { let mut peers = self.peers.write(); if let Some(ref mut peer) = peers.get_mut(&peer_id) { @@ -520,7 +487,7 @@ impl Protocol { self.sync.write().on_block_announce(io, self, peer_id, hash, &header); } - pub fn on_block_imported(&self, io: &mut SyncIo, hash: HeaderHash, header: &Header) { + pub fn on_block_imported(&self, io: &mut SyncIo, hash: B::Hash, header: &B::Header) { self.sync.write().update_chain_info(&header); // send out block announcements let mut peers = self.peers.write(); @@ -528,7 +495,7 @@ impl Protocol { for (peer_id, ref mut peer) in peers.iter_mut() { if peer.known_blocks.insert(hash.clone()) { trace!(target: "sync", "Announcing block {:?} to {}", hash, peer_id); - self.send_message(io, *peer_id, Message::BlockAnnounce(message::BlockAnnounce { + self.send_message(io, *peer_id, GenericMessage::BlockAnnounce(message::BlockAnnounce { header: header.clone() })); } @@ -537,7 +504,7 @@ impl Protocol { self.consensus.lock().collect_garbage(Some(&header)); } - fn on_remote_call_request(&self, io: &mut SyncIo, peer_id: PeerId, request: message::RemoteCallRequest) { + fn on_remote_call_request(&self, io: &mut SyncIo, peer_id: PeerId, request: message::RemoteCallRequest) { trace!(target: "sync", "Remote request {} from {} ({} at {})", request.id, peer_id, request.method, request.block); let (value, proof) = match self.chain.execution_proof(&request.block, &request.method, &request.data) { Ok((value, proof)) => (value, proof), @@ -548,7 +515,7 @@ impl Protocol { }, }; - self.send_message(io, peer_id, message::Message::RemoteCallResponse(message::RemoteCallResponse { + self.send_message(io, peer_id, GenericMessage::RemoteCallResponse(message::RemoteCallResponse { id: request.id, value, proof, })); } @@ -558,7 +525,7 @@ impl Protocol { self.on_demand.as_ref().map(|s| s.on_remote_response(io, peer_id, response)); } - pub fn chain(&self) -> &Client { + pub fn chain(&self) -> &Client { &*self.chain } } diff --git a/substrate/network/src/service.rs b/substrate/network/src/service.rs index 06b7eff2163a5..06af3c52cc7ad 100644 --- a/substrate/network/src/service.rs +++ b/substrate/network/src/service.rs @@ -22,16 +22,15 @@ use futures::sync::{oneshot, mpsc}; use network::{NetworkProtocolHandler, NetworkContext, HostInfo, PeerId, ProtocolId, NetworkConfiguration , NonReservedPeerMode, ErrorKind}; use network_devp2p::{NetworkService}; -use primitives::block::{ExtrinsicHash, Header, HeaderHash}; -use primitives::Hash; use core_io::{TimerToken}; use io::NetSyncIo; use protocol::{Protocol, ProtocolStatus, PeerInfo as ProtocolPeerInfo}; use config::{ProtocolConfig}; use error::Error; use chain::Client; -use message::{Statement, LocalizedBftMessage}; +use message::LocalizedBftMessage; use on_demand::OnDemandService; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; /// Polkadot devp2p protocol id pub const DOT_PROTOCOL_ID: ProtocolId = *b"dot"; @@ -40,10 +39,8 @@ const V0_PACKET_COUNT: u8 = 1; /// Type that represents fetch completion future. pub type FetchFuture = oneshot::Receiver>; -/// Type that represents statement stream. -pub type StatementStream = mpsc::UnboundedReceiver; /// Type that represents bft messages stream. -pub type BftMessageStream = mpsc::UnboundedReceiver; +pub type BftMessageStream = mpsc::UnboundedReceiver>; const TICK_TOKEN: TimerToken = 0; const TICK_TIMEOUT: Duration = Duration::from_millis(1000); @@ -68,60 +65,51 @@ bitflags! { } /// Sync status -pub trait SyncProvider: Send + Sync { +pub trait SyncProvider: Send + Sync { /// Get sync status - fn status(&self) -> ProtocolStatus; + fn status(&self) -> ProtocolStatus; /// Get peers information - fn peers(&self) -> Vec; + fn peers(&self) -> Vec>; /// Get this node id if available. fn node_id(&self) -> Option; } /// Transaction pool interface -pub trait TransactionPool: Send + Sync { +pub trait TransactionPool: Send + Sync { /// Get transactions from the pool that are ready to be propagated. - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)>; + fn transactions(&self) -> Vec<(B::Hash, B::Extrinsic)>; /// Import a transction into the pool. - fn import(&self, transaction: &[u8]) -> Option; + fn import(&self, transaction: &B::Extrinsic) -> Option; /// Notify the pool about transactions broadcast. - fn on_broadcasted(&self, propagations: HashMap>); + fn on_broadcasted(&self, propagations: HashMap>); } /// ConsensusService -pub trait ConsensusService: Send + Sync { - /// Get statement stream. - fn statements(&self) -> StatementStream; - /// Send out a statement. - fn send_statement(&self, statement: Statement); +pub trait ConsensusService: Send + Sync { /// Maintain connectivity to given addresses. fn connect_to_authorities(&self, addresses: &[String]); - /// Fetch candidate. - fn fetch_candidate(&self, hash: &Hash) -> oneshot::Receiver>; - /// Note local candidate. Accepts candidate receipt hash and candidate data. - /// Pass `None` to clear the candidate. - fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>); /// Get BFT message stream for messages corresponding to consensus on given /// parent hash. - fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream; + fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream; /// Send out a BFT message. - fn send_bft_message(&self, message: LocalizedBftMessage); + fn send_bft_message(&self, message: LocalizedBftMessage); } /// Service able to execute closure in the network context. -pub trait ExecuteInContext: Send + Sync { +pub trait ExecuteInContext: Send + Sync { /// Execute closure in network context. - fn execute_in_context(&self, closure: F); + fn execute_in_context)>(&self, closure: F); } /// devp2p Protocol handler -struct ProtocolHandler { - protocol: Protocol, +struct ProtocolHandler { + protocol: Protocol, } /// Peer connection information #[derive(Debug)] -pub struct PeerInfo { +pub struct PeerInfo { /// Public node id pub id: Option, /// Node client ID @@ -133,34 +121,34 @@ pub struct PeerInfo { /// Local endpoint address pub local_address: String, /// Dot protocol info. - pub dot_info: Option, + pub dot_info: Option>, } /// Service initialization parameters. -pub struct Params { +pub struct Params { /// Configuration. pub config: ProtocolConfig, /// Network layer configuration. pub network_config: NetworkConfiguration, /// Polkadot relay chain access point. - pub chain: Arc, + pub chain: Arc>, /// On-demand service reference. pub on_demand: Option>, /// Transaction pool. - pub transaction_pool: Arc, + pub transaction_pool: Arc>, } /// Polkadot network service. Handles network IO and manages connectivity. -pub struct Service { +pub struct Service where B::Header: HeaderT { /// Network service network: NetworkService, /// Devp2p protocol handler - handler: Arc, + handler: Arc>, } -impl Service { +impl Service where B::Header: HeaderT { /// Creates and register protocol with the network service - pub fn new(params: Params) -> Result, Error> { + pub fn new(params: Params) -> Result>, Error> { let service = NetworkService::new(params.network_config.clone(), None)?; let sync = Arc::new(Service { network: service, @@ -173,7 +161,7 @@ impl Service { } /// Called when a new block is imported by the client. - pub fn on_block_imported(&self, hash: HeaderHash, header: &Header) { + pub fn on_block_imported(&self, hash: B::Hash, header: &B::Header) { self.network.with_context(DOT_PROTOCOL_ID, |context| { self.handler.protocol.on_block_imported(&mut NetSyncIo::new(context), hash, header) }); @@ -199,32 +187,32 @@ impl Service { fn stop(&self) { self.handler.protocol.abort(); - self.network.stop().unwrap_or_else(|e| warn!("Error stopping network: {:?}", e)); + self.network.stop(); } } -impl Drop for Service { +impl Drop for Service where B::Header: HeaderT { fn drop(&mut self) { self.stop(); } } -impl ExecuteInContext for Service { - fn execute_in_context(&self, closure: F) { +impl ExecuteInContext for Service where B::Header: HeaderT { + fn execute_in_context)>(&self, closure: F) { self.network.with_context(DOT_PROTOCOL_ID, |context| { closure(&mut NetSyncIo::new(context), &self.handler.protocol) }); } } -impl SyncProvider for Service { +impl SyncProvider for Service where B::Header: HeaderT { /// Get sync status - fn status(&self) -> ProtocolStatus { + fn status(&self) -> ProtocolStatus { self.handler.protocol.status() } /// Get sync peers - fn peers(&self) -> Vec { + fn peers(&self) -> Vec> { self.network.with_context_eval(DOT_PROTOCOL_ID, |ctx| { let peer_ids = self.network.connected_peers(); @@ -252,43 +240,23 @@ impl SyncProvider for Service { } /// ConsensusService -impl ConsensusService for Service { - fn statements(&self) -> StatementStream { - self.handler.protocol.statements() - } - +impl ConsensusService for Service where B::Header: HeaderT { fn connect_to_authorities(&self, _addresses: &[String]) { //TODO: implement me } - fn fetch_candidate(&self, hash: &Hash) -> oneshot::Receiver> { - self.network.with_context_eval(DOT_PROTOCOL_ID, |context| { - self.handler.protocol.fetch_candidate(&mut NetSyncIo::new(context), hash) - }).expect("DOT Service is registered") - } - - fn send_statement(&self, statement: Statement) { - self.network.with_context(DOT_PROTOCOL_ID, |context| { - self.handler.protocol.send_statement(&mut NetSyncIo::new(context), statement); - }); - } - - fn set_local_candidate(&self, candidate: Option<(Hash, Vec)>) { - self.handler.protocol.set_local_candidate(candidate) - } - - fn bft_messages(&self, parent_hash: Hash) -> BftMessageStream { + fn bft_messages(&self, parent_hash: B::Hash) -> BftMessageStream { self.handler.protocol.bft_messages(parent_hash) } - fn send_bft_message(&self, message: LocalizedBftMessage) { + fn send_bft_message(&self, message: LocalizedBftMessage) { self.network.with_context(DOT_PROTOCOL_ID, |context| { self.handler.protocol.send_bft_message(&mut NetSyncIo::new(context), message); }); } } -impl NetworkProtocolHandler for ProtocolHandler { +impl NetworkProtocolHandler for ProtocolHandler where B::Header: HeaderT { fn initialize(&self, io: &NetworkContext, _host_info: &HostInfo) { io.register_timer(TICK_TOKEN, TICK_TIMEOUT) .expect("Error registering sync timer"); @@ -319,7 +287,7 @@ impl NetworkProtocolHandler for ProtocolHandler { } /// Trait for managing network -pub trait ManageNetwork : Send + Sync { +pub trait ManageNetwork: Send + Sync { /// Set to allow unreserved peers to connect fn accept_unreserved_peers(&self); /// Set to deny unreserved peers to connect @@ -335,7 +303,7 @@ pub trait ManageNetwork : Send + Sync { } -impl ManageNetwork for Service { +impl ManageNetwork for Service where B::Header: HeaderT { fn accept_unreserved_peers(&self) { self.network.set_non_reserved_mode(NonReservedPeerMode::Accept); } diff --git a/substrate/network/src/sync.rs b/substrate/network/src/sync.rs index 4bf6891aa2d70..ce7d6438db021 100644 --- a/substrate/network/src/sync.rs +++ b/substrate/network/src/sync.rs @@ -19,38 +19,38 @@ use io::SyncIo; use protocol::Protocol; use network::PeerId; use client::{ImportResult, BlockStatus, ClientInfo}; -use primitives::block::{HeaderHash, Number as BlockNumber, Header, Id as BlockId}; use blocks::{self, BlockCollection}; -use message::{self, Message}; +use runtime_primitives::traits::{Block as BlockT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use message::{self, generic::Message as GenericMessage}; use service::Role; -use super::header_hash; // Maximum blocks to request in a single packet. const MAX_BLOCKS_TO_REQUEST: usize = 128; -struct PeerSync { - pub common_hash: HeaderHash, - pub common_number: BlockNumber, - pub best_hash: HeaderHash, - pub best_number: BlockNumber, - pub state: PeerSyncState, +struct PeerSync { + pub common_hash: B::Hash, + pub common_number: ::Number, + pub best_hash: B::Hash, + pub best_number: ::Number, + pub state: PeerSyncState, } #[derive(Copy, Clone, Eq, PartialEq, Debug)] -enum PeerSyncState { - AncestorSearch(BlockNumber), +enum PeerSyncState { + AncestorSearch(::Number), Available, - DownloadingNew(BlockNumber), - DownloadingStale(HeaderHash), + DownloadingNew(::Number), + DownloadingStale(B::Hash), } /// Relay chain sync strategy. -pub struct ChainSync { - genesis_hash: HeaderHash, - peers: HashMap, - blocks: BlockCollection, - best_queued_number: BlockNumber, - best_queued_hash: HeaderHash, +pub struct ChainSync { + genesis_hash: B::Hash, + peers: HashMap>, + blocks: BlockCollection, + best_queued_number: u64, + best_queued_hash: B::Hash, required_block_attributes: Vec, } @@ -65,16 +65,18 @@ pub enum SyncState { /// Syncing status and statistics #[derive(Clone)] -pub struct Status { +pub struct Status { /// Current global sync state. pub state: SyncState, /// Target sync block number. - pub best_seen_block: Option, + pub best_seen_block: Option<::Number>, } -impl ChainSync { +impl ChainSync where + B::Header: HeaderT, +{ /// Create a new instance. - pub fn new(role: Role, info: &ClientInfo) -> ChainSync { + pub fn new(role: Role, info: &ClientInfo) -> Self { let mut required_block_attributes = vec![ message::BlockAttribute::Header, message::BlockAttribute::Justification @@ -93,12 +95,12 @@ impl ChainSync { } } - fn best_seen_block(&self) -> Option { + fn best_seen_block(&self) -> Option { self.peers.values().max_by_key(|p| p.best_number).map(|p| p.best_number) } /// Returns sync status - pub fn status(&self) -> Status { + pub fn status(&self) -> Status { let best_seen = self.best_seen_block(); let state = match &best_seen { &Some(n) if n > self.best_queued_number && n - self.best_queued_number > 5 => SyncState::Downloading, @@ -111,7 +113,7 @@ impl ChainSync { } /// Handle new connected peer. - pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + pub fn new_peer(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { if let Some(info) = protocol.peer_info(peer_id) { match (protocol.chain().block_status(&BlockId::Hash(info.best_hash)), info.best_number) { (Err(e), _) => { @@ -165,7 +167,7 @@ impl ChainSync { } } - pub fn on_block_data(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, _request: message::BlockRequest, response: message::BlockResponse) { + pub fn on_block_data(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, _request: message::BlockRequest, response: message::BlockResponse) { let count = response.blocks.len(); let mut imported: usize = 0; let new_blocks = if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { @@ -235,9 +237,9 @@ impl ChainSync { let block = block.block; match (block.header, block.justification) { (Some(header), Some(justification)) => { - let number = header.number; - let hash = header_hash(&header); - let parent = header.parent_hash; + let number = header.number().clone(); + let hash = header.hash(); + let parent = header.parent_hash().clone(); let is_best = best_seen.as_ref().map_or(false, |n| number >= *n); // check whether the block is known before importing. @@ -305,14 +307,14 @@ impl ChainSync { self.maintain_sync(io, protocol); } - fn maintain_sync(&mut self, io: &mut SyncIo, protocol: &Protocol) { + fn maintain_sync(&mut self, io: &mut SyncIo, protocol: &Protocol) { let peers: Vec = self.peers.keys().map(|p| *p).collect(); for peer in peers { self.download_new(io, protocol, peer); } } - fn block_imported(&mut self, hash: &HeaderHash, number: BlockNumber) { + fn block_imported(&mut self, hash: &B::Hash, number: u64) { if number > self.best_queued_number { self.best_queued_number = number; self.best_queued_hash = *hash; @@ -327,28 +329,29 @@ impl ChainSync { } } - pub fn update_chain_info(&mut self, best_header: &Header ) { - let hash = header_hash(&best_header); - self.block_imported(&hash, best_header.number) + pub fn update_chain_info(&mut self, best_header: &B::Header) { + let hash = best_header.hash(); + self.block_imported(&hash, best_header.number().clone()) } - pub fn on_block_announce(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: HeaderHash, header: &Header) { + pub fn on_block_announce(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: B::Hash, header: &B::Header) { + let number = *header.number(); if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { - if header.number > peer.best_number { - peer.best_number = header.number; + if number > peer.best_number { + peer.best_number = number; peer.best_hash = hash; } - if header.number <= self.best_queued_number && header.number > peer.common_number { - peer.common_number = header.number; + if number <= self.best_queued_number && number > peer.common_number { + peer.common_number = number } } else { return; } if !self.is_known_or_already_downloading(protocol, &hash) { - let stale = header.number <= self.best_queued_number; + let stale = number <= self.best_queued_number; if stale { - if !self.is_known_or_already_downloading(protocol, &header.parent_hash) { + if !self.is_known_or_already_downloading(protocol, header.parent_hash()) { trace!(target: "sync", "Ignoring unknown stale block announce from {}: {} {:?}", peer_id, hash, header); } else { trace!(target: "sync", "Downloading new stale block announced from {}: {} {:?}", peer_id, hash, header); @@ -363,18 +366,18 @@ impl ChainSync { } } - fn is_known_or_already_downloading(&self, protocol: &Protocol, hash: &HeaderHash) -> bool { + fn is_known_or_already_downloading(&self, protocol: &Protocol, hash: &B::Hash) -> bool { self.peers.iter().any(|(_, p)| p.state == PeerSyncState::DownloadingStale(*hash)) || protocol.chain().block_status(&BlockId::Hash(*hash)).ok().map_or(false, |s| s != BlockStatus::Unknown) } - pub fn peer_disconnected(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + pub fn peer_disconnected(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { self.blocks.clear_peer_download(peer_id); self.peers.remove(&peer_id); self.maintain_sync(io, protocol); } - pub fn restart(&mut self, io: &mut SyncIo, protocol: &Protocol) { + pub fn restart(&mut self, io: &mut SyncIo, protocol: &Protocol) { self.blocks.clear(); let ids: Vec = self.peers.keys().map(|p| *p).collect(); for id in ids { @@ -399,11 +402,11 @@ impl ChainSync { } // Download old block. - fn download_stale(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: &HeaderHash) { + fn download_stale(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, hash: &B::Hash) { if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { match peer.state { PeerSyncState::Available => { - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: self.required_block_attributes.clone(), from: message::FromBlock::Hash(*hash), @@ -412,7 +415,7 @@ impl ChainSync { max: Some(1), }; peer.state = PeerSyncState::DownloadingStale(*hash); - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); }, _ => (), } @@ -420,14 +423,14 @@ impl ChainSync { } // Issue a request for a peer to download new blocks, if any are available - fn download_new(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { + fn download_new(&mut self, io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId) { if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { trace!(target: "sync", "Considering new block download from {}, common block is {}, best is {:?}", peer_id, peer.common_number, peer.best_number); match peer.state { PeerSyncState::Available => { if let Some(range) = self.blocks.needed_blocks(peer_id, MAX_BLOCKS_TO_REQUEST, peer.best_number, peer.common_number) { trace!(target: "sync", "Requesting blocks from {}, ({} to {})", peer_id, range.start, range.end); - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: self.required_block_attributes.clone(), from: message::FromBlock::Number(range.start), @@ -436,7 +439,7 @@ impl ChainSync { max: Some((range.end - range.start) as u32), }; peer.state = PeerSyncState::DownloadingNew(range.start); - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); } else { trace!(target: "sync", "Nothing to request"); } @@ -446,9 +449,9 @@ impl ChainSync { } } - fn request_ancestry(io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, block: BlockNumber) { + fn request_ancestry(io: &mut SyncIo, protocol: &Protocol, peer_id: PeerId, block: u64) { trace!(target: "sync", "Requesting ancestry block #{} from {}", block, peer_id); - let request = message::BlockRequest { + let request = message::generic::BlockRequest { id: 0, fields: vec![message::BlockAttribute::Header, message::BlockAttribute::Justification], from: message::FromBlock::Number(block), @@ -456,6 +459,6 @@ impl ChainSync { direction: message::Direction::Ascending, max: Some(1), }; - protocol.send_message(io, peer_id, Message::BlockRequest(request)); + protocol.send_message(io, peer_id, GenericMessage::BlockRequest(request)); } } diff --git a/substrate/network/src/test/consensus.rs b/substrate/network/src/test/consensus.rs index 9cf7dad818722..56bb6510552fc 100644 --- a/substrate/network/src/test/consensus.rs +++ b/substrate/network/src/test/consensus.rs @@ -15,8 +15,9 @@ // along with Polkadot. If not, see . use super::*; -use message::*; +use message::{Message, generic}; use futures::Stream; +use test_client::runtime::Block; #[test] fn bft_messages_include_those_sent_before_asking_for_stream() { @@ -28,21 +29,22 @@ fn bft_messages_include_those_sent_before_asking_for_stream() { let peer = net.peer(0); let mut io = TestIo::new(&peer.queue, None); - let bft_message = BftMessage::Consensus(SignedConsensusMessage::Vote(SignedConsensusVote { - vote: ConsensusVote::AdvanceRound(0), + let bft_message = generic::BftMessage::Consensus(generic::SignedConsensusMessage::Vote(generic::SignedConsensusVote { + vote: generic::ConsensusVote::AdvanceRound(0), sender: [0; 32], signature: Default::default(), })); let parent_hash = peer.genesis_hash(); - let localized = LocalizedBftMessage { + let localized = ::message::LocalizedBftMessage:: { message: bft_message, parent_hash: parent_hash, }; + let message: Message = generic::Message::BftMessage(localized.clone()); - let as_bytes = ::serde_json::to_vec(&Message::BftMessage(localized.clone())).unwrap(); + let as_bytes = ::serde_json::to_vec(&message).unwrap(); peer.sync.handle_packet(&mut io, 1, &as_bytes[..]); let stream = peer.sync.bft_messages(parent_hash); diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index 3652d4f31718b..73ac9ff7294aa 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -23,17 +23,17 @@ use std::sync::Arc; use parking_lot::RwLock; use client; use client::block_builder::BlockBuilder; -use primitives::block::{Id as BlockId, ExtrinsicHash, HeaderHash}; -use primitives; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; use io::SyncIo; use protocol::Protocol; use config::ProtocolConfig; use service::TransactionPool; use network::{PeerId, SessionInfo, Error as NetworkError}; -use runtime_support::Hashable; use keyring::Keyring; use codec::Slicable; use test_client::{self, TestClient}; +use test_client::runtime::{Block, Hash, Transfer, Extrinsic}; pub struct TestIo<'p> { pub queue: &'p RwLock>, @@ -100,8 +100,8 @@ pub struct TestPacket { } pub struct Peer { - client: Arc>, - pub sync: Protocol, + client: Arc>, + pub sync: Protocol, pub queue: RwLock>, } @@ -158,12 +158,12 @@ impl Peer { fn flush(&self) { } - fn generate_blocks(&self, count: usize, mut edit_block: F) where F: FnMut(&mut BlockBuilder) { + fn generate_blocks(&self, count: usize, mut edit_block: F) where F: FnMut(&mut BlockBuilder) { for _ in 0 .. count { let mut builder = self.client.new_block().unwrap(); edit_block(&mut builder); let block = builder.bake().unwrap(); - trace!("Generating {}, (#{})", primitives::block::HeaderHash::from(block.header.blake2_256()), block.header.number); + trace!("Generating {}, (#{})", block.hash(), block.header.number); self.client.justify_and_import(client::BlockOrigin::File, block).unwrap(); } } @@ -172,15 +172,14 @@ impl Peer { let mut nonce = 0; if with_tx { self.generate_blocks(count, |builder| { - let tx = test_client::runtime::Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Alice.to_raw_public(), + let transfer = Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Alice.to_raw_public().into(), amount: 1, - nonce: nonce, + nonce, }; - let signature = Keyring::from_raw_public(tx.from.clone()).unwrap().sign(&tx.encode()); - let tx = primitives::block::Extrinsic::decode(&mut test_client::runtime::UncheckedTransaction { signature, tx: tx }.encode().as_ref()).unwrap(); - builder.push(tx).unwrap(); + let signature = Keyring::from_raw_public(transfer.from.0).unwrap().sign(&transfer.encode()).into(); + builder.push(Extrinsic { transfer, signature }).unwrap(); nonce = nonce + 1; }); } else { @@ -188,7 +187,7 @@ impl Peer { } } - pub fn genesis_hash(&self) -> HeaderHash { + pub fn genesis_hash(&self) -> Hash { let info = self.client.info().expect("In-mem client does not fail"); info.chain.genesis_hash } @@ -196,16 +195,16 @@ impl Peer { struct EmptyTransactionPool; -impl TransactionPool for EmptyTransactionPool { - fn transactions(&self) -> Vec<(ExtrinsicHash, Vec)> { +impl TransactionPool for EmptyTransactionPool { + fn transactions(&self) -> Vec<(Hash, Extrinsic)> { Vec::new() } - fn import(&self, _transaction: &[u8]) -> Option { + fn import(&self, _transaction: &Extrinsic) -> Option { None } - fn on_broadcasted(&self, _: HashMap>) {} + fn on_broadcasted(&self, _: HashMap>) {} } pub struct TestNet { diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs deleted file mode 100644 index 0a60e0dff798c..0000000000000 --- a/substrate/primitives/src/block.rs +++ /dev/null @@ -1,276 +0,0 @@ -// 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 . - -//! Block and header type definitions. - -use rstd::fmt; -use rstd::vec::Vec; -#[cfg(feature = "std")] -use bytes; -use Hash; -use codec::{Input, Slicable}; - -/// Used to refer to a block number. -pub type Number = u64; - -/// Hash used to refer to a block hash. -pub type HeaderHash = Hash; - -/// Hash used to refer to an extrinsic. -pub type ExtrinsicHash = Hash; - -/// Simple generic extrinsic type. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Extrinsic(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Extrinsic { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Extrinsic) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// Execution log (event) -#[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// The digest of a block, useful for light-clients. -#[derive(Clone, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Digest { - /// All logs that have happened in the block. - pub logs: Vec, -} - -impl Slicable for Digest { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(|logs| Digest { logs }) - } - - fn using_encoded R>(&self, f: F) -> R { - self.logs.using_encoded(f) - } -} - -/// Generic types to be specialised later. -pub mod generic { - use super::{Header, Slicable, Input, Vec}; - - /// A Block - this is generic for later specialisation in particular runtimes. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - pub struct Block { - /// The block header. - pub header: Header, - /// All relay-chain transactions. - pub transactions: Vec, - } - - impl Slicable for Block where Vec: Slicable { - fn decode(input: &mut I) -> Option { - Some(Block { - header: Slicable::decode(input)?, - transactions: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v: Vec = Vec::new(); - v.extend(self.header.encode()); - v.extend(self.transactions.encode()); - v - } - } -} - -/// The body of a block is just a bunch of extrinsics. -pub type Body = Vec; -/// The header and body of a concrete, but unspecialised, block. Used by substrate to represent a -/// block some fields of which the runtime alone knows how to interpret (e.g. the transactions). -pub type Block = generic::Block; - -/// A substrate chain block header. -// TODO: split out into light-client-specific fields and runtime-specific fields. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header { - /// Block parent's hash. - pub parent_hash: HeaderHash, - /// Block number. - pub number: Number, - /// State root after this transition. - pub state_root: Hash, - /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub extrinsics_root: Hash, - // TODO... -// /// The root of the trie that represents the receipts from this block's transactions -// pub receipts_root: Hash, - /// The digest of activity on the block. - pub digest: Digest, -} - -impl Header { - /// Create a new instance with default fields except `number`, which is given as an argument. - pub fn from_block_number(number: Number) -> Self { - Header { - parent_hash: Default::default(), - number, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - } - } -} - -impl Slicable for Header { - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: Slicable::decode(input)?, - number: Slicable::decode(input)?, - state_root: Slicable::decode(input)?, - extrinsics_root: Slicable::decode(input)?, - digest: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parent_hash.using_encoded(|s| v.extend(s)); - self.number.using_encoded(|s| v.extend(s)); - self.state_root.using_encoded(|s| v.extend(s)); - self.extrinsics_root.using_encoded(|s| v.extend(s)); - self.digest.using_encoded(|s| v.extend(s)); - - v - } -} - -/// Block indentification. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Id { - /// Identify by block header hash. - Hash(HeaderHash), - /// Identify by block number. - Number(Number), -} - -impl fmt::Display for Id { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - match *self { - Id::Hash(h) => h.fmt(f), - Id::Number(n) => n.fmt(f), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use codec::Slicable; - use substrate_serializer as ser; - - #[test] - fn test_header_encoding() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1]), Log(vec![2])] }, - }; - - assert_eq!(header.encode(), vec![ - // parent_hash - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - // number - 67, 0, 0, 0, 0, 0, 0, 0, - // state_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - // extrinsics_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - // digest (length, log1, log2) - 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 2 - ]); - } - - #[test] - fn test_header_serialization() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1])] }, - }; - - assert_eq!(ser::to_string_pretty(&header), r#"{ - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", - "number": 67, - "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", - "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", - "digest": { - "logs": [ - "0x01" - ] - } -}"#); - - let v = header.encode(); - assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); - } - - #[test] - fn test_block_encoding() { - let block = Block { - header: Header::from_block_number(12), - transactions: vec![Extrinsic(vec!(4))], - }; - - assert_eq!(block.encode(), vec![ - // parent_hash - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // number - 12, 0, 0, 0, 0, 0, 0, 0, - // state_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // extrinsics_root - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - // digest - 0, 0, 0, 0, - // transactions (length, tx...) - 1, 0, 0, 0, 1, 0, 0, 0, 4 - ]); - } -} diff --git a/substrate/primitives/src/hash.rs b/substrate/primitives/src/hash.rs index 5503aa4198e13..8556f649bba67 100644 --- a/substrate/primitives/src/hash.rs +++ b/substrate/primitives/src/hash.rs @@ -66,7 +66,7 @@ mod tests { #[test] fn test_h160() { let tests = vec![ - (H160::from(0), "0x0000000000000000000000000000000000000000"), + (Default::default(), "0x0000000000000000000000000000000000000000"), (H160::from(2), "0x0000000000000000000000000000000000000002"), (H160::from(15), "0x000000000000000000000000000000000000000f"), (H160::from(16), "0x0000000000000000000000000000000000000010"), @@ -84,7 +84,7 @@ mod tests { #[test] fn test_h256() { let tests = vec![ - (H256::from(0), "0x0000000000000000000000000000000000000000000000000000000000000000"), + (Default::default(), "0x0000000000000000000000000000000000000000000000000000000000000000"), (H256::from(2), "0x0000000000000000000000000000000000000000000000000000000000000002"), (H256::from(15), "0x000000000000000000000000000000000000000000000000000000000000000f"), (H256::from(16), "0x0000000000000000000000000000000000000000000000000000000000000010"), diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index 5f6d14f3d16c6..68306b01e80c0 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -54,17 +54,6 @@ extern crate substrate_serializer; #[macro_use] extern crate pretty_assertions; -// TODO: factor out to separate crate. -#[macro_export] -macro_rules! try_opt { - ($e: expr) => { - match $e { - Some(x) => x, - None => return None, - } - } -} - #[macro_export] macro_rules! map { ($( $name:expr => $value:expr ),*) => ( @@ -82,8 +71,6 @@ pub use hashing::{blake2_256, twox_128, twox_256}; #[cfg(feature = "std")] pub mod hexdisplay; -pub mod bft; -pub mod block; pub mod hash; pub mod sandbox; pub mod storage; @@ -92,12 +79,8 @@ pub mod uint; #[cfg(test)] mod tests; -pub use self::hash::{H160, H256}; +pub use self::hash::{H160, H256, H512}; pub use self::uint::{U256, U512}; -pub use block::{Block, Header, Digest}; - -/// General hash type. -pub type Hash = H256; /// An identifier for an authority in the consensus algorithm. The same as ed25519::Public. pub type AuthorityId = [u8; 32]; diff --git a/substrate/rpc-servers/Cargo.toml b/substrate/rpc-servers/Cargo.toml index 54ab77601116a..dec067b409fb4 100644 --- a/substrate/rpc-servers/Cargo.toml +++ b/substrate/rpc-servers/Cargo.toml @@ -10,3 +10,4 @@ jsonrpc-pubsub = { git = "https://github.com/paritytech/jsonrpc.git" } jsonrpc-ws-server = { git = "https://github.com/paritytech/jsonrpc.git" } log = "0.3" substrate-rpc = { path = "../rpc", version = "0.1" } +substrate-runtime-primitives = { path = "../runtime/primitives" } diff --git a/substrate/rpc-servers/src/lib.rs b/substrate/rpc-servers/src/lib.rs index 05e4cd70fd9ba..ec3d2d6fdd98a 100644 --- a/substrate/rpc-servers/src/lib.rs +++ b/substrate/rpc-servers/src/lib.rs @@ -24,25 +24,28 @@ extern crate jsonrpc_core as rpc; extern crate jsonrpc_http_server as http; extern crate jsonrpc_pubsub as pubsub; extern crate jsonrpc_ws_server as ws; +extern crate substrate_runtime_primitives; #[macro_use] extern crate log; use std::io; +use substrate_runtime_primitives::traits::Block as BlockT; type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; /// Construct rpc `IoHandler` -pub fn rpc_handler( +pub fn rpc_handler( state: S, chain: C, author: A, system: Y, ) -> RpcHandler where - S: apis::state::StateApi, - C: apis::chain::ChainApi, - A: apis::author::AuthorApi, + Block: 'static, + S: apis::state::StateApi, + C: apis::chain::ChainApi, + A: apis::author::AuthorApi, Y: apis::system::SystemApi, { let mut io = pubsub::PubSubHandler::default(); diff --git a/substrate/rpc/Cargo.toml b/substrate/rpc/Cargo.toml index a11c5d5050c30..45bddecdfdf5d 100644 --- a/substrate/rpc/Cargo.toml +++ b/substrate/rpc/Cargo.toml @@ -14,6 +14,7 @@ substrate-client = { path = "../client" } substrate-executor = { path = "../executor" } substrate-extrinsic-pool = { path = "../extrinsic-pool" } substrate-primitives = { path = "../primitives" } +substrate-runtime-primitives = { path = "../runtime/primitives" } substrate-state-machine = { path = "../state-machine" } tokio-core = "0.1.12" diff --git a/substrate/rpc/src/author/mod.rs b/substrate/rpc/src/author/mod.rs index 83062d5c08077..4ed850db55837 100644 --- a/substrate/rpc/src/author/mod.rs +++ b/substrate/rpc/src/author/mod.rs @@ -17,7 +17,6 @@ //! Substrate block-author/full-node API. use std::sync::Arc; -use primitives::block::{Extrinsic, ExtrinsicHash}; use extrinsic_pool::api::{Error, ExtrinsicPool}; pub mod error; @@ -29,17 +28,18 @@ use self::error::Result; build_rpc_trait! { /// Substrate authoring RPC API - pub trait AuthorApi { + pub trait AuthorApi { /// Submit extrinsic for inclusion in block. #[rpc(name = "author_submitExtrinsic")] - fn submit_extrinsic(&self, Extrinsic) -> Result; + fn submit_extrinsic(&self, Extrinsic) -> Result; } } -impl AuthorApi for Arc where - T: ExtrinsicPool, +impl AuthorApi for Arc where + T: ExtrinsicPool, + T::Error: 'static, { - fn submit_extrinsic(&self, xt: Extrinsic) -> Result { + fn submit_extrinsic(&self, xt: Ex) -> Result { self .submit(vec![xt]) .map(|mut res| res.pop().expect("One extrinsic passed; one result back; qed")) diff --git a/substrate/rpc/src/author/tests.rs b/substrate/rpc/src/author/tests.rs index 10648cc1af9b1..8e9963613d66e 100644 --- a/substrate/rpc/src/author/tests.rs +++ b/substrate/rpc/src/author/tests.rs @@ -19,11 +19,13 @@ use super::*; use std::{fmt, sync::Arc}; use extrinsic_pool::api; use parking_lot::Mutex; -use primitives::block; + +type Extrinsic = u64; +type Hash = u64; #[derive(Default)] struct DummyTxPool { - submitted: Mutex>, + submitted: Mutex>, } #[derive(Debug)] @@ -38,14 +40,14 @@ impl fmt::Display for Error { } } -impl api::ExtrinsicPool for DummyTxPool { +impl api::ExtrinsicPool for DummyTxPool { type Error = Error; /// Submit extrinsic for inclusion in block. - fn submit(&self, xt: Vec) -> ::std::result::Result, Self::Error> { + fn submit(&self, xt: Vec) -> ::std::result::Result, Self::Error> { let mut submitted = self.submitted.lock(); if submitted.len() < 1 { - let hashes = xt.iter().map(|_xt| 1.into()).collect(); + let hashes = xt.iter().map(|_xt| 1).collect(); submitted.extend(xt); Ok(hashes) } else { @@ -57,13 +59,12 @@ impl api::ExtrinsicPool for DummyTxPool { #[test] fn submit_transaction_should_not_cause_error() { let p = Arc::new(DummyTxPool::default()); - let hash: ExtrinsicHash = 1.into(); assert_matches!( - AuthorApi::submit_extrinsic(&p, block::Extrinsic(vec![])), - Ok(hash) + AuthorApi::submit_extrinsic(&p, 5), + Ok(1) ); assert!( - AuthorApi::submit_extrinsic(&p, block::Extrinsic(vec![])).is_err() + AuthorApi::submit_extrinsic(&p, 5).is_err() ); } diff --git a/substrate/rpc/src/chain/mod.rs b/substrate/rpc/src/chain/mod.rs index f6e767ef66270..04bd4896b555a 100644 --- a/substrate/rpc/src/chain/mod.rs +++ b/substrate/rpc/src/chain/mod.rs @@ -18,7 +18,8 @@ use std::sync::Arc; -use primitives::block; +use runtime_primitives::traits::Block as BlockT; +use runtime_primitives::generic::BlockId; use client::{self, Client, BlockchainEvents}; use state_machine; @@ -38,23 +39,23 @@ use self::error::{Result, ResultExt}; build_rpc_trait! { /// Polkadot blockchain API - pub trait ChainApi { + pub trait ChainApi { type Metadata; /// Get header of a relay chain block. #[rpc(name = "chain_getHeader")] - fn header(&self, block::HeaderHash) -> Result>; + fn header(&self, Hash) -> Result>; /// Get hash of the head. #[rpc(name = "chain_getHead")] - fn head(&self) -> Result; + fn head(&self) -> Result; #[pubsub(name = "chain_newHead")] { - /// Hello subscription + /// New head subscription #[rpc(name = "subscribe_newHead")] - fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber); + fn subscribe_new_head(&self, Self::Metadata, pubsub::Subscriber
    ); - /// Unsubscribe from hello subscription. + /// Unsubscribe from new head subscription. #[rpc(name = "unsubscribe_newHead")] fn unsubscribe_new_head(&self, SubscriptionId) -> RpcResult; } @@ -62,16 +63,16 @@ build_rpc_trait! { } /// Chain API with subscriptions support. -pub struct Chain { +pub struct Chain { /// Substrate client. - client: Arc>, + client: Arc>, /// Current subscriptions. subscriptions: Subscriptions, } -impl Chain { +impl Chain { /// Create new Chain API RPC handler. - pub fn new(client: Arc>, remote: Remote) -> Self { + pub fn new(client: Arc>, remote: Remote) -> Self { Chain { client, subscriptions: Subscriptions::new(remote), @@ -79,22 +80,23 @@ impl Chain { } } -impl ChainApi for Chain where - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, +impl ChainApi for Chain where + Block: BlockT + 'static, + B: client::backend::Backend + Send + Sync + 'static, + E: client::CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { type Metadata = ::metadata::Metadata; - fn header(&self, hash: block::HeaderHash) -> Result> { - self.client.header(&block::Id::Hash(hash)).chain_err(|| "Blockchain error") + fn header(&self, hash: Block::Hash) -> Result> { + self.client.header(&BlockId::Hash(hash)).chain_err(|| "Blockchain error") } - fn head(&self) -> Result { + fn head(&self) -> Result { Ok(self.client.info().chain_err(|| "Blockchain error")?.chain.best_hash) } - fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: pubsub::Subscriber) { + fn subscribe_new_head(&self, _metadata: Self::Metadata, subscriber: pubsub::Subscriber) { self.subscriptions.add(subscriber, |sink| { let stream = self.client.import_notification_stream() .filter(|notification| notification.is_new_best) diff --git a/substrate/rpc/src/chain/tests.rs b/substrate/rpc/src/chain/tests.rs index 0bfb29fd5d5c5..506c096d6141f 100644 --- a/substrate/rpc/src/chain/tests.rs +++ b/substrate/rpc/src/chain/tests.rs @@ -18,6 +18,7 @@ use super::*; use jsonrpc_macros::pubsub; use client::BlockOrigin; use test_client::{self, TestClient}; +use test_client::runtime::Header; #[test] fn should_return_header() { @@ -30,10 +31,10 @@ fn should_return_header() { }; assert_matches!( client.header(client.client.genesis_hash()), - Ok(Some(ref x)) if x == &block::Header { + Ok(Some(ref x)) if x == &Header { parent_hash: 0.into(), number: 0, - state_root: "0c81ab6cfac8c8d7201d78cb699b6b79d714462a4ba00abcacce22444babe315".into(), + state_root: "9c70014029b05f780858f654bfcf297ca708b3663d32bc81486193e84a2f2f3d".into(), extrinsics_root: "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421".into(), digest: Default::default(), } @@ -69,7 +70,7 @@ fn should_notify_about_latest_block() { // assert notification send to transport let (notification, next) = core.run(transport.into_future()).unwrap(); assert_eq!(notification, Some( - r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x72ae67388233893fb4594f13df56d4e654aa8721763bcd0bd4e187fee7b2f349","stateRoot":"0x2e1f2f1c53ffb1767fe1abf4fe5953cc87c7650d4af2d4393d1f72324f2cc5d7"},"subscription":0}}"#.to_owned() + r#"{"jsonrpc":"2.0","method":"test","params":{"result":{"digest":{"logs":[]},"extrinsicsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","number":1,"parentHash":"0x45a44c50cae6ffcc413b65d6b4444a572fa4be2e5d1cd026cc113f9d8f9bc368","stateRoot":"0x987aa0851a133413b42c6d9aa3c91b1dddc2ad5337508ee8815116b11e44c64d"},"subscription":0}}"#.to_owned() )); // no more notifications on this channel assert_eq!(core.run(next.into_future()).unwrap().0, None); diff --git a/substrate/rpc/src/lib.rs b/substrate/rpc/src/lib.rs index ec94c39c44c98..8cd043652ae57 100644 --- a/substrate/rpc/src/lib.rs +++ b/substrate/rpc/src/lib.rs @@ -24,6 +24,7 @@ extern crate parking_lot; extern crate substrate_client as client; extern crate substrate_extrinsic_pool as extrinsic_pool; extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_state_machine as state_machine; extern crate tokio_core; diff --git a/substrate/rpc/src/state/mod.rs b/substrate/rpc/src/state/mod.rs index 9fa41d38a14bb..4c68beb507d9f 100644 --- a/substrate/rpc/src/state/mod.rs +++ b/substrate/rpc/src/state/mod.rs @@ -23,7 +23,9 @@ mod tests; use std::sync::Arc; use client::{self, Client, CallExecutor}; -use primitives::{block, Hash, blake2_256}; + +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block as BlockT; use primitives::storage::{StorageKey, StorageData}; use primitives::hexdisplay::HexDisplay; use state_machine; @@ -32,65 +34,67 @@ use self::error::Result; build_rpc_trait! { /// Polkadot state API - pub trait StateApi { - /// Returns a storage entry. + pub trait StateApi { + /// Returns a storage entry at a specific block's state. #[rpc(name = "state_getStorageAt")] - fn storage_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_at(&self, StorageKey, Hash) -> Result; - /// Call a contract. + /// Call a contract at a block's state. #[rpc(name = "state_callAt")] - fn call_at(&self, String, Vec, block::HeaderHash) -> Result>; + fn call_at(&self, String, Vec, Hash) -> Result>; - /// Returns the hash of a storage entry. + /// Returns the hash of a storage entry at a block's state. #[rpc(name = "state_getStorageHashAt")] - fn storage_hash_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_hash_at(&self, StorageKey, Hash) -> Result; - /// Returns the size of a storage entry. + /// Returns the size of a storage entry at a block's state. #[rpc(name = "state_getStorageSizeAt")] - fn storage_size_at(&self, StorageKey, block::HeaderHash) -> Result; + fn storage_size_at(&self, StorageKey, Hash) -> Result; - /// Returns the hash of a storage entry. + /// Returns the hash of a storage entry at the best block. #[rpc(name = "state_getStorageHash")] fn storage_hash(&self, StorageKey) -> Result; - /// Returns the size of a storage entry. + /// Returns the size of a storage entry at the best block. #[rpc(name = "state_getStorageSize")] fn storage_size(&self, StorageKey) -> Result; - /// Returns a storage entry. + /// Returns a storage entry at the best block. #[rpc(name = "state_getStorage")] fn storage(&self, StorageKey) -> Result; - /// Call a contract. + /// Call a contract at the best block. #[rpc(name = "state_call")] fn call(&self, String, Vec) -> Result>; } } -impl StateApi for Arc> where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, - client::error::Error: From<<::State as state_machine::backend::Backend>::Error>, +impl StateApi for Arc> where + Block: BlockT + 'static, + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static, + client::error::Error: From<<>::State as state_machine::backend::Backend>::Error>, { - fn storage_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { + fn storage_at(&self, key: StorageKey, block: Block::Hash) -> Result { trace!(target: "rpc", "Querying storage at {:?} for key {}", block, HexDisplay::from(&key.0)); - Ok(self.as_ref().storage(&block::Id::Hash(block), &key)?) + Ok(self.as_ref().storage(&BlockId::Hash(block), &key)?) } - fn call_at(&self, method: String, data: Vec, block: block::HeaderHash) -> Result> { + fn call_at(&self, method: String, data: Vec, block: Block::Hash) -> Result> { trace!(target: "rpc", "Calling runtime at {:?} for method {} ({})", block, method, HexDisplay::from(&data)); - Ok(self.as_ref().executor().call(&block::Id::Hash(block), &method, &data)?.return_data) + Ok(self.as_ref().executor().call(&BlockId::Hash(block), &method, &data)?.return_data) } - fn storage_hash_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { - self.storage_at(key, block).map(|x| blake2_256(&x.0).into()) + fn storage_hash_at(&self, key: StorageKey, block: Block::Hash) -> Result { + use runtime_primitives::traits::{Hashing, Header as HeaderT}; + self.storage_at(key, block).map(|x| ::Hashing::hash(&x.0)) } - fn storage_size_at(&self, key: StorageKey, block: block::HeaderHash) -> Result { + fn storage_size_at(&self, key: StorageKey, block: Block::Hash) -> Result { self.storage_at(key, block).map(|x| x.0.len() as u64) } - fn storage_hash(&self, key: StorageKey) -> Result { + fn storage_hash(&self, key: StorageKey) -> Result { self.storage_hash_at(key, self.as_ref().info()?.chain.best_hash) } diff --git a/substrate/runtime-io/Cargo.toml b/substrate/runtime-io/Cargo.toml index ef82206aad981..b46f9909c2018 100644 --- a/substrate/runtime-io/Cargo.toml +++ b/substrate/runtime-io/Cargo.toml @@ -13,7 +13,7 @@ environmental = { path = "../environmental", optional = true } substrate-state-machine = { path = "../state-machine", optional = true } substrate-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../codec", default_features = false } -triehash = { version = "0.1", optional = true } +triehash = { version = "0.1.2", optional = true } ed25519 = { path = "../ed25519", optional = true } [features] diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index 62fce6998ac43..6526568920792 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -30,37 +30,3 @@ include!("../with_std.rs"); #[cfg(not(feature = "std"))] include!("../without_std.rs"); - -/// Abstraction around hashing -pub trait Hashing { - /// The hash type produced. - type Output; - - /// Produce the hash of some byte-slice. - fn hash(s: &[u8]) -> Self::Output; - /// Produce the hash of some codec-encodable value. - fn hash_of(s: &S) -> Self::Output { - codec::Slicable::using_encoded(s, Self::hash) - } - /// Produce the patricia-trie root of a mapping from indices to byte slices. - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; - - /// Acquire the global storage root. - fn storage_root() -> Self::Output; -} - -/// Blake2-256 Hashing implementation. -pub struct BlakeTwo256; - -impl Hashing for BlakeTwo256 { - type Output = primitives::H256; - fn hash(s: &[u8]) -> Self::Output { - blake2_256(s).into() - } - fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { - enumerated_trie_root(items).into() - } - fn storage_root() -> Self::Output { - storage_root().into() - } -} diff --git a/substrate/runtime-io/with_std.rs b/substrate/runtime-io/with_std.rs index 5fda5181b06ac..69a7a3665949f 100644 --- a/substrate/runtime-io/with_std.rs +++ b/substrate/runtime-io/with_std.rs @@ -82,11 +82,28 @@ pub fn storage_root() -> [u8; 32] { ).unwrap_or([0u8; 32]) } -/// "Commit" all existing operations and get the resultant storage root. +/// A trie root formed from the enumerated items. pub fn enumerated_trie_root(serialised_values: &[&[u8]]) -> [u8; 32] { triehash::ordered_trie_root(serialised_values.iter().map(|s| s.to_vec())).0 } +/// A trie root formed from the iterated items. +pub fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, +>(input: I) -> [u8; 32] { + triehash::trie_root(input).0 +} + +/// A trie root formed from the enumerated items. +pub fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> +>(input: I) -> [u8; 32] { + triehash::ordered_trie_root(input).0 +} + /// Verify a ed25519 signature. pub fn ed25519_verify>(sig: &[u8; 64], msg: &[u8], pubkey: P) -> bool { ed25519::verify(sig, msg, pubkey) diff --git a/substrate/runtime-io/without_std.rs b/substrate/runtime-io/without_std.rs index cd11d611cd8ee..ffe98bb5be057 100644 --- a/substrate/runtime-io/without_std.rs +++ b/substrate/runtime-io/without_std.rs @@ -138,6 +138,27 @@ pub fn enumerated_trie_root(values: &[&[u8]]) -> [u8; 32] { result } +/// A trie root formed from the iterated items. +pub fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]>, +>(_input: I) -> [u8; 32] { + unimplemented!() + // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing + // implemneted natively and compile the trie logic as wasm). +} + +/// A trie root formed from the enumerated items. +pub fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> +>(_input: I) -> [u8; 32] { + unimplemented!() + // TODO Maybe implement (though probably easier/cleaner to have blake2 be the only thing + // implemneted natively and compile the trie logic as wasm). +} + /// The current relay chain identifier. pub fn chain_id() -> u64 { unsafe { diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index e22e700f2b44c..0e809e67d8896 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -20,6 +20,7 @@ pub use std::cell; pub use std::clone; pub use std::cmp; pub use std::fmt; +pub use std::hash; pub use std::iter; pub use std::marker; pub use std::mem; diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index 6b45bcba6f1d8..69553db1dd8c3 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -29,6 +29,7 @@ pub use core::cell; pub use core::clone; pub use core::cmp; pub use core::fmt; +pub use core::hash; pub use core::intrinsics; pub use core::iter; pub use core::marker; diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 683d408837898..0425b6f46a368 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -20,7 +20,6 @@ pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; #[cfg(feature = "std")] pub use std::fmt; pub use rstd::result; -pub use rstd::marker::PhantomData; #[cfg(feature = "std")] use serde; pub use codec::{Slicable, Input}; @@ -47,6 +46,10 @@ pub trait AuxCallable { type Call: AuxDispatchable + Slicable + Clone + PartialEq + Eq; } +// dirty hack to work around serde_derive issue +// https://github.com/rust-lang/rust/issues/51331 +pub type AuxCallableCallFor = ::Call; + #[cfg(feature = "std")] pub trait Callable { type Call: Dispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; @@ -56,6 +59,10 @@ pub trait Callable { type Call: Dispatchable + Slicable + Clone + PartialEq + Eq; } +// dirty hack to work around serde_derive issue. +// https://github.com/rust-lang/rust/issues/51331 +pub type CallableCallFor = ::Call; + #[cfg(feature = "std")] pub trait Parameter: Slicable + serde::Serialize + Clone + Eq + fmt::Debug {} @@ -68,26 +75,43 @@ pub trait Parameter: Slicable + Clone + Eq {} #[cfg(not(feature = "std"))] impl Parameter for T where T: Slicable + Clone + Eq {} - /// Declare a struct for this module, then implement dispatch logic to create a pairing of several /// dispatch traits and enums. #[macro_export] macro_rules! decl_module { ( + $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { - pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); + // TODO: switching based on std feature is because of an issue in + // serde-derive for when we attempt to derive `Deserialize` on these types, + // in a situation where we've imported `substrate_runtime_support` as another name. + #[cfg(feature = "std")] + $(#[$attr])* + pub struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + + #[cfg(not(feature = "std"))] + $(#[$attr])* + pub struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); + decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; $($rest)* } }; ( + $(#[$attr:meta])* struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { - struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); + #[cfg(feature = "std")] + $(#[$attr])* + struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + + #[cfg(not(feature = "std"))] + $(#[$attr])* + struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); decl_dispatch! { impl for $mod_type<$trait_instance: $trait_name>; $($rest)* @@ -101,6 +125,7 @@ macro_rules! decl_dispatch { // WITHOUT AUX ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $(#[$attr:meta])* pub enum $call_type:ident { $( fn $fn_name:ident( @@ -115,6 +140,7 @@ macro_rules! decl_dispatch { ) => { __decl_dispatch_module_without_aux! { impl for $mod_type<$trait_instance: $trait_name>; + $(#[$attr])* pub enum $call_type; $( fn $fn_name( $( $param_name: $param ),* ) -> $result = $id; @@ -128,6 +154,7 @@ macro_rules! decl_dispatch { // WITH AUX ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $(#[$attr:meta])* pub enum $call_type:ident where aux: $aux_type:ty { $( fn $fn_name:ident(aux @@ -142,6 +169,7 @@ macro_rules! decl_dispatch { ) => { __decl_dispatch_module_with_aux! { impl for $mod_type<$trait_instance: $trait_name>; + $(#[$attr])* pub enum $call_type where aux: $aux_type; $( fn $fn_name(aux $(, $param_name: $param )*) -> $result = $id; @@ -172,6 +200,7 @@ macro_rules! decl_dispatch { macro_rules! __decl_dispatch_module_without_aux { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $(#[$attr:meta])* pub enum $call_type:ident; $( fn $fn_name:ident( @@ -185,6 +214,7 @@ macro_rules! __decl_dispatch_module_without_aux { ) => { __decl_dispatch_module_common! { impl for $mod_type<$trait_instance: $trait_name>; + $(#[$attr])* pub enum $call_type; $( fn $fn_name( $( $param_name : $param ),* ) -> $result = $id ; )* } @@ -215,6 +245,7 @@ macro_rules! __decl_dispatch_module_without_aux { macro_rules! __decl_dispatch_module_with_aux { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $(#[$attr:meta])* pub enum $call_type:ident where aux: $aux_type:ty; $( fn $fn_name:ident(aux @@ -228,6 +259,7 @@ macro_rules! __decl_dispatch_module_with_aux { ) => { __decl_dispatch_module_common! { impl for $mod_type<$trait_instance: $trait_name>; + $(#[$attr])* pub enum $call_type; $( fn $fn_name( $( $param_name : $param ),* ) -> $result = $id ; )* } @@ -254,11 +286,12 @@ macro_rules! __decl_dispatch_module_with_aux { }; } -#[macro_export] /// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. +#[macro_export] macro_rules! __decl_dispatch_module_common { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $(#[$attr:meta])* pub enum $call_type:ident; $( fn $fn_name:ident( @@ -270,10 +303,20 @@ macro_rules! __decl_dispatch_module_common { = $id:expr ; )* ) => { - #[cfg_attr(feature = "std", derive(Serialize))] - #[allow(missing_docs)] + #[cfg(feature = "std")] + $(#[$attr])* + pub enum $call_type<$trait_instance: $trait_name> { + __PhantomItem(::std::marker::PhantomData<$trait_instance>), + $( + #[allow(non_camel_case_types)] + $fn_name ( $( $param ),* ), + )* + } + + #[cfg(not(feature = "std"))] + $(#[$attr])* pub enum $call_type<$trait_instance: $trait_name> { - __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), + __PhantomItem(::core::marker::PhantomData<$trait_instance>), $( #[allow(non_camel_case_types)] $fn_name ( $( $param ),* ), @@ -395,6 +438,7 @@ pub trait IsAuxSubType { macro_rules! impl_outer_dispatch { () => (); ( + $(#[$attr:meta])* pub enum $call_type:ident where aux: $aux:ty { $( $camelcase:ident = $id:expr, @@ -402,12 +446,10 @@ macro_rules! impl_outer_dispatch { } $( $rest:tt )* ) => { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] - #[allow(missing_docs)] + $(#[$attr])* pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::AuxCallable>::Call ) + $camelcase ( $crate::dispatch::AuxCallableCallFor<$camelcase> ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } @@ -436,6 +478,7 @@ macro_rules! impl_outer_dispatch { impl_outer_dispatch!{ $($rest)* } }; ( + $(#[$attr:meta])* pub enum $call_type:ident { $( $camelcase:ident = $id:expr, @@ -443,12 +486,10 @@ macro_rules! impl_outer_dispatch { } $( $rest:tt )* ) => { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] - #[allow(missing_docs)] + $(#[$attr])* pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::Callable>::Call ) + $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 5de6deb9e12cb..8577a31bf7ae5 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -21,14 +21,6 @@ #[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] -#[allow(unused_imports)] // can be removed when fixed: https://github.com/rust-lang/rust/issues/43497 -#[macro_use] -extern crate serde_derive; - -#[cfg(feature = "std")] -pub use serde_derive::*; - extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml index f5cf7459d626b..c9af11fc19683 100644 --- a/substrate/runtime/consensus/Cargo.toml +++ b/substrate/runtime/consensus/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } @@ -18,6 +19,7 @@ substrate-runtime-system = { path = "../system", default_features = false } default = ["std"] std = [ "serde/std", + "serde_derive", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 776238db7b804..6a8fa64a6b804 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -25,6 +25,13 @@ extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + extern crate substrate_runtime_io as runtime_io; extern crate substrate_runtime_primitives as primitives; extern crate substrate_codec as codec; @@ -36,8 +43,7 @@ use runtime_support::{storage, Parameter}; use runtime_support::dispatch::Result; use runtime_support::storage::unhashed::StorageVec; use primitives::traits::RefInto; -use substrate_primitives::bft::MisbehaviorReport; - +use primitives::bft::MisbehaviorReport; pub const AUTHORITY_AT: &'static [u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static [u8] = b":auth:len"; @@ -59,9 +65,13 @@ pub trait Trait: system::Trait { decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { - fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; + fn report_misbehavior(aux, report: MisbehaviorReport) -> Result = 0; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_code(new: Vec) -> Result = 0; fn set_storage(items: Vec) -> Result = 1; @@ -89,7 +99,7 @@ impl Module { } /// Report some misbehaviour. - fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) -> Result { + fn report_misbehavior(_aux: &T::PublicAux, _report: MisbehaviorReport) -> Result { // TODO. Ok(()) } diff --git a/substrate/runtime/council/Cargo.toml b/substrate/runtime/council/Cargo.toml index f44136ec473ee..42270c35fca3a 100644 --- a/substrate/runtime/council/Cargo.toml +++ b/substrate/runtime/council/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] hex-literal = "0.1.0" integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } @@ -25,6 +26,7 @@ substrate-runtime-system = { path = "../system", default_features = false } default = ["std"] std = [ "serde/std", + "serde_derive", "safe-mix/std", "substrate-keyring", "substrate-codec/std", diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 024ee93b81de3..9a0dcf38d9b92 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -18,7 +18,12 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; extern crate integer_sqrt; extern crate substrate_codec as codec; @@ -26,7 +31,7 @@ extern crate substrate_primitives; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; #[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[macro_use] extern crate substrate_runtime_support; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_democracy as democracy; @@ -36,8 +41,8 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use primitives::traits::{Zero, One, RefInto, As}; -use runtime_support::{StorageValue, StorageMap}; -use runtime_support::dispatch::Result; +use substrate_runtime_support::{StorageValue, StorageMap}; +use substrate_runtime_support::dispatch::Result; pub mod voting; @@ -101,6 +106,8 @@ pub trait Trait: democracy::Trait {} decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set_approvals(aux, votes: Vec, index: VoteIndex) -> Result = 0; fn reap_inactive_voter(aux, signed_index: u32, who: T::AccountId, who_index: u32, assumed_vote_index: VoteIndex) -> Result = 1; @@ -108,6 +115,8 @@ decl_module! { fn submit_candidacy(aux, slot: u32) -> Result = 3; fn present_winner(aux, candidate: T::AccountId, total: T::Balance, index: VoteIndex) -> Result = 4; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_desired_seats(count: u32) -> Result = 0; fn remove_member(who: T::AccountId) -> Result = 1; @@ -597,10 +606,11 @@ mod tests { pub use runtime_io::with_externalities; pub use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { + #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] pub enum Proposal { Staking = 0, Democracy = 1, @@ -619,7 +629,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 9e719776b2078..0b9dec8976c39 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,20 +18,24 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::traits::{Executable, RefInto}; -use runtime_io::{Hashing, print}; -use runtime_support::{StorageValue, StorageMap, IsSubType}; -use runtime_support::dispatch::Result; +use primitives::traits::{Executable, RefInto, Hashing}; +use runtime_io::print; +use substrate_runtime_support::dispatch::Result; +use substrate_runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; use super::{Trait, Module as Council}; decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn propose(aux, proposal: Box) -> Result = 0; fn vote(aux, proposal: T::Hash, approve: bool) -> Result = 1; fn veto(aux, proposal_hash: T::Hash) -> Result = 2; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_cooloff_period(blocks: T::BlockNumber) -> Result = 0; fn set_voting_period(blocks: T::BlockNumber) -> Result = 1; @@ -214,7 +218,7 @@ impl Executable for Council { mod tests { use super::*; use ::tests::*; - use runtime_support::Hashable; + use substrate_runtime_support::Hashable; use democracy::VoteThreshold; type CouncilVoting = super::Module; diff --git a/substrate/runtime/democracy/Cargo.toml b/substrate/runtime/democracy/Cargo.toml index 74007bb9e06d2..2b52f72ff8700 100644 --- a/substrate/runtime/democracy/Cargo.toml +++ b/substrate/runtime/democracy/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } @@ -22,6 +23,7 @@ substrate-runtime-system = { path = "../system", default_features = false } default = ["std"] std = [ "serde/std", + "serde_derive", "safe-mix/std", "substrate-codec/std", "substrate-primitives/std", diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 730eb823bd603..d6b6a4640f110 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -21,8 +21,12 @@ #[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + #[macro_use] -extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support; #[cfg(feature = "std")] extern crate substrate_primitives; @@ -40,9 +44,9 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::result; -use primitives::traits::{Zero, Executable, RefInto, As}; -use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; -use runtime_support::dispatch::Result; +use primitives::traits::{Zero, Executable, RefInto, As, MaybeSerializeDebug}; +use substrate_runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; +use substrate_runtime_support::dispatch::Result; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -53,16 +57,20 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: staking::Trait + Sized { - type Proposal: Parameter + Dispatchable + IsSubType>; + type Proposal: Parameter + Dispatchable + IsSubType> + MaybeSerializeDebug; } decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn propose(aux, proposal: Box, value: T::Balance) -> Result = 0; fn second(aux, proposal: PropIndex) -> Result = 1; fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) -> Result = 2; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) -> Result = 0; fn cancel_referendum(ref_index: ReferendumIndex) -> Result = 1; @@ -346,10 +354,11 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { + #[derive(Debug, Clone, Eq, Serialize, Deserialize, PartialEq)] pub enum Proposal { Session = 0, Staking = 1, @@ -369,7 +378,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/democracy/src/vote_threshold.rs b/substrate/runtime/democracy/src/vote_threshold.rs index 5797d4176486a..8512417b03cc8 100644 --- a/substrate/runtime/democracy/src/vote_threshold.rs +++ b/substrate/runtime/democracy/src/vote_threshold.rs @@ -22,7 +22,7 @@ use rstd::ops::{Add, Mul, Div, Rem}; /// A means of determining if a vote is past pass threshold. #[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub enum VoteThreshold { /// A supermajority of approvals is needed to pass this vote. SuperMajorityApprove, diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 38c6cbf10a30d..f9079c3739f0b 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -18,7 +18,8 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_support as runtime_support; @@ -45,9 +46,9 @@ extern crate substrate_runtime_staking as staking; use rstd::prelude::*; use rstd::marker::PhantomData; -use runtime_io::Hashing; use runtime_support::StorageValue; -use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, Executable, MakePayment}; +use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, Executable, + MakePayment, Hashing}; use codec::Slicable; use system::extrinsics_root; @@ -60,7 +61,7 @@ pub struct Executive< impl< System: system::Trait, - Block: traits::Block
    , + Block: traits::Block
    , Payment: MakePayment, Finalisation: Executable, > Executive where @@ -181,7 +182,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity, Header as HeaderT}; + use primitives::traits::{HasPublicAux, Identity, Header as HeaderT, BlakeTwo256}; use primitives::testing::{Digest, Header, Block}; pub struct Test; @@ -196,7 +197,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = substrate_primitives::H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml index 42c7134ec688c..185621611943f 100644 --- a/substrate/runtime/primitives/Cargo.toml +++ b/substrate/runtime/primitives/Cargo.toml @@ -14,6 +14,9 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +[dev-dependencies] +serde_json = "1.0" + [features] default = ["std"] std = [ diff --git a/substrate/primitives/src/bft.rs b/substrate/runtime/primitives/src/bft.rs similarity index 75% rename from substrate/primitives/src/bft.rs rename to substrate/runtime/primitives/src/bft.rs index 43f8903aae3b3..111c265233af2 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/runtime/primitives/src/bft.rs @@ -16,10 +16,9 @@ //! Message formats for the BFT consensus layer. -use block::{Block, HeaderHash}; +use rstd::prelude::*; use codec::{Slicable, Input}; -use rstd::vec::Vec; -use ::{AuthorityId, Signature}; +use substrate_primitives::{AuthorityId, Signature}; #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] @@ -32,24 +31,27 @@ enum ActionKind { AdvanceRound = 5, } +/// Type alias for extracting message type from block. +pub type ActionFor = Action::Hash>; + /// Actions which can be taken during the BFT process. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum Action { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub enum Action { /// Proposal of a block candidate. Propose(u32, Block), /// Proposal header of a block candidate. Accompanies any proposal, /// but is used for misbehavior reporting since blocks themselves are big. - ProposeHeader(u32, HeaderHash), + ProposeHeader(u32, H), /// Preparation to commit for a candidate. - Prepare(u32, HeaderHash), + Prepare(u32, H), /// Vote to commit to a candidate. - Commit(u32, HeaderHash), + Commit(u32, H), /// Vote to advance round after inactive primary. AdvanceRound(u32), } -impl Slicable for Action { +impl Slicable for Action { fn encode(&self) -> Vec { let mut v = Vec::new(); match *self { @@ -85,22 +87,19 @@ impl Slicable for Action { fn decode(value: &mut I) -> Option { match i8::decode(value) { Some(x) if x == ActionKind::Propose as i8 => { - let (round, block) = try_opt!(Slicable::decode(value)); + let (round, block) = Slicable::decode(value)?; Some(Action::Propose(round, block)) } Some(x) if x == ActionKind::ProposeHeader as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - + let (round, hash) = Slicable::decode(value)?; Some(Action::ProposeHeader(round, hash)) } Some(x) if x == ActionKind::Prepare as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - + let (round, hash) = Slicable::decode(value)?; Some(Action::Prepare(round, hash)) } Some(x) if x == ActionKind::Commit as i8 => { - let (round, hash) = try_opt!(Slicable::decode(value)); - + let (round, hash) = Slicable::decode(value)?; Some(Action::Commit(round, hash)) } Some(x) if x == ActionKind::AdvanceRound as i8 => { @@ -111,17 +110,20 @@ impl Slicable for Action { } } +/// Type alias for extracting message type from block. +pub type MessageFor = Message::Hash>; + /// Messages exchanged between participants in the BFT consensus. #[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct Message { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Message { /// The parent header hash this action is relative to. - pub parent: HeaderHash, + pub parent: Hash, /// The action being broadcasted. - pub action: Action, + pub action: Action, } -impl Slicable for Message { +impl Slicable for Message { fn encode(&self) -> Vec { let mut v = self.parent.encode(); self.action.using_encoded(|s| v.extend(s)); @@ -130,8 +132,8 @@ impl Slicable for Message { fn decode(value: &mut I) -> Option { Some(Message { - parent: try_opt!(Slicable::decode(value)), - action: try_opt!(Slicable::decode(value)), + parent: Slicable::decode(value)?, + action: Slicable::decode(value)?, }) } } @@ -139,16 +141,16 @@ impl Slicable for Message { /// Justification of a block. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct Justification { +pub struct Justification { /// The round consensus was reached in. pub round_number: u32, /// The hash of the header justified. - pub hash: HeaderHash, + pub hash: H, /// The signatures and signers of the hash. - pub signatures: Vec<(::AuthorityId, ::Signature)> + pub signatures: Vec<(AuthorityId, Signature)> } -impl Slicable for Justification { +impl Slicable for Justification { fn encode(&self) -> Vec { let mut v = Vec::new(); @@ -161,9 +163,9 @@ impl Slicable for Justification { fn decode(value: &mut I) -> Option { Some(Justification { - round_number: try_opt!(Slicable::decode(value)), - hash: try_opt!(Slicable::decode(value)), - signatures: try_opt!(Slicable::decode(value)), + round_number: Slicable::decode(value)?, + hash: Slicable::decode(value)?, + signatures: Slicable::decode(value)?, }) } } @@ -190,28 +192,28 @@ impl MisbehaviorCode { /// Misbehavior kinds. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub enum MisbehaviorKind { +pub enum MisbehaviorKind { /// BFT: double prepare. - BftDoublePrepare(u32, (HeaderHash, Signature), (HeaderHash, Signature)), + BftDoublePrepare(u32, (Hash, Signature), (Hash, Signature)), /// BFT: double commit. - BftDoubleCommit(u32, (HeaderHash, Signature), (HeaderHash, Signature)), + BftDoubleCommit(u32, (Hash, Signature), (Hash, Signature)), } /// A report of misbehavior by an authority. #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] -pub struct MisbehaviorReport { +pub struct MisbehaviorReport { /// The parent hash of the block where the misbehavior occurred. - pub parent_hash: HeaderHash, + pub parent_hash: Hash, /// The parent number of the block where the misbehavior occurred. - pub parent_number: ::block::Number, + pub parent_number: Number, /// The authority who misbehavior. pub target: AuthorityId, /// The misbehavior kind. - pub misbehavior: MisbehaviorKind, + pub misbehavior: MisbehaviorKind, } -impl Slicable for MisbehaviorReport { +impl Slicable for MisbehaviorReport { fn encode(&self) -> Vec { let mut v = Vec::new(); self.parent_hash.using_encoded(|s| v.extend(s)); @@ -241,23 +243,23 @@ impl Slicable for MisbehaviorReport { } fn decode(input: &mut I) -> Option { - let parent_hash = HeaderHash::decode(input)?; - let parent_number = ::block::Number::decode(input)?; + let parent_hash = Hash::decode(input)?; + let parent_number = Number::decode(input)?; let target = AuthorityId::decode(input)?; let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { MisbehaviorCode::BftDoublePrepare => { MisbehaviorKind::BftDoublePrepare( u32::decode(input)?, - (HeaderHash::decode(input)?, Signature::decode(input)?), - (HeaderHash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), ) } MisbehaviorCode::BftDoubleCommit => { MisbehaviorKind::BftDoubleCommit( u32::decode(input)?, - (HeaderHash::decode(input)?, Signature::decode(input)?), - (HeaderHash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), + (Hash::decode(input)?, Signature::decode(input)?), ) } }; @@ -274,10 +276,11 @@ impl Slicable for MisbehaviorReport { #[cfg(test)] mod test { use super::*; + use substrate_primitives::H256; #[test] fn misbehavior_report_roundtrip() { - let report = MisbehaviorReport { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -289,9 +292,9 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); - let report = MisbehaviorReport { + let report = MisbehaviorReport:: { parent_hash: [0; 32].into(), parent_number: 999, target: [1; 32].into(), @@ -303,6 +306,6 @@ mod test { }; let encoded = report.encode(); - assert_eq!(MisbehaviorReport::decode(&mut &encoded[..]).unwrap(), report); + assert_eq!(MisbehaviorReport::::decode(&mut &encoded[..]).unwrap(), report); } } diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 6ad839028530d..f2b33ae94ec3f 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -16,37 +16,23 @@ //! Generic implementations of Extrinsic/Header/Block. -#[cfg(feature = "std")] use serde::Serialize; -use rstd::prelude::*; -use codec::{Slicable, Input}; -use runtime_support::AuxDispatchable; -use traits; -use rstd::ops; - #[cfg(feature = "std")] -use std::fmt::{self, Debug}; +use std::fmt; #[cfg(feature = "std")] -pub trait MaybeSerializeDebug: Serialize + Debug {} -#[cfg(feature = "std")] -impl MaybeSerializeDebug for T {} - -#[cfg(not(feature = "std"))] -pub trait MaybeSerializeDebug {} -#[cfg(not(feature = "std"))] -impl MaybeSerializeDebug for T {} +use serde::{Deserialize, Deserializer}; -pub trait Member: MaybeSerializeDebug + Eq + PartialEq + Clone {} -impl Member for T {} +use rstd::prelude::*; +use codec::{Slicable, Input}; +use runtime_support::AuxDispatchable; +use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, Block as BlockT, + Header as HeaderT, Hashing as HashingT}; +use rstd::ops; /// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Extrinsic where - AccountId: Member, - Index: Member, - Call: Member, -{ +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Extrinsic { /// Who signed it (note this is not a signature). pub signed: AccountId, /// The number of extrinsics have come before from the same signer. @@ -56,8 +42,8 @@ pub struct Extrinsic where } impl Slicable for Extrinsic where - AccountId: Member + Slicable, - Index: Member + Slicable, + AccountId: Member + Slicable + MaybeDisplay, + Index: Member + Slicable + MaybeDisplay + SimpleArithmetic, Call: Member + Slicable { fn decode(input: &mut I) -> Option { @@ -81,37 +67,51 @@ impl Slicable for Extrinsic wher /// A extrinsics right from the external world. Unchecked. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize))] -pub struct UncheckedExtrinsic where - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member, // TODO: should be Option -{ +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct UncheckedExtrinsic { /// The actual extrinsic information. pub extrinsic: Extrinsic, /// The signature; should be an Ed25519 signature applied to the serialised `extrinsic` field. pub signature: Signature, } -impl UncheckedExtrinsic where - AccountId: Member + Default, - Index: Member, +impl traits::Checkable for UncheckedExtrinsic where + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, + Call: Member, + Signature: Member + traits::Verify, + Extrinsic: Slicable, +{ + type Checked = CheckedExtrinsic; + + fn check(self) -> Result { + if ::verify_encoded_lazy(&self.signature, &self.extrinsic, &self.extrinsic.signed) { + Ok(CheckedExtrinsic(self)) + } else { + Err(self) + } + } +} + +impl UncheckedExtrinsic> where + AccountId: Member + Default + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, - Signature: Member + Default, + Signature: Member + Default + traits::Verify, + Extrinsic: Slicable, { /// Is this extrinsic signed? pub fn is_signed(&self) -> bool { - // TODO: should be Option and Option - self.signature != Signature::default() || self.extrinsic.signed != AccountId::default() + self.signature.is_signed(&self.extrinsic.signed) } } impl Slicable for UncheckedExtrinsic where - AccountId: Member + Slicable, - Index: Member + Slicable, - Call: Member + Slicable, - Signature: Member + Slicable + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, + Call: Member, + Signature: Member + Slicable, + Extrinsic: Slicable, { fn decode(input: &mut I) -> Option { // This is a little more complicated than usual since the binary format must be compatible @@ -133,9 +133,11 @@ impl Slicable for UncheckedExtrinsic. we'll make room for it here, then overwrite once we know the length. v.extend(&[0u8; 4]); - self.extrinsic.signed.using_encoded(|s| v.extend(s)); +/* self.extrinsic.signed.using_encoded(|s| v.extend(s)); self.extrinsic.index.using_encoded(|s| v.extend(s)); - self.extrinsic.function.using_encoded(|s| v.extend(s)); + self.extrinsic.function.using_encoded(|s| v.extend(s));*/ + self.extrinsic.using_encoded(|s| v.extend(s)); + self.signature.using_encoded(|s| v.extend(s)); let length = (v.len() - 4) as u32; @@ -147,55 +149,25 @@ impl Slicable for UncheckedExtrinsic fmt::Debug for UncheckedExtrinsic where - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member, + AccountId: fmt::Debug, + Index: fmt::Debug, + Call: fmt::Debug, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) } } -impl traits::Checkable for UncheckedExtrinsic where - AccountId: Member + Default, - Index: Member, - Call: Member, - Signature: Member + Default + traits::Verify, - Extrinsic: Slicable -{ - type Checked = CheckedExtrinsic; - - fn check(self) -> Result { - if !self.is_signed() { - Ok(CheckedExtrinsic(self)) - } else { - if ::codec::Slicable::using_encoded(&self.extrinsic, |msg| - self.signature.verify(msg, &self.extrinsic.signed) - ) { - Ok(CheckedExtrinsic(self)) - } else { - Err(self) - } - } - } -} - /// A type-safe indicator that a extrinsic has been checked. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] pub struct CheckedExtrinsic - (UncheckedExtrinsic) -where - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member; + (UncheckedExtrinsic); impl CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { @@ -218,8 +190,8 @@ where impl ops::Deref for CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member, Signature: Member { @@ -233,8 +205,8 @@ where impl traits::Applyable for CheckedExtrinsic where - AccountId: Member, - Index: Member, + AccountId: Member + MaybeDisplay, + Index: Member + MaybeDisplay + SimpleArithmetic, Call: Member + AuxDispatchable, Signature: Member { @@ -256,12 +228,13 @@ where } #[derive(Default, PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Digest { +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Digest { pub logs: Vec, } + impl Slicable for Digest where - Item: Member + Slicable + Item: Member + Default + Slicable { fn decode(input: &mut I) -> Option { Some(Digest { logs: Slicable::decode(input)? }) @@ -271,7 +244,7 @@ impl Slicable for Digest where } } impl traits::Digest for Digest where - Item: Member + Slicable + Item: Member + Default + Slicable { type Item = Item; fn push(&mut self, item: Self::Item) { @@ -279,32 +252,69 @@ impl traits::Digest for Digest where } } + /// Abstraction over a block header for a substrate chain. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header where - Number: Member, - Hash: Member, - DigestItem: Member, -{ +pub struct Header { /// The parent hash. - pub parent_hash: Hash, + pub parent_hash: ::Output, /// The block number. pub number: Number, /// The state trie merkle root - pub state_root: Hash, + pub state_root: ::Output, /// The merkle root of the extrinsics. - pub extrinsics_root: Hash, + pub extrinsics_root: ::Output, /// A chain-specific digest of data useful for light clients or referencing auxiliary data. pub digest: Digest, } -impl Slicable for Header where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, +// Hack to work around the fact that deriving deserialize doesn't work nicely with +// the `hashing` trait used as a parameter. +// dummy struct that uses the hash type directly. +// https://github.com/serde-rs/serde/issues/1296 +#[cfg(feature = "std")] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[derive(Deserialize)] +struct DeserializeHeader { + parent_hash: H, + number: N, + state_root: H, + extrinsics_root: H, + digest: Digest, +} + +#[cfg(feature = "std")] +impl From> for Header { + fn from(other: DeserializeHeader) -> Self { + Header { + parent_hash: other.parent_hash, + number: other.number, + state_root: other.state_root, + extrinsics_root: other.extrinsics_root, + digest: other.digest, + } + } +} + +#[cfg(feature = "std")] +impl<'a, Number: 'a, Hashing: 'a + HashingT, DigestItem: 'a> Deserialize<'a> for Header where + Number: Deserialize<'a>, + Hashing::Output: Deserialize<'a>, + DigestItem: Deserialize<'a>, +{ + fn deserialize>(de: D) -> Result { + DeserializeHeader::::deserialize(de).map(Into::into) + } +} + +impl Slicable for Header where + Number: Member + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hashing: HashingT, + DigestItem: Member + Default + Slicable, + Hashing::Output: Default + Member + MaybeDisplay + SimpleBitOps + Slicable, { fn decode(input: &mut I) -> Option { Some(Header { @@ -326,20 +336,33 @@ impl Slicable for Header whe v } } -impl traits::Header for Header where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, + +impl traits::Header for Header where + Number: Member + ::rstd::hash::Hash + Copy + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hashing: HashingT, + DigestItem: Member + Default + Slicable, + Hashing::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Slicable, { type Number = Number; - type Hash = Hash; + type Hash = ::Output; + type Hashing = Hashing; type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } + fn set_number(&mut self, num: Self::Number) { self.number = num } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn new( number: Self::Number, extrinsics_root: Self::Hash, @@ -353,45 +376,72 @@ impl traits::Header for Header Header where + Number: Member + ::rstd::hash::Hash + Copy + Slicable + MaybeDisplay + SimpleArithmetic + Slicable, + Hashing: HashingT, + DigestItem: Member + Default + Slicable, + Hashing::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Slicable, + { + /// Convenience helper for computing the hash of the header without having + /// to import the trait. + pub fn hash(&self) -> Hashing::Output { + Hashing::hash_of(self) + } +} + +/// Something to identify a block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block where - Number: Member, - Hash: Member, - DigestItem: Member, - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member -{ +pub enum BlockId { + /// Identify by block header hash. + Hash(<::Header as HeaderT>::Hash), + /// Identify by block number. + Number(<::Header as HeaderT>::Number), +} + +impl BlockId { + /// Create a block ID from a hash. + pub fn hash(hash: Block::Hash) -> Self { + BlockId::Hash(hash) + } + + /// Create a block ID from a number. + pub fn number(number: ::Number) -> Self { + BlockId::Number(number) + } +} + +impl Copy for BlockId {} + +#[cfg(feature = "std")] +impl fmt::Display for BlockId { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "{:?}", self) + } +} + +/// Abstraction over a substrate block. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] +pub struct Block { /// The block header. - pub header: Header, + pub header: Header, /// The accompanying extrinsics. - pub extrinsics: Vec>, + pub extrinsics: Vec, } -impl Slicable - for Block -where - Number: Member, - Hash: Member, - DigestItem: Member, - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member, - Header: Slicable, - UncheckedExtrinsic: Slicable, -{ +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, extrinsics: Slicable::decode(input)?, }) } + fn encode(&self) -> Vec { let mut v: Vec = Vec::new(); v.extend(self.header.encode()); @@ -400,19 +450,15 @@ where } } -impl traits::Block - for Block +impl traits::Block for Block where - Number: Member + Slicable, - Hash: Member + Slicable, - DigestItem: Member + Slicable, - AccountId: Member, - Index: Member, - Call: Member, - Signature: Member + Header: HeaderT, + Extrinsic: Member + Slicable, { - type Extrinsic = UncheckedExtrinsic; - type Header = Header; + type Extrinsic = Extrinsic; + type Header = Header; + type Hash = ::Hash; + fn header(&self) -> &Self::Header { &self.header } @@ -422,4 +468,64 @@ where fn deconstruct(self) -> (Self::Header, Vec) { (self.header, self.extrinsics) } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + Block { header, extrinsics } + } +} + +#[cfg(test)] +mod tests { + use codec::Slicable; + use substrate_primitives::{H256, H512}; + use super::{Digest, Header, UncheckedExtrinsic, Extrinsic}; + + type Block = super::Block< + Header>, + UncheckedExtrinsic, + >; + + #[test] + fn block_roundtrip_serialization() { + let block: Block = Block { + header: Header { + parent_hash: [0u8; 32].into(), + number: 100_000, + state_root: [1u8; 32].into(), + extrinsics_root: [2u8; 32].into(), + digest: Digest { logs: vec![vec![1, 2, 3], vec![4, 5, 6]] }, + }, + extrinsics: vec![ + UncheckedExtrinsic { + signature: H512::from([0u8; 64]).into(), + extrinsic: Extrinsic { + signed: [255u8; 32].into(), + index: 0, + function: 100, + } + }, + UncheckedExtrinsic { + signature: H512::from([255u8; 64]).into(), + extrinsic: Extrinsic { + signed: [128u8; 32].into(), + index: 100, + function: 99, + } + }, + ] + }; + + { + let encoded = ::serde_json::to_vec(&block).unwrap(); + let decoded: Block = ::serde_json::from_slice(&encoded).unwrap(); + + assert_eq!(block, decoded); + } + + { + let encoded = block.encode(); + let decoded = Block::decode(&mut &encoded[..]).unwrap(); + + assert_eq!(block, decoded); + } + } } diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 3d157cc2d47b7..e62f508f9dc1b 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -34,16 +34,23 @@ extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; extern crate substrate_primitives; +#[cfg(test)] +extern crate serde_json; + #[cfg(feature = "std")] use std::collections::HashMap; -use substrate_primitives::hash::H512; +use rstd::prelude::*; +use substrate_primitives::hash::{H256, H512}; #[cfg(feature = "std")] pub mod testing; pub mod traits; pub mod generic; +pub mod bft; + +use traits::{Verify, Lazy}; #[cfg(feature = "std")] pub type BuiltExternalities = HashMap, Vec>; @@ -55,24 +62,90 @@ pub trait BuildExternalities { /// Ed25519 signature verify. #[derive(Eq, PartialEq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Ed25519Signature(H512); -impl traits::Verify for Ed25519Signature { - type Signer = [u8; 32]; - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { - runtime_io::ed25519_verify(&(self.0).0, msg, &signer[..]) +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Ed25519Signature(pub H512); + +impl Verify for Ed25519Signature { + type Signer = H256; + fn verify>(&self, mut msg: L, signer: &Self::Signer) -> bool { + runtime_io::ed25519_verify(&(self.0).0, msg.get(), &signer.0[..]) } } + impl codec::Slicable for Ed25519Signature { fn decode(input: &mut I) -> Option { Some(Ed25519Signature(codec::Slicable::decode(input)?,)) } fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } } + impl From for Ed25519Signature { fn from(h: H512) -> Ed25519Signature { Ed25519Signature(h) } } +/// Potentially "unsigned" signature verification. +#[derive(Eq, PartialEq, Clone, Default)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct MaybeUnsigned(pub T); + +impl MaybeUnsigned where + T: Default + Eq, + ::Signer: Default + Eq, +{ + fn is_signed(&self, signer: &::Signer) -> bool { + self.0 != T::default() || signer != &::Signer::default() + } +} + +impl Verify for MaybeUnsigned where + T: Default + Eq, + ::Signer: Default + Eq, +{ + type Signer = T::Signer; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool { + if !self.is_signed(signer) { + true + } else { + self.0.verify(msg, signer) + } + } +} + +impl codec::Slicable for MaybeUnsigned { + fn decode(input: &mut I) -> Option { Some(MaybeUnsigned(codec::Slicable::decode(input)?)) } + fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } +} + +impl From for MaybeUnsigned { + fn from(t: T) -> Self { + MaybeUnsigned(t) + } +} + +/// Verify a signature on an encoded value in a lazy manner. This can be +/// an optimization if the signature scheme has an "unsigned" escape hash. +pub fn verify_encoded_lazy(sig: &V, item: &T, signer: &V::Signer) -> bool { + // The `Lazy` trait expresses something like `X: FnMut &'a T>`. + // unfortunately this is a lifetime relationship that can't + // be expressed without generic associated types, better unification of HRTBs in type position, + // and some kind of integration into the Fn* traits. + struct LazyEncode { + inner: F, + encoded: Option>, + } + + impl Vec> traits::Lazy<[u8]> for LazyEncode { + fn get(&mut self) -> &[u8] { + self.encoded.get_or_insert_with(&self.inner).as_slice() + } + } + + sig.verify( + LazyEncode { inner: || item.encode(), encoded: None }, + signer, + ) +} + #[macro_export] macro_rules! __impl_outer_config_types { ($concrete:ident $config:ident $snake:ident $($rest:ident)*) => { diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 7300d8d1765b5..27e675b04fe80 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -16,13 +16,15 @@ //! Testing utilities. -use serde; +use serde::{Serialize, de::DeserializeOwned}; +use std::fmt::Debug; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; -use substrate_primitives::H256; -use traits::{self, Checkable, Applyable}; +use traits::{self, Checkable, Applyable, BlakeTwo256}; -#[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] +pub use substrate_primitives::H256; + +#[derive(Default, PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] pub struct Digest { pub logs: Vec, } @@ -41,7 +43,7 @@ impl traits::Digest for Digest { } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct Header { @@ -74,13 +76,25 @@ impl Slicable for Header { } impl traits::Header for Header { type Number = u64; + type Hashing = BlakeTwo256; type Hash = H256; type Digest = Digest; + fn number(&self) -> &Self::Number { &self.number } + fn set_number(&mut self, num: Self::Number) { self.number = num } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn set_extrinsics_root(&mut self, root: Self::Hash) { self.extrinsics_root = root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn set_state_root(&mut self, root: Self::Hash) { self.state_root = root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } + fn new( number: Self::Number, extrinsics_root: Self::Hash, @@ -94,12 +108,12 @@ impl traits::Header for Header { } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct Block { +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] +pub struct Block { pub header: Header, pub extrinsics: Vec, } -impl Slicable for Block { +impl Slicable for Block { fn decode(input: &mut I) -> Option { Some(Block { header: Slicable::decode(input)?, @@ -113,9 +127,11 @@ impl Slicable for Block { v } } -impl traits::Block for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; + type Hash =
    ::Hash; + fn header(&self) -> &Self::Header { &self.header } @@ -125,11 +141,15 @@ impl traits::Block for Block { fn deconstruct(self) -> (Self::Header, Vec) { (self.header, self.extrinsics) } + fn new(header: Self::Header, extrinsics: Vec) -> Self { + Block { header, extrinsics } + } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] -pub struct TestXt(pub (u64, u64, Call)); -impl Slicable for TestXt { +#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)] +pub struct TestXt(pub (u64, u64, Call)); + +impl Slicable for TestXt { fn decode(input: &mut I) -> Option { Some(TestXt(Slicable::decode(input)?)) } @@ -137,11 +157,11 @@ impl Slicable for T self.0.encode() } } -impl Checkable for TestXt { +impl Checkable for TestXt { type Checked = Self; fn check(self) -> Result { Ok(self) } } -impl + Slicable + Sized + serde::Serialize> Applyable for TestXt { +impl + Slicable + Sized + Send + Sync + Serialize + DeserializeOwned + Clone + Eq + Debug> Applyable for TestXt { type AccountId = u64; type Index = u64; fn sender(&self) -> &u64 { &(self.0).0 } diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 24cfa73ffced4..43639df61e796 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -18,19 +18,26 @@ use rstd::prelude::*; use rstd; -#[cfg(not(feature = "std"))] use runtime_io; +use runtime_io; +#[cfg(feature = "std")] use std::fmt::{Debug, Display}; +#[cfg(feature = "std")] use serde::{Serialize, de::DeserializeOwned}; use substrate_primitives; use codec::Slicable; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +/// A lazy value. +pub trait Lazy { + fn get(&mut self) -> &T; +} + /// Means of signature verification. pub trait Verify { /// Type of the signer. type Signer; /// Verify a signature. - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool; + fn verify>(&self, msg: L, signer: &Self::Signer) -> bool; } /// Simple payment making trait, operating on a single generic `AccountId` type. @@ -122,13 +129,28 @@ impl + Ord > SimpleArithmetic for T {} +/// Trait for things that can be clear (have no bits set). For numeric types, essentially the same +/// as `Zero`. +pub trait Clear { + /// True iff no bits are set. + fn is_clear(&self) -> bool; + + /// Return the value of Self that is clear. + fn clear() -> Self; +} + +impl Clear for T { + fn is_clear(&self) -> bool { *self == Self::clear() } + fn clear() -> Self { Default::default() } +} + pub trait SimpleBitOps: - Sized + + Sized + Clear + rstd::ops::BitOr + rstd::ops::BitAnd {} impl + rstd::ops::BitAnd > SimpleBitOps for T {} @@ -148,34 +170,136 @@ impl Executable for (A, B) { } } +/// Abstraction around hashing +pub trait Hashing: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived + // traits must be fulfilled by all type parameters. + /// The hash type produced. + type Output: Member + AsRef<[u8]>; + + /// Produce the hash of some byte-slice. + fn hash(s: &[u8]) -> Self::Output; + + /// Produce the hash of some codec-encodable value. + fn hash_of(s: &S) -> Self::Output { + Slicable::using_encoded(s, Self::hash) + } + + /// Produce the patricia-trie root of a mapping from indices to byte slices. + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; + + /// Iterator-based version of `enumerated_trie_root`. + fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> + >(input: I) -> Self::Output; + + /// The Patricia tree root of the given mapping as an iterator. + fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]> + >(input: I) -> Self::Output; + + /// Acquire the global storage root. + fn storage_root() -> Self::Output; +} + +/// Blake2-256 Hashing implementation. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct BlakeTwo256; + +impl Hashing for BlakeTwo256 { + type Output = substrate_primitives::H256; + fn hash(s: &[u8]) -> Self::Output { + runtime_io::blake2_256(s).into() + } + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { + runtime_io::enumerated_trie_root(items).into() + } + fn trie_root< + I: IntoIterator, + A: AsRef<[u8]> + Ord, + B: AsRef<[u8]> + >(input: I) -> Self::Output { + runtime_io::trie_root(input).into() + } + fn ordered_trie_root< + I: IntoIterator, + A: AsRef<[u8]> + >(input: I) -> Self::Output { + runtime_io::ordered_trie_root(input).into() + } + fn storage_root() -> Self::Output { + runtime_io::storage_root().into() + } +} + +/// Something that can be checked for equality and printed out to a debug channel if bad. +pub trait CheckEqual { + fn check_equal(&self, other: &Self); +} + +impl CheckEqual for substrate_primitives::H256 { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + use substrate_primitives::hexdisplay::HexDisplay; + if &self.0 != &other.0 { + println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); + } + } + + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != other { + runtime_io::print("Hash not equal"); + runtime_io::print(&self.0[..]); + runtime_io::print(&other.0[..]); + } + } +} + +#[cfg(feature = "std")] +pub trait MaybeSerializeDebug: Serialize + DeserializeOwned + Debug {} +#[cfg(feature = "std")] +impl MaybeSerializeDebug for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeSerializeDebug {} +#[cfg(not(feature = "std"))] +impl MaybeSerializeDebug for T {} + +#[cfg(feature = "std")] +pub trait MaybeDisplay: Display {} +#[cfg(feature = "std")] +impl MaybeDisplay for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeDisplay {} +#[cfg(not(feature = "std"))] +impl MaybeDisplay for T {} + +pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone + 'static {} +impl Member for T {} + /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. pub trait Digest { - type Item: Sized; + type Item: Member; fn push(&mut self, item: Self::Item); } -impl Digest for substrate_primitives::Digest { - type Item = substrate_primitives::block::Log; - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } -} - /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Header: Sized + Slicable { - type Number: Sized; - type Hash: Sized; - type Digest: Sized; - fn number(&self) -> &Self::Number; - fn extrinsics_root(&self) -> &Self::Hash; - fn state_root(&self) -> &Self::Hash; - fn parent_hash(&self) -> &Self::Hash; - fn digest(&self) -> &Self::Digest; +pub trait Header: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { + type Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Slicable; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable + AsRef<[u8]>; + type Hashing: Hashing; + type Digest: Member + Default; + fn new( number: Self::Number, extrinsics_root: Self::Hash, @@ -183,31 +307,24 @@ pub trait Header: Sized + Slicable { parent_hash: Self::Hash, digest: Self::Digest ) -> Self; -} -impl Header for substrate_primitives::Header { - type Number = substrate_primitives::block::Number; - type Hash = substrate_primitives::block::HeaderHash; - type Digest = substrate_primitives::block::Digest; - fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - substrate_primitives::Header { - number: number, - extrinsics_root: extrinsics_root, - state_root: state_root, - parent_hash: parent_hash, - digest: digest, - } + fn number(&self) -> &Self::Number; + fn set_number(&mut self, Self::Number); + + fn extrinsics_root(&self) -> &Self::Hash; + fn set_extrinsics_root(&mut self, Self::Hash); + + fn state_root(&self) -> &Self::Hash; + fn set_state_root(&mut self, Self::Hash); + + fn parent_hash(&self) -> &Self::Hash; + fn set_parent_hash(&mut self, Self::Hash); + + fn digest(&self) -> &Self::Digest; + fn set_digest(&mut self, Self::Digest); + + fn hash(&self) -> Self::Hash { + ::hash_of(self) } } @@ -215,32 +332,27 @@ impl Header for substrate_primitives::Header { /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Block { - type Extrinsic: Sized; - type Header: Header; +pub trait Block: Clone + Send + Sync + Slicable + Eq + MaybeSerializeDebug { + type Extrinsic: Member + Slicable; + type Header: Header; + type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Slicable + AsRef<[u8]>; + fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); -} - -impl Block for substrate_primitives::Block { - type Extrinsic = substrate_primitives::block::Extrinsic; - type Header = substrate_primitives::Header; - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.transactions[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.transactions) + fn new(header: Self::Header, extrinsics: Vec) -> Self; + fn hash(&self) -> Self::Hash { + <::Hashing as Hashing>::hash_of(self.header()) } } +/// Extract the hashing type for a block. +pub type HashingFor = <::Header as Header>::Hashing; + /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. -pub trait Checkable: Sized { - type Checked: Sized; +pub trait Checkable: Sized + Send + Sync { + type Checked: Member; fn check(self) -> Result; } @@ -250,34 +362,10 @@ pub trait Checkable: Sized { /// /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. -pub trait Applyable { - type AccountId; - type Index; +pub trait Applyable: Sized + Send + Sync { + type AccountId: Member + MaybeDisplay; + type Index: Member + MaybeDisplay + SimpleArithmetic; fn index(&self) -> &Self::Index; fn sender(&self) -> &Self::AccountId; fn apply(self); } - -/// Something that can be checked for equality and printed out to a debug channel if bad. -pub trait CheckEqual { - fn check_equal(&self, other: &Self); -} - -impl CheckEqual for substrate_primitives::H256 { - #[cfg(feature = "std")] - fn check_equal(&self, other: &Self) { - use substrate_primitives::hexdisplay::HexDisplay; - if &self.0 != &other.0 { - println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); - } - } - - #[cfg(not(feature = "std"))] - fn check_equal(&self, other: &Self) { - if self != other { - runtime_io::print("Hash not equal"); - runtime_io::print(&self.0[..]); - runtime_io::print(&other.0[..]); - } - } -} diff --git a/substrate/runtime/session/Cargo.toml b/substrate/runtime/session/Cargo.toml index 17bdeb7264096..93938fc3561b7 100644 --- a/substrate/runtime/session/Cargo.toml +++ b/substrate/runtime/session/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } @@ -21,6 +22,7 @@ substrate-runtime-system = { path = "../system", default_features = false } default = ["std"] std = [ "serde/std", + "serde_derive", "safe-mix/std", "substrate-keyring", "substrate-codec/std", diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index f93c31a4b2b09..5d95f28c539c1 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -22,6 +22,10 @@ #[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; @@ -51,9 +55,13 @@ pub trait Trait: consensus::Trait { decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set_key(aux, key: T::SessionKey) -> Result = 0; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_length(new: T::BlockNumber) -> Result = 0; fn force_new_session() -> Result = 1; @@ -197,7 +205,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, BlakeTwo256}; use primitives::testing::{Digest, Header}; pub struct Test; @@ -212,7 +220,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/staking/Cargo.toml b/substrate/runtime/staking/Cargo.toml index 0f9274198a544..b231ed7cf192e 100644 --- a/substrate/runtime/staking/Cargo.toml +++ b/substrate/runtime/staking/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } @@ -27,6 +28,7 @@ wabt = "0.1.7" default = ["std"] std = [ "serde/std", + "serde_derive", "safe-mix/std", "substrate-keyring", "substrate-codec/std", diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 418ed28132446..d1a646c4f7648 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -21,6 +21,10 @@ #[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + #[cfg(test)] extern crate wabt; @@ -48,7 +52,7 @@ use rstd::collections::btree_map::{BTreeMap, Entry}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; use runtime_support::dispatch::Result; -use primitives::traits::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment, As}; +use primitives::traits::{Zero, One, As, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment, Hashing as HashingT}; #[cfg(test)] #[derive(Debug, PartialEq, Clone)] @@ -71,7 +75,7 @@ pub trait ContractAddressFor { } impl ContractAddressFor for Hashing where - Hashing: runtime_io::Hashing, + Hashing: HashingT, AccountId: Sized + Slicable + From, Hashing::Output: Slicable { @@ -90,11 +94,15 @@ pub trait Trait: system::Trait + session::Trait { decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn transfer(aux, dest: T::AccountId, value: T::Balance) -> Result = 0; fn stake(aux) -> Result = 1; fn unstake(aux) -> Result = 2; } + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum PrivCall { fn set_sessions_per_era(new: T::BlockNumber) -> Result = 0; fn set_bonding_duration(new: T::BlockNumber) -> Result = 1; @@ -701,7 +709,6 @@ pub struct GenesisConfig { #[cfg(any(feature = "std", test))] impl GenesisConfig where T::AccountId: From { pub fn simple() -> Self { - use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(2), current_era: T::BlockNumber::sa(0), @@ -715,7 +722,6 @@ impl GenesisConfig where T::AccountId: From { } pub fn extended() -> Self { - use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(3), current_era: T::BlockNumber::sa(1), @@ -740,7 +746,6 @@ impl GenesisConfig where T::AccountId: From { #[cfg(any(feature = "std", test))] impl Default for GenesisConfig { fn default() -> Self { - use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(1000), current_era: T::BlockNumber::sa(0), @@ -801,7 +806,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = ::primitives::traits::BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 55ccd2302d004..af7f8f7aaae26 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -34,8 +34,8 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; -use runtime_io::Hashing; -use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, + Hashing, Member, MaybeDisplay}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -59,13 +59,18 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { } pub trait Trait { - type Index: Parameter + Default + SimpleArithmetic + Copy; - type BlockNumber: Parameter + SimpleArithmetic + Default + Bounded + Copy; - type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; + type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; + type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; + type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]>; type Hashing: Hashing; - type Digest: Parameter + Default + traits::Digest; - type AccountId: Parameter + Ord + Default; - type Header: traits::Header; + type Digest: Parameter + Member + Default + traits::Digest; + type AccountId: Parameter + Member + MaybeDisplay + Ord + Default; + type Header: Parameter + traits::Header< + Number = Self::BlockNumber, + Hashing = Self::Hashing, + Hash = Self::Hash, + Digest = Self::Digest + >; } decl_module! { diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml index d1697273cffa0..d90f961b6c69b 100644 --- a/substrate/runtime/timestamp/Cargo.toml +++ b/substrate/runtime/timestamp/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } @@ -25,6 +26,7 @@ std = [ "substrate-runtime-support/std", "substrate-runtime-primitives/std", "serde/std", + "serde_derive", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-system/std", diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 96c953e66500e..b6711468deabe 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -27,6 +27,10 @@ extern crate substrate_runtime_support as runtime_support; #[cfg(any(feature = "std", test))] extern crate substrate_runtime_io as runtime_io; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + #[cfg(test)] extern crate substrate_primitives; extern crate substrate_runtime_primitives as runtime_primitives; @@ -46,6 +50,8 @@ pub trait Trait: HasPublicAux + system::Trait { decl_module! { pub struct Module; + + #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum Call where aux: T::PublicAux { fn set(aux, now: T::Value) -> Result = 0; } @@ -111,7 +117,7 @@ mod tests { use runtime_support::storage::StorageValue; use substrate_primitives::H256; use runtime_primitives::BuildExternalities; - use runtime_primitives::traits::{HasPublicAux}; + use runtime_primitives::traits::{HasPublicAux, BlakeTwo256}; use runtime_primitives::testing::{Digest, Header}; pub struct Test; @@ -122,7 +128,7 @@ mod tests { type Index = u64; type BlockNumber = u64; type Hash = H256; - type Hashing = runtime_io::BlakeTwo256; + type Hashing = BlakeTwo256; type Digest = Digest; type AccountId = u64; type Header = Header; diff --git a/substrate/state-machine/Cargo.toml b/substrate/state-machine/Cargo.toml index 647b9e40ddefb..40bb922f5ba5f 100644 --- a/substrate/state-machine/Cargo.toml +++ b/substrate/state-machine/Cargo.toml @@ -6,6 +6,6 @@ description = "Substrate State Machine" [dependencies] substrate-primitives = { path = "../primitives", version = "0.1.0" } -triehash = "0.1" +triehash = "0.1.2" byteorder = "1.1" hex-literal = "0.1.0" diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index c8aa4900980ed..750b56a8565ac 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -18,13 +18,9 @@ #![warn(missing_docs)] -extern crate substrate_primitives as primitives; - #[cfg_attr(test, macro_use)] extern crate hex_literal; - extern crate triehash; - extern crate byteorder; use std::collections::HashMap; diff --git a/substrate/test-client/Cargo.toml b/substrate/test-client/Cargo.toml index e12149fc2c547..bec520419f48e 100644 --- a/substrate/test-client/Cargo.toml +++ b/substrate/test-client/Cargo.toml @@ -12,3 +12,4 @@ substrate-keyring = { path = "../../substrate/keyring" } substrate-primitives = { path = "../primitives" } substrate-runtime-support = { path = "../runtime-support" } substrate-test-runtime = { path = "../test-runtime" } +substrate-runtime-primitives = { path = "../runtime/primitives" } diff --git a/substrate/test-client/src/client_ext.rs b/substrate/test-client/src/client_ext.rs index 071a889d1efd8..919e2ab412e4a 100644 --- a/substrate/test-client/src/client_ext.rs +++ b/substrate/test-client/src/client_ext.rs @@ -16,12 +16,10 @@ //! Client extension for tests. -use codec::Slicable; use client::{self, Client}; use keyring::Keyring; -use runtime_support::Hashable; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; -use primitives::block; +use runtime; use bft; use {Backend, Executor, NativeExecutor}; @@ -31,26 +29,26 @@ pub trait TestClient { fn new_for_tests() -> Self; /// Justify and import block to the chain. - fn justify_and_import(&self, origin: client::BlockOrigin, block: block::Block) -> client::error::Result<()>; + fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()>; /// Returns hash of the genesis block. - fn genesis_hash(&self) -> block::HeaderHash; + fn genesis_hash(&self) -> runtime::Hash; } -impl TestClient for Client { +impl TestClient for Client { fn new_for_tests() -> Self { client::new_in_mem(NativeExecutor::new(), GenesisBuilder).unwrap() } - fn justify_and_import(&self, origin: client::BlockOrigin, block: block::Block) -> client::error::Result<()> { + fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()> { let justification = fake_justify(&block.header); let justified = self.check_justification(block.header, justification)?; - self.import_block(origin, justified, Some(block.transactions))?; + self.import_block(origin, justified, Some(block.extrinsics))?; Ok(()) } - fn genesis_hash(&self) -> block::HeaderHash { + fn genesis_hash(&self) -> runtime::Hash { self.block_hash(0).unwrap().unwrap() } } @@ -61,8 +59,8 @@ impl TestClient for Client { /// headers. /// TODO: remove this in favor of custom verification pipelines for the /// client -fn fake_justify(header: &block::Header) -> bft::UncheckedJustification { - let hash = header.blake2_256().into(); +fn fake_justify(header: &runtime::Header) -> bft::UncheckedJustification { + let hash = header.hash(); let authorities = vec![ Keyring::Alice.into(), Keyring::Bob.into(), @@ -72,7 +70,7 @@ fn fake_justify(header: &block::Header) -> bft::UncheckedJustification { bft::UncheckedJustification { digest: hash, signatures: authorities.iter().map(|key| { - let msg = bft::sign_message( + let msg = bft::sign_message::( bft::generic::Vote::Commit(1, hash).into(), key, header.parent_hash @@ -97,15 +95,14 @@ fn genesis_config() -> GenesisConfig { struct GenesisBuilder; -impl client::GenesisBuilder for GenesisBuilder { - fn build(self) -> (block::Header, Vec<(Vec, Vec)>) { +impl client::GenesisBuilder for GenesisBuilder { + fn build(self) -> (runtime::Header, Vec<(Vec, Vec)>) { let mut storage = genesis_config().genesis_map(); - let block = client::genesis::construct_genesis_block(&storage); + let block: runtime::Block = client::genesis::construct_genesis_block(&storage); storage.extend(additional_storage_with_genesis(&block)); ( - block::Header::decode(&mut block.header.encode().as_ref()) - .expect("to_vec() always gives a valid serialisation; qed"), + block.header, storage.into_iter().collect() ) } diff --git a/substrate/test-client/src/lib.rs b/substrate/test-client/src/lib.rs index dacf41e851993..1500e603a07fe 100644 --- a/substrate/test-client/src/lib.rs +++ b/substrate/test-client/src/lib.rs @@ -23,6 +23,7 @@ extern crate substrate_codec as codec; extern crate substrate_keyring as keyring; extern crate substrate_primitives as primitives; extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; #[macro_use] extern crate substrate_executor as executor; pub extern crate substrate_test_runtime as runtime; @@ -43,12 +44,12 @@ mod native_executor { pub use self::native_executor::NativeExecutor; /// Test client database backend. -pub type Backend = client::in_mem::Backend; +pub type Backend = client::in_mem::Backend; /// Test client executor. pub type Executor = client::LocalCallExecutor>; /// Creates new client instance used for tests. -pub fn new() -> client::Client { +pub fn new() -> client::Client { TestClient::new_for_tests() } diff --git a/substrate/test-runtime/Cargo.toml b/substrate/test-runtime/Cargo.toml index 577d435b6df83..bd0654e2ef945 100644 --- a/substrate/test-runtime/Cargo.toml +++ b/substrate/test-runtime/Cargo.toml @@ -7,12 +7,15 @@ authors = ["Parity Technologies "] log = { version = "0.3", optional = true } hex-literal = { version = "0.1.0", optional = true } ed25519 = { path = "../ed25519", optional = true } +serde = { version = "1.0", optional = true } +serde_derive = { version = "1.0", optional = true } substrate-keyring = { path = "../keyring", optional = true } substrate-codec = { path = "../codec", default-features = false } substrate-runtime-std = { path = "../runtime-std", default-features = false } substrate-runtime-io = { path = "../runtime-io", default-features = false } substrate-runtime-support = { path = "../runtime-support", default-features = false } substrate-primitives = { path = "../primitives", default-features = false } +substrate-runtime-primitives = { path = "../runtime/primitives", default-features = false } [features] default = ["std"] @@ -20,10 +23,13 @@ std = [ "log", "hex-literal", "ed25519", + "serde", + "serde_derive", "substrate-keyring", "substrate-codec/std", "substrate-runtime-std/std", "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-runtime-primitives/std" ] diff --git a/substrate/test-runtime/src/genesismap.rs b/substrate/test-runtime/src/genesismap.rs index 1bc24d265763e..10bf1751f4c99 100644 --- a/substrate/test-runtime/src/genesismap.rs +++ b/substrate/test-runtime/src/genesismap.rs @@ -18,10 +18,9 @@ use std::collections::HashMap; use runtime_io::twox_128; -use runtime_support::Hashable; use codec::{KeyedVec, Joiner}; use primitives::AuthorityId; -use primitives::block::Block; +use runtime_primitives::traits::Block; /// Configuration of a general Substrate test genesis block. pub struct GenesisConfig { @@ -60,12 +59,8 @@ macro_rules! map { ) } -pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { - use codec::Slicable; - use primitives::hexdisplay::HexDisplay; - println!("genesis hash {}", HexDisplay::from(&genesis_block.header.blake2_256())); - println!("genesis {}", HexDisplay::from(&genesis_block.header.encode())); +pub fn additional_storage_with_genesis(genesis_block: &::Block) -> HashMap, Vec> { map![ - twox_128(&b"latest"[..]).to_vec() => genesis_block.header.blake2_256().to_vec() + twox_128(&b"latest"[..]).to_vec() => genesis_block.hash().0.to_vec() ] } diff --git a/substrate/test-runtime/src/lib.rs b/substrate/test-runtime/src/lib.rs index d264417b547ca..837572efc0030 100644 --- a/substrate/test-runtime/src/lib.rs +++ b/substrate/test-runtime/src/lib.rs @@ -19,38 +19,114 @@ #![cfg_attr(not(feature = "std"), no_std)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_io as runtime_io; -extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; -#[cfg(test)] #[macro_use] extern crate hex_literal; -#[cfg(test)] extern crate ed25519; -#[cfg(test)] extern crate substrate_keyring as keyring; -#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as runtime_primitives; + +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[cfg(test)] +#[macro_use] +extern crate hex_literal; +#[cfg(test)] +extern crate ed25519; +#[cfg(test)] +extern crate substrate_keyring as keyring; +#[cfg_attr(test, macro_use)] +extern crate substrate_primitives as primitives; +#[macro_use] +extern crate substrate_runtime_io as runtime_io; + #[cfg(feature = "std")] pub mod genesismap; pub mod system; -mod transaction; -mod unchecked_transaction; use rstd::prelude::*; use codec::Slicable; -use primitives::AuthorityId; -use primitives::hash::H512; -use primitives::block::generic; +use runtime_primitives::traits::{Checkable, BlakeTwo256}; +use runtime_primitives::Ed25519Signature; pub use primitives::hash::H256; -pub use primitives::block::{Header, Number as BlockNumber, Digest}; -pub use transaction::Transaction; -pub use unchecked_transaction::UncheckedTransaction; -/// A test block. -pub type Block = generic::Block; +/// Calls in transactions. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Transfer { + pub from: AccountId, + pub to: AccountId, + pub amount: u64, + pub nonce: u64, +} + +impl Slicable for Transfer { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.from.using_encoded(|s| v.extend(s)); + self.to.using_encoded(|s| v.extend(s)); + self.amount.using_encoded(|s| v.extend(s)); + self.nonce.using_encoded(|s| v.extend(s)); + v + } + + fn decode(input: &mut I) -> Option { + Slicable::decode(input).map(|(from, to, amount, nonce)| Transfer { from, to, amount, nonce }) + } +} + +/// Extrinsic for test-runtime. +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +pub struct Extrinsic { + pub transfer: Transfer, + pub signature: Ed25519Signature, +} + +impl Slicable for Extrinsic { + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.transfer.using_encoded(|s| v.extend(s)); + self.signature.using_encoded(|s| v.extend(s)); + v + } + + fn decode(input: &mut I) -> Option { + Slicable::decode(input).map(|(transfer, signature)| Extrinsic { transfer, signature }) + } +} + +impl Checkable for Extrinsic { + type Checked = Self; + + fn check(self) -> Result { + if ::runtime_primitives::verify_encoded_lazy(&self.signature, &self.transfer, &self.transfer.from) { + Ok(self) + } else { + Err(self) + } + } +} + /// An identifier for an account on this system. -pub type AccountId = AuthorityId; -/// Signature for our transactions. -pub type Signature = H512; +pub type AccountId = H256; /// A simple hash type for all our hashing. pub type Hash = H256; +/// The block number type used in this runtime. +pub type BlockNumber = u64; +/// Index of a transaction. +pub type Index = u64; +/// The digest of a block. +pub type Digest = runtime_primitives::generic::Digest>; +/// A test block. +pub type Block = runtime_primitives::generic::Block; +/// A test block's header. +pub type Header = runtime_primitives::generic::Header>; /// Run whatever tests we have. pub fn run_tests(mut input: &[u8]) -> Vec { @@ -59,7 +135,7 @@ pub fn run_tests(mut input: &[u8]) -> Vec { print("run_tests..."); let block = Block::decode(&mut input).unwrap(); print("deserialised block."); - let stxs = block.transactions.iter().map(Slicable::encode).collect::>(); + let stxs = block.extrinsics.iter().map(Slicable::encode).collect::>(); print("reserialised transactions."); [stxs.len() as u8].encode() } @@ -69,8 +145,9 @@ pub mod api { impl_stubs!( authorities => |()| system::authorities(), + initialise_block => |header| system::initialise_block(header), execute_block => |block| system::execute_block(block), - execute_transaction => |(header, utx)| system::execute_transaction(utx, header), - finalise_block => |header| system::finalise_block(header) + apply_extrinsic => |utx| system::execute_transaction(utx), + finalise_block => |()| system::finalise_block() ); } diff --git a/substrate/test-runtime/src/system.rs b/substrate/test-runtime/src/system.rs index 7f57cbc28f6b2..f71bbd0155d94 100644 --- a/substrate/test-runtime/src/system.rs +++ b/substrate/test-runtime/src/system.rs @@ -18,20 +18,23 @@ //! and depositing logs. use rstd::prelude::*; -use primitives::AuthorityId; -use runtime_io::{storage_root, enumerated_trie_root, ed25519_verify}; -use runtime_support::{Hashable, storage}; +use runtime_io::{storage_root, enumerated_trie_root}; +use runtime_support::storage::{self, StorageValue, StorageMap}; +use runtime_primitives::traits::{Hashing, BlakeTwo256}; use codec::{KeyedVec, Slicable}; -use super::{AccountId, UncheckedTransaction, H256 as Hash, Block, Header}; +use super::{AccountId, BlockNumber, Extrinsic, H256 as Hash, Block, Header}; const NONCE_OF: &[u8] = b"nonce:"; const BALANCE_OF: &[u8] = b"balance:"; -const LATEST_BLOCK_HASH: &[u8] = b"latest"; const AUTHORITY_AT: &'static[u8] = b":auth:"; const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; -pub fn latest_block_hash() -> Hash { - storage::get(LATEST_BLOCK_HASH).expect("There must always be a latest block") +storage_items! { + ExtrinsicIndex: b"sys:xti" => required u32; + ExtrinsicData: b"sys:xtd" => required map [ u32 => Vec ]; + // The current block number being processed. Set by `execute_block`. + Number: b"sys:num" => required BlockNumber; + ParentHash: b"sys:pha" => required Hash; } pub fn balance_of(who: AccountId) -> u64 { @@ -43,62 +46,79 @@ pub fn nonce_of(who: AccountId) -> u64 { } /// Get authorities ar given block. -pub fn authorities() -> Vec { +pub fn authorities() -> Vec<::primitives::AuthorityId> { let len: u32 = storage::unhashed::get(AUTHORITY_COUNT).expect("There are always authorities in test-runtime"); (0..len) .map(|i| storage::unhashed::get(&i.to_keyed_vec(AUTHORITY_AT)).expect("Authority is properly encoded in test-runtime")) .collect() } +pub fn initialise_block(header: Header) { + // populate environment. + ::put(&header.number); + ::put(&header.parent_hash); + ::put(0); +} + /// Actually execute all transitioning for `block`. pub fn execute_block(block: Block) { let ref header = block.header; - // check parent_hash is correct. - assert!( - header.number > 0 && latest_block_hash() == header.parent_hash, - "Parent hash should be valid." - ); - // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = block.extrinsics.iter().map(Slicable::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); let txs_root = enumerated_trie_root(&txs).into(); info_expect_equal_hash(&header.extrinsics_root, &txs_root); assert!(header.extrinsics_root == txs_root, "Transaction trie root must be valid."); // execute transactions - block.transactions.iter().for_each(execute_transaction_backend); + block.extrinsics.iter().for_each(execute_transaction_backend); // check storage root. let storage_root = storage_root().into(); info_expect_equal_hash(&header.state_root, &storage_root); assert!(header.state_root == storage_root, "Storage root must match that calculated."); - - // put the header hash into storage. - storage::put(LATEST_BLOCK_HASH, &header.blake2_256()); } /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. -pub fn execute_transaction(utx: UncheckedTransaction, header: Header) -> Header { +pub fn execute_transaction(utx: Extrinsic) { + let extrinsic_index = ExtrinsicIndex::get(); + ExtrinsicData::insert(extrinsic_index, utx.encode()); + ExtrinsicIndex::put(extrinsic_index + 1); execute_transaction_backend(&utx); - header } -/// Finalise the block - it is up the caller to ensure that all header fields are valid -/// except state-root. -pub fn finalise_block(mut header: Header) -> Header { - header.state_root = storage_root().into(); - header +/// Finalise the block. +pub fn finalise_block() -> Header { + let extrinsic_index = ExtrinsicIndex::take(); + let txs: Vec<_> = (0..extrinsic_index).map(ExtrinsicData::take).collect(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let extrinsics_root = enumerated_trie_root(&txs).into(); + + let number = ::take(); + let parent_hash = ::take(); + let storage_root = BlakeTwo256::storage_root(); + + Header { + number, + extrinsics_root, + state_root: storage_root, + parent_hash, + digest: Default::default(), + } } -fn execute_transaction_backend(utx: &UncheckedTransaction) { +fn execute_transaction_backend(utx: &Extrinsic) { + use runtime_primitives::traits::Checkable; + // check signature - let ref tx = utx.tx; - let msg = ::codec::Slicable::encode(tx); - assert!(ed25519_verify(&utx.signature.0, &msg, &tx.from), - "All transactions should be properly signed"); + let utx = match utx.clone().check() { + Ok(tx) => tx, + Err(_) => panic!("All transactions should be properly signed"), + }; + + let tx: ::Transfer = utx.transfer; // check nonce let nonce_key = tx.from.to_keyed_vec(NONCE_OF); @@ -111,9 +131,9 @@ fn execute_transaction_backend(utx: &UncheckedTransaction) { // check sender balance let from_balance_key = tx.from.to_keyed_vec(BALANCE_OF); let from_balance: u64 = storage::get_or(&from_balance_key, 0); - assert!(tx.amount <= from_balance, "All transactions should transfer at most the sender balance"); // enact transfer + assert!(tx.amount <= from_balance, "All transactions should transfer at most the sender balance"); let to_balance_key = tx.to.to_keyed_vec(BALANCE_OF); let to_balance: u64 = storage::get_or(&to_balance_key, 0); storage::put(&from_balance_key, &(from_balance - tx.amount)); @@ -144,7 +164,7 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::{Joiner, KeyedVec}; use keyring::Keyring; - use ::{Header, Digest, Transaction, UncheckedTransaction}; + use ::{Header, Digest, Extrinsic, Transfer}; fn new_test_ext() -> TestExternalities { map![ @@ -157,9 +177,9 @@ mod tests { ] } - fn construct_signed_tx(tx: Transaction) -> UncheckedTransaction { - let signature = Keyring::from_raw_public(tx.from).unwrap().sign(&tx.encode()); - UncheckedTransaction { tx, signature } + fn construct_signed_tx(tx: Transfer) -> Extrinsic { + let signature = Keyring::from_raw_public(tx.from.0).unwrap().sign(&tx.encode()).into(); + Extrinsic { transfer: tx, signature } } #[test] @@ -176,7 +196,7 @@ mod tests { let b = Block { header: h, - transactions: vec![], + extrinsics: vec![], }; with_externalities(&mut t, || { @@ -189,8 +209,8 @@ mod tests { let mut t = new_test_ext(); with_externalities(&mut t, || { - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 111); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 0); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 111); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 0); }); let b = Block { @@ -198,13 +218,13 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("0dd8210adaf581464cc68555814a787ed491f8c608d0a0dbbf2208a6d44190b1").into(), - extrinsics_root: hex!("5e44188712452f900acfa1b4bf4084753122ea1856d58187dd33374a2ca653b1").into(), + extrinsics_root: hex!("951508f2cc0071500a74765ab0fb2f280fdcdd329d5f989dda675010adee99d6").into(), digest: Digest { logs: vec![], }, }, - transactions: vec![ - construct_signed_tx(Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), + extrinsics: vec![ + construct_signed_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Bob.to_raw_public().into(), amount: 69, nonce: 0, }) @@ -214,40 +234,40 @@ mod tests { with_externalities(&mut t, || { execute_block(b.clone()); - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 42); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 69); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 42); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 69); }); let b = Block { header: Header { - parent_hash: b.header.blake2_256().into(), + parent_hash: b.header.hash(), number: 2, - state_root: hex!("aea7c370a9fa4075b703742c22cc4fb12759bdd7d5aa5cdd85895447f838b81b").into(), - extrinsics_root: hex!("9ac45fbcc93fa6a8b5a3c44f04d936d53569c72a53fbc12eb58bf884f6dbfae5").into(), + state_root: hex!("c93f2fd494c386fa32ee76b6198a7ccf5db12c02c3a79755fd2d4646ec2bf8d7").into(), + extrinsics_root: hex!("3563642676d7e042c894eedc579ba2d6eeedf9a6c66d9d557599effc9f674372").into(), digest: Digest { logs: vec![], }, }, - transactions: vec![ - construct_signed_tx(Transaction { - from: Keyring::Bob.to_raw_public(), - to: Keyring::Alice.to_raw_public(), + extrinsics: vec![ + construct_signed_tx(Transfer { + from: Keyring::Bob.to_raw_public().into(), + to: Keyring::Alice.to_raw_public().into(), amount: 27, nonce: 0, }), - construct_signed_tx(Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Charlie.to_raw_public(), + construct_signed_tx(Transfer { + from: Keyring::Alice.to_raw_public().into(), + to: Keyring::Charlie.to_raw_public().into(), amount: 69, nonce: 1, - }) + }), ], }; with_externalities(&mut t, || { execute_block(b); - assert_eq!(balance_of(Keyring::Alice.to_raw_public()), 0); - assert_eq!(balance_of(Keyring::Bob.to_raw_public()), 42); - assert_eq!(balance_of(Keyring::Charlie.to_raw_public()), 69); + assert_eq!(balance_of(Keyring::Alice.to_raw_public().into()), 0); + assert_eq!(balance_of(Keyring::Bob.to_raw_public().into()), 42); + assert_eq!(balance_of(Keyring::Charlie.to_raw_public().into()), 69); }); } } diff --git a/substrate/test-runtime/src/transaction.rs b/substrate/test-runtime/src/transaction.rs deleted file mode 100644 index 19ddba99e4ef3..0000000000000 --- a/substrate/test-runtime/src/transaction.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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 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. If not, see . - -//! A toy transaction. - -use rstd::prelude::*; -use codec::{Input, Slicable, Joiner}; -use super::AccountId; - -/// An instruction to do something. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct Transaction { - /// Who is sending. - pub from: AccountId, - /// Who to send to. - pub to: AccountId, - /// How much to send. - pub amount: u64, - /// How many transactions `self.from` already sent. - pub nonce: u64, -} - -impl Slicable for Transaction { - fn decode(input: &mut I) -> Option { - Some(Transaction { - from: Slicable::decode(input)?, - to: Slicable::decode(input)?, - amount: Slicable::decode(input)?, - nonce: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - Vec::new() - .and(&self.from) - .and(&self.to) - .and(&self.amount) - .and(&self.nonce) - } -} - - - -#[cfg(test)] -mod tests { - use super::*; - use keyring::Keyring; - - #[test] - fn test_tx_encoding() { - let tx = Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), - amount: 69, - nonce: 33, - }; - - assert_eq!(tx.encode(), vec![ - // from - 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, - // to - 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, - // amount - 69, 0, 0, 0, 0, 0, 0, 0, - // nonce - 33, 0, 0, 0, 0, 0, 0, 0 - ]); - } -} diff --git a/substrate/test-runtime/src/unchecked_transaction.rs b/substrate/test-runtime/src/unchecked_transaction.rs deleted file mode 100644 index 0aff8d472738e..0000000000000 --- a/substrate/test-runtime/src/unchecked_transaction.rs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate. - -// Substrate 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 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. If not, see . - -//! A toy unchecked transaction complete with signature. - -use rstd::prelude::*; -use codec::{Input, Slicable}; -use super::{Signature, Transaction}; - -/// A transactions right from the external world. Unchecked. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct UncheckedTransaction { - /// The actual transaction information. - pub tx: Transaction, - /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. - pub signature: Signature, -} - -impl Slicable for UncheckedTransaction { - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usua since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of u32, which has the total number of bytes following (we don't need - // to use this). - let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; - Some(UncheckedTransaction { - tx: Slicable::decode(input)?, - signature: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - // need to prefix with the total length as u32 to ensure it's binary comptible with - // Vec. we'll make room for it here, then overwrite once we know the length. - v.extend(&[0u8; 4]); - - self.tx.using_encoded(|s| v.extend(s)); - self.signature.using_encoded(|s| v.extend(s)); - - let length = (v.len() - 4) as u32; - length.using_encoded(|s| v[0..4].copy_from_slice(s)); - - v - } -} - - - -#[cfg(test)] -mod tests { - use super::*; - use keyring::Keyring; - use ::Transaction; - - #[test] - fn test_unchecked_encoding() { - let tx = Transaction { - from: Keyring::Alice.to_raw_public(), - to: Keyring::Bob.to_raw_public(), - amount: 69, - nonce: 34, - }; - let signature = Keyring::from_raw_public(tx.from).unwrap().sign(&tx.encode()); - let signed = UncheckedTransaction { tx, signature }; - - assert_eq!(signed.encode(), vec![ - // length - 144, 0, 0, 0, - // from - 209, 114, 167, 76, 218, 76, 134, 89, 18, 195, 43, 160, 168, 10, 87, 174, 105, 171, 174, 65, 14, 92, 203, 89, 222, 232, 78, 47, 68, 50, 219, 79, - // to - 215, 86, 142, 95, 10, 126, 218, 103, 168, 38, 145, 255, 55, 154, 196, 187, 164, 249, 201, 184, 89, 254, 119, 155, 93, 70, 54, 59, 97, 173, 45, 185, - // amount - 69, 0, 0, 0, 0, 0, 0, 0, - // nonce - 34, 0, 0, 0, 0, 0, 0, 0, - // signature - 207, 69, 156, 55, 7, 227, 202, 3, 114, 111, 43, 46, 227, 38, 39, 122, 245, 69, 195, 117, 190, 154, 89, 76, 134, 91, 251, 230, 31, 221, 1, 194, 144, 34, 33, 58, 220, 154, 205, 135, 224, 52, 248, 198, 12, 17, 96, 53, 110, 160, 194, 10, 9, 60, 40, 133, 57, 112, 151, 200, 105, 198, 245, 10 - ]); - } -} diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index e64a66e462bd2..a57d2e899b0bb 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -11,19 +11,9 @@ name = "base58" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bigint" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bitflags" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -37,32 +27,54 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cc" -version = "1.0.4" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] -name = "coco" -version = "0.1.1" +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "crossbeam-deque" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "constant_time_eq" -version = "0.1.3" +name = "crossbeam-utils" +version = "0.2.2" 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)", +] [[package]] name = "crunchy" @@ -75,20 +87,15 @@ version = "0.1.0" dependencies = [ "base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "either" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "elastic-array" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -99,15 +106,37 @@ name = "environmental" version = "0.1.0" [[package]] -name = "ethcore-bigint" +name = "ethbloom" +version = "0.5.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)", + "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.64 (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 = "ethereum-types" +version = "0.3.2" +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)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ethereum-types-serialize" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -119,12 +148,23 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fixed-hash" +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)", + "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 = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -148,29 +188,34 @@ dependencies = [ [[package]] name = "hex-literal" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "keccak-hash" +name = "integer-sqrt" version = "0.1.0" +source = "git+https://github.com/paritytech/integer-sqrt-rs.git#886e9cb983c46498003878afe965d55caa762025" + +[[package]] +name = "keccak-hash" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -178,9 +223,14 @@ name = "lazy_static" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazy_static" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" -version = "0.2.36" +version = "0.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -196,9 +246,14 @@ name = "log" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memoffset" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memory_units" version = "0.3.0" @@ -209,12 +264,17 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -230,39 +290,31 @@ name = "parity-wasm" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (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.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 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)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plain_hasher" -version = "0.1.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)", -] - [[package]] name = "proc-macro-hack" version = "0.4.0" @@ -276,12 +328,20 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "proc-macro2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" dependencies = [ "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -290,8 +350,11 @@ version = "0.1.0" [[package]] name = "quote" -version = "0.3.15" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rand" @@ -299,7 +362,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -309,7 +372,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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -318,19 +381,19 @@ name = "rayon" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "coco 0.1.1 (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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -340,20 +403,19 @@ 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.36 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.41 (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" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", ] @@ -369,10 +431,10 @@ source = "git+https://github.com/rphmeier/rustc-hex.git#ee2ec40b9062ac7769ccb9dc [[package]] name = "rustc_version" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -382,7 +444,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "semver" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -395,31 +457,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.27" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "serde_derive_internals" -version = "0.19.0" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -436,17 +489,17 @@ name = "substrate-primitives" version = "0.1.0" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "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)", "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", - "wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -455,12 +508,27 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "environmental 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-state-machine 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-runtime-primitives" +version = "0.1.0" +dependencies = [ + "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", + "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", ] [[package]] @@ -469,7 +537,7 @@ version = "0.1.0" dependencies = [ "pwasm-alloc 0.1.0", "pwasm-libc 0.1.0", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -477,9 +545,9 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -490,10 +558,10 @@ dependencies = [ name = "substrate-state-machine" version = "0.1.0" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", - "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -501,46 +569,43 @@ name = "substrate-test-runtime" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "hex-literal 0.1.0 (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)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] [[package]] name = "syn" -version = "0.11.11" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "synom" -version = "0.11.3" +name = "tiny-keccak" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tiny-keccak" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "triehash" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rlp 0.2.1 (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)", + "keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -556,14 +621,25 @@ name = "uint" version = "0.1.2" source = "git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm#8dc457899afdaf968ff7f16140b03d1e37b01d71" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uint" +version = "0.2.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)", + "heapsize 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_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-xid" -version = "0.0.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -573,10 +649,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -603,67 +679,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" -"checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" -"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"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 byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" -"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" -"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" -"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" -"checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" -"checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" +"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" +"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386" +"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6" +"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" -"checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" -"checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" -"checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" +"checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" +"checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" +"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" -"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206" "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 memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"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 owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-wasm 0.27.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4dc02a80a0315b109e48992c46942c79bcdb8fac416dd575d330ed9ced6cbd" -"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd" -"checksum parking_lot_core 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "9f35048d735bb93dd115a0030498785971aab3234d311fbe273d020084d26bd8" -"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" -"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum proc-macro2 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1fa93823f53cfd0f5ac117b189aed6cfdfb2cfc0a9d82e956dd7927595ed7d46" +"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" -"checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rlp 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "89db7f8dfdd5eb7ab3ac3ece7a07fd273a680b4b224cb231181280e8996f9f0b" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" "checksum rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)" = "" -"checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69" +"checksum rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a54aa04a10c68c1c4eacb4337fd883b435997ede17a9385784b990777686b09a" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" -"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" -"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" -"checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9" +"checksum serde 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "fba5be06346c5200249c8c8ca4ccba4a09e8747c71c16e420bd359a0db4d8f91" +"checksum serde_derive 1.0.64 (registry+https://github.com/rust-lang/crates.io-index)" = "79e4620ba6fbe051fc7506fab6f84205823564d55da18d55b695160fb3479cd8" +"checksum smallvec 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03dab98ab5ded3a8b43b2c80751194608d0b2aa0f1d46cf95d1c35e192844aa7" "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b" -"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e9241752647ca572f12c9b520a5d360d9099360c527770647e694001646a1d0" -"checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum syn 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6dfd71b2be5a58ee30a6f8ea355ba8290d397131c00dfa55c3d34e6e13db5101" +"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f" +"checksum triehash 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2033893a813c70e7d8a739ca6c36dc0a7a2c913ec718d7cbf84a3837bbe3c7ce" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" -"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273" +"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" -"checksum wasmi 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26b20dbeb7caee04597a5d2c93e2b3e64872c6ea2af732d7ad49dbec44067c35" +"checksum wasmi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d19da510b59247935ad5f598357b3cc739912666d75d3d28318026478d95bbdb" "checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/substrate/test-runtime/wasm/Cargo.toml b/substrate/test-runtime/wasm/Cargo.toml index 3d6a1de63ce41..99d86cd6a4c5b 100644 --- a/substrate/test-runtime/wasm/Cargo.toml +++ b/substrate/test-runtime/wasm/Cargo.toml @@ -12,6 +12,7 @@ substrate-runtime-std = { path = "../../runtime-std", default-features = false } substrate-runtime-io = { path = "../../runtime-io", default-features = false } substrate-runtime-support = { path = "../../runtime-support", default-features = false } substrate-primitives = { path = "../../primitives", default-features = false } +substrate-runtime-primitives = { path = "../../runtime/primitives", default-features = false } [features] default = [] @@ -24,6 +25,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-runtime-primitives/std" ] [lib] diff --git a/substrate/test-runtime/wasm/genesis.wasm b/substrate/test-runtime/wasm/genesis.wasm index c182bcf42f3e9fd559dfbb162e8558913033ff2e..94bf42b3f97dd3681b0d3e541fb5a276868960b4 100644 GIT binary patch literal 20332 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 EzvZjmF#rGn literal 17273 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 diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index bb95320a5f13b87c830cc7b3c80699e37ed9fca6..94bf42b3f97dd3681b0d3e541fb5a276868960b4 100644 GIT binary patch literal 20332 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 EzvZjmF#rGn literal 21385 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�gybYqm4gt#dPT7S73>Spea?J!jDSwgL^Z`x(y)df%_hNWinGE|nJzXW zsWY@P7WY9L$ngsW9G6Ik_0SBsfC)^SJ>|0EO%9Aum>bH%@^#53ICzzWx< zvlfmaCc0Gv8~kqKl7(R~_SMeIcu2ip`*fz6o++D$qfqYuaENZ6=oH#IBaDj4}($ zR+>^p9Gwq-YQc>Qd?tnaBgdN#k*HP$?imTlStrg<@G2wAYQv8ZbOGhGpo9)ex><9k z8nU^q8|*jGq3ldzU^MCjV>vB4CT7PFIU#m{(n*NOvlbVMIz9Y(j->BJGIlk#qqbxH zv5T~RW{>}RCO^gP1trgN+LPW5lKh#>pk&~f;2)fHiW8BNjWBb0#Y!H<{B?Hb&tlb{ zWT$66NeP&_ib(NZZxpogQ(7|54Jd4}v#KZm1t!6{{uj9JP(IrF=}$8Wp{h8&G}Kwjzoh1Rxhpl$k7y ztgod}g&1Z!+qyjP1r+9}?pSehWR@?}WtGv_@nR?=)j}r&@}lLnB*g|nL??+Gm-MGg zI?e|W)N+u{k!QnpYCe5*8%bWS5EpfLVCyAZFj8(L|Zah?vIhu!p2zMp?(6V@Q+n=K)N{qMjO~NCg}k+a2|QMftRc(UslC%L!o% z5SG6WMOf)J7?D!F-mnNNp{^7HAW&CV98+l_Zc8Seb{W9mica?(opLFiR6Zfbl%Z4M z5jx$Uq|;sN6%|q{#Hu(U$*Oo*l<#X-1{m$ICWM(7S8*;R3ngx+h`~5)Guf3KeED+KB zAcTpVX9&ympLwL%uOn3TGyLUcuugCYvjT_g!eYZN#+lqIPAq2ThJZI=6L$k7w~kHR zH@aHQ+cfT~0DK`mOwu=2IQZn#+H?5IX>n{IL##gpfoa$>mL&b82xWFOf!@@P(NT`s z;m-=nmUIiFvZd@oWxf!bD~$rTsE{Q^;zh&?vw0qMJH?ejQg#)I&+I$VtPReS%u|R? z4p|wyY2{UX0&KSXD_qqoD%u7T+bSJD*A%Wl9nEl!kSKk|1?x#?)>2N>b(J?sQxqX< zk<&U5%{x>9Bgc^w5@eDqZ|b@qmmsx1H9lVP|YU4#lr^Lg2 zGep#>ovv@2bq=(3)}0LJSgkOZm~bmRmjselXxktZ-AbQNyt5U!tn5slm2{kHw%JPD zICdvGR^mpov({GP#4#ELoyR00T%M=G zx4d!ydBQ^ydcJK(%9a*9qekx``=oqY8sz=K6S--^y4>x8&O{$zX>~N~n_#(cE=1e; zyVA%hpmWC8LbdA()z~^r{-?_vEaSeyl9;&9Tp#-hP@u>aEP}W+3{)qKNgA=B4&!)* z`XsC%ZnStM4fP~yjFeYOU14gwO{~-=S;_?K*h#g-NNq@8Ic*c+?-TW5!wHwDb)iHO zR+#jlcdDOpzTj?X0P@j9naO6;C{XPnmWCNl-URe6x}(_Rz5=9U>opNYr~-FsXLrsQ z**qu1io4wQJ(dcx3I%KW`{1}josxjf>@(&{afRg-ABoz?%0D))`0WXG-;^7Rkq}B{ z2*o*?Bc#d}SGag=OsM<*1flLbLXG1JRY0gL+=^9!bIw9$<0wYpK7>+`Z1i@tm?cQ& z4?ln$OXxVP5lNB=c^t?V6vav~bYS@qkPsmJiSC))eo#0}oSjPmDb98_EMtEvgNemU z>L*N}`di!~>6kFa$7#J=dj?1K&<6Q1BAuwW$V2rfjp#8Vbyoz}awT3qxh?!+J**Tk z8(O=x`9bKy8mB-8>)13f4J}NuY;M(0#7uKtWS=V@nd*8MrENE>0 zRK>t4=Z=h@sshpJ=n?&XIYAKKyvPD0^_$Q(%5Zs%6lElIY=$X}aiQlJ3&5P%YvZ#c zH`j}aK`^6spNNjF_1LUYVY!1ZOgfDTyJl9+g@jUI-XLojf59aR#H+rGHpFUP#~7)t z>G-HNUNdUMYMYl?cM{L*c*mzUPJDD+BU0=C-lxGJJmm_cZj3+r}Un*=nL znXDz0%z>B5T2hwknye*d5h}BYqG+bmBK=9li^h6~IXl*F4arO*L%dIk3Yjz)2`Dm* z#v<(@23h`vi)&*~;~`CMEh3|*d{CwsUd+i_rZ&27J5EiKVRHjG+Hr{mPs2G0a`Awb zFf7?c9#7{;PE)OoEWT4EE7|XpL=`JNpv@G}O8PaNmgUX` zU48RpJ#=vO^C#=0v_3jnFOnL3xRKcKMDCONkK!dBvXSLq6>@pt zZ`kjp!poFkf}+maDaEl=%m?3S1lq-T7rdHi;=@Da$P$T&GzZ)=KNvAdgs`TME>D|G zWMx(+u}I3kl_>>6O)tUFT~(WzjWVx|5TUZfrj(NFQ~J>*STr3LLKHNJBZPrO zn;9Hmz(CSX839YCl!Q~ks7W09Jr=FZKHEWCyZs{3PFG1A2?+tV35*_yt7a#*r%l!4 zl>nt=P|}s?s5e^)m^w(_DmFG455P;xJABat(Mqtnq8^!!795K{Y$ z2A8lpJZg=g_F0Udj@`ijo9wjN;9vB=Yd>oRut zFU8t8#Digwf}1;{T^RpSm6G9b4zhzo)R?M$mNkojQQ_M}fEofyTu&T#p2ug>x!EYw znS+|h4ftEV@H$VX zOuKC)#b;DZ4jL%hPZ*QKI6IiLs~>jEtqfNDz@`4*caJ-#b>-qe=Yo)1X=vOX!sg_s zg&*!d8jR;U8iio613^Nhf5T;Fue<-_s&H!TbEyQ7jXKxRoPv6e`^ zozjY_jL(_2x)4fLSUK32*dNDwppbV=t1MW+_umm!IFS<&l74BkRRLrYu6h9kKBm0{ z0=`3m;o{DJZq8#V{7S-pKCf428M%Z}_3hY`4JP;D zq}FG7;FD`)t&qiYJh+lCGn%-=b7C;FokI!n^Oyu;S;-wg_BZbGBNw?=eCLI*CSh^z z)~*P6}dVzbp;YPOr5 zX1CdE_M6L#&BevV*5cA)d$F_FUF_qD>-KuRes8(o>@W6P{iS}p-|2Vzy?(#HybOxV zOur21Wri(N<$1p6{ud?B@G(#I(O>kKHdSd1UxFFF9!2{%M$!Ie#HU?e8AhA?htbi_ z*7{IYJHx$KM%N;!yS{%oe188xAAW(hjQub;938Gd&sYXr9Bf2edk0LkF&GV^gTwus zTN}fTXtW>AMSFwY;S2iy%nNby5t>`k){#0L3=em1MZ>-IeRba2i$=qv(dQ1GIJhC8 z_|moE;V>HLZ|Akat)pn-TQ(05+Tn9PMZAtT8xpjgfuy=JMd^TC}%6iiWS= z80>t@eKaW2cYPuow>ucEUyDZ92BTcGG;-g#0<}Qog+uvIszJOp3^o)0Q zqKVJv97RXh_HXP!0)0|vb9fj5X?GutM%RYX(Gb=gM#&q3*SoKMANP_ z=wOKBU0YsXZ+90r7uN>O-pW&k;qJk?Vj@=`Qw1{hbn?Nn^Y*>6XPy&rU276oU zlJ$?5Hw7EN4zO;Xc@g5Bi7h4B|4Sff0_{!m6=g(#C zu+>`YtS#cmo1GyZd*u@gkB7SiSn%i%Hx`#WgF$nxJs39I-IZrwp6tJbYIWL1=B?d> z9V4Jtw6Fk@3kzS|Iy%@H+_Gw{sXcETZT*d*D5!NXL$kHkTHM%d4~b$1i;J5pk;KjD z(lJ}vYTAP};^Buof-P@|0YrWfS_m-D> z9m1yO#ztqQ(Mm^jU0krZG<^L4FJyDDcJS+W*ZQ5cUVmw++1=b+U-{%qjOlc2(R1It zBwg#x4Qy>M*}sV(J%$eBRWELC4mQ@>L{yutjdpW$W$yVDlcj^v;o{N;fdflkg?{VO zgJzqEt35;&mN%LkgW<~We3=1DT|?tB^A7fIEiA-)x19d#n}PCNt6N%9w@Xww-0ZeC z*ZTdn^~IG>O@2A=(iFv*|~tLYhf!=?6S8*U6Xmzw?c&eF$vUR@VMwR(^F?%?X$0DSjMzS_&pL8rOV*=VW!sj0PPT}XI zhMnG{+#lnTn6K-@Tf+_QCKkS;H#rHpgw|+()ta=^fb{Gl)_dK~aM)cMb~?+;D+{sK q))~V~$h~@Wkw=mH!V~@rxM% diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 43b67db5299070af44fc4527d9e053087b89adb7..45ee6c9b1867f4627385ed4f3c8c868d512e5f6c 100755 GIT binary patch literal 22430 zcmch9ZH!#kdEWh+@0r~pCCjoXM`x}#=`xj8Gy65WY60_Zva%T4i6Rq)5foU?&fXPw zxnG){r9>d*P8&vL8aH7ar&iH4A<{IolMvC51a$%bSOi8Zv_Zk9M#>)!zyd-c6h^@x z2C4!D+~;}EIrrX~T}qVPl*`?@=j%Q1dB4wl&RnOnzwJ7X<9?xb(Qz*NhlhvGMfcD> zlt+BHD0@?atQLZrAZxQDnt> zFOHpn#W5E5dK)|am4p8Jf|FxqEv?)+*mm-)dy;iAigB;gkJncEy^VOKx4YYS3T)Q% z#M|AytByZZvAw4&Dg>|{Z*T8jiHE!F$9-M#IJ>+W_gD7&yS>h<@e0t|bt(i`WmEt4 z-8WWR(+iHvs&Q6ftnIB4$>4q|enYRPEsOts-%#L@@3?`R^L^h70zX&G1*LL1SI*_!pj<8lId{(uf}HObHGXwtXXRk$^^Ki1=Lu;9y*^d2bb5+aq|ceW zVdB$)Fz?fq&O!guZf~Q%5$`)cUfqKVDe{uP-}40Yb#xgT5_Kj(7IIp@l>g;dT~%`GzcCmL9H%nwL`VM=Pxar?<$vqC z-l2DnKgx-M%}LJ*edS(O-p|z>T#0T579 zE}kmm6}yD`*EqzfjG>tr)_)w^2o9KyJ&t zMOBX8*lbi#>8Vm9@Xv{ic$-=fDF6W;AxT9HC_)rJS92-~vT`}{uSD)eV@vT}`BS18e*s%(aUb{;4Pl;ttNE~>HfXTmWq5Vgw?^D(ou@#R`xjjO5} z17?95vy$6Doo1pM1A60)Di$rk8$~XUl@>-7(q91xZ&TG&#Y(=*^|-3c6;&W5PolKs zw0#H9b*$7rqgT;9>yN4`shslb*ArGN_pI-<9rC@tsl236+*CzdP`-ZhKw|RNU|&Hw z&vHqxhM1^LEgQ!*?$2E}I0QY5l)Q!qCi^6H6c}m=WC;E|a1l<3P$>~6^xlLXfbdX; zsK{R!4xcnfg#q9$*I-vbXg`wQ^CuaKph0T^a3F(c$qBN}dx65dVm2Ty!REYI#2SpX zu+}578gG(*sS)|d!$nvUw3b0rjhcQGV^ulu+(ZAG(WU0)(AD%(&RMSxLB>b1;qyam zAT%>_h!ob<_McSllG_HRZuGr>f+^;`IvQNCUw84_zCwl9_9vxYZPtH}s5q7X2F0=p zTu&7krncS)w8Ve#Us~m22#tZrsQ}Pw6%lq26S4_ir4a#R!vZw`OoKL4$7mgj%6-;x zLg@5M;7}?0q5E2+TrI#(PkLAqB;Sdi=HN-MdPn-@5A%}T(1GMCI$#3R0R#EU;sdCixGO3qSO6oFnHj+*3(GzQ2GuW zK)wpJ@(n6cg1EbBF_u+?K?CYt;@o9DH)tvJla;tIX22a*$&9Khn8{6!s`}b4=4u5_ zQzjNKjH*Wgz*E79yX(79+wL&qe-$7GTcjTMb=wVwbi8DQniVg=7$SeE6! zSQCUmRG42ZBB0bM$ch8I3-Z1Q=KuqMKb)*YWK=*#1KpR13b6$GF35!@%d=$N0eBvk z8zpow>jMKTBwS6&3L90kK!F6X6a`0>NkAA<185A(0s%`xC{-iXs>ve9Ks7+EvUW^U zEd{D6X2HoK5~vkYtO{@$ih=wBsFtCapq5fB2ckmWODedmiksv-w4x9lZiWRh`8lrY9tBxu-*F}P^h4jO5g*h9#b zG1Fll!qRXw@u0sH1`rS2$7TVfs3LUWFvl2kNGAwLvb&HI4yL29t&my3PQer)L>VwC z3?Z}i36Tq*kh+M-sr<6*y4JKyP zwN4)av_;OPn@3y&--$TPE4Br(A7~s93t2Z0bPfK>Z*w*Ef2RF9_BJ(V>EFEfU%r0( z-~X@w`pv`2e=N$brD7>@*GXpc&P9LCs39t8un~+!{Z|MlI;02mD8o&1)%HVG6XA5y z4N@O`vF2#T^RMzIy=Ex8Hvi62?#(c`jTiwI8z$X``gxTz0UBaO(hwk@q^p&uIt-g= zaK4fA&qaCDwY-eL&QoO|q`akk+nd$h9rXArQPxGow`EnPG*zPfW>_U-VT*v&W>|}y zN#}PZOmf&=Z8B(v*=461BD~0X-uYK-|2u4F=-Xuc#Ga}Gn21dER8V+M!7+M@8mCZU zWmA)!2m^d8FNLZ=(M${hqb`{&$d?)LUN0kYEYeZBc8$eo4TjrV4@q7b#|!7Hr^R zS6RPJL@)}Ax}iss^3oc;?^q(4-e}5JQZxpTulHRHxQYEeWZmp`MTu^D(N}+!>!nFS zdmW1yP(=p1FAOq;nOZ|oH?ch$&&r4Cs51ogoZuo047n5{5rte#4yGMHO64v?d7nYr zx)_w9qC_VFa!&js9hX%gl|wvN zs2^S9f;1+&AoO$4vouxpA3G+As z8q5SfSw-P8tTIv}6tSz3Hjs>RX;?)9Yw~g&`IE9rT%$E0hEeMk-4M3uVSNDaX>Qss%D!{G!Pz8ONt*}P(q9Je|1jg@2 zA}|dIFhc-$Ijn0o3YDoM00t^EHEksb`%^P{S%(rIi(W^XUdW1S`mrpcZAD$vD}Rh$ zM_GE^l3prrsS&YaNV-`uD&9wMGPeMRMmr=`{5^ zFiGmgh2EEy*#6+Vb06yf{tnkc0l#JKH>~%GmH*#nr_ShwQDgKI^~EgqLy*UQ^b{kD z)AQbS=(jp$*o0-?@Vs;UQKyXyLkh5rNQ7Z(k!FvyxKG}KT&e(b&dok~nwS%jc4q1! z?Z#+9iJNvfKKhx{i0wgGO0A5NecD+NxsggHjvG8g&@fhsQW?XE zD3}e9O>02e00SE621M7kLCY#L`4LUpNDK5FxJye07{`b+(=D0#F@=b?RscH(pwP+Q zLTv^LAkdz(HibYVskAfW<3(}7kgT&X1Jpi;B38tQ_*HBzx%XzGn_b`rKs=^Iw3C#= zgfYQVc$S-bpe2P_83fgo(%&_nRtn#7z{8~DU!Wv5RocFf68(uD_AW|dWu@(VC`o`J zrSGByw4^5%n$h`s63PjO1E`4{+fX*J^}vycPu2P0crnL#F(-*f2+DOimN5sgCtH>J zO^T$GoT2%ZqwBcglUheZDelKHOPZ*W5Uqqk&U^ng@k=d>HjVrbDcR0)gn9>WYl1=BO` zV;~ATl9o_(I}vP^tDMV>GCf!V2QjZB1cy<95>En7SiBRKmTtP&!m>DwK$UrB42J=B z=^wr2vd7{eR6!N>d1e>;$$^X2(`5Rl7zd%nlJoNt8<8B9=%#Bt8n7vG z-Vl4)+q5hW%|lH&=fg2LG~mqR&T+WCni@NU@TIQC&!4#iWQp>r+v=2zuAK>yBxU*s z*%usf5OF2Dih}WXNJo?a!xfM>-7QRrop5q8ibzfitHLglsa87<%jI5p2`d@w{gNtQ zXZ8W8lSzlg0g60l636lvx#N=~RW+rZfjPhri;P%SDTU8YIc%*>|5 zup)6hGz9k)!l4IrNBK5n4Z|U08pzP_cYUZXwODq>_h|wlK;MEyEa7DDZQ9DWnUk`7 z;G&QUy6J8k+YT}LR=~8`r1v%wvngq@PoRaEllrx-EO~F>?jNMblR@D3}sOY-l7!8a40vq@3A# zNB5-!`Z{Eq@WHMBu|RVT9#%(ccmTFw z)r0{2Xz_(ar~wQhk*xs~M5VTd>=Z6*W`WKX+a%lrg;RKMYuYB@v@AeUg#y2AsLEcC zL{;5UXsoH48Cfe3=A?IBj$LZTU7?N#gd#Z*Iv6?s9O^#UO%0_raCrjbQgGH$SjNFt zf{ntskC!$1fdJqvVt4^8I~i0SHM&*Hh-pRdyFoUmQo7Av#`G~Eqf_dV%Tc+HxNv<( zBbUzgF1(pJ^Z0)HXfif^AY&3XlrfX9xktIjnD6n^oPgZNGfEI%I6l_XOAaM%Y#!0( zA#Df{{l27j%&oEL+u72a<4E*)*D8kvBzw%Yh@&*u_&1m6q4oACP)TZMfc1#&Vf@OF z(;AeBEnF@J0UJbFe=y)aE4unm)+GHoIm#_G!Au~)cA)i~=jgK!SrlngkX zrejzG@Qvj}rH((1~$?PNRup0M2K1#*_3|(4?V|<1uv-Y-?)Lunmt%21@8S zxfwnIdawXUpv!)KFoeVWfWcw+sh`8+O+3V)2xKt^N-!Xo9e zk}f4BqjW14bV>Mc^yU}qa3DZQKGA`s2`BYdoJs9uAx`uTO0qAO zVRuoowt+!d8pk+1%}DgnA?uQywu4iqG~@d?gcqB1a`U}3)A(@;d-oI*G~@DD_gII>p{rW&TFLr`Aq&yFn}G= z5W%@jUX7+{;8m7zg$4U{lRk}(Y?`3*e&GAr!}F zfGBnv_AVlO0AF8ZzDf3YkT4turQ37K*!W3Mhuq+iV*vs>l#CDMyWndgc)$K5MXUTsv%-_Zmkzw#vUbg3Ndmc)LO$!iuWg zl+J*)mkAsE0ulxtrm9aKM0B{~QZkIoDMqW8c;&EooI{nx3I$=yn2 z_p=%+-7874X-!onZe1x1(h1(z#+77(fqXYfg}TuvpeEm;2F%f&) z17`UAhSw;;Tb0q5sW`4!=R+iIf=nB-{JPCt_;90p($7dX2?c(f8oZwLeeO4=O+0{38B!pa4F zH^z;y2>e~xJdXKYChLLuJDynFlNpX(3WldkuneckJ5D_C0T*&H;74XSe1NQ{%EVP! zRsI3)B7G=*PsGV$gU|P~3{|)W2;n&nb#%!e0V>x%>HUQq)Y!N|*L_>+yfjsXet#@= z$rpLx&;3p9vc@aX*GI0CeOURs*#uAY{h`uzSeWDsgx@Z@d7JckkS2Yot&e=cjE2Xn z%Mpi+Lxk}b6#3_wnVt^Im zc0YGvYL4*4sQP3RsP%HZ!@Ew{LB#(rgAZq=@bQ+pS*4x6$5(*W{5Ug3}7-c*Y+m8cSX@gQ@u7@3#5U} zpK1lAFH8e|2kr-V7%+v!&YmCqh=QsKVlNk>1dTGs7n0T1W`KA9Mh$_@^J2^g+zAws zG%02ZqRlZs>`owPfAXEc=s$=Z3hnjOzk0&2$%(Q}8)LuVX>2hI*yocnkXZRh6*=J^ z(gsvwn|c!NVZ_TG><@ncgc)!K2qk&mCp@oiKeE^Z5HA;QU<43BNhpJ z3UaT+>;K49j9MgK^*?TrZZW?B6Jjh8z7j>;Dh4-Lq6}`<5*d`rG(6~OZie4-VJ5K? zbRapC7^aUgVW)VF9N)oBu6hsLu&nQv*Jy>3Z|CxW8($Qz0U~5b4xzF}=(^irq75rV zHYSx%L>9vEoP?@A{6PW~mO*ecFNhR5U?-!iG(Xzd&#`Pu_4a~`t zp(5_u^BV}*<__Ix!qK~*nF3!9z>zS&v4Bet`Wq!UZRgh*&U_wmAAscTRVM#VIL@m~ zpsBu(ih*>qH4e zDCHyre4fR1EDxJ8n0O=a$ze4JNJ&sU0hshAle231B8wrgPHoZHP`$9<({xYHs>vEM zVmK*Bp`}I=ldLSH7urYV;Y3>n2oIGBU_{8r>=eFrW4`>OcQr^l$zGCYBaeX2quHq? z7YCazE;ueZxC432Qd$2oYQgNeVe-ZDQIj@WJ_+aK?*1c?@Iwg5Y?on=w!%ZDqAjt@ zMTlgodZd!Fgr=79dscEknSw%jKoW>&SnP;Lo5Qxk12r;sKRpexawJC|nhnX}iFmM! zhTGs`FeFr?6w#N>#R3`Ya?wtw-3&?tjbkB6h3hJ8-LYk{!LRhfbR!pkwMhmLn+p;3 zfNof=#w8~Uf(Q(t4ZQy%MsfJP1tP-+J97sDs%{43d$Q)KJnYLsiGd40W5Y9iGskrF zkI#IO=9kI~Rn|u>B)%xKDbs4B3>D6t{vkzn%O%tCB`}(zQ|Y!!Uk>FVKEAKq@cnb> zhIbR#O96C;)^71jlL$>qykv)bN~MCXb%M)$)d!aS%TQ(z$vS~F4~5xLIq7{F=^lpG z#L%Ir$p%PcEM>7w`d*}z!5Z?%^hZ)9VggcTqD>)$)Zv*a;2p;aomqOCifr#pntlYK ziy4Hp*d|B{Qmh+AjCCJ~+{34X@TCMWme&#`Yo2YL5JGF@Ffou42HELXZ@8NLkSVPN zLtk}cEx&|=-~pWtdH7{F4%2d@H$6A>T?{MnO%9vY7rUDL-j~oFXR;6voWYxD11?tB z3wk3``7#_DiZ6%wk{P^jdP*P{W|Cbzwok6v#jA>ZjjVj<`tdM+)ck(a!)tv^OpRlp zU;-iM!0{-&xQ~bjK2kXCn>TVbH!mnbHCSp9?$?_sk5dwcJ>bXYOT}nsJ-6qm5sG{P4#!xgxcwB$L1wk zYGYsR?Do~p!PeHZs(&f&#p}C0U<(}8YOFfy3SI(*aaZ@^SK`+WHhKVps)Kkx>9et; z47B}zZx?Uo`Y1qO;G3#mh|KG%u5u`l-HUr$S5>^z-6hhPpbvzf>uFN%U)_JhO2#_0H9Om3aZyN#pUVGJ@H=)X~s3Uh3>$5=vl^ovknF*MTX%4ot6e zyVLJp0)aYx)$MF`54QN8vndiB0Q&JZXuh+%(~VyMFFX8@L9&^SMkffzlz2QeEu~C*YNq0ssA&S zCo}agoB9s=|752A3Z6M`2K7^!`fGS5{PzI|xvK>J4O8z_3tJmIm!XQj_uB>M8})!1 z;@+w^oy;5Z+~nnW-pG6L{LE|RAXvde--egVya+F!Ja6w6vai1@+6KJYt#sl`@5)2( zyQ_@8>aLnW2XDEn9ecsu*ztGUji2yZyZXV(FZ}H6;>yGqE=-7lnwqi}YU-8F>whoq zvgN|WPfbi5OgAT@iO*e_;BTuXy`dm@Mc?$o%EUo?6Znc}!vx}{`wZ4360n^S2h_;!p)wTw4#TrD6Y%R9i@$BO2OnYH=c73t6eEOA- zhj6F<`dWI`;VZAvw(_Vheyp!+oqP&uCcX#^}Kl&`|t%c5dtFt=2 z*qo1Bt;OXhj=%8llRt&UOgHxrR$*01OJn_3Hg>0*C%tMB*w4q!nT1w&Zn`tu1=#iF zCtm}Qg;th@bTCtfcLxi?Gjgx9FHB6Qqv=J@{jH5|XLT!{n);G?;*fc5nlWW}Zmqo# zch;Jnx#oPUJHPxX^Pa+|>}v|~azc4a;nU_Ng`bvp6#m$=UExtgL&U|HqL}<1;3p4ABYpuDNczqUx`|<3XBY)!9izENm zpShT;H4CMN>ZihDWfSiT-NvgXuf+RPQ?JH5csnLU=p~3p+~a_sJ=k8wlQ9@{x!}4j z{`AJHaPsHjOFynqLSP}ZSXO&+HeQ1)#H;ao9ItnmCx_p6dG;z+v7jwmx(LP?R?DWQ zmhG!Bv%F6`f3SL_n80$)cAKr$<}{wByURcMH$8QtnXPzreQj-adb&M3x7t~sUH;o| zaMfDCjXlpAgA1c%&-VEelm`?+m@;JZ&&wEy|KfUYcY9?6Dhcwhb!VD0tE=-1?U{w{ z!pzL_vtPo@)6*&SvZS8Z0n~KczLGQ(HLa|6x|cC2fUd@^g~ip?xYJx%n}*^pKR5c$ z(y5VGmOg(Gv(B}T>qUx(;o{}^YP=@2_&lFz9qGrW`@1XB#Hbu7Ot%-sSFO&hw%{bD Gm;Wz@9g0!_ literal 22955 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