diff --git a/.travis.yml b/.travis.yml index 4165a6fb10147..937507439f9f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,5 @@ matrix: script: - cargo test --all + - cargo clean - ./publish-wasm.sh diff --git a/Cargo.lock b/Cargo.lock index d15152f6aeb5d..d5243301fd25a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,15 +88,6 @@ dependencies = [ "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base64" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "base64" version = "0.9.0" @@ -118,11 +109,6 @@ dependencies = [ "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "bitflags" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "bitflags" version = "1.0.1" @@ -155,6 +141,9 @@ dependencies = [ name = "cc" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "cfg-if" @@ -406,7 +395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fixed-hash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -427,17 +416,30 @@ dependencies = [ [[package]] name = "ethcore-bytes" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" [[package]] name = "ethcore-bytes" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ethcore-crypto" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" +dependencies = [ + "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", + "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ethcore-io" version = "1.11.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -465,12 +467,12 @@ dependencies = [ [[package]] name = "ethcore-logger" version = "1.11.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -481,12 +483,12 @@ dependencies = [ [[package]] name = "ethcore-network" version = "1.11.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-io 1.11.0 (git+https://github.com/paritytech/parity.git)", - "ethcrypto 0.1.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", "ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.2.1 (git+https://github.com/paritytech/parity.git)", @@ -496,19 +498,19 @@ dependencies = [ [[package]] name = "ethcore-network-devp2p" version = "1.11.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)", + "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", "ethcore-io 1.11.0 (git+https://github.com/paritytech/parity.git)", "ethcore-logger 1.11.0 (git+https://github.com/paritytech/parity.git)", "ethcore-network 1.11.0 (git+https://github.com/paritytech/parity.git)", - "ethcrypto 0.1.0 (git+https://github.com/paritytech/parity.git)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", - "igd 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)", "keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)", "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", @@ -528,19 +530,6 @@ dependencies = [ "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ethcrypto" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" -dependencies = [ - "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)", - "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", - "subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ethereum-types" version = "0.2.3" @@ -557,13 +546,13 @@ dependencies = [ [[package]] name = "ethereum-types" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fixed-hash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -580,14 +569,15 @@ dependencies = [ [[package]] name = "ethkey" version = "0.3.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "edit-distance 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mem 0.1.0 (git+https://github.com/paritytech/parity.git)", "parity-wordlist 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", @@ -604,6 +594,14 @@ dependencies = [ "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fdlimit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fixed-hash" version = "0.1.3" @@ -626,7 +624,7 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -676,6 +674,11 @@ dependencies = [ "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "getopts" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "globset" version = "0.3.0" @@ -732,24 +735,6 @@ name = "httparse" version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hyper" -version = "0.10.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "hyper" version = "0.11.25" @@ -786,14 +771,18 @@ dependencies = [ [[package]] name = "igd" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "xmltree 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "xmltree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -801,6 +790,11 @@ name = "integer-sqrt" version = "0.1.0" source = "git+https://github.com/paritytech/integer-sqrt-rs.git#f4cf61482096dc98c1273f46a10849d182b4c23c" +[[package]] +name = "interleaved-ordered" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "iovec" version = "0.1.2" @@ -914,10 +908,10 @@ dependencies = [ [[package]] name = "keccak-hash" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -940,6 +934,32 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "kvdb" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)", +] + +[[package]] +name = "kvdb-rocksdb" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)", +] + [[package]] name = "language-tags" version = "0.2.2" @@ -965,6 +985,16 @@ name = "libc" version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "local-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "skeptic 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -986,6 +1016,11 @@ name = "matches" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "mem" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" + [[package]] name = "memchr" version = "2.0.1" @@ -1013,14 +1048,6 @@ dependencies = [ "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "mime" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "mime" version = "0.3.5" @@ -1167,7 +1194,7 @@ dependencies = [ [[package]] name = "path" version = "0.1.0" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" [[package]] name = "patricia-trie" @@ -1239,6 +1266,7 @@ dependencies = [ "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1320,7 +1348,7 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethcrypto 0.1.0 (git+https://github.com/paritytech/parity.git)", + "ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)", "hex 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1392,6 +1420,7 @@ dependencies = [ "polkadot-runtime 0.1.0", "polkadot-transaction-pool 0.1.0", "substrate-client 0.1.0", + "substrate-client-db 0.1.0", "substrate-codec 0.1.0", "substrate-executor 0.1.0", "substrate-network 0.1.0", @@ -1461,6 +1490,14 @@ name = "proc-macro-hack-impl" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "pulldown-cmark" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pwasm-alloc" version = "0.1.0" @@ -1506,6 +1543,15 @@ dependencies = [ "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rayon" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rayon-core" version = "1.3.0" @@ -1580,11 +1626,11 @@ dependencies = [ [[package]] name = "rlp" version = "0.2.1" -source = "git+https://github.com/paritytech/parity.git#d7a7f034db6e7d84e2182ab2cd76cfc0a438723c" +source = "git+https://github.com/paritytech/parity.git#1356d6d8d55d98fc328bbf1e0c6ae4e3f64be1ee" dependencies = [ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1600,6 +1646,27 @@ dependencies = [ "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rocksdb" +version = "0.4.5" +source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)", +] + +[[package]] +name = "rocksdb-sys" +version = "0.3.0" +source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e" +dependencies = [ + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)", +] + [[package]] name = "rust-crypto" version = "0.2.36" @@ -1724,6 +1791,15 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "skeptic" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "slab" version = "0.2.0" @@ -1822,6 +1898,21 @@ dependencies = [ "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-client-db" +version = "0.1.0" +dependencies = [ + "kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)", + "kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity.git)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-client 0.1.0", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-state-machine 0.1.0", +] + [[package]] name = "substrate-codec" version = "0.1.0" @@ -2330,6 +2421,17 @@ dependencies = [ "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-retry" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-service" version = "0.1.0" @@ -2347,11 +2449,6 @@ dependencies = [ "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "traitobject" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "transaction-pool" version = "1.9.0" @@ -2381,11 +2478,6 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "uint" version = "0.1.2" @@ -2418,14 +2510,6 @@ dependencies = [ "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "unicase" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "unicase" version = "2.1.0" @@ -2592,18 +2676,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "xml-rs" -version = "0.3.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "xmltree" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2623,10 +2707,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8352656fd42c30a0c3c89d26dea01e3b77c0ab2af18230835c15e2e13cd51859" "checksum backtrace 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbbf59b1c43eefa8c3ede390fcc36820b4999f7914104015be25025e0d62af2" "checksum backtrace-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "44585761d6161b0f57afc49482ab6bd067e4edef48c12a152c237eb0203f7661" -"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" "checksum base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "229d032f1a99302697f10b27167ae6d03d49d032e6a8e2550e8d3fc13356d2b4" "checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" -"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" @@ -2654,26 +2736,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ethcore-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcb5af77e74a8f70e9c3337e069c37bc82178ef1b459c02091f73c4ad5281eb5" "checksum ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3977c772cd6c5c22e1c7cfa208e4c3b746bd6c3a6c8eeec0999a6b2103015ad5" +"checksum ethcore-crypto 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-io 1.11.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-logger 1.11.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-logger 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1fd5813e49546030be7d134e775088d56b8ff4ab60617b90e93d4f0513da4c5b" "checksum ethcore-network 1.11.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethcore-network-devp2p 1.11.0 (git+https://github.com/paritytech/parity.git)" = "" -"checksum ethcrypto 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum ethereum-types 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5cff74129deda8a155b729cad1a22dc3cdd08115abd1165079c519d0cab6917a" -"checksum ethereum-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "53eabbad504e438e20b6559fd070d79b92cb31c02f994c7ecb05e9b2df716013" +"checksum ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3ae691a36ce5d25b433e63128ce5579f4a18457b6a9c849832b2c9e0fec92a" "checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002" "checksum ethkey 0.3.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum exit-future 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6c30ec160f83d938faf4dd6fdaba4f42316f1bd3df76b902df2d824f47fa9db7" +"checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum fixed-hash 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21c520ebc46522d519aec9cba2b7115d49cea707d771b772c46bec61aa0daeb8" -"checksum fixed-hash 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "362f32e2fbc5ed45f01a23ca074f936bb3aee4122a66e7118e8c3e965d96104c" +"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" +"checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" "checksum globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1e96ab92362c06811385ae9a34d2698e8a1160745e0c78fbb434a44c8de3fabc" "checksum hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d97be07c358c5b461268b4ce60304024c5fa5acfd4bd8cd743639f0252003cf5" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" @@ -2681,11 +2765,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" "checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" -"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" "checksum hyper 0.11.25 (registry+https://github.com/rust-lang/crates.io-index)" = "549dbb86397490ce69d908425b9beebc85bbaad25157d67479d4995bb56fdf9a" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" -"checksum igd 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "356a0dc23a4fa0f8ce4777258085d00a01ea4923b2efd93538fc44bf5e1bda76" +"checksum igd 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a254e265e8810deb357a9de757f784787ec415d056ededf410c0aa460afee9e" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" +"checksum interleaved-ordered 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)" = "2134e210e2a024b5684f90e1556d5f71a1ce7f8b12e9ac9924c67fb36f63b336" "checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" @@ -2700,18 +2784,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum keccak-hash 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" +"checksum kvdb-rocksdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum local-encoding 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1ceb20f39ff7ae42f3ff9795f3986b1daad821caaa1e1732a0944103a5a1a66" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum mem 0.1.0 (git+https://github.com/paritytech/parity.git)" = "" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" "checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" -"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" "checksum mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7da01a5e23070d92d99b1ecd1cd0af36447c6fd44b0fe283c2db199fa136724f" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" @@ -2735,10 +2822,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28ea5118e2f41bfbc974b28d88c07621befd1fa5d6ec23549be96302a1a59dd2" "checksum proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ba8d4f9257b85eb6cdf13f055cea3190520aab1409ca2ab43493ea4820c25f0" "checksum proc-macro-hack-impl 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d5cb6f960ad471404618e9817c0e5d10b1ae74cfdf01fab89ea0641fe7fb2892" +"checksum pulldown-cmark 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8361e81576d2e02643b04950e487ec172b687180da65c731c03cf336784e6c07" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" +"checksum rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed02d09394c94ffbdfdc755ad62a132e94c3224a8354e78a1200ced34df12edf" "checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" "checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" @@ -2749,6 +2838,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rlp 0.2.1 (git+https://github.com/paritytech/parity.git)" = "" "checksum rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "babe6fce20c0ca9b1582998734c4569082d0ad08e43772a1c6c40aef4f106ef9" +"checksum rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)" = "" +"checksum rocksdb-sys 0.3.0 (git+https://github.com/paritytech/rust-rocksdb)" = "" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "aee45432acc62f7b9a108cc054142dac51f979e69e71ddce7d6fc7adf29e817e" "checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" @@ -2766,6 +2857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c9db7266c7d63a4c4b7fe8719656ccdd51acf1bed6124b174f933b009fb10bcb" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" "checksum shell32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" +"checksum skeptic 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24ebf8a06f5f8bae61ae5bbc7af7aac4ef6907ae975130faba1199e5fe82256a" "checksum slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6dbdd334bd28d328dad1c41b0ea662517883d8880d8533895ef96c8003dec9c4" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" @@ -2789,17 +2881,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" "checksum tokio-io 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "514aae203178929dbf03318ad7c683126672d4d96eccb77b29603d33c9e25743" "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" +"checksum tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f05746ae87dca83a2016b4f5dba5b237b897dd12fd324f60afe282112f16969a" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc" -"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum transaction-pool 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23303835df389f9c34ad45cacf392304193f974faaf48c30a4ece2b03da0ed57" "checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" -"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)" = "" "checksum uint 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53a4340c35703f926ec365c6797bb4a7a10bb6b9affe29ca385c9d804401f5e3" "checksum uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6477b2716357758c176c36719023e1f9726974d762150e4fc0a9c8c75488c343" -"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" @@ -2823,6 +2913,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum ws 0.7.5 (git+https://github.com/tomusdrw/ws-rs)" = "" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61" -"checksum xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec6c39eaa68382c8e31e35239402c0a9489d4141a8ceb0c716099a0b515b562" -"checksum xmltree 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "472a9d37c7c53ab2391161df5b89b1f3bf76dab6ab150d7941ecbdd832282082" +"checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2" +"checksum xmltree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9cfb54ca6b8f17d2377219ce485b134d53561b77e1393c7ea416f543a527431" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" diff --git a/Cargo.toml b/Cargo.toml index 606a989bd8ee4..35e719d30781a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ members = [ "polkadot/service", "substrate/bft", "substrate/client", + "substrate/client/db", "substrate/codec", "substrate/environmental", "substrate/executor", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 00a448b1bdd3c..ca7192b60ea6f 100644 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm differ diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index ac94269910f2b..8b6b21ce23360 100755 Binary files a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm and b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm differ diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index e49d8446bad84..d956a0290b2f9 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -21,6 +21,7 @@ app_dirs = "1.2" tokio-core = "0.1.12" futures = "0.1.17" ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" } +fdlimit = "0.1" substrate-client = { path = "../../substrate/client" } substrate-network = { path = "../../substrate/network" } substrate-codec = { path = "../../substrate/codec" } diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index b3f62fb65b57f..d10fdfd32b849 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -27,6 +27,7 @@ extern crate time; extern crate futures; extern crate tokio_core; extern crate ctrlc; +extern crate fdlimit; extern crate ed25519; extern crate triehash; extern crate substrate_codec as codec; @@ -98,6 +99,7 @@ pub fn run(args: I) -> error::Result<()> where // TODO [ToDr] Split parameters parsing from actual execution. let log_pattern = matches.value_of("log").unwrap_or(""); init_logger(log_pattern); + fdlimit::raise_fd_limit(); let mut config = service::Configuration::default(); @@ -111,6 +113,8 @@ pub fn run(args: I) -> error::Result<()> where .to_string_lossy() .into(); + config.database_path = db_path(&base_path).to_string_lossy().into(); + let mut role = service::Role::FULL; if matches.is_present("collator") { info!("Starting collator."); @@ -204,6 +208,12 @@ fn keystore_path(base_path: &Path) -> PathBuf { path } +fn db_path(base_path: &Path) -> PathBuf { + let mut path = base_path.to_owned(); + path.push("db"); + path +} + fn network_path(base_path: &Path) -> PathBuf { let mut path = base_path.to_owned(); path.push("network"); diff --git a/polkadot/keystore/Cargo.toml b/polkadot/keystore/Cargo.toml index 16ec9817693e2..92026c9c8df88 100644 --- a/polkadot/keystore/Cargo.toml +++ b/polkadot/keystore/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -ethcrypto = { git = "https://github.com/paritytech/parity", default_features = false } +ethcore-crypto = { git = "https://github.com/paritytech/parity", default_features = false } ed25519 = { path = "../../substrate/ed25519" } error-chain = "0.11" hex = "0.3" diff --git a/polkadot/keystore/src/lib.rs b/polkadot/keystore/src/lib.rs index d91d986e5650a..62268edf6ec2e 100644 --- a/polkadot/keystore/src/lib.rs +++ b/polkadot/keystore/src/lib.rs @@ -16,7 +16,7 @@ //! Keystore (and session key management) for polkadot. -extern crate ethcrypto as crypto; +extern crate ethcore_crypto as crypto; extern crate subtle; extern crate ed25519; extern crate rand; diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 1d1a95c6ce946..e81d2066e6258 100644 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm differ diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index e0991b6397f97..7e31a2dea60aa 100755 Binary files a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm and b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm differ diff --git a/polkadot/service/Cargo.toml b/polkadot/service/Cargo.toml index d88c069470af2..469dc2e2018db 100644 --- a/polkadot/service/Cargo.toml +++ b/polkadot/service/Cargo.toml @@ -24,5 +24,6 @@ substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-primitives = { path = "../../substrate/primitives" } substrate-network = { path = "../../substrate/network" } substrate-client = { path = "../../substrate/client" } +substrate-client-db = { path = "../../substrate/client/db" } substrate-codec = { path = "../../substrate/codec" } substrate-executor = { path = "../../substrate/executor" } diff --git a/polkadot/service/src/config.rs b/polkadot/service/src/config.rs index ed1b86daf4f87..d4cacf37b93e9 100644 --- a/polkadot/service/src/config.rs +++ b/polkadot/service/src/config.rs @@ -39,6 +39,8 @@ pub struct Configuration { pub network: NetworkConfiguration, /// Path to key files. pub keystore_path: String, + /// Path to the database. + pub database_path: String, /// Additional key seeds. pub keys: Vec, /// Chain specification. @@ -52,6 +54,7 @@ impl Default for Configuration { transaction_pool: Default::default(), network: Default::default(), keystore_path: Default::default(), + database_path: Default::default(), keys: Default::default(), chain_spec: ChainSpec::Development, } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index d21415f7d0a7b..7d770b67d3031 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -33,6 +33,7 @@ extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_codec as codec; +extern crate substrate_client_db as client_db; extern crate substrate_executor; extern crate exit_future; @@ -64,14 +65,13 @@ use polkadot_api::PolkadotApi; use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; use client::{genesis, BlockchainEvents}; -use client::in_mem::Backend as InMemory; use network::ManageNetwork; use exit_future::Signal; pub use self::error::{ErrorKind, Error}; pub use config::{Configuration, Role, ChainSpec}; -type Client = client::Client>; +type Client = client::Client>; /// Polkadot service. pub struct Service { @@ -275,7 +275,12 @@ impl Service { (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) }; - let client = Arc::new(client::new_in_mem(executor, prepare_genesis)?); + let db_settings = client_db::DatabaseSettings { + cache_size: None, + path: config.database_path.into(), + }; + + let client = Arc::new(client_db::new_client(db_settings, executor, prepare_genesis)?); let best_header = client.best_block_header()?; info!("Starting Polkadot. Best block is #{}", best_header.number); let transaction_pool = Arc::new(Mutex::new(TransactionPool::new(config.transaction_pool))); diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml new file mode 100644 index 0000000000000..e435271633544 --- /dev/null +++ b/substrate/client/db/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "substrate-client-db" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +parking_lot = "0.4" +log = "0.3" +kvdb = { git = "https://github.com/paritytech/parity.git" } +kvdb-rocksdb = { git = "https://github.com/paritytech/parity.git" } +substrate-primitives = { path = "../../../substrate/primitives" } +substrate-client = { path = "../../../substrate/client" } +substrate-state-machine = { path = "../../../substrate/state-machine" } +substrate-runtime-support = { path = "../../../substrate/runtime-support" } +substrate-codec = { path = "../../../substrate/codec" } + +[dev-dependencies] diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs new file mode 100644 index 0000000000000..d5f295205eeaa --- /dev/null +++ b/substrate/client/db/src/lib.rs @@ -0,0 +1,399 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Client backend that uses RocksDB database as storage. State is still kept in memory. + +extern crate substrate_client as client; +extern crate kvdb_rocksdb; +extern crate kvdb; +extern crate parking_lot; +extern crate substrate_state_machine as state_machine; +extern crate substrate_primitives as primitives; +extern crate substrate_runtime_support as runtime_support; +extern crate substrate_codec as codec; +#[macro_use] extern crate log; + +use std::sync::Arc; +use std::path::PathBuf; +use std::collections::HashMap; +use parking_lot::RwLock; +use runtime_support::Hashable; +use primitives::blake2_256; +use kvdb_rocksdb::{Database, DatabaseConfig}; +use kvdb::DBTransaction; +use primitives::block::{self, Id as BlockId, HeaderHash}; +use state_machine::backend::Backend as StateBackend; +use state_machine::CodeExecutor; +use codec::Slicable; + +const STATE_HISTORY: block::Number = 64; + +/// Database settings. +pub struct DatabaseSettings { + /// Cache size in bytes. If `None` default is used. + pub cache_size: Option, + /// Path to the database. + pub path: PathBuf, +} + +/// Create an instance of db-backed client. +pub fn new_client( + settings: DatabaseSettings, + executor: E, + build_genesis: F +) -> Result, client::error::Error> + where + E: CodeExecutor, + F: FnOnce() -> (block::Header, Vec<(Vec, Vec)>) +{ + let backend = Backend::new(&settings)?; + Ok(client::Client::new(backend, executor, build_genesis)?) +} + +mod columns { + pub const META: Option = Some(0); + pub const STATE: Option = Some(1); + pub const BLOCK_INDEX: Option = Some(2); + pub const HEADER: Option = Some(3); + pub const BODY: Option = Some(4); + pub const JUSTIFICATION: Option = Some(5); + pub const NUM_COLUMNS: Option = Some(6); +} + +mod meta { + pub const BEST_BLOCK: &[u8; 4] = b"best"; +} + +struct PendingBlock { + header: block::Header, + justification: Option, + body: Option, + is_best: bool, +} + +/// Database transaction +pub struct BlockImportOperation { + pending_state: DbState, + pending_block: Option, +} + +#[derive(Clone)] +struct Meta { + best_hash: HeaderHash, + best_number: block::Number, + genesis_hash: HeaderHash, +} + +/// Block database +pub struct BlockchainDb { + db: Arc, + meta: RwLock, +} + +type BlockKey = [u8; 4]; + +// Little endian +fn number_to_db_key(n: block::Number) -> BlockKey { + [ + (n >> 24) as u8, + ((n >> 16) & 0xff) as u8, + ((n >> 8) & 0xff) as u8, + (n & 0xff) as u8 + ] +} + +// Maps database error to client error +fn db_err(err: kvdb::Error) -> client::error::Error { + use std::error::Error; + match err.kind() { + &kvdb::ErrorKind::Io(ref err) => client::error::ErrorKind::Backend(err.description().into()).into(), + &kvdb::ErrorKind::Msg(ref m) => client::error::ErrorKind::Backend(m.clone()).into(), + _ => client::error::ErrorKind::Backend("Unknown backend error".into()).into(), + } +} + +impl BlockchainDb { + fn id(&self, id: BlockId) -> Result, client::error::Error> { + match id { + BlockId::Hash(h) => { + { + let meta = self.meta.read(); + if meta.best_hash == h { + return Ok(Some(number_to_db_key(meta.best_number))); + } + } + self.db.get(columns::BLOCK_INDEX, &h).map(|v| v.map(|v| { + let mut key: [u8; 4] = [0; 4]; + key.copy_from_slice(&v); + key + })).map_err(db_err) + }, + BlockId::Number(n) => Ok(Some(number_to_db_key(n))), + } + } + + fn new(db: Arc) -> Result { + let (best_hash, best_number) = if let Some(Some(header)) = db.get(columns::META, meta::BEST_BLOCK).and_then(|id| + match id { + Some(id) => db.get(columns::HEADER, &id).map(|h| h.map(|b| block::Header::decode(&mut &b[..]))), + None => Ok(None), + }).map_err(db_err)? + { + let hash = header.blake2_256().into(); + debug!("DB Opened blockchain db, best {:?} ({})", hash, header.number); + (hash, header.number) + } else { + (Default::default(), Default::default()) + }; + let genesis_hash = db.get(columns::HEADER, &number_to_db_key(0)).map_err(db_err)? + .map(|b| blake2_256(&b)).unwrap_or_default().into(); + + Ok(BlockchainDb { + db, + meta: RwLock::new(Meta { + best_hash, + best_number, + genesis_hash, + }) + }) + } + + fn read_db(&self, id: BlockId, column: Option) -> Result, client::error::Error> { + self.id(id).and_then(|key| + match key { + Some(key) => self.db.get(column, &key).map_err(db_err), + None => Ok(None), + }) + } + + fn update_meta(&self, hash: block::HeaderHash, number: block::Number, is_best: bool) { + if is_best { + let mut meta = self.meta.write(); + if number == 0 { + meta.genesis_hash = hash; + } + meta.best_number = number; + meta.best_hash = hash; + } + } +} + +impl client::blockchain::Backend for BlockchainDb { + fn header(&self, id: BlockId) -> Result, client::error::Error> { + match self.read_db(id, columns::HEADER)? { + Some(header) => match block::Header::decode(&mut &header[..]) { + Some(header) => Ok(Some(header)), + None => return Err(client::error::ErrorKind::Backend("Error decoding header".into()).into()), + } + None => Ok(None), + } + } + + fn body(&self, id: BlockId) -> Result, client::error::Error> { + match self.read_db(id, columns::BODY)? { + Some(body) => match block::Body::decode(&mut &body[..]) { + Some(body) => Ok(Some(body)), + None => return Err(client::error::ErrorKind::Backend("Error decoding body".into()).into()), + } + None => Ok(None), + } + } + + fn justification(&self, id: BlockId) -> Result, client::error::Error> { + match self.read_db(id, columns::JUSTIFICATION)? { + Some(justification) => match primitives::bft::Justification::decode(&mut &justification[..]) { + Some(justification) => Ok(Some(justification)), + None => return Err(client::error::ErrorKind::Backend("Error decoding justification".into()).into()), + } + None => Ok(None), + } + } + + fn info(&self) -> Result { + let meta = self.meta.read(); + Ok(client::blockchain::Info { + best_hash: meta.best_hash, + best_number: meta.best_number, + genesis_hash: meta.genesis_hash, + }) + } + + fn status(&self, id: BlockId) -> Result { + let exists = match id { + BlockId::Hash(_) => self.id(id)?.is_some(), + BlockId::Number(n) => n <= self.meta.read().best_number, + }; + match exists { + true => Ok(client::blockchain::BlockStatus::InChain), + false => Ok(client::blockchain::BlockStatus::Unknown), + } + } + + fn hash(&self, number: block::Number) -> Result, client::error::Error> { + Ok(self.db.get(columns::BLOCK_INDEX, &number_to_db_key(number)) + .map_err(db_err)? + .map(|hash| block::HeaderHash::from_slice(&hash))) + } +} + +impl client::backend::BlockImportOperation for BlockImportOperation { + type State = DbState; + + fn state(&self) -> Result<&Self::State, client::error::Error> { + Ok(&self.pending_state) + } + + fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_best: bool) -> Result<(), client::error::Error> { + assert!(self.pending_block.is_none(), "Only one block per operation is allowed"); + self.pending_block = Some(PendingBlock { + header, + body, + justification, + is_best, + }); + Ok(()) + } + + fn set_storage, Option>)>>(&mut self, changes: I) -> Result<(), client::error::Error> { + self.pending_state.commit(changes); + Ok(()) + } + + fn reset_storage, Vec)>>(&mut self, iter: I) -> Result<(), client::error::Error> { + self.pending_state.commit(iter.into_iter().map(|(k, v)| (k, Some(v)))); + Ok(()) + } +} + +pub struct DbState { + mem: state_machine::backend::InMemory, + changes: Vec<(Vec, Option>)>, +} + +impl state_machine::Backend for DbState { + type Error = state_machine::backend::Void; + + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + self.mem.storage(key) + } + + fn commit(&mut self, changes: I) + where I: IntoIterator, Option>)> + { + self.changes = changes.into_iter().collect(); + self.mem.commit(self.changes.clone()); + } + + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.mem.pairs() + } +} + +/// In-memory backend. Keeps all states and blocks in memory. Useful for testing. +pub struct Backend { + db: Arc, + blockchain: BlockchainDb, + old_states: RwLock>, +} + +impl Backend { + /// Create a new instance of in-mem backend. + pub fn new(config: &DatabaseSettings) -> Result { + let mut db_config = DatabaseConfig::with_columns(columns::NUM_COLUMNS); + db_config.memory_budget = config.cache_size; + db_config.wal = true; + let path = config.path.to_str().ok_or_else(|| client::error::ErrorKind::Backend("Invalid database path".into()))?; + let db = Arc::new(Database::open(&db_config, &path).map_err(db_err)?); + let blockchain = BlockchainDb::new(db.clone())?; + + //load latest state + let mut state = state_machine::backend::InMemory::new(); + let mut old_states = HashMap::new(); + if let Some(iter) = db.iter(columns::STATE).map(|iter| iter.map(|(k, v)| (k.to_vec(), Some(v.to_vec())))) { + state.commit(iter); + old_states.insert(number_to_db_key(blockchain.meta.read().best_number), state); + } + + debug!("DB Opened at {}", path); + Ok(Backend { + db, + blockchain, + old_states: RwLock::new(old_states) + }) + } +} + +impl client::backend::Backend for Backend { + type BlockImportOperation = BlockImportOperation; + type Blockchain = BlockchainDb; + type State = DbState; + + fn begin_operation(&self, block: BlockId) -> Result { + let state = self.state_at(block)?; + Ok(BlockImportOperation { + pending_block: None, + pending_state: state, + }) + } + + fn commit_operation(&self, operation: Self::BlockImportOperation) -> Result<(), client::error::Error> { + let mut transaction = DBTransaction::new(); + if let Some(pending_block) = operation.pending_block { + let hash: block::HeaderHash = pending_block.header.blake2_256().into(); + let number = pending_block.header.number;; + let key = number_to_db_key(pending_block.header.number); + transaction.put(columns::HEADER, &key, &pending_block.header.encode()); + if let Some(body) = pending_block.body { + transaction.put(columns::BODY, &key, &body.encode()); + } + if let Some(justification) = pending_block.justification { + transaction.put(columns::JUSTIFICATION, &key, &justification.encode()); + } + transaction.put(columns::BLOCK_INDEX, &hash, &key); + if pending_block.is_best { + transaction.put(columns::META, meta::BEST_BLOCK, &key); + } + for (key, val) in operation.pending_state.changes.into_iter() { + match val { + Some(v) => { transaction.put(columns::STATE, &key, &v); }, + None => { transaction.delete(columns::STATE, &key); }, + } + } + let mut states = self.old_states.write(); + states.insert(key, operation.pending_state.mem); + if number >= STATE_HISTORY { + states.remove(&number_to_db_key(number - STATE_HISTORY)); + } + debug!("DB Commit {:?} ({})", hash, number); + self.db.write(transaction).map_err(db_err)?; + self.blockchain.update_meta(hash, number, pending_block.is_best); + } + Ok(()) + } + + fn blockchain(&self) -> &BlockchainDb { + &self.blockchain + } + + fn state_at(&self, block: BlockId) -> Result { + if let Some(state) = self.blockchain.id(block)?.and_then(|id| self.old_states.read().get(&id).cloned()) { + Ok(DbState { mem: state, changes: Vec::new() }) + } else { + Err(client::error::ErrorKind::UnknownBlock(block).into()) + } + } +} + diff --git a/substrate/client/src/backend.rs b/substrate/client/src/backend.rs index b53f48ff49d4b..fdd5e39086743 100644 --- a/substrate/client/src/backend.rs +++ b/substrate/client/src/backend.rs @@ -32,7 +32,7 @@ pub trait BlockImportOperation { fn set_block_data(&mut self, header: block::Header, body: Option, justification: Option, is_new_best: bool) -> error::Result<()>; /// Inject storage data into the database. fn set_storage, Option>)>>(&mut self, changes: I) -> error::Result<()>; - /// Inject storage data into the database. + /// Inject storage data into the database replacing any existing data. fn reset_storage, Vec)>>(&mut self, iter: I) -> error::Result<()>; } diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 0995a3e59a85d..c0b16bf109903 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -215,11 +215,11 @@ impl Client where /// Get the current set of authorities from storage. pub fn authorities_at(&self, id: &BlockId) -> error::Result> { let state = self.state_at(id)?; - (0..u32::decode(&mut state.storage(b":auth:len")?.ok_or(error::ErrorKind::AuthLenEmpty)?).ok_or(error::ErrorKind::AuthLenInvalid)?) + (0..u32::decode(&mut state.storage(b":auth:len")?.ok_or(error::ErrorKind::AuthLenEmpty)?.as_slice()).ok_or(error::ErrorKind::AuthLenInvalid)?) .map(|i| state.storage(&i.to_keyed_vec(b":auth:")) - .map_err(|_| error::ErrorKind::Backend) + .map_err(|e| error::Error::from(e).into()) .and_then(|v| v.ok_or(error::ErrorKind::AuthEmpty(i))) - .and_then(|mut s| AuthorityId::decode(&mut s).ok_or(error::ErrorKind::AuthInvalid(i))) + .and_then(|s| AuthorityId::decode(&mut s.as_slice()).ok_or(error::ErrorKind::AuthInvalid(i))) .map_err(Into::into) ).collect() } diff --git a/substrate/client/src/error.rs b/substrate/client/src/error.rs index 179fa7d910a91..6b34ac6eb6a07 100644 --- a/substrate/client/src/error.rs +++ b/substrate/client/src/error.rs @@ -23,9 +23,9 @@ use primitives::hexdisplay::HexDisplay; error_chain! { errors { /// Backend error. - Backend { + Backend(s: String) { description("Unrecoverable backend error"), - display("Backend error"), + display("Backend error: {}", s), } /// Unknown block. diff --git a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm index 12a47f048cd8f..ac450a04208e9 100755 Binary files a/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm and b/substrate/executor/wasm/target/wasm32-unknown-unknown/release/runtime_test.wasm differ diff --git a/substrate/network/src/sync.rs b/substrate/network/src/sync.rs index 37d579771d070..1599e162860de 100644 --- a/substrate/network/src/sync.rs +++ b/substrate/network/src/sync.rs @@ -295,6 +295,7 @@ impl ChainSync { } // Update common blocks for (_, peer) in self.peers.iter_mut() { + trace!("Updating peer info ours={}, theirs={}", number, peer.best_number); if peer.best_number >= number { peer.common_number = number; peer.common_hash = *hash; @@ -313,6 +314,9 @@ impl ChainSync { peer.best_number = header.number; peer.best_hash = hash; } + if header.number <= self.best_queued_number && header.number > peer.common_number { + peer.common_number = header.number; + } } else { return; } diff --git a/substrate/runtime-io/without_std.rs b/substrate/runtime-io/without_std.rs index 64d69957cf61c..5a20fa9af7c4c 100644 --- a/substrate/runtime-io/without_std.rs +++ b/substrate/runtime-io/without_std.rs @@ -38,6 +38,16 @@ pub extern fn panic_fmt(_fmt: ::core::fmt::Arguments, _file: &'static str, _line } } +#[lang = "oom"] +pub extern fn oom() -> ! { + static OOM_MSG: &str = "Runtime memory exhausted. Aborting"; + + unsafe { + ext_print_utf8(OOM_MSG.as_ptr(), OOM_MSG.len() as u32); + intrinsics::abort(); + } +} + extern "C" { fn ext_print_utf8(utf8_data: *const u8, utf8_len: u32); fn ext_print_hex(data: *const u8, len: u32); diff --git a/substrate/state-machine/src/backend.rs b/substrate/state-machine/src/backend.rs index 2c019510ffcb9..c906b74eeec48 100644 --- a/substrate/state-machine/src/backend.rs +++ b/substrate/state-machine/src/backend.rs @@ -26,14 +26,14 @@ pub trait Backend { type Error: super::Error; /// Get keyed storage associated with specific address, or None if there is nothing associated. - fn storage(&self, key: &[u8]) -> Result, Self::Error>; + fn storage(&self, key: &[u8]) -> Result>, Self::Error>; /// Commit updates to the backend and get new state. fn commit(&mut self, changes: I) where I: IntoIterator, Option>)>; /// Get all key/value pairs into a Vec. - fn pairs(&self) -> Vec<(&[u8], &[u8])>; + fn pairs(&self) -> Vec<(Vec, Vec)>; } /// Error impossible. @@ -58,8 +58,8 @@ pub type InMemory = HashMap, Vec>; impl Backend for InMemory { type Error = Void; - fn storage(&self, key: &[u8]) -> Result, Self::Error> { - Ok(self.get(key).map(AsRef::as_ref)) + fn storage(&self, key: &[u8]) -> Result>, Self::Error> { + Ok(self.get(key).map(Clone::clone)) } fn commit(&mut self, changes: I) @@ -73,9 +73,8 @@ impl Backend for InMemory { } } - fn pairs(&self) -> Vec<(&[u8], &[u8])> { - self.iter().map(|(k, v)| (&k[..], &v[..])).collect() + fn pairs(&self) -> Vec<(Vec, Vec)> { + self.iter().map(|(k, v)| (k.clone(), v.clone())).collect() } } -// TODO: DB-based backend diff --git a/substrate/state-machine/src/ext.rs b/substrate/state-machine/src/ext.rs index ac047a31c303c..580e0209f4774 100644 --- a/substrate/state-machine/src/ext.rs +++ b/substrate/state-machine/src/ext.rs @@ -76,8 +76,8 @@ impl<'a, B: 'a + Backend> Ext<'a, B> { impl<'a, B: 'a> Externalities for Ext<'a, B> where B: Backend { - fn storage(&self, key: &[u8]) -> Option<&[u8]> { - self.overlay.storage(key).unwrap_or_else(|| + fn storage(&self, key: &[u8]) -> Option> { + self.overlay.storage(key).map(|x| x.map(|x| x.to_vec())).unwrap_or_else(|| self.backend.storage(key).expect("Externalities not allowed to fail within runtime")) } @@ -90,8 +90,8 @@ impl<'a, B: 'a> Externalities for Ext<'a, B> } fn storage_root(&self) -> [u8; 32] { - trie_root(self.backend.pairs().iter() - .map(|&(ref k, ref v)| (k.to_vec(), Some(v.to_vec()))) + trie_root(self.backend.pairs().into_iter() + .map(|(k, v)| (k, Some(v))) .chain(self.overlay.committed.clone().into_iter()) .chain(self.overlay.prospective.clone().into_iter()) .collect::>() diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 3da401d0dd73e..4a8d377e2c5fe 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -111,7 +111,7 @@ impl fmt::Display for ExecutionError { /// Externalities: pinned to specific active address. pub trait Externalities { /// Read storage of current contract being called. - fn storage(&self, key: &[u8]) -> Option<&[u8]>; + fn storage(&self, key: &[u8]) -> Option>; /// Set storage entry `key` of current contract being called (effective immediately). fn set_storage(&mut self, key: Vec, value: Vec) { diff --git a/substrate/state-machine/src/testing.rs b/substrate/state-machine/src/testing.rs index 6d991a9acab5b..9bd54c74f930d 100644 --- a/substrate/state-machine/src/testing.rs +++ b/substrate/state-machine/src/testing.rs @@ -24,8 +24,8 @@ use triehash::trie_root; pub type TestExternalities = HashMap, Vec>; impl Externalities for TestExternalities { - fn storage(&self, key: &[u8]) -> Option<&[u8]> { - self.get(key).map(AsRef::as_ref) + fn storage(&self, key: &[u8]) -> Option> { + self.get(key).map(|x| x.to_vec()) } fn place_storage(&mut self, key: Vec, maybe_value: Option>) {