[beta] Backports (#8785)
* Fix light sync with initial validator-set contract (#8528) * Fix #8468 * Use U256::max_value() instead * Fix again * Also change initial transaction gas * Resumable warp-sync / Seed downloaded snapshots (#8544) * Start dividing sync chain : first supplier method * WIP - updated chain sync supplier * Finish refactoring the Chain Sync Supplier * Create Chain Sync Requester * Add Propagator for Chain Sync * Add the Chain Sync Handler * Move tests from mod -> handler * Move tests to propagator * Refactor SyncRequester arguments * Refactoring peer fork header handler * Fix wrong highest block number in snapshot sync * Small refactor... * Resume warp-sync downloaded chunks * Add comments * Refactoring the previous chunks import * Fix tests * Address PR grumbles * Fix not seeding current snapshot * Address PR Grumbles * Address PR grumble * Retry failed CI job * Update SnapshotService readiness check Fix restoration locking issue for previous chunks restoration * Fix tests * Fix tests * Fix test * Early abort importing previous chunks * PR Grumbles * Update Gitlab CI config * SyncState back to Waiting when Manifest peers disconnect * Move fix * Better fix * Revert GitLab CI changes * Fix Warning * Refactor resuming snapshots * Fix string construction * Revert "Refactor resuming snapshots" This reverts commit 75fd4b553a38e4a49dc5d6a878c70e830ff382eb. * Update informant log * Fix string construction * Refactor resuming snapshots * Fix informant * PR Grumbles * Update informant message : show chunks done * PR Grumbles * Fix * Fix Warning * PR Grumbles * Don't open Browser post-install on Mac (#8641) Since we start parity with the UI disabled per default now, opening the browser post installation will show an annoying error message, confusing the user. This patch removes opening the browser to prevent that annoyance. fixes #8194 * Fix not downloading old blocks (#8642) * Fix PoW blockchains sealing notifications in chain_new_blocks (#8656) * Shutdown the Snapshot Service early (#8658) * Shutdown the Snapshot Service when shutting down the runner * Rename `service` to `client_service` * Fix tests * Fix cli signer (#8682) * Update ethereum-types so `{:#x}` applies 0x prefix * Set the request index to that of the current request (#8683) * Set the request index to that of the current request When setting up the chain of (two) requests to look up a block by hash, the second need to refer to the first. This fixes an issue where the back ref was set to the subsequent request, not the current one. When the requests are executed we loop through them in order and ensure the requests that should produce headers all match up. We do this by index so they better be right. In other words: off by one. * network-devp2p: handle UselessPeer disconnect (#8686) * Fix local transactions policy. (#8691) * CI: Fixes for Android Pipeline (#8745) * ci: Remove check for shared libraries in gitlab script * ci: allow android arm build to fail * Custom Error Messages on ENFILE and EMFILE IO Errors (#8744) * Custom Error Messages on ENFILE and EMFILE IO Errors Add custom mapping of ENFILE and EMFILE IO Errors (Failure because of missing system resource) right when chaining ioError into ::util::Network::Error to improve Error Messages given to user Note: Adds libc as a dependency to util/network * Use assert-matches for more readable tests * Fix Wording and consistency * ethcore-sync: fix connection to peers behind chain fork block (#8710)
This commit is contained in:
parent
69d6d8239f
commit
7bf16cce1b
@ -180,6 +180,23 @@ windows:
|
|||||||
paths:
|
paths:
|
||||||
- parity.zip
|
- parity.zip
|
||||||
name: "x86_64-pc-windows-msvc_parity"
|
name: "x86_64-pc-windows-msvc_parity"
|
||||||
|
android-armv7:
|
||||||
|
stage: build
|
||||||
|
image: parity/parity-android:latest
|
||||||
|
only:
|
||||||
|
- beta
|
||||||
|
- tags
|
||||||
|
- stable
|
||||||
|
- triggers
|
||||||
|
script:
|
||||||
|
- cargo build --target=armv7-linux-androideabi
|
||||||
|
tags:
|
||||||
|
- rust-arm
|
||||||
|
allow_failure: true
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- parity.zip
|
||||||
|
name: "armv7-linux-androideabi_parity"
|
||||||
docker-build:
|
docker-build:
|
||||||
stage: build
|
stage: build
|
||||||
only:
|
only:
|
||||||
|
195
Cargo.lock
generated
195
Cargo.lock
generated
@ -75,7 +75,7 @@ name = "backtrace-sys"
|
|||||||
version = "0.1.14"
|
version = "0.1.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -109,12 +109,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bigint"
|
name = "bigint"
|
||||||
version = "4.2.0"
|
version = "4.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -199,7 +198,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.9"
|
version = "1.0.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -248,7 +247,7 @@ name = "common-types"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
@ -385,7 +384,7 @@ name = "dir"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"app_dirs 1.2.1 (git+https://github.com/paritytech/app-dirs-rs)",
|
"app_dirs 1.2.1 (git+https://github.com/paritytech/app-dirs-rs)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"journaldb 0.1.0",
|
"journaldb 0.1.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -447,7 +446,7 @@ version = "0.5.7"
|
|||||||
source = "git+https://github.com/paritytech/rust-secp256k1#db81cfea59014b4d176f10f86ed52e1a130b6822"
|
source = "git+https://github.com/paritytech/rust-secp256k1#db81cfea59014b4d176f10f86ed52e1a130b6822"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -457,12 +456,12 @@ version = "5.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -504,7 +503,7 @@ dependencies = [
|
|||||||
"ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -529,7 +528,7 @@ dependencies = [
|
|||||||
"ethcore-miner 1.11.0",
|
"ethcore-miner 1.11.0",
|
||||||
"ethcore-stratum 1.11.0",
|
"ethcore-stratum 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"ethstore 0.2.0",
|
"ethstore 0.2.0",
|
||||||
@ -551,7 +550,7 @@ dependencies = [
|
|||||||
"memory-cache 0.1.0",
|
"memory-cache 0.1.0",
|
||||||
"memorydb 0.1.1",
|
"memorydb 0.1.1",
|
||||||
"num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-machine 0.1.0",
|
"parity-machine 0.1.0",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"patricia-trie 0.1.0",
|
"patricia-trie 0.1.0",
|
||||||
@ -592,11 +591,11 @@ name = "ethcore-crypto"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)",
|
"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)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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)",
|
"subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -625,7 +624,7 @@ dependencies = [
|
|||||||
"ethcore-io 1.11.0",
|
"ethcore-io 1.11.0",
|
||||||
"ethcore-network 1.11.0",
|
"ethcore-network 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hashdb 0.1.1",
|
"hashdb 0.1.1",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -675,7 +674,7 @@ dependencies = [
|
|||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethash 1.11.0",
|
"ethash 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"fetch 0.1.0",
|
"fetch 0.1.0",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -700,12 +699,14 @@ dependencies = [
|
|||||||
name = "ethcore-network"
|
name = "ethcore-network"
|
||||||
version = "1.11.0"
|
version = "1.11.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"assert_matches 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-crypto 0.1.0",
|
"ethcore-crypto 0.1.0",
|
||||||
"ethcore-io 1.11.0",
|
"ethcore-io 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rlp 0.2.1",
|
"rlp 0.2.1",
|
||||||
"snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)",
|
"snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)",
|
||||||
]
|
]
|
||||||
@ -723,7 +724,7 @@ dependencies = [
|
|||||||
"ethcore-io 1.11.0",
|
"ethcore-io 1.11.0",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethcore-network 1.11.0",
|
"ethcore-network 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"igd 0.7.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)",
|
"ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -743,7 +744,7 @@ dependencies = [
|
|||||||
"slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)",
|
"snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)",
|
||||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -761,7 +762,7 @@ dependencies = [
|
|||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethcore-miner 1.11.0",
|
"ethcore-miner 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"fetch 0.1.0",
|
"fetch 0.1.0",
|
||||||
@ -777,7 +778,7 @@ dependencies = [
|
|||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -795,7 +796,7 @@ dependencies = [
|
|||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethcore-sync 1.11.0",
|
"ethcore-sync 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -811,7 +812,7 @@ dependencies = [
|
|||||||
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -844,7 +845,7 @@ version = "1.11.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
"jsonrpc-macros 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-macros 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
"jsonrpc-tcp-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-tcp-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
@ -868,7 +869,7 @@ dependencies = [
|
|||||||
"ethcore-network-devp2p 1.11.0",
|
"ethcore-network-devp2p 1.11.0",
|
||||||
"ethcore-private-tx 1.0.0",
|
"ethcore-private-tx 1.0.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ipnetwork 0.12.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -892,7 +893,7 @@ dependencies = [
|
|||||||
name = "ethcore-transaction"
|
name = "ethcore-transaction"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"evm 0.1.0",
|
"evm 0.1.0",
|
||||||
@ -905,7 +906,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ethereum-types"
|
name = "ethereum-types"
|
||||||
version = "0.3.1"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -914,7 +915,7 @@ dependencies = [
|
|||||||
"fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc_version 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -929,7 +930,7 @@ dependencies = [
|
|||||||
name = "ethjson"
|
name = "ethjson"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -943,7 +944,7 @@ dependencies = [
|
|||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"edit-distance 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"edit-distance 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)",
|
"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)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.9 (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",
|
"mem 0.1.0",
|
||||||
@ -951,7 +952,7 @@ dependencies = [
|
|||||||
"rand 0.4.2 (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)",
|
"rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -975,7 +976,7 @@ version = "0.2.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"dir 0.1.0",
|
"dir 0.1.0",
|
||||||
"ethcore-crypto 0.1.0",
|
"ethcore-crypto 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -993,7 +994,7 @@ dependencies = [
|
|||||||
"subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1003,7 +1004,7 @@ dependencies = [
|
|||||||
"dir 0.1.0",
|
"dir 0.1.0",
|
||||||
"docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethstore 0.2.0",
|
"ethstore 0.2.0",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"panic_hook 0.1.0",
|
"panic_hook 0.1.0",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1017,7 +1018,7 @@ name = "evm"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1036,7 +1037,7 @@ dependencies = [
|
|||||||
"ethcore 1.11.0",
|
"ethcore 1.11.0",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"evm 0.1.0",
|
"evm 0.1.0",
|
||||||
"panic_hook 0.1.0",
|
"panic_hook 0.1.0",
|
||||||
@ -1129,7 +1130,7 @@ version = "0.1.8"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1176,7 +1177,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
name = "hardware-wallet"
|
name = "hardware-wallet"
|
||||||
version = "1.11.0"
|
version = "1.11.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"hidapi 0.3.1 (git+https://github.com/paritytech/hidapi-rs)",
|
"hidapi 0.3.1 (git+https://github.com/paritytech/hidapi-rs)",
|
||||||
"libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)",
|
"libusb 0.3.0 (git+https://github.com/paritytech/libusb-rs)",
|
||||||
@ -1192,7 +1193,7 @@ name = "hashdb"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1221,7 +1222,7 @@ name = "hidapi"
|
|||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "git+https://github.com/paritytech/hidapi-rs#70ec4bd1b755ec5dd32ad2be0c8345864147c8bc"
|
source = "git+https://github.com/paritytech/hidapi-rs#70ec4bd1b755ec5dd32ad2be0c8345864147c8bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1340,7 +1341,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hashdb 0.1.1",
|
"hashdb 0.1.1",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
@ -1454,10 +1455,10 @@ dependencies = [
|
|||||||
name = "keccak-hash"
|
name = "keccak-hash"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1491,11 +1492,11 @@ name = "kvdb-rocksdb"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"interleaved-ordered 0.1.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",
|
"kvdb 0.1.0",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.7.0 (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.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)",
|
"rocksdb 0.4.5 (git+https://github.com/paritytech/rust-rocksdb)",
|
||||||
@ -1542,7 +1543,7 @@ name = "libusb-sys"
|
|||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
source = "git+https://github.com/paritytech/libusb-sys#14bdb698003731b6344a79e1d814704e44363e7c"
|
source = "git+https://github.com/paritytech/libusb-sys#14bdb698003731b6344a79e1d814704e44363e7c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1642,9 +1643,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
name = "memorydb"
|
name = "memorydb"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bigint 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hashdb 0.1.1",
|
"hashdb 0.1.1",
|
||||||
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
@ -1697,7 +1698,7 @@ name = "miniz_oxide_c_api"
|
|||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1776,7 +1777,7 @@ version = "0.7.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ring 0.12.1 (git+https://github.com/paritytech/ring)",
|
"ring 0.12.1 (git+https://github.com/paritytech/ring)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1806,7 +1807,7 @@ dependencies = [
|
|||||||
"ethcore 1.11.0",
|
"ethcore 1.11.0",
|
||||||
"ethcore-io 1.11.0",
|
"ethcore-io 1.11.0",
|
||||||
"ethcore-network-devp2p 1.11.0",
|
"ethcore-network-devp2p 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"kvdb-memorydb 0.1.0",
|
"kvdb-memorydb 0.1.0",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1865,7 +1866,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1901,7 +1902,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num_cpus"
|
name = "num_cpus"
|
||||||
version = "1.7.0"
|
version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1955,7 +1956,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parity"
|
name = "parity"
|
||||||
version = "1.11.1"
|
version = "1.11.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1978,7 +1979,7 @@ dependencies = [
|
|||||||
"ethcore-stratum 1.11.0",
|
"ethcore-stratum 1.11.0",
|
||||||
"ethcore-sync 1.11.0",
|
"ethcore-sync 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"fake-fetch 0.0.1",
|
"fake-fetch 0.0.1",
|
||||||
"fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1995,7 +1996,7 @@ dependencies = [
|
|||||||
"migration-rocksdb 0.1.0",
|
"migration-rocksdb 0.1.0",
|
||||||
"node-filter 1.11.0",
|
"node-filter 1.11.0",
|
||||||
"node-health 0.1.0",
|
"node-health 0.1.0",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"panic_hook 0.1.0",
|
"panic_hook 0.1.0",
|
||||||
"parity-dapps 1.11.0",
|
"parity-dapps 1.11.0",
|
||||||
@ -2006,7 +2007,7 @@ dependencies = [
|
|||||||
"parity-rpc 1.11.0",
|
"parity-rpc 1.11.0",
|
||||||
"parity-rpc-client 1.4.0",
|
"parity-rpc-client 1.4.0",
|
||||||
"parity-updater 1.11.0",
|
"parity-updater 1.11.0",
|
||||||
"parity-version 1.11.1",
|
"parity-version 1.11.2",
|
||||||
"parity-whisper 0.1.0",
|
"parity-whisper 0.1.0",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"path 0.1.0",
|
"path 0.1.0",
|
||||||
@ -2037,7 +2038,7 @@ dependencies = [
|
|||||||
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-devtools 1.11.0",
|
"ethcore-devtools 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fetch 0.1.0",
|
"fetch 0.1.0",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2054,7 +2055,7 @@ dependencies = [
|
|||||||
"parity-reactor 0.1.0",
|
"parity-reactor 0.1.0",
|
||||||
"parity-ui 1.11.0",
|
"parity-ui 1.11.0",
|
||||||
"parity-ui-deprecation 1.10.0",
|
"parity-ui-deprecation 1.10.0",
|
||||||
"parity-version 1.11.1",
|
"parity-version 1.11.2",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"registrar 0.0.1",
|
"registrar 0.0.1",
|
||||||
@ -2102,7 +2103,7 @@ dependencies = [
|
|||||||
"ethabi-contract 5.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethabi-contract 5.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethabi-derive 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethabi-derive 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fake-fetch 0.0.1",
|
"fake-fetch 0.0.1",
|
||||||
"fetch 0.1.0",
|
"fetch 0.1.0",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2126,7 +2127,7 @@ dependencies = [
|
|||||||
"cid 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cid 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore 1.11.0",
|
"ethcore 1.11.0",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
"jsonrpc-http-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-http-server 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
"multihash 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"multihash 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2155,7 +2156,7 @@ dependencies = [
|
|||||||
name = "parity-machine"
|
name = "parity-machine"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2185,7 +2186,7 @@ dependencies = [
|
|||||||
"ethcore-private-tx 1.0.0",
|
"ethcore-private-tx 1.0.0",
|
||||||
"ethcore-sync 1.11.0",
|
"ethcore-sync 1.11.0",
|
||||||
"ethcore-transaction 0.1.0",
|
"ethcore-transaction 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"ethstore 0.2.0",
|
"ethstore 0.2.0",
|
||||||
@ -2210,7 +2211,7 @@ dependencies = [
|
|||||||
"order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-reactor 0.1.0",
|
"parity-reactor 0.1.0",
|
||||||
"parity-updater 1.11.0",
|
"parity-updater 1.11.0",
|
||||||
"parity-version 1.11.1",
|
"parity-version 1.11.2",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"patricia-trie 0.1.0",
|
"patricia-trie 0.1.0",
|
||||||
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2224,7 +2225,7 @@ dependencies = [
|
|||||||
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"stats 0.1.0",
|
"stats 0.1.0",
|
||||||
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"transaction-pool 1.11.0",
|
"transaction-pool 1.11.0",
|
||||||
"transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2325,13 +2326,13 @@ dependencies = [
|
|||||||
"ethcore 1.11.0",
|
"ethcore 1.11.0",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-sync 1.11.0",
|
"ethcore-sync 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"lazy_static 1.0.0 (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)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-hash-fetch 1.11.0",
|
"parity-hash-fetch 1.11.0",
|
||||||
"parity-version 1.11.1",
|
"parity-version 1.11.2",
|
||||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"path 0.1.0",
|
"path 0.1.0",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2342,7 +2343,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parity-version"
|
name = "parity-version"
|
||||||
version = "1.11.1"
|
version = "1.11.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"rlp 0.2.1",
|
"rlp 0.2.1",
|
||||||
@ -2370,7 +2371,7 @@ dependencies = [
|
|||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-crypto 0.1.0",
|
"ethcore-crypto 0.1.0",
|
||||||
"ethcore-network 1.11.0",
|
"ethcore-network 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethkey 0.3.0",
|
"ethkey 0.3.0",
|
||||||
"hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hex 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||||
@ -2388,7 +2389,7 @@ dependencies = [
|
|||||||
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"smallvec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"smallvec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2433,7 +2434,7 @@ dependencies = [
|
|||||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hashdb 0.1.1",
|
"hashdb 0.1.1",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2489,7 +2490,7 @@ name = "plain_hasher"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2588,7 +2589,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 2.29.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.29.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2684,7 +2685,7 @@ dependencies = [
|
|||||||
"crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -2742,7 +2743,7 @@ name = "ring"
|
|||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
source = "git+https://github.com/paritytech/ring#b98d7f586c0467d68e9946a5f47b4a04b9a86b4a"
|
source = "git+https://github.com/paritytech/ring#b98d7f586c0467d68e9946a5f47b4a04b9a86b4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2756,7 +2757,7 @@ version = "0.2.1"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -2793,7 +2794,7 @@ name = "rocksdb-sys"
|
|||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e"
|
source = "git+https://github.com/paritytech/rust-rocksdb#ecf06adf3148ab10f6f7686b724498382ff4f36e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"local-encoding 0.2.0 (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)",
|
"snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)",
|
||||||
@ -2814,7 +2815,7 @@ dependencies = [
|
|||||||
name = "rpc-cli"
|
name = "rpc-cli"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bigint 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-rpc 1.11.0",
|
"parity-rpc 1.11.0",
|
||||||
"parity-rpc-client 1.4.0",
|
"parity-rpc-client 1.4.0",
|
||||||
@ -2965,7 +2966,7 @@ name = "shell32-sys"
|
|||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -3030,7 +3031,7 @@ name = "snappy-sys"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/paritytech/rust-snappy#40ac9a0d9fd613e7f38df800a11a589b7296da73"
|
source = "git+https://github.com/paritytech/rust-snappy#40ac9a0d9fd613e7f38df800a11a589b7296da73"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -3193,7 +3194,7 @@ name = "threadpool"
|
|||||||
version = "1.7.1"
|
version = "1.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3209,7 +3210,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tiny-keccak"
|
name = "tiny-keccak"
|
||||||
version = "1.4.1"
|
version = "1.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3360,7 +3361,7 @@ dependencies = [
|
|||||||
"crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crossbeam-deque 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
@ -3432,7 +3433,7 @@ name = "transaction-pool"
|
|||||||
version = "1.11.0"
|
version = "1.11.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"smallvec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"smallvec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"trace-time 0.1.0",
|
"trace-time 0.1.0",
|
||||||
@ -3459,7 +3460,7 @@ name = "trie-standardmap"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"rlp 0.2.1",
|
"rlp 0.2.1",
|
||||||
]
|
]
|
||||||
@ -3469,7 +3470,7 @@ name = "triehash"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"rlp 0.2.1",
|
"rlp 0.2.1",
|
||||||
"trie-standardmap 0.1.0",
|
"trie-standardmap 0.1.0",
|
||||||
@ -3477,7 +3478,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uint"
|
name = "uint"
|
||||||
version = "0.2.0"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3584,7 +3585,7 @@ name = "util-error"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"kvdb 0.1.0",
|
"kvdb 0.1.0",
|
||||||
"rlp 0.2.1",
|
"rlp 0.2.1",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3616,7 +3617,7 @@ dependencies = [
|
|||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"common-types 0.1.0",
|
"common-types 0.1.0",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethjson 0.1.0",
|
"ethjson 0.1.0",
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3635,7 +3636,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-logger 1.11.0",
|
"ethcore-logger 1.11.0",
|
||||||
"ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-wasm 0.27.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-wasm 0.27.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -3792,7 +3793,7 @@ dependencies = [
|
|||||||
"checksum base32 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9605ba46d61df0410d8ac686b0007add8172eba90e8e909c347856fe794d8c"
|
"checksum base32 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b9605ba46d61df0410d8ac686b0007add8172eba90e8e909c347856fe794d8c"
|
||||||
"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9"
|
"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 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 bigint 4.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4a6d961f23ce43ce7391b994c78174691e41274a5c48a1cda69caf04af173e1"
|
||||||
"checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e"
|
"checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e"
|
||||||
"checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
|
"checksum bit-set 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9bf6104718e80d7b26a68fdbacff3481cfc05df670821affc7e9cbc1884400c"
|
||||||
"checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
|
"checksum bit-vec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b4ff8b16e6076c3e14220b39fbc1fabb6737522281a388998046859400895f"
|
||||||
@ -3804,7 +3805,7 @@ dependencies = [
|
|||||||
"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
|
"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
|
||||||
"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
|
"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
|
||||||
"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9"
|
"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9"
|
||||||
"checksum cc 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "2b4911e4bdcb4100c7680e7e854ff38e23f1b34d4d9e079efae3da2801341ffc"
|
"checksum cc 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8b9d2900f78631a5876dc5d6c9033ede027253efcd33dd36b1309fc6cab97ee0"
|
||||||
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
||||||
"checksum cid 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d85ee025368e69063c420cbb2ed9f852cb03a5e69b73be021e65726ce03585b6"
|
"checksum cid 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d85ee025368e69063c420cbb2ed9f852cb03a5e69b73be021e65726ce03585b6"
|
||||||
"checksum clap 2.29.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8f4a2b3bb7ef3c672d7c13d15613211d5a6976b6892c598b0fcb5d40765f19c2"
|
"checksum clap 2.29.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8f4a2b3bb7ef3c672d7c13d15613211d5a6976b6892c598b0fcb5d40765f19c2"
|
||||||
@ -3835,7 +3836,7 @@ dependencies = [
|
|||||||
"checksum ethabi-contract 5.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "210c9e21d164c15b6ef64fe601e0e12a3c84a031d5ef558e38463e53edbd22ed"
|
"checksum ethabi-contract 5.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "210c9e21d164c15b6ef64fe601e0e12a3c84a031d5ef558e38463e53edbd22ed"
|
||||||
"checksum ethabi-derive 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2bc7099baa147187aedaecd9fe04a6c0541c82bc43ff317cb6900fe2b983d74"
|
"checksum ethabi-derive 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2bc7099baa147187aedaecd9fe04a6c0541c82bc43ff317cb6900fe2b983d74"
|
||||||
"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386"
|
"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386"
|
||||||
"checksum ethereum-types 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3ae691a36ce5d25b433e63128ce5579f4a18457b6a9c849832b2c9e0fec92a"
|
"checksum ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c48729b8aea8aedb12cf4cb2e5cef439fdfe2dda4a89e47eeebd15778ef53b6"
|
||||||
"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002"
|
"checksum ethereum-types-serialize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ac59a21a9ce98e188f3dace9eb67a6c4a3c67ec7fbc7218cb827852679dc002"
|
||||||
"checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa"
|
"checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa"
|
||||||
"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576"
|
"checksum fixed-hash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18d6fd718fb4396e7a9c93ac59ba7143501467ca7a143c145b5555a571d5576"
|
||||||
@ -3914,7 +3915,7 @@ dependencies = [
|
|||||||
"checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593"
|
"checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593"
|
||||||
"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
|
"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
|
||||||
"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364"
|
"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364"
|
||||||
"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
|
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"
|
||||||
"checksum number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "59a14be9c211cb9c602bad35ac99f41e9a84b44d71b8cbd3040e3bd02a214902"
|
"checksum number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "59a14be9c211cb9c602bad35ac99f41e9a84b44d71b8cbd3040e3bd02a214902"
|
||||||
"checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c"
|
"checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c"
|
||||||
"checksum order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "efa535d5117d3661134dbf1719b6f0ffe06f2375843b13935db186cd094105eb"
|
"checksum order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "efa535d5117d3661134dbf1719b6f0ffe06f2375843b13935db186cd094105eb"
|
||||||
@ -4012,7 +4013,7 @@ dependencies = [
|
|||||||
"checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"
|
"checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"
|
||||||
"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865"
|
"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865"
|
||||||
"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
|
"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
|
||||||
"checksum tiny-keccak 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "58911ed5eb275a8fd2f1f0418ed360a42f59329864b64e1e95377a9024498c01"
|
"checksum tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9175261fbdb60781fcd388a4d6cc7e14764a2b629a7ad94abb439aed223a44f"
|
||||||
"checksum tokio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "be15ef40f675c9fe66e354d74c73f3ed012ca1aa14d65846a33ee48f1ae8d922"
|
"checksum tokio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "be15ef40f675c9fe66e354d74c73f3ed012ca1aa14d65846a33ee48f1ae8d922"
|
||||||
"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71"
|
"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71"
|
||||||
"checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113"
|
"checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113"
|
||||||
@ -4032,7 +4033,7 @@ dependencies = [
|
|||||||
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
|
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
|
||||||
"checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f"
|
"checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f"
|
||||||
"checksum trezor-sys 1.0.0 (git+https://github.com/paritytech/trezor-sys)" = "<none>"
|
"checksum trezor-sys 1.0.0 (git+https://github.com/paritytech/trezor-sys)" = "<none>"
|
||||||
"checksum uint 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6477b2716357758c176c36719023e1f9726974d762150e4fc0a9c8c75488c343"
|
"checksum uint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38051a96565903d81c9a9210ce11076b2218f3b352926baa1f5f6abbdfce8273"
|
||||||
"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33"
|
"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 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-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
||||||
|
@ -29,7 +29,7 @@ use sync::PrivateTxHandler;
|
|||||||
use ethcore::client::{Client, ClientConfig, ChainNotify, ClientIoMessage};
|
use ethcore::client::{Client, ClientConfig, ChainNotify, ClientIoMessage};
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::snapshot::service::{Service as SnapshotService, ServiceParams as SnapServiceParams};
|
use ethcore::snapshot::service::{Service as SnapshotService, ServiceParams as SnapServiceParams};
|
||||||
use ethcore::snapshot::{RestorationStatus};
|
use ethcore::snapshot::{SnapshotService as _SnapshotService, RestorationStatus};
|
||||||
use ethcore::spec::Spec;
|
use ethcore::spec::Spec;
|
||||||
use ethcore::account_provider::AccountProvider;
|
use ethcore::account_provider::AccountProvider;
|
||||||
|
|
||||||
@ -168,6 +168,11 @@ impl ClientService {
|
|||||||
|
|
||||||
/// Get a handle to the database.
|
/// Get a handle to the database.
|
||||||
pub fn db(&self) -> Arc<KeyValueDB> { self.database.clone() }
|
pub fn db(&self) -> Arc<KeyValueDB> { self.database.clone() }
|
||||||
|
|
||||||
|
/// Shutdown the Client Service
|
||||||
|
pub fn shutdown(&self) {
|
||||||
|
self.snapshot.shutdown();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// IO interface for the Client handler
|
/// IO interface for the Client handler
|
||||||
|
@ -18,7 +18,7 @@ use std::collections::{HashSet, HashMap, BTreeMap, BTreeSet, VecDeque};
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering};
|
use std::sync::atomic::{AtomicBool, Ordering as AtomicOrdering};
|
||||||
use std::time::{Instant};
|
use std::time::{Instant};
|
||||||
|
|
||||||
// util
|
// util
|
||||||
@ -208,6 +208,8 @@ pub struct Client {
|
|||||||
queue_transactions: IoChannelQueue,
|
queue_transactions: IoChannelQueue,
|
||||||
/// Ancient blocks import queue
|
/// Ancient blocks import queue
|
||||||
queue_ancient_blocks: IoChannelQueue,
|
queue_ancient_blocks: IoChannelQueue,
|
||||||
|
/// Hashes of pending ancient block wainting to be included
|
||||||
|
pending_ancient_blocks: RwLock<HashSet<H256>>,
|
||||||
/// Consensus messages import queue
|
/// Consensus messages import queue
|
||||||
queue_consensus_message: IoChannelQueue,
|
queue_consensus_message: IoChannelQueue,
|
||||||
|
|
||||||
@ -461,6 +463,7 @@ impl Importer {
|
|||||||
let hash = header.hash();
|
let hash = header.hash();
|
||||||
let _import_lock = self.import_lock.lock();
|
let _import_lock = self.import_lock.lock();
|
||||||
|
|
||||||
|
trace!(target: "client", "Trying to import old block #{}", header.number());
|
||||||
{
|
{
|
||||||
trace_time!("import_old_block");
|
trace_time!("import_old_block");
|
||||||
// verify the block, passing the chain for updating the epoch verifier.
|
// verify the block, passing the chain for updating the epoch verifier.
|
||||||
@ -741,6 +744,7 @@ impl Client {
|
|||||||
notify: RwLock::new(Vec::new()),
|
notify: RwLock::new(Vec::new()),
|
||||||
queue_transactions: IoChannelQueue::new(MAX_TX_QUEUE_SIZE),
|
queue_transactions: IoChannelQueue::new(MAX_TX_QUEUE_SIZE),
|
||||||
queue_ancient_blocks: IoChannelQueue::new(MAX_ANCIENT_BLOCKS_QUEUE_SIZE),
|
queue_ancient_blocks: IoChannelQueue::new(MAX_ANCIENT_BLOCKS_QUEUE_SIZE),
|
||||||
|
pending_ancient_blocks: RwLock::new(HashSet::new()),
|
||||||
queue_consensus_message: IoChannelQueue::new(usize::max_value()),
|
queue_consensus_message: IoChannelQueue::new(usize::max_value()),
|
||||||
last_hashes: RwLock::new(VecDeque::new()),
|
last_hashes: RwLock::new(VecDeque::new()),
|
||||||
factories: factories,
|
factories: factories,
|
||||||
@ -1972,7 +1976,7 @@ impl BlockChainClient for Client {
|
|||||||
impl IoClient for Client {
|
impl IoClient for Client {
|
||||||
fn queue_transactions(&self, transactions: Vec<Bytes>, peer_id: usize) {
|
fn queue_transactions(&self, transactions: Vec<Bytes>, peer_id: usize) {
|
||||||
let len = transactions.len();
|
let len = transactions.len();
|
||||||
self.queue_transactions.queue(&mut self.io_channel.lock(), len, move |client| {
|
self.queue_transactions.queue(&mut self.io_channel.lock(), move |client| {
|
||||||
trace_time!("import_queued_transactions");
|
trace_time!("import_queued_transactions");
|
||||||
|
|
||||||
let txs: Vec<UnverifiedTransaction> = transactions
|
let txs: Vec<UnverifiedTransaction> = transactions
|
||||||
@ -1996,23 +2000,32 @@ impl IoClient for Client {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// check block order
|
// check block order
|
||||||
if self.chain.read().is_known(&header.hash()) {
|
if self.chain.read().is_known(&hash) {
|
||||||
bail!(BlockImportErrorKind::Import(ImportErrorKind::AlreadyInChain));
|
bail!(BlockImportErrorKind::Import(ImportErrorKind::AlreadyInChain));
|
||||||
}
|
}
|
||||||
let status = self.block_status(BlockId::Hash(*header.parent_hash()));
|
|
||||||
if status == BlockStatus::Unknown || status == BlockStatus::Pending {
|
let parent_hash = *header.parent_hash();
|
||||||
bail!(BlockImportErrorKind::Block(BlockError::UnknownParent(*header.parent_hash())));
|
let parent_pending = self.pending_ancient_blocks.read().contains(&parent_hash);
|
||||||
|
let status = self.block_status(BlockId::Hash(parent_hash));
|
||||||
|
if !parent_pending && (status == BlockStatus::Unknown || status == BlockStatus::Pending) {
|
||||||
|
bail!(BlockImportErrorKind::Block(BlockError::UnknownParent(parent_hash)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match self.queue_ancient_blocks.queue(&mut self.io_channel.lock(), 1, move |client| {
|
self.pending_ancient_blocks.write().insert(hash);
|
||||||
client.importer.import_old_block(
|
|
||||||
|
trace!(target: "client", "Queuing old block #{}", header.number());
|
||||||
|
match self.queue_ancient_blocks.queue(&mut self.io_channel.lock(), move |client| {
|
||||||
|
let result = client.importer.import_old_block(
|
||||||
&header,
|
&header,
|
||||||
&block_bytes,
|
&block_bytes,
|
||||||
&receipts_bytes,
|
&receipts_bytes,
|
||||||
&**client.db.read(),
|
&**client.db.read(),
|
||||||
&*client.chain.read()
|
&*client.chain.read()
|
||||||
).map(|_| ()).unwrap_or_else(|e| {
|
);
|
||||||
|
|
||||||
|
client.pending_ancient_blocks.write().remove(&hash);
|
||||||
|
result.map(|_| ()).unwrap_or_else(|e| {
|
||||||
error!(target: "client", "Error importing ancient block: {}", e);
|
error!(target: "client", "Error importing ancient block: {}", e);
|
||||||
});
|
});
|
||||||
}) {
|
}) {
|
||||||
@ -2022,7 +2035,7 @@ impl IoClient for Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn queue_consensus_message(&self, message: Bytes) {
|
fn queue_consensus_message(&self, message: Bytes) {
|
||||||
match self.queue_consensus_message.queue(&mut self.io_channel.lock(), 1, move |client| {
|
match self.queue_consensus_message.queue(&mut self.io_channel.lock(), move |client| {
|
||||||
if let Err(e) = client.engine().handle_message(&message) {
|
if let Err(e) = client.engine().handle_message(&message) {
|
||||||
debug!(target: "poa", "Invalid message received: {}", e);
|
debug!(target: "poa", "Invalid message received: {}", e);
|
||||||
}
|
}
|
||||||
@ -2131,7 +2144,7 @@ impl ImportSealedBlock for Client {
|
|||||||
route
|
route
|
||||||
};
|
};
|
||||||
let (enacted, retracted) = self.importer.calculate_enacted_retracted(&[route]);
|
let (enacted, retracted) = self.importer.calculate_enacted_retracted(&[route]);
|
||||||
self.importer.miner.chain_new_blocks(self, &[h.clone()], &[], &enacted, &retracted, true);
|
self.importer.miner.chain_new_blocks(self, &[h.clone()], &[], &enacted, &retracted, self.engine.seals_internally().is_some());
|
||||||
self.notify(|notify| {
|
self.notify(|notify| {
|
||||||
notify.new_blocks(
|
notify.new_blocks(
|
||||||
vec![h.clone()],
|
vec![h.clone()],
|
||||||
@ -2433,35 +2446,38 @@ impl fmt::Display for QueueError {
|
|||||||
|
|
||||||
/// Queue some items to be processed by IO client.
|
/// Queue some items to be processed by IO client.
|
||||||
struct IoChannelQueue {
|
struct IoChannelQueue {
|
||||||
currently_queued: Arc<AtomicUsize>,
|
queue: Arc<Mutex<VecDeque<Box<Fn(&Client) + Send>>>>,
|
||||||
limit: usize,
|
limit: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IoChannelQueue {
|
impl IoChannelQueue {
|
||||||
pub fn new(limit: usize) -> Self {
|
pub fn new(limit: usize) -> Self {
|
||||||
IoChannelQueue {
|
IoChannelQueue {
|
||||||
currently_queued: Default::default(),
|
queue: Default::default(),
|
||||||
limit,
|
limit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn queue<F>(&self, channel: &mut IoChannel<ClientIoMessage>, count: usize, fun: F) -> Result<(), QueueError> where
|
pub fn queue<F>(&self, channel: &mut IoChannel<ClientIoMessage>, fun: F) -> Result<(), QueueError>
|
||||||
F: Fn(&Client) + Send + Sync + 'static,
|
where F: Fn(&Client) + Send + Sync + 'static
|
||||||
{
|
{
|
||||||
let queue_size = self.currently_queued.load(AtomicOrdering::Relaxed);
|
{
|
||||||
ensure!(queue_size < self.limit, QueueError::Full(self.limit));
|
let mut queue = self.queue.lock();
|
||||||
|
let queue_size = queue.len();
|
||||||
|
ensure!(queue_size < self.limit, QueueError::Full(self.limit));
|
||||||
|
|
||||||
let currently_queued = self.currently_queued.clone();
|
queue.push_back(Box::new(fun));
|
||||||
|
}
|
||||||
|
|
||||||
|
let queue = self.queue.clone();
|
||||||
let result = channel.send(ClientIoMessage::execute(move |client| {
|
let result = channel.send(ClientIoMessage::execute(move |client| {
|
||||||
currently_queued.fetch_sub(count, AtomicOrdering::SeqCst);
|
while let Some(fun) = queue.lock().pop_front() {
|
||||||
fun(client);
|
fun(client);
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
match result {
|
match result {
|
||||||
Ok(_) => {
|
Ok(_) => Ok(()),
|
||||||
self.currently_queued.fetch_add(count, AtomicOrdering::SeqCst);
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
Err(e) => Err(QueueError::Channel(e)),
|
Err(e) => Err(QueueError::Channel(e)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
//! Snapshot network service implementation.
|
//! Snapshot network service implementation.
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::io::ErrorKind;
|
use std::io::{self, Read, ErrorKind};
|
||||||
use std::fs;
|
use std::fs::{self, File};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||||
@ -30,6 +30,7 @@ use blockchain::BlockChain;
|
|||||||
use client::{Client, ChainInfo, ClientIoMessage};
|
use client::{Client, ChainInfo, ClientIoMessage};
|
||||||
use engines::EthEngine;
|
use engines::EthEngine;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
|
use hash::keccak;
|
||||||
use ids::BlockId;
|
use ids::BlockId;
|
||||||
|
|
||||||
use io::IoChannel;
|
use io::IoChannel;
|
||||||
@ -270,8 +271,8 @@ impl Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete the temporary restoration dir if it does exist.
|
// delete the temporary restoration DB dir if it does exist.
|
||||||
if let Err(e) = fs::remove_dir_all(service.restoration_dir()) {
|
if let Err(e) = fs::remove_dir_all(service.restoration_db()) {
|
||||||
if e.kind() != ErrorKind::NotFound {
|
if e.kind() != ErrorKind::NotFound {
|
||||||
return Err(e.into())
|
return Err(e.into())
|
||||||
}
|
}
|
||||||
@ -325,6 +326,13 @@ impl Service {
|
|||||||
dir
|
dir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// previous snapshot chunks path.
|
||||||
|
fn prev_chunks_dir(&self) -> PathBuf {
|
||||||
|
let mut dir = self.snapshot_root.clone();
|
||||||
|
dir.push("prev_chunks");
|
||||||
|
dir
|
||||||
|
}
|
||||||
|
|
||||||
// replace one the client's database with our own.
|
// replace one the client's database with our own.
|
||||||
fn replace_client_db(&self) -> Result<(), Error> {
|
fn replace_client_db(&self) -> Result<(), Error> {
|
||||||
let our_db = self.restoration_db();
|
let our_db = self.restoration_db();
|
||||||
@ -406,10 +414,27 @@ impl Service {
|
|||||||
/// Initialize the restoration synchronously.
|
/// Initialize the restoration synchronously.
|
||||||
/// The recover flag indicates whether to recover the restored snapshot.
|
/// The recover flag indicates whether to recover the restored snapshot.
|
||||||
pub fn init_restore(&self, manifest: ManifestData, recover: bool) -> Result<(), Error> {
|
pub fn init_restore(&self, manifest: ManifestData, recover: bool) -> Result<(), Error> {
|
||||||
let rest_dir = self.restoration_dir();
|
|
||||||
|
|
||||||
let mut res = self.restoration.lock();
|
let mut res = self.restoration.lock();
|
||||||
|
|
||||||
|
let rest_dir = self.restoration_dir();
|
||||||
|
let rest_db = self.restoration_db();
|
||||||
|
let recovery_temp = self.temp_recovery_dir();
|
||||||
|
let prev_chunks = self.prev_chunks_dir();
|
||||||
|
|
||||||
|
// delete and restore the restoration dir.
|
||||||
|
if let Err(e) = fs::remove_dir_all(&prev_chunks) {
|
||||||
|
match e.kind() {
|
||||||
|
ErrorKind::NotFound => {},
|
||||||
|
_ => return Err(e.into()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the previous recovery temp directory
|
||||||
|
// to `prev_chunks` to be able to restart restoring
|
||||||
|
// with previously downloaded blocks
|
||||||
|
// This step is optional, so don't fail on error
|
||||||
|
fs::rename(&recovery_temp, &prev_chunks).ok();
|
||||||
|
|
||||||
self.state_chunks.store(0, Ordering::SeqCst);
|
self.state_chunks.store(0, Ordering::SeqCst);
|
||||||
self.block_chunks.store(0, Ordering::SeqCst);
|
self.block_chunks.store(0, Ordering::SeqCst);
|
||||||
|
|
||||||
@ -424,29 +449,38 @@ impl Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*self.status.lock() = RestorationStatus::Initializing {
|
||||||
|
chunks_done: 0,
|
||||||
|
};
|
||||||
|
|
||||||
fs::create_dir_all(&rest_dir)?;
|
fs::create_dir_all(&rest_dir)?;
|
||||||
|
|
||||||
// make new restoration.
|
// make new restoration.
|
||||||
let writer = match recover {
|
let writer = match recover {
|
||||||
true => Some(LooseWriter::new(self.temp_recovery_dir())?),
|
true => Some(LooseWriter::new(recovery_temp)?),
|
||||||
false => None
|
false => None
|
||||||
};
|
};
|
||||||
|
|
||||||
let params = RestorationParams {
|
let params = RestorationParams {
|
||||||
manifest: manifest,
|
manifest: manifest.clone(),
|
||||||
pruning: self.pruning,
|
pruning: self.pruning,
|
||||||
db: self.restoration_db_handler.open(&self.restoration_db())?,
|
db: self.restoration_db_handler.open(&rest_db)?,
|
||||||
writer: writer,
|
writer: writer,
|
||||||
genesis: &self.genesis_block,
|
genesis: &self.genesis_block,
|
||||||
guard: Guard::new(rest_dir),
|
guard: Guard::new(rest_db),
|
||||||
engine: &*self.engine,
|
engine: &*self.engine,
|
||||||
};
|
};
|
||||||
|
|
||||||
let state_chunks = params.manifest.state_hashes.len();
|
let state_chunks = manifest.state_hashes.len();
|
||||||
let block_chunks = params.manifest.block_hashes.len();
|
let block_chunks = manifest.block_hashes.len();
|
||||||
|
|
||||||
*res = Some(Restoration::new(params)?);
|
*res = Some(Restoration::new(params)?);
|
||||||
|
|
||||||
|
self.restoring_snapshot.store(true, Ordering::SeqCst);
|
||||||
|
|
||||||
|
// Import previous chunks, continue if it fails
|
||||||
|
self.import_prev_chunks(&mut res, manifest).ok();
|
||||||
|
|
||||||
*self.status.lock() = RestorationStatus::Ongoing {
|
*self.status.lock() = RestorationStatus::Ongoing {
|
||||||
state_chunks: state_chunks as u32,
|
state_chunks: state_chunks as u32,
|
||||||
block_chunks: block_chunks as u32,
|
block_chunks: block_chunks as u32,
|
||||||
@ -454,10 +488,65 @@ impl Service {
|
|||||||
block_chunks_done: self.block_chunks.load(Ordering::SeqCst) as u32,
|
block_chunks_done: self.block_chunks.load(Ordering::SeqCst) as u32,
|
||||||
};
|
};
|
||||||
|
|
||||||
self.restoring_snapshot.store(true, Ordering::SeqCst);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Import the previous chunks into the current restoration
|
||||||
|
fn import_prev_chunks(&self, restoration: &mut Option<Restoration>, manifest: ManifestData) -> Result<(), Error> {
|
||||||
|
let prev_chunks = self.prev_chunks_dir();
|
||||||
|
|
||||||
|
// Restore previous snapshot chunks
|
||||||
|
let files = fs::read_dir(prev_chunks.as_path())?;
|
||||||
|
let mut num_temp_chunks = 0;
|
||||||
|
|
||||||
|
for prev_chunk_file in files {
|
||||||
|
// Don't go over all the files if the restoration has been aborted
|
||||||
|
if !self.restoring_snapshot.load(Ordering::SeqCst) {
|
||||||
|
trace!(target:"snapshot", "Aborting importing previous chunks");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
// Import the chunk, don't fail and continue if one fails
|
||||||
|
match self.import_prev_chunk(restoration, &manifest, prev_chunk_file) {
|
||||||
|
Ok(true) => num_temp_chunks += 1,
|
||||||
|
Err(e) => trace!(target: "snapshot", "Error importing chunk: {:?}", e),
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trace!(target:"snapshot", "Imported {} previous chunks", num_temp_chunks);
|
||||||
|
|
||||||
|
// Remove the prev temp directory
|
||||||
|
fs::remove_dir_all(&prev_chunks)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Import a previous chunk at the given path. Returns whether the block was imported or not
|
||||||
|
fn import_prev_chunk(&self, restoration: &mut Option<Restoration>, manifest: &ManifestData, file: io::Result<fs::DirEntry>) -> Result<bool, Error> {
|
||||||
|
let file = file?;
|
||||||
|
let path = file.path();
|
||||||
|
|
||||||
|
let mut file = File::open(path.clone())?;
|
||||||
|
let mut buffer = Vec::new();
|
||||||
|
file.read_to_end(&mut buffer)?;
|
||||||
|
|
||||||
|
let hash = keccak(&buffer);
|
||||||
|
|
||||||
|
let is_state = if manifest.block_hashes.contains(&hash) {
|
||||||
|
false
|
||||||
|
} else if manifest.state_hashes.contains(&hash) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
return Ok(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
self.feed_chunk_with_restoration(restoration, hash, &buffer, is_state)?;
|
||||||
|
|
||||||
|
trace!(target: "snapshot", "Fed chunk {:?}", hash);
|
||||||
|
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
// finalize the restoration. this accepts an already-locked
|
// finalize the restoration. this accepts an already-locked
|
||||||
// restoration as an argument -- so acquiring it again _will_
|
// restoration as an argument -- so acquiring it again _will_
|
||||||
// lead to deadlock.
|
// lead to deadlock.
|
||||||
@ -499,12 +588,19 @@ impl Service {
|
|||||||
/// Feed a chunk of either kind. no-op if no restoration or status is wrong.
|
/// Feed a chunk of either kind. no-op if no restoration or status is wrong.
|
||||||
fn feed_chunk(&self, hash: H256, chunk: &[u8], is_state: bool) -> Result<(), Error> {
|
fn feed_chunk(&self, hash: H256, chunk: &[u8], is_state: bool) -> Result<(), Error> {
|
||||||
// TODO: be able to process block chunks and state chunks at same time?
|
// TODO: be able to process block chunks and state chunks at same time?
|
||||||
let (result, db) = {
|
let mut restoration = self.restoration.lock();
|
||||||
let mut restoration = self.restoration.lock();
|
self.feed_chunk_with_restoration(&mut restoration, hash, chunk, is_state)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Feed a chunk with the Restoration
|
||||||
|
fn feed_chunk_with_restoration(&self, restoration: &mut Option<Restoration>, hash: H256, chunk: &[u8], is_state: bool) -> Result<(), Error> {
|
||||||
|
let (result, db) = {
|
||||||
match self.status() {
|
match self.status() {
|
||||||
RestorationStatus::Inactive | RestorationStatus::Failed => return Ok(()),
|
RestorationStatus::Inactive | RestorationStatus::Failed => {
|
||||||
RestorationStatus::Ongoing { .. } => {
|
trace!(target: "snapshot", "Tried to restore chunk {:x} while inactive or failed", hash);
|
||||||
|
return Ok(());
|
||||||
|
},
|
||||||
|
RestorationStatus::Ongoing { .. } | RestorationStatus::Initializing { .. } => {
|
||||||
let (res, db) = {
|
let (res, db) = {
|
||||||
let rest = match *restoration {
|
let rest = match *restoration {
|
||||||
Some(ref mut r) => r,
|
Some(ref mut r) => r,
|
||||||
@ -583,11 +679,41 @@ impl SnapshotService for Service {
|
|||||||
self.reader.read().as_ref().and_then(|r| r.chunk(hash).ok())
|
self.reader.read().as_ref().and_then(|r| r.chunk(hash).ok())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn completed_chunks(&self) -> Option<Vec<H256>> {
|
||||||
|
let restoration = self.restoration.lock();
|
||||||
|
|
||||||
|
match *restoration {
|
||||||
|
Some(ref restoration) => {
|
||||||
|
let completed_chunks = restoration.manifest.block_hashes
|
||||||
|
.iter()
|
||||||
|
.filter(|h| !restoration.block_chunks_left.contains(h))
|
||||||
|
.chain(
|
||||||
|
restoration.manifest.state_hashes
|
||||||
|
.iter()
|
||||||
|
.filter(|h| !restoration.state_chunks_left.contains(h))
|
||||||
|
)
|
||||||
|
.map(|h| *h)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Some(completed_chunks)
|
||||||
|
},
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn status(&self) -> RestorationStatus {
|
fn status(&self) -> RestorationStatus {
|
||||||
let mut cur_status = self.status.lock();
|
let mut cur_status = self.status.lock();
|
||||||
if let RestorationStatus::Ongoing { ref mut state_chunks_done, ref mut block_chunks_done, .. } = *cur_status {
|
|
||||||
*state_chunks_done = self.state_chunks.load(Ordering::SeqCst) as u32;
|
match *cur_status {
|
||||||
*block_chunks_done = self.block_chunks.load(Ordering::SeqCst) as u32;
|
RestorationStatus::Initializing { ref mut chunks_done } => {
|
||||||
|
*chunks_done = self.state_chunks.load(Ordering::SeqCst) as u32 +
|
||||||
|
self.block_chunks.load(Ordering::SeqCst) as u32;
|
||||||
|
}
|
||||||
|
RestorationStatus::Ongoing { ref mut state_chunks_done, ref mut block_chunks_done, .. } => {
|
||||||
|
*state_chunks_done = self.state_chunks.load(Ordering::SeqCst) as u32;
|
||||||
|
*block_chunks_done = self.block_chunks.load(Ordering::SeqCst) as u32;
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_status.clone()
|
cur_status.clone()
|
||||||
@ -600,6 +726,7 @@ impl SnapshotService for Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn abort_restore(&self) {
|
fn abort_restore(&self) {
|
||||||
|
trace!(target: "snapshot", "Aborting restore");
|
||||||
self.restoring_snapshot.store(false, Ordering::SeqCst);
|
self.restoring_snapshot.store(false, Ordering::SeqCst);
|
||||||
*self.restoration.lock() = None;
|
*self.restoration.lock() = None;
|
||||||
*self.status.lock() = RestorationStatus::Inactive;
|
*self.status.lock() = RestorationStatus::Inactive;
|
||||||
@ -616,6 +743,10 @@ impl SnapshotService for Service {
|
|||||||
trace!("Error sending snapshot service message: {:?}", e);
|
trace!("Error sending snapshot service message: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn shutdown(&self) {
|
||||||
|
self.abort_restore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Service {
|
impl Drop for Service {
|
||||||
|
@ -130,12 +130,16 @@ fn guards_delete_folders() {
|
|||||||
service.init_restore(manifest.clone(), true).unwrap();
|
service.init_restore(manifest.clone(), true).unwrap();
|
||||||
assert!(path.exists());
|
assert!(path.exists());
|
||||||
|
|
||||||
|
// The `db` folder should have been deleted,
|
||||||
|
// while the `temp` one kept
|
||||||
service.abort_restore();
|
service.abort_restore();
|
||||||
assert!(!path.exists());
|
assert!(!path.join("db").exists());
|
||||||
|
assert!(path.join("temp").exists());
|
||||||
|
|
||||||
service.init_restore(manifest.clone(), true).unwrap();
|
service.init_restore(manifest.clone(), true).unwrap();
|
||||||
assert!(path.exists());
|
assert!(path.exists());
|
||||||
|
|
||||||
drop(service);
|
drop(service);
|
||||||
assert!(!path.exists());
|
assert!(!path.join("db").exists());
|
||||||
|
assert!(path.join("temp").exists());
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,9 @@ pub trait SnapshotService : Sync + Send {
|
|||||||
/// `None` indicates warp sync isn't supported by the consensus engine.
|
/// `None` indicates warp sync isn't supported by the consensus engine.
|
||||||
fn supported_versions(&self) -> Option<(u64, u64)>;
|
fn supported_versions(&self) -> Option<(u64, u64)>;
|
||||||
|
|
||||||
|
/// Returns a list of the completed chunks
|
||||||
|
fn completed_chunks(&self) -> Option<Vec<H256>>;
|
||||||
|
|
||||||
/// Get raw chunk for a given hash.
|
/// Get raw chunk for a given hash.
|
||||||
fn chunk(&self, hash: H256) -> Option<Bytes>;
|
fn chunk(&self, hash: H256) -> Option<Bytes>;
|
||||||
|
|
||||||
@ -51,4 +54,7 @@ pub trait SnapshotService : Sync + Send {
|
|||||||
/// Feed a raw block chunk to the service to be processed asynchronously.
|
/// Feed a raw block chunk to the service to be processed asynchronously.
|
||||||
/// no-op if currently restoring.
|
/// no-op if currently restoring.
|
||||||
fn restore_block_chunk(&self, hash: H256, chunk: Bytes);
|
fn restore_block_chunk(&self, hash: H256, chunk: Bytes);
|
||||||
|
|
||||||
|
/// Shutdown the Snapshot Service by aborting any ongoing restore
|
||||||
|
fn shutdown(&self);
|
||||||
}
|
}
|
||||||
|
@ -776,7 +776,7 @@ impl Spec {
|
|||||||
author: *genesis.author(),
|
author: *genesis.author(),
|
||||||
timestamp: genesis.timestamp(),
|
timestamp: genesis.timestamp(),
|
||||||
difficulty: *genesis.difficulty(),
|
difficulty: *genesis.difficulty(),
|
||||||
gas_limit: *genesis.gas_limit(),
|
gas_limit: U256::max_value(),
|
||||||
last_hashes: Arc::new(Vec::new()),
|
last_hashes: Arc::new(Vec::new()),
|
||||||
gas_used: 0.into(),
|
gas_used: 0.into(),
|
||||||
};
|
};
|
||||||
@ -785,7 +785,7 @@ impl Spec {
|
|||||||
let tx = Transaction {
|
let tx = Transaction {
|
||||||
nonce: self.engine.account_start_nonce(0),
|
nonce: self.engine.account_start_nonce(0),
|
||||||
action: Action::Call(a),
|
action: Action::Call(a),
|
||||||
gas: U256::from(50_000_000), // TODO: share with client.
|
gas: U256::max_value(),
|
||||||
gas_price: U256::default(),
|
gas_price: U256::default(),
|
||||||
value: U256::default(),
|
value: U256::default(),
|
||||||
data: d,
|
data: d,
|
||||||
|
@ -266,7 +266,7 @@ impl BlockCollection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get a valid chain of blocks ordered in descending order and ready for importing into blockchain.
|
/// Get a valid chain of blocks ordered in ascending order and ready for importing into blockchain.
|
||||||
pub fn drain(&mut self) -> Vec<BlockAndReceipts> {
|
pub fn drain(&mut self) -> Vec<BlockAndReceipts> {
|
||||||
if self.blocks.is_empty() || self.head.is_none() {
|
if self.blocks.is_empty() || self.head.is_none() {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
|
@ -100,14 +100,27 @@ impl SyncHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Called by peer when it is disconnecting
|
/// Called by peer when it is disconnecting
|
||||||
pub fn on_peer_aborting(sync: &mut ChainSync, io: &mut SyncIo, peer: PeerId) {
|
pub fn on_peer_aborting(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId) {
|
||||||
trace!(target: "sync", "== Disconnecting {}: {}", peer, io.peer_info(peer));
|
trace!(target: "sync", "== Disconnecting {}: {}", peer_id, io.peer_info(peer_id));
|
||||||
sync.handshaking_peers.remove(&peer);
|
sync.handshaking_peers.remove(&peer_id);
|
||||||
if sync.peers.contains_key(&peer) {
|
if sync.peers.contains_key(&peer_id) {
|
||||||
debug!(target: "sync", "Disconnected {}", peer);
|
debug!(target: "sync", "Disconnected {}", peer_id);
|
||||||
sync.clear_peer_download(peer);
|
sync.clear_peer_download(peer_id);
|
||||||
sync.peers.remove(&peer);
|
sync.peers.remove(&peer_id);
|
||||||
sync.active_peers.remove(&peer);
|
sync.active_peers.remove(&peer_id);
|
||||||
|
|
||||||
|
if sync.state == SyncState::SnapshotManifest {
|
||||||
|
// Check if we are asking other peers for
|
||||||
|
// the snapshot manifest as well.
|
||||||
|
// If not, return to initial state
|
||||||
|
let still_asking_manifest = sync.peers.iter()
|
||||||
|
.filter(|&(id, p)| sync.active_peers.contains(id) && p.asking == PeerAsking::SnapshotManifest)
|
||||||
|
.next().is_none();
|
||||||
|
|
||||||
|
if still_asking_manifest {
|
||||||
|
sync.state = ChainSync::get_init_state(sync.warp_sync, io.chain());
|
||||||
|
}
|
||||||
|
}
|
||||||
sync.continue_sync(io);
|
sync.continue_sync(io);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -319,10 +332,6 @@ impl SyncHandler {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_peer_confirmed(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId) {
|
|
||||||
sync.sync_peer(io, peer_id, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_peer_fork_header(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId, r: &Rlp) -> Result<(), PacketDecodeError> {
|
fn on_peer_fork_header(sync: &mut ChainSync, io: &mut SyncIo, peer_id: PeerId, r: &Rlp) -> Result<(), PacketDecodeError> {
|
||||||
{
|
{
|
||||||
let peer = sync.peers.get_mut(&peer_id).expect("Is only called when peer is present in peers");
|
let peer = sync.peers.get_mut(&peer_id).expect("Is only called when peer is present in peers");
|
||||||
@ -332,24 +341,27 @@ impl SyncHandler {
|
|||||||
|
|
||||||
if item_count == 0 || item_count != 1 {
|
if item_count == 0 || item_count != 1 {
|
||||||
trace!(target: "sync", "{}: Chain is too short to confirm the block", peer_id);
|
trace!(target: "sync", "{}: Chain is too short to confirm the block", peer_id);
|
||||||
io.disable_peer(peer_id);
|
peer.confirmation = ForkConfirmation::TooShort;
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let header = r.at(0)?.as_raw();
|
} else {
|
||||||
if keccak(&header) != fork_hash {
|
let header = r.at(0)?.as_raw();
|
||||||
trace!(target: "sync", "{}: Fork mismatch", peer_id);
|
if keccak(&header) != fork_hash {
|
||||||
io.disable_peer(peer_id);
|
trace!(target: "sync", "{}: Fork mismatch", peer_id);
|
||||||
return Ok(());
|
io.disable_peer(peer_id);
|
||||||
}
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
trace!(target: "sync", "{}: Confirmed peer", peer_id);
|
trace!(target: "sync", "{}: Confirmed peer", peer_id);
|
||||||
peer.confirmation = ForkConfirmation::Confirmed;
|
peer.confirmation = ForkConfirmation::Confirmed;
|
||||||
if !io.chain_overlay().read().contains_key(&fork_number) {
|
|
||||||
io.chain_overlay().write().insert(fork_number, header.to_vec());
|
if !io.chain_overlay().read().contains_key(&fork_number) {
|
||||||
|
trace!(target: "sync", "Inserting (fork) block {} header", fork_number);
|
||||||
|
io.chain_overlay().write().insert(fork_number, header.to_vec());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SyncHandler::on_peer_confirmed(sync, io, peer_id);
|
|
||||||
|
sync.sync_peer(io, peer_id, false);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,6 +572,10 @@ impl SyncHandler {
|
|||||||
sync.continue_sync(io);
|
sync.continue_sync(io);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
},
|
},
|
||||||
|
RestorationStatus::Initializing { .. } => {
|
||||||
|
trace!(target: "warp", "{}: Snapshot restoration is initializing", peer_id);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
RestorationStatus::Ongoing { .. } => {
|
RestorationStatus::Ongoing { .. } => {
|
||||||
trace!(target: "sync", "{}: Snapshot restoration is ongoing", peer_id);
|
trace!(target: "sync", "{}: Snapshot restoration is ongoing", peer_id);
|
||||||
},
|
},
|
||||||
@ -659,11 +675,18 @@ impl SyncHandler {
|
|||||||
// Let the current sync round complete first.
|
// Let the current sync round complete first.
|
||||||
sync.active_peers.insert(peer_id.clone());
|
sync.active_peers.insert(peer_id.clone());
|
||||||
debug!(target: "sync", "Connected {}:{}", peer_id, io.peer_info(peer_id));
|
debug!(target: "sync", "Connected {}:{}", peer_id, io.peer_info(peer_id));
|
||||||
if let Some((fork_block, _)) = sync.fork_block {
|
|
||||||
SyncRequester::request_fork_header(sync, io, peer_id, fork_block);
|
match sync.fork_block {
|
||||||
} else {
|
Some((fork_block, _)) => {
|
||||||
SyncHandler::on_peer_confirmed(sync, io, peer_id);
|
SyncRequester::request_fork_header(sync, io, peer_id, fork_block);
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
// when there's no `fork_block` defined we initialize the peer with
|
||||||
|
// `confirmation: ForkConfirmation::Confirmed`.
|
||||||
|
sync.sync_peer(io, peer_id, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,9 +245,12 @@ pub struct SyncStatus {
|
|||||||
impl SyncStatus {
|
impl SyncStatus {
|
||||||
/// Indicates if snapshot download is in progress
|
/// Indicates if snapshot download is in progress
|
||||||
pub fn is_snapshot_syncing(&self) -> bool {
|
pub fn is_snapshot_syncing(&self) -> bool {
|
||||||
self.state == SyncState::SnapshotManifest
|
match self.state {
|
||||||
|| self.state == SyncState::SnapshotData
|
SyncState::SnapshotManifest |
|
||||||
|| self.state == SyncState::SnapshotWaiting
|
SyncState::SnapshotData |
|
||||||
|
SyncState::SnapshotWaiting => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns max no of peers to display in informants
|
/// Returns max no of peers to display in informants
|
||||||
@ -291,6 +294,8 @@ pub enum BlockSet {
|
|||||||
pub enum ForkConfirmation {
|
pub enum ForkConfirmation {
|
||||||
/// Fork block confirmation pending.
|
/// Fork block confirmation pending.
|
||||||
Unconfirmed,
|
Unconfirmed,
|
||||||
|
/// Peer's chain is too short to confirm the fork.
|
||||||
|
TooShort,
|
||||||
/// Fork is confirmed.
|
/// Fork is confirmed.
|
||||||
Confirmed,
|
Confirmed,
|
||||||
}
|
}
|
||||||
@ -643,7 +648,7 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resume downloading
|
/// Resume downloading
|
||||||
fn continue_sync(&mut self, io: &mut SyncIo) {
|
fn continue_sync(&mut self, io: &mut SyncIo) {
|
||||||
// Collect active peers that can sync
|
// Collect active peers that can sync
|
||||||
let confirmed_peers: Vec<(PeerId, u8)> = self.peers.iter().filter_map(|(peer_id, peer)|
|
let confirmed_peers: Vec<(PeerId, u8)> = self.peers.iter().filter_map(|(peer_id, peer)|
|
||||||
@ -751,26 +756,45 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(request) = self.old_blocks.as_mut().and_then(|d| d.request_blocks(io, num_active_peers)) {
|
// Only ask for old blocks if the peer has a higher difficulty
|
||||||
SyncRequester::request_blocks(self, io, peer_id, request, BlockSet::OldBlocks);
|
if force || higher_difficulty {
|
||||||
return;
|
if let Some(request) = self.old_blocks.as_mut().and_then(|d| d.request_blocks(io, num_active_peers)) {
|
||||||
|
SyncRequester::request_blocks(self, io, peer_id, request, BlockSet::OldBlocks);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trace!(target: "sync", "peer {} is not suitable for asking old blocks", peer_id);
|
||||||
|
self.deactivate_peer(io, peer_id);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SyncState::SnapshotData => {
|
SyncState::SnapshotData => {
|
||||||
if let RestorationStatus::Ongoing { state_chunks_done, block_chunks_done, .. } = io.snapshot_service().status() {
|
match io.snapshot_service().status() {
|
||||||
if self.snapshot.done_chunks() - (state_chunks_done + block_chunks_done) as usize > MAX_SNAPSHOT_CHUNKS_DOWNLOAD_AHEAD {
|
RestorationStatus::Ongoing { state_chunks_done, block_chunks_done, .. } => {
|
||||||
trace!(target: "sync", "Snapshot queue full, pausing sync");
|
// Initialize the snapshot if not already done
|
||||||
self.state = SyncState::SnapshotWaiting;
|
self.snapshot.initialize(io.snapshot_service());
|
||||||
|
if self.snapshot.done_chunks() - (state_chunks_done + block_chunks_done) as usize > MAX_SNAPSHOT_CHUNKS_DOWNLOAD_AHEAD {
|
||||||
|
trace!(target: "sync", "Snapshot queue full, pausing sync");
|
||||||
|
self.state = SyncState::SnapshotWaiting;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
RestorationStatus::Initializing { .. } => {
|
||||||
|
trace!(target: "warp", "Snapshot is stil initializing.");
|
||||||
return;
|
return;
|
||||||
}
|
},
|
||||||
|
_ => {
|
||||||
|
return;
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if peer_snapshot_hash.is_some() && peer_snapshot_hash == self.snapshot.snapshot_hash() {
|
if peer_snapshot_hash.is_some() && peer_snapshot_hash == self.snapshot.snapshot_hash() {
|
||||||
self.clear_peer_download(peer_id);
|
self.clear_peer_download(peer_id);
|
||||||
SyncRequester::request_snapshot_data(self, io, peer_id);
|
SyncRequester::request_snapshot_data(self, io, peer_id);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
SyncState::SnapshotManifest | //already downloading from other peer
|
SyncState::SnapshotManifest | //already downloading from other peer
|
||||||
SyncState::Waiting | SyncState::SnapshotWaiting => ()
|
SyncState::Waiting |
|
||||||
|
SyncState::SnapshotWaiting => ()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trace!(target: "sync", "Skipping peer {}, force={}, td={:?}, our td={}, state={:?}", peer_id, force, peer_difficulty, syncing_difficulty, self.state);
|
trace!(target: "sync", "Skipping peer {}, force={}, td={:?}, our td={}, state={:?}", peer_id, force, peer_difficulty, syncing_difficulty, self.state);
|
||||||
@ -861,10 +885,7 @@ impl ChainSync {
|
|||||||
packet.append(&chain.best_block_hash);
|
packet.append(&chain.best_block_hash);
|
||||||
packet.append(&chain.genesis_hash);
|
packet.append(&chain.genesis_hash);
|
||||||
if warp_protocol {
|
if warp_protocol {
|
||||||
let manifest = match self.old_blocks.is_some() {
|
let manifest = io.snapshot_service().manifest();
|
||||||
true => None,
|
|
||||||
false => io.snapshot_service().manifest(),
|
|
||||||
};
|
|
||||||
let block_number = manifest.as_ref().map_or(0, |m| m.block_number);
|
let block_number = manifest.as_ref().map_or(0, |m| m.block_number);
|
||||||
let manifest_hash = manifest.map_or(H256::new(), |m| keccak(m.into_rlp()));
|
let manifest_hash = manifest.map_or(H256::new(), |m| keccak(m.into_rlp()));
|
||||||
packet.append(&manifest_hash);
|
packet.append(&manifest_hash);
|
||||||
@ -908,29 +929,36 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn check_resume(&mut self, io: &mut SyncIo) {
|
fn check_resume(&mut self, io: &mut SyncIo) {
|
||||||
if self.state == SyncState::Waiting && !io.chain().queue_info().is_full() {
|
match self.state {
|
||||||
self.state = SyncState::Blocks;
|
SyncState::Waiting if !io.chain().queue_info().is_full() => {
|
||||||
self.continue_sync(io);
|
self.state = SyncState::Blocks;
|
||||||
} else if self.state == SyncState::SnapshotWaiting {
|
self.continue_sync(io);
|
||||||
match io.snapshot_service().status() {
|
},
|
||||||
RestorationStatus::Inactive => {
|
SyncState::SnapshotWaiting => {
|
||||||
trace!(target:"sync", "Snapshot restoration is complete");
|
match io.snapshot_service().status() {
|
||||||
self.restart(io);
|
RestorationStatus::Inactive => {
|
||||||
},
|
trace!(target:"sync", "Snapshot restoration is complete");
|
||||||
RestorationStatus::Ongoing { state_chunks_done, block_chunks_done, .. } => {
|
self.restart(io);
|
||||||
if !self.snapshot.is_complete() && self.snapshot.done_chunks() - (state_chunks_done + block_chunks_done) as usize <= MAX_SNAPSHOT_CHUNKS_DOWNLOAD_AHEAD {
|
},
|
||||||
trace!(target:"sync", "Resuming snapshot sync");
|
RestorationStatus::Initializing { .. } => {
|
||||||
self.state = SyncState::SnapshotData;
|
trace!(target:"sync", "Snapshot restoration is initializing");
|
||||||
|
},
|
||||||
|
RestorationStatus::Ongoing { state_chunks_done, block_chunks_done, .. } => {
|
||||||
|
if !self.snapshot.is_complete() && self.snapshot.done_chunks() - (state_chunks_done + block_chunks_done) as usize <= MAX_SNAPSHOT_CHUNKS_DOWNLOAD_AHEAD {
|
||||||
|
trace!(target:"sync", "Resuming snapshot sync");
|
||||||
|
self.state = SyncState::SnapshotData;
|
||||||
|
self.continue_sync(io);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
RestorationStatus::Failed => {
|
||||||
|
trace!(target: "sync", "Snapshot restoration aborted");
|
||||||
|
self.state = SyncState::WaitingPeers;
|
||||||
|
self.snapshot.clear();
|
||||||
self.continue_sync(io);
|
self.continue_sync(io);
|
||||||
}
|
},
|
||||||
},
|
}
|
||||||
RestorationStatus::Failed => {
|
},
|
||||||
trace!(target: "sync", "Snapshot restoration aborted");
|
_ => (),
|
||||||
self.state = SyncState::WaitingPeers;
|
|
||||||
self.snapshot.clear();
|
|
||||||
self.continue_sync(io);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,8 +120,9 @@ impl SyncSupplier {
|
|||||||
None => return Ok(Some((BLOCK_HEADERS_PACKET, RlpStream::new_list(0)))) //no such header, return nothing
|
None => return Ok(Some((BLOCK_HEADERS_PACKET, RlpStream::new_list(0)))) //no such header, return nothing
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trace!(target: "sync", "{} -> GetBlockHeaders (number: {}, max: {}, skip: {}, reverse:{})", peer_id, r.val_at::<BlockNumber>(0)?, max_headers, skip, reverse);
|
let number = r.val_at::<BlockNumber>(0)?;
|
||||||
r.val_at(0)?
|
trace!(target: "sync", "{} -> GetBlockHeaders (number: {}, max: {}, skip: {}, reverse:{})", peer_id, number, max_headers, skip, reverse);
|
||||||
|
number
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut number = if reverse {
|
let mut number = if reverse {
|
||||||
@ -135,7 +136,10 @@ impl SyncSupplier {
|
|||||||
let inc = (skip + 1) as BlockNumber;
|
let inc = (skip + 1) as BlockNumber;
|
||||||
let overlay = io.chain_overlay().read();
|
let overlay = io.chain_overlay().read();
|
||||||
|
|
||||||
while number <= last && count < max_count {
|
// We are checking the `overlay` as well since it's where the ForkBlock
|
||||||
|
// header is cached : so peers can confirm we are on the right fork,
|
||||||
|
// even if we are not synced until the fork block
|
||||||
|
while (number <= last || overlay.contains_key(&number)) && count < max_count {
|
||||||
if let Some(hdr) = overlay.get(&number) {
|
if let Some(hdr) = overlay.get(&number) {
|
||||||
trace!(target: "sync", "{}: Returning cached fork header", peer_id);
|
trace!(target: "sync", "{}: Returning cached fork header", peer_id);
|
||||||
data.extend_from_slice(hdr);
|
data.extend_from_slice(hdr);
|
||||||
@ -152,8 +156,7 @@ impl SyncSupplier {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
number -= inc;
|
number -= inc;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
number += inc;
|
number += inc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -237,20 +240,20 @@ impl SyncSupplier {
|
|||||||
/// Respond to GetSnapshotManifest request
|
/// Respond to GetSnapshotManifest request
|
||||||
fn return_snapshot_manifest(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult {
|
fn return_snapshot_manifest(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult {
|
||||||
let count = r.item_count().unwrap_or(0);
|
let count = r.item_count().unwrap_or(0);
|
||||||
trace!(target: "sync", "{} -> GetSnapshotManifest", peer_id);
|
trace!(target: "warp", "{} -> GetSnapshotManifest", peer_id);
|
||||||
if count != 0 {
|
if count != 0 {
|
||||||
debug!(target: "sync", "Invalid GetSnapshotManifest request, ignoring.");
|
debug!(target: "warp", "Invalid GetSnapshotManifest request, ignoring.");
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
let rlp = match io.snapshot_service().manifest() {
|
let rlp = match io.snapshot_service().manifest() {
|
||||||
Some(manifest) => {
|
Some(manifest) => {
|
||||||
trace!(target: "sync", "{} <- SnapshotManifest", peer_id);
|
trace!(target: "warp", "{} <- SnapshotManifest", peer_id);
|
||||||
let mut rlp = RlpStream::new_list(1);
|
let mut rlp = RlpStream::new_list(1);
|
||||||
rlp.append_raw(&manifest.into_rlp(), 1);
|
rlp.append_raw(&manifest.into_rlp(), 1);
|
||||||
rlp
|
rlp
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
trace!(target: "sync", "{}: No manifest to return", peer_id);
|
trace!(target: "warp", "{}: No snapshot manifest to return", peer_id);
|
||||||
RlpStream::new_list(0)
|
RlpStream::new_list(0)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -260,15 +263,16 @@ impl SyncSupplier {
|
|||||||
/// Respond to GetSnapshotData request
|
/// Respond to GetSnapshotData request
|
||||||
fn return_snapshot_data(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult {
|
fn return_snapshot_data(io: &SyncIo, r: &Rlp, peer_id: PeerId) -> RlpResponseResult {
|
||||||
let hash: H256 = r.val_at(0)?;
|
let hash: H256 = r.val_at(0)?;
|
||||||
trace!(target: "sync", "{} -> GetSnapshotData {:?}", peer_id, hash);
|
trace!(target: "warp", "{} -> GetSnapshotData {:?}", peer_id, hash);
|
||||||
let rlp = match io.snapshot_service().chunk(hash) {
|
let rlp = match io.snapshot_service().chunk(hash) {
|
||||||
Some(data) => {
|
Some(data) => {
|
||||||
let mut rlp = RlpStream::new_list(1);
|
let mut rlp = RlpStream::new_list(1);
|
||||||
trace!(target: "sync", "{} <- SnapshotData", peer_id);
|
trace!(target: "warp", "{} <- SnapshotData", peer_id);
|
||||||
rlp.append(&data);
|
rlp.append(&data);
|
||||||
rlp
|
rlp
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
|
trace!(target: "warp", "{}: No snapshot data to return", peer_id);
|
||||||
RlpStream::new_list(0)
|
RlpStream::new_list(0)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -14,10 +14,13 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use hash::keccak;
|
use ethcore::snapshot::{ManifestData, SnapshotService};
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
|
use hash::keccak;
|
||||||
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use ethcore::snapshot::ManifestData;
|
use std::iter::FromIterator;
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Debug)]
|
#[derive(PartialEq, Eq, Debug)]
|
||||||
pub enum ChunkType {
|
pub enum ChunkType {
|
||||||
@ -32,6 +35,7 @@ pub struct Snapshot {
|
|||||||
completed_chunks: HashSet<H256>,
|
completed_chunks: HashSet<H256>,
|
||||||
snapshot_hash: Option<H256>,
|
snapshot_hash: Option<H256>,
|
||||||
bad_hashes: HashSet<H256>,
|
bad_hashes: HashSet<H256>,
|
||||||
|
initialized: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Snapshot {
|
impl Snapshot {
|
||||||
@ -44,9 +48,29 @@ impl Snapshot {
|
|||||||
completed_chunks: HashSet::new(),
|
completed_chunks: HashSet::new(),
|
||||||
snapshot_hash: None,
|
snapshot_hash: None,
|
||||||
bad_hashes: HashSet::new(),
|
bad_hashes: HashSet::new(),
|
||||||
|
initialized: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sync the Snapshot completed chunks with the Snapshot Service
|
||||||
|
pub fn initialize(&mut self, snapshot_service: &SnapshotService) {
|
||||||
|
if self.initialized {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(completed_chunks) = snapshot_service.completed_chunks() {
|
||||||
|
self.completed_chunks = HashSet::from_iter(completed_chunks);
|
||||||
|
}
|
||||||
|
|
||||||
|
trace!(
|
||||||
|
target: "snapshot",
|
||||||
|
"Snapshot is now initialized with {} completed chunks.",
|
||||||
|
self.completed_chunks.len(),
|
||||||
|
);
|
||||||
|
|
||||||
|
self.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Clear everything.
|
/// Clear everything.
|
||||||
pub fn clear(&mut self) {
|
pub fn clear(&mut self) {
|
||||||
self.pending_state_chunks.clear();
|
self.pending_state_chunks.clear();
|
||||||
@ -54,6 +78,7 @@ impl Snapshot {
|
|||||||
self.downloading_chunks.clear();
|
self.downloading_chunks.clear();
|
||||||
self.completed_chunks.clear();
|
self.completed_chunks.clear();
|
||||||
self.snapshot_hash = None;
|
self.snapshot_hash = None;
|
||||||
|
self.initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if currently downloading a snapshot.
|
/// Check if currently downloading a snapshot.
|
||||||
@ -89,18 +114,35 @@ impl Snapshot {
|
|||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Find a chunk to download
|
/// Find a random chunk to download
|
||||||
pub fn needed_chunk(&mut self) -> Option<H256> {
|
pub fn needed_chunk(&mut self) -> Option<H256> {
|
||||||
// check state chunks first
|
// Find all random chunks: first blocks, then state
|
||||||
let chunk = self.pending_state_chunks.iter()
|
let needed_chunks = {
|
||||||
.chain(self.pending_block_chunks.iter())
|
let chunk_filter = |h| !self.downloading_chunks.contains(h) && !self.completed_chunks.contains(h);
|
||||||
.find(|&h| !self.downloading_chunks.contains(h) && !self.completed_chunks.contains(h))
|
|
||||||
.cloned();
|
let needed_block_chunks = self.pending_block_chunks.iter()
|
||||||
|
.filter(|&h| chunk_filter(h))
|
||||||
|
.map(|h| *h)
|
||||||
|
.collect::<Vec<H256>>();
|
||||||
|
|
||||||
|
// If no block chunks to download, get the state chunks
|
||||||
|
if needed_block_chunks.len() == 0 {
|
||||||
|
self.pending_state_chunks.iter()
|
||||||
|
.filter(|&h| chunk_filter(h))
|
||||||
|
.map(|h| *h)
|
||||||
|
.collect::<Vec<H256>>()
|
||||||
|
} else {
|
||||||
|
needed_block_chunks
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get a random chunk
|
||||||
|
let chunk = thread_rng().choose(&needed_chunks);
|
||||||
|
|
||||||
if let Some(hash) = chunk {
|
if let Some(hash) = chunk {
|
||||||
self.downloading_chunks.insert(hash.clone());
|
self.downloading_chunks.insert(hash.clone());
|
||||||
}
|
}
|
||||||
chunk
|
chunk.map(|h| *h)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear_chunk_download(&mut self, hash: &H256) {
|
pub fn clear_chunk_download(&mut self, hash: &H256) {
|
||||||
@ -185,8 +227,15 @@ mod test {
|
|||||||
|
|
||||||
let requested: Vec<H256> = (0..40).map(|_| snapshot.needed_chunk().unwrap()).collect();
|
let requested: Vec<H256> = (0..40).map(|_| snapshot.needed_chunk().unwrap()).collect();
|
||||||
assert!(snapshot.needed_chunk().is_none());
|
assert!(snapshot.needed_chunk().is_none());
|
||||||
assert_eq!(&requested[0..20], &manifest.state_hashes[..]);
|
|
||||||
assert_eq!(&requested[20..40], &manifest.block_hashes[..]);
|
let requested_all_block_chunks = manifest.block_hashes.iter()
|
||||||
|
.all(|h| requested.iter().any(|rh| rh == h));
|
||||||
|
assert!(requested_all_block_chunks);
|
||||||
|
|
||||||
|
let requested_all_state_chunks = manifest.state_hashes.iter()
|
||||||
|
.all(|h| requested.iter().any(|rh| rh == h));
|
||||||
|
assert!(requested_all_state_chunks);
|
||||||
|
|
||||||
assert_eq!(snapshot.downloading_chunks.len(), 40);
|
assert_eq!(snapshot.downloading_chunks.len(), 40);
|
||||||
|
|
||||||
assert_eq!(snapshot.validate_chunk(&state_chunks[4]), Ok(ChunkType::State(manifest.state_hashes[4].clone())));
|
assert_eq!(snapshot.validate_chunk(&state_chunks[4]), Ok(ChunkType::State(manifest.state_hashes[4].clone())));
|
||||||
|
@ -80,6 +80,10 @@ impl SnapshotService for TestSnapshotService {
|
|||||||
Some((1, 2))
|
Some((1, 2))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn completed_chunks(&self) -> Option<Vec<H256>> {
|
||||||
|
Some(vec![])
|
||||||
|
}
|
||||||
|
|
||||||
fn chunk(&self, hash: H256) -> Option<Bytes> {
|
fn chunk(&self, hash: H256) -> Option<Bytes> {
|
||||||
self.chunks.get(&hash).cloned()
|
self.chunks.get(&hash).cloned()
|
||||||
}
|
}
|
||||||
@ -129,6 +133,10 @@ impl SnapshotService for TestSnapshotService {
|
|||||||
self.block_restoration_chunks.lock().insert(hash, chunk);
|
self.block_restoration_chunks.lock().insert(hash, chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn shutdown(&self) {
|
||||||
|
self.abort_restore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -21,6 +21,11 @@
|
|||||||
pub enum RestorationStatus {
|
pub enum RestorationStatus {
|
||||||
/// No restoration.
|
/// No restoration.
|
||||||
Inactive,
|
Inactive,
|
||||||
|
/// Restoration is initalizing
|
||||||
|
Initializing {
|
||||||
|
/// Number of chunks done/imported
|
||||||
|
chunks_done: u32,
|
||||||
|
},
|
||||||
/// Ongoing restoration.
|
/// Ongoing restoration.
|
||||||
Ongoing {
|
Ongoing {
|
||||||
/// Total number of state chunks.
|
/// Total number of state chunks.
|
||||||
|
@ -3,6 +3,4 @@
|
|||||||
test -f /usr/local/libexec/uninstall-parity.sh && /usr/local/libexec/uninstall-parity.sh || true
|
test -f /usr/local/libexec/uninstall-parity.sh && /usr/local/libexec/uninstall-parity.sh || true
|
||||||
killall -9 parity && sleep 5
|
killall -9 parity && sleep 5
|
||||||
su $USER -c "open /Applications/Parity\ Ethereum.app"
|
su $USER -c "open /Applications/Parity\ Ethereum.app"
|
||||||
sleep 5
|
|
||||||
su $USER -c "open http://127.0.0.1:8180/"
|
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -108,6 +108,15 @@ impl txpool::Scoring<VerifiedTransaction> for NonceAndGasPrice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Always kick out non-local transactions in favour of local ones.
|
||||||
|
if new.priority().is_local() && !old.priority().is_local() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// And never kick out local transactions in favour of external ones.
|
||||||
|
if !new.priority().is_local() && old.priority.is_local() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
self.choose(old, new) == txpool::scoring::Choice::ReplaceOld
|
self.choose(old, new) == txpool::scoring::Choice::ReplaceOld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -119,6 +128,21 @@ mod tests {
|
|||||||
use pool::tests::tx::{Tx, TxExt};
|
use pool::tests::tx::{Tx, TxExt};
|
||||||
use txpool::Scoring;
|
use txpool::Scoring;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_replace_non_local_transaction_with_local_one() {
|
||||||
|
// given
|
||||||
|
let scoring = NonceAndGasPrice(PrioritizationStrategy::GasPriceOnly);
|
||||||
|
let tx1 = Tx::default().signed().verified();
|
||||||
|
let tx2 = {
|
||||||
|
let mut tx = Tx::default().signed().verified();
|
||||||
|
tx.priority = ::pool::Priority::Local;
|
||||||
|
tx
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(scoring.should_replace(&tx1, &tx2));
|
||||||
|
assert!(!scoring.should_replace(&tx2, &tx1));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_calculate_score_correctly() {
|
fn should_calculate_score_correctly() {
|
||||||
// given
|
// given
|
||||||
|
@ -767,3 +767,34 @@ fn should_reject_big_transaction() {
|
|||||||
]);
|
]);
|
||||||
assert_eq!(res, vec![Err(transaction::Error::TooBig)]);
|
assert_eq!(res, vec![Err(transaction::Error::TooBig)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_include_local_transaction_to_a_full_pool() {
|
||||||
|
// given
|
||||||
|
let txq = TransactionQueue::new(
|
||||||
|
txpool::Options {
|
||||||
|
max_count: 1,
|
||||||
|
max_per_sender: 2,
|
||||||
|
max_mem_usage: 50
|
||||||
|
},
|
||||||
|
verifier::Options {
|
||||||
|
minimal_gas_price: 1.into(),
|
||||||
|
block_gas_limit: 1_000_000.into(),
|
||||||
|
tx_gas_limit: 1_000_000.into(),
|
||||||
|
},
|
||||||
|
PrioritizationStrategy::GasPriceOnly,
|
||||||
|
);
|
||||||
|
let tx1 = Tx::gas_price(10_000).signed().unverified();
|
||||||
|
let tx2 = Tx::gas_price(1).signed().local();
|
||||||
|
|
||||||
|
let res = txq.import(TestClient::new().with_balance(1_000_000_000), vec![tx1]);
|
||||||
|
assert_eq!(res, vec![Ok(())]);
|
||||||
|
assert_eq!(txq.status().status.transaction_count, 1);
|
||||||
|
|
||||||
|
// when
|
||||||
|
let res = txq.import(TestClient::new(), vec![tx2]);
|
||||||
|
assert_eq!(res, vec![Ok(())]);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert_eq!(txq.status().status.transaction_count, 1);
|
||||||
|
}
|
||||||
|
@ -278,15 +278,12 @@ impl<T: InformantData> Informant<T> {
|
|||||||
} = full_report;
|
} = full_report;
|
||||||
|
|
||||||
let rpc_stats = self.rpc_stats.as_ref();
|
let rpc_stats = self.rpc_stats.as_ref();
|
||||||
|
let snapshot_sync = sync_info.as_ref().map_or(false, |s| s.snapshot_sync) && self.snapshot.as_ref().map_or(false, |s|
|
||||||
let (snapshot_sync, snapshot_current, snapshot_total) = self.snapshot.as_ref().map_or((false, 0, 0), |s|
|
|
||||||
match s.status() {
|
match s.status() {
|
||||||
RestorationStatus::Ongoing { state_chunks, block_chunks, state_chunks_done, block_chunks_done } =>
|
RestorationStatus::Ongoing { .. } | RestorationStatus::Initializing { .. } => true,
|
||||||
(true, state_chunks_done + block_chunks_done, state_chunks + block_chunks),
|
_ => false,
|
||||||
_ => (false, 0, 0),
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
let snapshot_sync = snapshot_sync && sync_info.as_ref().map_or(false, |s| s.snapshot_sync);
|
|
||||||
if !importing && !snapshot_sync && elapsed < Duration::from_secs(30) {
|
if !importing && !snapshot_sync && elapsed < Duration::from_secs(30) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -318,7 +315,19 @@ impl<T: InformantData> Informant<T> {
|
|||||||
paint(Green.bold(), format!("{:5}", queue_info.unverified_queue_size)),
|
paint(Green.bold(), format!("{:5}", queue_info.unverified_queue_size)),
|
||||||
paint(Green.bold(), format!("{:5}", queue_info.verified_queue_size))
|
paint(Green.bold(), format!("{:5}", queue_info.verified_queue_size))
|
||||||
),
|
),
|
||||||
true => format!("Syncing snapshot {}/{}", snapshot_current, snapshot_total),
|
true => {
|
||||||
|
self.snapshot.as_ref().map_or(String::new(), |s|
|
||||||
|
match s.status() {
|
||||||
|
RestorationStatus::Ongoing { state_chunks, block_chunks, state_chunks_done, block_chunks_done } => {
|
||||||
|
format!("Syncing snapshot {}/{}", state_chunks_done + block_chunks_done, state_chunks + block_chunks)
|
||||||
|
},
|
||||||
|
RestorationStatus::Initializing { chunks_done } => {
|
||||||
|
format!("Snapshot initializing ({} chunks restored)", chunks_done)
|
||||||
|
},
|
||||||
|
_ => String::new(),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
},
|
},
|
||||||
false => String::new(),
|
false => String::new(),
|
||||||
},
|
},
|
||||||
|
@ -913,7 +913,8 @@ fn execute_impl<Cr, Rr>(cmd: RunCmd, logger: Arc<RotatingLogger>, on_client_rq:
|
|||||||
Ok(RunningClient::Full {
|
Ok(RunningClient::Full {
|
||||||
informant,
|
informant,
|
||||||
client,
|
client,
|
||||||
keep_alive: Box::new((watcher, service, updater, ws_server, http_server, ipc_server, ui_server, secretstore_key_server, ipfs_server, event_loop)),
|
client_service: Arc::new(service),
|
||||||
|
keep_alive: Box::new((watcher, updater, ws_server, http_server, ipc_server, ui_server, secretstore_key_server, ipfs_server, event_loop)),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -926,6 +927,7 @@ enum RunningClient {
|
|||||||
Full {
|
Full {
|
||||||
informant: Arc<Informant<FullNodeInformantData>>,
|
informant: Arc<Informant<FullNodeInformantData>>,
|
||||||
client: Arc<Client>,
|
client: Arc<Client>,
|
||||||
|
client_service: Arc<ClientService>,
|
||||||
keep_alive: Box<Any>,
|
keep_alive: Box<Any>,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -943,11 +945,14 @@ impl RunningClient {
|
|||||||
drop(client);
|
drop(client);
|
||||||
wait_for_drop(weak_client);
|
wait_for_drop(weak_client);
|
||||||
},
|
},
|
||||||
RunningClient::Full { informant, client, keep_alive } => {
|
RunningClient::Full { informant, client, client_service, keep_alive } => {
|
||||||
info!("Finishing work, please wait...");
|
info!("Finishing work, please wait...");
|
||||||
// Create a weak reference to the client so that we can wait on shutdown
|
// Create a weak reference to the client so that we can wait on shutdown
|
||||||
// until it is dropped
|
// until it is dropped
|
||||||
let weak_client = Arc::downgrade(&client);
|
let weak_client = Arc::downgrade(&client);
|
||||||
|
// Shutdown and drop the ServiceClient
|
||||||
|
client_service.shutdown();
|
||||||
|
drop(client_service);
|
||||||
// drop this stuff as soon as exit detected.
|
// drop this stuff as soon as exit detected.
|
||||||
drop(keep_alive);
|
drop(keep_alive);
|
||||||
// to make sure timer does not spawn requests while shutdown is in progress
|
// to make sure timer does not spawn requests while shutdown is in progress
|
||||||
|
@ -123,6 +123,7 @@ fn restore_using<R: SnapshotReader>(snapshot: Arc<SnapshotService>, reader: &R,
|
|||||||
|
|
||||||
match snapshot.status() {
|
match snapshot.status() {
|
||||||
RestorationStatus::Ongoing { .. } => Err("Snapshot file is incomplete and missing chunks.".into()),
|
RestorationStatus::Ongoing { .. } => Err("Snapshot file is incomplete and missing chunks.".into()),
|
||||||
|
RestorationStatus::Initializing { .. } => Err("Snapshot restoration is still initializing.".into()),
|
||||||
RestorationStatus::Failed => Err("Snapshot restoration failed.".into()),
|
RestorationStatus::Failed => Err("Snapshot restoration failed.".into()),
|
||||||
RestorationStatus::Inactive => {
|
RestorationStatus::Inactive => {
|
||||||
info!("Restoration complete.");
|
info!("Restoration complete.");
|
||||||
|
@ -48,7 +48,7 @@ ethcore-miner = { path = "../miner" }
|
|||||||
ethcore-private-tx = { path = "../ethcore/private-tx" }
|
ethcore-private-tx = { path = "../ethcore/private-tx" }
|
||||||
ethcore-sync = { path = "../ethcore/sync" }
|
ethcore-sync = { path = "../ethcore/sync" }
|
||||||
ethcore-transaction = { path = "../ethcore/transaction" }
|
ethcore-transaction = { path = "../ethcore/transaction" }
|
||||||
ethereum-types = "0.3"
|
ethereum-types = "0.3.2"
|
||||||
|
|
||||||
ethjson = { path = "../json" }
|
ethjson = { path = "../json" }
|
||||||
ethkey = { path = "../ethkey" }
|
ethkey = { path = "../ethkey" }
|
||||||
|
@ -129,9 +129,8 @@ impl LightFetch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BlockId::Hash(h) => {
|
BlockId::Hash(h) => {
|
||||||
reqs.push(request::HeaderByHash(h.into()).into());
|
|
||||||
|
|
||||||
let idx = reqs.len();
|
let idx = reqs.len();
|
||||||
|
reqs.push(request::HeaderByHash(h.into()).into());
|
||||||
Ok(HeaderRef::Unresolved(idx, h.into()))
|
Ok(HeaderRef::Unresolved(idx, h.into()))
|
||||||
}
|
}
|
||||||
_ => Err(errors::unknown_block()) // latest, earliest, and pending will have all already returned.
|
_ => Err(errors::unknown_block()) // latest, earliest, and pending will have all already returned.
|
||||||
|
@ -204,6 +204,18 @@ fn eth_get_block() {
|
|||||||
assert_eq!(tester.handler.handle_request_sync(req_block).unwrap(), res_block);
|
assert_eq!(tester.handler.handle_request_sync(req_block).unwrap(), res_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn eth_get_block_by_hash() {
|
||||||
|
let chain = extract_chain!("BlockchainTests/bcGasPricerTest/RPC_API_Test");
|
||||||
|
let tester = EthTester::from_chain(&chain);
|
||||||
|
|
||||||
|
// We're looking for block number 4 from "RPC_API_Test_Frontier"
|
||||||
|
let req_block = r#"{"method":"eth_getBlockByHash","params":["0x9c9bdab4cb53fd834e790b13545597f026494d42112e84c0aca9dd6bcc545295",false],"id":1,"jsonrpc":"2.0"}"#;
|
||||||
|
|
||||||
|
let res_block = r#"{"jsonrpc":"2.0","result":{"author":"0x8888f1f195afa192cfee860698584c030f4c9db1","difficulty":"0x200c0","extraData":"0x","gasLimit":"0x1dd8112","gasUsed":"0x5458","hash":"0x9c9bdab4cb53fd834e790b13545597f026494d42112e84c0aca9dd6bcc545295","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x8888f1f195afa192cfee860698584c030f4c9db1","mixHash":"0xaddea8d25bb0f955fa6c1d58d74ab8a3fec99d37943e2a261e3b12f97d6bff7c","nonce":"0x8e18bed16d5a88da","number":"0x4","parentHash":"0x2cbf4fc930c5b4c87598f43fc8eb26dccdab2f58a7d0d3ca92ec60a5444a330e","receiptsRoot":"0x7ed8026cf72ed0e98e6fd53ab406e51ffd34397d9da0052494ff41376fda7b5f","sealFields":["0xa0addea8d25bb0f955fa6c1d58d74ab8a3fec99d37943e2a261e3b12f97d6bff7c","0x888e18bed16d5a88da"],"sha3Uncles":"0x75cc08a7cb2cf8081446659fecb2633fb6b922d26edd59bd2272b1f5cae1c78b","size":"0x661","stateRoot":"0x68805721294e365020aca15ed56c360d9dc2cf03cbeff84c9b84b8aed023bfb5","timestamp":"0x59d662ff","totalDifficulty":"0xa0180","transactions":["0xb094b9dc356dbb8b256402c6d5709288066ad6a372c90c9c516f14277545fd58"],"transactionsRoot":"0x97a593d8d7e15b57f5c6bb25bc6c325463ef99f874bc08a78656c3ab5cb23262","uncles":["0xa1e9c9ecd2af999e0723aae1dc55dd9789ca618e0b34badcc8ac7d9a3dad3af2","0x81d429b6b6635214a2b0f976cc4b2ed49808140d6bede50129bc10d22ac9249e"]},"id":1}"#;
|
||||||
|
assert_eq!(tester.handler.handle_request_sync(req_block).unwrap(), res_block);
|
||||||
|
}
|
||||||
|
|
||||||
// a frontier-like test with an expanded gas limit and balance on known account.
|
// a frontier-like test with an expanded gas limit and balance on known account.
|
||||||
const TRANSACTION_COUNT_SPEC: &'static [u8] = br#"{
|
const TRANSACTION_COUNT_SPEC: &'static [u8] = br#"{
|
||||||
"name": "Frontier (Test)",
|
"name": "Frontier (Test)",
|
||||||
|
@ -43,10 +43,12 @@ impl TestSnapshotService {
|
|||||||
impl SnapshotService for TestSnapshotService {
|
impl SnapshotService for TestSnapshotService {
|
||||||
fn manifest(&self) -> Option<ManifestData> { None }
|
fn manifest(&self) -> Option<ManifestData> { None }
|
||||||
fn supported_versions(&self) -> Option<(u64, u64)> { None }
|
fn supported_versions(&self) -> Option<(u64, u64)> { None }
|
||||||
|
fn completed_chunks(&self) -> Option<Vec<H256>> { Some(vec![]) }
|
||||||
fn chunk(&self, _hash: H256) -> Option<Bytes> { None }
|
fn chunk(&self, _hash: H256) -> Option<Bytes> { None }
|
||||||
fn status(&self) -> RestorationStatus { self.status.lock().clone() }
|
fn status(&self) -> RestorationStatus { self.status.lock().clone() }
|
||||||
fn begin_restore(&self, _manifest: ManifestData) { }
|
fn begin_restore(&self, _manifest: ManifestData) { }
|
||||||
fn abort_restore(&self) { }
|
fn abort_restore(&self) { }
|
||||||
fn restore_state_chunk(&self, _hash: H256, _chunk: Bytes) { }
|
fn restore_state_chunk(&self, _hash: H256, _chunk: Bytes) { }
|
||||||
fn restore_block_chunk(&self, _hash: H256, _chunk: Bytes) { }
|
fn restore_block_chunk(&self, _hash: H256, _chunk: Bytes) { }
|
||||||
|
fn shutdown(&self) { }
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ macro_rules! impl_uint {
|
|||||||
|
|
||||||
impl fmt::LowerHex for $name {
|
impl fmt::LowerHex for $name {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
write!(f, "{:#x}", self.0)
|
fmt::LowerHex::fmt(&self.0, f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,19 +102,19 @@ impl_uint!(U64, u64, 1);
|
|||||||
|
|
||||||
impl serde::Serialize for U128 {
|
impl serde::Serialize for U128 {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
||||||
serializer.serialize_str(&format!("0x{:x}", self.0))
|
serializer.serialize_str(&format!("{:#x}", self))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl serde::Serialize for U256 {
|
impl serde::Serialize for U256 {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
||||||
serializer.serialize_str(&format!("0x{:x}", self.0))
|
serializer.serialize_str(&format!("{:#x}", self))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl serde::Serialize for U64 {
|
impl serde::Serialize for U64 {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
|
||||||
serializer.serialize_str(&format!("0x{:x}", self.0))
|
serializer.serialize_str(&format!("{:#x}", self))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,14 +689,17 @@ impl Host {
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
let s = session.lock();
|
let s = session.lock();
|
||||||
trace!(target: "network", "Session read error: {}:{:?} ({:?}) {:?}", token, s.id(), s.remote_addr(), e);
|
trace!(target: "network", "Session read error: {}:{:?} ({:?}) {:?}", token, s.id(), s.remote_addr(), e);
|
||||||
if let ErrorKind::Disconnect(DisconnectReason::IncompatibleProtocol) = *e.kind() {
|
match *e.kind() {
|
||||||
if let Some(id) = s.id() {
|
ErrorKind::Disconnect(DisconnectReason::IncompatibleProtocol) | ErrorKind::Disconnect(DisconnectReason::UselessPeer) => {
|
||||||
if !self.reserved_nodes.read().contains(id) {
|
if let Some(id) = s.id() {
|
||||||
let mut nodes = self.nodes.write();
|
if !self.reserved_nodes.read().contains(id) {
|
||||||
nodes.note_failure(&id);
|
let mut nodes = self.nodes.write();
|
||||||
nodes.mark_as_useless(id);
|
nodes.note_failure(&id);
|
||||||
|
nodes.mark_as_useless(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
_ => {},
|
||||||
}
|
}
|
||||||
kill = true;
|
kill = true;
|
||||||
break;
|
break;
|
||||||
|
@ -14,4 +14,9 @@ ethereum-types = "0.3"
|
|||||||
ethkey = { path = "../../ethkey" }
|
ethkey = { path = "../../ethkey" }
|
||||||
ipnetwork = "0.12.6"
|
ipnetwork = "0.12.6"
|
||||||
rlp = { path = "../rlp" }
|
rlp = { path = "../rlp" }
|
||||||
|
libc = "0.2"
|
||||||
snappy = { git = "https://github.com/paritytech/rust-snappy" }
|
snappy = { git = "https://github.com/paritytech/rust-snappy" }
|
||||||
|
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
assert_matches = "1.2"
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use std::{io, net, fmt};
|
use std::{io, net, fmt};
|
||||||
|
use libc::{ENFILE, EMFILE};
|
||||||
use io::IoError;
|
use io::IoError;
|
||||||
use {rlp, ethkey, crypto, snappy};
|
use {rlp, ethkey, crypto, snappy};
|
||||||
|
|
||||||
@ -83,7 +84,6 @@ impl fmt::Display for DisconnectReason {
|
|||||||
error_chain! {
|
error_chain! {
|
||||||
foreign_links {
|
foreign_links {
|
||||||
SocketIo(IoError) #[doc = "Socket IO error."];
|
SocketIo(IoError) #[doc = "Socket IO error."];
|
||||||
Io(io::Error) #[doc = "Error concerning the Rust standard library's IO subsystem."];
|
|
||||||
Decompression(snappy::InvalidInput) #[doc = "Decompression error."];
|
Decompression(snappy::InvalidInput) #[doc = "Decompression error."];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +141,34 @@ error_chain! {
|
|||||||
description("Packet is too large"),
|
description("Packet is too large"),
|
||||||
display("Packet is too large"),
|
display("Packet is too large"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc = "Reached system resource limits for this process"]
|
||||||
|
ProcessTooManyFiles {
|
||||||
|
description("Too many open files in process."),
|
||||||
|
display("Too many open files in this process. Check your resource limits and restart parity"),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc = "Reached system wide resource limits"]
|
||||||
|
SystemTooManyFiles {
|
||||||
|
description("Too many open files on system."),
|
||||||
|
display("Too many open files on system. Consider closing some processes/release some file handlers or increas the system-wide resource limits and restart parity."),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc = "An unknown IO error occurred."]
|
||||||
|
Io(err: io::Error) {
|
||||||
|
description("IO Error"),
|
||||||
|
display("Unexpected IO error: {}", err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<io::Error> for Error {
|
||||||
|
fn from(err: io::Error) -> Self {
|
||||||
|
match err.raw_os_error() {
|
||||||
|
Some(ENFILE) => ErrorKind::ProcessTooManyFiles.into(),
|
||||||
|
Some(EMFILE) => ErrorKind::SystemTooManyFiles.into(),
|
||||||
|
_ => Error::from_kind(ErrorKind::Io(err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,3 +213,26 @@ fn test_errors() {
|
|||||||
_ => panic!("Unexpeceted error"),
|
_ => panic!("Unexpeceted error"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_io_errors() {
|
||||||
|
use libc::{EMFILE, ENFILE};
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
<Error as From<io::Error>>::from(
|
||||||
|
io::Error::from_raw_os_error(ENFILE)
|
||||||
|
).kind(),
|
||||||
|
ErrorKind::ProcessTooManyFiles);
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
<Error as From<io::Error>>::from(
|
||||||
|
io::Error::from_raw_os_error(EMFILE)
|
||||||
|
).kind(),
|
||||||
|
ErrorKind::SystemTooManyFiles);
|
||||||
|
|
||||||
|
assert_matches!(
|
||||||
|
<Error as From<io::Error>>::from(
|
||||||
|
io::Error::from_raw_os_error(0)
|
||||||
|
).kind(),
|
||||||
|
ErrorKind::Io(_));
|
||||||
|
}
|
||||||
|
@ -23,6 +23,10 @@ extern crate ethkey;
|
|||||||
extern crate rlp;
|
extern crate rlp;
|
||||||
extern crate ipnetwork;
|
extern crate ipnetwork;
|
||||||
extern crate snappy;
|
extern crate snappy;
|
||||||
|
extern crate libc;
|
||||||
|
|
||||||
|
#[cfg(test)] #[macro_use]
|
||||||
|
extern crate assert_matches;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate error_chain;
|
extern crate error_chain;
|
||||||
|
Loading…
Reference in New Issue
Block a user