diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index bfd6a53401fd2e91efba82bace238e5647409c15..bb58d5fd5ed4c4126b028aa37c1dd18244260e94 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -451,7 +451,7 @@ dependencies = [ [[package]] name = "ed25519" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" 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)", @@ -491,7 +491,7 @@ dependencies = [ [[package]] name = "environmental" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" [[package]] name = "error-chain" @@ -1737,30 +1737,11 @@ dependencies = [ name = "polkadot-cli" version = "0.3.0" dependencies = [ - "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "polkadot-primitives 0.1.0", - "polkadot-runtime 0.1.0", "polkadot-service 0.3.0", - "polkadot-transaction-pool 0.1.0", - "slog 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-cli 0.3.0 (git+https://github.com/paritytech/substrate)", - "substrate-client 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-codec 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-extrinsic-pool 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-network 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-primitives 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-rpc 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-rpc-servers 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-runtime-primitives 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-service 0.3.0 (git+https://github.com/paritytech/substrate)", - "substrate-state-machine 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-telemetry 0.3.0 (git+https://github.com/paritytech/substrate)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1915,7 +1896,6 @@ dependencies = [ "polkadot-transaction-pool 0.1.0", "slog 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-codec 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-network 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-primitives 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-runtime-io 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -1999,7 +1979,7 @@ dependencies = [ [[package]] name = "pwasm-alloc" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "pwasm-libc 0.1.0 (git+https://github.com/paritytech/substrate)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2008,7 +1988,7 @@ dependencies = [ [[package]] name = "pwasm-libc" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" [[package]] name = "quick-error" @@ -2508,7 +2488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "substrate-bft" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2527,7 +2507,7 @@ dependencies = [ [[package]] name = "substrate-cli" version = "0.3.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" 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)", @@ -2545,7 +2525,6 @@ dependencies = [ "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-client 0.1.0 (git+https://github.com/paritytech/substrate)", - "substrate-extrinsic-pool 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-network 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-network-libp2p 0.1.0 (git+https://github.com/paritytech/substrate)", "substrate-runtime-primitives 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2559,7 +2538,7 @@ dependencies = [ [[package]] name = "substrate-client" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2589,7 +2568,7 @@ dependencies = [ [[package]] name = "substrate-client-db" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common.git)", "kvdb 0.1.0 (git+https://github.com/paritytech/parity-common.git)", @@ -2611,7 +2590,7 @@ dependencies = [ [[package]] name = "substrate-codec" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2619,7 +2598,7 @@ dependencies = [ [[package]] name = "substrate-codec-derive" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "proc-macro2 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2629,7 +2608,7 @@ dependencies = [ [[package]] name = "substrate-executor" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2655,7 +2634,7 @@ dependencies = [ [[package]] name = "substrate-extrinsic-pool" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2663,13 +2642,14 @@ dependencies = [ "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-runtime-primitives 0.1.0 (git+https://github.com/paritytech/substrate)", "transaction-pool 1.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "substrate-keyring" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2679,7 +2659,7 @@ dependencies = [ [[package]] name = "substrate-keystore" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2695,7 +2675,7 @@ dependencies = [ [[package]] name = "substrate-network" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2717,7 +2697,7 @@ dependencies = [ [[package]] name = "substrate-network-libp2p" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2740,7 +2720,7 @@ dependencies = [ [[package]] name = "substrate-primitives" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2766,7 +2746,7 @@ dependencies = [ [[package]] name = "substrate-rpc" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", @@ -2788,7 +2768,7 @@ dependencies = [ [[package]] name = "substrate-rpc-servers" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "jsonrpc-core 8.0.2 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-http-server 8.0.1 (git+https://github.com/paritytech/jsonrpc.git)", @@ -2803,7 +2783,7 @@ dependencies = [ [[package]] name = "substrate-runtime-consensus" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2820,7 +2800,7 @@ dependencies = [ [[package]] name = "substrate-runtime-council" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "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)", @@ -2844,7 +2824,7 @@ dependencies = [ [[package]] name = "substrate-runtime-democracy" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2866,7 +2846,7 @@ dependencies = [ [[package]] name = "substrate-runtime-executive" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2882,7 +2862,7 @@ dependencies = [ [[package]] name = "substrate-runtime-io" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "environmental 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2897,7 +2877,7 @@ dependencies = [ [[package]] name = "substrate-runtime-primitives" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2915,7 +2895,7 @@ dependencies = [ [[package]] name = "substrate-runtime-sandbox" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2928,7 +2908,7 @@ dependencies = [ [[package]] name = "substrate-runtime-session" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2949,7 +2929,7 @@ dependencies = [ [[package]] name = "substrate-runtime-staking" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2972,7 +2952,7 @@ dependencies = [ [[package]] name = "substrate-runtime-std" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "pwasm-alloc 0.1.0 (git+https://github.com/paritytech/substrate)", "pwasm-libc 0.1.0 (git+https://github.com/paritytech/substrate)", @@ -2982,7 +2962,7 @@ dependencies = [ [[package]] name = "substrate-runtime-support" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "ed25519 0.1.0 (git+https://github.com/paritytech/substrate)", "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2997,7 +2977,7 @@ dependencies = [ [[package]] name = "substrate-runtime-system" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3014,7 +2994,7 @@ dependencies = [ [[package]] name = "substrate-runtime-timestamp" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3032,7 +3012,7 @@ dependencies = [ [[package]] name = "substrate-runtime-version" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3045,7 +3025,7 @@ dependencies = [ [[package]] name = "substrate-serializer" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "serde 1.0.71 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3054,7 +3034,7 @@ dependencies = [ [[package]] name = "substrate-service" version = "0.3.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "exit-future 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3086,7 +3066,7 @@ dependencies = [ [[package]] name = "substrate-state-db" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3098,7 +3078,7 @@ dependencies = [ [[package]] name = "substrate-state-machine" version = "0.1.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.2.1 (git+https://github.com/paritytech/parity-common.git)", @@ -3116,7 +3096,7 @@ dependencies = [ [[package]] name = "substrate-telemetry" version = "0.3.0" -source = "git+https://github.com/paritytech/substrate#f3709852138d0bd2348d7e13505777c7acb7551e" +source = "git+https://github.com/paritytech/substrate#fa1392a80371818f2ca6069f9c1e6445d42ea467" dependencies = [ "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index cecfe86f5dbdc9a7eb273699b7a546f8d283a1f2..a3ab18f0f575aa24ff3651488421c1ac9d6b0fcc 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -5,29 +5,9 @@ authors = ["Parity Technologies <admin@parity.io>"] description = "Polkadot node implementation in Rust." [dependencies] -clap = { version = "~2.32", features = ["yaml"] } -error-chain = "0.12" log = "0.3" -slog = "^2" -lazy_static = "1.0" tokio = "0.1.7" futures = "0.1.17" -parking_lot = "0.4" exit-future = "0.1" substrate-cli = { git = "https://github.com/paritytech/substrate" } -substrate-client = { git = "https://github.com/paritytech/substrate" } -substrate-codec = { git = "https://github.com/paritytech/substrate" } -substrate-extrinsic-pool = { git = "https://github.com/paritytech/substrate" } -substrate-network = { git = "https://github.com/paritytech/substrate" } -substrate-primitives = { git = "https://github.com/paritytech/substrate" } -substrate-rpc = { git = "https://github.com/paritytech/substrate" } -substrate-rpc-servers = { git = "https://github.com/paritytech/substrate" } -substrate-runtime-primitives = { git = "https://github.com/paritytech/substrate" } -substrate-service = { git = "https://github.com/paritytech/substrate" } -substrate-state-machine = { git = "https://github.com/paritytech/substrate" } -substrate-telemetry = { git = "https://github.com/paritytech/substrate" } -polkadot-primitives = { path = "../primitives" } -polkadot-runtime = { path = "../runtime" } polkadot-service = { path = "../service" } -polkadot-transaction-pool = { path = "../transaction-pool" } - diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index 244fdeb55df26e369c07de11017c77b5610a38a4..944f3f85d5d49796f996a3d33c26cefd51dc892f 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -231,7 +231,10 @@ fn make_group_info(roster: DutyRoster, authorities: &[AuthorityId], local_id: Au } /// Polkadot proposer factory. -pub struct ProposerFactory<C, N, P> { +pub struct ProposerFactory<C, N, P> + where + P: PolkadotApi + Send + Sync + 'static +{ /// The client instance. pub client: Arc<P>, /// The transaction pool. @@ -407,7 +410,7 @@ struct LocalDuty { } /// The Polkadot proposer logic. -pub struct Proposer<C: PolkadotApi> { +pub struct Proposer<C: PolkadotApi + Send + Sync> { client: Arc<C>, dynamic_inclusion: DynamicInclusion, local_key: Arc<ed25519::Pair>, @@ -587,10 +590,10 @@ impl<C> bft::Proposer<Block> for Proposer<C> let local_id = self.local_key.public().0.into(); let mut next_index = { - let cur_index = self.transaction_pool.cull_and_get_pending(BlockId::hash(self.parent_hash), |pending| pending - .filter(|tx| tx.sender().map(|s| s == local_id).unwrap_or(false)) + let cur_index = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending| pending + .filter(|tx| tx.verified.sender().map(|s| s == local_id).unwrap_or(false)) .last() - .map(|tx| Ok(tx.index())) + .map(|tx| Ok(tx.verified.index())) .unwrap_or_else(|| self.client.index(&self.parent_id, local_id)) ); @@ -636,9 +639,8 @@ impl<C> bft::Proposer<Block> for Proposer<C> index: extrinsic.index, function: extrinsic.function, }; - let uxt = UncheckedExtrinsic::new(extrinsic, signature); - - self.transaction_pool.import_unchecked_extrinsic(BlockId::hash(self.parent_hash), uxt) + let uxt: Vec<u8> = Decode::decode(&mut UncheckedExtrinsic::new(extrinsic, signature).encode().as_slice()).expect("Encoded extrinsic is valid"); + self.transaction_pool.submit_one(&BlockId::hash(self.parent_hash), uxt) .expect("locally signed extrinsic is valid; qed"); } } @@ -720,7 +722,7 @@ impl ProposalTiming { } /// Future which resolves upon the creation of a proposal. -pub struct CreateProposal<C: PolkadotApi> { +pub struct CreateProposal<C: PolkadotApi + Send + Sync> { parent_hash: Hash, parent_number: BlockNumber, parent_id: BlockId, @@ -732,7 +734,7 @@ pub struct CreateProposal<C: PolkadotApi> { offline: SharedOfflineTracker, } -impl<C> CreateProposal<C> where C: PolkadotApi { +impl<C> CreateProposal<C> where C: PolkadotApi + Send + Sync { fn propose_with(&self, candidates: Vec<CandidateReceipt>) -> Result<Block, Error> { use polkadot_api::BlockBuilder; use runtime_primitives::traits::{Hash as HashT, BlakeTwo256}; @@ -767,18 +769,18 @@ impl<C> CreateProposal<C> where C: PolkadotApi { { let mut unqueue_invalid = Vec::new(); - let result = self.transaction_pool.cull_and_get_pending(BlockId::hash(self.parent_hash), |pending_iterator| { + let result = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending_iterator| { let mut pending_size = 0; for pending in pending_iterator { - if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } + if pending_size + pending.verified.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - match block_builder.push_extrinsic(pending.primitive_extrinsic()) { + match block_builder.push_extrinsic(pending.original.clone()) { Ok(()) => { - pending_size += pending.encoded_size(); + pending_size += pending.verified.encoded_size(); } Err(e) => { trace!(target: "transaction-pool", "Invalid transaction: {}", e); - unqueue_invalid.push(pending.hash().clone()); + unqueue_invalid.push(pending.verified.hash().clone()); } } } @@ -819,7 +821,7 @@ impl<C> CreateProposal<C> where C: PolkadotApi { } } -impl<C> Future for CreateProposal<C> where C: PolkadotApi { +impl<C> Future for CreateProposal<C> where C: PolkadotApi + Send + Sync { type Item = Block; type Error = Error; diff --git a/polkadot/consensus/src/service.rs b/polkadot/consensus/src/service.rs index b7302b5d430d0c6e5b4c2f728fcfd1ebdcbaa797..b2880a575226b9c1dcaf773f017668a5656a6c04 100644 --- a/polkadot/consensus/src/service.rs +++ b/polkadot/consensus/src/service.rs @@ -227,7 +227,6 @@ impl Service { let last_agreement = s.last_agreement(); let can_build_upon = last_agreement .map_or(true, |x| !x.live || x.parent_hash != hash); - if hash == prev_best && can_build_upon { debug!("Starting consensus round after a timeout"); start_bft(best_block, s.clone()); diff --git a/polkadot/network/src/lib.rs b/polkadot/network/src/lib.rs index 48b382f66258e7cda7f9e37c3267687abce3d641..5fcd6a951606328b0c7f1f8dbb6f1b5e850ee4c0 100644 --- a/polkadot/network/src/lib.rs +++ b/polkadot/network/src/lib.rs @@ -73,7 +73,7 @@ pub const DOT_PROTOCOL_ID: ::substrate_network::ProtocolId = *b"dot"; type FullStatus = GenericFullStatus<Block>; /// Specialization of the network service for the polkadot protocol. -pub type NetworkService = ::substrate_network::Service<Block, PolkadotProtocol>; +pub type NetworkService = ::substrate_network::Service<Block, PolkadotProtocol, Hash>; /// Status of a Polkadot node. #[derive(Debug, PartialEq, Eq, Clone, Encode, Decode)] diff --git a/polkadot/service/Cargo.toml b/polkadot/service/Cargo.toml index b6a32b04b39293825d416d2bda0c0c14a2a066b0..2de430603a3490df7d38fa9ecd2fdfab519ceac8 100644 --- a/polkadot/service/Cargo.toml +++ b/polkadot/service/Cargo.toml @@ -24,6 +24,5 @@ substrate-runtime-io = { git = "https://github.com/paritytech/substrate" } substrate-primitives = { git = "https://github.com/paritytech/substrate" } substrate-network = { git = "https://github.com/paritytech/substrate" } substrate-client = { git = "https://github.com/paritytech/substrate" } -substrate-codec = { git = "https://github.com/paritytech/substrate" } substrate-service = { git = "https://github.com/paritytech/substrate" } substrate-telemetry = { git = "https://github.com/paritytech/substrate" } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 4e59a22ca2b1fbfcc819faae8d6385972c243293..ae6d4779b1bbcf6a2400b04298584161e1c84920 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -29,7 +29,6 @@ extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_network; extern crate substrate_primitives as primitives; extern crate substrate_network as network; -extern crate substrate_codec as codec; extern crate substrate_client as client; extern crate substrate_service as service; extern crate tokio; @@ -42,14 +41,12 @@ extern crate hex_literal; pub mod chain_spec; use std::sync::Arc; -use std::collections::HashMap; - -use codec::{Encode, Decode}; +use tokio::prelude::{Stream, Future}; use transaction_pool::TransactionPool; use polkadot_api::{PolkadotApi, light::RemotePolkadotApiWrapper}; use polkadot_primitives::{parachain, AccountId, Block, BlockId, Hash}; use polkadot_runtime::GenesisConfig; -use client::Client; +use client::{Client, BlockchainEvents}; use polkadot_network::{PolkadotProtocol, consensus::ConsensusNetwork}; use tokio::runtime::TaskExecutor; use service::FactoryFullConfiguration; @@ -63,7 +60,7 @@ pub use client::ExecutionStrategy; pub type ChainSpec = service::ChainSpec<GenesisConfig>; /// Polkadot client type for specialised `Components`. pub type ComponentClient<C> = Client<<C as Components>::Backend, <C as Components>::Executor, Block>; -pub type NetworkService = network::Service<Block, <Factory as service::ServiceFactory>::NetworkProtocol>; +pub type NetworkService = network::Service<Block, <Factory as service::ServiceFactory>::NetworkProtocol, Hash>; /// A collection of type to generalise Polkadot specific components over full / light client. pub trait Components: service::Components { @@ -106,16 +103,11 @@ pub struct Factory; impl service::ServiceFactory for Factory { type Block = Block; + type ExtrinsicHash = Hash; type NetworkProtocol = PolkadotProtocol; type RuntimeDispatch = polkadot_executor::Executor; - type FullExtrinsicPool = TransactionPoolAdapter< - service::FullBackend<Self>, - service::FullExecutor<Self>, - service::FullClient<Self> - >; - type LightExtrinsicPool = TransactionPoolAdapter< - service::LightBackend<Self>, - service::LightExecutor<Self>, + type FullExtrinsicPoolApi = transaction_pool::ChainApi<service::FullClient<Self>>; + type LightExtrinsicPoolApi = transaction_pool::ChainApi< RemotePolkadotApiWrapper<service::LightBackend<Self>, service::LightExecutor<Self>> >; type Genesis = GenesisConfig; @@ -124,25 +116,17 @@ impl service::ServiceFactory for Factory { const NETWORK_PROTOCOL_ID: network::ProtocolId = ::polkadot_network::DOT_PROTOCOL_ID; fn build_full_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc<service::FullClient<Self>>) - -> Result<Self::FullExtrinsicPool, Error> + -> Result<TransactionPool<service::FullClient<Self>>, Error> { let api = client.clone(); - Ok(TransactionPoolAdapter { - pool: Arc::new(TransactionPool::new(config, api)), - client: client, - imports_external_transactions: true, - }) + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(api))) } fn build_light_extrinsic_pool(config: ExtrinsicPoolOptions, client: Arc<service::LightClient<Self>>) - -> Result<Self::LightExtrinsicPool, Error> + -> Result<TransactionPool<RemotePolkadotApiWrapper<service::LightBackend<Self>, service::LightExecutor<Self>>>, Error> { let api = Arc::new(RemotePolkadotApiWrapper(client.clone())); - Ok(TransactionPoolAdapter { - pool: Arc::new(TransactionPool::new(config, api)), - client: client, - imports_external_transactions: false, - }) + Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(api))) } fn build_network_protocol(config: &Configuration) @@ -182,8 +166,18 @@ impl <C: Components> Service<C> { pub fn new_light(config: Configuration, executor: TaskExecutor) -> Result<Service<LightComponents<Factory>>, Error> { - let service = service::Service::<LightComponents<Factory>>::new(config, executor)?; + let service = service::Service::<LightComponents<Factory>>::new(config, executor.clone())?; let api = Arc::new(RemotePolkadotApiWrapper(service.client())); + let pool = service.extrinsic_pool(); + let events = service.client().import_notification_stream() + .for_each(move |notification| { + // re-verify all transactions without the sender. + pool.retry_verification(&BlockId::hash(notification.hash), None) + .map_err(|e| warn!("Error re-verifying transactions: {:?}", e))?; + Ok(()) + }) + .then(|_| Ok(())); + executor.spawn(events); Ok(Service { client: service.client(), network: service.network(), @@ -212,7 +206,16 @@ pub fn new_full(config: Configuration, executor: TaskExecutor) let is_validator = (config.roles & Roles::AUTHORITY) == Roles::AUTHORITY; let service = service::Service::<FullComponents<Factory>>::new(config, executor.clone())?; - + let pool = service.extrinsic_pool(); + let events = service.client().import_notification_stream() + .for_each(move |notification| { + // re-verify all transactions without the sender. + pool.retry_verification(&BlockId::hash(notification.hash), None) + .map_err(|e| warn!("Error re-verifying transactions: {:?}", e))?; + Ok(()) + }) + .then(|_| Ok(())); + executor.spawn(events); // Spin consensus service if configured let consensus = if is_validator { // Load the first available key @@ -261,103 +264,3 @@ impl<C: Components> ::std::ops::Deref for Service<C> { &self.inner } } - -/// Transaction pool adapter. -pub struct TransactionPoolAdapter<B, E, A> where A: Send + Sync, E: Send + Sync { - imports_external_transactions: bool, - pool: Arc<TransactionPool<A>>, - client: Arc<Client<B, E, Block>>, -} - -impl<B, E, A> TransactionPoolAdapter<B, E, A> - where - A: Send + Sync, - B: client::backend::Backend<Block, KeccakHasher, RlpCodec> + Send + Sync, - E: client::CallExecutor<Block, KeccakHasher, RlpCodec> + Send + Sync, -{ - fn best_block_id(&self) -> Option<BlockId> { - self.client.info() - .map(|info| BlockId::hash(info.chain.best_hash)) - .map_err(|e| { - debug!("Error getting best block: {:?}", e); - }) - .ok() - } -} - -impl<B, E, A> network::TransactionPool<Block> for TransactionPoolAdapter<B, E, A> - where - B: client::backend::Backend<Block, KeccakHasher, RlpCodec> + Send + Sync, - E: client::CallExecutor<Block, KeccakHasher, RlpCodec> + Send + Sync, - A: polkadot_api::PolkadotApi + Send + Sync, -{ - fn transactions(&self) -> Vec<(Hash, Vec<u8>)> { - let best_block_id = match self.best_block_id() { - Some(id) => id, - None => return vec![], - }; - self.pool.cull_and_get_pending(best_block_id, |pending| pending - .map(|t| { - let hash = t.hash().clone(); - (hash, t.primitive_extrinsic()) - }) - .collect() - ).unwrap_or_else(|e| { - warn!("Error retrieving pending set: {}", e); - vec![] - }) - } - - fn import(&self, transaction: &Vec<u8>) -> Option<Hash> { - if !self.imports_external_transactions { - return None; - } - - let encoded = transaction.encode(); - if let Some(uxt) = Decode::decode(&mut &encoded[..]) { - let best_block_id = self.best_block_id()?; - match self.pool.import_unchecked_extrinsic(best_block_id, uxt) { - Ok(xt) => Some(*xt.hash()), - Err(e) => match *e.kind() { - transaction_pool::ErrorKind::AlreadyImported(hash) => Some(hash[..].into()), - _ => { - debug!(target: "txpool", "Error adding transaction to the pool: {:?}", e); - None - }, - } - } - } else { - debug!(target: "txpool", "Error decoding transaction"); - None - } - } - - fn on_broadcasted(&self, propagations: HashMap<Hash, Vec<String>>) { - self.pool.on_broadcasted(propagations) - } -} - -impl<B, E, A> service::ExtrinsicPool<Block> for TransactionPoolAdapter<B, E, A> - where - B: client::backend::Backend<Block, KeccakHasher, RlpCodec> + Send + Sync + 'static, - E: client::CallExecutor<Block, KeccakHasher, RlpCodec> + Send + Sync + 'static, - A: polkadot_api::PolkadotApi + Send + Sync + 'static, -{ - type Api = TransactionPool<A>; - - fn prune_imported(&self, hash: &Hash) { - let block = BlockId::hash(*hash); - if let Err(e) = self.pool.cull(block) { - warn!("Culling error: {:?}", e); - } - - if let Err(e) = self.pool.retry_verification(block) { - warn!("Re-verifying error: {:?}", e); - } - } - - fn api(&self) -> Arc<Self::Api> { - self.pool.clone() - } -} - diff --git a/polkadot/transaction-pool/src/error.rs b/polkadot/transaction-pool/src/error.rs index 99281e8d7864174bdd43c71d0141cae90fb52377..66876bc6100ad882c0debaddab301b431ccd496e 100644 --- a/polkadot/transaction-pool/src/error.rs +++ b/polkadot/transaction-pool/src/error.rs @@ -14,14 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see <http://www.gnu.org/licenses/>. -use extrinsic_pool::{self, txpool}; +use extrinsic_pool; use polkadot_api; use primitives::Hash; use runtime::{Address, UncheckedExtrinsic}; error_chain! { links { - Pool(txpool::Error, txpool::ErrorKind); + Pool(extrinsic_pool::Error, extrinsic_pool::ErrorKind); Api(polkadot_api::Error, polkadot_api::ErrorKind); } errors { @@ -33,7 +33,7 @@ error_chain! { /// Attempted to queue an inherent transaction. IsInherent(xt: UncheckedExtrinsic) { description("Inherent transactions cannot be queued."), - display("Inehrent transactions cannot be queued."), + display("Inherent transactions cannot be queued."), } /// Attempted to queue a transaction with bad signature. BadSignature(e: &'static str) { @@ -63,10 +63,10 @@ error_chain! { } } -impl extrinsic_pool::api::Error for Error { - fn into_pool_error(self) -> ::std::result::Result<txpool::Error, Self> { +impl extrinsic_pool::IntoPoolError for Error { + fn into_pool_error(self) -> ::std::result::Result<extrinsic_pool::Error, Self> { match self { - Error(ErrorKind::Pool(e), c) => Ok(txpool::Error(e, c)), + Error(ErrorKind::Pool(e), c) => Ok(extrinsic_pool::Error(e, c)), e => Err(e), } } diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 3ba340921ac8a7df9e1d0999ef4585452026809b..eb048518af40545ff973f5d153093fb40c89cb44 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -38,26 +38,18 @@ mod error; use std::{ cmp::Ordering, - collections::{BTreeMap, HashMap}, - ops::Deref, + collections::HashMap, sync::Arc, }; use codec::{Decode, Encode}; -use extrinsic_pool::{ - api::{ExtrinsicPool, EventStream}, - txpool::{self, Readiness, scoring::{Change, Choice}}, - watcher::Watcher, - Pool, - Listener, -}; +use extrinsic_pool::{Readiness, scoring::{Change, Choice}, VerifiedFor, ExtrinsicFor}; use polkadot_api::PolkadotApi; -use primitives::{AccountId, BlockId, Hash, Index, UncheckedExtrinsic as FutureProofUncheckedExtrinsic}; +use primitives::{AccountId, BlockId, Block, Hash, Index}; use runtime::{Address, UncheckedExtrinsic}; -use substrate_primitives::Bytes; use substrate_runtime_primitives::traits::{Bounded, Checkable, Hash as HashT, BlakeTwo256}; -pub use extrinsic_pool::txpool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; +pub use extrinsic_pool::{Options, Status, LightStatus, VerifiedTransaction as VerifiedTransactionOps}; pub use error::{Error, ErrorKind, Result}; /// Maximal size of a single encoded extrinsic. @@ -68,28 +60,20 @@ const MAX_TRANSACTION_SIZE: usize = 4 * 1024 * 1024; /// Type alias for convenience. pub type CheckedExtrinsic = <UncheckedExtrinsic as Checkable<fn(Address) -> std::result::Result<AccountId, &'static str>>>::Checked; +/// Type alias for polkadot transaction pool. +pub type TransactionPool<A> = extrinsic_pool::Pool<ChainApi<A>>; + /// A verified transaction which should be includable and non-inherent. #[derive(Clone, Debug)] pub struct VerifiedTransaction { - original: UncheckedExtrinsic, inner: Option<CheckedExtrinsic>, sender: Option<AccountId>, hash: Hash, encoded_size: usize, + index: Index, } impl VerifiedTransaction { - /// Access the underlying transaction. - pub fn as_transaction(&self) -> &UncheckedExtrinsic { - &self.original - } - - /// Convert to primitive unchecked extrinsic. - pub fn primitive_extrinsic(&self) -> ::primitives::UncheckedExtrinsic { - Decode::decode(&mut self.as_transaction().encode().as_slice()) - .expect("UncheckedExtrinsic shares repr with Vec<u8>; qed") - } - /// Consume the verified transaction, yielding the checked counterpart. pub fn into_inner(self) -> Option<CheckedExtrinsic> { self.inner @@ -107,7 +91,7 @@ impl VerifiedTransaction { /// Get the account ID of the sender of this transaction. pub fn index(&self) -> Index { - self.original.extrinsic.index + self.index } /// Get encoded size of the transaction. @@ -121,7 +105,7 @@ impl VerifiedTransaction { } } -impl txpool::VerifiedTransaction for VerifiedTransaction { +impl extrinsic_pool::VerifiedTransaction for VerifiedTransaction { type Hash = Hash; type Sender = Option<AccountId>; @@ -138,139 +122,25 @@ impl txpool::VerifiedTransaction for VerifiedTransaction { } } -/// Scoring implementation for polkadot transactions. -#[derive(Debug)] -pub struct Scoring; - -impl txpool::Scoring<VerifiedTransaction> for Scoring { - type Score = u64; - type Event = (); - - fn compare(&self, old: &VerifiedTransaction, other: &VerifiedTransaction) -> Ordering { - old.index().cmp(&other.index()) - } - - fn choose(&self, old: &VerifiedTransaction, new: &VerifiedTransaction) -> Choice { - if old.is_fully_verified() { - assert!(new.is_fully_verified(), "Scoring::choose called with transactions from different senders"); - if old.index() == new.index() { - // TODO [ToDr] Do we allow replacement? If yes then it should be Choice::ReplaceOld - return Choice::RejectNew; - } - } - - // This will keep both transactions, even though they have the same indices. - // It's fine for not fully verified transactions, we might also allow it for - // verified transactions but it would mean that only one of the two is actually valid - // (most likely the first to be included in the block). - Choice::InsertNew - } - - fn update_scores( - &self, - xts: &[txpool::Transaction<VerifiedTransaction>], - scores: &mut [Self::Score], - _change: Change<()> - ) { - for i in 0..xts.len() { - if !xts[i].is_fully_verified() { - scores[i] = 0; - } else { - // all the same score since there are no fees. - // TODO: prioritize things like misbehavior or fishermen reports - scores[i] = 1; - } - } - } - - fn should_replace(&self, old: &VerifiedTransaction, _new: &VerifiedTransaction) -> Choice { - // Always replace not fully verified transactions. - match old.is_fully_verified() { - true => Choice::RejectNew, - false => Choice::ReplaceOld - } - } -} - -/// Readiness evaluator for polkadot transactions. -pub struct Ready<'a, A: 'a + PolkadotApi> { - at_block: BlockId, - api: &'a A, - known_nonces: HashMap<AccountId, ::primitives::Index>, +/// The polkadot transaction pool logic. +pub struct ChainApi<A> { + api: Arc<A>, } -impl<'a, A: 'a + PolkadotApi> Ready<'a, A> { - /// Create a new readiness evaluator at the given block. Requires that - /// the ID has already been checked for local corresponding and available state. - fn create(at: BlockId, api: &'a A) -> Self { - Ready { - at_block: at, +impl<A> ChainApi<A> where + A: PolkadotApi, +{ + const NO_ACCOUNT: &'static str = "Account not found."; + /// Create a new instance. + pub fn new(api: Arc<A>) -> Self { + ChainApi { api, - known_nonces: HashMap::new(), } } -} - -impl<'a, T: 'a + PolkadotApi> Clone for Ready<'a, T> { - fn clone(&self) -> Self { - Ready { - at_block: self.at_block.clone(), - api: self.api, - known_nonces: self.known_nonces.clone(), - } - } -} - -impl<'a, A: 'a + PolkadotApi> txpool::Ready<VerifiedTransaction> for Ready<'a, A> -{ - fn is_ready(&mut self, xt: &VerifiedTransaction) -> Readiness { - let sender = match xt.sender() { - Some(sender) => sender, - None => return Readiness::Future - }; - - trace!(target: "transaction-pool", "Checking readiness of {} (from {})", xt.hash, Hash::from(sender)); - - // TODO: find a way to handle index error properly -- will need changes to - // transaction-pool trait. - let (api, at_block) = (&self.api, &self.at_block); - let next_index = self.known_nonces.entry(sender) - .or_insert_with(|| api.index(at_block, sender).ok().unwrap_or_else(Bounded::max_value)); - - trace!(target: "transaction-pool", "Next index for sender is {}; xt index is {}", next_index, xt.original.extrinsic.index); - - let result = match xt.original.extrinsic.index.cmp(&next_index) { - // TODO: this won't work perfectly since accounts can now be killed, returning the nonce - // to zero. - // We should detect if the index was reset and mark all transactions as `Stale` for cull to work correctly. - // Otherwise those transactions will keep occupying the queue. - // Perhaps we could mark as stale if `index - state_index` > X? - Ordering::Greater => Readiness::Future, - Ordering::Equal => Readiness::Ready, - // TODO [ToDr] Should mark transactions referrencing too old blockhash as `Stale` as well. - Ordering::Less => Readiness::Stale, - }; - - // remember to increment `next_index` - *next_index = next_index.saturating_add(1); - - result - } -} - -pub struct Verifier<'a, A: 'a> { - api: &'a A, - at_block: BlockId, -} -impl<'a, A> Verifier<'a, A> where - A: 'a + PolkadotApi, -{ - const NO_ACCOUNT: &'static str = "Account not found."; - - fn lookup(&self, address: Address) -> ::std::result::Result<AccountId, &'static str> { + fn lookup(&self, at: &BlockId, address: Address) -> ::std::result::Result<AccountId, &'static str> { // TODO [ToDr] Consider introducing a cache for this. - match self.api.lookup(&self.at_block, address.clone()) { + match self.api.lookup(at, address.clone()) { Ok(Some(address)) => Ok(address), Ok(None) => Err(Self::NO_ACCOUNT.into()), Err(e) => { @@ -281,28 +151,32 @@ impl<'a, A> Verifier<'a, A> where } } -impl<'a, A> txpool::Verifier<UncheckedExtrinsic> for Verifier<'a, A> where - A: 'a + PolkadotApi, +impl<A> extrinsic_pool::ChainApi for ChainApi<A> where + A: PolkadotApi + Send + Sync, { - type VerifiedTransaction = VerifiedTransaction; + type Block = Block; + type Hash = Hash; + type Sender = Option<AccountId>; + type VEx = VerifiedTransaction; + type Ready = HashMap<AccountId, u32>; type Error = Error; + type Score = u64; + type Event = (); - fn verify_transaction(&self, uxt: UncheckedExtrinsic) -> Result<Self::VerifiedTransaction> { + fn verify_transaction(&self, at: &BlockId, xt: &ExtrinsicFor<Self>) -> Result<Self::VEx> { + let encoded = xt.encode(); + let uxt = UncheckedExtrinsic::decode(&mut encoded.as_slice()).ok_or_else(|| ErrorKind::InvalidExtrinsicFormat)?; if !uxt.is_signed() { bail!(ErrorKind::IsInherent(uxt)) } - let encoded = uxt.encode(); - let encoded_size = encoded.len(); - + let (encoded_size, hash) = (encoded.len(), BlakeTwo256::hash(&encoded)); if encoded_size > MAX_TRANSACTION_SIZE { bail!(ErrorKind::TooLarge(encoded_size, MAX_TRANSACTION_SIZE)); } - let hash = BlakeTwo256::hash(&encoded); debug!(target: "transaction-pool", "Transaction submitted: {}", ::substrate_primitives::hexdisplay::HexDisplay::from(&encoded)); - - let inner = match uxt.clone().check_with(|a| self.lookup(a)) { + let inner = match uxt.clone().check_with(|a| self.lookup(at, a)) { Ok(xt) => Some(xt), // keep the transaction around in the future pool and attempt to promote it later. Err(Self::NO_ACCOUNT) => None, @@ -317,157 +191,101 @@ impl<'a, A> txpool::Verifier<UncheckedExtrinsic> for Verifier<'a, A> where } Ok(VerifiedTransaction { - original: uxt, + index: uxt.extrinsic.index, inner, sender, hash, - encoded_size + encoded_size, }) } -} - -/// The polkadot transaction pool. -/// -/// Wraps a `extrinsic_pool::Pool`. -pub struct TransactionPool<A> { - inner: Pool<Hash, VerifiedTransaction, Scoring, Error>, - api: Arc<A>, -} -impl<A> TransactionPool<A> where - A: PolkadotApi, -{ - /// Create a new transaction pool. - pub fn new(options: Options, api: Arc<A>) -> Self { - TransactionPool { - inner: Pool::new(options, Scoring), - api, - } + fn ready(&self) -> Self::Ready { + HashMap::default() } - /// Attempt to directly import `UncheckedExtrinsic` without going through serialization. - pub fn import_unchecked_extrinsic(&self, block: BlockId, uxt: UncheckedExtrinsic) -> Result<Arc<VerifiedTransaction>> { - let verifier = Verifier { - api: &*self.api, - at_block: block, - }; - self.inner.submit(verifier, vec![uxt]).map(|mut v| v.swap_remove(0)) - } - - /// Retry to import all semi-verified transactions (unknown account indices) - pub fn retry_verification(&self, block: BlockId) -> Result<()> { - let to_reverify = self.inner.remove_sender(None); - let verifier = Verifier { - api: &*self.api, - at_block: block, + fn is_ready(&self, at: &BlockId, known_nonces: &mut Self::Ready, xt: &VerifiedFor<Self>) -> Readiness { + let sender = match xt.verified.sender() { + Some(sender) => sender, + None => return Readiness::Future }; - self.inner.submit(verifier, to_reverify.into_iter().map(|tx| tx.original.clone()))?; - Ok(()) - } - - /// Reverify transaction that has been reported incorrect. - /// - /// Returns `Ok(None)` in case the hash is missing, `Err(e)` in case of verification error and new transaction - /// reference otherwise. - /// - /// TODO [ToDr] That method is currently unused, should be used together with BlockBuilder - /// when we detect that particular transaction has failed. - /// In such case we will attempt to remove or re-verify it. - pub fn reverify_transaction(&self, block: BlockId, hash: Hash) -> Result<Option<Arc<VerifiedTransaction>>> { - let result = self.inner.remove(&[hash], false).pop().expect("One hash passed; one result received; qed"); - if let Some(tx) = result { - self.import_unchecked_extrinsic(block, tx.original.clone()).map(Some) - } else { - Ok(None) - } - } + trace!(target: "transaction-pool", "Checking readiness of {} (from {})", xt.verified.hash, Hash::from(sender)); - /// Cull old transactions from the queue. - pub fn cull(&self, block: BlockId) -> Result<usize> { - let ready = Ready::create(block, &*self.api); - Ok(self.inner.cull(None, ready)) - } + // TODO: find a way to handle index error properly -- will need changes to + // transaction-pool trait. + let api = &self.api; + let next_index = known_nonces.entry(sender) + .or_insert_with(|| api.index(at, sender).ok().unwrap_or_else(Bounded::max_value)); - /// Cull transactions from the queue and then compute the pending set. - pub fn cull_and_get_pending<F, T>(&self, block: BlockId, f: F) -> Result<T> where - F: FnOnce(txpool::PendingIterator<VerifiedTransaction, Ready<A>, Scoring, Listener<Hash>>) -> T, - { - let ready = Ready::create(block, &*self.api); - self.inner.cull(None, ready.clone()); - Ok(self.inner.pending(ready, f)) - } + trace!(target: "transaction-pool", "Next index for sender is {}; xt index is {}", next_index, xt.verified.index); - /// Remove a set of transactions idenitified by hashes. - pub fn remove(&self, hashes: &[Hash], is_valid: bool) -> Vec<Option<Arc<VerifiedTransaction>>> { - self.inner.remove(hashes, is_valid) - } -} + let result = match xt.verified.index.cmp(&next_index) { + // TODO: this won't work perfectly since accounts can now be killed, returning the nonce + // to zero. + // We should detect if the index was reset and mark all transactions as `Stale` for cull to work correctly. + // Otherwise those transactions will keep occupying the queue. + // Perhaps we could mark as stale if `index - state_index` > X? + Ordering::Greater => Readiness::Future, + Ordering::Equal => Readiness::Ready, + // TODO [ToDr] Should mark transactions referencing too old blockhash as `Stale` as well. + Ordering::Less => Readiness::Stale, + }; -impl<A> Deref for TransactionPool<A> { - type Target = Pool<Hash, VerifiedTransaction, Scoring, Error>; + // remember to increment `next_index` + *next_index = next_index.saturating_add(1); - fn deref(&self) -> &Self::Target { - &self.inner + result } -} -// TODO: more general transaction pool, which can handle more kinds of vec-encoded transactions, -// even when runtime is out of date. -impl<A> ExtrinsicPool<FutureProofUncheckedExtrinsic, BlockId, Hash> for TransactionPool<A> where - A: Send + Sync + 'static, - A: PolkadotApi, -{ - type Error = Error; - type InPool = BTreeMap<AccountId, Vec<Bytes>>; - - fn submit(&self, block: BlockId, xts: Vec<FutureProofUncheckedExtrinsic>) -> Result<Vec<Hash>> { - xts.into_iter() - .map(|xt| xt.encode()) - .map(|encoded| { - let decoded = UncheckedExtrinsic::decode(&mut &encoded[..]).ok_or(ErrorKind::InvalidExtrinsicFormat)?; - let tx = self.import_unchecked_extrinsic(block, decoded)?; - Ok(*tx.hash()) - }) - .collect() + fn compare(old: &VerifiedFor<Self>, other: &VerifiedFor<Self>) -> Ordering { + old.verified.index().cmp(&other.verified.index()) } - fn submit_and_watch(&self, block: BlockId, xt: FutureProofUncheckedExtrinsic) -> Result<Watcher<Hash>> { - let encoded = xt.encode(); - let decoded = UncheckedExtrinsic::decode(&mut &encoded[..]).ok_or(ErrorKind::InvalidExtrinsicFormat)?; - - let verifier = Verifier { - api: &*self.api, - at_block: block, - }; - - self.inner.submit_and_watch(verifier, decoded) - } + fn choose(old: &VerifiedFor<Self>, new: &VerifiedFor<Self>) -> Choice { + if old.verified.is_fully_verified() { + assert!(new.verified.is_fully_verified(), "Scoring::choose called with transactions from different senders"); + if old.verified.index() == new.verified.index() { + return Choice::ReplaceOld; + } + } - fn light_status(&self) -> LightStatus { - self.inner.light_status() + // This will keep both transactions, even though they have the same indices. + // It's fine for not fully verified transactions, we might also allow it for + // verified transactions but it would mean that only one of the two is actually valid + // (most likely the first to be included in the block). + Choice::InsertNew } - fn import_notification_stream(&self) -> EventStream { - self.inner.import_notification_stream() + fn update_scores( + xts: &[extrinsic_pool::Transaction<VerifiedFor<Self>>], + scores: &mut [Self::Score], + _change: Change<()> + ) { + for i in 0..xts.len() { + if !xts[i].verified.is_fully_verified() { + scores[i] = 0; + } else { + // all the same score since there are no fees. + // TODO: prioritize things like misbehavior or fishermen reports + scores[i] = 1; + } + } } - fn all(&self) -> Self::InPool { - self.inner.all(|it| it.fold(Default::default(), |mut map: Self::InPool, tx| { - // Map with `null` key is not serializable, so we fallback to default accountId. - map.entry(tx.sender().unwrap_or_default()) - .or_insert_with(Vec::new) - // use bytes type to make it serialize nicer. - .push(Bytes(tx.primitive_extrinsic())); - map - })) + fn should_replace(old: &VerifiedFor<Self>, _new: &VerifiedFor<Self>) -> Choice { + if old.verified.is_fully_verified() { + // Don't allow new transactions if we are reaching the limit. + Choice::RejectNew + } else { + // Always replace not fully verified transactions. + Choice::ReplaceOld + } } } #[cfg(test)] mod tests { use std::sync::{atomic::{self, AtomicBool}, Arc}; - use super::TransactionPool; use substrate_keyring::Keyring::{self, *}; use codec::{Decode, Encode}; use polkadot_api::{PolkadotApi, BlockBuilder, Result}; @@ -476,6 +294,8 @@ mod tests { use runtime::{RawAddress, Call, TimestampCall, BareExtrinsic, Extrinsic, UncheckedExtrinsic}; use primitives::parachain::{DutyRoster, Id as ParaId}; use substrate_runtime_primitives::{MaybeUnsigned, generic}; + use extrinsic_pool::Pool; + use super::ChainApi; struct TestBlockBuilder; impl BlockBuilder for TestBlockBuilder { @@ -545,7 +365,7 @@ mod tests { } } - fn uxt(who: Keyring, nonce: Index, use_id: bool) -> UncheckedExtrinsic { + fn uxt(who: Keyring, nonce: Index, use_id: bool) -> FutureProofUncheckedExtrinsic { let sxt = BareExtrinsic { signed: who.to_raw_public().into(), index: nonce, @@ -567,20 +387,20 @@ mod tests { )}, index: sxt.index, function: sxt.function, - }, MaybeUnsigned(sig.into())).using_encoded(|e| UncheckedExtrinsic::decode(&mut &e[..])).unwrap() + }, MaybeUnsigned(sig.into())).using_encoded(|e| FutureProofUncheckedExtrinsic::decode(&mut &e[..])).unwrap() } - fn pool(api: &TestPolkadotApi) -> TransactionPool<TestPolkadotApi> { - TransactionPool::new(Default::default(), Arc::new(api.clone())) + fn pool(api: &TestPolkadotApi) -> Pool<ChainApi<TestPolkadotApi>> { + Pool::new(Default::default(), ChainApi { api: Arc::new(api.clone()) }) } #[test] fn id_submission_should_work() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209)]); } @@ -588,9 +408,9 @@ mod tests { fn index_submission_should_work() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209)]); } @@ -598,10 +418,10 @@ mod tests { fn multiple_id_submission_should_work() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); } @@ -609,10 +429,10 @@ mod tests { fn multiple_index_submission_should_work() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); } @@ -620,9 +440,9 @@ mod tests { fn id_based_early_nonce_should_be_culled() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 208, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 208, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); } @@ -630,9 +450,9 @@ mod tests { fn index_based_early_nonce_should_be_culled() { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 208, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 208, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); } @@ -641,12 +461,12 @@ mod tests { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, true)).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, true)).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); } @@ -655,12 +475,12 @@ mod tests { let api = TestPolkadotApi::default(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, false)).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, false)).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![(Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210)]); } @@ -668,16 +488,16 @@ mod tests { fn index_then_id_submission_should_make_progress() { let api = TestPolkadotApi::without_lookup(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); api.enable_lookup(); - pool.retry_verification(BlockId::number(0)).unwrap(); + pool.retry_verification(&BlockId::number(0), None).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![ (Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210) @@ -688,15 +508,15 @@ mod tests { fn retrying_verification_might_not_change_anything() { let api = TestPolkadotApi::without_lookup(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, false)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, true)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); - pool.retry_verification(BlockId::number(1)).unwrap(); + pool.retry_verification(&BlockId::number(1), None).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); } @@ -704,19 +524,19 @@ mod tests { fn id_then_index_submission_should_make_progress() { let api = TestPolkadotApi::without_lookup(); let pool = pool(&api); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 209, true)).unwrap(); - pool.import_unchecked_extrinsic(BlockId::number(0), uxt(Alice, 210, false)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 209, true)).unwrap(); + pool.submit_one(&BlockId::number(0), uxt(Alice, 210, false)).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![ (Some(Alice.to_raw_public().into()), 209) ]); // when api.enable_lookup(); - pool.retry_verification(BlockId::number(0)).unwrap(); + pool.retry_verification(&BlockId::number(0), None).unwrap(); - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(0), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(0), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![ (Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210) @@ -728,10 +548,10 @@ mod tests { let api = TestPolkadotApi::default(); let pool = pool(&api); let block = BlockId::number(0); - pool.import_unchecked_extrinsic(block, uxt(Alice, 209, false)).unwrap(); - let hash = *pool.import_unchecked_extrinsic(block, uxt(Alice, 210, false)).unwrap().hash(); + pool.submit_one(&block, uxt(Alice, 209, false)).unwrap(); + let hash = *pool.submit_one(&block, uxt(Alice, 210, false)).unwrap().verified.hash(); - let pending: Vec<_> = pool.cull_and_get_pending(block, |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&block, |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![ (Some(Alice.to_raw_public().into()), 209), (Some(Alice.to_raw_public().into()), 210) @@ -745,13 +565,13 @@ mod tests { // after this, a re-evaluation of the second's readiness should result in it being thrown // out (or maybe placed in future queue). - let err = pool.reverify_transaction(BlockId::number(1), hash).unwrap_err(); + let err = pool.reverify_transaction(&BlockId::number(1), hash).unwrap_err(); match *err.kind() { ::error::ErrorKind::Msg(ref m) if m == "bad signature in extrinsic" => {}, ref e => assert!(false, "The transaction should be rejected with BadSignature error, got: {:?}", e), } - let pending: Vec<_> = pool.cull_and_get_pending(BlockId::number(1), |p| p.map(|a| (a.sender(), a.index())).collect()).unwrap(); + let pending: Vec<_> = pool.cull_and_get_pending(&BlockId::number(1), |p| p.map(|a| (a.verified.sender(), a.verified.index())).collect()).unwrap(); assert_eq!(pending, vec![]); }