From 50adea6220facac3cfe1d084ffefad0e09a2f94b Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Sat, 27 Oct 2018 15:59:18 +0200 Subject: [PATCH] Consensus Engines Implementation: Aura (#911) * Generalize BlockImport - move ImportBlock, BlockOrigin, ImportResult into shared sr-primitives - let Consensus provide and traits again - update consensus traits to latest development - implement traits on client::Client, test_client::TestClient - update RHD to use the new import_block API * Move ImportBlock into consensus-common * Send import notification in aura tests * Integrating aura into service * Make Signatures more generic * Aura Block Production with the given key * run aura on the thread pool * start at exact step start in aura * Add needed wasm blob, in leiu of better solutions. * Make API ids consistent with traits and bring upstream for sharing. * Add decrease_free_balance to Balances module * Encode `Metadata` once instead of two times * Bitops include xor * Upgrade key module. * Default pages to somewhat bigger. * Introduce upgrade key into node * Add `Created` event --- substrate/Cargo.lock | 346 +++--- substrate/Cargo.toml | 4 +- substrate/core/client/Cargo.toml | 2 +- substrate/core/client/db/src/lib.rs | 95 +- substrate/core/client/db/src/light.rs | 21 +- substrate/core/client/db/src/utils.rs | 1 + substrate/core/client/src/call_executor.rs | 2 +- substrate/core/client/src/client.rs | 304 ++--- substrate/core/client/src/error.rs | 6 + substrate/core/client/src/lib.rs | 5 +- substrate/core/client/src/light/fetcher.rs | 3 +- substrate/core/consensus/aura/Cargo.toml | 42 + substrate/core/consensus/aura/src/lib.rs | 560 +++++++++ substrate/core/consensus/common/Cargo.toml | 11 +- .../core/consensus/common/src/block_import.rs | 104 ++ substrate/core/consensus/common/src/error.rs | 88 ++ .../consensus/common}/src/evaluation.rs | 33 +- substrate/core/consensus/common/src/lib.rs | 114 +- .../consensus/common/src/offline_tracker.rs | 14 +- substrate/core/consensus/rhd/Cargo.toml | 17 +- substrate/core/consensus/rhd/src/error.rs | 95 +- substrate/core/consensus/rhd/src/lib.rs | 1046 ++++++++++++++--- .../consensus/rhd}/src/service.rs | 23 +- substrate/core/network/Cargo.toml | 1 + substrate/core/network/src/chain.rs | 13 +- substrate/core/network/src/import_queue.rs | 13 +- substrate/core/network/src/lib.rs | 1 + substrate/core/network/src/protocol.rs | 32 +- substrate/core/network/src/service.rs | 6 + substrate/core/network/src/specialization.rs | 3 - substrate/core/network/src/sync.rs | 14 +- substrate/core/network/src/test/mod.rs | 227 ++-- substrate/core/network/src/test/sync.rs | 16 + substrate/core/primitives/src/ed25519.rs | 7 +- substrate/core/rpc/Cargo.toml | 1 + substrate/core/rpc/src/chain/tests.rs | 2 +- substrate/core/rpc/src/lib.rs | 2 + substrate/core/rpc/src/state/tests.rs | 2 +- substrate/core/service/Cargo.toml | 1 + substrate/core/service/src/chain_ops.rs | 3 +- substrate/core/service/src/components.rs | 25 +- substrate/core/service/src/consensus.rs | 263 +++++ substrate/core/service/src/lib.rs | 40 +- substrate/core/service/test/Cargo.toml | 1 + substrate/core/service/test/src/lib.rs | 3 +- substrate/core/sr-api/src/lib.rs | 23 +- substrate/core/sr-primitives/Cargo.toml | 1 + .../core/sr-primitives/src/generic/digest.rs | 22 + .../core/sr-primitives/src/generic/header.rs | 1 + substrate/core/sr-primitives/src/testing.rs | 5 + substrate/core/sr-primitives/src/traits.rs | 10 + substrate/core/state-machine/src/lib.rs | 5 +- substrate/core/test-client/Cargo.toml | 1 + substrate/core/test-client/src/client_ext.rs | 20 +- substrate/core/test-client/src/lib.rs | 1 + substrate/core/test-client/src/trait_tests.rs | 2 +- .../substrate_test_runtime.compact.wasm | Bin 0 -> 47463 bytes substrate/node/cli/Cargo.toml | 7 +- substrate/node/cli/src/chain_spec.rs | 21 +- substrate/node/cli/src/lib.rs | 4 +- substrate/node/cli/src/service.rs | 76 +- substrate/node/consensus/Cargo.toml | 24 - substrate/node/consensus/README.adoc | 5 - substrate/node/consensus/src/error.rs | 52 - substrate/node/consensus/src/lib.rs | 533 --------- substrate/node/executor/src/lib.rs | 11 +- substrate/node/network/Cargo.toml | 16 - substrate/node/network/src/consensus.rs | 293 ----- substrate/node/network/src/lib.rs | 38 - substrate/node/runtime/Cargo.toml | 2 + substrate/node/runtime/src/lib.rs | 45 +- substrate/node/runtime/wasm/Cargo.lock | 19 + substrate/node/runtime/wasm/Cargo.toml | 2 + .../release/node_runtime.compact.wasm | Bin 612872 -> 624959 bytes substrate/srml/balances/src/lib.rs | 17 + substrate/srml/balances/src/tests.rs | 11 + substrate/srml/consensus/src/lib.rs | 10 +- substrate/srml/contract/src/lib.rs | 8 +- substrate/srml/contract/src/tests.rs | 4 + substrate/srml/support/src/dispatch.rs | 2 +- substrate/srml/upgrade-key/Cargo.toml | 34 + substrate/srml/upgrade-key/src/lib.rs | 90 ++ 82 files changed, 3125 insertions(+), 1902 deletions(-) create mode 100644 substrate/core/consensus/aura/Cargo.toml create mode 100644 substrate/core/consensus/aura/src/lib.rs create mode 100644 substrate/core/consensus/common/src/block_import.rs create mode 100644 substrate/core/consensus/common/src/error.rs rename substrate/{node/consensus => core/consensus/common}/src/evaluation.rs (73%) rename substrate/{node/consensus => core/consensus/rhd}/src/service.rs (89%) create mode 100644 substrate/core/service/src/consensus.rs create mode 100644 substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm delete mode 100644 substrate/node/consensus/Cargo.toml delete mode 100644 substrate/node/consensus/README.adoc delete mode 100644 substrate/node/consensus/src/error.rs delete mode 100644 substrate/node/consensus/src/lib.rs delete mode 100644 substrate/node/network/Cargo.toml delete mode 100644 substrate/node/network/src/consensus.rs delete mode 100644 substrate/node/network/src/lib.rs create mode 100644 substrate/srml/upgrade-key/Cargo.toml create mode 100644 substrate/srml/upgrade-key/src/lib.rs diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 48a6e8942a..a1b780849d 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -5,7 +5,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aes-soft 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "aesni 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "stream-cipher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -329,8 +329,8 @@ dependencies = [ "isatty 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.4.19 (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.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "simplelog 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -427,7 +427,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ctr" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-cipher-trait 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -451,7 +451,7 @@ dependencies = [ "base64 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "chashmap 2.2.1 (git+https://github.com/redox-os/tfs)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -703,7 +703,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -804,13 +804,13 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.11" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -893,21 +893,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jsonrpc-core" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-http-server" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ - "hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-server-utils 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -918,17 +918,17 @@ dependencies = [ [[package]] name = "jsonrpc-macros" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "jsonrpc-pubsub" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -938,7 +938,7 @@ dependencies = [ [[package]] name = "jsonrpc-server-utils" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -954,7 +954,7 @@ dependencies = [ [[package]] name = "jsonrpc-ws-server" version = "9.0.0" -source = "git+https://github.com/paritytech/jsonrpc.git#8d41129955e9abf08399cd052b4a6df4e0743ad6" +source = "git+https://github.com/paritytech/jsonrpc.git#207a277b098943864ecaf22dbab7a5e309866d6b" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", @@ -1215,8 +1215,8 @@ dependencies = [ "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=8111062f0177fd7423626f2db9560273644a4c4d)", "multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=8111062f0177fd7423626f2db9560273644a4c4d)", "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1275,7 +1275,7 @@ dependencies = [ "aes-ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "asn1_der 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", - "ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ctr 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "libp2p-core 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=8111062f0177fd7423626f2db9560273644a4c4d)", @@ -1513,7 +1513,7 @@ dependencies = [ "bs58 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "multihash 0.8.1-pre (git+https://github.com/tomaka/libp2p-rs?rev=8111062f0177fd7423626f2db9560273644a4c4d)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "unsigned-varint 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1597,37 +1597,20 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "node-executor 0.1.0", - "node-network 0.1.0", - "node-primitives 0.1.0", - "node-runtime 0.1.0", - "sr-primitives 0.1.0", - "substrate-cli 0.3.0", - "substrate-network 0.1.0", - "substrate-primitives 0.1.0", - "substrate-service 0.3.0", - "substrate-service-test 0.3.0", - "substrate-transaction-pool 0.1.0", - "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "node-consensus" -version = "0.1.0" -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)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "node-primitives 0.1.0", "node-runtime 0.1.0", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", "sr-primitives 0.1.0", - "srml-system 0.1.0", + "substrate-cli 0.3.0", "substrate-client 0.1.0", - "substrate-keyring 0.1.0", + "substrate-consensus-aura 0.1.0", + "substrate-network 0.1.0", "substrate-primitives 0.1.0", + "substrate-service 0.3.0", + "substrate-service-test 0.3.0", "substrate-transaction-pool 0.1.0", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1660,21 +1643,6 @@ dependencies = [ "wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "node-network" -version = "0.1.0" -dependencies = [ - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "node-consensus 0.1.0", - "node-primitives 0.1.0", - "rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "substrate-consensus-rhd 0.1.0", - "substrate-network 0.1.0", - "substrate-primitives 0.1.0", - "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "node-primitives" version = "0.1.0" @@ -1682,8 +1650,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "sr-std 0.1.0", "substrate-primitives 0.1.0", @@ -1700,8 +1668,8 @@ dependencies = [ "parity-codec-derive 2.1.0 (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 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api 0.1.0", "sr-io 0.1.0", "sr-primitives 0.1.0", @@ -1719,6 +1687,7 @@ dependencies = [ "srml-system 0.1.0", "srml-timestamp 0.1.0", "srml-treasury 0.1.0", + "srml-upgrade-key 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", ] @@ -1793,12 +1762,12 @@ dependencies = [ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl" -version = "0.10.13" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1806,12 +1775,12 @@ dependencies = [ "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "openssl-sys" -version = "0.9.37" +version = "0.9.39" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1833,21 +1802,13 @@ name = "parity-bytes" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "parity-codec" -version = "1.1.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)", -] - [[package]] name = "parity-codec" version = "2.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2200,20 +2161,10 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rhododendron" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rhododendron" version = "0.4.0" -source = "git+https://github.com/paritytech/rhododendron.git#64b46b577479a3b6c493fa6db5420a265a445ff9" +source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2356,20 +2307,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "serde_derive" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.9 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2379,7 +2327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2467,7 +2415,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2528,8 +2476,8 @@ dependencies = [ "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-std 0.1.0", @@ -2562,8 +2510,8 @@ version = "0.1.0" dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "sr-std 0.1.0", ] @@ -2575,8 +2523,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2593,8 +2541,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2611,8 +2559,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2630,8 +2578,8 @@ dependencies = [ "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-sandbox 0.1.0", @@ -2651,8 +2599,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2671,8 +2619,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2689,8 +2637,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2707,8 +2655,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2726,8 +2674,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2746,8 +2694,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2770,8 +2718,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2786,8 +2734,8 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2802,8 +2750,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2820,8 +2768,8 @@ dependencies = [ "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2831,6 +2779,24 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "srml-upgrade-key" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "srml-consensus 0.1.0", + "srml-support 0.1.0", + "srml-system 0.1.0", + "substrate-primitives 0.1.0", +] + [[package]] name = "stable_deref_trait" version = "1.1.1" @@ -2876,7 +2842,7 @@ dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "node-cli 0.1.0", - "vergen 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "vergen 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2928,7 +2894,7 @@ dependencies = [ "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api 0.1.0", "sr-primitives 0.1.0", - "substrate-consensus-rhd 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -2961,11 +2927,44 @@ dependencies = [ "substrate-trie 0.4.0", ] +[[package]] +name = "substrate-consensus-aura" +version = "0.1.0" +dependencies = [ + "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-primitives 0.1.0", + "sr-version 0.1.0", + "srml-consensus 0.1.0", + "srml-support 0.1.0", + "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", + "substrate-executor 0.1.0", + "substrate-keyring 0.1.0", + "substrate-network 0.1.0", + "substrate-primitives 0.1.0", + "substrate-service 0.3.0", + "substrate-test-client 0.1.0", + "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-consensus-common" version = "0.1.0" dependencies = [ + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "sr-version 0.1.0", "substrate-primitives 0.1.0", + "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2973,21 +2972,25 @@ name = "substrate-consensus-rhd" version = "0.1.0" 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)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rhododendron 0.4.0 (git+https://github.com/paritytech/rhododendron.git)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "rhododendron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-version 0.1.0", "srml-consensus 0.1.0", "srml-support 0.1.0", + "srml-system 0.1.0", + "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-transaction-pool 0.1.0", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3003,8 +3006,8 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-version 0.1.0", "substrate-primitives 0.1.0", @@ -3049,8 +3052,8 @@ dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "parity-crypto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", "subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3063,8 +3066,8 @@ version = "0.1.0" dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3084,6 +3087,7 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-keyring 0.1.0", "substrate-network-libp2p 0.1.0", "substrate-primitives 0.1.0", @@ -3106,8 +3110,8 @@ dependencies = [ "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3133,8 +3137,8 @@ dependencies = [ "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", "substrate-serializer 0.1.0", "twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3160,6 +3164,7 @@ dependencies = [ "sr-primitives 0.1.0", "sr-version 0.1.0", "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-primitives 0.1.0", "substrate-test-client 0.1.0", @@ -3175,7 +3180,7 @@ dependencies = [ "jsonrpc-pubsub 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "jsonrpc-ws-server 9.0.0 (git+https://github.com/paritytech/jsonrpc.git)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "substrate-rpc 0.1.0", ] @@ -3184,7 +3189,7 @@ dependencies = [ name = "substrate-serializer" version = "0.1.0" dependencies = [ - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3199,14 +3204,15 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "sr-io 0.1.0", "sr-primitives 0.1.0", "substrate-client 0.1.0", "substrate-client-db 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-keystore 0.1.0", "substrate-network 0.1.0", @@ -3229,6 +3235,7 @@ dependencies = [ "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-network 0.1.0", "substrate-primitives 0.1.0", "substrate-service 0.3.0", @@ -3285,6 +3292,7 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "substrate-client 0.1.0", + "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", @@ -3299,8 +3307,8 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-api 0.1.0", "sr-io 0.1.0", "sr-primitives 0.1.0", @@ -3320,8 +3328,8 @@ dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "substrate-test-runtime 0.1.0", ] @@ -3387,7 +3395,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.15.9" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3912,7 +3920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "vergen" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3936,8 +3944,8 @@ name = "wabt" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", "wabt-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4066,7 +4074,7 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.14 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4159,7 +4167,7 @@ dependencies = [ "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" -"checksum ctr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50ac3add446ec1f8fe3dc007cd838f5b22bbf33186394feac505451ecc43c018" +"checksum ctr 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4b669fcb8e20124db86dbd9b01e74ec0e9e420e65381311ce5249864fc7ff0c0" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum datastore 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=8111062f0177fd7423626f2db9560273644a4c4d)" = "" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" @@ -4193,7 +4201,7 @@ dependencies = [ "checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" "checksum getset 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54c7f36a235738bb25904d6a2b3dbb28f6f5736cd3918c4bf80d6bb236200782" "checksum globset 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4743617a7464bbda3c8aec8558ff2f9429047e025771037df561d383337ff865" -"checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c" +"checksum h2 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd33bafe2e6370e6c8eb0cf1b8c5f93390b90acde7e9b03723f166b28b648ed" "checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -4204,7 +4212,7 @@ dependencies = [ "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e" "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" -"checksum hyper 0.12.11 (registry+https://github.com/rust-lang/crates.io-index)" = "78d50abbd1790e0f4c74cb1d4a2211b439bac661d54107ad5564c55e77906762" +"checksum hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)" = "4aca412c241a2dd53af261efc7adf7736fdebd67dc0d1cc1ffdbcb9407e0e810" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" @@ -4282,12 +4290,11 @@ dependencies = [ "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" "checksum opaque-debug 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d620c9c26834b34f039489ac0dfdb12c7ac15ccaf818350a64c9b5334a452ad7" -"checksum openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5af9e83eb3c51ee806387d26a43056f3246d865844caa6dd704d2ba7e831c264" +"checksum openssl 0.10.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6285ab297861546af7a2753593b3160bfc09f0ab9d1f5bb009e39d81a169b499" "checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985" -"checksum openssl-sys 0.9.37 (registry+https://github.com/rust-lang/crates.io-index)" = "d4edbc8dfa63f557aee3a498179af2cc6a989e12ba1751840046c79afc9e615a" +"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5168b4cf41f3835e4bc6ffb32f51bc9365dc50cb351904595b3931d917fd0c" -"checksum parity-codec 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bee4edfcfa19892f7178cb299a659866015dc131459865a1d808269cf7e7eb9e" "checksum parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dca389ea5e1632c89b2ce54f7e2b4a8a8c9d278042222a91e0bf95451218cb4c" "checksum parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffa42c2cb493b60b12c75b26e8c94cb734af4df4d7f2cc229dc04c1953dac189" "checksum parity-crypto 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1117f6574377d21309bfa1f7d69ff734120685d92b02c3f362b122585758840" @@ -4330,8 +4337,7 @@ dependencies = [ "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum rhododendron 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e20523445e693f394c0e487113ae656071311c9ee4c1e914441bece8c929b21d" -"checksum rhododendron 0.4.0 (git+https://github.com/paritytech/rhododendron.git)" = "" +"checksum rhododendron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a09bc21b21795c366c8bf0e87afb71175f5f736b3a5b279b6f4e81839d0a877b" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" @@ -4350,8 +4356,8 @@ dependencies = [ "checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" "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.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" -"checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe" +"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef" +"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c" "checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "checksum sha1 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "171698ce4ec7cbb93babeb3190021b4d72e96ccb98e33d277ae4ea959d6f2d9e" @@ -4376,7 +4382,7 @@ dependencies = [ "checksum subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7f6353c2ee5407358d063a14cccc1630804527090a6fb5a9489ce4924280fb" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" -"checksum syn 0.15.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b10ee269228fb723234fce98e9aac0eaed2bd5f1ad2f6930e8d5b93f04445a1a" +"checksum syn 0.15.12 (registry+https://github.com/rust-lang/crates.io-index)" = "34ab9797e47d24cb76b8dc4d24ff36807018c7cc549c4cba050b068be0c586b0" "checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7" "checksum sysinfo 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "11c5f6e8a7a7146f26ffed9a5ff8bab2706f1ac8a413a415e1d211b819d5c24d" "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" @@ -4433,7 +4439,7 @@ dependencies = [ "checksum utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd70f467df6810094968e2fce0ee1bd0e87157aceb026a8c083bcf5e25b9efe4" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum vergen 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4cae5a72131fdf47d4fbc9286393ec8622ec7a5502fbe77b291d9aba21d3f179" +"checksum vergen 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "93fb2d57fbc535fcd45548c99b141d2d960995daaf04b864c4d9fe1ea011c819" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2" diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index f47fa42507..54ae7d9d82 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -23,6 +23,7 @@ members = [ "core/client", "core/client/db", "core/consensus/common", + "core/consensus/aura", "core/consensus/rhd", "core/executor", "core/finality-grandpa", @@ -54,6 +55,7 @@ members = [ "srml/system", "srml/timestamp", "srml/treasury", + "srml/upgrade-key", "core/serializer", "core/service", "core/service/test", @@ -64,9 +66,7 @@ members = [ "core/trie", "core/keystore", "node/cli", - "node/consensus", "node/executor", - "node/network", "node/primitives", "node/runtime", "subkey", diff --git a/substrate/core/client/Cargo.toml b/substrate/core/client/Cargo.toml index ba457fbb9c..5eeb75940d 100644 --- a/substrate/core/client/Cargo.toml +++ b/substrate/core/client/Cargo.toml @@ -12,7 +12,7 @@ hex-literal = "0.1" futures = "0.1.17" slog = "^2" heapsize = "0.4" -substrate-consensus-rhd = { path = "../consensus/rhd" } +substrate-consensus-common = { path = "../consensus/common" } parity-codec = "2.1" substrate-executor = { path = "../executor" } substrate-primitives = { path = "../primitives" } diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index f35dd8a05d..36ab5f4b2a 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -534,7 +534,9 @@ impl Backend { meta.finalized_hash, f_hash), ).into()) } - transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, f_hash.as_ref()); + + let lookup_key = ::utils::number_to_lookup_key(f_num); + transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); let commit = self.storage.state_db.canonicalize_block(&f_hash); apply_state_commit(transaction, commit); @@ -586,11 +588,20 @@ impl client::backend::Backend for Backend whe -> Result<(), client::error::Error> { let mut transaction = DBTransaction::new(); + if let Some(pending_block) = operation.pending_block { let hash = pending_block.header.hash(); let parent_hash = *pending_block.header.parent_hash(); let number = pending_block.header.number().clone(); + // blocks in longest chain are keyed by number + let lookup_key = if pending_block.leaf_state.is_best() { + ::utils::number_to_lookup_key(number).to_vec() + } else { + // other blocks are keyed by number + hash + ::utils::number_and_hash_to_lookup_key(number, hash) + }; + if pending_block.leaf_state.is_best() { let meta = self.blockchain.meta.read(); @@ -678,17 +689,9 @@ impl client::backend::Backend for Backend whe } } - transaction.put(columns::META, meta_keys::BEST_BLOCK, hash.as_ref()); + transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key); } - // blocks in longest chain are keyed by number - let lookup_key = if pending_block.leaf_state.is_best() { - ::utils::number_to_lookup_key(number).to_vec() - } else { - // other blocks are keyed by number + hash - ::utils::number_and_hash_to_lookup_key(number, hash) - }; - transaction.put(columns::HEADER, &lookup_key, &pending_block.header.encode()); if let Some(body) = pending_block.body { transaction.put(columns::BODY, &lookup_key, &body.encode()); @@ -700,7 +703,7 @@ impl client::backend::Backend for Backend whe transaction.put(columns::HASH_LOOKUP, hash.as_ref(), &lookup_key); if number == Zero::zero() { - transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, hash.as_ref()); + transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } @@ -797,7 +800,8 @@ impl client::backend::Backend for Backend whe || client::error::ErrorKind::UnknownBlock( format!("Error reverting to {}. Block header not found.", best)))?; - transaction.put(columns::META, meta_keys::BEST_BLOCK, header.hash().as_ref()); + let lookup_key = ::utils::number_to_lookup_key(header.number().clone()); + transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key); transaction.delete(columns::HASH_LOOKUP, header.hash().as_ref()); self.storage.db.write(transaction).map_err(db_err)?; self.blockchain.update_meta(header.hash().clone(), best.clone(), true, false); @@ -927,40 +931,49 @@ mod tests { #[test] fn block_hash_inserted_correctly() { - let db = Backend::::new_test(1, 0); - for i in 0..10 { - assert!(db.blockchain().hash(i).unwrap().is_none()); + let backing = { + let db = Backend::::new_test(1, 0); + for i in 0..10 { + assert!(db.blockchain().hash(i).unwrap().is_none()); - { - let id = if i == 0 { - BlockId::Hash(Default::default()) - } else { - BlockId::Number(i - 1) - }; - - let mut op = db.begin_operation(id).unwrap(); - let header = Header { - number: i, - parent_hash: if i == 0 { - Default::default() + { + let id = if i == 0 { + BlockId::Hash(Default::default()) } else { - db.blockchain.hash(i - 1).unwrap().unwrap() - }, - state_root: Default::default(), - digest: Default::default(), - extrinsics_root: Default::default(), - }; + BlockId::Number(i - 1) + }; - op.set_block_data( - header, - Some(vec![]), - None, - NewBlockState::Best, - ).unwrap(); - db.commit_operation(op).unwrap(); + let mut op = db.begin_operation(id).unwrap(); + let header = Header { + number: i, + parent_hash: if i == 0 { + Default::default() + } else { + db.blockchain.hash(i - 1).unwrap().unwrap() + }, + state_root: Default::default(), + digest: Default::default(), + extrinsics_root: Default::default(), + }; + + op.set_block_data( + header, + Some(vec![]), + None, + NewBlockState::Best, + ).unwrap(); + db.commit_operation(op).unwrap(); + } + + assert!(db.blockchain().hash(i).unwrap().is_some()) } + db.storage.db.clone() + }; - assert!(db.blockchain().hash(i).unwrap().is_some()) + let backend = Backend::::from_kvdb(backing, PruningMode::keep_blocks(1), 0).unwrap(); + assert_eq!(backend.blockchain().info().unwrap().best_number, 9); + for i in 0..10 { + assert!(backend.blockchain().hash(i).unwrap().is_some()) } } diff --git a/substrate/core/client/db/src/light.rs b/substrate/core/client/db/src/light.rs index 49e5e85be1..f336df4d28 100644 --- a/substrate/core/client/db/src/light.rs +++ b/substrate/core/client/db/src/light.rs @@ -196,7 +196,8 @@ impl LightStorage { ).into()) } - transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, hash.as_ref()); + let lookup_key = ::utils::number_to_lookup_key(header.number().clone()); + transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); // build new CHT if required if let Some(new_cht_number) = cht::is_build_required(cht::SIZE, *header.number()) { @@ -244,6 +245,14 @@ impl LightBlockchainStorage for LightStorage let number = *header.number(); let parent_hash = *header.parent_hash(); + // blocks in longest chain are keyed by number + let lookup_key = if leaf_state.is_best() { + ::utils::number_to_lookup_key(number).to_vec() + } else { + // other blocks are keyed by number + hash + ::utils::number_and_hash_to_lookup_key(number, hash) + }; + if leaf_state.is_best() { // handle reorg. { @@ -298,17 +307,9 @@ impl LightBlockchainStorage for LightStorage } } - transaction.put(columns::META, meta_keys::BEST_BLOCK, hash.as_ref()); + transaction.put(columns::META, meta_keys::BEST_BLOCK, &lookup_key); } - // blocks in longest chain are keyed by number - let lookup_key = if leaf_state.is_best() { - ::utils::number_to_lookup_key(number).to_vec() - } else { - // other blocks are keyed by number + hash - ::utils::number_and_hash_to_lookup_key(number, hash) - }; - transaction.put(columns::HEADER, &lookup_key, &header.encode()); transaction.put(columns::HASH_LOOKUP, hash.as_ref(), &lookup_key); diff --git a/substrate/core/client/db/src/utils.rs b/substrate/core/client/db/src/utils.rs index b32b56bccc..f7b81845e8 100644 --- a/substrate/core/client/db/src/utils.rs +++ b/substrate/core/client/db/src/utils.rs @@ -53,6 +53,7 @@ pub mod meta_keys { } /// Database metadata. +#[derive(Debug)] pub struct Meta { /// Hash of the best known block. pub best_hash: H, diff --git a/substrate/core/client/src/call_executor.rs b/substrate/core/client/src/call_executor.rs index 2b442a3569..168d0a26c5 100644 --- a/substrate/core/client/src/call_executor.rs +++ b/substrate/core/client/src/call_executor.rs @@ -150,7 +150,7 @@ where let heap_pages = state.storage(well_known_keys::HEAP_PAGES) .map_err(|e| error::ErrorKind::Execution(Box::new(e)))? .and_then(|v| u64::decode(&mut &v[..])) - .unwrap_or(8) as usize; + .unwrap_or(1024) as usize; let mut ext = Ext::new(&mut overlay, &state, self.backend.changes_trie_storage()); self.executor.runtime_version(&mut ext, heap_pages, &code) diff --git a/substrate/core/client/src/client.rs b/substrate/core/client/src/client.rs index fcf917584e..8ef2d7e1eb 100644 --- a/substrate/core/client/src/client.rs +++ b/substrate/core/client/src/client.rs @@ -26,6 +26,7 @@ use runtime_primitives::{ generic::{BlockId, SignedBlock, Block as RuntimeBlock}, transaction_validity::{TransactionValidity, TransactionTag}, }; +use consensus::{ImportBlock, ImportResult, BlockOrigin}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash}; use runtime_primitives::{ApplyResult, BuildStorage}; use runtime_api as api; @@ -44,7 +45,7 @@ use blockchain::{self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend use call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; use notifications::{StorageNotifications, StorageEventStream}; -use {cht, error, in_mem, block_builder, genesis}; +use {cht, error, in_mem, block_builder, genesis, consensus}; /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -106,21 +107,6 @@ pub struct ClientInfo { pub best_queued_hash: Option, } -/// Block import result. -#[derive(Debug)] -pub enum ImportResult { - /// Added to the import queue. - Queued, - /// Already in the import queue. - AlreadyQueued, - /// Already in the blockchain. - AlreadyInChain, - /// Block or parent is known to be bad. - KnownBad, - /// Block parent is not in the chain. - UnknownParent, -} - /// Block status. #[derive(Debug, PartialEq, Eq)] pub enum BlockStatus { @@ -134,70 +120,6 @@ pub enum BlockStatus { Unknown, } -/// Block data origin. -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub enum BlockOrigin { - /// Genesis block built into the client. - Genesis, - /// Block is part of the initial sync with the network. - NetworkInitialSync, - /// Block was broadcasted on the network. - NetworkBroadcast, - /// Block that was received from the network and validated in the consensus process. - ConsensusBroadcast, - /// Block that was collated by this node. - Own, - /// Block was imported from a file. - File, -} - -/// Data required to import a Block -pub struct ImportBlock { - /// Origin of the Block - pub origin: BlockOrigin, - /// Header - pub header: Block::Header, - /// Justification provided for this block from the outside - pub external_justification: Justification, - /// Internal Justification for the block - pub internal_justification: Vec, // Block::Digest::DigestItem? - /// Block's body - pub body: Option>, - /// Is this block finalized already? - /// `true` implies instant finality. - pub finalized: bool, - /// Auxiliary consensus data produced by the block. - /// Contains a list of key-value pairs. If values are `None`, the keys - /// will be deleted. - pub auxiliary: Vec<(Vec, Option>)>, -} - -impl ImportBlock { - /// Deconstruct the justified header into parts. - pub fn into_inner(self) - -> ( - BlockOrigin, - ::Header, - Justification, - Justification, - Option::Extrinsic>>, - bool, - Vec<(Vec, Option>)>, - ) { - ( - self.origin, - self.header, - self.external_justification, - self.internal_justification, - self.body, - self.finalized, - self.auxiliary, - ) - } -} - - - /// Summary of an imported block #[derive(Clone, Debug)] pub struct BlockImportNotification { @@ -222,6 +144,41 @@ pub struct FinalityNotification { pub header: Block::Header, } +// used in importing a block, where additional changes are made after the runtime +// executed. +enum PrePostHeader { + // they are the same: no post-runtime digest items. + Same(H), + // different headers (pre, post). + Different(H, H), +} + +impl PrePostHeader { + // get a reference to the "pre-header" -- the header as it should be just after the runtime. + fn pre(&self) -> &H { + match *self { + PrePostHeader::Same(ref h) => h, + PrePostHeader::Different(ref h, _) => h, + } + } + + // get a reference to the "post-header" -- the header as it should be after all changes are applied. + fn post(&self) -> &H { + match *self { + PrePostHeader::Same(ref h) => h, + PrePostHeader::Different(_, ref h) => h, + } + } + + // convert to the "post-header" -- the header as it should be after all changes are applied. + fn into_post(self) -> H { + match self { + PrePostHeader::Same(h) => h, + PrePostHeader::Different(_, h) => h, + } + } +} + /// Create an instance of in-memory client. pub fn new_in_mem( executor: E, @@ -513,52 +470,6 @@ impl Client where ) } - /// Import a checked and validated block - pub fn import_block( - &self, - import_block: ImportBlock, - new_authorities: Option>, - ) -> error::Result { - - let ( - origin, - header, - _, - justification, - body, - finalized, - _aux, // TODO: write this to DB also - ) = import_block.into_inner(); - 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 = header.hash(); - let _import_lock = self.import_lock.lock(); - let height: u64 = header.number().as_(); - *self.importing_block.write() = Some(hash); - - let result = self.execute_and_import_block( - origin, - hash, - header, - justification, - body, - new_authorities, - finalized, - ); - - *self.importing_block.write() = None; - telemetry!("block.import"; - "height" => height, - "best" => ?hash, - "origin" => ?origin - ); - result - } - // TODO [ToDr] Optimize and re-use tags from the pool. fn transaction_tags(&self, at: Block::Hash, body: &Option>) -> error::Result> { let id = BlockId::Hash(at); @@ -587,13 +498,13 @@ impl Client where &self, origin: BlockOrigin, hash: Block::Hash, - header: Block::Header, + import_headers: PrePostHeader, justification: Justification, body: Option>, authorities: Option>, finalized: bool, ) -> error::Result { - let parent_hash = header.parent_hash().clone(); + let parent_hash = import_headers.post().parent_hash().clone(); match self.backend.blockchain().status(BlockId::Hash(hash))? { blockchain::BlockStatus::InChain => return Ok(ImportResult::AlreadyInChain), blockchain::BlockStatus::Unknown => {}, @@ -627,12 +538,13 @@ impl Client where transaction_state, &mut overlay, "execute_block", - &::new(header.clone(), body.clone().unwrap_or_default()).encode(), + &::new(import_headers.pre().clone(), body.clone().unwrap_or_default()).encode(), match (origin, self.block_execution_strategy) { (BlockOrigin::NetworkInitialSync, _) | (_, ExecutionStrategy::NativeWhenPossible) => ExecutionManager::NativeWhenPossible, (_, ExecutionStrategy::AlwaysWasm) => ExecutionManager::AlwaysWasm, _ => ExecutionManager::Both(|wasm_result, native_result| { + let header = import_headers.post(); warn!("Consensus error between wasm and native block execution at block {}", hash); warn!(" Header {:?}", header); warn!(" Native result {:?}", native_result); @@ -654,7 +566,7 @@ impl Client where }; // TODO: non longest-chain rule. - let is_new_best = finalized || header.number() > &last_best_number; + let is_new_best = finalized || import_headers.post().number() > &last_best_number; let leaf_state = if finalized { ::backend::NewBlockState::Final } else if is_new_best { @@ -663,10 +575,10 @@ impl Client where ::backend::NewBlockState::Normal }; - trace!("Imported {}, (#{}), best={}, origin={:?}", hash, header.number(), is_new_best, origin); + trace!("Imported {}, (#{}), best={}, origin={:?}", hash, import_headers.post().number(), is_new_best, origin); transaction.set_block_data( - header.clone(), + import_headers.post().clone(), body, Some(justification), leaf_state, @@ -693,7 +605,7 @@ impl Client where if finalized { let notification = FinalityNotification:: { hash, - header: header.clone(), + header: import_headers.post().clone(), }; self.finality_notification_sinks.lock() @@ -703,7 +615,7 @@ impl Client where let notification = BlockImportNotification:: { hash, origin, - header, + header: import_headers.into_post(), is_new_best, tags, }; @@ -979,6 +891,84 @@ impl Client where } } + +impl consensus::BlockImport for Client where + B: backend::Backend, + E: CallExecutor + Clone, + Block: BlockT, +{ + type Error = Error; + + /// Import a checked and validated block + fn import_block( + &self, + import_block: ImportBlock, + new_authorities: Option>, + ) -> Result { + use runtime_primitives::traits::Digest; + + let ImportBlock { + origin, + header, + external_justification, + post_runtime_digests, + body, + finalized, + .. + } = import_block; + 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 import_headers = if post_runtime_digests.is_empty() { + PrePostHeader::Same(header) + } else { + let mut post_header = header.clone(); + for item in post_runtime_digests { + post_header.digest_mut().push(item); + } + PrePostHeader::Different(header, post_header) + }; + + let hash = import_headers.post().hash(); + let _import_lock = self.import_lock.lock(); + let height: u64 = import_headers.post().number().as_(); + *self.importing_block.write() = Some(hash); + + let result = self.execute_and_import_block( + origin, + hash, + import_headers, + external_justification, + body, + new_authorities, + finalized, + ); + + *self.importing_block.write() = None; + telemetry!("block.import"; + "height" => height, + "best" => ?hash, + "origin" => ?origin + ); + result.map_err(|e| e.into()) + } +} + +impl consensus::Authorities for Client where + B: backend::Backend, + E: CallExecutor + Clone, + Block: BlockT, +{ + type Error = Error; + fn authorities(&self, at: &BlockId) -> Result, Self::Error> { + self.authorities_at(at).map_err(|e| e.into()) + } +} + impl CurrentHeight for Client where B: backend::Backend, E: CallExecutor + Clone, @@ -1135,26 +1125,6 @@ impl api::BlockBuilder for Client where } } -impl api::OldTxQueue for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - - fn account_nonce( - &self, at: &BlockId, account: &AccountId - ) -> Result { - self.call_api_at(at, "account_nonce", &(account)) - } - - fn lookup_address( - &self, at: &BlockId, address: &Address - ) -> Result, Self::Error> { - self.call_api_at(at, "lookup_address", &(address)) - } -} - impl api::TaggedTransactionQueue for Client where B: backend::Backend, E: CallExecutor, @@ -1169,30 +1139,6 @@ impl api::TaggedTransactionQueue for Client whe } } -impl api::Miscellaneous for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - - fn validator_count(&self, at: &BlockId) -> Result { - self.call_api_at(at, "validator_count", &()) - } - - fn validators( - &self, at: &BlockId - ) -> Result, Self::Error> { - self.call_api_at(at, "validators", &()) - } - - fn timestamp( - &self, at: &BlockId - ) -> Result { - self.call_api_at(at, "timestamp", &()) - } -} - #[cfg(test)] pub(crate) mod tests { use std::collections::HashMap; @@ -1202,7 +1148,7 @@ pub(crate) mod tests { use runtime_primitives::traits::{Digest as DigestT, DigestItem as DigestItemT}; use runtime_primitives::generic::DigestItem; use test_client::{self, TestClient}; - use test_client::client::BlockOrigin; + use consensus::BlockOrigin; use test_client::client::backend::Backend as TestBackend; use test_client::BlockBuilderExt; use test_client::runtime::{self, Block, Transfer}; diff --git a/substrate/core/client/src/error.rs b/substrate/core/client/src/error.rs index 5abc2617b2..139cef13da 100644 --- a/substrate/core/client/src/error.rs +++ b/substrate/core/client/src/error.rs @@ -16,11 +16,17 @@ //! Substrate client possible errors. +#![allow(missing_docs)] + use std; use state_machine; use runtime_primitives::ApplyError; +use consensus; error_chain! { + links { + Consensus(consensus::Error, consensus::ErrorKind); + } errors { /// Backend error. Backend(s: String) { diff --git a/substrate/core/client/src/lib.rs b/substrate/core/client/src/lib.rs index 43a4be7a80..a033277905 100644 --- a/substrate/core/client/src/lib.rs +++ b/substrate/core/client/src/lib.rs @@ -26,6 +26,7 @@ extern crate parity_codec as codec; extern crate substrate_primitives as primitives; extern crate sr_primitives as runtime_primitives; extern crate substrate_state_machine as state_machine; +extern crate substrate_consensus_common as consensus; #[cfg(test)] extern crate substrate_keyring as keyring; #[cfg(test)] extern crate substrate_test_client as test_client; #[macro_use] extern crate substrate_telemetry; @@ -63,8 +64,8 @@ pub use call_executor::{CallResult, CallExecutor, LocalCallExecutor}; pub use client::{ new_with_backend, new_in_mem, - BlockBody, BlockStatus, BlockOrigin, ImportNotifications, FinalityNotifications, BlockchainEvents, - Client, ClientInfo, ChainHead, ImportResult, ImportBlock, + BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, + Client, ClientInfo, ChainHead, }; pub use notifications::{StorageEventStream, StorageChangeSet}; pub use state_machine::ExecutionStrategy; diff --git a/substrate/core/client/src/light/fetcher.rs b/substrate/core/client/src/light/fetcher.rs index 702c9b7034..38a46c7d68 100644 --- a/substrate/core/client/src/light/fetcher.rs +++ b/substrate/core/client/src/light/fetcher.rs @@ -270,7 +270,8 @@ pub mod tests { use error::Error as ClientError; use test_client::{self, TestClient}; use test_client::runtime::{self, Hash, Block, Header}; - use test_client::client::BlockOrigin; + use consensus::BlockOrigin; + use in_mem::{Blockchain as InMemoryBlockchain}; use light::fetcher::{Fetcher, FetchChecker, LightDataChecker, RemoteCallRequest, RemoteHeaderRequest}; diff --git a/substrate/core/consensus/aura/Cargo.toml b/substrate/core/consensus/aura/Cargo.toml new file mode 100644 index 0000000000..0f403ab2ff --- /dev/null +++ b/substrate/core/consensus/aura/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "substrate-consensus-aura" +version = "0.1.0" +authors = ["Parity Technologies "] +description = "Rhododendron Round-Based consensus-algorithm for substrate" + +[dependencies] +futures = "0.1.17" +parity-codec = { version = "2.1" } +substrate-consensus-common = { path = "../common" } +substrate-client = { path = "../../client" } +substrate-primitives = { path = "../../primitives" } +substrate-network = { path = "../../network" } +srml-support = { path = "../../../srml/support" } +sr-primitives = { path = "../../sr-primitives" } +sr-version = { path = "../../sr-version" } +sr-io = { path = "../../sr-io" } +srml-consensus = { path = "../../../srml/consensus" } +tokio = "0.1.7" +parking_lot = "0.4" +error-chain = "0.12" +log = "0.3" + +[dev-dependencies] +substrate-keyring = { path = "../../keyring" } +substrate-executor = { path = "../../executor" } +substrate-service = { path = "../../service" } +substrate-test-client = { path = "../../test-client" } +env_logger = { version = "0.4" } + +[target.'cfg(test)'.dependencies] +substrate-network = { path = "../../network", features = ["test-helpers"] } + +[features] +default = ["std"] +std = [ + "substrate-primitives/std", + "srml-support/std", + "sr-primitives/std", + "sr-version/std", +] + diff --git a/substrate/core/consensus/aura/src/lib.rs b/substrate/core/consensus/aura/src/lib.rs new file mode 100644 index 0000000000..7355119074 --- /dev/null +++ b/substrate/core/consensus/aura/src/lib.rs @@ -0,0 +1,560 @@ +// Copyright 2018 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 . + +//! Aura (Authority-round) consensus in substrate. +//! +//! Aura works by having a list of authorities A who are expected to roughly +//! agree on the current time. Time is divided up into discrete slots of t +//! seconds each. For each slot s, the author of that slot is A[s % |A|]. +//! +//! The author is allowed to issue one block but not more during that slot, +//! and it will be built upon the longest valid chain that has been seen. +//! +//! Blocks from future steps will be either deferred or rejected depending on how +//! far in the future they are. + +extern crate parity_codec as codec; +extern crate substrate_consensus_common as consensus_common; +extern crate substrate_client as client; +extern crate substrate_primitives as primitives; +extern crate substrate_network as network; +extern crate srml_support as runtime_support; +extern crate sr_primitives as runtime_primitives; +extern crate sr_version as runtime_version; +extern crate sr_io as runtime_io; +extern crate tokio; + +#[cfg(test)] +extern crate substrate_keyring as keyring; +#[cfg(test)] +extern crate substrate_service as service; +#[cfg(test)] +extern crate substrate_test_client as test_client; +#[cfg(test)] +extern crate env_logger; + +extern crate parking_lot; + +#[macro_use] +extern crate log; + +extern crate futures; + +use std::sync::Arc; +use std::time::{Duration, Instant}; + +use codec::Encode; +use consensus_common::{Authorities, BlockImport, Environment, Proposer}; +use client::ChainHead; +use consensus_common::{ImportBlock, BlockOrigin}; +use runtime_primitives::{generic, generic::BlockId}; +use runtime_primitives::traits::{Block, Header, Digest, DigestItemFor}; +use network::import_queue::{Verifier, BasicQueue}; +use primitives::{AuthorityId, ed25519}; + +use futures::{Stream, Future, IntoFuture, future::{self, Either}}; +use tokio::timer::Interval; + +pub use consensus_common::SyncOracle; + +/// A handle to the network. This is generally implemented by providing some +/// handle to a gossip service or similar. +/// +/// Intended to be a lightweight handle such as an `Arc`. +pub trait Network: Clone { + /// A stream of input messages for a topic. + type In: Stream,Error=()>; + + /// Send a message at a specific round out. + fn send_message(&self, slot: u64, message: Vec); +} + +/// Configuration for Aura consensus. +#[derive(Clone)] +pub struct Config { + /// The local authority keypair. Can be none if this is just an observer. + pub local_key: Option>, + /// The slot duration in seconds. + pub slot_duration: u64 +} + +/// Get slot author for given block along with authorities. +fn slot_author(slot_num: u64, authorities: &[AuthorityId]) -> Option { + if authorities.is_empty() { return None } + + let idx = slot_num % (authorities.len() as u64); + assert!(idx <= usize::max_value() as u64, + "It is impossible to have a vector with length beyond the address space; qed"); + + let current_author = *authorities.get(idx as usize) + .expect("authorities not empty; index constrained to list length;\ + this is a valid index; qed"); + + Some(current_author) +} + +fn duration_now() -> Option { + use std::time::SystemTime; + + let now = SystemTime::now(); + now.duration_since(SystemTime::UNIX_EPOCH).map_err(|e| { + warn!("Current time {:?} is before unix epoch. Something is wrong: {:?}", now, e); + }).ok() +} + +/// Get the slot for now. +fn slot_now(slot_duration: u64) -> Option { + duration_now().map(|s| s.as_secs() / slot_duration) +} + +/// A digest item which is usable with aura consensus. +pub trait CompatibleDigestItem: Sized { + /// Construct a digest item which is a slot number and a signature on the + /// hash. + fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self; + + /// If this item is an Aura seal, return the slot number and signature. + fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)>; +} + +impl CompatibleDigestItem for generic::DigestItem { + /// Construct a digest item which is a slot number and a signature on the + /// hash. + fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self { + generic::DigestItem::Seal(slot_number, signature) + } + /// If this item is an Aura seal, return the slot number and signature. + fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)> { + match self { + generic::DigestItem::Seal(slot, ref sign) => Some((*slot, sign)), + _ => None + } + } +} + +impl CompatibleDigestItem for generic::DigestItem { + /// Construct a digest item which is a slot number and a signature on the + /// hash. + fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self { + generic::DigestItem::Seal(slot_number, signature) + } + /// If this item is an Aura seal, return the slot number and signature. + fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)> { + match self { + generic::DigestItem::Seal(slot, ref sign) => Some((*slot, sign)), + _ => None + } + } +} + +/// Start the aura worker. This should be run in a tokio runtime. +pub fn start_aura( + config: Config, + client: Arc, + env: Arc, + sync_oracle: SO, +) + -> impl Future where + B: Block, + C: Authorities + BlockImport + ChainHead, + E: Environment, + E::Proposer: Proposer, + SO: SyncOracle + Send + Clone, + DigestItemFor: CompatibleDigestItem, + Error: ::std::error::Error + Send + 'static + From<::consensus_common::Error>, +{ + let make_authorship = move || { + let config = config.clone(); + let client = client.clone(); + let env = env.clone(); + let sync_oracle = sync_oracle.clone(); + + let local_keys = config.local_key.map(|pair| (pair.public(), pair)); + let slot_duration = config.slot_duration; + let mut last_authored_slot = 0; + let next_slot_start = duration_now().map(|now| { + let remaining_full_secs = slot_duration - (now.as_secs() % slot_duration) - 1; + let remaining_nanos = 1_000_000_000 - now.subsec_nanos(); + Instant::now() + Duration::new(remaining_full_secs, remaining_nanos) + }).unwrap_or_else(|| Instant::now()); + + Interval::new(next_slot_start, Duration::from_secs(slot_duration)) + .filter(move |_| !sync_oracle.is_major_syncing()) // only propose when we are not syncing. + .filter_map(move |_| local_keys.clone()) // skip if not authoring. + .map_err(|e| debug!(target: "aura", "Faulty timer: {:?}", e)) + .for_each(move |(public_key, key)| { + use futures::future; + + let slot_num = match slot_now(slot_duration) { + Some(n) => n, + None => return Either::B(future::err(())), + }; + + if last_authored_slot >= slot_num { return Either::B(future::ok(())) } + last_authored_slot = slot_num; + + let chain_head = match client.best_block_header() { + Ok(x) => x, + Err(e) => { + warn!(target:"aura", "Unable to author block in slot {}. no best block header: {:?}", slot_num, e); + return Either::B(future::ok(())) + } + }; + + let authorities = match client.authorities(&BlockId::Hash(chain_head.hash())){ + Ok(authorities) => authorities, + Err(e) => { + warn!("Unable to fetch authorities at block {:?}: {:?}", chain_head.hash(), e); + return Either::B(future::ok(())); + } + }; + + let proposal_work = match slot_author(slot_num, &authorities) { + None => return Either::B(future::ok(())), + Some(author) => if author.0 == public_key.0 { + // we are the slot author. make a block and sign it. + let proposer = match env.init(&chain_head, &authorities, key.clone()) { + Ok(p) => p, + Err(e) => { + warn!("Unable to author block in slot {:?}: {:?}", slot_num, e); + return Either::B(future::ok(())) + } + }; + + proposer.propose().into_future() + } else { + return Either::B(future::ok(())); + } + }; + + let block_import = client.clone(); + Either::A(proposal_work + .map(move |b| { + let (header, body) = b.deconstruct(); + let pre_hash = header.hash(); + let parent_hash = header.parent_hash().clone(); + + // sign the pre-sealed hash of the block and then + // add it to a digest item. + let to_sign = (slot_num, pre_hash).encode(); + let signature = key.sign(&to_sign[..]); + let item = as CompatibleDigestItem>::aura_seal(slot_num, signature); + let import_block = ImportBlock { + origin: BlockOrigin::Own, + header, + external_justification: Vec::new(), + post_runtime_digests: vec![item], + body: Some(body), + finalized: false, + auxiliary: Vec::new(), + }; + + if let Err(e) = block_import.import_block(import_block, None) { + warn!(target: "aura", "Error with block built on {:?}: {:?}", parent_hash, e); + } + }) + .map_err(|e| warn!("Failed to construct block: {:?}", e)) + ) + }) + }; + + future::loop_fn((), move |()| { + let authorship_task = ::std::panic::AssertUnwindSafe(make_authorship()); + authorship_task.catch_unwind().then(|res| { + match res { + Ok(Ok(())) => (), + Ok(Err(())) => warn!("Aura authorship task terminated unexpectedly. Restarting"), + Err(e) => { + if let Some(s) = e.downcast_ref::<&'static str>() { + warn!("Aura authorship task panicked at {:?}", s); + } + + warn!("Restarting Aura authorship task"); + } + } + + Ok(future::Loop::Continue(())) + }) + }) +} + +// a header which has been checked +enum CheckedHeader { + // a header which has slot in the future. this is the full header (not stripped) + // and the slot in which it should be processed. + Deferred(H, u64), + // a header which is fully checked, including signature. This is the pre-header + // accompanied by the seal components. + Checked(H, u64, ed25519::Signature), +} + + +/// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned. +/// if it's successful, returns the pre-header, the slot number, and the signat. +// +// FIXME: needs misbehavior types - https://github.com/paritytech/substrate/issues/1018 +fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, authorities: &[AuthorityId]) + -> Result, String> + where DigestItemFor: CompatibleDigestItem +{ + let digest_item = match header.digest_mut().pop() { + Some(x) => x, + None => return Err(format!("Header {:?} is unsealed", hash)), + }; + let (slot_num, &sig) = match digest_item.as_aura_seal() { + Some(x) => x, + None => return Err(format!("Header {:?} is unsealed", hash)), + }; + + if slot_num > slot_now { + header.digest_mut().push(digest_item); + Ok(CheckedHeader::Deferred(header, slot_num)) + } else { + // check the signature is valid under the expected authority and + // chain state. + + let expected_author = match slot_author(slot_num, &authorities) { + None => return Err("Slot Author not found".to_string()), + Some(author) => author + }; + + let pre_hash = header.hash(); + let to_sign = (slot_num, pre_hash).encode(); + let public = ed25519::Public(expected_author.0); + + if ed25519::verify_strong(&sig, &to_sign[..], public) { + Ok(CheckedHeader::Checked(header, slot_num, sig)) + } else { + Err(format!("Bad signature on {:?}", hash)) + } + } +} + +/// A verifier for Aura blocks. +pub struct AuraVerifier { + config: Config, + client: Arc, +} + +impl Verifier for AuraVerifier where + C: Authorities + BlockImport + Send + Sync, + DigestItemFor: CompatibleDigestItem, +{ + fn verify( + &self, + origin: BlockOrigin, + header: B::Header, + _justification: Vec, + body: Option> + ) -> Result<(ImportBlock, Option>), String> { + let slot_now = slot_now(self.config.slot_duration) + .ok_or("System time is before UnixTime?".to_owned())?; + let hash = header.hash(); + let parent_hash = *header.parent_hash(); + let authorities = self.client.authorities(&BlockId::Hash(parent_hash)) + .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; + + // we add one to allow for some small drift. + // FIXME: in the future, alter this queue to allow deferring of headers + // https://github.com/paritytech/substrate/issues/1019 + let checked_header = check_header::(slot_now + 1, header, hash, &authorities[..])?; + match checked_header { + CheckedHeader::Checked(pre_header, slot_num, sig) => { + let item = >::aura_seal(slot_num, sig); + + debug!(target: "aura", "Checked {:?}; importing.", pre_header); + + let import_block = ImportBlock { + origin, + header: pre_header, + external_justification: Vec::new(), + post_runtime_digests: vec![item], + body, + finalized: false, + auxiliary: Vec::new(), + }; + + // FIXME: extract authorities - https://github.com/paritytech/substrate/issues/1019 + Ok((import_block, None)) + } + CheckedHeader::Deferred(a, b) => { + debug!(target: "aura", "Checking {:?} failed; {:?}, {:?}.", hash, a, b); + Err(format!("Header {:?} rejected: too far in the future", hash)) + } + } + } +} + +/// The Aura import queue type. +pub type AuraImportQueue = BasicQueue>; + +/// Start an import queue for the Aura consensus algorithm. +pub fn import_queue(config: Config, client: Arc) -> AuraImportQueue where + B: Block, + C: Authorities + BlockImport + Send + Sync, + DigestItemFor: CompatibleDigestItem, +{ + let verifier = Arc::new(AuraVerifier { config, client }); + BasicQueue::new(verifier) +} + + + +#[cfg(test)] +mod tests { + use super::*; + use consensus_common::NoNetwork as DummyOracle; + use network::test::*; + use network::test::{Block as TestBlock, PeersClient}; + use runtime_primitives::traits::Block as BlockT; + use network::ProtocolConfig; + use parking_lot::Mutex; + use tokio::runtime::current_thread; + use keyring::Keyring; + use client::BlockchainEvents; + use test_client; + + type Error = client::error::Error; + + type TestClient = client::Client; + + struct DummyFactory(Arc); + struct DummyProposer(u64, Arc); + + impl Environment for DummyFactory { + type Proposer = DummyProposer; + type Error = Error; + + fn init(&self, parent_header: &::Header, _authorities: &[AuthorityId], _sign_with: Arc) + -> Result + { + Ok(DummyProposer(parent_header.number + 1, self.0.clone())) + } + } + + impl Proposer for DummyProposer { + type Error = Error; + type Create = Result; + + fn propose(&self) -> Result { + self.1.new_block().unwrap().bake().map_err(|e| e.into()) + } + } + + const SLOT_DURATION: u64 = 1; + const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); + + pub struct AuraTestNet { + peers: Vec>>>, + started: bool + } + + impl TestNetFactory for AuraTestNet { + type Verifier = AuraVerifier; + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + AuraTestNet { + peers: Vec::new(), + started: false + } + } + + fn make_verifier(&self, client: Arc, _cfg: &ProtocolConfig) + -> Arc + { + let config = Config { local_key: None, slot_duration: SLOT_DURATION }; + Arc::new(AuraVerifier { client, config }) + } + + fn peer(&self, i: usize) -> &Peer { + &self.peers[i] + } + + fn peers(&self) -> &Vec>> { + &self.peers + } + + fn mut_peers>>)>(&mut self, closure: F ) { + closure(&mut self.peers); + } + + fn started(&self) -> bool { + self.started + } + + fn set_started(&mut self, new: bool) { + self.started = new; + } + } + + #[test] + fn authoring_blocks() { + ::env_logger::init().ok(); + let mut net = AuraTestNet::new(3); + + net.start(); + + let peers = &[ + (0, Keyring::Alice), + (1, Keyring::Bob), + (2, Keyring::Charlie), + ]; + + let net = Arc::new(Mutex::new(net)); + let mut import_notifications = Vec::new(); + + let mut runtime = current_thread::Runtime::new().unwrap(); + for (peer_id, key) in peers { + let mut client = net.lock().peer(*peer_id).client().clone(); + let environ = Arc::new(DummyFactory(client.clone())); + import_notifications.push( + client.import_notification_stream() + .take_while(|n| { + Ok(!(n.origin != BlockOrigin::Own && n.header.number() < &5)) + }) + .for_each(move |_| Ok(())) + ); + let aura = start_aura( + Config { + local_key: Some(Arc::new(key.clone().into())), + slot_duration: SLOT_DURATION + }, + client, + environ.clone(), + DummyOracle, + ); + + runtime.spawn(aura); + } + + // wait for all finalized on each. + let wait_for = ::futures::future::join_all(import_notifications) + .map(|_| ()) + .map_err(|_| ()); + + let drive_to_completion = ::tokio::timer::Interval::new_interval(TEST_ROUTING_INTERVAL) + .for_each(move |_| { + net.lock().send_import_notifications(); + net.lock().sync(); + Ok(()) + }) + .map(|_| ()) + .map_err(|_| ()); + + runtime.block_on(wait_for.select(drive_to_completion).map_err(|_| ())).unwrap(); + } +} diff --git a/substrate/core/consensus/common/Cargo.toml b/substrate/core/consensus/common/Cargo.toml index ff5ebae0f8..08689721a0 100644 --- a/substrate/core/consensus/common/Cargo.toml +++ b/substrate/core/consensus/common/Cargo.toml @@ -4,5 +4,12 @@ version = "0.1.0" authors = ["Parity Technologies "] description = "Common utilities for substrate consensus" -[dev-dependencies] -substrate-primitives = { path= "../../primitives"} \ No newline at end of file +[dependencies] +substrate-primitives = { path= "../../primitives" } +error-chain = "0.12" +futures = "0.1" +sr-version = { path = "../../sr-version" } +sr-primitives = { path = "../../sr-primitives" } +tokio = "0.1.7" +parity-codec = "2.1" +parity-codec-derive = "2.0" diff --git a/substrate/core/consensus/common/src/block_import.rs b/substrate/core/consensus/common/src/block_import.rs new file mode 100644 index 0000000000..582886d827 --- /dev/null +++ b/substrate/core/consensus/common/src/block_import.rs @@ -0,0 +1,104 @@ + +use primitives::AuthorityId; +use runtime_primitives::traits::{Block as BlockT, DigestItemFor}; +use runtime_primitives::Justification; + +/// Block import result. +#[derive(Debug)] +pub enum ImportResult { + /// Added to the import queue. + Queued, + /// Already in the import queue. + AlreadyQueued, + /// Already in the blockchain. + AlreadyInChain, + /// Block or parent is known to be bad. + KnownBad, + /// Block parent is not in the chain. + UnknownParent, +} + +/// Block data origin. +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum BlockOrigin { + /// Genesis block built into the client. + Genesis, + /// Block is part of the initial sync with the network. + NetworkInitialSync, + /// Block was broadcasted on the network. + NetworkBroadcast, + /// Block that was received from the network and validated in the consensus process. + ConsensusBroadcast, + /// Block that was collated by this node. + Own, + /// Block was imported from a file. + File, +} + +/// Data required to import a Block +pub struct ImportBlock { + /// Origin of the Block + pub origin: BlockOrigin, + /// The header, without consensus post-digests applied. This should be in the same + /// state as it comes out of the runtime. + /// + /// Consensus engines which alter the header (by adding post-runtime digests) + /// should strip those off in the initial verification process and pass them + /// via the `post_runtime_digests` field. During block authorship, they should + /// not be pushed to the header directly. + /// + /// The reason for this distinction is so the header can be directly + /// re-executed in a runtime that checks digest equivalence -- the + /// post-runtime digests are pushed back on after. + pub header: Block::Header, + /// Justification provided for this block from the outside:. + pub external_justification: Justification, + /// Digest items that have been added after the runtime for external + /// work, like a consensus signature. + pub post_runtime_digests: Vec>, + /// Block's body + pub body: Option>, + /// Is this block finalized already? + /// `true` implies instant finality. + pub finalized: bool, + /// Auxiliary consensus data produced by the block. + /// Contains a list of key-value pairs. If values are `None`, the keys + /// will be deleted. + pub auxiliary: Vec<(Vec, Option>)>, +} + +impl ImportBlock { + /// Deconstruct the justified header into parts. + pub fn into_inner(self) + -> ( + BlockOrigin, + ::Header, + Justification, + Vec>, + Option::Extrinsic>>, + bool, + Vec<(Vec, Option>)>, + ) { + ( + self.origin, + self.header, + self.external_justification, + self.post_runtime_digests, + self.body, + self.finalized, + self.auxiliary, + ) + } +} + + + +/// Block import trait. +pub trait BlockImport { + type Error: ::std::error::Error + Send + 'static; + /// Import a Block alongside the new authorities valid form this block forward + fn import_block(&self, + block: ImportBlock, + new_authorities: Option> + ) -> Result; +} \ No newline at end of file diff --git a/substrate/core/consensus/common/src/error.rs b/substrate/core/consensus/common/src/error.rs new file mode 100644 index 0000000000..ccf57adb9f --- /dev/null +++ b/substrate/core/consensus/common/src/error.rs @@ -0,0 +1,88 @@ +// Copyright 2017-2018 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 . + +//! Error types in Consensus +use runtime_version::RuntimeVersion; + +error_chain! { + errors { + /// Missing state at block with given descriptor. + StateUnavailable(b: String) { + description("State missing at given block."), + display("State unavailable at block {}", b), + } + + /// I/O terminated unexpectedly + IoTerminated { + description("I/O terminated unexpectedly."), + display("I/O terminated unexpectedly."), + } + + /// Unable to schedule wakeup. + FaultyTimer(e: ::tokio::timer::Error) { + description("Timer error"), + display("Timer error: {}", e), + } + + /// Unable to propose a block. + CannotPropose { + description("Unable to create block proposal."), + display("Unable to create block proposal."), + } + + /// Error checking signature + InvalidSignature(s: ::primitives::ed25519::Signature, a: ::primitives::AuthorityId) { + description("Message signature is invalid"), + display("Message signature {:?} by {:?} is invalid.", s, a), + } + + /// Account is not an authority. + InvalidAuthority(a: ::primitives::AuthorityId) { + description("Message sender is not a valid authority"), + display("Message sender {:?} is not a valid authority.", a), + } + + /// Authoring interface does not match the runtime. + IncompatibleAuthoringRuntime(native: RuntimeVersion, on_chain: RuntimeVersion) { + description("Authoring for current runtime is not supported"), + display("Authoring for current runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain), + } + + /// Authoring interface does not match the runtime. + RuntimeVersionMissing { + description("Current runtime has no version"), + display("Authoring for current runtime is not supported since it has no version."), + } + + /// Authoring interface does not match the runtime. + NativeRuntimeMissing { + description("This build has no native runtime"), + display("Authoring in current build is not supported since it has no runtime."), + } + + /// Justification requirements not met. + InvalidJustification { + description("Invalid justification"), + display("Invalid justification."), + } + + /// Some other error. + Other(e: Box<::std::error::Error + Send>) { + description("Other error") + display("Other error: {}", e.description()) + } + } +} diff --git a/substrate/node/consensus/src/evaluation.rs b/substrate/core/consensus/common/src/evaluation.rs similarity index 73% rename from substrate/node/consensus/src/evaluation.rs rename to substrate/core/consensus/common/src/evaluation.rs index c21c202e96..db35e2f411 100644 --- a/substrate/node/consensus/src/evaluation.rs +++ b/substrate/core/consensus/common/src/evaluation.rs @@ -18,11 +18,10 @@ use super::MAX_TRANSACTIONS_SIZE; -use codec::{Decode, Encode}; -use node_runtime::{Block as GenericBlock}; -use node_primitives::{Hash, BlockNumber}; +use codec::Encode; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As}; +type BlockNumber = u64; error_chain! { errors { @@ -30,13 +29,13 @@ error_chain! { description("Proposal provided not a block."), display("Proposal provided not a block."), } - WrongParentHash(expected: Hash, got: Hash) { + WrongParentHash(expected: String, got: String) { description("Proposal had wrong parent hash."), display("Proposal had wrong parent hash. Expected {:?}, got {:?}", expected, got), } WrongNumber(expected: BlockNumber, got: BlockNumber) { description("Proposal had wrong number."), - display("Proposal had wrong number. Expected {:?}, got {:?}", expected, got), + display("Proposal had wrong number. Expected {}, got {}", expected, got), } ProposalTooLarge(size: usize) { description("Proposal exceeded the maximum size."), @@ -50,20 +49,17 @@ error_chain! { /// Attempt to evaluate a substrate block as a node block, returning error /// upon any initial validity checks failing. -pub fn evaluate_initial( +pub fn evaluate_initial( proposal: &Block, - parent_hash: &Hash, + parent_hash: &::Hash, parent_number: <::Header as HeaderT>::Number, -) -> Result<()> -where - Hash: PartialEq<<::Header as HeaderT>::Hash>, - Hash: Into + Clone, -{ +) -> Result<()> { + let encoded = Encode::encode(proposal); - let proposal = GenericBlock::decode(&mut &encoded[..]) + let proposal = Block::decode(&mut &encoded[..]) .ok_or_else(|| ErrorKind::BadProposalFormat)?; - let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { + let transactions_size = proposal.extrinsics().iter().fold(0, |a, tx| { a + Encode::encode(tx).len() }); @@ -72,11 +68,14 @@ where } if *parent_hash != *proposal.header().parent_hash() { - bail!(ErrorKind::WrongParentHash((*parent_hash).clone().into(), proposal.header.parent_hash)); + bail!(ErrorKind::WrongParentHash( + format!("{:?}", *parent_hash), + format!("{:?}", proposal.header().parent_hash()) + )); } - if parent_number.as_() + 1 != *proposal.header().number() { - bail!(ErrorKind::WrongNumber(parent_number.as_() + 1, proposal.header.number)); + if parent_number.as_() + 1 != proposal.header().number().as_() { + bail!(ErrorKind::WrongNumber(parent_number.as_() + 1, proposal.header().number().as_())); } Ok(()) diff --git a/substrate/core/consensus/common/src/lib.rs b/substrate/core/consensus/common/src/lib.rs index fde9d20ec9..12d5cfa70d 100644 --- a/substrate/core/consensus/common/src/lib.rs +++ b/substrate/core/consensus/common/src/lib.rs @@ -15,22 +15,118 @@ // along with Substrate Consensus Common. If not, see . // tag::description[] -//! Tracks offline validators. +//! Consensus basics and common features // end::description[] +// This provides "unused" building blocks to other crates #![allow(dead_code)] -#![cfg(feature="rhd")] +// our error-chain could potentially blow up otherwise +#![recursion_limit="128"] extern crate substrate_primitives as primitives; +extern crate futures; +extern crate sr_version as runtime_version; +extern crate sr_primitives as runtime_primitives; +extern crate tokio; -use primitives::{generic::BlockId, Justification}; -use primitives::traits::{Block, Header}; +extern crate parity_codec as codec; +#[macro_use] +extern crate parity_codec_derive; -/// Block import trait. -pub trait BlockImport { - /// Import a block alongside its corresponding justification. - fn import_block(&self, block: B, justification: Justification, authorities: &[AuthorityId]) -> bool; +#[macro_use] +extern crate error_chain; + +use std::sync::Arc; + +use primitives::{ed25519, AuthorityId}; +use runtime_primitives::generic::BlockId; +use runtime_primitives::traits::Block; +use futures::prelude::*; + +pub mod offline_tracker; +pub mod error; +mod block_import; +pub mod evaluation; + +// block size limit. +const MAX_TRANSACTIONS_SIZE: usize = 4 * 1024 * 1024; + +pub use self::error::{Error, ErrorKind}; +pub use block_import::{BlockImport, ImportBlock, BlockOrigin, ImportResult}; + +/// Trait for getting the authorities at a given block. +pub trait Authorities { + type Error: ::std::error::Error + Send + 'static; /// Get the authorities at the given block. + fn authorities(&self, at: &BlockId) -> Result, Self::Error>; } -pub mod offline_tracker; \ No newline at end of file +/// Environment producer for a Consensus instance. Creates proposer instance and communication streams. +pub trait Environment { + /// The proposer type this creates. + type Proposer: Proposer; + /// Error which can occur upon creation. + type Error: From; + + /// Initialize the proposal logic on top of a specific header. Provide + /// the authorities at that header, and a local key to sign any additional + /// consensus messages with as well. + 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 { + /// Error type which can occur when proposing or evaluating. + type Error: From + ::std::fmt::Debug + 'static; + /// Future that resolves to a committed proposal. + type Create: IntoFuture; + /// Create a proposal. + fn propose(&self) -> Self::Create; +} + +/// Inherent data to include in a block. +#[derive(Encode, Decode)] +pub struct InherentData { + /// Current timestamp. + pub timestamp: u64, + /// Indices of offline validators. + pub offline_indices: Vec, +} + +impl InherentData { + /// Create a new `InherentData` instance. + pub fn new(timestamp: u64, offline_indices: Vec) -> Self { + Self { + timestamp, + offline_indices + } + } +} + +/// An oracle for when major synchronization work is being undertaken. +/// +/// Generally, consensus authoring work isn't undertaken while well behind +/// the head of the chain. +pub trait SyncOracle { + /// Whether the synchronization service is undergoing major sync. + /// Returns true if so. + fn is_major_syncing(&self) -> bool; +} + +/// A synchronization oracle for when there is no network. +#[derive(Clone, Copy, Debug)] +pub struct NoNetwork; + +impl SyncOracle for NoNetwork { + fn is_major_syncing(&self) -> bool { false } +} + +impl SyncOracle for Arc { + fn is_major_syncing(&self) -> bool { + T::is_major_syncing(&*self) + } +} diff --git a/substrate/core/consensus/common/src/offline_tracker.rs b/substrate/core/consensus/common/src/offline_tracker.rs index 18845dd68b..bd8eab8b1b 100644 --- a/substrate/core/consensus/common/src/offline_tracker.rs +++ b/substrate/core/consensus/common/src/offline_tracker.rs @@ -16,7 +16,7 @@ //! Tracks offline validators. -use node_primitives::AccountId; +use primitives::AuthorityId; use std::collections::HashMap; use std::time::{Instant, Duration}; @@ -56,7 +56,7 @@ impl Observed { /// Tracks offline validators and can issue a report for those offline. pub struct OfflineTracker { - observed: HashMap, + observed: HashMap, } impl OfflineTracker { @@ -66,7 +66,7 @@ impl OfflineTracker { } /// Note new consensus is starting with the given set of validators. - pub fn note_new_block(&mut self, validators: &[AccountId]) { + pub fn note_new_block(&mut self, validators: &[AuthorityId]) { use std::collections::HashSet; let set: HashSet<_> = validators.iter().cloned().collect(); @@ -74,14 +74,14 @@ impl OfflineTracker { } /// Note that a round has ended. - pub fn note_round_end(&mut self, validator: AccountId, was_online: bool) { + pub fn note_round_end(&mut self, validator: AuthorityId, was_online: bool) { self.observed.entry(validator) .or_insert_with(Observed::new) .note_round_end(was_online); } /// Generate a vector of indices for offline account IDs. - pub fn reports(&self, validators: &[AccountId]) -> Vec { + pub fn reports(&self, validators: &[AuthorityId]) -> Vec { validators.iter() .enumerate() .filter_map(|(i, v)| if self.is_online(v) { @@ -93,7 +93,7 @@ impl OfflineTracker { } /// Whether reports on a validator set are consistent with our view of things. - pub fn check_consistency(&self, validators: &[AccountId], reports: &[u32]) -> bool { + pub fn check_consistency(&self, validators: &[AuthorityId], reports: &[u32]) -> bool { reports.iter().cloned().all(|r| { let v = match validators.get(r as usize) { Some(v) => v, @@ -106,7 +106,7 @@ impl OfflineTracker { }) } - fn is_online(&self, v: &AccountId) -> bool { + fn is_online(&self, v: &AuthorityId) -> bool { self.observed.get(v).map(Observed::is_active).unwrap_or(true) } } diff --git a/substrate/core/consensus/rhd/Cargo.toml b/substrate/core/consensus/rhd/Cargo.toml index f5b928c429..dce6a6d7f4 100644 --- a/substrate/core/consensus/rhd/Cargo.toml +++ b/substrate/core/consensus/rhd/Cargo.toml @@ -6,30 +6,33 @@ description = "Rhododendron Round-Based consensus-algorithm for substrate" [dependencies] futures = "0.1.17" -parity-codec = { version = "1.1" } +parity-codec = { version = "2.1" } parity-codec-derive = { version = "2.0" } substrate-primitives = { path = "../../primitives" } +substrate-consensus-common = { path = "../common" } +substrate-client = { path = "../../client" } +substrate-transaction-pool = { path = "../../transaction-pool" } srml-support = { path = "../../../srml/support" } +srml-system = { path = "../../../srml/system" } +srml-consensus = { path = "../../../srml/consensus" } sr-primitives = { path = "../../sr-primitives" } sr-version = { path = "../../sr-version" } sr-io = { path = "../../sr-io" } -srml-consensus = { path = "../../../srml/consensus" } tokio = "0.1.7" parking_lot = "0.4" error-chain = "0.12" -log = "0.3" -rhododendron = { git = "https://github.com/paritytech/rhododendron.git", features = ["codec"] } -serde = { version = "1.0", features = ["derive"] } +log = "0.4" +rhododendron = { version = "0.4.0", features = ["codec"] } +exit-future = "0.1" + [dev-dependencies] substrate-keyring = { path = "../../keyring" } substrate-executor = { path = "../../executor" } - [features] default = ["std"] std = [ - "serde/std", "substrate-primitives/std", "srml-support/std", "sr-primitives/std", diff --git a/substrate/core/consensus/rhd/src/error.rs b/substrate/core/consensus/rhd/src/error.rs index 806ba5624a..c18c36f679 100644 --- a/substrate/core/consensus/rhd/src/error.rs +++ b/substrate/core/consensus/rhd/src/error.rs @@ -1,4 +1,4 @@ -// Copyright 2017-2018 Parity Technologies (UK) Ltd. +// Copyright 2018 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate is free software: you can redistribute it and/or modify @@ -14,81 +14,44 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Error types in the BFT service. -use runtime_version::RuntimeVersion; +//! Error types in the rhododendron Consensus service. +use consensus::error::{Error as CommonError, ErrorKind as CommonErrorKind}; +use primitives::AuthorityId; +use client; error_chain! { + links { + Client(client::error::Error, client::error::ErrorKind); + Common(CommonError, CommonErrorKind); + } errors { - /// Missing state at block with given descriptor. - StateUnavailable(b: String) { - description("State missing at given block."), - display("State unavailable at block {}", b), + NotValidator(id: AuthorityId) { + description("Local account ID not a validator at this block."), + display("Local account ID ({:?}) not a validator at this block.", id), } - - /// I/O terminated unexpectedly - IoTerminated { - description("I/O terminated unexpectedly."), - display("I/O terminated unexpectedly."), + PrematureDestruction { + description("Proposer destroyed before finishing proposing or evaluating"), + display("Proposer destroyed before finishing proposing or evaluating"), } - - /// Unable to schedule wakeup. - FaultyTimer(e: ::tokio::timer::Error) { - description("Timer error"), - display("Timer error: {}", e), + Timer(e: ::tokio::timer::Error) { + description("Failed to register or resolve async timer."), + display("Timer failed: {}", e), } - - /// Unable to propose a block. - CannotPropose { - description("Unable to create block proposal."), - display("Unable to create block proposal."), - } - - /// Error checking signature - InvalidSignature(s: ::primitives::ed25519::Signature, a: ::primitives::AuthorityId) { - description("Message signature is invalid"), - display("Message signature {:?} by {:?} is invalid.", s, a), - } - - /// Account is not an authority. - InvalidAuthority(a: ::primitives::AuthorityId) { - description("Message sender is not a valid authority"), - display("Message sender {:?} is not a valid authority.", a), - } - - /// Authoring interface does not match the runtime. - IncompatibleAuthoringRuntime(native: RuntimeVersion, on_chain: RuntimeVersion) { - description("Authoring for current runtime is not supported"), - display("Authoring for current runtime is not supported. Native ({}) cannot author for on-chain ({}).", native, on_chain), - } - - /// Authoring interface does not match the runtime. - RuntimeVersionMissing { - description("Current runtime has no version"), - display("Authoring for current runtime is not supported since it has no version."), - } - - /// Authoring interface does not match the runtime. - NativeRuntimeMissing { - description("This build has no native runtime"), - display("Authoring in current build is not supported since it has no runtime."), - } - - /// Justification requirements not met. - InvalidJustification { - description("Invalid justification"), - display("Invalid justification."), - } - - /// Some other error. - Other(e: Box<::std::error::Error + Send>) { - description("Other error") - display("Other error: {}", e.description()) + Executor(e: ::futures::future::ExecuteErrorKind) { + description("Unable to dispatch agreement future"), + display("Unable to dispatch agreement future: {:?}", e), } } } impl From<::rhododendron::InputStreamConcluded> for Error { - fn from(_: ::rhododendron::InputStreamConcluded) -> Error { - ErrorKind::IoTerminated.into() + fn from(_: ::rhododendron::InputStreamConcluded) -> Self { + CommonErrorKind::IoTerminated.into() } } + +impl From for Error { + fn from(e: CommonErrorKind) -> Self { + CommonError::from(e).into() + } +} \ No newline at end of file diff --git a/substrate/core/consensus/rhd/src/lib.rs b/substrate/core/consensus/rhd/src/lib.rs index 0bb0cbc3c6..b99ea4a24c 100644 --- a/substrate/core/consensus/rhd/src/lib.rs +++ b/substrate/core/consensus/rhd/src/lib.rs @@ -32,60 +32,74 @@ //! set for this block height. // end::description[] -#![cfg(feature = "rhd")] - -#![recursion_limit="128"] +#![cfg(feature="rhd")] +// FIXME: doesn't compile - https://github.com/paritytech/substrate/issues/1020 extern crate parity_codec as codec; extern crate substrate_primitives as primitives; +extern crate substrate_client as client; +extern crate substrate_consensus_common as consensus; +extern crate substrate_transaction_pool as transaction_pool; +extern crate srml_system; extern crate srml_support as runtime_support; extern crate sr_primitives as runtime_primitives; extern crate sr_version as runtime_version; extern crate sr_io as runtime_io; -extern crate tokio; -#[cfg(test)] -extern crate substrate_keyring as keyring; extern crate parking_lot; extern crate rhododendron; +extern crate futures; +extern crate exit_future; +extern crate tokio; #[macro_use] extern crate log; - -extern crate futures; - #[macro_use] extern crate error_chain; -#[macro_use] -extern crate serde; - #[macro_use] extern crate parity_codec_derive; - -pub mod error; +#[cfg(test)] +extern crate substrate_keyring; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::time::{Instant, Duration}; +use std::time::{self, Instant, Duration}; -use codec::Encode; -use runtime_primitives::{generic::BlockId, Justification}; +use codec::{Decode, Encode}; +use consensus::offline_tracker::OfflineTracker; +use consensus::error::{ErrorKind as CommonErrorKind}; +use consensus::{Authorities, BlockImport, Environment, Proposer as BaseProposer}; +use client::{Client as SubstrateClient, CallExecutor}; +use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, OldTxQueue, BlockBuilderError}; +use runtime_primitives::generic::{BlockId, Era, ImportResult, ImportBlock, BlockOrigin}; use runtime_primitives::traits::{Block, Header}; -use primitives::{AuthorityId, ed25519, ed25519::LocalizedSignature}; +use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, As, BlockNumberToHash}; +use runtime_primitives::Justification; +use primitives::{AuthorityId, ed25519, Blake2Hasher, ed25519::LocalizedSignature}; +use srml_system::Trait as SystemT; -use futures::{Async, Stream, Sink, Future, IntoFuture}; +use node_runtime::Runtime; +use transaction_pool::txpool::{self, Pool as TransactionPool}; + +use futures::prelude::*; +use futures::future; use futures::sync::oneshot; +use tokio::runtime::TaskExecutor; use tokio::timer::Delay; -use parking_lot::Mutex; +use parking_lot::{RwLock, Mutex}; -pub use rhododendron::{InputStreamConcluded, AdvanceRoundReason, - Message as RhdMessage, Vote as RhdMessageVote}; -pub use error::{Error, ErrorKind}; +pub use rhododendron::{ + self, InputStreamConcluded, AdvanceRoundReason, Message as RhdMessage, + Vote as RhdMessageVote, Communication as RhdCommunication, +}; +pub use self::error::{Error, ErrorKind}; // pub mod misbehaviour_check; +mod error; +mod service; // statuses for an agreement mod status { @@ -94,6 +108,10 @@ mod status { pub const GOOD: usize = 2; } +pub type Timestamp = u64; + +pub type AccountId = ::primitives::H256; + /// Localized message type. pub type LocalizedMessage = rhododendron::LocalizedMessage< B, @@ -102,8 +120,6 @@ pub type LocalizedMessage = rhododendron::LocalizedMessage< LocalizedSignature >; - - /// Justification of some hash. pub struct RhdJustification(rhododendron::Justification); @@ -111,11 +127,12 @@ pub struct RhdJustification(rhododendron::Justification(rhododendron::PrepareJustification); /// Unchecked justification. +#[derive(Encode, Decode)] pub struct UncheckedJustification(rhododendron::UncheckedJustification); impl UncheckedJustification { /// Create a new, unchecked justification. - pub fn new(digest: H, signatures: Vec, round_number: usize) -> Self { + pub fn new(digest: H, signatures: Vec, round_number: u32) -> Self { UncheckedJustification(rhododendron::UncheckedJustification { digest, signatures, @@ -124,13 +141,20 @@ impl UncheckedJustification { } } -impl Into for RhdJustification { - fn into(self) -> Justification { - let p : Justification = UncheckedJustification(self.0.uncheck()).into(); - p +impl UncheckedJustification { + /// Decode a justification. + pub fn decode_justification(justification: Justification) -> Option { + let inner: rhododendron::UncheckedJustification<_, _> = Decode::decode(&mut &justification[..])?; + + Some(UncheckedJustification(inner)) } } +impl Into for UncheckedJustification { + fn into(self) -> Justification { + self.0.encode() + } +} impl From> for UncheckedJustification { fn from(inner: rhododendron::UncheckedJustification) -> Self { @@ -138,29 +162,6 @@ impl From> for Un } } -impl From for UncheckedJustification { - fn from(just: Justification) -> Self { - UncheckedJustification(rhododendron::UncheckedJustification { - round_number: just.round_number as usize, - digest: just.hash, - signatures: just.signatures.into_iter().map(|(from, sig)| LocalizedSignature { - signer: from.into(), - signature: sig, - }).collect(), - }) - } -} - -impl Into for UncheckedJustification { - fn into(self) -> Justification { - Justification { - round_number: self.0.round_number as u32, - hash: self.0.digest, - signatures: self.0.signatures.into_iter().map(|s| (s.signer.into(), s.signature)).collect(), - } - } -} - /// Result of a committed round of BFT pub type Committed = rhododendron::Committed::Hash, LocalizedSignature>; @@ -170,59 +171,72 @@ pub type Communication = rhododendron::Communication::Hash, A /// Misbehavior observed from BFT participants. pub type Misbehavior = rhododendron::Misbehavior; -/// Environment producer for a BFT instance. Creates proposer instance and communication streams. -pub trait Environment { - /// The proposer type this creates. - type Proposer: Proposer; - /// The input stream type. - type Input: Stream, Error=>::Error>; - /// The output stream type. - type Output: Sink, SinkError=>::Error>; - /// Error which can occur upon creation. - type Error: From; +/// Shared offline validator tracker. +pub type SharedOfflineTracker = Arc>; - /// Initialize the proposal logic on top of a specific header. - /// Produces the proposer and message streams for this instance of BFT agreement. - // TODO: provide state context explicitly? - fn init(&self, parent_header: &B::Header, authorities: &[AuthorityId], sign_with: Arc) - -> Result<(Self::Proposer, Self::Input, Self::Output), Self::Error>; -} - -/// Logic for a proposer. -/// -/// This will encapsulate creation and evaluation of proposals at a specific -/// block. -pub trait Proposer { - /// Error type which can occur when proposing or evaluating. - type Error: From + From + ::std::fmt::Debug + 'static; - /// Future that resolves to a committed proposal. - type Create: IntoFuture; - /// Future that resolves when a proposal is evaluated. - type Evaluate: IntoFuture; - - /// Create a proposal. - fn propose(&self) -> Self::Create; - - /// Evaluate proposal. True means valid. - fn evaluate(&self, proposal: &B) -> Self::Evaluate; - - /// Import witnessed misbehavior. +/// A proposer for a rhododendron instance. This must implement the base proposer logic. +pub trait LocalProposer: BaseProposer { + /// Import witnessed rhododendron 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. - fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId; + fn round_proposer(&self, round_number: u32, authorities: &[AuthorityId]) -> AuthorityId; /// Hook called when a BFT round advances without a proposal. - fn on_round_end(&self, _round_number: usize, _proposed: bool) { } + fn on_round_end(&self, _round_number: u32, _proposed: bool) { } } -/// Trait for getting the authorities at a given block. -pub trait Authorities { - /// Get the authorities at the given block. - fn authorities(&self, at: &BlockId) -> Result, Error>; + +/// Build new blocks. +pub trait BlockBuilder { + /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. + fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), Error>; } +/// Local client abstraction for the consensus. +pub trait AuthoringApi: + Send + + Sync + + BlockBuilderAPI<::Block, Error=::Error> + + Core<::Block, AuthorityId, Error=::Error> + + OldTxQueue<::Block, Error=::Error> +{ + /// The block used for this API type. + type Block: BlockT; + /// The error used by this API type. + type Error: std::error::Error; + + /// Build a block on top of the given, with inherent extrinsics pre-pushed. + fn build_block) -> ()>( + &self, + at: &BlockId, + inherent_data: InherentData, + build_ctx: F, + ) -> Result; +} + +/// A long-lived network which can create BFT message routing processes on demand. +pub trait Network { + /// The block used for this API type. + type Block: BlockT; + /// The input stream of BFT messages. Should never logically conclude. + type Input: Stream,Error=Error>; + /// The output sink of BFT messages. Messages sent here should eventually pass to all + /// current authorities. + type Output: Sink,SinkError=Error>; + + /// Instantiate input and output streams. + fn communication_for( + &self, + validators: &[AuthorityId], + local_id: AuthorityId, + parent_hash: ::Hash, + task_executor: TaskExecutor + ) -> (Self::Input, Self::Output); +} + + // caches the round number to start at if we end up with BFT consensus on the same // parent hash more than once (happens if block is bad). // @@ -231,7 +245,7 @@ pub trait Authorities { #[derive(Debug)] struct RoundCache { hash: Option, - start_round: usize, + start_round: u32, } /// Instance of BFT agreement. @@ -244,19 +258,19 @@ struct BftInstance { proposer: P, } -impl> BftInstance +impl> BftInstance where B: Clone + Eq, B::Hash: ::std::hash::Hash { - fn round_timeout_duration(&self, round: usize) -> Duration { + fn round_timeout_duration(&self, round: u32) -> Duration { // 2^(min(6, x/8)) * 10 // Grows exponentially starting from 10 seconds, capped at 640 seconds. - const ROUND_INCREMENT_STEP: usize = 8; + const ROUND_INCREMENT_STEP: u32 = 8; let round = round / ROUND_INCREMENT_STEP; - let round = ::std::cmp::min(6, round) as u32; + let round = ::std::cmp::min(6, round); let timeout = 1u64.checked_shl(round) .unwrap_or_else(u64::max_value) @@ -265,7 +279,7 @@ impl> BftInstance Duration::from_secs(timeout) } - fn update_round_cache(&self, current_round: usize) { + fn update_round_cache(&self, current_round: u32) { let mut cache = self.cache.lock(); if cache.hash.as_ref() == Some(&self.parent_hash) { cache.start_round = current_round + 1; @@ -273,7 +287,7 @@ impl> BftInstance } } -impl> rhododendron::Context for BftInstance +impl> rhododendron::Context for BftInstance where B: Clone + Eq, B::Hash: ::std::hash::Hash, @@ -303,7 +317,7 @@ impl> rhododendron::Context for BftInstance sign_message(message, &*self.key, self.parent_hash.clone()) } - fn round_proposer(&self, round: usize) -> AuthorityId { + fn round_proposer(&self, round: u32) -> AuthorityId { self.proposer.round_proposer(round, &self.authorities[..]) } @@ -311,10 +325,10 @@ impl> rhododendron::Context for BftInstance self.proposer.evaluate(proposal).into_future() } - fn begin_round_timeout(&self, round: usize) -> Self::RoundTimeout { + fn begin_round_timeout(&self, round: u32) -> Self::RoundTimeout { let timeout = self.round_timeout_duration(round); let fut = Delay::new(Instant::now() + timeout) - .map_err(|e| Error::from(ErrorKind::FaultyTimer(e))) + .map_err(|e| Error::from(CommonErrorKind::FaultyTimer(e))) .map_err(Into::into); Box::new(fut) @@ -322,9 +336,9 @@ impl> rhododendron::Context for BftInstance fn on_advance_round( &self, - accumulator: &::rhododendron::Accumulator, - round: usize, - next_round: usize, + accumulator: &rhododendron::Accumulator, + round: u32, + next_round: u32, reason: AdvanceRoundReason, ) { use std::collections::HashSet; @@ -334,12 +348,12 @@ impl> rhododendron::Context for BftInstance .collect::>(); let round_timeout = self.round_timeout_duration(next_round); - debug!(target: "bft", "Advancing to round {} from {}", next_round, round); - debug!(target: "bft", "Participating authorities: {:?}", + debug!(target: "rhd", "Advancing to round {} from {}", next_round, round); + debug!(target: "rhd", "Participating authorities: {:?}", collect_pubkeys(accumulator.participants())); - debug!(target: "bft", "Voting authorities: {:?}", + debug!(target: "rhd", "Voting authorities: {:?}", collect_pubkeys(accumulator.voters())); - debug!(target: "bft", "Round {} should end in at most {} seconds from now", next_round, round_timeout.as_secs()); + debug!(target: "rhd", "Round {} should end in at most {} seconds from now", next_round, round_timeout.as_secs()); self.update_round_cache(next_round); @@ -354,9 +368,10 @@ impl> rhododendron::Context for BftInstance 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>, + P: LocalProposer, + P: BaseProposer, + InStream: Stream, Error=Error>, + OutSink: Sink, SinkError=Error>, { inner: rhododendron::Agreement, InStream, OutSink>, status: Arc, @@ -367,11 +382,11 @@ pub struct BftFuture where impl Future for BftFuture where B: Block + Clone + Eq, B::Hash: ::std::hash::Hash, - P: Proposer, - P::Error: ::std::fmt::Display, + P: LocalProposer, + P: BaseProposer, I: BlockImport, - InStream: Stream, Error=P::Error>, - OutSink: Sink, SinkError=P::Error>, + InStream: Stream, Error=Error>, + OutSink: Sink, SinkError=Error>, { type Item = (); type Error = (); @@ -383,7 +398,6 @@ impl Future for BftFuture false, }; - // TODO: handle and log this error in a way which isn't noisy on exit. let committed = match self.inner.poll().map_err(|_| ()) { Ok(Async::Ready(x)) => x, Ok(Async::NotReady) => @@ -398,23 +412,36 @@ impl Future for BftFuture { + warn!(target: "rhd", "Error importing block {:?} in round #{}: {:?}", + hash, committed.round_number, e); + status::BAD + } + Ok(ImportResult::KnownBad) => { + warn!(target: "rhd", "{:?} was bad block agreed on in round #{}", + hash, committed.round_number); + status::BAD + } + _ => status::GOOD + }; + + self.status.store(new_status, Ordering::Release); - if !import_ok { - warn!(target: "bft", "{:?} was bad block agreed on in round #{}", - hash, committed.round_number); - self.status.store(status::BAD, Ordering::Release); - } else { - self.status.store(status::GOOD, Ordering::Release); - } } else { // assume good unless we received the proposal. self.status.store(status::GOOD, Ordering::Release); @@ -429,9 +456,10 @@ impl Future for BftFuture 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>, + P: LocalProposer, + P: BaseProposer, + InStream: Stream, Error=Error>, + OutSink: Sink, SinkError=Error>, { fn drop(&mut self) { // TODO: have a trait member to pass misbehavior reports into. @@ -476,10 +504,10 @@ impl BftService where B: Block + Clone + Eq, P: Environment, - >::Error: ::std::fmt::Display, + P::Proposer: LocalProposer, + P::Proposer: BaseProposer, I: BlockImport + Authorities, { - /// Create a new service instance. pub fn new(client: Arc, key: Arc, factory: P) -> BftService { BftService { @@ -502,20 +530,29 @@ impl BftService } /// Signal that a valid block with the given header has been imported. + /// Provide communication streams that are localized to this block. + /// It's recommended to use the communication primitives provided by this + /// module for signature checking and decoding. See `CheckedStream` and + /// `SigningSink` for more details. + /// + /// Messages received on the stream that don't match the expected format + /// will be dropped. /// /// 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: &B::Header) + pub fn build_upon(&self, header: &B::Header, input: In, output: Out) -> Result>::Proposer, I, -

>::Input, -

>::Output, + In, + Out, >>, P::Error> where + In: Stream, Error=Error>, + Out: Sink, SinkError=Error>, { let hash = header.hash(); @@ -527,22 +564,23 @@ impl BftService return Ok(None) } - let authorities = self.client.authorities(&BlockId::Hash(hash.clone()))?; + let authorities = self.client.authorities(&BlockId::Hash(hash.clone())) + .map_err(|e| CommonErrorKind::Other(Box::new(e)).into())?; let n = authorities.len(); let max_faulty = max_faulty_of(n); - trace!(target: "bft", "Initiating agreement on top of #{}, {:?}", header.number(), hash); - trace!(target: "bft", "max_faulty_of({})={}", n, max_faulty); + trace!(target: "rhd", "Initiating agreement on top of #{}, {:?}", header.number(), hash); + trace!(target: "rhd", "max_faulty_of({})={}", n, max_faulty); let local_id = self.local_id(); if !authorities.contains(&local_id) { // cancel current agreement live_agreement.take(); - Err(ErrorKind::InvalidAuthority(local_id).into())?; + Err(CommonErrorKind::InvalidAuthority(local_id).into())?; } - let (proposer, input, output) = self.factory.init(header, &authorities, self.key.clone())?; + let proposer = self.factory.init(header, &authorities, self.key.clone())?; let bft_instance = BftInstance { proposer, @@ -564,9 +602,9 @@ impl BftService // fast forward round number if necessary. { let mut cache = self.round_cache.lock(); - trace!(target: "bft", "Round cache: {:?}", &*cache); + trace!(target: "rhd", "Round cache: {:?}", &*cache); if cache.hash.as_ref() == Some(&hash) { - trace!(target: "bft", "Fast-forwarding to round {}", cache.start_round); + trace!(target: "rhd", "Fast-forwarding to round {}", cache.start_round); let start_round = cache.start_round; cache.start_round += 1; @@ -622,6 +660,103 @@ impl BftService } } +/// Stream that decodes rhododendron messages and checks signatures. +/// +/// This stream is localized to a specific parent block-hash, as all messages +/// will be signed in a way that accounts for it. When using this with +/// `BftService::build_upon`, the user should take care to use the same hash as for that. +pub struct CheckedStream { + inner: S, + local_id: AuthorityId, + authorities: Vec, + parent_hash: B::Hash, +} + +impl CheckedStream { + /// Construct a new checked stream. + pub fn new( + inner: S, + local_id: AuthorityId, + authorities: Vec, + parent_hash: B::Hash, + ) -> Self { + CheckedStream { + inner, + local_id, + authorities, + parent_hash, + } + } +} + +impl>> Stream for CheckedStream + where S::Error: From, +{ + type Item = Communication; + type Error = S::Error; + + fn poll(&mut self) -> Poll, Self::Error> { + use rhododendron::LocalizedMessage as RhdLocalized; + loop { + match self.inner.poll()? { + Async::Ready(Some(item)) => { + let comms: Communication = match Decode::decode(&mut &item[..]) { + Some(x) => x, + None => continue, + }; + + match comms { + RhdCommunication::Auxiliary(prepare_just) => { + let checked = check_prepare_justification::( + &self.authorities, + self.parent_hash, + UncheckedJustification(prepare_just.uncheck()), + ); + if let Ok(checked) = checked { + return Ok(Async::Ready( + Some(RhdCommunication::Auxiliary(checked.0)) + )); + } + } + RhdCommunication::Consensus(RhdLocalized::Propose(p)) => { + if p.sender == self.local_id { continue } + + let checked = check_proposal::( + &self.authorities, + &self.parent_hash, + &p, + ); + + if let Ok(()) = checked { + return Ok(Async::Ready( + Some(RhdCommunication::Consensus(RhdLocalized::Propose(p))) + )); + } + } + RhdCommunication::Consensus(RhdLocalized::Vote(v)) => { + if v.sender == self.local_id { continue } + + let checked = check_vote::( + &self.authorities, + &self.parent_hash, + &v, + ); + + if let Ok(()) = checked { + return Ok(Async::Ready( + Some(RhdCommunication::Consensus(RhdLocalized::Vote(v))) + )); + } + } + } + } + Async::Ready(None) => return Ok(Async::Ready(None)), + Async::NotReady => return Ok(Async::NotReady), + } + } + } +} + /// Given a total number of authorities, yield the maximum faulty that would be allowed. /// This will always be under 1/3. pub fn max_faulty_of(n: usize) -> usize { @@ -634,7 +769,116 @@ pub fn bft_threshold(n: usize) -> usize { n - max_faulty_of(n) } -// /// Sign a BFT message with the given key. +// actions in the signature scheme. +#[derive(Encode)] +enum Action { + Prepare(u32, H), + Commit(u32, H), + AdvanceRound(u32), + // signatures of header hash and full candidate are both included. + ProposeHeader(u32, H), + Propose(u32, B), +} + +// encode something in a way which is localized to a specific parent-hash +fn localized_encode(parent_hash: H, value: E) -> Vec { + (parent_hash, value).encode() +} + +fn check_justification_signed_message( + authorities: &[AuthorityId], + message: &[u8], + just: UncheckedJustification) +-> Result, UncheckedJustification> { + // additional error information could be useful here. + just.0.check(authorities.len() - max_faulty_of(authorities.len()), |_, _, sig| { + let auth_id = sig.signer.clone().into(); + if !authorities.contains(&auth_id) { return None } + + if ed25519::verify_strong(&sig.signature, message, &sig.signer) { + Some(sig.signer.0) + } else { + None + } + }).map(RhdJustification).map_err(UncheckedJustification) +} + +/// Check a full justification for a header hash. +/// Provide all valid authorities. +/// +/// On failure, returns the justification back. +pub fn check_justification( + authorities: &[AuthorityId], + parent: B::Hash, + just: UncheckedJustification +) -> Result, UncheckedJustification> { + let vote: Action = Action::Commit(just.0.round_number as u32, just.0.digest.clone()); + let message = localized_encode(parent, vote); + + check_justification_signed_message(authorities, &message[..], just) +} + +/// Check a prepare justification for a header hash. +/// Provide all valid authorities. +/// +/// On failure, returns the justification back. +pub fn check_prepare_justification(authorities: &[AuthorityId], parent: B::Hash, just: UncheckedJustification) + -> Result, UncheckedJustification> +{ + let vote: Action = Action::Prepare(just.0.round_number as u32, just.0.digest.clone()); + let message = localized_encode(parent, vote); + + check_justification_signed_message(authorities, &message[..], just).map(|e| PrepareJustification(e.0)) +} + +/// Check proposal message signatures and authority. +/// Provide all valid authorities. +pub fn check_proposal( + authorities: &[AuthorityId], + parent_hash: &B::Hash, + propose: &rhododendron::LocalizedProposal) + -> Result<(), Error> +{ + if !authorities.contains(&propose.sender) { + return Err(CommonErrorKind::InvalidAuthority(propose.sender.into()).into()); + } + + let action_header = Action::ProposeHeader(propose.round_number as u32, propose.digest.clone()); + let action_propose = Action::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 vote message signatures and authority. +/// Provide all valid authorities. +pub fn check_vote( + authorities: &[AuthorityId], + parent_hash: &B::Hash, + vote: &rhododendron::LocalizedVote) + -> Result<(), Error> +{ + if !authorities.contains(&vote.sender) { + return Err(CommonErrorKind::InvalidAuthority(vote.sender.into()).into()); + } + + let action = match vote.vote { + rhododendron::Vote::Prepare(r, ref h) => Action::Prepare(r as u32, h.clone()), + rhododendron::Vote::Commit(r, ref h) => Action::Commit(r as u32, h.clone()), + rhododendron::Vote::AdvanceRound(r) => Action::AdvanceRound(r as u32), + }; + check_action::(action, parent_hash, &vote.signature) +} + +fn check_action(action: Action, parent_hash: &B::Hash, sig: &LocalizedSignature) -> Result<(), Error> { + let message = localized_encode(*parent_hash, action); + if ed25519::verify_strong(&sig.signature, &message, &sig.signer) { + Ok(()) + } else { + Err(CommonErrorKind::InvalidSignature(sig.signature.into(), sig.signer.clone().into()).into()) + } +} + +/// Sign a BFT message with the given key. pub fn sign_message( message: RhdMessage, key: &ed25519::Pair, @@ -642,13 +886,9 @@ pub fn sign_message( ) -> LocalizedMessage { let signer = key.public(); - let sign_action = |action: ::rhododendron::Vote| { - let primitive = ::rhododendron::LocalizedVote { - parent: parent_hash.clone(), - action, - }; + let sign_action = |action: Action| { + let to_sign = localized_encode(parent_hash.clone(), action); - let to_sign = Encode::encode(&primitive); LocalizedSignature { signer: signer.clone(), signature: key.sign(&to_sign), @@ -658,10 +898,10 @@ pub fn sign_message( match message { RhdMessage::Propose(r, proposal) => { let header_hash = proposal.hash(); - let action_header = ::rhododendron::ProposeHeader(r as u32, header_hash.clone()); - let action_propose = ::rhododendron::Propose(r as u32, proposal.clone()); + let action_header = Action::ProposeHeader(r as u32, header_hash.clone()); + let action_propose = Action::Propose(r as u32, proposal.clone()); - ::rhododendron::LocalizedMessage::Propose(::rhododendron::LocalizedProposal { + rhododendron::LocalizedMessage::Propose(rhododendron::LocalizedProposal { round_number: r, proposal, digest: header_hash, @@ -670,20 +910,443 @@ pub fn sign_message( full_signature: sign_action(action_propose), }) } - RhdMessage::Vote(vote) => ::rhododendron::LocalizedMessage::Vote( - ::rhododendron::LocalizedVote { + RhdMessage::Vote(vote) => rhododendron::LocalizedMessage::Vote({ + let action = match vote { + RhdMessageVote::Prepare(r, h) => Action::Prepare(r as u32, h), + RhdMessageVote::Commit(r, h) => Action::Commit(r as u32, h), + RhdMessageVote::AdvanceRound(r) => Action::AdvanceRound(r as u32), + }; + + rhododendron::LocalizedVote { vote: vote, sender: signer.clone().into(), signature: sign_action(action), } - ) + }) } } + +impl<'a, B, E, Block> BlockBuilder for client::block_builder::BlockBuilder<'a, B, E, Block, Blake2Hasher> where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT +{ + fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), Error> { + client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) + } +} + +impl<'a, B, E, Block> AuthoringApi for SubstrateClient where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, +{ + type Block = Block; + type Error = client::error::Error; + + fn build_block) -> ()>( + &self, + at: &BlockId, + inherent_data: InherentData, + mut build_ctx: F, + ) -> Result { + let runtime_version = self.runtime_version_at(at)?; + + let mut block_builder = self.new_block_at(at)?; + if runtime_version.has_api(*b"blkbuild", 1) { + for inherent in self.inherent_extrinsics(at, &inherent_data)? { + block_builder.push(inherent)?; + } + } + + build_ctx(&mut block_builder); + + block_builder.bake().map_err(Into::into) + } +} + + +/// Proposer factory. +pub struct ProposerFactory where + C: AuthoringApi, + A: txpool::ChainApi, +{ + /// The client instance. + pub client: Arc, + /// The transaction pool. + pub transaction_pool: Arc>, + /// The backing network handle. + pub network: N, + /// handle to remote task executor + pub handle: TaskExecutor, + /// Offline-tracker. + pub offline: SharedOfflineTracker, + /// Force delay in evaluation this long. + pub force_delay: u64, +} + +impl consensus::Environment<::Block> for ProposerFactory where + N: Network::Block>, + C: AuthoringApi + BlockNumberToHash, + A: txpool::ChainApi::Block>, + // <::Block as BlockT>::Hash: + // Into<::Hash> + PartialEq + Into, + Error: From<::Error> +{ + type Proposer = Proposer; + type Error = Error; + + fn init( + &self, + parent_header: &<::Block as BlockT>::Header, + authorities: &[AuthorityId], + sign_with: Arc, + ) -> Result { + use runtime_primitives::traits::Hash as HashT; + let parent_hash = parent_header.hash(); + + let id = BlockId::hash(parent_hash); + let random_seed = self.client.random_seed(&id)?; + let random_seed = <<::Block as BlockT>::Header as HeaderT>::Hashing::hash(random_seed.as_ref()); + + let validators = self.client.validators(&id)?; + self.offline.write().note_new_block(&validators[..]); + + info!("Starting consensus session on top of parent {:?}", parent_hash); + + let local_id = sign_with.public().0.into(); + let (input, output) = self.network.communication_for( + authorities, + local_id, + parent_hash.clone(), + self.handle.clone(), + ); + let now = Instant::now(); + let proposer = Proposer { + client: self.client.clone(), + start: now, + local_key: sign_with, + parent_hash, + parent_id: id, + parent_number: *parent_header.number(), + random_seed, + transaction_pool: self.transaction_pool.clone(), + offline: self.offline.clone(), + validators, + minimum_timestamp: current_timestamp() + self.force_delay, + network: self.network.clone() + }; + + Ok(proposer) + } +} + +/// The proposer logic. +pub struct Proposer { + client: Arc, + start: Instant, + local_key: Arc, + parent_hash: <::Block as BlockT>::Hash, + parent_id: BlockId<::Block>, + parent_number: <<::Block as BlockT>::Header as HeaderT>::Number, + random_seed: <::Block as BlockT>::Hash, + transaction_pool: Arc>, + offline: SharedOfflineTracker, + validators: Vec, + minimum_timestamp: u64, + network: N, +} + +impl Proposer { + fn primary_index(&self, round_number: u32, len: usize) -> usize { + use primitives::uint::U256; + + let big_len = U256::from(len); + let offset = U256::from_big_endian(self.random_seed.as_ref()) % big_len; + let offset = offset.low_u64() as usize + round_number as usize; + offset % len + } +} + +impl BaseProposer<::Block> for Proposer where + C: AuthoringApi + BlockNumberToHash, + A: txpool::ChainApi::Block>, + <::Block as BlockT>::Hash: + Into<::Hash> + PartialEq + Into, + error::Error: From<::Error> +{ + type Create = Result<::Block, Error>; + type Error = Error; + type Evaluate = Box>; + + fn propose(&self) -> Self::Create { + use runtime_primitives::traits::BlakeTwo256; + + const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); + + let timestamp = ::std::cmp::max(self.minimum_timestamp, current_timestamp()); + + let elapsed_since_start = self.start.elapsed(); + let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { + Vec::new() + } else { + self.offline.read().reports(&self.validators[..]) + }; + + if !offline_indices.is_empty() { + info!( + "Submitting offline validators {:?} for slash-vote", + offline_indices.iter().map(|&i| self.validators[i as usize]).collect::>(), + ) + } + + let inherent_data = InherentData { + timestamp, + offline_indices, + }; + + let block = self.client.build_block( + &self.parent_id, + inherent_data, + |block_builder| { + let mut unqueue_invalid = Vec::new(); + self.transaction_pool.ready(|pending_iterator| { + let mut pending_size = 0; + for pending in pending_iterator { + // TODO [ToDr] Probably get rid of it, and validate in runtime. + let encoded_size = pending.data.encode().len(); + if pending_size + encoded_size >= MAX_TRANSACTIONS_SIZE { break } + + match block_builder.push_extrinsic(pending.data.clone()) { + Ok(()) => { + pending_size += encoded_size; + } + Err(e) => { + trace!(target: "transaction-pool", "Invalid transaction: {}", e); + unqueue_invalid.push(pending.hash.clone()); + } + } + } + }); + + self.transaction_pool.remove_invalid(&unqueue_invalid); + })?; + + info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", + block.header().number(), + <::Block as BlockT>::Hash::from(block.header().hash()), + block.header().parent_hash(), + block.extrinsics().iter() + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) + .collect::>() + .join(", ") + ); + + let substrate_block = Decode::decode(&mut block.encode().as_slice()) + .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + + assert!(evaluation::evaluate_initial( + &substrate_block, + &self.parent_hash, + self.parent_number, + ).is_ok()); + + Ok(substrate_block) + } + + fn evaluate(&self, unchecked_proposal: &::Block) -> Self::Evaluate { + debug!(target: "rhd", "evaluating block on top of parent ({}, {:?})", self.parent_number, self.parent_hash); + + // do initial serialization and structural integrity checks. + if let Err(e) = evaluation::evaluate_initial( + unchecked_proposal, + &self.parent_hash, + self.parent_number, + ) { + debug!(target: "rhd", "Invalid proposal: {:?}", e); + return Box::new(future::ok(false)); + }; + + let current_timestamp = current_timestamp(); + let inherent = InherentData::new( + current_timestamp, + self.offline.read().reports(&self.validators) + ); + let proposed_timestamp = match self.client.check_inherents( + &self.parent_id, + &unchecked_proposal, + &inherent + ) { + Ok(Ok(())) => None, + Ok(Err(BlockBuilderError::TimestampInFuture(timestamp))) => Some(timestamp), + Ok(Err(e)) => { + debug!(target: "rhd", "Invalid proposal (check_inherents): {:?}", e); + return Box::new(future::ok(false)); + }, + Err(e) => { + debug!(target: "rhd", "Could not call into runtime: {:?}", e); + return Box::new(future::ok(false)); + } + }; + + let vote_delays = { + + // the duration until the given timestamp is current + let proposed_timestamp = ::std::cmp::max(self.minimum_timestamp, proposed_timestamp.unwrap_or(0)); + let timestamp_delay = if proposed_timestamp > current_timestamp { + let delay_s = proposed_timestamp - current_timestamp; + debug!(target: "rhd", "Delaying evaluation of proposal for {} seconds", delay_s); + Some(Instant::now() + Duration::from_secs(delay_s)) + } else { + None + }; + + match timestamp_delay { + Some(duration) => future::Either::A( + Delay::new(duration).map_err(|e| ErrorKind::Timer(e).into()) + ), + None => future::Either::B(future::ok(())), + } + }; + + // evaluate whether the block is actually valid. + // it may be better to delay this until the delays are finished + let evaluated = match self.client.execute_block(&self.parent_id, &unchecked_proposal.clone()) + .map_err(Error::from) { + Ok(()) => Ok(true), + Err(err) => match err.kind() { + error::ErrorKind::Client(client::error::ErrorKind::Execution(_)) => Ok(false), + _ => Err(err) + } + }; + + let future = future::result(evaluated).and_then(move |good| { + let end_result = future::ok(good); + if good { + // delay a "good" vote. + future::Either::A(vote_delays.and_then(|_| end_result)) + } else { + // don't delay a "bad" evaluation. + future::Either::B(end_result) + } + }); + + Box::new(future) as Box<_> + } +} + +impl LocalProposer<::Block> for Proposer where + C: AuthoringApi + BlockNumberToHash, + A: txpool::ChainApi::Block>, + Self: BaseProposer<::Block, Error=Error>, + <::Block as BlockT>::Hash: + Into<::Hash> + PartialEq + Into, + error::Error: From<::Error> +{ + + fn round_proposer(&self, round_number: u32, authorities: &[AuthorityId]) -> AuthorityId { + let offset = self.primary_index(round_number, authorities.len()); + let proposer = authorities[offset as usize].clone(); + trace!(target: "rhd", "proposer for round {} is {}", round_number, proposer); + + proposer + } + + fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior<<::Block as BlockT>::Hash>)>) { + use rhododendron::Misbehavior as GenericMisbehavior; + use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; + use node_runtime::{Call, UncheckedExtrinsic, ConsensusCall}; + + let mut next_index = { + let local_id = self.local_key.public().0; + let cur_index = self.transaction_pool.cull_and_get_pending(&BlockId::hash(self.parent_hash), |pending| pending + .filter(|tx| tx.verified.sender == local_id) + .last() + .map(|tx| Ok(tx.verified.index())) + .unwrap_or_else(|| self.client.account_nonce(&self.parent_id, local_id)) + .map_err(Error::from) + ); + + match cur_index { + Ok(cur_index) => cur_index + 1, + Err(e) => { + warn!(target: "consensus", "Error computing next transaction index: {:?}", e); + return; + } + } + }; + + for (target, misbehavior) in misbehavior { + let report = MisbehaviorReport { + parent_hash: self.parent_hash.into(), + parent_number: self.parent_number.as_(), + target, + misbehavior: match misbehavior { + GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, + GenericMisbehavior::DoublePropose(_, _, _) => continue, + GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoublePrepare(round as u32, (h1.into(), s1.signature), (h2.into(), s2.signature)), + GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) + => MisbehaviorKind::BftDoubleCommit(round as u32, (h1.into(), s1.signature), (h2.into(), s2.signature)), + } + }; + let payload = ( + next_index, + Call::Consensus(ConsensusCall::report_misbehavior(report)), + Era::immortal(), + self.client.genesis_hash() + ); + let signature = self.local_key.sign(&payload.encode()).into(); + next_index += 1; + + let local_id = self.local_key.public().0.into(); + let extrinsic = UncheckedExtrinsic { + signature: Some((node_runtime::RawAddress::Id(local_id), signature, payload.0, Era::immortal())), + function: payload.1, + }; + let uxt: <::Block as BlockT>::Extrinsic = Decode::decode( + &mut extrinsic.encode().as_slice()).expect("Encoded extrinsic is valid"); + let hash = BlockId::<::Block>::hash(self.parent_hash); + if let Err(e) = self.transaction_pool.submit_one(&hash, uxt) { + warn!("Error importing misbehavior report: {:?}", e); + } + } + } + + fn on_round_end(&self, round_number: u32, was_proposed: bool) { + let primary_validator = self.validators[ + self.primary_index(round_number, self.validators.len()) + ]; + + // alter the message based on whether we think the empty proposer was forced to skip the round. + // this is determined by checking if our local validator would have been forced to skip the round. + if !was_proposed { + let public = ed25519::Public::from_raw(primary_validator.0); + info!( + "Potential Offline Validator: {} failed to propose during assigned slot: {}", + public, + round_number, + ); + } + + self.offline.write().note_round_end(primary_validator, was_proposed); + } +} + +fn current_timestamp() -> u64 { + time::SystemTime::now().duration_since(time::UNIX_EPOCH) + .expect("now always later than unix epoch; qed") + .as_secs() +} + + #[cfg(test)] mod tests { use super::*; use std::collections::HashSet; + use std::marker::PhantomData; + use runtime_primitives::testing::{Block as GenericTestBlock, Header as TestHeader}; use primitives::H256; use self::keyring::Keyring; @@ -698,14 +1361,21 @@ mod tests { } impl BlockImport for FakeClient { - fn import_block(&self, block: TestBlock, _justification: Justification, _authorities: &[AuthorityId]) -> bool { + type Error = Error; + + fn import_block(&self, + block: ImportBlock, + _new_authorities: Option> + ) -> Result { assert!(self.imported_heights.lock().insert(block.header.number)); - true + Ok(ImportResult::Queued) } } impl Authorities for FakeClient { - fn authorities(&self, _at: &BlockId) -> Result, Error> { + type Error = Error; + + fn authorities(&self, _at: &BlockId) -> Result, Self::Error> { Ok(self.authorities.clone()) } } @@ -740,18 +1410,16 @@ mod tests { impl Environment for DummyFactory { type Proposer = DummyProposer; - type Input = Comms; - type Output = Comms; type Error = Error; fn init(&self, parent_header: &TestHeader, _authorities: &[AuthorityId], _sign_with: Arc) - -> Result<(DummyProposer, Self::Input, Self::Output), Error> + -> Result { - Ok((DummyProposer(parent_header.number + 1), Comms(::std::marker::PhantomData), Comms(::std::marker::PhantomData))) + Ok(DummyProposer(parent_header.number + 1)) } } - impl Proposer for DummyProposer { + impl BaseProposer for DummyProposer { type Error = Error; type Create = Result; type Evaluate = Result; @@ -767,11 +1435,13 @@ mod tests { fn evaluate(&self, proposal: &TestBlock) -> Result { Ok(proposal.header.number == self.0) } + } + impl LocalProposer for DummyProposer { fn import_misbehavior(&self, _misbehavior: Vec<(AuthorityId, Misbehavior)>) {} - fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { - authorities[round_number % authorities.len()].clone() + fn round_proposer(&self, round_number: u32, authorities: &[AuthorityId]) -> AuthorityId { + authorities[(round_number as usize) % authorities.len()].clone() } } @@ -791,9 +1461,9 @@ mod tests { } } - fn sign_vote(vote: ::rhododendron::Vote, key: &ed25519::Pair, parent_hash: H256) -> LocalizedSignature { + fn sign_vote(vote: rhododendron::Vote, key: &ed25519::Pair, parent_hash: H256) -> LocalizedSignature { match sign_message::(vote.into(), key, parent_hash) { - ::rhododendron::LocalizedMessage::Vote(vote) => vote.signature, + rhododendron::LocalizedMessage::Vote(vote) => vote.signature, _ => panic!("signing vote leads to signed vote"), } } @@ -829,10 +1499,10 @@ mod tests { second.parent_hash = first_hash; let _second_hash = second.hash(); - let mut first_bft = service.build_upon(&first).unwrap().unwrap(); + let mut first_bft = service.build_upon(&first, Comms(PhantomData), Comms(PhantomData)).unwrap().unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == first); - let _second_bft = service.build_upon(&second).unwrap(); + let _second_bft = service.build_upon(&second, Comms(PhantomData), Comms(PhantomData)).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 != first); assert!(service.live_agreement.lock().as_ref().unwrap().0 == second); @@ -929,8 +1599,8 @@ mod tests { extrinsics: Default::default() }; - let proposal = sign_message(::rhododendron::Message::Propose(1, block.clone()), &Keyring::Alice.pair(), parent_hash);; - if let ::rhododendron::LocalizedMessage::Propose(proposal) = proposal { + let proposal = sign_message(rhododendron::Message::Propose(1, block.clone()), &Keyring::Alice.pair(), parent_hash);; + if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_ok()); let mut invalid_round = proposal.clone(); invalid_round.round_number = 0; @@ -943,8 +1613,8 @@ mod tests { } // Not an authority - let proposal = sign_message::(::rhododendron::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; - if let ::rhododendron::LocalizedMessage::Propose(proposal) = proposal { + let proposal = sign_message::(rhododendron::Message::Propose(1, block), &Keyring::Bob.pair(), parent_hash);; + if let rhododendron::LocalizedMessage::Propose(proposal) = proposal { assert!(check_proposal(&authorities, &parent_hash, &proposal).is_err()); } else { assert!(false); @@ -961,8 +1631,8 @@ mod tests { Keyring::Eve.to_raw_public().into(), ]; - let vote = sign_message::(::rhododendron::Message::Vote(::rhododendron::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; - if let ::rhododendron::LocalizedMessage::Vote(vote) = vote { + let vote = sign_message::(rhododendron::Message::Vote(rhododendron::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);; + if let rhododendron::LocalizedMessage::Vote(vote) = vote { assert!(check_vote::(&authorities, &parent_hash, &vote).is_ok()); let mut invalid_sender = vote.clone(); invalid_sender.signature.signer = Keyring::Eve.into(); @@ -972,8 +1642,8 @@ mod tests { } // Not an authority - let vote = sign_message::(::rhododendron::Message::Vote(::rhododendron::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; - if let ::rhododendron::LocalizedMessage::Vote(vote) = vote { + let vote = sign_message::(rhododendron::Message::Vote(rhododendron::Vote::Prepare(1, hash)), &Keyring::Bob.pair(), parent_hash);; + if let rhododendron::LocalizedMessage::Vote(vote) = vote { assert!(check_vote::(&authorities, &parent_hash, &vote).is_err()); } else { assert!(false); @@ -1000,7 +1670,7 @@ mod tests { let mut second = from_block_number(3); second.parent_hash = first_hash; - let _ = service.build_upon(&first).unwrap(); + let _ = service.build_upon(&first, Comms(PhantomData), Comms(PhantomData)).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == first); service.live_agreement.lock().take(); } @@ -1028,14 +1698,14 @@ mod tests { let mut third = from_block_number(4); third.parent_hash = second.hash(); - let _ = service.build_upon(&first).unwrap(); + let _ = service.build_upon(&first, Comms(PhantomData), Comms(PhantomData)).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == first); // BFT has not seen second, but will move forward on third - service.build_upon(&third).unwrap(); + service.build_upon(&third, Comms(PhantomData), Comms(PhantomData)).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == third); // but we are not walking backwards - service.build_upon(&second).unwrap(); + service.build_upon(&second, Comms(PhantomData), Comms(PhantomData)).unwrap(); assert!(service.live_agreement.lock().as_ref().unwrap().0 == third); } } diff --git a/substrate/node/consensus/src/service.rs b/substrate/core/consensus/rhd/src/service.rs similarity index 89% rename from substrate/node/consensus/src/service.rs rename to substrate/core/consensus/rhd/src/service.rs index f8ebd6f421..34efc942d4 100644 --- a/substrate/node/consensus/src/service.rs +++ b/substrate/core/consensus/rhd/src/service.rs @@ -22,12 +22,9 @@ use std::thread; use std::time::{Duration, Instant}; use std::sync::Arc; -use rhd::{self, BftService}; use client::{BlockchainEvents, ChainHead, BlockBody}; -use ed25519; use futures::prelude::*; use transaction_pool::txpool::{Pool as TransactionPool, ChainApi as PoolChainApi}; -use primitives; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, BlockNumberToHash}; use tokio::executor::current_thread::TaskExecutor as LocalThreadHandle; @@ -35,8 +32,11 @@ use tokio::runtime::TaskExecutor as ThreadPoolHandle; use tokio::runtime::current_thread::Runtime as LocalRuntime; use tokio::timer::Interval; +use parking_lot::RwLock; +use consensus::offline_tracker::OfflineTracker; + use super::{Network, ProposerFactory, AuthoringApi}; -use error; +use {consensus, primitives, ed25519, error, BftService, LocalProposer}; const TIMER_DELAY_MS: u64 = 5000; const TIMER_INTERVAL_MS: u64 = 500; @@ -47,11 +47,12 @@ fn start_bft( header: ::Header, bft_service: Arc>, ) where - F: rhd::Environment + 'static, - C: rhd::BlockImport + rhd::Authorities + 'static, + F: consensus::Environment + 'static, + C: consensus::BlockImport + consensus::Authorities + 'static, F::Error: ::std::fmt::Debug, - >::Error: ::std::fmt::Display + Into, - >::Error: ::std::fmt::Display, + >::Error: ::std::fmt::Display + Into, + >::Proposer : LocalProposer, + >::Error: ::std::fmt::Display, Block: BlockT, { let mut handle = LocalThreadHandle::current(); @@ -88,14 +89,12 @@ impl Service { C: BlockchainEvents<::Block> + ChainHead<::Block> + BlockBody<::Block>, - C: bft::BlockImport<::Block> - + bft::Authorities<::Block> + Send + Sync + 'static, + C: consensus::BlockImport<::Block> + + consensus::Authorities<::Block> + Send + Sync + 'static, primitives::H256: From<<::Block as BlockT>::Hash>, <::Block as BlockT>::Hash: PartialEq + PartialEq, N: Network::Block> + Send + 'static, { - use parking_lot::RwLock; - use super::OfflineTracker; let (signal, exit) = ::exit_future::signal(); let thread = thread::spawn(move || { diff --git a/substrate/core/network/Cargo.toml b/substrate/core/network/Cargo.toml index db4f6c34e2..7eadefb363 100644 --- a/substrate/core/network/Cargo.toml +++ b/substrate/core/network/Cargo.toml @@ -17,6 +17,7 @@ linked-hash-map = "0.5" rustc-hex = "1.0" rand = "0.5" substrate-primitives = { path = "../../core/primitives" } +substrate-consensus-common = { path = "../../core/consensus/common" } substrate-client = { path = "../../core/client" } sr-primitives = { path = "../../core/sr-primitives" } parity-codec = "2.1" diff --git a/substrate/core/network/src/chain.rs b/substrate/core/network/src/chain.rs index 97c2322989..74a01577a7 100644 --- a/substrate/core/network/src/chain.rs +++ b/substrate/core/network/src/chain.rs @@ -16,10 +16,12 @@ //! Blockchain access trait -use client::{self, Client as SubstrateClient, ImportBlock, ImportResult, ClientInfo, BlockStatus, CallExecutor}; +use client::{self, Client as SubstrateClient, ClientInfo, BlockStatus, CallExecutor}; use client::error::Error; +use consensus::BlockImport; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use runtime_primitives::generic::BlockId; +use runtime_primitives::generic::{BlockId}; +use consensus::{ImportBlock, ImportResult}; use runtime_primitives::Justification; use primitives::{Blake2Hasher, AuthorityId}; @@ -69,9 +71,12 @@ pub trait Client: Send + Sync { impl Client for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + 'static, - Block: BlockT, + Self: BlockImport, + Block: BlockT { - fn import(&self, block: ImportBlock, new_authorities: Option>) -> Result { + fn import(&self, block: ImportBlock, new_authorities: Option>) + -> Result + { (self as &SubstrateClient).import_block(block, new_authorities) } diff --git a/substrate/core/network/src/import_queue.rs b/substrate/core/network/src/import_queue.rs index 26ad83e852..955dc12321 100644 --- a/substrate/core/network/src/import_queue.rs +++ b/substrate/core/network/src/import_queue.rs @@ -28,8 +28,6 @@ use std::collections::{HashSet, VecDeque}; use std::sync::{Arc, Weak}; use std::sync::atomic::{AtomicBool, Ordering}; use parking_lot::{Condvar, Mutex, RwLock}; - -pub use client::{BlockOrigin, ImportBlock, ImportResult}; use network_libp2p::{NodeIndex, Severity}; use primitives::AuthorityId; @@ -42,6 +40,9 @@ use protocol::Context; use service::ExecuteInContext; use sync::ChainSync; +pub use consensus::{ImportBlock, ImportResult, BlockOrigin}; + + #[cfg(any(test, feature = "test-helpers"))] use std::cell::RefCell; @@ -65,7 +66,6 @@ pub trait ImportQueue: Send + Sync { /// /// This is called automatically by the network service when synchronization /// begins. - fn start( &self, _sync: Weak>>, @@ -284,7 +284,7 @@ struct SyncLink<'a, B: 'a + BlockT, E: 'a + ExecuteInContext> { } impl<'a, B: 'static + BlockT, E: 'a + ExecuteInContext> SyncLink<'a, B, E> { - /// Execute closure with locked ChainSync. + /// Execute closure with locked ChainSync. fn with_sync, &mut Context)>(&mut self, closure: F) { let service = self.context; let sync = self.chain; @@ -440,7 +440,6 @@ fn import_single_block>( trace!(target: "sync", "Verifying {}({}) failed: {}", number, hash, msg); } BlockImportError::VerificationFailed(peer, msg) - })?; match chain.import(import_block, new_authorities) { @@ -545,7 +544,7 @@ unsafe impl Sync for ImportCB {} #[cfg(any(test, feature = "test-helpers"))] /// A Verifier that accepts all blocks and passes them on with the configured -/// finality to be imported. +/// finality to be imported. pub struct PassThroughVerifier(pub bool); #[cfg(any(test, feature = "test-helpers"))] @@ -564,7 +563,7 @@ impl Verifier for PassThroughVerifier { body, finalized: self.0, external_justification: justification, - internal_justification: vec![], + post_runtime_digests: vec![], auxiliary: Vec::new(), }, None)) } diff --git a/substrate/core/network/src/lib.rs b/substrate/core/network/src/lib.rs index 82bdf0a877..4a441dcc6f 100644 --- a/substrate/core/network/src/lib.rs +++ b/substrate/core/network/src/lib.rs @@ -28,6 +28,7 @@ extern crate substrate_primitives as primitives; extern crate substrate_client as client; extern crate sr_primitives as runtime_primitives; extern crate substrate_network_libp2p as network_libp2p; +extern crate substrate_consensus_common as consensus; extern crate parity_codec as codec; extern crate futures; extern crate rustc_hex; diff --git a/substrate/core/network/src/protocol.rs b/substrate/core/network/src/protocol.rs index a8edaaceb6..4e98ee8f80 100644 --- a/substrate/core/network/src/protocol.rs +++ b/substrate/core/network/src/protocol.rs @@ -776,41 +776,41 @@ macro_rules! construct_simple_protocol { fn on_connect( &mut self, - ctx: &mut $crate::Context<$block>, - who: $crate::NodeIndex, - status: $crate::StatusMessage<$block> + _ctx: &mut $crate::Context<$block>, + _who: $crate::NodeIndex, + _status: $crate::StatusMessage<$block> ) { - $( self.$sub_protocol_name.on_connect(ctx, who, status); )* + $( self.$sub_protocol_name.on_connect(_ctx, _who, _status); )* } - fn on_disconnect(&mut self, ctx: &mut $crate::Context<$block>, who: $crate::NodeIndex) { - $( self.$sub_protocol_name.on_disconnect(ctx, who); )* + fn on_disconnect(&mut self, _ctx: &mut $crate::Context<$block>, _who: $crate::NodeIndex) { + $( self.$sub_protocol_name.on_disconnect(_ctx, _who); )* } fn on_message( &mut self, - ctx: &mut $crate::Context<$block>, - who: $crate::NodeIndex, - message: &mut Option<$crate::message::Message<$block>> + _ctx: &mut $crate::Context<$block>, + _who: $crate::NodeIndex, + _message: &mut Option<$crate::message::Message<$block>> ) { - $( self.$sub_protocol_name.on_message(ctx, who, message); )* + $( self.$sub_protocol_name.on_message(_ctx, _who, _message); )* } fn on_abort(&mut self) { $( self.$sub_protocol_name.on_abort(); )* } - fn maintain_peers(&mut self, ctx: &mut $crate::Context<$block>) { - $( self.$sub_protocol_name.maintain_peers(ctx); )* + fn maintain_peers(&mut self, _ctx: &mut $crate::Context<$block>) { + $( self.$sub_protocol_name.maintain_peers(_ctx); )* } fn on_block_imported( &mut self, - ctx: &mut $crate::Context<$block>, - hash: <$block as $crate::BlockT>::Hash, - header: &<$block as $crate::BlockT>::Header + _ctx: &mut $crate::Context<$block>, + _hash: <$block as $crate::BlockT>::Hash, + _header: &<$block as $crate::BlockT>::Header ) { - $( self.$sub_protocol_name.on_block_imported(ctx, hash, header); )* + $( self.$sub_protocol_name.on_block_imported(_ctx, _hash, _header); )* } } } diff --git a/substrate/core/network/src/service.rs b/substrate/core/network/src/service.rs index c4b10abe7e..0bed8db83d 100644 --- a/substrate/core/network/src/service.rs +++ b/substrate/core/network/src/service.rs @@ -178,6 +178,12 @@ impl, H: ExHashT> Service { } } +impl, H: ExHashT> ::consensus::SyncOracle for Service { + fn is_major_syncing(&self) -> bool { + self.handler.sync().read().status().is_major_syncing() + } +} + impl, H:ExHashT> Drop for Service { fn drop(&mut self) { self.handler.stop(); diff --git a/substrate/core/network/src/specialization.rs b/substrate/core/network/src/specialization.rs index ccd1071adb..70ad9e9b2e 100644 --- a/substrate/core/network/src/specialization.rs +++ b/substrate/core/network/src/specialization.rs @@ -25,9 +25,6 @@ pub trait Specialization: Send + Sync + 'static { /// Get the current specialization-status. fn status(&self) -> Vec; - /// Called on start-up. - fn on_start(&mut self) { } - /// Called when a peer successfully handshakes. fn on_connect(&mut self, ctx: &mut Context, who: NodeIndex, status: ::message::Status); diff --git a/substrate/core/network/src/sync.rs b/substrate/core/network/src/sync.rs index b758b8f205..e69b22fc57 100644 --- a/substrate/core/network/src/sync.rs +++ b/substrate/core/network/src/sync.rs @@ -18,7 +18,8 @@ use std::collections::HashMap; use std::sync::Arc; use protocol::Context; use network_libp2p::{Severity, NodeIndex}; -use client::{BlockStatus, BlockOrigin, ClientInfo}; +use client::{BlockStatus, ClientInfo}; +use consensus::BlockOrigin; use client::error::Error as ClientError; use blocks::{self, BlockCollection}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor}; @@ -77,6 +78,17 @@ pub struct Status { pub best_seen_block: Option>, } +impl Status { + /// Whether the synchronization status is doing major downloading work or + /// is near the head of the chain. + pub fn is_major_syncing(&self) -> bool { + match self.state { + SyncState::Idle => false, + SyncState::Downloading => true, + } + } +} + impl ChainSync { /// Create a new instance. pub(crate) fn new(role: Roles, info: &ClientInfo, import_queue: Arc>) -> Self { diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs index 243e63e2b3..0da6523d0d 100644 --- a/substrate/core/network/src/test/mod.rs +++ b/substrate/core/network/src/test/mod.rs @@ -34,14 +34,16 @@ use service::TransactionPool; use network_libp2p::{NodeIndex, PeerId, Severity}; use keyring::Keyring; use codec::Encode; -use import_queue::{SyncImportQueue, PassThroughVerifier}; -use test_client::{self, TestClient}; +use import_queue::{SyncImportQueue, PassThroughVerifier, Verifier}; +use consensus::BlockOrigin; use specialization::Specialization; use consensus_gossip::ConsensusGossip; use import_queue::ImportQueue; use service::ExecuteInContext; +use test_client; pub use test_client::runtime::{Block, Hash, Transfer, Extrinsic}; +pub use test_client::TestClient; struct DummyContextExecutor(Arc>, Arc>>); unsafe impl Send for DummyContextExecutor {} @@ -135,20 +137,22 @@ pub struct TestPacket { recipient: NodeIndex, } -pub struct Peer { - client: Arc>, +pub type PeersClient = client::Client; + +pub struct Peer> { + client: Arc, pub sync: Arc>, pub queue: Arc>>, - import_queue: Arc>, + import_queue: Arc>, executor: Arc, } -impl Peer { +impl> Peer { fn new( - client: Arc>, + client: Arc, sync: Arc>, queue: Arc>>, - import_queue: Arc>, + import_queue: Arc>, ) -> Self { let executor = Arc::new(DummyContextExecutor(sync.clone(), queue.clone())); Peer { client, sync, queue, import_queue, executor} @@ -201,6 +205,13 @@ impl Peer { self.sync.tick(&mut TestIo::new(&self.queue, None)); } + /// Send block import notifications. + fn send_import_notifications(&self) { + let info = self.client.info().expect("In-mem client does not fail"); + let header = self.client.header(&BlockId::Hash(info.chain.best_hash)).unwrap().unwrap(); + self.sync.on_block_imported(&mut TestIo::new(&self.queue, None), info.chain.best_hash, &header); + } + /// Restart sync for a peer. fn restart_sync(&self) { self.sync.abort(); @@ -218,15 +229,18 @@ impl Peer { } /// Add blocks to the peer -- edit the block before adding - pub fn generate_blocks(&self, count: usize, mut edit_block: F) + pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, 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 {}, (#{}, parent={})", block.header.hash(), block.header.number, block.header.parent_hash); - self.client.justify_and_import(client::BlockOrigin::File, block).unwrap(); + let hash = block.header.hash(); + trace!("Generating {}, (#{}, parent={})", hash, block.header.number, block.header.parent_hash); + let header = block.header.clone(); + self.client.justify_and_import(origin, block).unwrap(); + self.sync.on_block_imported(&mut TestIo::new(&self.queue, None), hash, &header); } } @@ -234,7 +248,7 @@ impl Peer { pub fn push_blocks(&self, count: usize, with_tx: bool) { let mut nonce = 0; if with_tx { - self.generate_blocks(count, |builder| { + self.generate_blocks(count, BlockOrigin::File, |builder| { let transfer = Transfer { from: Keyring::Alice.to_raw_public().into(), to: Keyring::Alice.to_raw_public().into(), @@ -246,7 +260,7 @@ impl Peer { nonce = nonce + 1; }); } else { - self.generate_blocks(count, |_| ()); + self.generate_blocks(count, BlockOrigin::File, |_| ()); } } @@ -258,7 +272,7 @@ impl Peer { } /// Get a reference to the client. - pub fn client(&self) -> &Arc> { + pub fn client(&self) -> &Arc { &self.client } } @@ -277,25 +291,30 @@ impl TransactionPool for EmptyTransactionPool { fn on_broadcasted(&self, _: HashMap>) {} } -pub struct TestNet { - peers: Vec>, - started: bool, - disconnect_events: Vec<(NodeIndex, NodeIndex)>, //disconnected (initiated by, to) -} +pub trait TestNetFactory: Sized { + type Verifier: 'static + Verifier; -impl TestNet { - /// Create new test network with this many peers. - pub fn new(n: usize) -> Self { - Self::new_with_config(n, ProtocolConfig::default()) + /// These two need to be implemented! + fn from_config(config: &ProtocolConfig) -> Self; + fn make_verifier(&self, client: Arc, config: &ProtocolConfig) -> Arc; + + + /// Get reference to peer. + fn peer(&self, i: usize) -> &Peer; + fn peers(&self) -> &Vec>>; + fn mut_peers>>)>(&mut self, closure: F ); + + fn started(&self) -> bool; + fn set_started(&mut self, now: bool); + + fn default_config() -> ProtocolConfig { + ProtocolConfig::default() } - /// Create new test network with peers and given config. - pub fn new_with_config(n: usize, config: ProtocolConfig) -> Self { - let mut net = TestNet { - peers: Vec::new(), - started: false, - disconnect_events: Vec::new(), - }; + /// Create new test network with this many peers. + fn new(n: usize) -> Self { + let config = Self::default_config(); + let mut net = Self::from_config(&config); for _ in 0..n { net.add_peer(&config); @@ -304,10 +323,11 @@ impl TestNet { } /// Add a peer. - pub fn add_peer(&mut self, config: &ProtocolConfig) { + fn add_peer(&mut self, config: &ProtocolConfig) { let client = Arc::new(test_client::new()); let tx_pool = Arc::new(EmptyTransactionPool); - let import_queue = Arc::new(SyncImportQueue::new(Arc::new(PassThroughVerifier(false)))); + let verifier = self.make_verifier(client.clone(), config); + let import_queue = Arc::new(SyncImportQueue::new(verifier)); let specialization = DummySpecialization { gossip: ConsensusGossip::new(), }; @@ -320,93 +340,107 @@ impl TestNet { specialization ).unwrap(); - self.peers.push(Arc::new(Peer::new( + let peer = Arc::new(Peer::new( client, Arc::new(sync), Arc::new(RwLock::new(VecDeque::new())), import_queue - ))); - } + )); - /// Get reference to peer. - pub fn peer(&self, i: usize) -> &Peer { - &self.peers[i] + self.mut_peers(|peers| { + peers.push(peer.clone()) + }); } /// Start network. fn start(&mut self) { - if self.started { + if self.started() { return; } - for peer in 0..self.peers.len() { - self.peers[peer].start(); - for client in 0..self.peers.len() { - if peer != client { - self.peers[peer].on_connect(client as NodeIndex); + self.mut_peers(|peers| { + for peer in 0..peers.len() { + peers[peer].start(); + for client in 0..peers.len() { + if peer != client { + peers[peer].on_connect(client as NodeIndex); + } } } - } - self.started = true; + }); + self.set_started(true); } /// Do one step of routing. - pub fn route(&mut self) { - for peer in 0..self.peers.len() { - let packet = self.peers[peer].pending_message(); - if let Some(packet) = packet { - let disconnecting = { - let recipient = packet.recipient; - trace!("--- {} -> {} ---", peer, recipient); - let to_disconnect = self.peers[recipient].receive_message(peer as NodeIndex, packet); - for d in &to_disconnect { - // notify this that disconnecting peers are disconnecting - self.peers[recipient].on_disconnect(*d as NodeIndex); - self.disconnect_events.push((peer, *d)); + fn route(&mut self) { + self.mut_peers(move |peers| { + for peer in 0..peers.len() { + let packet = peers[peer].pending_message(); + if let Some(packet) = packet { + let disconnecting = { + let recipient = packet.recipient; + trace!(target: "sync", "--- {} -> {} ---", peer, recipient); + let to_disconnect = peers[recipient].receive_message(peer as NodeIndex, packet); + for d in &to_disconnect { + // notify this that disconnecting peers are disconnecting + peers[recipient].on_disconnect(*d as NodeIndex); + } + to_disconnect + }; + for d in &disconnecting { + // notify other peers that this peer is disconnecting + peers[*d].on_disconnect(peer as NodeIndex); } - to_disconnect - }; - for d in &disconnecting { - // notify other peers that this peer is disconnecting - self.peers[*d].on_disconnect(peer as NodeIndex); } } - } + }); } /// Route messages between peers until all queues are empty. - pub fn route_until_complete(&mut self) { + fn route_until_complete(&mut self) { while !self.done() { self.route() } } /// Do a step of synchronization. - pub fn sync_step(&mut self) { + fn sync_step(&mut self) { self.route(); - for peer in &mut self.peers { - peer.sync_step(); - } + self.mut_peers(|peers| { + for peer in peers { + peer.sync_step(); + } + }) + } + + /// Send block import notifications for all peers. + fn send_import_notifications(&mut self) { + self.mut_peers(|peers| { + for peer in peers { + peer.send_import_notifications(); + } + }) } /// Restart sync for a peer. - pub fn restart_peer(&mut self, i: usize) { - self.peers[i].restart_sync(); + fn restart_peer(&mut self, i: usize) { + self.peers()[i].restart_sync(); } /// Perform synchronization until complete. - pub fn sync(&mut self) -> u32 { + fn sync(&mut self) -> u32 { self.start(); let mut total_steps = 0; while !self.done() { self.sync_step(); total_steps += 1; + self.route(); } total_steps } /// Do the given amount of sync steps. - pub fn sync_steps(&mut self, count: usize) { + fn sync_steps(&mut self, count: usize) { self.start(); for _ in 0..count { self.sync_step(); @@ -414,7 +448,50 @@ impl TestNet { } /// Whether all peers have synced. - pub fn done(&self) -> bool { - self.peers.iter().all(|p| p.is_done()) + fn done(&self) -> bool { + self.peers().iter().all(|p| p.is_done()) + } +} + +pub struct TestNet { + peers: Vec>>, + started: bool +} + +impl TestNetFactory for TestNet { + type Verifier = PassThroughVerifier; + + /// Create new test network with peers and given config. + fn from_config(_config: &ProtocolConfig) -> Self { + TestNet { + peers: Vec::new(), + started: false + } + } + + fn make_verifier(&self, _client: Arc, _config: &ProtocolConfig) + -> Arc + { + Arc::new(PassThroughVerifier(false)) + } + + fn peer(&self, i: usize) -> &Peer { + &self.peers[i] + } + + fn peers(&self) -> &Vec>> { + &self.peers + } + + fn mut_peers>>)>(&mut self, closure: F ) { + closure(&mut self.peers); + } + + fn started(&self) -> bool { + self.started + } + + fn set_started(&mut self, new: bool) { + self.started = new; } } diff --git a/substrate/core/network/src/test/sync.rs b/substrate/core/network/src/test/sync.rs index 02531259f2..0f9e407828 100644 --- a/substrate/core/network/src/test/sync.rs +++ b/substrate/core/network/src/test/sync.rs @@ -16,6 +16,7 @@ use client::backend::Backend; use client::blockchain::HeaderBackend as BlockchainHeaderBackend; +use consensus::BlockOrigin; use sync::SyncState; use Roles; use super::*; @@ -68,6 +69,7 @@ fn sync_no_common_longer_chain_fails() { fn sync_after_fork_works() { ::env_logger::init().ok(); let mut net = TestNet::new(3); + net.sync_step(); net.peer(0).push_blocks(30, false); net.peer(1).push_blocks(30, false); net.peer(2).push_blocks(30, false); @@ -87,6 +89,20 @@ fn sync_after_fork_works() { assert!(net.peer(2).client.backend().blockchain().canon_equals_to(&peer1_chain)); } +#[test] +fn own_blocks_are_announced() { + ::env_logger::init().ok(); + let mut net = TestNet::new(3); + net.sync(); // connect'em + net.peer(0).generate_blocks(1, BlockOrigin::Own, |_| ()); + net.sync(); + assert_eq!(net.peer(0).client.backend().blockchain().info().unwrap().best_number, 1); + assert_eq!(net.peer(1).client.backend().blockchain().info().unwrap().best_number, 1); + let peer0_chain = net.peer(0).client.backend().blockchain().clone(); + assert!(net.peer(1).client.backend().blockchain().canon_equals_to(&peer0_chain)); + assert!(net.peer(2).client.backend().blockchain().canon_equals_to(&peer0_chain)); +} + #[test] fn blocks_are_not_announced_by_light_nodes() { ::env_logger::init().ok(); diff --git a/substrate/core/primitives/src/ed25519.rs b/substrate/core/primitives/src/ed25519.rs index 2047a0c7af..027298b4b1 100644 --- a/substrate/core/primitives/src/ed25519.rs +++ b/substrate/core/primitives/src/ed25519.rs @@ -31,7 +31,7 @@ pub type Signature = H512; pub const PKCS_LEN: usize = 85; /// A localized signature also contains sender information. -#[derive(PartialEq, Eq, Clone, Debug)] +#[derive(PartialEq, Eq, Clone, Debug, Encode, Decode)] pub struct LocalizedSignature { /// The signer of the signature. pub signer: Public, @@ -40,6 +40,7 @@ pub struct LocalizedSignature { } /// Verify a message without type checking the parameters' types for the right size. +/// Returns true if the signature is good. pub fn verify>(sig: &[u8], message: &[u8], public: P) -> bool { let public_key = untrusted::Input::from(public.as_ref()); let msg = untrusted::Input::from(message); @@ -52,7 +53,7 @@ pub fn verify>(sig: &[u8], message: &[u8], public: P) -> bool { } /// A public key. -#[derive(PartialEq, Eq, Clone)] +#[derive(PartialEq, Eq, Clone, Encode, Decode)] pub struct Public(pub [u8; 32]); /// A key pair. @@ -246,7 +247,7 @@ impl Pair { } } -/// Verify a signature on a message. +/// Verify a signature on a message. Returns true if the signature is good. pub fn verify_strong>(sig: &Signature, message: &[u8], pubkey: P) -> bool { let public_key = untrusted::Input::from(&pubkey.as_ref().0[..]); let msg = untrusted::Input::from(message); diff --git a/substrate/core/rpc/Cargo.toml b/substrate/core/rpc/Cargo.toml index 453b288c9d..3f35394c91 100644 --- a/substrate/core/rpc/Cargo.toml +++ b/substrate/core/rpc/Cargo.toml @@ -22,5 +22,6 @@ tokio = "0.1.7" [dev-dependencies] assert_matches = "1.1" substrate-test-client = { path = "../test-client" } +substrate-consensus-common = { path = "../consensus/common" } rustc-hex = "2.0" hex-literal = "0.1" diff --git a/substrate/core/rpc/src/chain/tests.rs b/substrate/core/rpc/src/chain/tests.rs index fc9817140d..644c7fed07 100644 --- a/substrate/core/rpc/src/chain/tests.rs +++ b/substrate/core/rpc/src/chain/tests.rs @@ -16,9 +16,9 @@ use super::*; use jsonrpc_macros::pubsub; -use client::BlockOrigin; use test_client::{self, TestClient}; use test_client::runtime::{Block, Header}; +use consensus::BlockOrigin; #[test] fn should_return_header() { diff --git a/substrate/core/rpc/src/lib.rs b/substrate/core/rpc/src/lib.rs index 9e4bd96978..dbbc8e3a6a 100644 --- a/substrate/core/rpc/src/lib.rs +++ b/substrate/core/rpc/src/lib.rs @@ -47,6 +47,8 @@ extern crate hex_literal; #[cfg(test)] extern crate substrate_test_client as test_client; #[cfg(test)] +extern crate substrate_consensus_common as consensus; +#[cfg(test)] extern crate rustc_hex; mod errors; diff --git a/substrate/core/rpc/src/state/tests.rs b/substrate/core/rpc/src/state/tests.rs index 74b5fab841..71978f88ea 100644 --- a/substrate/core/rpc/src/state/tests.rs +++ b/substrate/core/rpc/src/state/tests.rs @@ -17,7 +17,7 @@ use super::*; use self::error::{Error, ErrorKind}; -use client::BlockOrigin; +use consensus::BlockOrigin; use jsonrpc_macros::pubsub; use rustc_hex::FromHex; use test_client::{self, runtime, keyring::Keyring, TestClient, BlockBuilderExt}; diff --git a/substrate/core/service/Cargo.toml b/substrate/core/service/Cargo.toml index 694cd5a553..a15e010d5c 100644 --- a/substrate/core/service/Cargo.toml +++ b/substrate/core/service/Cargo.toml @@ -20,6 +20,7 @@ substrate-keystore = { path = "../../core/keystore" } sr-io = { path = "../../core/sr-io" } sr-primitives = { path = "../../core/sr-primitives" } substrate-primitives = { path = "../../core/primitives" } +substrate-consensus-common = { path = "../../core/consensus/common" } substrate-network = { path = "../../core/network" } substrate-client = { path = "../../core/client" } substrate-client-db = { path = "../../core/client/db" } diff --git a/substrate/core/service/src/chain_ops.rs b/substrate/core/service/src/chain_ops.rs index 38aabe7d68..e94db8c6f0 100644 --- a/substrate/core/service/src/chain_ops.rs +++ b/substrate/core/service/src/chain_ops.rs @@ -20,11 +20,12 @@ use std::{self, io::{Read, Write}}; use futures::Future; use serde_json; -use client::BlockOrigin; use runtime_primitives::generic::{SignedBlock, BlockId}; use runtime_primitives::traits::{As, Block, Header}; use network::import_queue::{ImportQueue, BlockData}; use network::message; + +use consensus_common::BlockOrigin; use components::{self, Components, ServiceFactory, FactoryFullConfiguration, FactoryBlockNumber, RuntimeGenesis}; use new_client; use codec::{Decode, Encode}; diff --git a/substrate/core/service/src/components.rs b/substrate/core/service/src/components.rs index a30fb9940e..d2503ded23 100644 --- a/substrate/core/service/src/components.rs +++ b/substrate/core/service/src/components.rs @@ -25,7 +25,7 @@ use chain_spec::ChainSpec; use client_db; use client::{self, Client}; use {error, Service}; -use network::{self, OnDemand}; +use network::{self, OnDemand, import_queue::ImportQueue}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; use runtime_primitives::{traits::Block as BlockT, traits::Header as HeaderT, BuildStorage}; @@ -136,8 +136,10 @@ pub trait ServiceFactory: 'static + Sized { type FullService: Deref>> + Send + Sync + 'static; /// Extended light service type. type LightService: Deref>> + Send + Sync + 'static; - /// ImportQueue - type ImportQueue: network::import_queue::ImportQueue + 'static; + /// ImportQueue for full client + type FullImportQueue: network::import_queue::ImportQueue + 'static; + /// ImportQueue for light clients + type LightImportQueue: network::import_queue::ImportQueue + 'static; //TODO: replace these with a constructor trait. that TransactionPool implements. /// Extrinsic pool constructor for the full client. @@ -162,7 +164,7 @@ pub trait ServiceFactory: 'static + Sized { fn build_full_import_queue( config: &FactoryFullConfiguration, _client: Arc> - ) -> Result { + ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { _ => Err(format!("Chain Specification defines unknown consensus engine '{}'", name).into()) @@ -177,7 +179,7 @@ pub trait ServiceFactory: 'static + Sized { fn build_light_import_queue( config: &FactoryFullConfiguration, _client: Arc> - ) -> Result { + ) -> Result { if let Some(name) = config.chain_spec.consensus_engine() { match name { _ => Err(format!("Chain Specification defines unknown consensus engine '{}'", name).into()) @@ -196,13 +198,16 @@ pub trait Components: 'static { /// Client backend. type Backend: 'static + client::backend::Backend, Blake2Hasher>; /// Client executor. - type Executor: 'static + client::CallExecutor, Blake2Hasher> + Send + Sync; + type Executor: 'static + client::CallExecutor, Blake2Hasher> + Send + Sync + Clone; /// Extrinsic pool type. type TransactionPoolApi: 'static + txpool::ChainApi< Hash = <::Block as BlockT>::Hash, Block = FactoryBlock >; + /// Our Import Queue + type ImportQueue: ImportQueue> + 'static; + /// Create client. fn build_client( config: &FactoryFullConfiguration, @@ -221,7 +226,7 @@ pub trait Components: 'static { fn build_import_queue( config: &FactoryFullConfiguration, client: Arc> - ) -> Result<::ImportQueue, error::Error>; + ) -> Result; } /// A struct that implement `Components` for the full client. @@ -234,6 +239,7 @@ impl Components for FullComponents { type Executor = FullExecutor; type Backend = FullBackend; type TransactionPoolApi = ::FullTransactionPoolApi; + type ImportQueue = Factory::FullImportQueue; fn build_client( config: &FactoryFullConfiguration, @@ -267,7 +273,7 @@ impl Components for FullComponents { fn build_import_queue( config: &FactoryFullConfiguration, client: Arc> - ) -> Result<::ImportQueue, error::Error> { + ) -> Result { Factory::build_full_import_queue(config, client) } } @@ -282,6 +288,7 @@ impl Components for LightComponents { type Executor = LightExecutor; type Backend = LightBackend; type TransactionPoolApi = ::LightTransactionPoolApi; + type ImportQueue = ::LightImportQueue; fn build_client( config: &FactoryFullConfiguration, @@ -316,7 +323,7 @@ impl Components for LightComponents { fn build_import_queue( config: &FactoryFullConfiguration, client: Arc> - ) -> Result<::ImportQueue, error::Error> { + ) -> Result { Factory::build_light_import_queue(config, client) } } diff --git a/substrate/core/service/src/consensus.rs b/substrate/core/service/src/consensus.rs new file mode 100644 index 0000000000..61968ee04d --- /dev/null +++ b/substrate/core/service/src/consensus.rs @@ -0,0 +1,263 @@ +// Copyright 2018 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 . + +//! provide consensus service to substrate. + +// FIXME: move this into substrate-consensus-common - https://github.com/paritytech/substrate/issues/1021 + +use std::sync::Arc; +use std::time::{self, Duration, Instant}; +use std; + +use client::{self, error, Client as SubstrateClient, CallExecutor}; +use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, id::BLOCK_BUILDER}; +use codec::{Decode, Encode}; +use consensus_common::{self, InherentData, evaluation, offline_tracker::OfflineTracker}; +use primitives::{AuthorityId, ed25519, Blake2Hasher}; +use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use runtime_primitives::generic::BlockId; +use transaction_pool::txpool::{self, Pool as TransactionPool}; + +use parking_lot::RwLock; + +/// Shared offline validator tracker. +pub type SharedOfflineTracker = Arc>; +type Timestamp = u64; + +// block size limit. +const MAX_TRANSACTIONS_SIZE: usize = 4 * 1024 * 1024; + +/// Build new blocks. +pub trait BlockBuilder { + /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. + fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error>; +} + +/// Local client abstraction for the consensus. +pub trait AuthoringApi: + Send + + Sync + + BlockBuilderAPI<::Block, Error=::Error> + + Core<::Block, AuthorityId, Error=::Error> +{ + /// The block used for this API type. + type Block: BlockT; + /// The error used by this API type. + type Error: std::error::Error; + + /// Build a block on top of the given, with inherent extrinsics pre-pushed. + fn build_block) -> ()>( + &self, + at: &BlockId, + inherent_data: InherentData, + build_ctx: F, + ) -> Result; +} + +impl<'a, B, E, Block> BlockBuilder for client::block_builder::BlockBuilder<'a, B, E, Block, Blake2Hasher> where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT +{ + fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error> { + client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) + } +} + +impl<'a, B, E, Block> AuthoringApi for SubstrateClient where + B: client::backend::Backend + Send + Sync + 'static, + E: CallExecutor + Send + Sync + Clone + 'static, + Block: BlockT, +{ + type Block = Block; + type Error = client::error::Error; + + fn build_block) -> ()>( + &self, + at: &BlockId, + inherent_data: InherentData, + mut build_ctx: F, + ) -> Result { + let runtime_version = self.runtime_version_at(at)?; + + let mut block_builder = self.new_block_at(at)?; + if runtime_version.has_api(BLOCK_BUILDER, 1) { + self.inherent_extrinsics(at, &inherent_data)? + .into_iter().try_for_each(|i| block_builder.push(i))?; + } + + build_ctx(&mut block_builder); + + block_builder.bake().map_err(Into::into) + } +} + +/// Proposer factory. +pub struct ProposerFactory where + C: AuthoringApi, + A: txpool::ChainApi, +{ + /// The client instance. + pub client: Arc, + /// The transaction pool. + pub transaction_pool: Arc>, + /// Offline-tracker. + pub offline: SharedOfflineTracker, + /// Force delay in evaluation this long. + pub force_delay: Timestamp, +} + +impl consensus_common::Environment<::Block> for ProposerFactory where + C: AuthoringApi, + A: txpool::ChainApi::Block>, + client::error::Error: From<::Error> +{ + type Proposer = Proposer; + type Error = error::Error; + + fn init( + &self, + parent_header: &<::Block as BlockT>::Header, + _: &[AuthorityId], + _: Arc, + ) -> Result { + let parent_hash = parent_header.hash(); + + let id = BlockId::hash(parent_hash); + + let authorities: Vec = self.client.authorities(&id)?; + self.offline.write().note_new_block(&authorities[..]); + + info!("Starting consensus session on top of parent {:?}", parent_hash); + + let now = Instant::now(); + let proposer = Proposer { + client: self.client.clone(), + start: now, + parent_hash, + parent_id: id, + parent_number: *parent_header.number(), + transaction_pool: self.transaction_pool.clone(), + offline: self.offline.clone(), + authorities, + minimum_timestamp: current_timestamp() + self.force_delay, + }; + + Ok(proposer) + } +} + +/// The proposer logic. +pub struct Proposer { + client: Arc, + start: Instant, + parent_hash: <::Block as BlockT>::Hash, + parent_id: BlockId<::Block>, + parent_number: <<::Block as BlockT>::Header as HeaderT>::Number, + transaction_pool: Arc>, + offline: SharedOfflineTracker, + authorities: Vec, + minimum_timestamp: u64, +} + +impl consensus_common::Proposer<::Block> for Proposer where + C: AuthoringApi, + A: txpool::ChainApi::Block>, + client::error::Error: From<::Error> +{ + type Create = Result<::Block, error::Error>; + type Error = error::Error; + + fn propose(&self) -> Result<::Block, error::Error> { + use runtime_primitives::traits::BlakeTwo256; + + const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); + + let timestamp = ::std::cmp::max(self.minimum_timestamp, current_timestamp()); + + let elapsed_since_start = self.start.elapsed(); + let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { + Vec::new() + } else { + self.offline.read().reports(&self.authorities[..]) + }; + + if !offline_indices.is_empty() { + info!("Submitting offline authorities {:?} for slash-vote", + offline_indices.iter().map(|&i| self.authorities[i as usize]).collect::>(), + ) + } + + let inherent_data = InherentData { + timestamp, + offline_indices, + }; + + let block = self.client.build_block( + &self.parent_id, + inherent_data, + |block_builder| { + let mut unqueue_invalid = Vec::new(); + let mut pending_size = 0; + let pending_iterator = self.transaction_pool.ready(); + + for pending in pending_iterator { + // TODO [ToDr] Probably get rid of it, and validate in runtime. + let encoded_size = pending.data.encode().len(); + if pending_size + encoded_size >= MAX_TRANSACTIONS_SIZE { break } + + match block_builder.push_extrinsic(pending.data.clone()) { + Ok(()) => { + pending_size += encoded_size; + } + Err(e) => { + trace!(target: "transaction-pool", "Invalid transaction: {}", e); + unqueue_invalid.push(pending.hash.clone()); + } + } + } + + self.transaction_pool.remove_invalid(&unqueue_invalid); + })?; + + info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", + block.header().number(), + <::Block as BlockT>::Hash::from(block.header().hash()), + block.header().parent_hash(), + block.extrinsics().iter() + .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) + .collect::>() + .join(", ") + ); + + let substrate_block = Decode::decode(&mut block.encode().as_slice()) + .expect("blocks are defined to serialize to substrate blocks correctly; qed"); + + assert!(evaluation::evaluate_initial( + &substrate_block, + &self.parent_hash, + self.parent_number, + ).is_ok()); + + Ok(substrate_block) + } +} + +fn current_timestamp() -> Timestamp { + time::SystemTime::now().duration_since(time::UNIX_EPOCH) + .expect("now always later than unix epoch; qed") + .as_secs() +} diff --git a/substrate/core/service/src/lib.rs b/substrate/core/service/src/lib.rs index 2acc8d7661..9e7c201e8f 100644 --- a/substrate/core/service/src/lib.rs +++ b/substrate/core/service/src/lib.rs @@ -29,6 +29,7 @@ extern crate parking_lot; extern crate substrate_keystore as keystore; extern crate substrate_primitives as primitives; extern crate sr_primitives as runtime_primitives; +extern crate substrate_consensus_common as consensus_common; extern crate substrate_network as network; extern crate substrate_executor; extern crate substrate_client as client; @@ -56,6 +57,7 @@ mod error; mod chain_spec; pub mod config; pub mod chain_ops; +pub mod consensus; use std::io; use std::net::SocketAddr; @@ -63,7 +65,7 @@ use std::collections::HashMap; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; use futures::prelude::*; -use parking_lot::Mutex; +use parking_lot::{Mutex, RwLock}; use keystore::Store as Keystore; use client::BlockchainEvents; use runtime_primitives::traits::{Header, As}; @@ -80,6 +82,8 @@ pub use chain_spec::ChainSpec; pub use transaction_pool::txpool::{self, Pool as TransactionPool, Options as TransactionPoolOptions, ChainApi, IntoPoolError}; pub use client::ExecutionStrategy; +use consensus_common::offline_tracker::OfflineTracker; +pub use consensus::ProposerFactory; pub use components::{ServiceFactory, FullBackend, FullExecutor, LightBackend, LightExecutor, Components, PoolApi, ComponentClient, ComponentBlock, FullClient, LightClient, FullComponents, LightComponents, @@ -98,6 +102,7 @@ pub struct Service { keystore: Keystore, exit: ::exit_future::Exit, signal: Option, + proposer: Arc, Components::TransactionPoolApi>>, _rpc_http: Option, _rpc_ws: Option>, // WsServer is not `Sync`, but the service needs to be. _telemetry: Option, @@ -118,6 +123,7 @@ pub fn new_client(config: &FactoryFullConfi impl Service where Components: components::Components, + ::Executor: std::clone::Clone, txpool::ExHash: serde::de::DeserializeOwned + serde::Serialize, txpool::ExtrinsicFor: serde::de::DeserializeOwned + serde::Serialize, { @@ -254,6 +260,13 @@ impl Service ) }; + let proposer = Arc::new(ProposerFactory { + client: client.clone(), + transaction_pool: transaction_pool.clone(), + offline: Arc::new(RwLock::new(OfflineTracker::new())), + force_delay: 0 // FIXME: allow this to be configured + }); + // Telemetry let telemetry = match config.telemetry_url { Some(url) => { @@ -287,6 +300,7 @@ impl Service transaction_pool: transaction_pool, signal: Some(signal), keystore: keystore, + proposer, exit, _rpc_http: rpc_http, _rpc_ws: rpc_ws.map(Mutex::new), @@ -303,6 +317,13 @@ impl Service where self.client.clone() } + /// Get shared proposer instance + pub fn proposer(&self) + -> Arc, Components::TransactionPoolApi>> + { + self.proposer.clone() + } + /// Get shared network instance. pub fn network(&self) -> Arc> { self.network.as_ref().expect("self.network always Some").clone() @@ -324,6 +345,7 @@ impl Service where } } + impl Drop for Service where Components: components::Components { fn drop(&mut self) { debug!(target: "service", "Substrate service shutdown"); @@ -450,7 +472,7 @@ macro_rules! construct_simple_service { $name: ident ) => { pub struct $name { - inner: $crate::Service, + inner: $crate::Arc<$crate::Service>, } impl $name { @@ -460,7 +482,7 @@ macro_rules! construct_simple_service { ) -> $crate::Result { Ok( Self { - inner: $crate::Service::new(config, executor)? + inner: $crate::Arc::new($crate::Service::new(config, executor)?) } ) } @@ -525,8 +547,9 @@ macro_rules! construct_service_factory { Configuration = $config:ty, FullService = $full_service:ty { $( $full_service_init:tt )* }, LightService = $light_service:ty { $( $light_service_init:tt )* }, - ImportQueue = $import_queue:ty - { $( $full_import_queue_init:tt )* } + FullImportQueue = $full_import_queue:ty + { $( $full_import_queue_init:tt )* }, + LightImportQueue = $light_import_queue:ty { $( $light_import_queue_init:tt )* }, } ) => { @@ -544,7 +567,8 @@ macro_rules! construct_service_factory { type Configuration = $config; type FullService = $full_service; type LightService = $light_service; - type ImportQueue = $import_queue; + type FullImportQueue = $full_import_queue; + type LightImportQueue = $light_import_queue; fn build_full_transaction_pool( config: $crate::TransactionPoolOptions, @@ -571,14 +595,14 @@ macro_rules! construct_service_factory { fn build_full_import_queue( config: &$crate::FactoryFullConfiguration, client: $crate::Arc<$crate::FullClient>, - ) -> $crate::Result { + ) -> $crate::Result { ( $( $full_import_queue_init )* ) (config, client) } fn build_light_import_queue( config: &FactoryFullConfiguration, client: Arc<$crate::LightClient>, - ) -> Result { + ) -> Result { ( $( $light_import_queue_init )* ) (config, client) } diff --git a/substrate/core/service/test/Cargo.toml b/substrate/core/service/test/Cargo.toml index cfdfacf4da..12282b16f1 100644 --- a/substrate/core/service/test/Cargo.toml +++ b/substrate/core/service/test/Cargo.toml @@ -12,6 +12,7 @@ env_logger = "0.4" fdlimit = "0.1" substrate-service = { path = "../../../core/service" } substrate-network = { path = "../../../core/network" } +substrate-consensus-common = { path = "../../../core/consensus/common" } substrate-primitives = { path = "../../../core/primitives" } substrate-client = { path = "../../../core/client" } sr-primitives = { path = "../../../core/sr-primitives" } diff --git a/substrate/core/service/test/src/lib.rs b/substrate/core/service/test/src/lib.rs index 31ac007c4f..0a967e3cd6 100644 --- a/substrate/core/service/test/src/lib.rs +++ b/substrate/core/service/test/src/lib.rs @@ -27,6 +27,7 @@ extern crate substrate_service as service; extern crate substrate_network as network; extern crate substrate_primitives as primitives; extern crate substrate_client as client; +extern crate substrate_consensus_common as consensus; extern crate sr_primitives; use std::iter; use std::sync::Arc; @@ -47,9 +48,9 @@ use service::{ FactoryExtrinsic, }; use network::{NetworkConfiguration, NonReservedPeerMode, Protocol, SyncProvider, ManageNetwork}; -use client::ImportBlock; use sr_primitives::traits::As; use sr_primitives::generic::BlockId; +use consensus::{ImportBlock, BlockImport}; struct TestNet { runtime: Runtime, diff --git a/substrate/core/sr-api/src/lib.rs b/substrate/core/sr-api/src/lib.rs index 0ddc89b14e..7fffc43590 100644 --- a/substrate/core/sr-api/src/lib.rs +++ b/substrate/core/sr-api/src/lib.rs @@ -28,7 +28,7 @@ extern crate sr_version as runtime_version; #[doc(hidden)] pub use primitives::{traits::Block as BlockT, generic::BlockId, transaction_validity::TransactionValidity, ApplyResult}; -use runtime_version::RuntimeVersion; +use runtime_version::{ApiId, RuntimeVersion}; use rstd::vec::Vec; #[doc(hidden)] pub use rstd::slice; @@ -429,6 +429,20 @@ macro_rules! decl_apis { }; } +/// The ApiIds for the various standard runtime APIs. +pub mod id { + use super::ApiId; + + /// ApiId for the BlockBuilder trait. + pub const BLOCK_BUILDER: ApiId = *b"blkbuild"; + + /// ApiId for the TaggedTransactionQueue trait. + pub const TAGGED_TRANSACTION_QUEUE: ApiId = *b"validatx"; + + /// ApiId for the Metadata trait. + pub const METADATA: ApiId = *b"metadata"; +} + decl_apis! { /// The `Core` api trait that is mandantory for each runtime. pub trait Core { @@ -453,13 +467,6 @@ decl_apis! { fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity; } - /// The `Miscellaneous` api trait for getting miscellaneous information from the runtime. - pub trait Miscellaneous { - fn validator_count() -> u32; - fn validators() -> Vec; - fn timestamp() -> Moment; - } - /// The `BlockBuilder` api trait that provides required functions for building a block for a runtime. pub trait BlockBuilder ExtraClientSide { /// Initialise a block with the given header. diff --git a/substrate/core/sr-primitives/Cargo.toml b/substrate/core/sr-primitives/Cargo.toml index df80d43a9f..45e0396df3 100644 --- a/substrate/core/sr-primitives/Cargo.toml +++ b/substrate/core/sr-primitives/Cargo.toml @@ -31,3 +31,4 @@ std = [ "substrate-primitives/std", ] api-for-runtime = [] + diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs index 4d44ff5ce0..41ffd6da0d 100644 --- a/substrate/core/sr-primitives/src/generic/digest.rs +++ b/substrate/core/sr-primitives/src/generic/digest.rs @@ -21,6 +21,8 @@ use rstd::prelude::*; use codec::{Decode, Encode, Codec, Input}; use traits::{self, Member, DigestItem as DigestItemT}; +use substrate_primitives::hash::H512 as Signature; + #[derive(PartialEq, Eq, Clone, Encode, Decode)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] pub struct Digest { @@ -46,6 +48,10 @@ impl traits::Digest for Digest where fn push(&mut self, item: Self::Item) { self.logs.push(item); } + + fn pop(&mut self) -> Option { + self.logs.pop() + } } /// Digest item that is able to encode/decode 'system' digest items and @@ -60,10 +66,13 @@ pub enum DigestItem { /// block. It is created for every block iff runtime supports changes /// trie creation. ChangesTrieRoot(Hash), + /// Put a Seal on it + Seal(u64, Signature), /// Any 'non-system' digest item, opaque to the native code. Other(Vec), } + /// A 'referencing view' for digest item. Does not own its contents. Used by /// final runtime implementations for encoding/decoding its log items. #[derive(PartialEq, Eq, Clone)] @@ -73,6 +82,9 @@ pub enum DigestItemRef<'a, Hash: 'a, AuthorityId: 'a> { AuthoritiesChange(&'a [AuthorityId]), /// Reference to `DigestItem::ChangesTrieRoot`. ChangesTrieRoot(&'a Hash), + /// A sealed signature for testing + Seal(&'a u64, &'a Signature), + /// Any 'non-system' digest item, opaque to the native code. /// Reference to `DigestItem::Other`. Other(&'a Vec), } @@ -87,6 +99,7 @@ enum DigestItemType { Other = 0, AuthoritiesChange, ChangesTrieRoot, + Seal, } impl DigestItem { @@ -103,6 +116,7 @@ impl DigestItem { match *self { DigestItem::AuthoritiesChange(ref v) => DigestItemRef::AuthoritiesChange(v), DigestItem::ChangesTrieRoot(ref v) => DigestItemRef::ChangesTrieRoot(v), + DigestItem::Seal(ref v, ref s) => DigestItemRef::Seal(v, s), DigestItem::Other(ref v) => DigestItemRef::Other(v), } } @@ -137,6 +151,10 @@ impl Decode for DigestItem DigestItemType::ChangesTrieRoot => Some(DigestItem::ChangesTrieRoot( Decode::decode(input)?, )), + DigestItemType::Seal => { + let vals: (u64, Signature) = Decode::decode(input)?; + Some(DigestItem::Seal(vals.0, vals.1)) + }, DigestItemType::Other => Some(DigestItem::Other( Decode::decode(input)?, )), @@ -173,6 +191,10 @@ impl<'a, Hash: Encode, AuthorityId: Encode> Encode for DigestItemRef<'a, Hash, A DigestItemType::ChangesTrieRoot.encode_to(&mut v); changes_trie_root.encode_to(&mut v); }, + DigestItemRef::Seal(val, sig) => { + DigestItemType::Seal.encode_to(&mut v); + (val, sig).encode_to(&mut v); + }, DigestItemRef::Other(val) => { DigestItemType::Other.encode_to(&mut v); val.encode_to(&mut v); diff --git a/substrate/core/sr-primitives/src/generic/header.rs b/substrate/core/sr-primitives/src/generic/header.rs index ff8222c59a..fc6f73b5cf 100644 --- a/substrate/core/sr-primitives/src/generic/header.rs +++ b/substrate/core/sr-primitives/src/generic/header.rs @@ -137,6 +137,7 @@ impl traits::Header for Header &Self::Digest { &self.digest } + fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( diff --git a/substrate/core/sr-primitives/src/testing.rs b/substrate/core/sr-primitives/src/testing.rs index ab57f1aa6c..847af9a3c2 100644 --- a/substrate/core/sr-primitives/src/testing.rs +++ b/substrate/core/sr-primitives/src/testing.rs @@ -42,6 +42,10 @@ impl traits::Digest for Digest { fn push(&mut self, item: Self::Item) { self.logs.push(item); } + + fn pop(&mut self) -> Option { + self.logs.pop() + } } #[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug, Encode, Decode)] @@ -74,6 +78,7 @@ impl traits::Header for Header { fn set_parent_hash(&mut self, hash: Self::Hash) { self.parent_hash = hash } fn digest(&self) -> &Self::Digest { &self.digest } + fn digest_mut(&mut self) -> &mut Self::Digest { &mut self.digest } fn set_digest(&mut self, digest: Self::Digest) { self.digest = digest } fn new( diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 4fc09f3e9e..0ee2db117a 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -197,11 +197,13 @@ impl Clear for T { pub trait SimpleBitOps: Sized + Clear + rstd::ops::BitOr + + rstd::ops::BitXor + rstd::ops::BitAnd {} impl + + rstd::ops::BitXor + rstd::ops::BitAnd > SimpleBitOps for T {} @@ -429,6 +431,8 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'stat fn set_parent_hash(&mut self, Self::Hash); fn digest(&self) -> &Self::Digest; + /// Get a mutable reference to the digest. + fn digest_mut(&mut self) -> &mut Self::Digest; fn set_digest(&mut self, Self::Digest); fn hash(&self) -> Self::Hash { @@ -458,6 +462,10 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'stati pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. pub type NumberFor = <::Header as Header>::Number; +/// Extract the digest type for a block. +pub type DigestFor = <::Header as Header>::Digest; +/// Extract the digest item type for a block. +pub type DigestItemFor = as Digest>::Item; /// 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. @@ -516,6 +524,8 @@ pub trait Digest: Member + Default { fn logs(&self) -> &[Self::Item]; /// Push new digest item. fn push(&mut self, item: Self::Item); + /// Pop a digest item. + fn pop(&mut self) -> Option; /// Get reference to the first digest item that matches the passed predicate. fn log Option<&T>>(&self, predicate: F) -> Option<&T> { diff --git a/substrate/core/state-machine/src/lib.rs b/substrate/core/state-machine/src/lib.rs index 4853b2afb5..9bb9110886 100644 --- a/substrate/core/state-machine/src/lib.rs +++ b/substrate/core/state-machine/src/lib.rs @@ -64,6 +64,9 @@ pub use overlayed_changes::OverlayedChanges; pub use trie_backend_essence::Storage; pub use trie_backend::TrieBackend; +/// Default num of pages for the heap +const DEFAULT_HEAP_PAGES :u64 = 1024; + /// State Machine Error bound. /// /// This should reflect WASM error type bound for future compatibility. @@ -291,7 +294,7 @@ where .to_vec(); let heap_pages = try_read_overlay_value(overlay, backend, well_known_keys::HEAP_PAGES)? - .and_then(|v| u64::decode(&mut &v[..])).unwrap_or(8) as usize; + .and_then(|v| u64::decode(&mut &v[..])).unwrap_or(DEFAULT_HEAP_PAGES) as usize; // read changes trie configuration. The reason why we're doing it here instead of the // `OverlayedChanges` constructor is that we need proofs for this read as a part of diff --git a/substrate/core/test-client/Cargo.toml b/substrate/core/test-client/Cargo.toml index a1bf2f592e..aa48f95211 100644 --- a/substrate/core/test-client/Cargo.toml +++ b/substrate/core/test-client/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] substrate-client = { path = "../client" } parity-codec = "2.1" substrate-executor = { path = "../executor" } +substrate-consensus-common = { path = "../consensus/common" } substrate-keyring = { path = "../../core/keyring" } substrate-primitives = { path = "../primitives" } substrate-test-runtime = { path = "../test-runtime" } diff --git a/substrate/core/test-client/src/client_ext.rs b/substrate/core/test-client/src/client_ext.rs index 76e9888d0b..61133c4d9d 100644 --- a/substrate/core/test-client/src/client_ext.rs +++ b/substrate/core/test-client/src/client_ext.rs @@ -16,15 +16,17 @@ //! Client extension for tests. -use client::{self, ImportBlock, Client}; +use client::{self, Client}; +use consensus::{ImportBlock, BlockImport, BlockOrigin}; use runtime_primitives::generic::BlockId; use primitives::Blake2Hasher; use runtime; /// Extension trait for a test client. -pub trait TestClient { +pub trait TestClient: Sized { /// Justify and import block to the chain. No finality. - fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()>; + fn justify_and_import(&self, origin: BlockOrigin, block: runtime::Block) + -> client::error::Result<()>; /// Finalize a block. fn finalize_block(&self, id: BlockId) -> client::error::Result<()>; @@ -36,21 +38,23 @@ pub trait TestClient { impl TestClient for Client where B: client::backend::Backend, - E: client::CallExecutor + E: client::CallExecutor, + Self: BlockImport { - fn justify_and_import(&self, origin: client::BlockOrigin, block: runtime::Block) -> client::error::Result<()> { + fn justify_and_import(&self, origin: BlockOrigin, block: runtime::Block) + -> client::error::Result<()> + { let import = ImportBlock { origin, header: block.header, external_justification: vec![], - internal_justification: vec![], + post_runtime_digests: vec![], body: Some(block.extrinsics), finalized: false, auxiliary: Vec::new(), }; - self.import_block(import, None)?; - Ok(()) + self.import_block(import, None).map(|_| ()) } fn finalize_block(&self, id: BlockId) -> client::error::Result<()> { diff --git a/substrate/core/test-client/src/lib.rs b/substrate/core/test-client/src/lib.rs index b692d4858b..ff3cfbac0e 100644 --- a/substrate/core/test-client/src/lib.rs +++ b/substrate/core/test-client/src/lib.rs @@ -28,6 +28,7 @@ extern crate sr_primitives as runtime_primitives; pub extern crate substrate_client as client; pub extern crate substrate_keyring as keyring; pub extern crate substrate_test_runtime as runtime; +pub extern crate substrate_consensus_common as consensus; pub mod client_ext; pub mod trait_tests; diff --git a/substrate/core/test-client/src/trait_tests.rs b/substrate/core/test-client/src/trait_tests.rs index 86d08cd8a5..3a05b78600 100644 --- a/substrate/core/test-client/src/trait_tests.rs +++ b/substrate/core/test-client/src/trait_tests.rs @@ -21,7 +21,7 @@ use std::sync::Arc; use keyring::Keyring; -use client::BlockOrigin; +use consensus::BlockOrigin; use primitives::Blake2Hasher; use ::TestClient; use runtime_primitives::traits::Block as BlockT; diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm new file mode 100644 index 0000000000000000000000000000000000000000..5d9b1fcac3726fbcf0d4a685d6c9f8481ee438a8 GIT binary patch literal 47463 zcmd75ZE#%Indf(38bAY$2AUEjQ=(+uZgXsMEmDoQ20)G1ytE{nV~?%Xs9ecZYQRRL zAp!&e3TV*emLhUJT1A=J@vtV7tg7OzWmP`Nm9kQr*-6D8rc#{EB&(`8UZpb0D5)gH z51w7u)}~6yCbiCPQp)fDoO5sA2EZ42Jd-gj-h0nIFVA_-^M0OlJ817*3WFdBUz#`{ zU%!4myna5ie?#4d*8@EU=fl?ndmWq~qLNi8>B{TZRnZ=}22{NszHWWI9{q!;8h1CZ zjCHT}mM*n7HnuuJq=K>vR=2y|AlBoA9xrdNZT6OSd#ejUNrlyZ;pXn8U`S=-D(ih~ z>*~_f^g=MKqQfeBrQ2KD>1}PdU+FH<%T_R=SCe|R(|;9|_w;+Ad)19~NHsef-S&3Y zjVrHN55D8=t*xGe_ein0bD_QYN_S_;UXN;o&*=5?M*CuSdTDyDwbTXv?smJ^U0LdF zuXSBbgXJOB?5<4D%}p&XUFmMGtzHYp;?s+zN@=(>9LM2EsT798VGzdSl#ItQ|5i#R z-c_pAYRUeprLd|etzu~?yc~{>4#i<`X!x=CdYIn0aXYA757JvV3)hkVJDeQ8)V;K| zeJu(eTLNb*YunupYqGo9>8)*TF7?{W8{IIdEG=E=wl6O&w|Ba6IJUI3((bjH&`KPQ z0PhY}gQ-e;w|8M{d#$(D-3g{yw{B;**98Mxor}TD;VbQpHJWvqe0y`JZT$yxwY5ze z@M7COX0giYhu1bQbho<@N?vOx_`+o8Lbr2~S-5vQ z!51qGwX$`I)$gtZXU3M>8|}?bcWG-iNJl5aAPp(r~>IC(*fTN%y@*DT(b#LriUsKG-L@mKol(b|_DPljsYcvNxqV%_Ny*(A0Cm*|7K1_M zfU%y0r-NX!Qkw|qA`NSkL1ipR-}^hagWBPsQVneN(?%@{g33R>+Z35lHp$Y(B>D#P z1laWkFl(N%o9B?`(4Qys^79-v;DT3n8gAzmZ&~biOy)m7eFBGlA(GWQ=ml^Is}d*3bzclN--t%I2ndOXc4C4 z>kWE=w1{4Y^BeBF%`9ShRW)nkV__pcFdBS>%lC;*Lm3x1+>bUlgJVT9M# znXt-$N+5Y0&XT`KK;8Pk)dm45t3 zfBMW&MO4t6?P>0=Us%vUeUX#%aXswE6hs_|>GeNd<;X zhSsfM@5r?Nn)-2ba&6&e=B}o@R&=CD5(nRF0Lje&e$Xt!WcZiiwUM;^DxAjC#rkL(Cc(*| z$-6L(UpSh^uQtNxkvm}u1IBeoAfgnv2p*Nf? zRIffzbr$w?(4@nrtwT1}cmYI~4&>bjN+tspUx6jLyHXz&fsEE8CNV0QSkx!nf|eR# z`f>18EvRJp6KPm4GfiGnKIzNTFKVH-PX|w`Ryuqoed<+KkAf%C$m*;1$MILIQZQj& z{nJ_X!S>@<(#coTJFb09dnD}x0_=3*K`=un4&rD4gu6p5Kp(o2eq>+_w0X*&fN~IQ zrkxdh8c|-Zq}S_VbOw4B^|BzN-+-hfC7}h7`~>tnNE&d#_%L!fry-Hf5hz{_GD2#I z%^WFJOB$j-04k9ME%u&QRo6pw?bkuv^2yf$&F)AyMVDI-|34rolA^jNR)SB06+^e! zF?H-{w?XCK4a2anSEQxIaA+_Iz6kzBP^2aWBNVD0kc@isM1IHHV-&n^x(v~#8sl6( z_)VwWFtb`wLZ1;-+lr3cUBcZFO6c=L8cN0e61p^$E=35VHO1S3>(|RZDKZIEXb{FZ1U2hB|aT2IN*;#wFsp^hRYap0-Uoq^gk56a6yBbyD-~i zM7rH@EG&SyCI(8}t0QLy|B{k)O9?CkgKV5*8|!r;HCeA$xh$;LC%81%>yun;Vd@%( zyTj}CL);x%uRp})_TaGc0i%Kad3_p9n0WW*^x$^h8Stl86b|i;eyE(B@Z)7zXFq#!*Ew$>Y2tEkWl!EOd&TuH;!Ji$$`8iDj7t~?0Du2nq)`j7+qAp=*K6;=bMvcvR(jWCwuWWig7L#aZ^nkCUlE~d0ZDdmQ+-q zm{y3ypG3|qt(oLF)Y58Srvh92t^_YD^rUOK_H|c+0f>%=W?S@B_2DjKCDI$HJPO`y4~HT zLFJ!~h2v5ZU|K6q>sr0!5PtB#Zj>R%nVj0!bl zLQP-;gCHSB%PXu@sR>pp0zyb>j2l`a2S}CK2qFC!ZgeJNy;OWJ6A82=q*Z|VqY!IV zE^B~BReKek6IqQ36Juz=s$s&hQ`VKkMAl=)0f4+57beCEn5bl!z%VZ-qZbLD)JJi+ zaPUTO@RBki4%ZrWYV?EIz?^}nL<3A+s5&XHgP8OT-Zg5jj-SArq;!!jpmW6VqZ2EJDJSd40cj*!6X|; z<$`%>#cFG9L3g?6h9O|rA%g+I0F6NS;9g#a3@u2>$qtjAPGA~II{6{b!41?OM1*1n ziA1=KP*BK_cfVzJ8&qlF3 z?9Oa(Y{>&AP3iMhmU>{) zwSy;(_VI%=eSZf)9#c>^UYEILjHy7c7R1HxsgHUA|0)C(iXun7G~6Z*DqQ+5G{Akj zkXu{qBHC`z1q#`BG4jc}pmASo8s&_bAJB*|CPq>iq6Bc0SO$S2xNH~<^A|%jh&b(f zKqOFr@W*BcM1#Ypy#Vceh`i!~T@R}_tla=#RW?$FE3jt!9~stoXO^%{nK9QBxVgU- z5W7te@M@bMd$0e99W-xd$;FQpDHTW2jl4G|B8NbGH(zcH(W_XB@rGoXgjzxFFE(r$ z*&!fW+)xPLF`oI%)*w0=#9)HJrQB!}=w@G;tI3#XRvTF^bntA5Y?15&L8&$j;&Y9W zqm8n*g>1-S!mnCi#gd%YIwFpIM(s`p6KSototAq^yq!i@>X>=R2IB*!1|HLj>zN6a z)Fn30xhj5-kz-QIdv-L$Iw7h~;+yR05fzCGk@e3a;5{H+vbng32>8(?MAfBpjWX0w zm_(cp72DdC9fg!U$YueRqzzmM2%}4rb_TLV!AiAHF(EqF^+!=ua?u)vRYKNMI~b-) zP6WYxtY-y?`6quy_DQ{z^O7WR@1iql86uU_36>GqO}0pg_sr5sb3OfyH*V9a#x{vO zFM6TY@o2%VNq8b|+KvhDRDo(zEy!u=9Al-qB=z8|I3YUgAafTy04SFV8bkYdCt~-S z5RmSgMoad#X2GTubk~N`>t?F^uGCh5Vdn4(gQKi?x;m&^^jHLlFDJ9jxu(ewO7xF@ zgBi`#>RM;VD0q4$ABQt!f*Qe~9RWAzBJ4@}kAxCA73>aa252(y0w)#ckj%#djduni zRcbic1so*lj|Td=M|(LkAXkLT`XuRpuZDg_N;TURVIX5+o3SEma_c?_HnbTPoe@4 znOgvD_Ec_6#%#mCUJ1oGr{BVC<#mLq>N+(2E!qrLRyYfQ>eF{Q{fG@SS?bPNQn&}pPsT1HUrwB8!G!x*I=-=9dx(PD3?=e! z@b-9gymp*2=oLP-ciiN>Nipo|iVG}Du|Y{s++?+ZGPoTYhggpw{7*pL5R3u#H3r}( zwdcWE`e!1P2{uq|=%hAcuh5A7YTA7^X_4bz;2xIJGET2~Jb+TBIxH+oJKYTXR0xvT zxD|B*?ojQ7HrC)QZE6h}28Vpz8g`RhpCU#zx;nrL9?IBS&oz{6@fi*)7r5tU=-Sl? z01MS>Kbj0>9B4&!F`f($6wymHDQ87~!QF3*D| z&Jhq-p<_{;T7a9*)-S@5JKkJv&hs4umHeiGLI9H5_ahB7h>X)lwbS4=Wo<}7| z%TjXX#xVE9*PXCJMqu$k^=|RY@~;CGDgrNYBIzvhx4SQ6gbX=B3O&jq*K6V=al&I# z7Wc+7gPHeNcn`SD`6XvYDg-5MXS{@7Q)Sx~rcZ@x`|nH&g!1qYfB*yTAP52n0b%W$ zWu}a?a2wirH$5_B^DpQTgd+Xqdc=2$9vKqL zwm^2E*0l2fClF+snOp^@OYejzQ<7%>8aB+W??3_s)Gh4^JSc-E{phz`VfvPT%W7bO z@aj*=hC>5eK8uTNqsN_dPhw1FI!3i;;TTkj-9USTDK92~00(D5P?Z})7gHi0judc? za2XVF!a2gV<8K7#2yH3n2%9W)&QUoTaT0+LBpx+x7JnmskJ>hZ@%AyBv^0dx>Lc=# zd@GqHE|rMj8T#8Q(MD%zO zHWvCuWTqmEM+B31&PN$k5ed|<@Q1AqMsU$l!wM1zDzaYqD?6A<4ki;ChBR|7<%0?? zOAmAYrAHW`3t=ph+*)Mti^AG4yPQzKTe*ZB7Bvu8DHI%60cM+*v%|81OcCV;X6*c= zPy>A$rgsVjX5f677eM3^?!Y6CG+q{PnImL0j?*nd7JlsNjrhM^iX#YnOr|B9*lZ*q z$_u*)J}mq0+2~Cy4QE9Tz2gEsAjFxEkh8@vy>(YcXh1U%tZjXwq9oPzKx|rGB!=>c z8AXmr9jwr-i}A2f+J0+{Im_`XlfRh8S7ZXg9Cd}gi8Iy5WK@a7Ey~S!G;0vR)c_PX zsusygs&tfKzQa)BtO>Rw2#`Y=6QT@CMH3UuV^VZ6nN*0Li}@x*7i?7{K9dPRnygnu zsSzEzjZ3wuC`Q5C3eCuQ8c(Xudxb^9WR$EWnrIWqV3q@ny%jopES7EIJsa(wHO73o zyTGuJXk2rlPO+ouYl&aC*if4-_E`2NiQSzrQIPut>){Xyz!*w1`KL_J2~P%SQIW&{ zF+MyD8A!&-(|{Om6SQ#gj`vF5{?2XhC{>x!ZIW5ouFQ!0_+Xi_#KK_NZL=i!S45Ba zbgi9zA+_yG-Mr)XATZsQ=i?u^+n|PZq+hL)Kz!S3W9(O}2=scG z;G3ZLBwuW^H0BPB$KxaT1t5VmOd2abcXuS@*hOR9i_RA00208F(1$OMM<9fNrXfVs zDB^`$tAm&+NjB>pm4@D@pS2QbAC2r3 zHL`uQAicra6eX?&DnHD{veyQbZ_9W^P`^d@b!qxMry%b@-KyjH$Q z@~@ta|MRf${Q(tDnqa$|g^x)s(Sw^|7QR25l3V!L{=^96lXwfCwS-k==wpQ7MtFBa zQA0Coaeq;swe{M#<*n0O6d{nyM@=@s>n+5+4 z%;IjA&n*G@1G8diEXzkM@`ET#>}Me*7VebHKIQIv7;M%;@;tYAD1tnk%|i{dX6&E3 z4<{8Zsm#iezDGp-0D&wk=MN>A0i|f=XhMtwQjbTsO{$o7_yOlxgnyxze=%`Nrhl}( z3Hej`Pe>Hg^@F%Rf)*JxaTt-nu^SE5!^Ta~#BrVX0d~WrcQJJYy{)ozfuJw$-6%r~ z%_*&nd2k~BLDVS!sz0|PFP>D3hzdjt&fX4Q`!_88%y9&M!r1tz^VWF%H(;~Tvw=S4bt>irHEnfWz+roL^BbpY4j}DEvN|uWIu>Y=&%Z zWJ?uPI77M|I_3=?9UhPsmHp^UYXFPLz($dTF<@&2U_B0HLmUVvbZKESGh)W+3oCh) z(Lw6>Y==XRT0U9k;KYs=85+?(K}!y75y@jzxCerBiz5|+ z-6@?uf^9P-qb7%7#5erw1ik4EB)qo1B{R$&w#*uB_MQD(WRd`i%8#!@>~bj33$7+Y zn{~9Z;c6MOFWNKN-aoN*sRQ`XUB`W7Fgdt9F~{0VuFA)8Xj^ny*1ma0Zr8DPDr0pK zp84cl$3+gT?FsEP+S;59Otc_uDE?eJ;!p&&iusyJbaq5r%#pUlejO``3ed&zs3{jm ze|nfDAjM^&L4Zsf?!?E)T_IF>PLXg0K@>P-LxCU&f%~thR6&qY27~+wqre_S&-fd) zAPCL|L6Bk8tKx`?-w>Mf2b267vL8hxjD-p$$l(jl8YnOd$fTts99n zvQH<2LUD2M8WUFnwb{O$fuU_V%noO>+BOR|tCF}B%eaIAc4cXaFgDSZfIVSpGXgrG;>S8<3 zvBeBw;dhiF^A+3U(?Ml3?A+#AxD7G5TVjCd%)0hWN7YwsGjQ{;xriam93+EO(BlQc z5x>jT_Th4#aFCm30~DTqHzW)=f<$SQ2qr3!&6!^9bduUaOi)}=C4NT)FAEJ)nuP|D zS;M?iXwagEE@TV=i6JV;*0K78OizUbsY@uEe%ZwoH@Gd*zPL4S@I_V7_>=CvTvJE? zxr54-PQ*lw-~qkaYZz$8Wa|h6_L_?}A}O?-4vG6;Zu);JsimQ$7Ih^S&H|&gCR)HwP<^)h&du(sXwoKhJj4l3UhR~~8t;{k_NNkNu zY!PG-Ol3$&N62(X>V?c61)YULj#(kbv5uAZ$sWcS%?b(+@Gb5u=>@Zqo`OZ|tNYgU zg83@jCd}NFu)6OL7T3R5qF{aV`oV=Y)ob&HGKX;S~fzv&H6Jn(X`rX zmfqMhTE47g28U%l3~iP9tcBriBKE+a2({S6c`de!AS#LP>) zq=XZR6frCweJQUl1}>(r@Vu7~MVigTyCgoP#9JvwUY-cZsX+|*j{Gd(=xhsy!oc{!cj46dBqdbjcWn{8sl$w{3&{C8s zR*$@vj6R&4pg+=EGBV1`_GY<^`B+Sz<)RE1wnWVcQ{rYoa1o&kWkFk#(!p#Jq))4B zBQ6h>LX@ru`R9PwNd{Mx&oM}UQAKX8^J;%=(G^D#dEpQ9LgcLPP->ve==eiips?0*pECY>mvP+2m)e# z;9;ci=oW*%*2ok>|0<88yd%?9}n(D**s z$d>TNvn&q~R?agn`WY+i%`4+#m>4m(ydVNB%iuSd7~h%C1X%>e5XL{@GXu_NTYx6k z)DAFsY(#a^_$kC2Q%vW~g$?77A?c^dh*V*LFH~dF>_NHHC0SBLk@lQuf zO2eo)TK~u&`?mnX@5s*|?FSGXrHD=xM#$)9@T#}tc>?gzn?3;;Q`RQ{voel6bwo&l zhO_tb!JW)8{~pS+Q;(J>RI_j@vYZH`gwBhJMN?n)P5$M-1B`CV*c2$fmg@^juRzH{ zm-*}F(8$N;J))`P!WXkHJk>;NkBROl_Bg9}ZqCf{+P4@Ue38sM9f}a-iJ3JMGHXUK zMossuuF4PT-loD# z$CCad9dn>Re~T@}X9?_4Q7DcU%G@RB=JH@IC{~qt#NIa9tE4at6*G09F#GI?85j0| zU7+Em5!ob`+#yU!in=nbIRM6{GwGNiE6jS zsA@H|PeE{yIB`krqARN0u!CX5k*jH>ZlA{qbWQ!?Be#P{y&E^|kVlD{a=oZIk=1l( zjI=+@3m8zxxU?gf4pCY3NM%+dQM#nq3VorbtpL0*A*PX3FG8m9dpgu35_GXn5)YHF z)+?roh)zKS3VBs^&SnhMAZW)F_hL}Kb^)67oW;Fta)dGodow!JE$^NYSzRz`u`iy1 zV$2=SR4rh{#~rO3?yAHgH3X->7|z=iqguEz{>h)Q>#)81&ssi|fPX)do)_~88^Akc z4xHeB7xAHWK!g%d5OG8@>)0tJckNvSi>G=<^VF>ljUF8vyW-sa$~e*$yWv$EiVKk<9bH5S!fZ-cFQ%8b!=~NgIw~9)uOmqQ2Q*EZbhK& ztiB?nPqVm)aPd?o$`98*N`LYlZ7O1*gDbmL^brtbsiUgOafJ8FdPs(y7$I$h({YxEa3Q7`0d&^!<)pKSDPy!Zij} z!vr`{F5Ng#{6`Zf`M|=A<+>$z*wWnO8v)}mT{UJYEHf#rwLI{WvI2e_{AfW&&xS7{ ziz3@^ba2`WR6EGHf44C}4wMr0LW|1euVnjIAWi+r(vab^DQn*Hb#e$SX<;1=d z6d0P={?WpE)Po@{w1ukOvM_4|0wxCvZ-aFiQXZsGfy``F3n}JR!)u;mPHazvCsasP zVy#qCrI=UTnoAtM3yC&%Y>}pJ$TW?M(t^?koqmwQF|3{hx@xGw@)(TH5GkgeH67$T=kS0lJ zQpICKQE+!$706MovTx|^529>)YwrRb^i0=(XhN2?aEIZAFH1~plvqHaN4^V=-=hvy zec#0#KT5sqWE#2W_oTc8{DnQ~_BwjxtRv=R3nMccf)Fv_YT9?-h_Cw*A7THD#lbz| zFaH!OrDjIn4W5N#~I6S2? zeO#~i8y?Y@4X9 zTG1K1x3MKbLGC)ZG0Qdysuhgj9Bh`XFawY5!|EMreV^Xl$@{$b{>gja&BG7YjXyb^ z0h#8f@BLg4shj)El^xwoYzQ8+q%(eS>q4~FzC|_=@etX`9Y25!DK(`wNQQ?GCPTP8 z!y>nS`VW2b=@a|VP6IJ4J{K2YRcMF7VS< z_YV*Y843M)M1y10zf95a)WK`=mn9nN2M_-jB^nYNZXbU8qT$E`u*(3md?L~C$b%8} z{Y1l~57y27M1u*czapaHQwP(*fui97u~?k`&n6l^^mbAv0=z8rUL^K~G_y0CoSboH zlhovXvx(BaNW7ofl+U|p``EWwyrFmx+h@P!BQb{^p_n2z-<)i!(Fp6`B~2oGF^ggf za29YC{kM^2z#}U+>X@tbFh0Y3e;&%-Fm)G$Cp<5iOL#tzM73^6{o=hj7cSV~g{&LI z3r};se})kN^N;uTe@9+9N4AqU@xpwZ^sfH-AIOpX$ei-`bbC+#9E|Mq&+|w`7Lo8* z5af3LvuhTr&92aeWd`iM-tGOK@*h1iG|C6php!L2#B%QiF$JO$M2Q-)i*34RWtkSA zvFiPq_DIFIG2t8Ys7M9nP|HgADinyjvM%0-Q z=v0Ju$ARZ!sYAYCFkE_vPHs8E93v4@g5Q&mub!vExN-w`pkG&R(^L6D-78>4?`H3c z#^6+usY7ozI~x|tw3!%U2Hr?~_%;R1x)EXWNNJ54d=L98`sdI*@WysA+#9zCoss)_ zCz*umGZG8YnaIb9qBJpTujez z3nGao{vQQ&`v(>nb7F#mv5V027YF6USSBa5E8xF1MHZ=rV%SLOONa%BdaVMtwLH!) zL^d7r^^V&^1MiO8*-2X?ZXX(Wr&zy(7!)-g9(V_$EfVZjJsfx^G348EJ2LQ&>;AA%_mBzv#v{6a*jA(QsP0i8s`Dw`<4)@Si0((71ba;P zjwTsB7XG)V-hB6T0^kJF0s>vB!1qCniDOu!&5#`IOx>h8^@n4(O7D zHFhA56(Bn=!0v=OWZXF>pkIeZdv+-phDv+RxzK$c-B*@U%WEFxVUY2XKI75%c}zMu z#uO`2V||NDAIdZdh`J7VO8Uu8N|MiaLj&!}lJ;Q`>X@7wop)_+6Qa(vTVUxiLYI3- zfH)B%?a6%#gI{eSc$YDJU?-C@b|+lLyUez5A@7X!1MP0*ydT)fqfFuQ-7DT@iC=+E zS34rmxX_0zNp^RF%yh~MoS21lv1GAMxJ9w{F~1UbQ(s_y)o?In0~F z88Gz*+wRjSnF1i@=Xxvb$Egi$V-lL)pa8#t$J_#^V-f=#A)Nzm@KTV&YhY54gK5xF zkVBU#2WZC)V6adlhs8jkU=Re>AI=&?Y9-sjyYb1Q`8uB#)fS>N^2cr#ckp<_)`vtf z8%nAL6vcwtFHm&j{yTVY2vtA*j&|^F==Po-0%W+)L-_FXqq5YMh@oF#2(Op8vXA$H zn<-u1^oyL4nVykzxy7z$EvSF5%T1)O+C7lPj+LHU>`E4j&g}j3miujR2DKF}cNGB( zQ9;j+C~6}rs5N6TQ=2yt1-JKF?k3s2<=)p25j4bvGQ*vROuX0|L`&Z=y=`WDg4mX8a-W;$`ZQ<5_Q{AtLZT$BM>sbwVV!vByV$8XVftE= zeHK$>%@}WLu}K-X^?w5b!Y4`XzjKWe$y@~`Ka!6{vXmc-AHYkZ8EZX7UuSD?zHzqv zW>R_MZ1h%rTnXtK$05AHJ`UZ!K z>{~Ce@4qAJuJ~B??D%>#O_;fSQj$-cPdajuN##DNm|tDUG1pWlFrE%rS}obZe{^pd z+8Gs^Vv?vq0_2=+^auaTZqz%8g8hQPy+cH0`n)I+a209ce0lG!nuj{+Y(}5WblcQK zmfNH!WP;TLKAsK`3dsCiC(*ZL(Uzi!MeeT5(6JPoU=b?8wX8A$zIwxB7?WEzP@(vP> z+zaHPI9dBWlTa|fW@a%aw?6cgt#u|({F?gmTyJOV>B|Sz_ub@=u;J_gt+Kn*8W)U@ zyEG-)f6`=&2sJq*(GsP9pOg^&ZqI*9qTR!edu5VHt@GwEOgzE1juKie#jvOqwAX|A zvqv>3Nz3$tmwsfr_8GdM7rt689n3HW-N-~Kh{G)5Hd`9fVo2e!v=}XeZGE!u#WIjq z@hL({2umFj(%z=2?N36h_7#MKXceGSEEw=1t@b<02k;m|xjs~|x(sVj-9wNb868$n z-)+7bJsaMDR}<$$z7;Zu;NOetkH}K|yHWj7i)iRuWdk;c<;}usisN_%BW|)UP|5S@x+6b-Ve56O|%KYd1}z=T`wNEd{gedTS>?1wThTGVilxn{Iy^N0K&g4qVj z5|!l!t)nj7mxuaRuPbY+%zkDs!yVFpAMV@)Sq{VTw?VA&SG;~a2p zaLDg57v*7XJd^XGN0Mjt(buteVecnl?;1xl;x|2qb0Afj*hX5_k?}{Bg-PO3#%V3Z>NhQ63%bjE8+DO{_Hz23@29HEyUu{59@eN*#f(3emdr*ASbY6_!6w!4u z_%_t}8zMEx?gpsSr))$RZ#ip*Nof+!+OYtFbHSWFw8!{lB?lE0%h(U@s0nMBiEh^^ z3#eQszj`MD<#h0`piF`D7U2BU?lZ|wMrtWJ0>ysHeWJz=YA|2pHA9zUyR1h;G3rlF zl%|frEFuNu%h=PKLH;`c5o`=e%y~rgvx+?;;%vx+0cS!k&6T-5oIWLiFRlHQQ9aV( zVQHIe-Ngx32KB}H1MFncAH9(nK-UF<KvIK39h_A$0{#QEJMD^ zp$%8RK*K7BL|l1+f>jQsxbkMch~PSSE8I&Y;QFww#=qj%LG6Q+=&=|*W(kC_Wf}c6 zC^)@hGUT9}rJv6=h7D)rHG;wnO<0d+k_;=`(xhjNenAoGjnef>Z)8JAObrrAWY;Dm zjrbcbU7F( zG1#+`B{x3KDrxx*9(|0_nQiVpNsXjE3N}LhE~$~`eOJa~x4F?@eoIgNTN*`nY!v4J;8TZ@A8X1}x@0|$;|2ihQQpYU%Aw5oBCwom#u1JsH* z>q}T~bY-Rj;m?swhzs9SaUL?=lf)r`7pZ`2|7Ne7YI zO0M(O1~^V%qJUfQIs!2-Ny(q~sDwC7uLbap{1t};wNcR1kYo=?7gJ33fCw@q+XHgS z7Qr46W{NvYJkzsj$v~f?cx*oSiiZ?F752&xkTuE;Jg#Z!ejli=?G^ zQIMZ%f%=l-;l&=-rap)VN~Ot;vXDA*endQ%{CkpsPnHSP@drZ@B^*3g>* zXnI3$Vhz3N_a?L?E+nMeGZuX^lj6KcDhU$4`&Q=S9Rcx| zGR*y{g1n|0#{A_hH1ni?&T}s~f2f~+@qYEc zj@*}7ZXX!4wx3?hPMu`A%G$}kMKDp(=vpBOU8{d9PdB%<`yOkWWtY1q9BuOju9wt^98HVt&dTktC<%|W$b=#xQ%`2z_BUyx#5MeKYQ@lF8@OhW2%i-K* zigT~Q%y4IHw8T3uReZcZ1(zl6CX?a(sJbO6b__zlL?dL$@r>@At=E;$E1eV;_QJren;TOXUlKZ3G<_T zIMIq&=i^vrI!In&claZFZ~eN27zg>{7oV>xPnO@6;UAMHTupUnPaKe|o167uLWbt< zr=lwPnUcFpjYkfoWJ>o-jk{1X#8)YtDtYbRQiBZr1EdC}`=!S5gE`kFj(e%0k#Fb} z?|~9)kJNbRz_BUaFEvgaJa(Vu+LoumAvf*jm;hD3yy zeKd`Qmt3%zYXeI2tKW{Xf{#Nl|^&0H;Un}&d0YmB2C`0m2b+_!ySn@{$91!;-Q z{b4A%Z9?6S2?7VYS9;-GRqnQ#8UrWMC{@s!w(slgn^uJdJ%(83fkk8)ovophXhgIB zJiyv6hz`~I**`muPV)#Mi0M(pVZ{Rm0m?d5Wph&q%P{7VZ;AzMldk3uPx6z<`Y4-W z#I+$VM>QJa$r8Ib>X0$YEQyE`8@2CZQtBlr$Y9qNWDo=W1*+H{0-*AjYgbB%bof=^ixqC*V>U2@O3Aua z(7;lqZn?B+rGZU&hM4y5I9DDNy04^oUy+FFO>pRtSkwFJ+2U>W&HR zqf#ekY+<p$ziYZZL0j47*I8RtpALIUQO%$XQD^d z^hE!e&{8#>>OT{As`72BtUtcF74T84U|gpF`zt$0y-YKw-iI8L_E0aSUN728dg^`3 zR#Fk{0qR9D`U+;9k}q$V;X6RtN{ZQSOd$pWk_GKlVkuXNS`Dug?G}3U1e6`#yi2dn zX3l%s@{BJ^{zQ<)Dkr+o@=fOky;_8CaIGy8d$(mrkGy!+_E z43yJmIkSxsFxd&O2bipBKXg*hzSN^ARpB?g9RG7{qptv@z)=85@pH%m1gCsWlj<33 zQCb9F>|#Pt-zU*eW}yc9q9+I6KHuc)YL8R)kAcscWdtPSp1~#0bBO>TP9lKHtAsV( z=}yTletF5!{%BEHyoTs8dse{xtE!C%i z_#;$%pBZbQzT}9t_urGrpYK+VA!YUbHNE{?gr4~IzPw|zpY&-LXFH|uVFdC)W&6fj zWKXo=Gq zuTFK%f~)*&wU4+q;*0K^NO8(O5Z@EhH`_2&^%Xg}M}?nY=PP}oZ52a%`dxK%SQU(d zK=~W|33hFfx?k_}RrQm&;tm(!bss$OFlZB6w~1g-4TjYZJD@q0pzbxF{h+Qg*z;#v z=;u7L=Ol1<{;Z(FsKgupg?_>=B5jxG;td~NwBOSXiii|-8|C9a`qO8=3Cr{O#3V-G(U)Z6I}G+?eW=5}>L5vu zDHqn61Hc%U3nF9y-*8JOU!`_)n-Tw%{fIc_lUDL70$$q~rMHxm%okB`u7mV%h2Oy1 z4b%S$SW_(|{oDwX;9~7jYDWrMvgtl!#ZM*@%#Or%F(1*b{dEPWBwg?Wh1&kdrVtcQQ1I4o zOHSxh_%1zNm8dI@{NbB=g@WV$2wb8Nd=_IL3(_CZQZnz~k3;)`qFavC9n(u*GaZ`S z#Jtc_Kt*4Y(Ow3uW?LD2LknB_aGX|1!9w?T_pVemTBVaEU?Bs`i z*kUn#UUBgCj9(PlLElbNI&}(F{76ML@XKAo~*RsKT(|47Xu0z$&4_QBnGiU zL=&*|x=bsve&j@9<>`Z(sm(!^p9^Ettu{*PMxmyX2GOGoV0V15Pe0#4D1ouGy`M^w z>NFCX^J1m)4{8yD4AEP8Z~Ud*&EDFjZgQ!6X>0ph(!F}2y}Q%vuAEBJ<*n`B+U6@8 zYs>A8jjhfz+wE^HUFmjCZSQp2m)o7S-nC@wN_Ts8W9wVZtIcL}syW@9Y0ft1nyu!1 zbD_C7)ts7|nx2}Onw^@PYE8{gEle#=H>anjr>AG8XQ$_;ThsH?3)71;&6%m0>6w|C z*_pYS*3A6O!p!1qb9QQWdUj@Zc6M&IH9J4MFuOR{oST}Po|~DQotv9$&CSm(%q_N> zt*O>@Yo;~ZnrpRM^R0!};(T*{YJPftW`1^lZoV}?Kff@)xX@gfT9{s#S(sgzTWBrJ zFDxu9E&}2r!!OeHBFz>l+Syp^bd$BsmG0GKr`O)@?Ii79k}U7`lJ4e;Jp{%7ft}9Q zcK4apOTA|VV0cU|D#yr#vZ(asLgv^SIKUz=%KtDS2*r?2)_SmpL+r+fNzd$)JtG{C-m zp}XCs6aL%yR{I)#@M3Fwt+z&hYnw^0yVEF(9u_S)voT4%{7 z`IYw0g=BLJ6u!FK-grKHnRK_ex3<5+gu2_w%GxXRm#p==mw+D{^pgPAUealAbapq| zqRXA_&NB={HE{hay{+x`E8S#!i_Y)SXmd+5dwILPxzq0S*0unCd#%`Pxtm;RZ>+7H zVx$ewfBqYnRqgcY-OX=pw=W+*aUPr}?d1H|w>G=yRd=_WE&Y~N1)9(=WVWEOe=c6n zvU+Qqm!Xc8cCVdW-rl;hw!(m{Z1-xnv)k(~EyHXV4H_oA)awJiwh8Wma>v(cU%tF? zZ7Ij~+NKt4v)3=#>0Ib`F0uyh#g1R%rL9%B$f;k@Yobd)x!m1`uDY9@ErGOWiG$!l z=BGOP?_N02`{+J(GUOURdd_O^>~s-HEW~Pija53GoIk$NUF{`b_=4k)6X(YgD15cY zoAXbPxkBBaPM*22b*cNza(D9?mU#P>t!K8oudMC#wy!-Sf_i1GcVTz=RA=kb$*FFq z)0$pfTv=Z1b{3{*p1ItH=K6oJqC;G3 zY&|^6^|M^7T;C>AahU6|QTP4~di%Kt52{%y+fs`B!VFRuZ|=ef_|>CpcpJYS~#DA)gz&j^okeV6|#yEZf|uVuJ)hN4W)5C_P(`sb!lpPVd$`)Ug`FhJjo-adRxPjD&6UqjuiU1(7jqd zr1u?k;C9w-v}R2l7cNN=j2$VKbkKEZ7JF0qjNUA7v@dq2m!{`hOI_gVZcDEqXVaI-B%}p(0@NBQGUaKxT23#_(KYiL?zOmawlAk_(d3Wc+((<()%JTw-&&te9 z2a9KBc6Ft>I5BHzI(^!kPc-({(^6(V(Q0a8Wqx*cd2w!`-C68TwSEqo%&|CqoS9Oefi~M`tP*#E!GLEuytw4B&ND-byvHK*iNNP`fpE9tu$9xr`t_Tx%R^9 zLpu-Le{nLua=F`i-oSTr`qD82;aq=mHY@CcZ3b;Mr@M=b)18H8XMVBUo_qL^;b|FR zzPW_1#@sl3Lg2F~?aj5$MQk2_OY7CuR(p94>YG|^F0QP09{Dv_731x+%$L)rZ3>dC z1w8N;1gz~`-e_O5Vg$QgcX!tQX4fIbdbogrxx75P+*z3Ewpy#R(~r&-`hQ_-8?(%& zak;%Ba__#f-QEDK#g&Db)!CWl`PC^c{>rCXu9;s+yEsE?X=@wwFG>B;t~=FQSe}_* z?X1qPU~;#Pprj6(`I3Wfb!KLD0Xuwls=YYf?XEudHww_D+poY1o4s#Noj$#DVe4B< zHaP}q&S4kNcV{ufq8p2OT;gnH*&CmwGb0@d%SQ--&! z-yN+kSerk#WGlOm+6J&}MD3u)Gg#<0SEpB7&4q>O)%l|yIeV9P$(h==VtBX(kN@2ElU5lk-yYtJy$v>TqtsS&4_bVz`fz2)~v}dLlS63mv&P=!4 z?mYSQT|1@r%1mcrc>%|#)oseH`Sf#!ontS(0Pj990`OtxmlqfCWbl7xmgkD4Z)g(r0)aU&lvDt^JKQ|ab4N5+!JvQU=R zR_LtNMs&=!mRDwHv4%QRbqplYmos=Jb>LlOzca>8UzqF8EVLI|-Ol3lYI}8cs`0CC zzPoeF$95Nv?am32eJN8Esi)`~`|8xG=gs(Z&^SYMska3z-Ok+V%Iti1t~J|PoSj{%Fx`cn)6UFV$Oz$PP1Dib8)%b2$;NYGyXWPvVYM>=S*O_h39Q(q~?lLx` zndMkwOWyf`W6U8reY#*^gN~KT_RRe{8E_-$VR->3xr^|h34mXjY19v0z%8Y&>~4PL+qDJxLH@a zC_ezh_da#%>;`(}OY)`K%Nw3bayf&nUtV14bmx(U%Zt-bfBE1M`$Te(YsY+7aW{xg zpt0NS`IY6llP}z_qim%M_@ke8XJ%z;sxv#?TxiX$w7RF}ceXEWEbZ)GzDz&|Fr29* z1YW=|$BjA-+taYKIJMlGYZIB7o>}OuEI*Up4}jIR&4N3sIY>rz7SS&Yt>w<#LUYU3 z!0Y=gfOP7m_P25y#_Rjk*wo~{)fSJf;eX#pAkQo=F18Sg3!T|+3x{oL1cPk{7je2$ zh*r#CMHYPP*?$}kEVK}?iJjMhf#rKM>bYNj@oP)ZJ^!U|Joo(43*UHY>8vl8Ov%lI zA|K@f%u5oDzrz6%yOI(5pU4FrCD_tJ8AJ42wNPTBo)7F{|=)aYkd2QyQ|5mAH7#0Tcv z^X{%0cW1vixhJr9rb3i(Mb2Nh zyONIe&5*OtJ39K>i^q<=#D4|zOSYUh(x2N)N+{f!_RR8fXSq4mZB5O6X_)56;)yggsK{Qm)HUG*gZ literal 0 HcmV?d00001 diff --git a/substrate/node/cli/Cargo.toml b/substrate/node/cli/Cargo.toml index 61b31a5f67..6f1f92cc82 100644 --- a/substrate/node/cli/Cargo.toml +++ b/substrate/node/cli/Cargo.toml @@ -9,14 +9,19 @@ log = "0.4" tokio = "0.1.7" exit-future = "0.1" substrate-cli = { path = "../../core/cli" } +parity-codec = { version = "2.1" } +parking_lot = "0.4" +slog = "^2" +sr-io = { path = "../../core/sr-io" } +substrate-client = { path = "../../core/client" } substrate-primitives = { path = "../../core/primitives" } node-runtime = { path = "../runtime" } node-primitives = { path = "../primitives" } -node-network = { path = "../network" } hex-literal = "0.1" substrate-service = { path = "../../core/service" } substrate-transaction-pool = { path = "../../core/transaction-pool" } substrate-network = { path = "../../core/network" } +substrate-consensus-aura = { path = "../../core/consensus/aura" } sr-primitives = { path = "../../core/sr-primitives" } node-executor = { path = "../executor" } diff --git a/substrate/node/cli/src/chain_spec.rs b/substrate/node/cli/src/chain_spec.rs index cc4612f27b..53cf074767 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -17,8 +17,9 @@ //! Substrate chain configurations. use primitives::{AuthorityId, ed25519}; +use node_primitives::AccountId; use node_runtime::{GenesisConfig, ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, - SessionConfig, StakingConfig, TimestampConfig, BalancesConfig, TreasuryConfig, + SessionConfig, StakingConfig, TimestampConfig, BalancesConfig, TreasuryConfig, UpgradeKeyConfig, ContractConfig, Permill, Perbill}; use substrate_service; @@ -45,7 +46,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. const DOLLARS: u128 = 100 * CENTS; - const SECS_PER_BLOCK: u64 = 5; + const SECS_PER_BLOCK: u64 = 4; const MINUTES: u64 = 60 / SECS_PER_BLOCK; const HOURS: u64 = MINUTES * 60; const DAYS: u64 = HOURS * 24; @@ -121,6 +122,9 @@ fn staging_testnet_config_genesis() -> GenesisConfig { max_depth: 1024, block_gas_limit: 10_000_000, }), + upgrade_key: Some(UpgradeKeyConfig { + key: endowed_accounts[0].clone(), + }), } } @@ -139,7 +143,7 @@ pub fn staging_testnet_config() -> ChainSpec { ) } -fn testnet_genesis(initial_authorities: Vec) -> GenesisConfig { +fn testnet_genesis(initial_authorities: Vec, upgrade_key: AccountId) -> GenesisConfig { let endowed_accounts = vec![ ed25519::Pair::from_seed(b"Alice ").public().0.into(), ed25519::Pair::from_seed(b"Bob ").public().0.into(), @@ -220,13 +224,18 @@ fn testnet_genesis(initial_authorities: Vec) -> GenesisConfig { max_depth: 1024, block_gas_limit: 10_000_000, }), + upgrade_key: Some(UpgradeKeyConfig { + key: upgrade_key, + }), } } fn development_config_genesis() -> GenesisConfig { testnet_genesis(vec![ ed25519::Pair::from_seed(b"Alice ").public().into(), - ]) + ], + ed25519::Pair::from_seed(b"Alice ").public().0.into() + ) } /// Development config (single validator Alice) @@ -238,7 +247,9 @@ fn local_testnet_genesis() -> GenesisConfig { testnet_genesis(vec![ ed25519::Pair::from_seed(b"Alice ").public().into(), ed25519::Pair::from_seed(b"Bob ").public().into(), - ]) + ], + ed25519::Pair::from_seed(b"Alice ").public().0.into() + ) } /// Local testnet config (multivalidator Alice + Bob) diff --git a/substrate/node/cli/src/lib.rs b/substrate/node/cli/src/lib.rs index 0d8c9c4d71..beb47f91ff 100644 --- a/substrate/node/cli/src/lib.rs +++ b/substrate/node/cli/src/lib.rs @@ -30,9 +30,9 @@ extern crate hex_literal; #[cfg(test)] extern crate substrate_service_test as service_test; extern crate substrate_transaction_pool as transaction_pool; +#[macro_use] extern crate substrate_network as network; -extern crate node_network; -extern crate sr_primitives as runtime_primitives; +extern crate substrate_consensus_aura as consensus; extern crate node_primitives; #[macro_use] extern crate substrate_service; diff --git a/substrate/node/cli/src/service.rs b/substrate/node/cli/src/service.rs index 4e718816e1..d02ea48767 100644 --- a/substrate/node/cli/src/service.rs +++ b/substrate/node/cli/src/service.rs @@ -22,38 +22,19 @@ use std::sync::Arc; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; use node_primitives::Block; use node_runtime::GenesisConfig; -use node_network::Protocol as NodeProtocol; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, - LightBackend, FullExecutor, LightExecutor + FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, + Roles, TaskExecutor, }; -use network::import_queue::{BasicQueue, BlockOrigin, ImportBlock, Verifier}; -use runtime_primitives::{traits::Block as BlockT}; -use primitives::AuthorityId; use node_executor; +use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue}; -// TODO: Remove me, when we have a functional consensus. -/// A verifier that doesn't actually do any checks -pub struct NoneVerifier; -/// This Verifiyer accepts all data as valid -impl Verifier for NoneVerifier { - fn verify( - &self, - origin: BlockOrigin, - header: B::Header, - justification: Vec, - body: Option> - ) -> Result<(ImportBlock, Option>), String> { - Ok((ImportBlock { - origin, - header, - body, - finalized: true, - external_justification: justification, - internal_justification: vec![], - auxiliary: Vec::new(), - }, None)) - } +const AURA_SLOT_DURATION: u64 = 6; + +construct_simple_protocol! { + /// Demo protocol attachment for substrate. + pub struct NodeProtocol where Block = Block { } } construct_simple_service!(Service); @@ -70,15 +51,48 @@ construct_service_factory! { Genesis = GenesisConfig, Configuration = (), FullService = Service> - { |config, executor| Service::>::new(config, executor) }, + { |config: FactoryFullConfiguration, executor: TaskExecutor| { + let is_auth = config.roles == Roles::AUTHORITY; + Service::>::new(config, executor.clone()).map(move |service|{ + if is_auth { + if let Ok(Some(Ok(key))) = service.keystore().contents() + .map(|keys| keys.get(0).map(|k| service.keystore().load(k, ""))) + { + info!("Using authority key {}", key.public()); + let task = start_aura( + AuraConfig { + local_key: Some(Arc::new(key)), + slot_duration: AURA_SLOT_DURATION, + }, + service.client(), + service.proposer(), + service.network(), + ); + + executor.spawn(task); + } + } + + service + }) + } + }, LightService = Service> { |config, executor| Service::>::new(config, executor) }, - ImportQueue = BasicQueue - { |_, _| Ok(BasicQueue::new(Arc::new(NoneVerifier {}))) } - { |_, _| Ok(BasicQueue::new(Arc::new(NoneVerifier {}))) }, + FullImportQueue = AuraImportQueue> + { |config, client| Ok(import_queue(AuraConfig { + local_key: None, + slot_duration: 5 + }, client)) }, + LightImportQueue = AuraImportQueue> + { |config, client| Ok(import_queue(AuraConfig { + local_key: None, + slot_duration: 5 + }, client)) }, } } + #[cfg(test)] mod tests { #[cfg(feature = "rhd")] diff --git a/substrate/node/consensus/Cargo.toml b/substrate/node/consensus/Cargo.toml deleted file mode 100644 index c45818ee07..0000000000 --- a/substrate/node/consensus/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "node-consensus" -version = "0.1.0" -authors = ["Parity Technologies "] - -[dependencies] -error-chain = "0.12" -exit-future = "0.1" -futures = "0.1.17" -log = "0.4" -node-primitives = { path = "../primitives" } -node-runtime = { path = "../runtime" } -parity-codec = "2.1" -parking_lot = "0.4" -rhododendron = "0.3" -sr-primitives = { path = "../../core/sr-primitives" } -srml-system = { path = "../../srml/system" } -substrate-client = { path = "../../core/client" } -substrate-primitives = { path = "../../core/primitives" } -substrate-transaction-pool = { path = "../../core/transaction-pool" } -tokio = "0.1.7" - -[dev-dependencies] -substrate-keyring = { path = "../../core/keyring" } diff --git a/substrate/node/consensus/README.adoc b/substrate/node/consensus/README.adoc deleted file mode 100644 index ca2daa9eb2..0000000000 --- a/substrate/node/consensus/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ - -= Substrate Consensus - -placeholder -//TODO Write content :) diff --git a/substrate/node/consensus/src/error.rs b/substrate/node/consensus/src/error.rs deleted file mode 100644 index 13192ae202..0000000000 --- a/substrate/node/consensus/src/error.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2018 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 . - -//! Errors that can occur during the consensus process. - -use primitives::AuthorityId; -use client; - -error_chain! { - links { - Client(client::error::Error, client::error::ErrorKind); - Bft(::bft::Error, ::bft::ErrorKind); - } - - errors { - NotValidator(id: AuthorityId) { - description("Local account ID not a validator at this block."), - display("Local account ID ({:?}) not a validator at this block.", id), - } - PrematureDestruction { - description("Proposer destroyed before finishing proposing or evaluating"), - display("Proposer destroyed before finishing proposing or evaluating"), - } - Timer(e: ::tokio::timer::Error) { - description("Failed to register or resolve async timer."), - display("Timer failed: {}", e), - } - Executor(e: ::futures::future::ExecuteErrorKind) { - description("Unable to dispatch agreement future"), - display("Unable to dispatch agreement future: {:?}", e), - } - } -} - -impl From<::bft::InputStreamConcluded> for Error { - fn from(err: ::bft::InputStreamConcluded) -> Self { - ::bft::Error::from(err).into() - } -} diff --git a/substrate/node/consensus/src/lib.rs b/substrate/node/consensus/src/lib.rs deleted file mode 100644 index 2b100c10a8..0000000000 --- a/substrate/node/consensus/src/lib.rs +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright 2018 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 . - -//! This service uses BFT consensus provided by the substrate. - -#![cfg(feature="rhd")] - -extern crate node_runtime; -extern crate node_primitives; - -extern crate parity_codec as codec; -extern crate sr_primitives as runtime_primitives; -extern crate srml_system; -extern crate substrate_bft as bft; -extern crate substrate_client as client; -extern crate substrate_primitives as primitives; -extern crate substrate_transaction_pool as transaction_pool; - -extern crate exit_future; -extern crate futures; -extern crate parking_lot; -extern crate rhododendron; -extern crate tokio; - -#[macro_use] -extern crate error_chain; - -#[macro_use] -extern crate log; - -#[cfg(test)] -extern crate substrate_keyring; - -use std::sync::Arc; -use std::time::{self, Duration, Instant}; - -use client::{Client as SubstrateClient, CallExecutor}; -use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, Miscellaneous, OldTxQueue}; -use codec::{Decode, Encode}; -use node_primitives::{AccountId, Timestamp, SessionKey}; -use node_runtime::{Runtime, InherentError, TimestampInherentError, InherentData}; -use primitives::{AuthorityId, ed25519, Blake2Hasher}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, As, BlockNumberToHash}; -use runtime_primitives::generic::{BlockId, Era}; -use srml_system::Trait as SystemT; -use transaction_pool::txpool::{self, Pool as TransactionPool}; -use tokio::runtime::TaskExecutor; -use tokio::timer::Delay; - -use futures::prelude::*; -use futures::future; -use parking_lot::RwLock; - -pub use self::error::{ErrorKind, Error, Result}; -pub use self::offline_tracker::OfflineTracker; -pub use service::Service; - -mod evaluation; -mod error; -mod service; - -/// Shared offline validator tracker. -pub type SharedOfflineTracker = Arc>; - -// block size limit. -const MAX_TRANSACTIONS_SIZE: usize = 4 * 1024 * 1024; - -/// Build new blocks. -pub trait BlockBuilder { - /// Push an extrinsic onto the block. Fails if the extrinsic is invalid. - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<()>; -} - -/// Local client abstraction for the consensus. -pub trait AuthoringApi: - Send - + Sync - + BlockBuilderAPI<::Block, Error=::Error> - + Core<::Block, AuthorityId, Error=::Error> - + Miscellaneous<::Block, Error=::Error> - + OldTxQueue<::Block, Error=::Error> -{ - /// The block used for this API type. - type Block: BlockT; - /// The error used by this API type. - type Error: std::error::Error; - - /// Build a block on top of the given, with inherent extrinsics pre-pushed. - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - build_ctx: F, - ) -> Result; -} - -impl<'a, B, E, Block> BlockBuilder for client::block_builder::BlockBuilder<'a, B, E, Block, Blake2Hasher> where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT -{ - fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<()> { - client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) - } -} - -impl<'a, B, E, Block> AuthoringApi for SubstrateClient where - B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + Clone + 'static, - Block: BlockT, -{ - type Block = Block; - type Error = client::error::Error; - - fn build_block) -> ()>( - &self, - at: &BlockId, - inherent_data: InherentData, - mut build_ctx: F, - ) -> Result { - let runtime_version = self.runtime_version_at(at)?; - - let mut block_builder = self.new_block_at(at)?; - if runtime_version.has_api(*b"inherent", 1) { - self.inherent_extrinsics(at, &inherent_data)? - .into_iter().try_for_each(|i| block_builder.push(i))?; - } - - build_ctx(&mut block_builder); - - block_builder.bake().map_err(Into::into) - } -} - -/// A long-lived network which can create BFT message routing processes on demand. -pub trait Network { - /// The block used for this API type. - type Block: BlockT; - /// The input stream of BFT messages. Should never logically conclude. - type Input: Stream,Error=Error>; - /// The output sink of BFT messages. Messages sent here should eventually pass to all - /// current authorities. - type Output: Sink,SinkError=Error>; - - /// Instantiate input and output streams. - fn communication_for( - &self, - validators: &[SessionKey], - local_id: SessionKey, - parent_hash: ::Hash, - task_executor: TaskExecutor - ) -> (Self::Input, Self::Output); -} - -/// Proposer factory. -pub struct ProposerFactory where - C: AuthoringApi, - A: txpool::ChainApi, -{ - /// The client instance. - pub client: Arc, - /// The transaction pool. - pub transaction_pool: Arc>, - /// The backing network handle. - pub network: N, - /// handle to remote task executor - pub handle: TaskExecutor, - /// Offline-tracker. - pub offline: SharedOfflineTracker, - /// Force delay in evaluation this long. - pub force_delay: Timestamp, -} - -impl bft::Environment<::Block> for ProposerFactory where - N: Network::Block>, - C: AuthoringApi + BlockNumberToHash, - A: txpool::ChainApi::Block>, - <::Block as BlockT>::Hash: - Into<::Hash> + PartialEq + Into, - Error: From<::Error> -{ - type Proposer = Proposer; - type Input = N::Input; - type Output = N::Output; - type Error = Error; - - fn init( - &self, - parent_header: &<::Block as BlockT>::Header, - authorities: &[AuthorityId], - sign_with: Arc, - ) -> Result<(Self::Proposer, Self::Input, Self::Output)> { - use runtime_primitives::traits::Hash as HashT; - let parent_hash = parent_header.hash(); - - let id = BlockId::hash(parent_hash); - let random_seed = self.client.random_seed(&id)?; - let random_seed = <<::Block as BlockT>::Header as HeaderT>::Hashing::hash(random_seed.as_ref()); - - let validators = self.client.validators(&id)?; - self.offline.write().note_new_block(&validators[..]); - - info!("Starting consensus session on top of parent {:?}", parent_hash); - - let local_id = sign_with.public().0.into(); - let (input, output) = self.network.communication_for( - authorities, - local_id, - parent_hash.clone(), - self.handle.clone(), - ); - let now = Instant::now(); - let proposer = Proposer { - client: self.client.clone(), - start: now, - local_key: sign_with, - next_index: None, - parent_hash, - parent_id: id, - parent_number: *parent_header.number(), - random_seed, - transaction_pool: self.transaction_pool.clone(), - offline: self.offline.clone(), - validators, - minimum_timestamp: current_timestamp() + self.force_delay, - }; - - Ok((proposer, input, output)) - } -} - -/// The proposer logic. -pub struct Proposer { - client: Arc, - start: Instant, - local_key: Arc, - next_index: Option, - parent_hash: <::Block as BlockT>::Hash, - parent_id: BlockId<::Block>, - parent_number: <<::Block as BlockT>::Header as HeaderT>::Number, - random_seed: <::Block as BlockT>::Hash, - transaction_pool: Arc>, - offline: SharedOfflineTracker, - validators: Vec, - minimum_timestamp: u64, -} - -impl Proposer { - fn primary_index(&self, round_number: usize, len: usize) -> usize { - use primitives::uint::U256; - - let big_len = U256::from(len); - let offset = U256::from_big_endian(self.random_seed.as_ref()) % big_len; - let offset = offset.low_u64() as usize + round_number; - offset % len - } -} - -impl bft::Proposer<::Block> for Proposer where - C: AuthoringApi + BlockNumberToHash, - A: txpool::ChainApi::Block>, - <::Block as BlockT>::Hash: - Into<::Hash> + PartialEq + Into, - error::Error: From<::Error> -{ - type Create = Result<::Block>; - type Error = Error; - type Evaluate = Box>; - - fn propose(&self) -> Result<::Block> { - use runtime_primitives::traits::BlakeTwo256; - - const MAX_VOTE_OFFLINE_SECONDS: Duration = Duration::from_secs(60); - - // TODO: handle case when current timestamp behind that in state. - let timestamp = ::std::cmp::max(self.minimum_timestamp, current_timestamp()); - - let elapsed_since_start = self.start.elapsed(); - let offline_indices = if elapsed_since_start > MAX_VOTE_OFFLINE_SECONDS { - Vec::new() - } else { - self.offline.read().reports(&self.validators[..]) - }; - - if !offline_indices.is_empty() { - info!( - "Submitting offline validators {:?} for slash-vote", - offline_indices.iter().map(|&i| self.validators[i as usize]).collect::>(), - ) - } - - let inherent_data = InherentData { - timestamp, - offline_indices, - }; - - let block = self.client.build_block( - &self.parent_id, - inherent_data, - |block_builder| { - let mut unqueue_invalid = Vec::new(); - self.transaction_pool.ready(|pending_iterator| { - let mut pending_size = 0; - for pending in pending_iterator { - // TODO [ToDr] Probably get rid of it, and validate in runtime. - let encoded_size = pending.data.encode().len(); - if pending_size + encoded_size >= MAX_TRANSACTIONS_SIZE { break } - - match block_builder.push_extrinsic(pending.data.clone()) { - Ok(()) => { - pending_size += encoded_size; - } - Err(e) => { - trace!(target: "transaction-pool", "Invalid transaction: {}", e); - unqueue_invalid.push(pending.hash.clone()); - } - } - } - }); - - self.transaction_pool.remove_invalid(&unqueue_invalid); - })?; - - info!("Proposing block [number: {}; hash: {}; parent_hash: {}; extrinsics: [{}]]", - block.header().number(), - <::Block as BlockT>::Hash::from(block.header().hash()), - block.header().parent_hash(), - block.extrinsics().iter() - .map(|xt| format!("{}", BlakeTwo256::hash_of(xt))) - .collect::>() - .join(", ") - ); - - let substrate_block = Decode::decode(&mut block.encode().as_slice()) - .expect("blocks are defined to serialize to substrate blocks correctly; qed"); - - assert!(evaluation::evaluate_initial( - &substrate_block, - &self.parent_hash, - self.parent_number, - ).is_ok()); - - Ok(substrate_block) - } - - fn evaluate(&self, unchecked_proposal: &::Block) -> Self::Evaluate { - debug!(target: "bft", "evaluating block on top of parent ({}, {:?})", self.parent_number, self.parent_hash); - - // do initial serialization and structural integrity checks. - match evaluation::evaluate_initial( - unchecked_proposal, - &self.parent_hash, - self.parent_number, - ) { - Ok(p) => p, - Err(e) => { - // TODO: these errors are easily re-checked in runtime. - debug!(target: "bft", "Invalid proposal (initial evaluation failed): {:?}", e); - return Box::new(future::ok(false)); - } - }; - - let current_timestamp = current_timestamp(); - let inherent = InherentData::new( - current_timestamp, - self.offline.read().reports(&self.validators) - ); - let proposed_timestamp = match self.client.check_inherents( - &self.parent_id, - &unchecked_proposal, - &inherent - ) { - Ok(Ok(())) => None, - Ok(Err(InherentError::Timestamp(TimestampInherentError::TimestampInFuture(timestamp)))) => Some(timestamp), - Ok(Err(e)) => { - debug!(target: "bft", "Invalid proposal (check_inherents): {:?}", e); - return Box::new(future::ok(false)); - }, - Err(e) => { - debug!(target: "bft", "Could not call into runtime: {:?}", e); - return Box::new(future::ok(false)); - } - }; - - let vote_delays = { - // the duration until the given timestamp is current - let proposed_timestamp = ::std::cmp::max(self.minimum_timestamp, proposed_timestamp.unwrap_or(0)); - let timestamp_delay = if proposed_timestamp > current_timestamp { - let delay_s = proposed_timestamp - current_timestamp; - debug!(target: "bft", "Delaying evaluation of proposal for {} seconds", delay_s); - Some(Instant::now() + Duration::from_secs(delay_s)) - } else { - None - }; - - match timestamp_delay { - Some(duration) => future::Either::A( - Delay::new(duration).map_err(|e| ErrorKind::Timer(e).into()) - ), - None => future::Either::B(future::ok(())), - } - }; - - // evaluate whether the block is actually valid. - // TODO: is it better to delay this until the delays are finished? - let evaluated = match self.client.execute_block(&self.parent_id, &unchecked_proposal.clone()).map_err(Error::from) { - Ok(()) => Ok(true), - Err(err) => match err.kind() { - error::ErrorKind::Client(client::error::ErrorKind::Execution(_)) => Ok(false), - _ => Err(err) - } - }; - - let future = future::result(evaluated).and_then(move |good| { - let end_result = future::ok(good); - if good { - // delay a "good" vote. - future::Either::A(vote_delays.and_then(|_| end_result)) - } else { - // don't delay a "bad" evaluation. - future::Either::B(end_result) - } - }); - - Box::new(future) as Box<_> - } - - fn round_proposer(&self, round_number: usize, authorities: &[AuthorityId]) -> AuthorityId { - let offset = self.primary_index(round_number, authorities.len()); - let proposer = authorities[offset].clone(); - trace!(target: "bft", "proposer for round {} is {}", round_number, proposer); - - proposer - } - - fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior<<::Block as BlockT>::Hash>)>) { - use rhododendron::Misbehavior as GenericMisbehavior; - use runtime_primitives::bft::{MisbehaviorKind, MisbehaviorReport}; - use node_runtime::{Call, UncheckedExtrinsic, ConsensusCall}; - - let mut next_index = { - let cur_index: Result = self.client - .account_nonce(&self.parent_id, &self.local_key.public().0) - .map_err(Error::from); - - let cur_index = match cur_index { - Ok(cur_index) => cur_index + 1, - Err(e) => { - warn!(target: "consensus", "Error computing next transaction index: {:?}", e); - return; - } - }; - - let index = match self.next_index { - // make sure there were no other transactions in the meantime - Some(idx) if idx > cur_index => idx, - _ => cur_index, - }; - - index - }; - - for (target, misbehavior) in misbehavior { - let report = MisbehaviorReport { - parent_hash: self.parent_hash.into(), - parent_number: self.parent_number.as_(), - target, - misbehavior: match misbehavior { - GenericMisbehavior::ProposeOutOfTurn(_, _, _) => continue, - GenericMisbehavior::DoublePropose(_, _, _) => continue, - GenericMisbehavior::DoublePrepare(round, (h1, s1), (h2, s2)) - => MisbehaviorKind::BftDoublePrepare(round as u32, (h1.into(), s1.signature), (h2.into(), s2.signature)), - GenericMisbehavior::DoubleCommit(round, (h1, s1), (h2, s2)) - => MisbehaviorKind::BftDoubleCommit(round as u32, (h1.into(), s1.signature), (h2.into(), s2.signature)), - } - }; - let payload = (next_index, Call::Consensus(ConsensusCall::report_misbehavior(report)), Era::immortal(), self.client.genesis_hash()); - let signature = self.local_key.sign(&payload.encode()).into(); - next_index += 1; - self.next_index = Some(next_index); - - let local_id = self.local_key.public().0.into(); - let extrinsic = UncheckedExtrinsic { - signature: Some((node_runtime::RawAddress::Id(local_id), signature, payload.0, Era::immortal())), - function: payload.1, - }; - let uxt: <::Block as BlockT>::Extrinsic = Decode::decode(&mut extrinsic.encode().as_slice()).expect("Encoded extrinsic is valid"); - let hash = BlockId::<::Block>::hash(self.parent_hash); - if let Err(e) = self.transaction_pool.submit_one(&hash, uxt) { - warn!("Error importing misbehavior report: {:?}", e); - } - } - } - - fn on_round_end(&self, round_number: usize, was_proposed: bool) { - let primary_validator = self.validators[ - self.primary_index(round_number, self.validators.len()) - ]; - - - // alter the message based on whether we think the empty proposer was forced to skip the round. - // this is determined by checking if our local validator would have been forced to skip the round. - if !was_proposed { - let public = ed25519::Public::from_raw(primary_validator.0); - info!( - "Potential Offline Validator: {} failed to propose during assigned slot: {}", - public, - round_number, - ); - } - - self.offline.write().note_round_end(primary_validator, was_proposed); - } -} - -fn current_timestamp() -> Timestamp { - time::SystemTime::now().duration_since(time::UNIX_EPOCH) - .expect("now always later than unix epoch; qed") - .as_secs() -} diff --git a/substrate/node/executor/src/lib.rs b/substrate/node/executor/src/lib.rs index 6a2b8061c3..bdd8b10235 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -254,6 +254,7 @@ mod tests { timestamp: Some(Default::default()), treasury: Some(Default::default()), contract: Some(Default::default()), + upgrade_key: Some(Default::default()), }.build_storage().unwrap()) } @@ -291,9 +292,9 @@ mod tests { 1, GENESIS_HASH.into(), if support_changes_trie { - hex!("ffa85ed1832eae3e25e684d4f993ff0b5e8b6ac4d7ba0f40a5fb0114fda22f3d").into() + hex!("978a3ff733a86638da39d36a349c693b5cf562bcc8db30fec6c2b6c40f925a9b").into() } else { - hex!("98971908b8923d07944cdf7ee658c203d17042ef447169adbdfec8160cfabcad").into() + hex!("7bbad534e3de3db3c8cda015c4e8ed8ba10dde7e3fca21f4fd4fbc686e6c1410").into() }, if support_changes_trie { Some(hex!("1f8f44dcae8982350c14dee720d34b147e73279f5a2ce1f9781195a991970978").into()) @@ -317,7 +318,7 @@ mod tests { construct_block( 2, block1(false).1, - hex!("788a2e8b23e4b30e1bce347ca6415fd0080e989d40741c86995b9ad539bb76b3").into(), + hex!("7be30152ee2ee909047cffad5f0a28bf8c2b0a97c124b500aeac112f6917738e").into(), None, vec![ CheckedExtrinsic { @@ -340,7 +341,7 @@ mod tests { construct_block( 1, GENESIS_HASH.into(), - hex!("acc03af5b3972deaf9dde4dfd99c5614a5360454313681b6fc299d1644ae8a59").into(), + hex!("325a73726dc640af41becb42938e7152e218f130219c0695aae35b6a156f93f3").into(), None, vec![ CheckedExtrinsic { @@ -622,7 +623,7 @@ mod tests { let b = construct_block( 1, GENESIS_HASH.into(), - hex!("21fb6fb965f012ae3c6e521b71b5b57d6df17c738c52f202ec2809ca235eb082").into(), + hex!("d68586d5098535e04ff7a12d71a9c9dc719960f318862e636e78a8e98cf4b8d4").into(), None, vec![ CheckedExtrinsic { diff --git a/substrate/node/network/Cargo.toml b/substrate/node/network/Cargo.toml deleted file mode 100644 index 44fbdb5aba..0000000000 --- a/substrate/node/network/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "node-network" -version = "0.1.0" -authors = ["Parity Technologies "] -description = "Substrate node networking protocol" - -[dependencies] -node-consensus = { path = "../consensus" } -node-primitives = { path = "../primitives" } -substrate-consensus-rhd = { path = "../../core/consensus/rhd" } -substrate-network = { path = "../../core/network" } -substrate-primitives = { path = "../../core/primitives" } -futures = "0.1" -tokio = "0.1.7" -log = "0.4" -rhododendron = "0.3" diff --git a/substrate/node/network/src/consensus.rs b/substrate/node/network/src/consensus.rs deleted file mode 100644 index 44d338d330..0000000000 --- a/substrate/node/network/src/consensus.rs +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2018 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 . - -//! The "consensus" networking code built on top of the base network service. -//! This fulfills the `node_consensus::Network` trait, providing a hook to be called -//! each time consensus begins on a new chain head. - -use bft; -use substrate_primitives::ed25519; -use substrate_network::{self as net, generic_message as msg}; -use substrate_network::consensus_gossip::ConsensusMessage; -use node_consensus::{AuthoringApi, Network}; -use node_primitives::{Block, Hash, SessionKey}; -use rhododendron; - -use futures::prelude::*; -use futures::sync::mpsc; - -use std::sync::Arc; - -use tokio::runtime::TaskExecutor; -use tokio::executor::Executor; - -use super::NetworkService; - -/// Sink for output BFT messages. -pub struct BftSink { - network: Arc, - parent_hash: Hash, - _marker: ::std::marker::PhantomData, -} - -impl Sink for BftSink { - type SinkItem = bft::Communication; - // TODO: replace this with the ! type when that's stabilized - type SinkError = E; - - fn start_send(&mut self, message: bft::Communication) - -> ::futures::StartSend, E> - { - let network_message = net::LocalizedBftMessage { - message: match message { - rhododendron::Communication::Consensus(c) => msg::BftMessage::Consensus(match c { - rhododendron::LocalizedMessage::Propose(proposal) => msg::SignedConsensusMessage::Propose(msg::SignedConsensusProposal { - round_number: proposal.round_number as u32, - proposal: proposal.proposal, - digest: proposal.digest, - sender: proposal.sender, - digest_signature: proposal.digest_signature.signature, - full_signature: proposal.full_signature.signature, - }), - rhododendron::LocalizedMessage::Vote(vote) => msg::SignedConsensusMessage::Vote(msg::SignedConsensusVote { - sender: vote.sender, - signature: vote.signature.signature, - vote: match vote.vote { - rhododendron::Vote::Prepare(r, h) => msg::ConsensusVote::Prepare(r as u32, h), - rhododendron::Vote::Commit(r, h) => msg::ConsensusVote::Commit(r as u32, h), - rhododendron::Vote::AdvanceRound(r) => msg::ConsensusVote::AdvanceRound(r as u32), - } - }), - }), - rhododendron::Communication::Auxiliary(justification) => { - let unchecked: bft::UncheckedJustification<_> = justification.uncheck().into(); - msg::BftMessage::Auxiliary(unchecked.into()) - } - }, - parent_hash: self.parent_hash, - }; - self.network.with_spec( - move |spec, ctx| spec.consensus_gossip.multicast_bft_message(ctx, network_message) - ); - Ok(::futures::AsyncSink::Ready) - } - - fn poll_complete(&mut self) -> ::futures::Poll<(), E> { - Ok(Async::Ready(())) - } -} - -// check signature and authority validity of message. -fn process_bft_message( - msg: msg::LocalizedBftMessage, - local_id: &SessionKey, - authorities: &[SessionKey] - ) -> Result>, bft::Error> -{ - Ok(Some(match msg.message { - msg::BftMessage::Consensus(c) => rhododendron::Communication::Consensus(match c { - msg::SignedConsensusMessage::Propose(proposal) => rhododendron::LocalizedMessage::Propose({ - if &proposal.sender == local_id { return Ok(None) } - let proposal = rhododendron::LocalizedProposal { - round_number: proposal.round_number as usize, - proposal: proposal.proposal, - digest: proposal.digest, - sender: proposal.sender, - digest_signature: ed25519::LocalizedSignature { - signature: proposal.digest_signature, - signer: ed25519::Public(proposal.sender.into()), - }, - full_signature: ed25519::LocalizedSignature { - signature: proposal.full_signature, - signer: ed25519::Public(proposal.sender.into()), - } - }; - bft::check_proposal(authorities, &msg.parent_hash, &proposal)?; - - trace!(target: "bft", "importing proposal message for round {} from {}", proposal.round_number, Hash::from(proposal.sender.0)); - proposal - }), - msg::SignedConsensusMessage::Vote(vote) => rhododendron::LocalizedMessage::Vote({ - if &vote.sender == local_id { return Ok(None) } - let vote = rhododendron::LocalizedVote { - sender: vote.sender, - signature: ed25519::LocalizedSignature { - signature: vote.signature, - signer: ed25519::Public(vote.sender.0), - }, - vote: match vote.vote { - msg::ConsensusVote::Prepare(r, h) => rhododendron::Vote::Prepare(r as usize, h), - msg::ConsensusVote::Commit(r, h) => rhododendron::Vote::Commit(r as usize, h), - msg::ConsensusVote::AdvanceRound(r) => rhododendron::Vote::AdvanceRound(r as usize), - } - }; - bft::check_vote::(authorities, &msg.parent_hash, &vote)?; - - trace!(target: "bft", "importing vote {:?} from {}", vote.vote, Hash::from(vote.sender.0)); - vote - }), - }), - msg::BftMessage::Auxiliary(a) => { - let justification = bft::UncheckedJustification::from(a); - // TODO: get proper error - let justification: Result<_, bft::Error> = bft::check_prepare_justification::(authorities, msg.parent_hash, justification) - .map_err(|_| bft::ErrorKind::InvalidJustification.into()); - rhododendron::Communication::Auxiliary(justification?) - }, - })) -} - -// task that processes all gossipped consensus messages, -// checking signatures -struct MessageProcessTask { - inner_stream: mpsc::UnboundedReceiver>, - bft_messages: mpsc::UnboundedSender>, - validators: Vec, - local_id: SessionKey, -} - -impl MessageProcessTask { - fn process_message(&self, msg: ConsensusMessage) -> Option> { - match msg { - ConsensusMessage::Bft(msg) => { - match process_bft_message(msg, &self.local_id, &self.validators[..]) { - Ok(Some(msg)) => { - if let Err(_) = self.bft_messages.unbounded_send(msg) { - // if the BFT receiving stream has ended then - // we should just bail. - trace!(target: "bft", "BFT message stream appears to have closed"); - return Some(Async::Ready(())); - } - } - Ok(None) => {} // ignored local message - Err(e) => { - debug!("Message validation failed: {:?}", e); - } - } - } - ConsensusMessage::ChainSpecific(_, _) => { - panic!("ChainSpecific messages are not allowed by the top level message handler"); - } - } - - None - } -} - -impl Future for MessageProcessTask { - type Item = (); - type Error = (); - - fn poll(&mut self) -> Poll<(), ()> { - loop { - match self.inner_stream.poll() { - Ok(Async::Ready(Some(val))) => if let Some(async) = self.process_message(val) { - return Ok(async); - }, - Ok(Async::Ready(None)) => return Ok(Async::Ready(())), - Ok(Async::NotReady) => return Ok(Async::NotReady), - Err(e) => { - debug!(target: "node-network", "Error getting consensus message: {:?}", e); - return Err(e); - }, - } - } - } -} - -/// Input stream from the consensus network. -pub struct InputAdapter { - input: mpsc::UnboundedReceiver>, -} - -impl Stream for InputAdapter { - type Item = bft::Communication; - type Error = ::node_consensus::Error; - - fn poll(&mut self) -> Poll, Self::Error> { - match self.input.poll() { - Err(_) | Ok(Async::Ready(None)) => Err(bft::InputStreamConcluded.into()), - Ok(x) => Ok(x) - } - } -} - -/// Wrapper around the network service -pub struct ConsensusNetwork

{ - network: Arc, - api: Arc

, -} - -impl

ConsensusNetwork

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

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

Clone for ConsensusNetwork

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

{ - /// The input stream of BFT messages. Should never logically conclude. - type Input = InputAdapter; - /// The output sink of BFT messages. Messages sent here should eventually pass to all - /// current validators. - type Output = BftSink<::node_consensus::Error>; - type Block = Block; - - /// Get input and output streams of BFT messages. - fn communication_for( - &self, validators: &[SessionKey], - local_id: SessionKey, - parent_hash: Hash, - mut task_executor: TaskExecutor - ) -> (Self::Input, Self::Output) - { - let sink = BftSink { - network: self.network.clone(), - parent_hash, - _marker: Default::default(), - }; - - let (bft_send, bft_recv) = mpsc::unbounded(); - - // spin up a task in the background that processes all incoming statements - // TODO: propagate statements on a timer? - let process_task = self.network.with_spec(|spec, _ctx| { - spec.consensus_gossip.new_session(parent_hash); - MessageProcessTask { - inner_stream: spec.consensus_gossip.messages_for(parent_hash), - bft_messages: bft_send, - validators: validators.to_vec(), - local_id, - } - }); - - if let Err(e) = Executor::spawn(&mut task_executor, Box::new(process_task)) { - debug!(target: "node-network", "Cannot spawn message processing: {:?}", e) - } - - (InputAdapter { input: bft_recv }, sink) - } -} diff --git a/substrate/node/network/src/lib.rs b/substrate/node/network/src/lib.rs deleted file mode 100644 index 9e2f96d5f7..0000000000 --- a/substrate/node/network/src/lib.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 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 . - -//! Substrate-specific network implementation. -//! -//! This manages gossip of consensus messages for BFT. - -#![warn(unused_extern_crates)] - -#[macro_use] -extern crate substrate_network; -extern crate node_primitives; - -use node_primitives::{Block, Hash}; -use substrate_network::consensus_gossip::ConsensusGossip; - -/// Specialization of the network service for the node protocol. -pub type NetworkService = ::substrate_network::Service; - -construct_simple_protocol! { - /// Demo protocol attachment for substrate. - pub struct Protocol where Block = Block { - consensus_gossip: ConsensusGossip, - } -} diff --git a/substrate/node/runtime/Cargo.toml b/substrate/node/runtime/Cargo.toml index ac37cff456..8add782018 100644 --- a/substrate/node/runtime/Cargo.toml +++ b/substrate/node/runtime/Cargo.toml @@ -29,6 +29,7 @@ srml-staking = { path = "../../srml/staking" } srml-system = { path = "../../srml/system" } srml-timestamp = { path = "../../srml/timestamp" } srml-treasury = { path = "../../srml/treasury" } +srml-upgrade-key = { path = "../../srml/upgrade-key" } sr-version = { path = "../../core/sr-version" } node-primitives = { path = "../primitives" } @@ -53,6 +54,7 @@ std = [ "srml-system/std", "srml-timestamp/std", "srml-treasury/std", + "srml-upgrade-key/std", "sr-version/std", "node-primitives/std", "serde_derive", diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 1f4a44bb29..998bb6640b 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -52,6 +52,7 @@ extern crate srml_staking as staking; extern crate srml_system as system; extern crate srml_timestamp as timestamp; extern crate srml_treasury as treasury; +extern crate srml_upgrade_key as upgrade_key; #[macro_use] extern crate sr_version as version; extern crate node_primitives; @@ -62,12 +63,12 @@ use node_primitives::{ AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature }; -use runtime_api::runtime::*; +use runtime_api::{runtime::*, id::*}; use runtime_primitives::ApplyResult; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::generic; use runtime_primitives::traits::{Convert, BlakeTwo256, Block as BlockT}; -use version::{RuntimeVersion, ApiId}; +use version::RuntimeVersion; use council::{motions as council_motions, voting as council_voting}; #[cfg(feature = "std")] use council::seats as council_seats; @@ -86,9 +87,6 @@ pub use srml_support::{StorageValue, RuntimeMetadata}; const TIMESTAMP_SET_POSITION: u32 = 0; const NOTE_OFFLINE_POSITION: u32 = 1; -const INHERENT: ApiId = *b"inherent"; -const VALIDATX: ApiId = *b"validatx"; - /// Runtime version. pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: ver_str!("node"), @@ -96,7 +94,11 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { authoring_version: 1, spec_version: 1, impl_version: 0, - apis: apis_vec!([(INHERENT, 1), (VALIDATX, 1)]), + apis: apis_vec!([ + (BLOCK_BUILDER, 1), + (TAGGED_TRANSACTION_QUEUE, 1), + (METADATA, 1) + ]), }; /// Native version. @@ -191,15 +193,19 @@ impl contract::Trait for Runtime { type Event = Event; } +impl upgrade_key::Trait for Runtime { + type Event = Event; +} + construct_runtime!( pub enum Runtime with Log(InternalLog: DigestItem) where Block = Block, UncheckedExtrinsic = UncheckedExtrinsic { System: system::{default, Log(ChangesTrieRoot)}, + Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Consensus: consensus::{Module, Call, Storage, Config, Log(AuthoritiesChange), Inherent}, Balances: balances, - Timestamp: timestamp::{Module, Call, Storage, Config, Inherent}, Session: session, Staking: staking, Democracy: democracy, @@ -209,6 +215,7 @@ construct_runtime!( CouncilSeats: council_seats::{Config}, Treasury: treasury, Contract: contract::{Module, Call, Config, Event}, + UpgradeKey: upgrade_key, } ); @@ -278,33 +285,9 @@ impl_apis! { } } - impl OldTxQueue for Runtime { - fn account_nonce(account: AccountId) -> Index { - System::account_nonce(&account) - } - - fn lookup_address(address: Address) -> Option { - Balances::lookup_address(address) - } - } - impl TaggedTransactionQueue for Runtime { fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity { Executive::validate_transaction(tx) } } - - impl Miscellaneous for Runtime { - fn validator_count() -> u32 { - Session::validator_count() - } - - fn validators() -> Vec { - Session::validators() - } - - fn timestamp() -> u64 { - Timestamp::get() - } - } } diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index fc45e6f94c..0aa58928c2 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -285,6 +285,7 @@ dependencies = [ "srml-system 0.1.0", "srml-timestamp 0.1.0", "srml-treasury 0.1.0", + "srml-upgrade-key 0.1.0", "substrate-primitives 0.1.0", ] @@ -817,6 +818,24 @@ dependencies = [ "substrate-primitives 0.1.0", ] +[[package]] +name = "srml-upgrade-key" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "srml-consensus 0.1.0", + "srml-support 0.1.0", + "srml-system 0.1.0", + "substrate-primitives 0.1.0", +] + [[package]] name = "stable_deref_trait" version = "1.1.1" diff --git a/substrate/node/runtime/wasm/Cargo.toml b/substrate/node/runtime/wasm/Cargo.toml index 7fb33ff26b..7df582a8f0 100644 --- a/substrate/node/runtime/wasm/Cargo.toml +++ b/substrate/node/runtime/wasm/Cargo.toml @@ -28,6 +28,7 @@ srml-staking = { path = "../../../srml/staking", default-features = false } srml-system = { path = "../../../srml/system", default-features = false } srml-timestamp = { path = "../../../srml/timestamp", default-features = false } srml-treasury = { path = "../../../srml/treasury", default-features = false } +srml-upgrade-key = { path = "../../../srml/upgrade-key", default-features = false } sr-version = { path = "../../../core/sr-version", default-features = false } node-primitives = { path = "../../primitives", default-features = false } @@ -53,6 +54,7 @@ std = [ "srml-system/std", "srml-timestamp/std", "srml-treasury/std", + "srml-upgrade-key/std", "sr-version/std", "node-primitives/std", ] diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 3ffbf0d1b1afbc7e6ddf799faccd87cf2e2f81cb..2a48d20c98d216742495a038849834566e6ccc45 100644 GIT binary patch literal 624959 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�W=9YT-*ADeN*mT#dvG}Ne(q-nSQVM`XcX7U zJ@+;tNEfZF8>|BKpFyB}k*UhN8PX`bB(DB3k z;I2PJbwz!cPwBn90aQv{99g-WNBpi@KI9tx<{_C&1T9AkUuS*tK)=rVgvNIea5(|X z&aPc$5|^$ziJF*~p2XGqAQ9(FX(GvR^b!;4S8+h<3-lfR_=G)TlL6 z?2<4~r|~El$3c)HQ1Nh!iickXDjw1(gjZ;^2Lcrj8^I1NpyDB+;vtQIcZG^VTl!(7 zO{iG!OQ_pC_k}G~J~27C6tXZFp29pS`ghGq8_enET9`a63)c_uVSJD%tW; z8Pvi9X)W+gOlN%K@*bddDWp}iz5Sn9BXc0fmV8J^amigJStcey9!rO_BJ8jFLJonQ zYNl`#s5aKgw3^a85j#m0XKJ-Ub$^7q>xj|kQ|T~@qrorn^F7qJ^$WGJxO))ZBXUJN?fA*VOsJc(LK+(EHBwnWt zj4>xVVTIl6?bsIXr_^J*N|X$Hhcx?>yWa-Qaix4eDNYDig)|hxYCF-r*q2^`L?|x& zCYQcfC$f7Vgg~xwdfE34onwhLbtfYN?152Ui%N3xO3U2~8_c>YqBj zJ&u90=Zm{jo!(}WvtKSWq)+)zeW(>_F>}gAxlx?Gv}|gJWyt}jcjQAyd5fSp9wAJn ziRuxT^T;P2(P1q|>k*f2h?BHRdR_x_jb_Ga$>@3!LP~xFlnIANMal(h#ZDfoX^G6C z-hkk*z(F>+s0JXQW0#B2t$j8VHR+oGKu${GJIyh@Lfifo(EDxWovOhcxvNlkt_}qwC+AXPx@&(gIEKVuZUhGGqBbOYq4@NXtZXUi)Avd@(wLNf* zbfONTZt$RTP)Tf};fO$l3W@(UcM6ZfKPUIY6we01QEFCG<+BwWG?8Z(JxJuXB;5%| zx%>zCzDU}SoY8bKRnp`=SYV(5uQqEmfF>k3rV;yHR!X-I9*t23ctWGp7z`ozCC&Qw zNymYWg5#5Y@)RmFCURWdp0~dU3D7hM*xl4ZiMCyR-1eFHZK=_0rLasvp6E|3yo)s20!>|Ju{6D3yQ5ya*!IAxMtETdKLy#MJpXs}%PZ zZ!Sp%OfP#)g-{2Ep6D;JG@*#w4^*sscW*o; zQtHJgZ3qAw1)OEagNaDXGkk)BFMlFv=@X7bQD@FAY4wC?whK8d3JuOE$7+avf8!wM zpH#?^iuCSsM&%d+^@Jk;Q8(fcKstdpgs5Ec%?x5V%RJKey zfXXb|5Ov)$Lke-1%4oA(jtxQ2;gM<&oU@d^@E~q z)DqjfQ0Pv@33P3h?o^yYr!q>YUX#^&puc2XsH&ZKK0V=kon*ty!9_#g zVad%)pQ;1IBw6~D%|vFyXIaDqU2{4osUK&d;W)(U2wJ&U~~gsS2Uj%95t0eSex$uF>6@loI4$v0}o7#KL0QQ5Y zzRh0LY+9G1kG-Zd!z!geigfABFe#f!M)2{Z{GzLGqDZY5OIpiWFDg3`X~~}9wDik7 ztOD|x4_Pj0!W$T7Y2u*fF@t4emVxtm!z&JCW+~o~WsXhLx?`a+-bBI|0?P1~0=q+) z_woL0Re2J);f$5O8er5lW!gckO722UP=qCrq*H5)ozgCfPN(+##dPY+Ri{&ztE+a( z0w4oUQw8I1@WwZXSh$lSJhdRuPT@eOCLq<~a;Uz>s(@OH^Lhf43uw++oIv(@(&K2G zwIIf(jja}~B(@M--a-%xO?!Y!2#lYFR=n@Tv!=bCW%JLgF4|Htxp!1KGxZPBR6U&< z+hTHlTGyHc()DmD^;&KZC`>#9!k?lMBG1v1WsVT-;2*IkN5v8zsnrWNAWcN;&_=2e zw%+^%$eJ)7f27QC8-QU+3s*`>6G@?M3eHO1+v)XBIpJ`G|u|toEH{`+V@eORUGBXuwXDc z%CpB&p8S`O@+_N8Ayu3p))z|^|7s_JCeRxAdk*Vt?4yrtmTBt#q}6ps;A2q2~96w&%oW68?%yj-{QrJB7O>@ZM2WKpsXbv6jIxFYbo^@qG$$;y>C2W~?6ETKLa#A|1?n%P z)or8v&gQCisD<{8={_5PaR-|4j z%?3Rh>kk@HE&oFA!bUOqeGMS+VX?12ztC4h3dXYoo_uY3m8VzJI{s<^>mkSvWC+5> z7y@d!hOj4wFj;N>6>K_FBzftV-GEwbh8{S_|P4(ENj%a4_n_7OSHbnP9Q<;i?1q%;j&!K@PMXv~Ai zEE;PM#C_Tson(xQ9WW)C39~rJ-H^7h`Syvf+?Mb_t{=4{vX{f)oLTRxY<6G zn@kmNSP~T+$y#7V&%IvI`oZPmgUgu)!@!|4oaljro(l1^16pu38;6MGoU~9=iZd@i zu?ZbFgnR&8JLhrV+*%+~Hn#9)Z4$WNpL^PAA_VE!9vW%L)sc+s)ns{3ZPff0rJb4Ug)rfv6r|AK8e8M7AlCHfEKrR|XWr>`z`V0+TK+ zae#onRu-VZa;#YW7gcXr8}MkYvyUlnI;((k{Ig)>JwZ+?(2`c}$ce5E_e*k%as41P z=8XfWp7=uVRB3XHNd~1fx>|74BBC4tD@ilN!DNF-nCL*`^sdq`D8QKR)+_o^+uD*z zngQBY3C%Ml&E{hd@K@j&2s}%GhyDSV*95 zAP>M*g=QF_mO7zw`av`q^BB9~9b4*<^O(tW6mfRN0T;XC25~^hWy0zr@6S4(i^;F| zgbVBCdRXi+&*~veyp(IqcTU8%%q!aFH9TT3wei zo3u-b?~7)0+3C0KZxm}`X~0o<2DCF6%$Dx~VmJv`c$wwkP3Ipzg?hl996kgKGJ0)Z z(Hv<6d|U&YNK!nA=sB-@`SFSl1qQc>LG80o8SLR00{4$^xjq86mZ&f4!f5h08%2U; zXh@_>%N9Un`w8zfvi<|0BxXwyYaarMlweq67dX7g0`!*=D9ck%nnzPo6Q@fK;xyl0kg zEq-a4?hS4)<_3p&;}%cky7uh;Z+QhUaN#V4Y%cCxD zc2y%fK~w4yX7V!vx~fv~l)-RFS=DxD-T-eH#q@}J*+Zmx5ylr;^Ur;OV>p}02wJ zh9rbbNOq!t8KK{s@hqFSut0tPgZ1zM{7hA|B$l}hW4>RQMhiyVzrjAP=FfZgEB_k{ z9ht1g0s+$(TTJKWdl$<~VUf5$3ey~iZtkMcJ9rux1i`8LWBdgEtQ&pyf-$iR@HVb) z;;GP@8jUz_(Y1p(TeO+nTD*ZC?LeBkgEMc+;x`{=4C*9yS1ewW_2shE z;xf~9C1O)y6Q~vEddwAqkEzffRd7yTSlukk{sE%eRgAFa3dZ0E3}{)?N)dU;L0e4S zo(Y_f;cwq8L_P;Dunx+Q*gh%J!M!U6wzELCrr@ELlhs+;t&sW^0)iKMMy#27JCPTe zdv&~$0OZfR=~v-iIrJDWD~d@|DVkUWEo0c#Pw7;)nIYg_Zj>EU^n;Ai1i(pPX(?KED@)NDJ2)b>8sw51i26{qv))2i z%|Fl}37B{K;d$?I&wr<8y`$DW1Yx$K+9sbg&9MgL_Sf5sfO|hNn)%Kf@IYO@;VS2xfkm4ON^4-wF^VE zX1vP~H6dXjg1%Ceha0`=lFoui3wq2_0iCp{TI^q818>^x zH^)uMkr+-)n>W#`jJ0oVxM9ZPOaj6(v{M9ZduuV-(2Q0OvUBhL$sY;<4aa)%u|9JpSm2rAC`g==L=3Sl$ z(Uj!ACS@m0(SN$GeSX3$a4X`S(+%{r9Q0(vh?j+Jj{8gW#6Uz(hCU$3bDvNnH7$Co z7G`TsPm+IgB%q5yM4l|xp%YE{R*Gr^UCrCn3~X--YIr4d#T?z(>o%sqd&Y0tN~2|$ zXmTuwnqG2@u&9Lr&e3skfHLlafEZ2cx@88uDK*d%P?|a1DGOEaN_ zs4*b9&^i!ZdzF$((y!o_5-&6=C~6x>nymysj0}|-Ge;Rq2v|r6{#L&13%PH*|H9*Q zL^eJ2rF2MPzB(d{HGsZ<`ld<(nVtT|zOT2xHK)`^v|EF-8u$qRwHpd`Ve&e##c`e@ zWtK@CPT&U=dsPV~;GZ%v@~Sc0{ikP9fec`-s4%LR{ewmz#HG$$tGvH_kP?JeYS<`4 z!%`lkpYrR3F|VV)u#w<@@~BLLJEy%lyN%;bmM7td~cfj`TW~HpbrGobzk;WWE@}! zkJ7!HPO?+uX*fLOK+^qD zYQW(^sn+(mmh#SWl7MV~B7{r`pLV;Nb z*S5W?Tm`%e`DON)fyZwGon9%WLl|zgt`&1GxV16ol*&<*;70tp97O>)U?$jg;HKdV zzy?=(7iSP=t94%{Po|dowH;jH3KO`1M0e>v;$$A#qDNv=|y?|cfsm8?~-3J#@I=RT?A!Y#gsJGA9 zd>WV}d;~#yJ7xVgC513%dZGUnWR%=dFDV-c`0F3kTzP+ohofn6zl~> z;ou|Q5Go5rbLb-8V+$prsCS*GcVpgL6ivvwJBreeyP21jY`^X@MXNEcm8(L4QS41@ zFrl-MFmXXp!6aimGzN6|pe7-+@j$uX5cLNuSeWnah`7KyUJ}E$p=`qJSHML)Mc3>) zMU;MhOi>JjKEh6Cm9z;dt3HT%JNX&1o@Y2fMFI`E+spwfW&y^^Htu%TAWNV1yBlR@ z#80i7jiIFz)3U9G6&=TCp0e%1vi6#L=C?i2=K1FLGQVptwth7!5%~fGB{*REbv1Kk zN*vJ2lx15-smQaw`)|TdFa!v7Rn7%X{+sA!aU|x)_>Ns}ChLC>;u%*m+dC ziy|s;G|R%MES__EDwm>uO7o@pl~(HwcATY3&53@V2{^E2Q?TG|YC^mM>rKEKrCM#H zg!-}@laJ4&#;rD6e~?ro(KH%%O9YGx<2zX-9>>eEu9x6aQUicVYvY0c*8TY1Reez$ z=uY*8(w6bCuodbHS=LbdUYYu`P1}1V>dQ3ChV7&4aMnD!9SXyOCa`Vpw#n}WRbbaw z0g3pWIZjWI0E_0+g;3Y&tnGX@&;P(Lh3%0qq)AJ0>SAECLJbKE=k{k^oGAL@0wMcC zMtPou*Wf}XEpb&|y{cC0tadT;e6^klJu{$}!vZFC7c8K3Cl>r$R${kf0Uc{?A9V+X ze?AqEEKwdWZ_C?%8o<42hxukGn-$HCdeLK2QUgO4l!Q5}0X2mS4xM{GrG{+sMMeXL z@X`i;Z}MR}5n5+~LDtbe*VB#l%SoD6y`6~JGFYA6O$QF{vy&6gnO5e+yqOR#*PD1& zLT#B+EbTR;Iqczur7XU!jQx66HfD^?s;^fw%ME9Xd%X*5Yl%7=)!RiuYabg5Hy8@a z!XCYrH)b1&FKBH6!fd!F>5{E?*BC@L7q)h@gs|0gw9U+w)}2_X5laww&01qumB9tVID(>!#LGqcGH9b!5L1WsDK2@H0F$l1lekZN@x)IhH6~yDiegSO zE6{Id2e@6bSg6vDCzjlBE!UjlBabMOfz=uQRagyGL_o}W0tN+=0sk%WD#!+=pMSCS z?ph3rxz*5@{gB?3zbw{|C7BeqDec^7H?=R#R(-@)(=Jv6q4_D+0Zeg>Lno;(K{Sj< zNqvckD*kHSyNlG|Xs7t6o+h&bLb)RI-;OwjE;QoW>-@d<;Z*M*^}=}anP3YgVq3`a zOMH#8{Gu2t%db2koh-i!(zN>vpNVqN;zLoQbZ!6>!0OokaGD4(=;x+;G#Kuhg{J4Z ze%&-|c$cOrRXmD3Z!h1p;!X78P;N=qf4-M=zZ+Y{BL?Krg~Y!K-^_`BK|T5BL3fr$ z= zJ_&-}d7Og7K^*44|aQH#sM8)#RMO6(Kd{d-yKr1g=!k z%@pLEz^ryDCver~1lG!Vi>9ibJKa)GCoT_gnU^bB?#iwSlD1vGJ(KtSl+r*rR^RDW+C*@{g4nh zAk$*PY)g5C-a#sJB3fv4PDE~$1D1Aalv1CfVA^=OMunAnaiHujuy810*WtQP^HkmA zU0bG9=gtRJ=9c$eWw?sViI#=SaYb(ukZ=j(!Ff6S?qtx`yausoxjEJ1G!`#gOAc3q zj$Dh0M1Jd3iz)Y2)pAP#Il&aP`&u~TbqiLHi6hGh=a9f~yQ8Z}hTxH9xh~GT+9|kL zmXk7TKxqNdf=e7(tgOesEVz_6MzU5A?Fuf%6FRKsNaRw z=pTBU+Me)3Jck`PY>2>*1JCh6!RzHs3YJhDvFOXIIi90q(rKI}&gvP{r&QQl(be*O zn<0ZKO=bRZ9~fn=?Sl|C0lurVviY!`$8j7mokX;$5(LI=+AgJS7=1Vz(MB~hU_DLW z!y4$G^cHq|Tca5z^OCX%8Y`1bK|dwgKSw#REuRu<51O0qy}NmV zq|tht>iA3O)8u#3?c{fz)5nhl(SE~mLsT9EQs>uIs7=#l8j<#<_Pt{|N>r1!O2?i0 zp*_<1?JI7Q4brK=GZDk2AJo2)s-?+`(Q^fg<-vR=^^*d1`}cYxJ70TBVrp`KH8Hj0 z%%JUC%X=j$ZYdK)d(E*lc)k~0e;>FSVT@es<;@Z6lc1|YCG~^yMT%|5X{BR z`32TPD1l-FWY0x#R+k80(e>FcemYzU?L{42V)6&QV)e(X2!FhygZ!lTX1alwdD=xU zAax&U1dhKbzYW?s9#A6&(Hzi*=tpR3HTy~&1IZf-Q%8WE1cOGpBULakrg!fAG0Ut%gEKwcN4fGPG z8J;wvC`8xdqDp)T-cTob`{=x}yU##~_;HF256bbV@ZQ*2CzVgbiAAEgVwKQ(o$NXI zf-MPZ=rhj_p_ZjBGV>O2nT60Qws*b<(@UtSy{~moERmlBNmNb1r>4-&hBhqdY-DJE zrgHE#i{r`b26tpWmK}7$nJ`}JMqGeOK4+7fuOq)iObOi8i8`pac-M>|rf{Iz-YZZ3&_=-wi-AX`9A1E@h)!^krGa99Wn^41(kCpx&(kL{7JM! zL~o){zl0??$~rRrWYtLRwEc`OhU|zA(j`8qhoFonkxlIFP}{Gs-o4zp&=GsoVo7qH zF<~SMJP3vq>c$$A01hbCqh>i~o_RGSe2#eFfM%-ZCB~U_PrvFo5#qR4|F|sCb`_)= z8*Pj*buszD5_HkjDe?fK0z)*HG&WTIIbi;BLfrvt*^<#FIcDeVGoLr78WQ+BEgr)Pw% zvHzAGDST3DrM0@i?iTfw!bYh|qFo0oL?>0P>Hu8Y7p!Wd(q-jJUrNXQo>s+J^o|Ay z`KcwtR3`w*9mS?n^P*~pb4V^b1Xsmzv%0z7yFpRh&x|65j$uy_*Mey za6?%?p>1G15izpFtlp62rU(nPo-I>&Y@rYwUZL>1wy-Xa7YAdv!o?Mdo|&fCPNE3) zQz=0aBX<{9+`N=lHJNtQ%}Z$($cbfi-=$sUE`V{QQf!_BZ0TIv2P9EJca@VccHo-R+bbFQ~O&CfjqtMqDoc_qZgJR`Y9dsfqsexZK0O zQD&&8d1CG-0^#>^u7zg*w@Ls}X!>|~kpyx3m{vy!O`4&g%&`H2B7Hqk{Nc*&#h<}+ z6dwA*3VB9+O=v&Z_Cj12KM8vLYcVDf3Ro9pB;-{AXtqctUlAK5Hyo3a4Kp|)B=$LES;1cL<*pM zbSuPY+}63-ej*^VkK2E1G+I?++-1yZ2i z*YeDXAe4bV5rlL?x!^t#gbwAKb~>0#v&_EGlWP$4KwD{=kiN{&mS$wtwDcmgv7M2= zCN9&7Y~9^v1jLZw61SAgNw%1BkU$_OAY=JFKu5~J`%JKNkoyUf)aNBpZi~e64V@PO zgf!GpEuT~yQcRQ()V}a!T}(2bthdZoyyVM0a=(a_!Q2;c6r6)lxQ371TKr^OBRCPp zyn_PWn`*~8nA3rQ?*T(bS>H23b8cfyld+ll%01IGXHWQa74vi=yg}~EMfyV6mAZA# z=||nGpB!nw6_+>C>9_X|n)P@sGLp*Qh>E68vsv^sZ`tUYu{mv1H>iVW^o!#AvC=AD z3K-2VFT6Lvkm^NV$+Li#opTC2`u|q$o+?J{&-r}~zaQm1p=+DL-P5DxNp!oi(YuU| zwu<_iwD(fmD!6+6!Xq#=F$=Eh{7CZxSGX9=e@VDL z68}HKnMWY^YwA7vxz^L?KvPm^9A^NcQKhdb{zO7`?Uv$C^~-cV%XCV#)Dwf^kAS`fNS+SV%T2d@#Tqech4O}M0;#g`DRJfkfT~w$yQoM@_^(KmUQK8l;-bIBvPH|U- zf~L=q>ka5(OIfec+~ZS$Sr?(yTnj{`(=1u1!D|pY4T~>B6+XdE?SAuL!>P17!hUVa z&~|VX*M_RM%6>|K!p4^gP@Z(!Mr<=xF)c)9>pX#R+VcjRB!87wUXyK$^INlm(Z}9X z9S5TKKea-kzl%(Y+=?%YRRY3ZeSOC4#679?jSEH4%yRvvg(7I>&Gq_15j66a`gkr9 zvPpY3VlOCeU4`x{O5C$_4c2f&M`UD%{j9)4-DcQv9SoamYdH+*M2Ej7I}N8*?pe~7 z80DO6hrYxp-@Nb^Lwa-lmRzJ}Ef3Tz`2Pj{GE*{dZ1?zX$C+7G9 zZ^vHwSdwV6R~`m_k_MP7kNVO!^PL>n6$|n&te|DQ0S-Ka15e?=$4D)-0$(K(aJAOi zuF*Vuh_a9Nu((DII5-y`;OnN_{dr zcZi^(3GoB(^R_t>6Lb8PXp?PpD$yP|`GV1xUK}d%owz3UcOW!FL&f+~a1$wNU3W>J zj#%l-(`rGBh9O0i2QBDBMw?eAHE`hzIHp*X^}&S)Fd0#i6~pv^aY(d88caw|iV@mF zA)HNmQ+KY=MmFI{(kbwFNyR{*NE?w88f`?THmU-{{F1#W)M!pt8~|QDTL+x6ieDu2 z$ihC8ti%@fnPg_kiJtT#8v$(F=WdkyZRtnl;Wr7n=OtIV{@~s9VJi(G><;UvUmx}) z2riHET8EN* zlcE(phD699fYUk{k@D%l(q;Ne*w>sXEu48P);pA9W;JR@0xxT7$m4x4`N$MUaNl&y zlE=syDmdw^Y+uCJn{-5X()~sa)r#z1VtZHw;gm||$+b)#Q8i5uGmeFk*Q(_a=Uj!O*V(4|^l`d#$x$o4s;IkY; z?Q#KB=jDPkJwSvb2y7<)O~DrdZQkc3C1x?I0te5aq&~@kwe>z9$+TDb+D8b{8QLnY zN@uE-lVa~ZJh970eOS`jG-)Ogu&SNHHNgFO9DlhV%gyIf-e91^jhA_mYs*S^ z!CS18h-6qS<}X;WR}e>&COOBwGv)7@%0y%Wd5o{pDSbfPz2P222bbP#zlAzAhgM7? z0Pqs#e;yO_0nuc_rlh8=@dB&U-8t!E9_V(j`jT)?t0=X)SdUtqb6^AR(RIimM=%u-?iipWyF6#^~N`j6xaVb6+!U zX}pgxUKrcMrXQVCjo`$0KtBbh_3~lyE|D`VpG@Q8z;^%W#7f3eg3lrxTcW)FNUVlF zOk@O;(Ideh0}LvJPwQ~KfOOy+a)8H|1J3Z5?qi9F570SUdocQVpZmBHM%W~#E})0? zm1fYG#OoQ0# z*vW}gdVW0FYJKN2p%9t z;3_-}4vX-MlZv=rlklTcCMgYJuRd6_AOI`s8Lz5>(A<@CA0!6J| zl6VC+BafLCR!h|pba!4A5=u~)SZHV|_(+9t(f}>zg2KD71u4W<>@5#;@askjbnTFm zT{)T#KiMKg%UgXoX~7qC+P`OeJ?HOKs{ zwS=9oz~>uy^$E7sN3;WP5H8)E|L3aZNUe$$;j-?l$or+Tb;@dfsrD&t$tTeFeATP0 zY}2DQ25=$rj~OMj2`IeEh&_F>5V5DlTp7?n*vJaISohpdUI56%`6;GB;5G^PWs^d8 zM&PrG@7oF{;b22XEN(4qks_oucPZsuH~>*3A%cl`EsH7Mw`wDAIvh=}k*y6uYXWQ!%n*`Xw;JPIzOD zUP0Ad2>;5_U3A1_qL)^>C3;BI^0N^}q>z-su|l15zZ4KnL`n1K{Euy?1ym`4%}C53 zy`7?*{79)IXcP`~jL@uliJXt->5kA)tPh1NB2pv<9HwTl~eGHnla2JfoWyNbGh@oe)kzB6y>t0tEz0;1&TX`zow%b3h%5t)>Pb zxzK0wb6Am|UFj>k&L9rl+uA+Q)+6nP_JUTs2iq#hQ&`uHx2?2~3~97pp5&)e_5~XQ zck#nYyfPy5>;v($Ju=rTWWb_~jZ=u1QX!f^-QpZIUYBxYMC>Qh#ESNjh_#i_V`2ut zh1p`hfKd&42uO91J585Mw2UGMe zfEf^PXCrQ3Vm^{cU;>bJ&DK{KO5BP6UywcB@+^m%9T!iJO7es$F7g>T*$4%OIXVIl z9YHOcbu#vAh$H>f&ENi$PZtfQ4G&2cK1!N@8*w#~AF-C+9n2&DO>gc@AwCkd*7>pP zZJ?h?iR5YeI!Az>z<}6mDK<|s2LdR;`rNzKh2H(kKcaUB{jl4+938gUyWHrGwB|9? z{5Un0`?Rc61T@I$7{Rsi{SZ9TX9E!$WHWx0NV%~R&yU%!v8w$V;DMxV^X!+mAi3rZ zQx8R?fDaN;<0)mjX@{bQbj@No`uIB|yoxtoqE#8kT;{4IA!+HxJYIkL4P-BB%iU>}G4b7Z&+o^nBS z-VntN&%2l$0G9@Bb&Rx8p{SlcG}jJtE3Zn*(0btJ;_X3FvYWzMt_d0KOmGiGHg8%{TVUl)$=P$TE-Bw)G@kV&Nz2<<h{0LM7OT+w~>K z;2(i1XdD*;jknvzQUy0f_t&WacCfp`wT`ok3U0E()mG3|xUd+caFr-rl0m4u5rhE{ z?+Kfd?{5&QVfqPJr9seEgv9N!z-U@oyqLr9rm(7VgWAzD3}W zW2ttiTaM}KC|vNltZ*rPwakC2Ml)jIiZC1^>EOAOFW{iEf!;q+yx+E$RHWwrY1>pl zaMiq@;W-l31R8k+G7?#6Im z0>dne!H`fPjcBW1I9Q2GEqUujxlO6V7qv~PTc0a+>!H-8D8L*>Z|MLYM67f$1>^6? z@q$-T>JSU@m|q&*MX6htQpfUVD0OIeev#gFmAduj2flz(ci0cD)TQ3FQc>Di+q>N8 z?n>RZKCx^Zie^^o)m@HZEBo%|)Bi?l4a!IJ zOljJWu|bo0Y=Q~#1X;V*EhFFCQD@g7FKwe^Qud}{@%^OT>yW^!VD)yU3~}n&--Zp% zCyzQ5k_fd-5;;TxWRgP?qX7DFbTWkGuQ{)|LgJ>Lryei%G?W_mbl$;vzpm1qOJ-A@ z?xwG@NT39bPd(%TN zIle=+tcq7VK2Tx-+T1UUj{DsPw+z+Osne`?74;!W83e^EwiQOyxr@25-ZdB2!(2#| zl*q2D_L-hqgJE5y$;)9esDYO@8rE4nnMxcoiYGh@F3$EsMB0q$Qq46j)%?NkRI_|{ zwm%>eB97-K2>Xz;2_pHVp7H+{yD#UmRse*`?e|(4YD5xe2wUU^FbX5&oq_wyUIdgv zcpC-s%K#?ZA}2eH5S1t_586?J;Fh`g`E2wh4_quFDl?U6&HNLDN?ZLrwmufs~L+b8|)fO{xa?Fw#O97hNQ}FX$4#G^s8|+BGjIiyq-)GS!%^ z&MfEw98tK&gU*!cfty&EU9o*;M`JK<8jJf6L<{Vq7xJA&FOhe3q!l5$#@c1(nz~a{ zG3hcWKr)5h$1u$awQb(FY@2V6pr{UzRcV7graL=DDUd?liIv7PipgTGFEeB zbHaf8MAQKa4{TkVeTh}*z^`Ysr!zXB5Oxo9k?kJB1Q~}bO&WewJQq4Idg4AaHx>>5 zbxqi(QgDZ6@ddy3Y+E8YfluxOP6zI=fzuu4zTXBZa|v?+o~6l%xc5x5FzF`)xRN0m z-cNz34s~Kw6!Hms{TD$heGhQkZq*3)YH0M!iW&st_=b#sKtb>xY0^3Q3S7^kUg`ub z0AY#OmNf)UAx%wO^UsqiVd9?;2|mLsTGCfVVM+@`0srZKAe2|W>B4c4QrZ&Rfbx2@ zOC?9wYoQc^#I`iS39uWjfYV+5-~nNb`;skvbGD^<{~E9>WgB^oKnC7$fEQ|QA>Of1 zML|oxCw9eD6wFXXK`w<_PuTGi=CG3xETHqT7M=fIM(3z!^-7P^f9ycyq>SB{8>@x2 z4^}R;WYL#2VfTm5^GMd~tc;^KOSE2yn=D_4Dk6 zIZ+1jDlrU764EYNaJA;uJ}sCmcdbS_zEIteZLOWA!xI)0sx0XISyw+Sh#TMNU8dRo z>Zf}>0FlJP!gA~4_^YOqXr&>uF~d#O%vkdYLw+VVKQJ2HLy2>(%pyBx8kvBoVe$sn z%!D!KBr2pHl3zc(7cViIuBCE5WusUenPnY@#aB5pSM%ye#y0f7z>)o5-#yUw|MIcH zhkdZvGfS~0y%bTM)neIM_IChK)+P*BHieL!VW6d+Jf~mlUroQTz%F2+LZp%)<{8k; zw6OiP?$OszdvT^{d4joPrdHoQUK7*UvsNq*hSkbw33ne$wM=VwddZHUN%c94s5m4e z^=*eUKT7Jkl4eTKr(Vy?-;)~fn>E= zdH49eP3gQFt9wT8E#CQU8>jxtyWaDc->XK@=<43&7V-5bu`&2+oft!qVfi6K7Altb z-}ROE#c5xd9yVvh^fa6{`P%YiJ=ilSjvl%88spaGN?rI90kXV|uUA_+u2hoB24?j_ zi3rf!pBPGqLK7;Rr{a=K37RL(&I!#9a7MQp`gH2D`M6(V&%D5o zv+uHg35&Wi1b2tcbUMzje7^)(;1JMghC@6WuTiKXYM4@`a724ps#+#S2IGCA0~dt_z;Zg?&xbX9yOi^L@7H@^dJLI| zER6{6dzpFqbG-V%bRrMoSBi`o0lqOKz#XJ0gg(D*Oyq4t7H1wT@D_z>WPu?DeQNyQ z!djTVSisvslb}ngyXoCe`ni2yeP8R`S0QVikac$5>kb=PV*>x!$Qsn&T!zhfX0blV z>E*Bn0;a!hOij%e;4V1ge|?*Mlo;8Ih9JRr`1%fS5+0av1(o*TIH3E(sA zq(mv&pY!w`<2xxNo~h+HXG->cYZBi0)s6NkvmeV=4m*3Q=kcx-Z~Mk?dh0E>-TciS z^F?>Y4EQ46d40l0)spNW%*1A|-gn3NKdJXI6Y$Z$&+P@cf{0-Xp-lI)T%lM!NuLEe zvI?eP^Ol%^$Eop0rS))?BpZ}($p$+9XE8AfZmUUUbmr-L`RUM=6~C(W9)HcvgJez6 z&Yc7KV3dzCE{#m)rBLR;9pmqp`-T8CwdGJa0=fxlnJ_IrN73&wpvMt(%lJ&#JM>Yu z&T#gij;wb365YM~Z!cK9@C$4UTCVr2FZ=6#=yPlT>0ba}x-V0Rw|k38Q=%=EvBqLv^cJZWH2LmnAk`=Tf8OuTlyIy*4e-t;ri>SjE`6FER)F{zIURDTU~qfl5U z)J51HccQNU_*LPXjz-MdR;vmjGqNfq#?Fu=MZ~tMrq+L_IQ07!szO&~yGs(gSrxjB zK(Z=?G@7eIs6aGq6$puD6^QHtR)NS(U{wiVN)@_Huzpg7_?0TuJa3i2;Cmhxubc<# z<>w`ng!;3CLV1b7u3Bo8KNPy@0W;wtIEwth>C9C^`9t-AQ0AoTtO(JkY-@OWN(&x? zGQrWOPtlWKkTN!0`>9=()-?054EV?Y$k$lf3>f`VbE0*O4QEVJNO3+CbFT5SQ=bZM zfr262_3|0;;7z)Cb`Tu+`^13XWh#OGABXH)27ISbB&iYGbs-M|RRVxpl>p#hkt)F| zXG;Jl<>cNEF*-b-HP4ou<_4~-eQ_iFW{#u{W+YKa1yp8Y(&!Wri+opZxt7fWM- z3|_HCuyi%;W2i%+c8~#xX)=%kC5wQ38@32oi#Iu#Ot1(#1RoGm;Dg2o`GeR0JShWBSBQZq3@A~uvwB8h+?k#ux6vvG0o_F}}ewM=O~MXPH+ zW}t7)ac2um5nh*{5$<3ca!MQe5g~-7IG(z0rX>B{|AoPwbYbd2m)~Jd0~Zz-Y&tjR z+*TNY=V**)%`<`OOvUl)ytnK$XZ>2B`q_Am9eI7rWA_7NL7y5w<%SB{o$c54kgoCH zso6f_s@=8yNQSCahAK;jeGw#{l=~|PPS!_oSioMwU}T{Qkrz-12yB^90-3iekQu<@ zzOE87_k_$t0}TC!P6KGPBmv*n5cNOpNv4T`&Un-MdRBa${x=5tRq#ji#2*$Lr`;L zbmo^iH<~8o^2RcqNTMXdV$Cr2mAKN;QOz>D({xPG1A(*P;#xdaM~_o$+_BP22&h8{ z@zj7f>869I9>n7Ct~R(%*HedgIG=9ED> zp|NLae3NP4P9o6ctJRD;e4)c#f{*mXM}}*SaO(Wrj5v=O@eRT@;ngQlymj6i@arJy zGYOqYgR~7v!9JnToEfZr>*DRlcJkv_rcciKadyCB9E1b5UK+pU<)9WkcURuLQ;;4= z+>~FT>w=z`+?O2{@uBG2TuH>Z$x7nwX$GM}!DP#NA@AdDKyNfVk7*F`t-T|`>M|a} zv%|ITH>}Rhr{)|}V@2;N*+bT4ZN6>qV=~_`4Bj=1l+*P3)c9VpQ4mukq#b;La-lp* zdsVNfl#UPv3Pd^@+n6DJEY8={W~+pX*CDGq@yz7S50)^+irs~gv^dPommZAixg z@GR$6-#$LZ0?#1!h&?%n=9574nBXo%|2Pm`oulr|GXN0yg>br}5!R6y6P%Fq;l-?i ziPfxRB_V6i6@1U8z@nfOTS|_T`i}8C)i_IQvh3b3wSB!#ev=1eesd$k?zkoZ-j=>2 z`1~*HyX)e+@6>n4cl++me5W8kb+7;@m`++h=Fhj03?gY%vzAsOAAW9GbmXaKcp?R)1#{l0`p zJovWphjfFMhqkxf*NQ@&eXY`|ldn~Txy{!qALxnX5YVn{Dl&hvPUNYvGL*QDall)2iN|VM)Lf;lIN-90loeC zQUTr%p-1+4&5GFN`D>SX?S8%Xd+lojUSmbGbbg!gTYwxA1o$^lq9h31Hp)uBS>bKX zRrB1u(&wo3zf`541IDTd(b=110NWeSgPS`r{YP{crHPC6k#=TCIFAN=8v}WqtB4QfJf*3 zC=}N7vguUSMdDk$k`qfxYWA7lj4mDqzlRErL(`qt`66|W)ZCZbMW|I?Gk))aZ;)CC z-$c_L*x?3ABpqyvD8-eH2{4r8UglQ`zvg(EVHxIGo)&c!rzH{R2LCn6kx_bYTLREI zdQ3~}q~8eBXbEmR)OK8W!hB#?c#Y1jmtSmOTcO$*nL>dwNj@jY0clM5YzV&{0ew%C5nhMCXxKmXgqHQTay#I{}stBS?XZ2*+eNAYPMAajZ3LF&Fk( zQrCxWFOJvbB6)l7&9r(0Sv_q~NZ6p9ElTQ+1ll2J`jcthS1^=VP4Z3bB97)&7?ktd zRi7@6CR#%?X=Sq3MkKOU!6@e!Z2ODdC`%vlsI&Grxto^lBVJFKn^aCPsGz-e1yrj}B zv43?4ZKoeD#qK>d{uWd(E_O8S_s6f%$^*v|cDf3|D$@MbxAd1@vZZU((viiM2=0V3 zUVTgNc*&Lysinh3-l~iHg5q`Dq<5R%xY%1pcSSH|Y97@&_x}?BJ=R7Z7A9l1}r*!|~HI@+00k zzQMq>n{kPi5q7)XN~=mx!ts0eQZKvyd=8|7-dIS&4=IY&yJ)eubk>p9yo^K&Br$Bh zl@kM%0k>4R$si!57GV!MjHU&s+z*|VrUUB#f%=fPi9=QZA9|;~B4-Z6c1RJ&xHp33 zsY3Ix)>$DQF}F!lrc5>7$SR$&M%x&cTw2$S7&9NsmKVqKu;Yyc4WII&R=1p`Jsl^`Xv44~X=HVf@EPowb?O zA(dWJFNsYbAbIyv7wwlM7LBKTBi_um0wJNfhUJLXjSzoYja(Id;A+$kF@ZjBg$S=A?m)P?xD!*cMG!6*U@*t2z^#3(7Eh85RiTM5 zt$ovKy>||gkm~_Jk?l4+6X;CtWdUBR(*G8JCv183DTcW{R%CsOAynjctNNgSbvCg2 zffFk3(|h@SP{7~idw`hUALth&IZ}l(pj^@Z^uoe#`(k^c`B3m&Y2o%8c?TDh1#CO%XP`Y}cDIX$yY0ZmZ^N}Tod?%hb#hvV|7d?Qk(eqT_ zm;b!FKUIoZ&XxezKSUfdAl=Rf2VrP%tVfsV6}TAWR$Y&u1Y&iB^We16zT!aT`Qqiy zj#RSHVO(-;*xgr8mp6LT(b|f%mQ;JET8>$j%l74~wIxqw;bve-vr|c0y?psfdU9o{ z5>%(YOhL{o*TEc`Eqf(N1UHs;#eXZmy+BI^3Sb!c6l*^tDNzDWN$p zD!#R-H=wbmdXO}c_fP(im|EbIj1}TzZ0`z6HJ%LKL&NqK7O}dT?4SjMHu&rn$r5v$ zgjSbT2aFkFrBe3fXqnH^B`nbvbmk@^%U8Ds)quSUrYH8)wDctJE?oPi=;@Ww5-8TC zCQcd_HQ9pcbB>@f&?E&Swj?FS=nRnLKU^TGm!DNogVP7)nGDAy5@G4|MtNqs1U#0* zTMJdC@$ICl6vna>nS-j{TA)QQRw;*qX)0P!Y9zy*i}N72)VM;*-D+#HWWb_$gaL=h)t9Wf9xilor@-L4i69Tk}p486sdipb9j< z?fwgbSoFTeQMnzfSA^A-v3eP$zEFk zu$PQ!Y#T6-*dSc$7`Rp6-CX)-pN1INnvHc-YhP6S)9o>BAYyOdY;aFwZJYHPX9_%p zF@*ql5R;vJWtcx0M6${$)re(flhQ-GS(SW;Toc(Cm%6E_&PtwK)rK>QD}6x!FfNzm zmSWjbN=6~#q=&>Auoca;s-K$Yq6;U(GI6p=Egs9SS@R-jS2jCSB$OJqL-v&IQ#I(d zyC>h|u`9f?0@y5Y9h3c!XGVgb5e-ExMPp1W*dDCXai2okuzoI`y|c3q3oNPa(h(Db z`O!fY84TkzR2WPKHN6#kX+DhWp&|CV^PuxewP#rL%c?hU9I#jt;3E-Lk)!BPM>HC0 z3Vj7wpp;4Qq(ef3k>#(Fn))ignk#`X-Bw;BHSgq4o}t_qr3kl*a$(lrc-@(&ad!7N z%E!|(Arf8t6(J>|lNLyaNbi_NSz{DO6jjd_W}%8vkSv@--e~VbR{4e@MX&G*9|G;_qkua&* z67yj5@ZC-IkR5PrrFO#1NqD^=JYJ0>lck`F@Yrjs#6plhA#dnMU`G}s6+$bbQL0Vh+l4sh{6D)~)$5=gS1a!>Q)z4vlH1)>clo^*96ehgkm zW=AB{x-#>)T*lzMoGfa)KOl8=eo$%whmPehYhwN(TMhbH`jt|)J*k^x}kK5&qdW{z4zu+)inuO5uNx@Mt)|tGdm~fSxc5|8Z z@n_`jCiG2*)SY)?!`}T0oiEkyFX@ibOBz2F1srZKKG}mH z$~7_(_XsATlemFJ3%Z(c6?{QllKgw>Uawi2PXTnQj)@l@FRcb}d=6!Fuh+bG4*uSa z1vdT@>VtTX-+h=%r++Y3SgOFNdnby%rv7SJ0S;uWIA0knH2*uXLi4{9E2Kv5h85>E ziHlevwUJl>4SC#R1zRvR-uc1IDqyh7U933I?$9n)JjqEhvYTRqN5+b%N?5Va_>{0B zDil`ikK(Iig~m^3_61hxj-JFmV^r90_VkF#W~H#N;@BkN^@qcOjM+YdTAsM>VKf$w{iDIzP&xEn3zT&x7cL)UpUGrRc%h^>eY;{P=%Ieb)hrizL1g z>rH5$wZ5*riHAzlZFVqOQdE!__&VyG1n&*LIuMA%+VGr@ukOOfuiJ%>PZ#(&X9Ffa zez42Og>-5-__$2?kn=Ag;J;?9TnosFb^Haga@88BI%nkz0)EcQUsk|-?pgt_yH_FL zVdc9B_-(9wEXDT~qbeC7nsqHp${qH%m`n@mJ9LR{$Vw`)j#cv+D=afbM|X4r2`p?F zp+H9~P$_B|0)D4n@EPeOtzK}ce8mLS}?!fO1B&&|7aTP+Fg|dUCv2C1EiPX1yR* zK|j@WRGw5*pYmGrstlRXfDd4CO1DS|NvE~wrEz9$^R#2 zLiw}yf?oc+!fW*Mf2ChlTi#myk*)(He@8f)rXjQCb__v9ybvn3MTSO@=t!qxgrePT z{0Soc3~?IcoHBHM@~r>=?7a<;WY=}y*ZsO@rl-4Srf0u*XR-Ub@iib8!b&2sFu_>+ zwn%W-APb$}Yn=zzyJT-`}%cH&wc<4(Tc$(rr*2oz58+Q`M&3# z8;Yj{t5A1k26a~w>Pmhj)TQRDqAnKN0@Rha3yROcAUt+4>LL<^y7sy+M%{ixEl#LQ z#@t#Z4!%<^0jwHznUjVt%-vKMUP%_xYO;{7gt}QL1{utiq!SlL-OWWfNdCA)?(;bK z30n#Zt1<%BPPmSbYBCNAk9OkVFPW;?!3FQZawyjRL#p`IPSA6h1lq&asXj%tZiY4Z zs{`51^Fh47C#nPSenG$B0w+Yaeo@zfct6LbkU?Cim{mRgM7}0z2|T_=)nl|y7;yE^ zKP}oE{wJ>rO47mwjn@FBze*K?lFxWGnZ9-?RR?fj7VOXha_p8ChdXoN6wEe(??;~j zSO@Ul=iZY$+af_eU;|!G0dWHEAW^GpjmT{vgc8*`b_g4M?)QAKp$$CJ;V!9gBqQBGVHz zuce*3K>9Q&FI-|p_Jz&EA7OcEMrHjxDSVPIY^U5OF5@~oJBv8(>@4EUcGfskWOweh zbarugc6?A*t72b5 z>QW6@L!N*nfw@Q2u`C^GFyj9^C}JyBEwz8GjiN(@axJjuWY6cM77$5$4LX!48{wEF z_gp6>Fj-EP+7X6JR9O*HR-YDib97V3Y~b4_fl!|Rrq1#gbN=@aA8x=n1tDY?+26P7 z6#!|Vz@!gz*r6E-%KW!_Lm-V$e6BA)slE_+pXPgE7xEO&O)&$!c07cncjDnN!^pf; zCZRnI*)F<1UurT&)2h?;xC7v+A8vX98jDUly#PyIf6bP5l4mpS?%`P_=&y zm^)Q6ucZHm%&pDiPlWX%y&-8^wMINOu=Hfsz>;q#8(3K57)Ia(B;KNN&gE9r02(<` z7QMgfzkBWdO7j(Jt8CJ1F~4BoHoveocbH$YSl`;Zg88*MUaIEU2UhiBjDAhne5~dh z)sO!}K&~Jv*vC5c^0ulJ{9LcXI*kaETnX(4+s~IFg0y}B|bkslsJl8-3i=sqSLn(&O!oO>vE$RWG zYM#%ACaS&zLyv8zy8+~%N(jm2$M;PRgkx^!eDRu*aSkLf4UxaV5N{;VOuGadw>O4B zsJnS3iJ=23rFSdCy?3!BNZKMCWkkTB&E+nHV3CW4ks=gV<-)*=Y|D)^Cq!J54 zgOEdb#`?#7Y=t7`H(USkt;qMH-{+Mkw??y-8HWtEzj$2WSYe;;oY^noHXX+tg4HU7 zm}_)_u<2;4sYZ;2Mv9P)U>G=JJ$%rvc7E)lNL+3B;r!sO*J=29U~_{P?OK1j%HW}O z(b$+^$=HAy-JS!@vzHjx92cb7WMrUeRtZ#{xr5hdkxML>|iq_pQcDUN>G!GO~V zav2V0#SP}kOmMM&9vmCP!O?B3^r8hS=FD+{>hiEWpa@rvDduKvxQ;oWhM?F*j|CQ0 z;qcuuJ+G9j+Cu|Q-oJMDp!!3*@2UgRP_+3@!hlQ!iB~8IM7~5s%yJO8hS#9996~qm z$DNrjqpx=>+e{#8>6NPltUOGkFhP#O=784B6B3WfeXA!8a0S}4{uNIeK*JsFP^nI} zjin0Py_r-0v^WCFx5{(;40yt{slxyVr;{pw+S0{5?Jsd-zWg24V_ z^=Xbk??d^Vj6Pm#-~elL3lMs7)GA13~gMr(Wl4*DxXH z`E=?DZ=6p3ngVXuMq3ky9d>$e&IzJ35OYR`@k$W z5fYdJyD^hG?9sG2DYW0UOQ)Au&6Tuf;uL0@E^|z4^?cCjVbLjP{hb@TtMv8i6V3r<_mhI7uL;NEP=__)bWTl-_t4=p{HVhRdCYkP zB+%H*6m#f>Gp*5=Iot=rX9Y@@5^n_Gj5@x5d>E`}pNA0cOjEb~8Vmi&Nf`(&lDoQU zy|i5@2#GgIrHG8PYMs<)!IFJ+R-W}koBcA0C(O5{X{2xFNY7tUtyUdZAsCsRN?|ew zKa4)Z?;wH+-br4(;mv{}3Db4IHsLnQt%0-#qS77MQL-=I3}ZbpjJ3ot5KE(9Q*V6| zFT7WX)F0jluUWfuctVvE-y4i&qa2O?>-O;8T-Yf7w{nI6G#v4kSK0*v`_m%W+J7*- zGXYD0yfWoni3?o?DX+~Z3pyR4-^m!ZErl_x93%ABu_2+S)Da*=CCuq|2F6sh+crWJ zH>5g~B$Wg_VK05Tv?UYCy_ec1Cj`M!zVKe>A|z>XPRWraNzp<0*GH1F6@2MOlO&zg zl9bo7Bn8?>jf}7y1qh#gDPBPAg{5~2g9lh_^!QQk&~Dgq;kBGY?I@)MDnqf{(1 zn_8J)Kr&=WB7jh4>0_koXDP%;gjcit@EHQ--?7Gtkm#@b#)+!e{?hQRgX*QP#5SD9 zzKLBf4^*);3lXja3A?2!0(E-&QI=YJa?Zr_mhg%{5A08H3B2QqZG&_&3d zrVCQLS#ywe0wSQ*F9-fC`b+YX!{^03{pUSfvRr;Ulol4E%XKsfkRVUpJo)|WzYDia zp=k|I)FLGyH%?uP1nkvi*aGLF0h{hMbH;#T#QUwjb;RNYM9N7g^z z%gKOygSsYrbhAf;l#Q5F>N$?`+AUFulqlilmbUpu>vfQaR+l zjd3QGlj5tstBqCH{4$FM@p4f;>#bJ1wGdmcV&fH=bjvhKMpX|*QgyeXC=ITMfup$v zLW_&-mx1vhS!;^ZrB91pwWt$XM5Uu&FRC9y>5=j(%+n?c_EVIH_&0oDYl3_fIMVE) zWf%pImdn_IJ@1%DgBst&f5$qfvobEeNUg>LdLmXxnjLzN zr+~jo{6g_strhJjjnKhJ<={!i-Yt*l$XXC)uRJMN`UmEMt{1C+qV0?H4YPZ9+m7d# zp_D7Wz`pX$KyrHDjn6jPJXePR$q?t%>VqU~LlO7*)l|ul<%M#08FD>P zxU9g(0TvIEzD-MB23g%dwaJ&cVRy(Fl=^Qqvf&G}CfV?U+5eJYM34JwhrAxxTjDRY z+dnsE%#h#8m?Kx9XIQlK7v&dl0eWnp$5P-~w>%WXQqMRa*U%TED38}SU{slJvVn$8 zGk{pS)Z9@b>{w?Z8RqE!ZOcLu{;LzD3f zXHI74*NRkjF!Eh%1T2dx#d-=9@yRh4Ib&eElOA#<#F# z{Wu)`R{p!KJTktW$-Etxb!&V(Q(J2Vvm6Sk%Jhjv=We_@U%|?n6wl^s+_UIx{dd_(ncFyweh}b8|cy6 zubHK8&0|bQLI5+96{i;jC%tpNU#&_t z=#FnMZ!2$o=h{GrR(K}5U>Gx@$-4dA8U_z{w`*P!`wlct?E7}(w7Bp*`z8r7v#kd; zS4)bD09C@^n7^raJhAU>%7NYNyi(B}l=E4J1Af=czG1*=_|w&44$qol-@=NTeG4UP z_8oW>6+q5M#SAn1X5Z9U8rV?)GLTvDAW1Ud;!`rt>|5QPW#6j;A8hnN(sD>dybkO; z!H6ESP-V~dSV?%yzPsn((o4|%>X@8hAOZ&<1p7_}^Xz-2JQ~9i`>vTZa4Iv&2)}Eb zt1%7seY;#Bx6@X?>Ld5yDMqMOt@1tf8=pn}#NlujPr);~0VcYk&j*}>Cu5q-hw}Ei z@W|+*UJC5IKTPKX@E}*so40D5MS1Hve3D#02CNA(ao**n7tVCDtL9MfeHJ|s%s}ea z%=aOKRr)~A9zO3V4G-Kh7CwsdI13-e__&-kk`c#6GC=dz0q@_&+iDq43;0&vjxj;K zx2Zd~nL>)w9a@TidVg|AsE|HGC07rQBP>RynB%cpu_rTSidi|lr>672BgoK#@@{N`&=1}`e%1-%H<#~FbnSI6I^`nY~K z$O=TDc!l_lGf$0uOYcNl*Tl)TZM2$?wZ5TuZ@ z*OZcccL%y)d6W!c#UE-Kat)xZ=x5bz z(yMXjDS6n!RN^qM5UY4g-?KFtkN_nyioTG1sGH}A>@abK{k?d6Hj={M_QcSZJ`as=gH6C?GBHD|gK{jQn&_%i zZYBRZi8Ybd7$pt=`mf5rUR$GFD`04cIf`;316xLEi)^uEk9qT;`ub;KUT-Q7nUndZ zh@0{bn1r&oLJ($JY}B_$5k*12PHcoqs&_IATy-sGj^K`O8lKIkf9JEUihuLv*%>;0 z)kgJh!|(vs2O7a}qLqTi3goOuqxxM1zosa;rt>iqOvAS!#)kU6i)Z6n7gU5zEJ(>> z#&!n9)HyGxj6j<+tFhDpdfB#>^*8#rOy+h$M)-F1jaZF6rey;B4C2!5AsW`y%QNG! zspf()qxT}=gxihbG56Ycwd(+{>bjvW$04!vNE^>^^iv{fA!NMD#(4+6 zmXz158yO4wJHeCzBo;J+tVddPGBFM9+X?YU8CC!ejWjbTa17C&jGFJ%nt1ky)*Psw zO}t@K?}vDs=PRx2;Eauq(8nddVS0&eSjq(OqtY`&EMoqo!Bv?igLDDgL zSt%{=D#+n-yP64=e?~KJXP+`~p)E6ysK{D=GU_J3YcYdo)h?0$wSU79ijW5ZPi|Cx z6^Nr9P6wRgdzYo7v_8cK3oq)u-XALPv2`LO{|Y)(p0qx7jsN`pp6k^oiK?r%;&GFGFX&Z<=3G#Qn9S97sen*) z#C^K>An`!UgX;hOg%^>P)d_HKYf$}q+~Kqtvbf31Rr}((HDUq(CqEb-+-0$F*Ky4S za|9xQs0+q*6|r>XMWjYdhuB_PhR7>nqAN`%BvnBvtRX`#ZC!M$&pV#6+9RO>9T4v2 zS0+OgTkbjQzze(rFUYG*cj?k@UsUnxSE7ayY88iN*^I;Sq*YDCqFUrA^L~v7*7gtg3E&6hoNAW`w(L|D><>7HA<$r9eX@#n##^eB z7)nV*1yD*N+8y6RRV+H1ls*Q3~#}lq2s7wur!!~$AbInCLc)?r6!AOMx zSn62~w9K3ZuhBHdY=tk-@Dy*lL&Gzys7}c9s;kQpI2&LPkQfOXA_n+FfK5u{4{0X< zd#07Rr9ygUZ2tL8mvDe!UGlpwAuKyeLXK4=te5<&IJDBX1hSco4y|8T8RH#2-NtK1 z!}d#KU%BDY#}J9kIWL!#*aExs5XgE6T?6R?Na|SpLyb+HAN}v(;)lGcQ!vHpMdx?u zgWifDeDI|08jCN8L?>0z^=?Oq%4aa*I;UUhg_-`uP628iamI26z85)%{`8-|DCsdl zUO4`YwGk2pv-@>w;9S?`p&6l`_fSHkHMp-Fp0+Ev6A@lv>jU6c^qgqmRe)RQB81sN zh5|bMzg8mAHY~?}(5fIj6^2RR!v9s&7__E$zHH*8C(YXaWnI{)?HhGrt_=>{rwVrL%~LW4#0(`P zh#H8Ojcq=c{GSm~ur=Xt9YTdL22{HSBOo|#)K2Y^l*CQ7`ZZ=50Wg9pIyJNIctPbF zsrCk=Vj^qG+1p@LUsJsD-d8s!=E8<6RzjUI1;x`6g)}R0*;Of-=B|H02OJ0jaK#5B z8kDdI$^1lWbJ3s*tcj1a!jdheY&Omr6}aX+_}YTW=r2HU?S&|Xvw%lLXn;#uPr-Yk z;~t7&Iu+-a+3Ul*jaLe(H}X?hpyW>Nj<#e)WcY4%FQlCQG#SXw=lYeatpIvh)%J1*{NQF@fPwf;Cz#^ z7da?ia;Wk|lhnwPsZw&Zk+^VSmduxo_Pn9IOr3|zRqHS$9)}V3>#CnJGn#JYs8m3< zkeQsNFOkiOs5G&%hfj5$B9Vfnd zel;0sgSUn*B)2MSK+ui&NWPxGX2#U|kJXL4+r0^yA0Lh`Jyod5@8O2B&ui4w5u<-= z>wVz5g|s$uUu$Yi1ds7o93RL@_n~W(Lh>t#vF+*?zYOn#|J_8)(X(TR!h zz+N3bd7^eAlq$VWgn|r=Py+I+$EeS@cSEVOJ29$==*w%yC@s8I${olFeC=v1w71EF zb~8KwNP}4fcs{Ud0R}wZ{??;_e4PRI21^N?ovwUyzlfnU5P$=IGDA^~G5@Xx3Y_I9 zu1pzsGCO%4X1~|qCkrRvVz8)4{TNvweT3BK+!L1Z0EsVa9=mPsp|IZIab_!$Z#=+v z8O2j~tN7d5``T{@?VyjBAogt%mfg#HzY2ErYBf~I)2ZHK&d?HP;Jdezc268oc^~wv zw0rucqHVJ7=`!+F{~VV(cYE|FB0KCo(FV{XI(SB_F~#@l;K!#Y>(6NwV>G-?O3Z4SIZdJ%ahg3% zQXur)?5XS5JbRx6Vo^m%vV$H`mrRd8tY7HyztC^c<41KF z^k@eU)tDYBHqg-qOr*)AlQPbY0k};hBt{ zs!u(99@fJo=<+Gj(|owv3NC>$E-oRGKeKhJ_M*kv#mtTYfDX`Fy5 zbPP^j%#htL{*gxQhfV%<&3Yhf@?V9)qMqJ~JdtMjorCHhMG5c{b46Q!?M3TddsOtEg6wx2Mu9WA65aYB#UdR{2U!J|lkK=g1_O9}8J06rmnQ!Aj& z=jo0Hw6)}lFT9dpD5_`is)wYZ?pU{QBun+<%pl+|6ZlDRz#=5u3=gyX6PK|srdOt+ zFpRqIVDL=eX7`mSGL_1-)|^5` z#D+3}nIbA86et&&8Otz4svvZkb%|ws80iJpuhZ2^EY4;QBewEz_9u(lGF!o)T(gyr z{tg5d{^V<9E6uF7H<+s|Qa;+%zx=W>=s4thU{L*L+<{M#m@nu^%>9dANoC^XKZoqL zi|>^aNTO^LsjM}hU@=Wc_x5g*eFpwEHG%&XrTPx;*UQ`wvF^wfxZk?`Md(zlm1r8* z36I9<|FN%lh^!DYsH*4f8jINBAOAM9B_HzD7*Z8$Ua*@TItUbX6^8UC%bgp;39B3V``#`RNfGNdf(zx?@z^NmVILWyaNAN*B-G+zeJma z@n{>K)G7Ejt8iJ%Tw}?v(FL)aMx2P6x(*4hE?5!+Fu7aQ4WSvAFo=f$6=y=eoY2)7(N@eE=lWs#q0;Y2+z|oiK-{5Ls7Dl{a`CmJPCp>qy_RF8zYt^K#Rq zts?bYIt*oI>j=&lMUn(=sJGz#VQmCz@k5Y!8$N%y>=V06;42})QkuE1cL3=SYPU-b zbtj}0PS&898UqNZ?!o=N9Vj`si~%H7>4{_4WNhSwv+k!Ho~uwvzb{3TIeu6PgHl;f z5NJehYG+N2&4O?q7F>855DJ!RS)|_AvyuYCHyG%E31#!l9vWdo68oA2?~;MAJ|8jQ z-t|Kl60Ea~Q1t+!4#-S!t~;=B%Z}o7Vkq>-8;V-x%2*qhQ}`3w*AnR7#Z4k%tVA!4 zn@k1ZW6W}|+=$+qi-uo}{)`fw94VBu&p1+Oe>}nCoFXv~YoEpuqp-}x=Rni7w8zGY zSEhSx2)HCHb3D*GN{@}jy)n{#j}pAF3!-|Oy(u?U-SIx?f&tO^$BfFX&&EMiCpgCW(7 zCo`l&!H}jdnX5A-?MJB@lDJdN59S!sNDQD#8x6Hn1-?EWG0Z-$v=!}CQSyRWhLkp? z@N`)`@rE-bL|g1bVNXIZB=(^YrViDtYKIiGu#p*3DrhjI(ISSF@xcr!qpTTH+6qLF zkk-l$(8fyMf8xn+?mt;^D0SL@;u}J<``k_+Ql&4e?r7Iz}hFVuKgz@ z>0*&@NjtCimB)EoEt7Xj=HCGXd1icI#Bp`&xUsrZvrK(8*%0ohkG;M~Xge}Mm8~w= zg|eYtC~9w`YVJaTr=?vee5w~#(=HT5jy9(#!97nJyHMt87~}J$67NFUNV`zPsOWa7 z$OW#olNh+TYx}jC1g=1jHRye1>EeUjPY#{40Sv=jD)(y_$^>?Q$VfCSd80cKM&(^7 z+aG935g>QyBAip_)R!Y6?H02kwIuCA0p8jc$?4RMT_{J(6>UvnZv%9OK@KC5^w$rr zczBrOY0ppk)2$}j&1RmMIGlE|HK}@jrJ(rIe;))MV=p(g_< ziaE$zOSX6`wwBCxpK)qy2|A?qqv)fdhcLgjWYXgl^3+ku6ey}zPfUR7ef=C=T)nUF z>9~5I?$J|W*JUsEiB)?riR(Aj{mxk#PoVUs301Hw{}q8J9BjNY1RcF@#Wqw|SGc`HO{_EPWhC+r{l<8Lp!Pln+>8HM|#2LcvNm!5b-R4=cK3{=LM)m?YP#&&u( zf`a;vy|C*;$t?i3wVf1tMC+q5Z}Tgv35eAQ808Bg9EQ$r5PldRmILuLd$KV-3FtO) z=c$sxB=gaGdENHZ7;Q-tp;*2))4L;1K)}l;0rmC69Ow zFll6j9vh=n*g$c4!~>Yq*%CbMwhDxlW&UAaBEs_R**^}7)Q+sz*FWA2n_`g=#GUuM z)ViGdJ&U%n=+!pr){AMtok@9@7zDp(#Usda;;0$N4G|YkqVG46urkF9mFbs#j^3WI zmEwm$DBn**(Zp3%q>W_F2(?^O`m)M3O}}isjb?s$mmO&E;rX3rjVhl0FMp#oI*0MH z3@tJw#<42*T*OC-Il<_4Je@dMNgTJXQe=LAi{^H zD+_tj0Kceh%A74D7E)&xrL)v|ovWks7?Oz_8rG#3Nx9s3YwK)rI!l8@=a!eRuQYfy zK^4%6m&rxyfK$HJIf-C~&#J~8dzMLI1|Qr4t6d@9eN&yx3YqyzfKn39DCK`uc$X$j zt9(`KuaH|@2zim*F-gyr3uyK=Wl)(B{;zGq8#5+cK~>a-#p55s3tMu+N~?PQ8!uW+ z6gVKDMUk!@&6q4o7Jze`fCHJiBEr>kTQ5vDl~8l9J%=mhUU?3oUTPByl+}x;Kxu6l z8q0@JuRi5N?;B^uPn@eqzG8UPZ~f7WT8DfSy;^%tu`4{*{0vD>k!pgz*Uq4jJ@o@W zTy9=c2*yUHXxTXm8(z6cE8cEy(zfR%PUf_>XSYnghoEhvrF*&t8dq|{P37SXps5nxG=918j|+l z%vV?DAFL^PGv?~9IYhb2ST)yXO)?^@6g;cH_ z7V;(m;9;$0ONIck22@tGN`h?AnhqGw;TVFuF7Wue)!2n9SCxkvLR||Qk~rW~6u{N6 zu(2kYqU4f^2Po$auX24Qf70{lPvD95dg*ZuT&c?%_@c7FG(>$= z!(Y%{@(gZ|O3O4)RuCHaY&w}7wRFey;ognuo#bLdBD^0 zi=##o0;!@+&6FqT+G<`;8p9Vel^x=fE^x*6g_aRtiVKx?Yc{@5hL7BUGL82MD%KBu z132n@O$|S zwpAwTWed`(#r>pk+yfGk5CT$ww0MIH{_zM(Hr0HCMp&p~EXuH;|6o z1;o=&#G?vgY6;9T!`Bb#7_q?SwXn>S+}|1JsENlLNu8{^!I~yss%P$*Jmk6lNDq_F z0a|7LcBQfS>j`9A9`F4-TIou3U)W#clR4M4?Wg57H6gV>k$H@8G&Z_W)n}zR=`rgl+lAM+x>`|m0%xWBc+#$ZwnXx{3)^$L za^mN}W7mS9?8oHU!A<-WdujCq6`H(@NqE$Cs#kiv!&T|8579v|KzW$`A56c}S)M)+ zg|IX2G*^t1CBzt@(NQ`A*2=3$r+`)X5E~Pdc2)Z<6gQ7mf1U%YAm{V?6Q?HptAF+) zRzkHO#~c`P3|wuGF1061ImX9JVRmrUpoEDgP}XS_t_75aVHYB(L8*8ECInEXt;IDc zc{hX7xtCCYUKdcV2Pm=8YEZ5db!B&K1C%-2fuf&FCDSh+M;Bq;>Twj3q4wyr6JOh@ zizfuxC(30u=l@U}g2SKLl8dv;k4?2MDhT-dpS26^5e8|!Mc66D6j;SD3*`^%B)}96 z1~H-z`I(GkQu=Cb*vuj29v1?!$y^z0cvp>W462l%>DTuyX^ZkY6th>&Kht4N{uWFh ztu1LDVlP2rYX$o_3()fEHZPdF^416*SCEWQnv_cU&9AG}OqSAGm+`x1#gx{nj7t;4 zrjkT0)ND=WWOT^wj6Q~4ng8ke^X*CZOz|E-Ra9R7 zOp25Z@GeG)6)lN$sUxkfsQ$DdpAAZX;lq|tk~LUCgUj{YFF!-cmtS1ZxXhtm@g1P^ zDNp9+MKUTTd#u1`@Tl`oBP71R#OO0%A1-zL9HCqa1Q-))$*VX^R`tU%Qu;Yai&E9; z%^{{EjE*Rx6Nl?)t|+1#N6O9omKywiYwtz%O3W{T3C-?cY`x+|ANWuEyA4trLvh|a z`fu2C*D8`lZ_ReUke~58__);mddWV|*((g|Y2gLHiC0GdTY}^0Ux>|X0__~AHp1N~ zS0g&IQ0vUbsp4bl?O=}^_?mJmz_RD`;c=%*NSSTX6C3acsc zotD^XX+NffyEys`q@ho^=Myp``IA_IzU=W$I2%Ed+4Of=u`-IJ<(WJr5X%8 zJQ+2qY3W6?Q&SmwZXw<$$_WTq}bLJ>*DH2Wt->gz(Lm!sL6<)qL| zQ2uf*|K|VkqVg^ZPneXbfAm{zb?$S;_!j+MF2=X&_e;g(w(@3mZ2e-quEC5{utg*q zYIRx_O|OE?Bx0f>p?Quo6}&AmXm84?7Gta?iehkS__E5md(L(LqP1&daxyfRZb3r zWwX3(d{D~-`SvKc$i4(Doi$k=yoagacT;Iq27qtZEo=O zf;f~(G`kT$?M5f4AUXj}upi0TC!sgV7%X&zZfeFnnsROR@9XsM@)i4M?1|Bhs_1Dn zGddmJCFQ-l>u%Fsh0BvRn*i(uqdi)dQHMqw-zoi&>wwzn9k^nCCBo0HTW1%w>y~W4 zo$@GC&D^HR#J#e3GH*_kIhmQvTUGDP-@?hf?YbxPwm-kg1cf}AX+p+GyxAjW6 z4T_&2m~jI!3(wZ4;@EcOTKphv%VWsdNBLkzW?NRCynr%gf1flc#62EhDPp6)C9e96 z64`9nG9=J1EW-3#;o_2o_;;6!r6*TpY<;n{yS0U#BWvsJ=%JVKZZ*s;^g}qWEv~a- z=~n4apX!_}W!%t_rqT80FuG1^(-KNt%BW}y;bbzl_(C>UscLJdr7Jyo3Wj|eSo-NM zR@d3Ey7Eh@zl$v|7M(!~lt@gk(=(|4zJO8n z8O@%yVvl06t%13<6(`I!_VU&ahk@(aW`z`-C{>TGyr#oIYf33K-L|n7mGzEJNo*Wv zD%+m-O0gXW%hNIkzE>vnW-yz*Vl<=(*ju74nfqi+-z0CC}STOKsw^fJaoMXU=r-PPrk1vf9VqdJRU`^DR3afx&N;EC-Y{2-#C zHTn&#j}FokH{AcT)LFq9wv>Ev_`(vqP+CUk45lY?AQxxI%BY<(fbzHg>~iE}ME@G; z^vV2B3fVrz8sSl%bS_q1ZFcFfT?Vf!`*fHiSzOBO%|S(qs+4(2sa)eaLjbny{mQ5} z+Irl}TaV?+V`Gs^g$csZr zd67wd56ctZOZP(s-3%3UqZK4A69H$yEsQ8RR9pvX_)!f6jXq$Z2SI-pZxl;Rpuk8< z38MN@bJ^&SnP^`wPwDuIMO>uRhHV$8Bgj;n4!GuUY0Zu-1WvwITjBB50#CVKg)~q3 zGGWl6)~7W6pYF6*L43qOP5@~~R1ax_S%7Dlu>v$%h?8XxxjM>(C39K`qv3a|);lM7 zxE(T6Cd6Q$aoeM-x{rc;%i}(Hz_Q48@yhaqASEruhgYX$^M$H`)ZZyWYisWue+W=v zIur0zi7o+?&R3;FF$1f26xNJ0g!|>RpM>tjOR1mH#byWT5+9Vycej_T;;{?WE6YZ7 zS5bexd-rnZBIK-1Ef6M=c&Y@o(j>41V$+Qw80&SY7Sp8>gTg{2LxMnMb|AS-*#t@+ zF-{FOjT4j+ZWOJ-FLw&DEA-4~+ZQKoJoln+Sel&VqVVnTjJNH925N#Un)_IOebR?9 zvu)|kFj8V{U?hMb-W38;Rl-3FVIZrRAnkaGGXlF@3DJVBR_r{P>nKz133;YXtzRXC zpsknWy!5TC)4IQQeJ3k)${n zy6v4Qf3#eA;nIXK2vA6RiEgSfg}U%uVK)bf$%imZ70~(XwO)uDocOHPp1y*07x67ua^z2d$OvQqfyo9(4MMLQM!;k^YSdKlm@h7L!dZFPLtY!PU!Q>-#GT#i&le zGb~c{>KV*eF>xws^Jm9*sl893B~)JbHNTgfs@uDk_Q^FMmd&Jh?rOm)st%jK?ne{i z>YZzM^5~>0MDU28>uQCodwr$oMR+~;!waKZxzS<1(&l_K(CB$g-SD|k91p6Dw;E*< zJ*Q8#Q2uoF(5V(aaS~H@#*h?g)mD{!Ou~g8cB6+Y?jak~DW{kBudP>IUvfCroh2_x z(vREPFrd%)h^^`DSXg~v?M_vO%1^v?Iau$%xpmXAt?}ge%}3v?cZcfegczg`;mM%( z;c-guYIT|QfQrIu1Qqp;f&7k#i}FpWno*u=O*mDB;>QFQO8eTbZpw-tJpS$$nK2(S z!h}A^YwhY*ca)BYo5K)w*)k=Q&e%J273UW3piMkp|6?ChJ3@6ceWW ztS}|C0MA+xvlv)*uO`Mb9rq`7@A;1VZQa+Asx2gA3-r;b_UZPDb7 zZzm8)^T@0kcjVJ$9`EoNfEQEPNIDGEVcG-?impU)%NrS$%u@CphQOXJl!;8k+!HHkA}_Qest#g(V1q!29=^8)C8T0 zHv3#=+O%G#!VL(61L{;h?hjZqn{xhOeYZ0&5-L2Mr?V82G4X|y^;!H2w87T6A7Z+ewO3WtaLzD5Q>je)*1*>`; z_Z#D3+c2f=74!&sOl*VBwQ1t(YzR~Sl=xwdUto*9ZPH}X2UNqaSgWA z9N_kaw@`DtIw8U^rmItH8Y90OW}u_T9yRISqQRIO6B@zQI&XMPmW7zdl%bg_6ssmW zjD}2<7H0AshzwtkRt3Y(eXTVBh3z4DZHSSKJ~Smc%odf4KE2iuBpEM*^c;z#$C!@J zGGVk{3EYPY6LH*9QvqOIj;Bz0;yBR&Od&D2xHo2u0vUuki5z$-ge@kagzYlo8YEAg zx0W*rc{JT}APIdSeD!+vdu}bO#yvEF_K-ZWv(Kv~O69wtJn+A+FK`J?-ev+j1Esvl z--aTPKk-~UG-fOxf(c}@{2cOjS=%1rM$1TpgY%zP14`M}sPj%#aT3g{I-q^FAv&ow zqWRKQ^=eba3z}Tv6RSB3o@vPmZ5m~VZ%u7di#Dr%{$?jK3Tbzefb_#40qGV&0#Z$a z1h9DJAre^_f&dwOK|K;QmpV4epE00g2K zO@YUf)KccT`qNK+*4t^T%YWxL;^GUrWfgVR>{Fp zB2N<2H18AB#IqwfGW;p@68i)MiLMvXa0cSA0Yu=v{(_W(r57y16W9hnw9@WR!%BfW z)Od)cJG+AA&j@d|qfPB~Ktw6h_x({za*Vcf-o|nBv6Av?91{^`i3>XpH z`S~F4&mKQRnr@z6#POhzTDN$j&qQ=SDcO(Xfc_)&#OzjG-fiDR0dJAaW#d4-z9s zea|fCEnd2hty^3zW0)+dUFA5yrMzN?QXvXWAhY*y24rzUSb(e2a>5i~lkP)n9o-P-BfqJ)Sr9>qkS{4ejN5Al5VT~C_m5t=8F`R)G0GZxkYrPyj}PD>Lgd&lu+%@h;@BW zYw&>h&`*C&-=TIlTpCGf0KY!vr=fG4>4q+G^g{LV&!}}3M_(Rv!W{~fp2ClP4L&0$_nBZte^9)mBjZ_Sscm{D^$w03YPBg? zm4XwdAmnBvCYy@B$B4gUz*+FA0gn2i>6T? zGt{UM9Z3~-9Es_b%088FaWSf6-3%-$bv7wqQk8z(l>$TXc=XQR;9!Nl4SWp1y*spd=a1=M`FB8bZQK?Q!X1qg70zy4P^#Rw>qvJ zIuZHrfm3gD;4-X>>Q4e)I^dBl{Q$)AscFWDAJL&<8gc7CRm@be-TEHP9B#jFtle8n z@V%VUj*Jkcc7W>>Vy<^fHjo{XB!w;#T*{eCx(+pqIT z%CTO(&C|JDSHA6e#HDRhPrfLsDSP?3jQjWB*M3`6#LOwzk<3+q?sNRqZlT4+BC5_G z3afIj-A3Jl9;8mYvHXRadfR<%00oScJ?s(TDL1UD2?dw(i&V@1<%Umv=6=4HDn zeYC{V7{iLR3_iHKefmDLz0P!;w#I=3TuN`FiFm}mLD7_+MLkl3t*0s2yJky@ta$co zms{1b(O>2j$i@j9h4>%fKL6IA!g&{Pw8Yy6e|x3SnTRlXb~#BBdJzw{EzMFMAy$_W z8gxj!N_DZi3@7q+tS(Dhds(}6RCaN>YSF!Rk9$;`wD1S zq1An)GhVGe-u8#mR9OL49eqC?^0X72-L;0U+~GTRD7AR|lWp6eO7iB^{aWOw4Q(Tx zc=1)qeo=;2Sk9CI(0k#MlYMhB7IiUAEYJFzfec^5Hd?87i~|bHomPc50a~f1L0$nx znTkea?&eZgj%qC7wM0*IanZeRmT^u)q zA6d?^1Ft7Je&E$mqwM-?pvJGY5_(LjQ4lFk0|{+3XC9%!jO`>ZhQtzK>39Sd@Rdg> zj4drN$PAp$_af?AhPt#bwp@Mz=M`;Dsf&<<>!GeXz5v!UrLJ7+${W;`E8j_7Uk?}r zb&*iIHXVDZ#PhWqL&_PgE2>H_BZ7SxUjJU>YHV zrv-`ti;UhfvyhEWGqxj!W7h8TZ90s(29lmEOw)Mh%*so~auiM&u# zSn^U}qM?KPS|$TRxhJHg>rR-VGg{KUm3UAEWA3QziS6PR9BZMlG|<{nVv4%krh$8{ zQg<47jUk#a`&8%NNTI+4L0h&869Oyrk!5nY*T=0ag#H(3=?Sz(SFrg+F&#Q!N7YK7 zJ1aF1%3?5h=zB_PFFaDcn&xVi2LKeL+Af|Ue?rVrs&2j}*DlR)S^GllDmF>Q^>=yKXY-Bdh_@DL?9ejKPo(6GBt>hQ z1XLpghmJ}J6t}XV?nrR_X~b$L$e~Ly@+ACx@(#S-_#9#bY)*1xB)PGg<%TFH$&FFS z4H_mw-PP6=?yPHGa@6&#Fj?0uIrJ6qS7euFCHtjRY%R?^b*5Oethbq?=G!osV5N=n zPs2K*Fcdv=7x9`XY_xaTg(!b@onkxj+IC%dUEBu=HHsZOqmWRekWePqRi0TwjU=J| zY`LQV(iJV4u&Y=WIwZckd>X=VcsfKkgm_KD1!ytA3}rwju>^Ns ztk?(xaH`dcONzE3-lVd%-%|7lxl)&{z}Ctuybm)h6fTtZ%=;W~fO9n|uS~Gxn9TT= z7cf4s90Fu1Ix{}jH5V|xRiM&PVF$tZe9qevXS{XHc!T{e{;P<}85MT6omr)IAjY?x z7+%(16?m3xSK>bL&cN*k;&$R`kSWY<3XO=n01itJu1Rkl)ZA`2a0m!+I|q4)4MC>h zbMQP8+}3KUovGpveIOTZ122Lql%i%BCKBdHYOMa8X!xe&z>#3#9kfk)7`^u4c8uW7 zh{0eRCs_(y6*duFq$|(}rj$6zK%B(q)JX%SE*ME4^=lwT;#^m_Cf!oq!d&Iy#%L&@ zxe`tp3@*}7gSP(J2OLR}oa&z(e>g>T0gSN_R??vcYlwrOzd_KSu|{1q{S8EaKe{>? zSwmDZwdQ}&qxJyZ(#q(BQQ9M=8$az2Re#2A2@<_|2oU6hY-3|R^Rcr1g9IsWeyCj1 z@6u!XU9O(w*^?K(k4)B3095FD;OWNsIXtr8ylR z;F?yH=yZ$|LcLJhn(+|=3YOH*E$$>uIk8ATYvm#RY?KG|vsv!bPq*BopRHO^9dfVOHsDxo4A&hVYXVL^9S#Kps&5La<-^^vHBa7CU?ex?U~flIOW&_Hl-t zOc5N6RmcE8HG%w}EYLV_P8`+751IcHYLYN7U2)b~x`MsNm6Z9sapWI;mY$bw9e`63 zqCcp9QYAoMCBNKXm8GgQ3c-hp*iH1CcDcVk4P&`gmS1SDWqePUg_r$ z3jd~hm6LPz%7f}0S)cVYjPpdT7u2YC(mL(IZjt=H8jaonaWt$k1I5>UD1C%(4U``8T1!qY77=g z&eupU<2DE(BW#WSu8qxTI`Q;s=&wpM`kNGTZ9;$Pk>FT{dqVn*%vvE~_A;_W!c}9h zAl0u~IDr@e0plOjWGwd-BrG>(CoH$vuCbi_W9mWXYh)Q$-D@#5dtz!vGgyvrNUa^N zXXrpZLsNX8?xx&{sJ0b z;W|g>p;8*B-aA;Q)yE)=vO)`TW`_a>+m|*BBGH9sXma#@X#ezH=_qlMY7mqD``|2n z?;h>dO&_Q;Rsvrob=b#;wO@dQcF|x%J=$Mp(Cy*X+FJk%XUOSo(kd|EbVGtAh7l-5 z$DQL|-R4Bw1NF?7^w^#&_qXndEV0m*Bpj zx-;f^-+@k`(p*~^b^+YW_&ZK6s_yAx$dfpHOw0&)cHBk9zJ2coz9;e1TmF?7HFG5h+jO#O(CKW|{GJ zZ=H>Ef1RQ8Fnz9Z;0QNmh9Wji69+VK$bAo;UaxduHejQS%UiJODuluEQa=5S2x~FqL4umYzur<4; z5#69G$?{wS#1qa+*CEPlw94j@HB_MkAOjsQp?wjRcwMS!0!}0tqqX#m^!#|HSIgA# zS25E>ak3ZDoB2XEl&hHWR*+$nmH}q_uvOhW*J=0UF>9>pB-Qx!GSR`~F3n*>LP>1` zA#srjxtF3)KR(b)O0AzCfvC;jcd@C$W?f`eNw@AqwX0DVM2Y&gpsmyw+IsayoJNs` z)=tgQ^J#N}vWFJEQVgi9nwMjtrSi1wYS#Si?!t*mleN1YgP?v?k{XK?I|egSirk8R zoIHr$5v##$;1J?^IbWaKVr_=6{H7FiJ`gz5_>{q;{&b=!0Rg< zRC?Bx-L!PJ9q<9N+&x4~NAvJE%-FPJEET#=`v~)tf$X)~s@d~s2_Zu%D^oNbKll_G zjJ8YU(JERjT~9~r59qrz)4)JEJ2cw-=|nzWjaJ%abP>hUb$PUS7^8SPTIL{YYk9I4 zscXwq4Q-`tsB3Jwn9?oq(ak59+M@>D0q>s_EP=6If+glT#pK5y06JZ;KZHk<-aNXX3{DaC@;d3i3iMT!sU(xzJ{K^3}(*9 z?MS39u`a0UytaWAQ{~u@ua}GjEJ8-((DJODMG#4D0nnF;zt9+L_DFu!9Y*srY%pOO z<6aAi$2XTd5-)-u-Q-x54xtGo>a}>=Fd)>ka+p6yq?T)vM?|>G@dFdrHNYnsF()sU zIyQH;+~gS@DoIt1nvI0=*3W@PGir=RvIO;{W>OL*oDgXouH+rwRjm9(zrDwMSJ+G7 z95sroYcVCbxHTRq2e2nDiEYBa#HjTH9YNt*fZ;9Oi*;zt!s`Zfk}Y=%8}Ov_L_Kok zn~+A~Xxgy_7LVHiN((WfXWH<4%!OdX=A;zDFnfx9BLR{u3hfqggJijvTeorm_#Ew za=?lG|Ts2YY{jsjS8 zB{dLrbU-PWDKa(a&43!Kp*?B{HoWenUHx*88o@#72|1^O6v%P}UEv&5BiIKtVtkA5 z`eUbs?U(BSi{5QqmbN2n@e{8Y3r_L2b0OPl@C<^aDA~_HP#D zvGV<@et5M9acY?ETIc>PNEuD9T)P;hs=7}p{vg`1V!+Ic+UhA`CypmPLoS@2d3ck= zdpU)YZkr56ntnM(m8MI$sG;aU);)r{tbHvz(gE6|PwN+T3I(Hvq=0YTPT&Ny)*yXB zFij5%yPGw*8tu{z9tcx7D#cBsDFeXNw4%`**eCx_=B*L{q`Vez{yO^@!Jr1`sTC4Q zdDV?@N}NaP=1kKTA@7b{4BB?a)5}W^a151=iY1ZZ2K~`Ren}wZL))#-!S5`)#VITP z>E`F!?d2y+Law`7qy{{WzV5R2>7_1wE3GjYo0A>#0`AKD*Tf=$0kEu~Zd48jaaKBy z5nk9jyHz0}Ic`)tFGQ2 zilP{NwA1#AI-%b1aq5NfCQeMRhhsq;$AOk2>P1DAMJ+dC9LdG0$6A_hJdWgUECJ}5 zd^p1oOdN692Qf-GM%%gcbh_g316Hb3dmWz2*kx=o6U$n%smmu@tvBr?2VOK zzT>PizKdLa?F;wuwim;ft7m9;MN=`PF9Hf*Dv=5e_@0NZytv3ycM6q~YC$u9gt;p1 zRkdj*J7|1>t9VSIiQ|?gQ7=%5M6%mN$CX;5(caevXv!!TAlB3&>u7*unvuV936o^> zrw%Wzrlk!h8vSB7W`$+x9s-jec3SHv1=$v-0llmXiZ;8Ja0-^4N4eLL^fC`K|wwmIxlL{!FhpC+$>f`BIp8w zqpwt@5HjLIh^F(l`8J`+o5Cne27xBUun{&&t~0%fgGr9RA%s@PzD6mqfsX>BOe@4z zi)ua$+?K&PHvCrusVy-DRDza4--IJkWa7z7)J{70Va|jQkKA;O*alNV(+cb*pn>|3 zpqZeC(O)7TRo_sd3q8pdZ?r+(wWmzP1zM#q_XR2Ts-NUxKlP-iklk2Nq#i6LPR`)4 zW#-o30Wng^Ak)nsm=*S}vK3+t9PsWL!rR1e$PMucaWn|vdHsT4KdE1`ygw@dFnEPh zG$6>>Wxwr!UWScfjxH=fq%qO$iB6H30idvy5lm{1#l42@7&!sc=PLLca4oSNCN^Dx zW~s)hx85@W5a53iC7<4K{Cuv0ex@qA)fc-VO-zjNXP9&lB0uV^nOK7mLDw25aT?zQ1AQ`G85k5L9^M69vcw zKodWJacQcDVjJD+6A^GW1+ofYB7F^2;vk_%N0Y6wy)EYaUNeP2+F`XU&Z(ucpq&Ig zMQ*5o8E;gU5gsH5)g9N*j%Ok4uts%+f=JV$sp@Q?y2qoD=ribf`dPyB0(A4KL-iDR z7)I?H%i#-xRA4!%d|llZk5aeW)oCe2zvPt+sBM{YU_Yuy(5`+3L%UblKVo9SgwJw)@nnvN%EAxanQa_Jko>nEEm_~8Emknn~E~az}azBBzM$ua3QbP`in4`v@j3M9 zv9JaW3=}31=APp7`h|6T0l5@x-JIid3Aq}t?ZF;lf4+E)@hW||s+TG#cc>t!L2x)hlD z%yWe|p-8>(VM)7@{WIE9kAx?T>pX@$%=aPm>zWCWX<`u*AZJO{WCDDBNv8%$X!cF( z>I4D;Wa~*V$jlBx@0-wjna~T#MZUR&=02?crWTOUf%JO6f(6K3*E0(ch#m(-F!B$Z zsI`29ZlMZn`GOrE27RmyA{7fMK9)Y1>*$u4GzEAF>T%37iYu=_&balJGx?WoZT-o} zM+G{4E6^)=4Vq|P^`7N6Nf6@!slNzzLM3@|qsHP7GX#k1<3cco@=V)fSq;|I3#^Dv zXd{u^7m`|L0RhXhwNu3}>3fowd|Jl399DXh6RVpX3=$Bcik$eXU|UZsVey}^AwO+~ zX^NKUkz1mNv?MKq9kB7}1~e-0dOHr2kQdTj0*0d?Wax>N!+r17+&rVyhv<#z*@0Oi zzZW7e@R9IzA}!#3LR*H5T)S6U0E2>TT*dwewhy+gV zj(nAiP^sb4XuPy)IpD3{R&}-T05GMui0zsPq^ki%$qS*s_^R}s#LhGZP8-w;g7lt5 z-puEOZ&WHN31rI93Wu6~32>2*U2+aOkMPzYUziM94zkgTwnUD<$n>;n^uSRgLII9E zl%XxvD3E{#gl_rk%$Cwr)NN#*vKykRzgAhBYzK7*b)n7Mtjfa1Bjj#@-}Vb%x(mIZ0fn^t@`Qb2QYBtz@OOwiCx#!e3(4ciBZcyjcBv--}#l1>gt5Qww6jx4$X;f%yOBh2?bfK+g zbvQ_v5QBDid6y`oLllu26CFg6{I zsqChJmEfm%WvShLQX+Huj~-r5YlQ0d=vdjd$~Jvt=M~>P^_15u;WO@nETd2zNalt+ zPmGU=KtVXiIhwe~9-APz`PU@{4;IE*m0Gi60Q9ztzDI6_P2S)Jeu|!&lDRF%DU@pR zsi!z^rA<={8s&-9VtK*Ts4V!MjZ&(NadyO9wNWLARqvLFv!~4tpxLcu4L7&U8rFiA zDRpk8ncVGWMtcRnh&bGQ0lmVxDqO9vaGO<3~H{r=JN8<_tF=9|fUi!q-Nq)ru) z5%`&vZL&=kK%5muYI8P_+sri6fi*70i6JYrF$fY-ems$PN~^+~KWVE(CC)YJ5_$JZ zy&gekks4|G>2{*4PvXOal1@TNku${=-?HfGRSE5DZ-|&TL`+EYZ!w`A3K7Fu!UrHbrb#kUh=fPKBc<%IhS5~6FIB2iQ zD#eY^xurF07tq=bup{v9Bs+p51Z_tw$&O(4_S~8_=AhEcLeTw|_UoNhX>CUkMhNF& z{c4ZQLMgxeTS|5WD_T;27uXRqjoOZI7?T@SsLakrDXp1&-6+fE3meULgig3*cuhNE zzGWQ1vLoEGcD3$onbO*hs9Rp!rR8i#L`GGS-LeQU0ZCbgV(mg^O|}KBc*vJ)J3`R6 zQAt`gK-aV*QY{+Y)oTemf^nr}KYOx&w+Om&;AQu+o@j~FF*2<$63)sZ1 zE6Vy@5pzM{mSGOpZ$5*_!fvf>ekV5r*uFveJCO-Am4`#JO!t4f_v*=Q3gC7cxx zcrBUwx^i%!TU*m~5<$dIR8MSAy!#WZ>-&1b%8DR_#_71zj`T;AMroW@BIB{u#kjPh znU9@x9?dAXDj1hmCu4D#&DB`j<{MNj2ee*k>EZnN6r0BQ00H0RZti%CQ`O`{#l3Td zS9qbo#yb|1!tksK1GLkE+}ms5zbk-$wgLR}Jp5@X-7D{0TM{$K@P6Aa@WwNt_|T|= zj8@UDpB8|1odNu|53m%XkxA3wS+ZOWFkTD5SxA- zZ-&yEk=MQ%HtoaPZiGW<&%#D2tr>aU=x%PA%*e0PA#?@*7wm{_fM)6KlIP+mh=w3&5n)C~C1B#Me zOgx^#T1*YoQpefmH^V@ln$C7MnX&OfHhVwgbXd8Xou7!1Pl%T#+uFu-Fe4e^Z%%A3 z+178HwXHJ~oOx>7T2g}mPAN%RxN8dPr6~G&l>IJ%&QxaP_ zSU9=wjRRQUIDl2><#sAI)7)9LQN^VT+|{z${>A~U+79LueBU^LmFRo)LPga`b;~Cv z!$ki5I)L?!V^_g~=^3&`l_iQJXFBqd*~#$6v8&syH;!G!Ak2pk6Seflv8(7|ZydX- zO<8XoyQ)Y7IK;mP$FBZV(Qc=}xw0+Qk}c<~ny}8BeNx5gvRGegb&F1$NL(L`PE0lN z%ixJUS)(7u^DO_I1Dm}8Dao7Ikc8*oahkD-rd1Ve%4W}}KS@<+C8kyBys$+N)Uh^a zD7>|W7rD}L?`VFxBLwK}(h+|a-{=(TMKxDC#+J%1|2F4Kp7ZeHAY7`Ci=SV`kIc#- zyHQg{Z!WUu`V`zU7r}j~xcdp~v@6zKg&>1&R|ghP#%v8pRhx zh@V_#==>dx0?*kyiE&E7GbA*@1q2`rHGl6Ya~6Zr87OvBvOq%3b5Fc;z}vzaQ&QwF zqbt!W%Hu=_(5dM#JnRwF;sS@&FK&9KzxpT~E?%B&RsERdS#+q|E~;a~6BY@vcVy%+ zGiWn@dtVOnby&3mO5Sm59_{8!v!1^n0qX@?qkl?Wm)w8{-~Zu5V7x(xau;H6fD|A z3k#^iYHzh_DSVjS92$6m9QW2fDju@mk*Gj@j77&~X#1Uj5hcTafV z;Er*>&gcM7iNVLHl^8M*qhUvQHgvjMW8|-G*7MXtEUbk&k`=oD1DL1$V<2Jz3{9r1 zS-zT(r>^GmSAutq2!sB@v8AOamp-Db^ghV9aZ1!IPio%Pe4kAg4>b9H^Q9Ym4NIJr zC~&{;01qrrobp5|Rk~IGfwgYI=D77iYryG6!?pg#%DS=(1Yf{O_HUe{K&aF)dh#F< zV22`28fSa;hTkQwmCmCC#52tA>&fjFqJ7^?zL|#J3388UL^AzKeu_o9f0S$?#BaSOYbO z>-~FLHyzs=PmbSw^q#43C%NT^;I7m@JWgrTMWqB5f{J>_K>kM$7r94i&9!Nf{~HW7 zW8bg)o6P71hO%qMe%AU=V(fzItqCQxRU!!(Qq2HdX|w?YU2RB-(8vHQO?$RdzvexS zycX*n%Q{+NN_#&mjIrSA5F({Xq1Uyv>~I-Ho_pznTDXs*dS6aQBF`VzyK*|nz9_2m zBVI2?erL0r Z%SYDsTz9S)*=9n2bUJ($aIlhx|Fc{0Re0Vo-NNUUGRA_rCAP)c5 z^I!`c8ZG=GMlQ{hv`+S8Jg{~rnAe4c?%muovPNmBo4kV1*!kzVuHD5q)sxsB5=&ts z(%v^=mx&6JCo})FM}dIdbRxMs)fHcal_((2M68ZQ%Q70FNKrP~p_tQe2gL{iP$Bop zCmA$5^+}$c^vRZRiGGs|g9Do`je8wDwb@dSh6x7BbahnCF?BGT?4M#IEY zv_?Nuh|j5aC=6$%IJ#R3;$RDwcemJ4 zD_Y2`j!Lo)OOYv}sm2np2j7ZA8YLe5vXGJ5TP@@MssK60#fg-AtFeYrXZGr9q)Lh$`Ih&1XWxpLukL*<0u)5TC;8#*&C~oq^CBm7a7`kTMpFl=?c-eVs1U=$OC|x=;aG_3NE=wJW%n{r z!&)?g8gPN-W`&+VIW$H|{JIulW3viwL)#($B9*Q0Xkv*{dE|L9p;oR>Jj(pP4K{Rr zuu!f$REzwHQ79q`0)_Z;!il=;rBC7oo0gFwho?;^&166+M=z2;(49`qBsSSHnDM&K z2%2rOTH+hJJ6F1@{_Rz<$z`&l##fXEhsIa;`H{o7zIO8!TWlgd!v)SAGNe#=4r=F z(339Qv|vgY(UJ;!-ONS<3}z#&psH4|$Y3^74P*Fnagz5t>(jX>%`r2;v*2%+Q?RO+ ze(X2q9A$s{sW3mQ%YP?5`a&-GQoeZU#q`cEeIs3b{Acr5^A%bwZO(Go1@t0Ne0L@`DT0(jXa9gJ)Jc&BF=U8DQ|h z$Q4&EDGZn<%j1=79CuFVEAMtzq6%nH``Mg{fqX~j@TGD6*aRhoe|>`e$=!KYrEF)2 zph*&*;szvF7%{pfHz-G_M=98UK(N1p0I8XLYFwpv9iC`hBh!iqLv4@I2go?#G!$fX zEwLy#cJ#?d`TNb*2l>15p-FE`JhCSpOzBVL0%Sk@l*CDNV0jg;Jg0MwK}I?)S>4Kj z4BrBWiAf(qz$D^?f0LV^xM#9yaDK;l)p^^Tla?JrG|je+mH&^ucY%}Rs_y)|s(N~Q z`Z3dzM$gfsx+Pg7+p=UZl8j%ffzbow*citcu!(sEXXF5qg=2`Z1Q=u9CYWHt%Ycat zv9sj=&x;NFUqeXZe;%y!Ao2c}?B670<0Sld{of=T??3EjzrS;DRabXck2HE9lYgv_ zr@HD^-Fxo2=bU@ax#yls-Y`xkBUv9PVpE7xqY>f0$d$6yL5b2p0?1bGDAMF)=+yvp zENZ#di(|UGuSrkc4g=dJk#4BqX@+CY$pXjdcR~<1hU0WY#bgf0W#QPrYumnz;&>z+ zt8L+!A@Vq;`D5ca;*1W>RgxKyvm}~h`PMh_W^hJ`Q-k=0f~cDky8yP7T4W1ZwMWs^ z8Yn{*ZIgbOG;=X2M3j@F9fJ63hx`=m83=d9qrwiPMC>#e<3>Nn6s#S_BFwsysM>)C z4LvL+tDpw$&w))OjYyPN zCP^9jHwtN@?d{c5OTwleDEBr}LwkL6^ax+^uaevA!{`iDE2C?$TApT+=f|uT$G%CG zswq8!q^e+j4-C4C?PEdqxm=9!3{8@6M2vvqL#&@uwrqEW_+1^`pIEvF5g#INbYGJ! zfC5xJQzNzY6j>bUeL3W%hh`pMn|-}Ne72|PMKy9-vj)n^{CT%uvO zL%0hTyP+IUIIzYXSmgEOABWI6un@n11@;9Ns6xp^f7>}~${<5an z&ahwIQ&KU%{VE|Hh}`!OFo_(qDAyDLn%naTIf+)NJJ*UC8(AyijC6K~G{G+SXZ6^y zk6xj34%A_%JZc~{@>Jx;FFu78dj-c=+>e)&y=Op_i1_v0HDztfWRg%SRQiLLG2nt{ zOeRm6-3{tD z%rZxeuA<4P2ug9NTlA%F5;R_5j`SR5gactUXf^tyH?_%)v0^wA&QJZP=zuV%j_|~7 z{&Ll%N(B=bN@z~0ka{7dqUDqddgCP)O2u-gRA{JlQcg_`%W7!{DMX}9>C`|4g4w{T z=fLWRDYqewZIZ}zdZ_M7TBcxuyhr?EjsI2u*1l*2G77zdF|ZN1OE&-V>*O%tRvc}G z?~6L8B$PM%=Ymogl}Fxm>rdQP8Lhr~tX6+Zqd7j&TD15lZ(lO`);kU_UAFv4u;OjO z+k=&>rdGcrShIHBok860tbb>4SFqt-!QH{ev)&!NC)hN-`RsGfeQ)r-V9Wc14+I|! z&buer`k`Rk`OkXxPX!+iF1R=NNbu9abGGl;dEs+E8eDYoCHDm%3w|cJ^s-$a50aVZ zJ%4uhp1q$4_I)yV!KZ>x2bbR;d?t9|6+d+4XM?L=boJ+g7hm&0@cH0}uYJjNFMZj| zum9QLXmG=W!7F~`3&9tI8(;Zz!K+^Vn%Dm5>u&n7x&1f)`0L;B#sdd$ImE0MC1@d< z8DwI@Ma;eH8b1d|L}*@j2_K8_pgw`fOi6<5LAigPQaG zjFR>#tNJtjRj)r~Ro~xV^@dYc^`~9c&J}`s;i*fbG@UgfN^l&`4{^7R{fJT5h*8%_ zm%4HK|A{lgZ7Expq+DuLHqb{(9S)>p#98n z(6*jo&^|UCv~6b?wEKpGcEK42?W4m%d(IgK?Wc!>w*3r)_L1SB?L5Pv-8&q#i_S1; zA07_c#b+3_pBfI@C1)744-E(H(lZR&JqB88t~`?2Gd(s%?972oHEMhyr?pC*`D*t& zr94U%C_HGaRMA6BL>80Z)R8~%kBSLWOV-On5EH%QG(MMP7Se60&;|b-$lu9WN&BhHr`_;zgbZ7ZY%k%f|9$fnf;&|3rv(LXRl)yVP;k2n zzFko8lPdVLf`YfG;Li&R-mHS}6cpU1g1;;%_z4yKO+mq}D)??e!JAa@{}dD)Qo(;N zD7Zxh|D~YdpbDNUC^(>k|5{M+Miu;RLBShT@OK3TuUEm-1qDB@g8yDnaI*^jzk-7O zD)?SO!JG>IM?t}lso;MW6x^hOe<~<=oeGW=c#D2i1#c@Tc&!TFUQqBF6}+RM;MFR4 zXF)~GJp~0fs^I+v1wW#K4-^!f=?6_T%&?d78JZ#1)nM?xLO6D zE+}}B3hpl`xJm_|DJZy71rHPy{E!NMwxHk&6&x)nc%cfuSWs}e3VyDj-~}ppxS(L4 z3VyzzV6O`PRYAcX6@00nV7Cf>p`c(^1^-(?!Shw{zZVodPX)hNP%xu{Un(d_RPf6M z1-n%6D+L8?NQshPEhxBD1z#>GxI_j2x}e}<75rL3!9^u4m`8igz#cwLM3!RCDCEE_| z`k|#kR;>y==H}*$$Fy37B1j@u9La&X`U1K7%6(3F)K3yIo4x4Z=Cd~Kg-6Z$nm-*Ya{0sov+u^$Syp?kexFWvge**$j%mIsn6uH44C{<>43{*x>vaV zdS*TJd0H$a5}6M=^=J05M9KeIP_R)2zf(}KK?T2CP_SMF|E{2b zK);Bf`m}@GI8TJOTSUp96cofNc)Xy1ZIn^+e-#w4oh?fKLqWkB6@06pV6_VVV?n`` z3Z5t^Sfzr$C@5fKMU?!ff`Sz)c(R~ixeETOpkSE_{<@%GsS5tzf`UmE{CzHsE) z)@ipZF|QVExk5KO2>^Y+f?|tT*l$dzX$MJCkq#Xbh?k2gwLndsMo;J>fqNGI91_Ln zQm@cNxLRj<`VdZ+IYM|L83{*YD<;&j78B(T|m>tVa+Go@R|7@qWZTk{O-)O|IfMAcy#=c z;GyuLuykjz;i2%0ga^8R4-!3il#s%>z9@Z^UVk=-(w~c0+!wrPmAh+SJ@V|zr-^ZV z!}<>fp9&rbo>gt$9qjmc@Y$do>`V^qd*e0l4Z^YKPu_alWp4}K)H&-X-W7~CHlEvB z_EW*V!MdL&w()bp%kK}Cek^#!)XOG55qvUOb5C&SU~PP6c6!N2f|WNC9r=Oa-NEMN z7vKWj^qR|m__eQk!R@<#^1Sy1?+ng)A2E}wcV9{@=X`{uU?XP>`q`z1eq z{mn;$!_Rp~@IzPLam$as@-07h!-X%t_;oLQ-rN=YUvkr{_gs6`buWEL(_73z8owUE z{m7ZET-aotN|s(Bb3KLg3Yo1)79HIyF4AsmkDe9!DZ4&j;l;c?N4y8K=>@;APbPrw=Z)r_YEgl1u0iL4*YzI=a9PCFfHWk$qSr{2-2wIzcpB4IDk}((3Z(eWlMI zoZERfo7{64zm&=dFDn4>frSG2xBw&Q3PXw?ggCKU&JO~Lia?}Yc zBqn(_SK?2Y^7%ou2Mgx>AhrVgi62BV6g9~4@(Y6+`;FQ@SX|r37hKynR2xhEtO)Xh z)%4^K^@HVcyt({fHJnv)ez5q>2KCW~mbwR7;Ufzj+Y6~mE8v4w-Mhf5oTTNeXR4(A zZ7_Ek-DQbBc`jELSp&0GdN})-}1_Qpft`%Ch%h)of*0 z*o<@XRj_;sG;gTmrr`SeIx7}jf4t5jCD)tltoU->U&k-Nb*`Rl=kjB9ToGJZ!5)O* z_J#F<019gQ(K<_+TwhyHp2g)gb-X-WUtMPrp6jdXtU_{qWu3)rt~Yv};!U*w&%ksc zFoI6KqD~M7*Bk1r_j0|yj^}~v%j>LsbA4Hzg>J4dt>Z1=%6fIdEcN;Y%Fu!l^i|An z!}49KSbRdz{BV6nJ_DCtjGgCW(JnNO8s-!ShCXB)LU%V0E5vGd^DA~M`=8y=|AxJ_ zY!-F))tL6f%Qrv}Rj2;2zCQ5qU2&DHQ2dscBGv-csN37ZEiYmCVc zUjcuKw(=G5d2${=eiPyHUE%n}bzCuAudcHo&hy>p}nOuLUj(3#n z6?I%tTwhox5P<9D_2l>T`~`KwF1YTi6V}6ZZ=DDNu6yc4!EoJOXI-7^Y#py2*XP#> zo8kJrIw1&LXX-5ab4}{_jJWQqHW89jy;<@hf=9m4ry~d5(XR~qR5c<#M$BkW)*|<^Px&w#e z+CfI2wNLH7E9b@xKhs`~nTx}dNlim{*_iRSmK=89^L4U?9{y`4MzbGYL{I-Y@cJKX z+_u+oP;z}vJ^7~YFQ_Lwxjeg`T)>5Fau;zqzn(mY%eFecSFT&@_%6AgS0^lr>y|ok zQ(Q?0_BK5~r%t>J*R$)y)^OciC-{czbUoR@WmBDaAFgNBahh_KhhKKtE{E4=pjr0D zI*x51Wo2QI$S+$MktY{ZQM;(3OBYztp9`dQbpp+}YTZFrAE^W`c6dCEMqeps)_Kb> z>{@<8k@Fsk6T8y+9|Y&>Ibkg23?f$+8wzHx^BoAsZMR@wQy1C0e@j;-r~nI@*@mBb zPjl-6d-eOOi8M!lpeu_HgEekhSdAxNL-N~#h1H7`V_(88FddpzdM-`?n=>`$vO~)U zJAt{GqlwAN4^(@5M!D=EPu?jMXo^uvflLI>&GwYPE;`qs+2{1UC zQvBqs_Ol%{$6pn>oa(Ydz#cJ8UH3D2JK|9-Bjm6+9j?|ghw$Fpfz1nSmDzAi%FRe} z+m+4NAyb%OZ;GWC;T1>sF~75>*kl_$C5)KiAJX*nLYw~oLsid5o2Y|1f}@9bchf>K zm!{5j>jGLSU^!(I^zi-DQ&>v36{FL#q5`UfxCszPD7e3CaYy{Ozgxl`LEpoXx?!P6 zJ%v?~(pU>-W^-H*Q?b@~gE7^)Fcp@B#G@APP7CGUQtp?%`tM~Ia_`xJFY)<{r{J$`lm4)U`b7k%Iloee5nm^ zZne%CCbP|L2=t}L7U&{)($(SWn1`s_r*2ReTvfi$*SbExWLTfkRF2u_Jd?b{G0AoF zGs%|undAb`B)gwK>zO13pRbd}*JVeI7VPLoYbZOOcYH1F-Mz=R6w%U;&Np(T43e62 z-0HwQM6lqh%BT=F$KQTsQw86We<+O+r(YBY#Dd#w((^vxMPcrziV^H zz8Zhm;f~ETF0OK0qWU%iTJ}@3Q_Whh4BeHiUzC zlD61}<6B;nHgLz*8eg`VJNDD~yR*65o82wtZclbM#og}g zZWVX4+1+~X*cjt$S;HN>Vf@`j?q;&PwcI7y-Ae9u5vC-;wp0CYfwb^YM<-g54e>(K zDzaPESPgb!d#%grXs!T|)qnJ4ityQ(hfB+1pB69RuP)jvz_{2n?t_xmQ*O;BBiJDoM;u#3-s zwz;uxE?+#9L3^wY2IQqA$F@V}2LD(XBrH&m^%Kvvy)6vlmeXVXTwBMJJfcj5BD&Uo z6a=k41as~YKjwSNH+K{rCOv_uLoMpTat7^*?sk*DT3)91*}x zBp;)I;2`!*ry4K>C^5uS1{EZXM?A^{F)iae6!nsg@AvmBA0z1jvS7<&J19kA?pz`w zS;=lHvN7+bIa|zyRg*{4!dnO-1sA@5^{-STC4IDGu9WtX@J3iiyRTS)l6^-uY71!% zcg^>Y@YYC+5F`_o4UhcNrK${$%IS=4NTyPqWHcI&DY3L-0?F|#8$AHIM}h-d?#T3toR3zTD3Xkfn@rXv2)RjcC;VaH#MLgF>^snjrjin+ zNA93>>L6N4)QtG15$2zt4TfEIyJU(T5Q4)1Gm4I)Fw+NL3iRq^uV$^H)BInz3s6(fv-1~-Ra_wL2~^IO{c7=RCr>QKYnp&rG#c}+S_o~AXFsJH$pk`Cd*v}=!RG-+ zB#Y)4I(orD4geiFA2L8oMoi0fMNf`?R{Y%Q&ZW`MYOd0zhCZp(Z<&KJC>>msEcd8po#gmOs#Ba;r zZ1$B(M#5bbA8rD%l0HL)v^44E)<;5@v|r~Xh=|AFH<-JvwEr#>O+zxMn#4FUF-@6? zMqSeS>2PvU8MzCGyAP_Hqqxlm8Rk%FK5)<4vCOJcRDRNr@w$V+#sFghR*L=XgR;WocAPR#Qce=~A^ew9| zY3Z%bn44V3l8GyrW2^q`qNcJ9H{$x8Go=?bgXI2SD+I%L;y8g}IzCZgLWQ?9XO?m% zPDCuosetBqQ6u^QHEf$nQNyT%bU+CN)wm$TNFl86B5t+* z45fYs6%yUC!{I=D@zze0vhi!<=2ZtfV^f$_(4aP?C;#}pM@sD=>0ptt@@R)h5FbM5 z22JE>H^|X0Q?kewyMdQH+4>WK?0g?bwgMZvF`AV%Xa_B1H0$1J3OKsfOS6DB9*?}0 zUJBs2@>bnm^YB~gOY>TF@|vzQ(~WD!NKXsiY(i4vcn<mEQJ z2;T1ma(@Kzgpzgz{*)8rX(8H6bVbr>G=jo`NzZtcxb_2s9X>cLS_6aq{9w5)eJ0o! zFf1rpF#a=RP^v_tXc)T#qhUJL1H);Qy#v$i8JKLUg-1m9IUX?*?kJ^5ZY0WlBeCaJdZK|ro#$vjdE6D#~sJSZ%zsead=6*Lrz%F`*h%m zGtqR0lB~0(56?Vax}(!H^Q;^>hva$^SNvXq;&NxhBZm8+;(#=Q- zf&u+uF3UK~1=9BKvC~#C#7l)R)#A?K5{x1!Ui4MFnmBaE1StmzNK{d1{w8~P(~eS` z2RIWJNrsnHAIE^!vKyTNn%!)kix+1%=g-AUvYQL%;>qlWQ{m!@8`%+^KRQatk%;SO zgVfhG%H{w)dB7b8p=J?ZrTc^Jr34dIh<066i0VT%YO<=?x+?xQEs3A z_9NvnJRHmTANBH{$ka>PaH8TWn|i`)c<^XAmwf(-M>tZwbz@$MJKo<(z;Ib28cx8F zeTei4=Pck10@v+>wD1IHu<7>~Lpr)Ocsg{qi?)aNA@k%3`GjQO6NU$2%mCx>ec@c| zqaid`-BLP`jA%|lvfrfngzIbM;BP<@zCAMks1AyRmQgXm6nHa+5H@;o3d?gPn5 zf?*)Nn^So_Oh=520qXWHP`}azY7k9y4OSh%lpP^DfT<;YVBKT0$}q4#(*^6k6s&uL zE?mDUxT=P%(Jrzu??a})k~=r^R4Pk_3ePBI4 zFIa!o1?!0vtZ(JO`ZIww-nx2{KZ0n0N=6z}yozitthKh9YA{A2RS6A?St(g?$-#ySz}ixJ&2%Q^2)` zA!218BA%9T8rsmiIp98Jb*3kiKi>;oTX)l=4}9CTH6J28%Mak9pDZ5r@^MukCJ@#c zgtX~!naRh0-yN#QOyfov{jP`5e0J_zrwf~Up_%Y19W`2wA(E#hg1H`n?=`=CPjZ)J z5IXG)_wI8`Pf5cRMVZc6O&;q0#A$gkh0bXy4%0g()1BM$eu;U?<*&e|=jTp-J*XF5 zr$9|>PlK#0IKCr-QGw5tgAy?g$&s)9-rp#n0?^!kAYmz8fP7y7Vl@aon(${s1*dHZ z6%YzYv~#%g(_{>+oPU{G9rVb(+xjEAIgQ+rHyzl~J8C%CC%EE|-ctHR*bEhl9MVu* z2oRZ!95gTdgugv^uFa8t$yYE-mT>)5uJWz?BG;u{zr=MJS4O10oa=*JS8!#p+AFyt z#oMcr>9!pFS~0+Z(k|i6*Dw%VgSpkJz z`V|Z@x=MOKb_MIR$r1)UfU=7J#Y6f`Z}&8t>fNTKw3~k6pxczNA)~GyZb~?)tERqf zN;oP_&H#SFGFA0wQ$h+A3%}l!gnQ@{nNBt-Rmq5;-;|K}uPnGXC3T%D2*jI|B_^yV zlW5X;IBj@v!8KWl%|Ca)DHB1`D1{!w)CTQLQ`22=rI|Z$ z)sU}EN13LzVY6HF*IDyMp;TEjB&_a3f;;;=?Jt1kpNyMU1x80ovm4#nf0o8gKCXuSpjWhx07dbW5FMcqh z=;ygS>5udd9q%)ErFfnG#2U-hI@5Fw7)N|i6vQ#-2Q!xVd>xO#03BOF%W;bx5^M+k zsxyZil_*ZcD(_H-FtCnFRx>lL?!;nV&f$$?9V;!xQokK{In3zP;#43UZ;NWri45ya zS5~Z!*TMD_x7DGJ^D$)POVh;lkk$z~%L25%&C22lhNlJLfsR2@s3${2c@nfs$Z^fZ zT4x>MLi9?FOI1PQB?vkxb78Tw%4I|(Knim zbkjK&_s)xgN2SiSVx8m2Zb@7nvmTx~_m0jY^VGEBMMq&a zJT)!r2Eka!SJZqEpaZxk_@Q|@f!E*_PKbq`}OjyT=_j#>+A zV&?0w2_?iRG-mi)&tr`arFa7?eQfPxUdDyEXc+sLO#lQs5WA#Pze8cT1w9#^b{I@% zQ%WR%Vkk->IMNXq1);lBqj!N%$yP-LfNHOsYrRYmAj>#7mbDAAF;?ZmI_*}DTK(M+ zD&hKQXpuOs8{T+^R*ZNwI$e4RL@%t#ATLNgME`R{<4gt?NYVu=@8^>N7FSrbyVQ9- z_*uHtSzWR**r|d7*SZcIHSF)G{hi=%HMu*2A*Oj*jFj3uanIt`ec_G>qml8DJ%$~J zaE=!#u&)|VY!4r!^%_R;S&>7(#`momgs5gJscg(D93t4J7A){h@ZlPOWTc)U+mq+8t#50{t)QB zox@+L&c)LM9jg$n(wgb%m-PSxj2=jQ(&10YC`Yn;Xk1q%Co#M;5FCu1VRY`9&S)JX zAE0%#dzejRE{sY{-)O&NalpeUVc4PZ*c3M1m@U2QH&RG~G3BLWwSj$M4Bhhl^gMO0 zMPppB7qXVJ2AJestEkj=;`wwqjWx;Z=e7w`6Du&NvCi-f;#eusnd-#3PRFOcRbbOn z>y?sk6E7f#jQfT6>DysbcDnxY$qJdX9sJq{q%87UdSWq(FA^+3H}8-(0DGLNv>vbH ziJd;rC+HzbDP|wSsHlVw z2JwciL8Y@;D$4rgu#=M3J@kgaU_8ruqCeG6hZfLYnL@uEcF;i7EoLTSE|MT_GXqa` zIzVbBs6BTje6nv!AMU2y@>W_nUl6ZH!NU6P*x}jrcq8B9TUp#L#T#dvq_EvcFb4o{ zpqY@~KIs^514AYi`+c|s3En`H2b7g@drPSmuia82_>LQGYFHny1!{j=Zg0?Ssoh}+ z=^7{ifGZioPAphyg^O^-g;iw6B`)!YQNgi-!o?zs8>{ke)tof#7SGe3-9kQ}mSQx0 z^e%p`_g9Kl!Aj|>-G3Ihg<^z5Ls}yox5lhWG!!0GJESaJ19Y(IYW>pYnZt2usN~ni&3DMnS3?2!;9mdKyt~vi@mfCroR4B~yEI zieTyVGu#OV6%Y$8c<=FPD+f3h;YSYmqQwO0c(BdtFCdUH%bX@-^}Lo<~gbQ}KrMksP?1 zg_&N#*k-O;wUoS!r}U29AfDG`H|Rd=vKut9)!7Y^3vIz@-<&-c$7vs8x?(O}W>SY= z{_dP>{XSFRmeSK964MTf@3=8Eg^LNtO+d0Ta3G1mCfx5p4yN=a1bsS^r)Ja=~5zt+?QG!F|pLRnzO!t#|W(OTk4 z*(GJA#C@p5Y~tjP{^5~Qa)E`f-TgE_x6ku4wSVy{%MJz*XAh_MezMZkwc4gtlwO

YOEoJPa;t@kLD}!5fXH#w8s_&(Ldx$IgFG= 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 U(!JU?f8%}r%6*0x<=*Z815s>V$^ZZW literal 612872 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 z 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 dPG#E zf_GTI)}NUTXcUD=K?G@X@nmP&0WdxEMUF=r60V=W&cByEt5e1@9R6Vn`VQ94$t2X2 z80HSnL_^2|Q53JAJqg1uEdFvgw9u^nSm0nt#&OCXDL_b)DHLz;k2=Fgt=nByr+xQT zO6Nd5bchnt94RUZKq;#f8H2f&n(&Q&TeZ_^&CRFW z`}-}vO_SX!?JbYBC7n)GK?w$`SE+fRD|MXc>|07zkz<13WQyI97O8owOL&=Ql$xEl zOVw*2xe;JN^3^m)g3Gu0y;KVe^wiP!0?I6NQBgaanoLv-efz9oyGmcnQk;??69#R8 zhoFY`2~Zy<@9-Tq-9p3OB;O?}y)p4QDO5Tn`7?Z_x*@(XE8e;12H`7g4yfX>wQM-4 z1lns-s^%vY8N9!DxwAOO@Z7Z|M5x02rzTOvtrH~myIo$#oW`8RAkP|^#31h?3L;7( zzQ=bGz6@urV;@i4guA+ykjRw)dsQH?2y&?2>zWyhwdwRQBU2-Wc9ZEMmjpk(Z{l|D zdg$&KlU$VzZT)gilMzHT#hpfQFNHIT?EStCcQglYGvN%@czRTZ39TdGNs=^QLnLoDVBq$F{X@JdR64Wj-owu}nmh z5TpDd|5?8!-UQvxHaA%u1`YM?>xdNh8A+r+?4Fv@Tu$8Q&IXbMyDKtqLa$6^l2;#b zH_)h=eQzLLpA;6nu4jweL#U7X51Tue=a%`c=S&}L8(&F4AhoGgg$_#Im!kNX|KRh` zpLPw&IwUE36$E)sHMcDN_<5O}(Z*NgpygYFt|3x{6%gG>On|$C zy64|onCjLo3;luaNO1(prlTEF8bf{C73FgK~%>f zLV^HNuI~_JZ3=d+qIl@<>s^V>T~f=N8hfOxj>=#7e=+U(t(Db=W=1V+t(d57Q3fnN x!Ftrz%EI86i?y($`>?g5z56J8NIm{UAvL1Q>{ohdC;1)Y`L+H`P>CMf{{g0H?ZW^7 diff --git a/substrate/srml/balances/src/lib.rs b/substrate/srml/balances/src/lib.rs index 83eb408132..224d02c0d1 100644 --- a/substrate/srml/balances/src/lib.rs +++ b/substrate/srml/balances/src/lib.rs @@ -423,6 +423,23 @@ impl Module { Self::set_free_balance_creating(who, Self::free_balance(who) + value) } + /// Substrates `value` from the free balance of `who`. If the whole amount cannot be + /// deducted, an error is returned. + /// + /// NOTE: This assumes that the total stake remains unchanged after this operation. If + /// you mean to actually burn value out of existence, then use `slash` instead. + pub fn decrease_free_balance( + who: &T::AccountId, + value: T::Balance + ) -> result::Result { + T::EnsureAccountLiquid::ensure_account_liquid(who)?; + let b = Self::free_balance(who); + if b < value { + return Err("account has too few funds") + } + Ok(Self::set_free_balance(who, b - value)) + } + /// Deducts up to `value` from the combined balance of `who`, preferring to deduct from the /// free balance. This function cannot fail. /// diff --git a/substrate/srml/balances/src/tests.rs b/substrate/srml/balances/src/tests.rs index b9c5b85902..9ad100fe61 100644 --- a/substrate/srml/balances/src/tests.rs +++ b/substrate/srml/balances/src/tests.rs @@ -280,6 +280,17 @@ fn balance_transfer_works() { }); } +#[test] +fn balance_reduction_works() { + with_externalities(&mut ExtBuilder::default().build(), || { + Balances::set_free_balance(&1, 111); + Balances::increase_total_stake_by(111); + assert_ok!(Balances::decrease_free_balance(&1, 69).map(|_| ())); + assert_eq!(Balances::total_balance(&1), 42); + assert_noop!(Balances::decrease_free_balance(&1, 69).map(|_| ()), "account has too few funds"); + }); +} + #[test] fn reserving_balance_should_work() { with_externalities(&mut ExtBuilder::default().build(), || { diff --git a/substrate/srml/consensus/src/lib.rs b/substrate/srml/consensus/src/lib.rs index 6975fe792c..1c46e38541 100644 --- a/substrate/srml/consensus/src/lib.rs +++ b/substrate/srml/consensus/src/lib.rs @@ -29,6 +29,7 @@ extern crate srml_support as runtime_support; #[macro_use] extern crate serde_derive; +extern crate parity_codec; #[macro_use] extern crate parity_codec_derive; @@ -42,6 +43,7 @@ extern crate sr_io as runtime_io; use rstd::prelude::*; use rstd::result; +use parity_codec::Encode; use runtime_support::{storage, Parameter}; use runtime_support::dispatch::Result; use runtime_support::storage::StorageValue; @@ -174,8 +176,14 @@ decl_module! { Ok(()) } + /// Set the number of pages in the WebAssembly environment's heap. + fn set_heap_pages(pages: u64) -> Result { + storage::unhashed::put_raw(well_known_keys::HEAP_PAGES, &pages.encode()); + Ok(()) + } + /// Set the new code. - fn set_code(new: Vec) -> Result { + pub fn set_code(new: Vec) -> Result { storage::unhashed::put_raw(well_known_keys::CODE, &new); Ok(()) } diff --git a/substrate/srml/contract/src/lib.rs b/substrate/srml/contract/src/lib.rs index 30e82f4923..5e3722bb04 100644 --- a/substrate/srml/contract/src/lib.rs +++ b/substrate/srml/contract/src/lib.rs @@ -154,6 +154,7 @@ decl_module! { fn deposit_event() = default; // TODO: Change AccountId to staking::Address /// Make a call to a specified account, optionally transferring some balance. + /// Make a call to a specified account, optionally transferring some balance. fn call( origin, dest: T::AccountId, @@ -232,12 +233,14 @@ decl_module! { }; let result = ctx.create(origin.clone(), endowment, &mut gas_meter, &ctor_code, &data); - if let Ok(_) = result { + if let Ok(ref r) = result { // Commit all changes that made it thus far into the persistant storage. account_db::DirectAccountDb.commit(ctx.overlay.into_change_set()); // Then deposit all events produced. ctx.events.into_iter().for_each(Self::deposit_event); + + Self::deposit_event(RawEvent::Created(origin.clone(), r.address.clone())); } // Refund cost of the unused gas. @@ -263,6 +266,9 @@ decl_event! { { /// Transfer happened `from` -> `to` with given `value` as part of a `message-call` or `create`. Transfer(AccountId, AccountId, Balance), + + /// Contract deployed by address at the specified address. + Created(AccountId, AccountId), } } diff --git a/substrate/srml/contract/src/tests.rs b/substrate/srml/contract/src/tests.rs index f48769c978..9e2d2f1f68 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/srml/contract/src/tests.rs @@ -617,6 +617,10 @@ fn top_level_create() { phase: Phase::ApplyExtrinsic(0), event: MetaEvent::contract(RawEvent::Transfer(0, derived_address, 11)), }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: MetaEvent::contract(RawEvent::Created(0, 1)), + }, ]); }); } diff --git a/substrate/srml/support/src/dispatch.rs b/substrate/srml/support/src/dispatch.rs index 8a131336ae..dd52e35b3c 100644 --- a/substrate/srml/support/src/dispatch.rs +++ b/substrate/srml/support/src/dispatch.rs @@ -208,7 +208,7 @@ macro_rules! decl_module { [ $($t)* $(#[doc = $doc_attr])* - fn $fn_name(root $( , $param_name : $param )* ) -> $result { $( $impl )* } + $fn_vis fn $fn_name(root $( , $param_name : $param )* ) -> $result { $( $impl )* } ] $($rest)* ); diff --git a/substrate/srml/upgrade-key/Cargo.toml b/substrate/srml/upgrade-key/Cargo.toml new file mode 100644 index 0000000000..980a7240a9 --- /dev/null +++ b/substrate/srml/upgrade-key/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "srml-upgrade-key" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default-features = false } +serde_derive = { version = "1.0", optional = true } +parity-codec = { version = "2.1", default-features = false } +parity-codec-derive = { version = "2.1", default-features = false } +substrate-primitives = { path = "../../core/primitives", default-features = false } +sr-std = { path = "../../core/sr-std", default-features = false } +sr-io = { path = "../../core/sr-io", default-features = false } +sr-primitives = { path = "../../core/sr-primitives", default-features = false } +srml-support = { path = "../support", default-features = false } +srml-system = { path = "../system", default-features = false } +srml-consensus = { path = "../consensus", default-features = false } + +[features] +default = ["std"] +std = [ + "serde/std", + "serde_derive", + "parity-codec/std", + "parity-codec-derive/std", + "sr-std/std", + "sr-io/std", + "sr-primitives/std", + "substrate-primitives/std", + "srml-support/std", + "srml-system/std", + "srml-consensus/std", +] diff --git a/substrate/srml/upgrade-key/src/lib.rs b/substrate/srml/upgrade-key/src/lib.rs new file mode 100644 index 0000000000..28433d8fbd --- /dev/null +++ b/substrate/srml/upgrade-key/src/lib.rs @@ -0,0 +1,90 @@ +// Copyright 2017-2018 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 . + +//! The Example: A simple example of a runtime module demonstrating +//! concepts, APIs and structures common to most runtime modules. + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate sr_std; +#[cfg(test)] +extern crate sr_io; +#[cfg(test)] +extern crate substrate_primitives; +extern crate sr_primitives; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate parity_codec_derive; +extern crate parity_codec as codec; +#[macro_use] +extern crate srml_support as support; +extern crate srml_system as system; +extern crate srml_consensus as consensus; + +use sr_std::prelude::*; +use support::{StorageValue, dispatch::Result}; +use system::ensure_signed; + +pub trait Trait: consensus::Trait + system::Trait { + /// The overarching event type. + type Event: From> + Into<::Event>; +} + +decl_module! { + // Simple declaration of the `Module` type. Lets the macro know what its working on. + pub struct Module for enum Call where origin: T::Origin { + fn deposit_event() = default; + fn upgrade(origin, new: Vec) -> Result { + // This is a public call, so we ensure that the origin is some signed account. + let _sender = ensure_signed(origin)?; + ensure!(_sender == Self::key(), "only the current upgrade key can use the upgrade_key module"); + + >::set_code(new)?; + Self::deposit_event(RawEvent::Upgraded); + + Ok(()) + } + + fn set_key(origin, new: T::AccountId) -> Result { + // This is a public call, so we ensure that the origin is some signed account. + let _sender = ensure_signed(origin)?; + ensure!(_sender == Self::key(), "only the current upgrade key can use the upgrade_key module"); + + Self::deposit_event(RawEvent::KeyChanged(Self::key())); + >::put(new); + + Ok(()) + } + } +} + +/// An event in this module. +decl_event!( + pub enum Event where AccountId = ::AccountId { + /// An upgrade just happened. + Upgraded, + /// An upgrade just happened; old key is supplied as an argument. + KeyChanged(AccountId), + } +); + +decl_storage! { + trait Store for Module as UpgradeKey { + Key get(key) config(): T::AccountId; + } +}