Merge branch 'discovery' of github.com:ethcore/parity into discovery
This commit is contained in:
commit
681350b03d
3
.gitignore
vendored
3
.gitignore
vendored
@ -7,7 +7,8 @@
|
|||||||
# Executables
|
# Executables
|
||||||
*.exe
|
*.exe
|
||||||
|
|
||||||
Cargo.lock
|
# Cargo lock in subs
|
||||||
|
**/Cargo.lock
|
||||||
|
|
||||||
# Generated by Cargo
|
# Generated by Cargo
|
||||||
**/target/
|
**/target/
|
||||||
|
808
Cargo.lock
generated
Normal file
808
Cargo.lock
generated
Normal file
@ -0,0 +1,808 @@
|
|||||||
|
[root]
|
||||||
|
name = "parity"
|
||||||
|
version = "0.9.0"
|
||||||
|
dependencies = [
|
||||||
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ctrlc 1.0.1 (git+https://github.com/tomusdrw/rust-ctrlc.git)",
|
||||||
|
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"docopt_macros 0.6.81 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ethcore 0.9.0",
|
||||||
|
"ethcore-rpc 0.9.0",
|
||||||
|
"ethcore-util 0.9.0",
|
||||||
|
"ethsync 0.1.0",
|
||||||
|
"fdlimit 0.1.0",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"memchr 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "arrayvec"
|
||||||
|
version = "0.3.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"nodrop 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"odds 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aster"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytes"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clippy"
|
||||||
|
version = "0.0.41"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"regex-syntax 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"semver 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cookie"
|
||||||
|
version = "0.1.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cookie"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ctrlc"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "git+https://github.com/tomusdrw/rust-ctrlc.git#d8751b66b31d9698cbb11f8ef37155a8211a0683"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "docopt"
|
||||||
|
version = "0.6.78"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"regex 0.1.48 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "docopt_macros"
|
||||||
|
version = "0.6.81"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "elastic-array"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "env_logger"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"regex 0.1.48 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "eth-secp256k1"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "git+https://github.com/arkpar/rust-secp256k1.git#321e6c22a83606d1875f89cb61c9cb37c7d249ae"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gcc 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethash"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lru-cache 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"sha3 0.1.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethcore"
|
||||||
|
version = "0.9.0"
|
||||||
|
dependencies = [
|
||||||
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"crossbeam 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ethash 0.1.0",
|
||||||
|
"ethcore-util 0.9.0",
|
||||||
|
"heapsize 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num_cpus 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethcore-rpc"
|
||||||
|
version = "0.9.0"
|
||||||
|
dependencies = [
|
||||||
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ethcore 0.9.0",
|
||||||
|
"ethcore-util 0.9.0",
|
||||||
|
"ethsync 0.1.0",
|
||||||
|
"jsonrpc-core 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"jsonrpc-http-server 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_macros 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethcore-util"
|
||||||
|
version = "0.9.0"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"crossbeam 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"elastic-array 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"eth-secp256k1 0.5.4 (git+https://github.com/arkpar/rust-secp256k1.git)",
|
||||||
|
"heapsize 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"igd 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"itertools 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"json-tests 0.1.0",
|
||||||
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"sha3 0.1.0",
|
||||||
|
"slab 0.1.4 (git+https://github.com/arkpar/slab.git)",
|
||||||
|
"target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"tiny-keccak 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethsync"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ethcore 0.9.0",
|
||||||
|
"ethcore-util 0.9.0",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fdlimit"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gcc"
|
||||||
|
version = "0.3.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.2.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heapsize"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hpack"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "httparse"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper"
|
||||||
|
version = "0.6.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cookie 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"httparse 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"language-tags 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num_cpus 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"solicit 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicase 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hyper"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cookie 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"httparse 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"mime 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num_cpus 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"solicit 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicase 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "igd"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"hyper 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"regex 0.1.48 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"xml-rs 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"xmltree 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.4.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "json-tests"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"glob 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jsonrpc-core"
|
||||||
|
version = "1.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_json 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_macros 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jsonrpc-http-server"
|
||||||
|
version = "1.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"hyper 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"jsonrpc-core 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kernel32-sys"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "language-tags"
|
||||||
|
version = "0.0.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "language-tags"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "0.1.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.1.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linked-hash-map"
|
||||||
|
version = "0.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.3.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lru-cache"
|
||||||
|
version = "0.0.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"linked-hash-map 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matches"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "0.1.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"miow 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"net2 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"nix 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "miow"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"net2 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "net2"
|
||||||
|
version = "0.2.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nodrop"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"odds 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nom"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num"
|
||||||
|
version = "0.1.30"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num_cpus"
|
||||||
|
version = "0.2.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "odds"
|
||||||
|
version = "0.2.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quasi"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quasi_codegen"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"aster 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quasi_macros"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"quasi_codegen 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.3.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "0.1.48"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"memchr 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"regex-syntax 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rocksdb"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rust-crypto"
|
||||||
|
version = "0.2.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"gcc 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc-serialize"
|
||||||
|
version = "0.3.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_version"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "0.1.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "semver"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"nom 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "0.6.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"num 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_codegen"
|
||||||
|
version = "0.6.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"aster 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quasi 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quasi_macros 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"num 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_macros"
|
||||||
|
version = "0.6.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"serde_codegen 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sha3"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"gcc 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slab"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "slab"
|
||||||
|
version = "0.1.4"
|
||||||
|
source = "git+https://github.com/arkpar/slab.git#3c9284e1f010e394c9d0359b27464e8fb5c87bf0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "solicit"
|
||||||
|
version = "0.4.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"hpack 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "target_info"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "time"
|
||||||
|
version = "0.1.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tiny-keccak"
|
||||||
|
version = "1.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "traitobject"
|
||||||
|
version = "0.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typeable"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rustc_version 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-bidi"
|
||||||
|
version = "0.2.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-normalization"
|
||||||
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "url"
|
||||||
|
version = "0.2.38"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "url"
|
||||||
|
version = "0.5.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "uuid"
|
||||||
|
version = "0.1.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.2.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-build"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ws2_32-sys"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xml-rs"
|
||||||
|
version = "0.1.26"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xml-rs"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xmltree"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"xml-rs 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
@ -12,7 +12,7 @@ rustc-serialize = "0.3"
|
|||||||
docopt = "0.6"
|
docopt = "0.6"
|
||||||
docopt_macros = "0.6"
|
docopt_macros = "0.6"
|
||||||
ctrlc = { git = "https://github.com/tomusdrw/rust-ctrlc.git" }
|
ctrlc = { git = "https://github.com/tomusdrw/rust-ctrlc.git" }
|
||||||
clippy = "0.0.37"
|
clippy = "0.0.41"
|
||||||
ethcore-util = { path = "util" }
|
ethcore-util = { path = "util" }
|
||||||
ethcore = { path = "ethcore" }
|
ethcore = { path = "ethcore" }
|
||||||
ethsync = { path = "sync" }
|
ethsync = { path = "sync" }
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
# install rocksdb
|
# install rocksdb
|
||||||
add-apt-repository ppa:ethcore/ethcore
|
add-apt-repository ppa:ethcore/ethcore
|
||||||
apt-get update
|
apt-get update
|
||||||
apt-get install -y --force-yes librocksdb
|
apt-get install -y --force-yes librocksdb-dev
|
||||||
|
|
||||||
# install multirust
|
# install multirust
|
||||||
curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh -s -- --yes
|
curl -sf https://raw.githubusercontent.com/brson/multirust/master/blastoff.sh | sh -s -- --yes
|
||||||
|
@ -18,7 +18,7 @@ ethcore-util = { path = "../util" }
|
|||||||
evmjit = { path = "../evmjit", optional = true }
|
evmjit = { path = "../evmjit", optional = true }
|
||||||
ethash = { path = "../ethash" }
|
ethash = { path = "../ethash" }
|
||||||
num_cpus = "0.2"
|
num_cpus = "0.2"
|
||||||
clippy = "0.0.37"
|
clippy = "0.0.41"
|
||||||
crossbeam = "0.1.5"
|
crossbeam = "0.1.5"
|
||||||
lazy_static = "0.1"
|
lazy_static = "0.1"
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"engineName": "Ethash",
|
"engineName": "Ethash",
|
||||||
"params": {
|
"params": {
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"frontierCompatibilityModeLimit": "0xf4240",
|
"frontierCompatibilityModeLimit": "0x10c8e0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"tieBreakingGas": false,
|
"tieBreakingGas": false,
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"engineName": "Ethash",
|
"engineName": "Ethash",
|
||||||
"params": {
|
"params": {
|
||||||
"accountStartNonce": "0x0100000",
|
"accountStartNonce": "0x0100000",
|
||||||
"frontierCompatibilityModeLimit": "0xdbba0",
|
"frontierCompatibilityModeLimit": "0x10c8e0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"tieBreakingGas": false,
|
"tieBreakingGas": false,
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -72,14 +72,14 @@ impl AccountDiff {
|
|||||||
pub fn diff_pod(pre: Option<&PodAccount>, post: Option<&PodAccount>) -> Option<AccountDiff> {
|
pub fn diff_pod(pre: Option<&PodAccount>, post: Option<&PodAccount>) -> Option<AccountDiff> {
|
||||||
match (pre, post) {
|
match (pre, post) {
|
||||||
(None, Some(x)) => Some(AccountDiff {
|
(None, Some(x)) => Some(AccountDiff {
|
||||||
balance: Diff::Born(x.balance.clone()),
|
balance: Diff::Born(x.balance),
|
||||||
nonce: Diff::Born(x.nonce.clone()),
|
nonce: Diff::Born(x.nonce),
|
||||||
code: Diff::Born(x.code.clone()),
|
code: Diff::Born(x.code.clone()),
|
||||||
storage: x.storage.iter().map(|(k, v)| (k.clone(), Diff::Born(v.clone()))).collect(),
|
storage: x.storage.iter().map(|(k, v)| (k.clone(), Diff::Born(v.clone()))).collect(),
|
||||||
}),
|
}),
|
||||||
(Some(x), None) => Some(AccountDiff {
|
(Some(x), None) => Some(AccountDiff {
|
||||||
balance: Diff::Died(x.balance.clone()),
|
balance: Diff::Died(x.balance),
|
||||||
nonce: Diff::Died(x.nonce.clone()),
|
nonce: Diff::Died(x.nonce),
|
||||||
code: Diff::Died(x.code.clone()),
|
code: Diff::Died(x.code.clone()),
|
||||||
storage: x.storage.iter().map(|(k, v)| (k.clone(), Diff::Died(v.clone()))).collect(),
|
storage: x.storage.iter().map(|(k, v)| (k.clone(), Diff::Died(v.clone()))).collect(),
|
||||||
}),
|
}),
|
||||||
@ -88,8 +88,8 @@ impl AccountDiff {
|
|||||||
.filter(|k| pre.storage.get(k).unwrap_or(&H256::new()) != post.storage.get(k).unwrap_or(&H256::new()))
|
.filter(|k| pre.storage.get(k).unwrap_or(&H256::new()) != post.storage.get(k).unwrap_or(&H256::new()))
|
||||||
.collect();
|
.collect();
|
||||||
let r = AccountDiff {
|
let r = AccountDiff {
|
||||||
balance: Diff::new(pre.balance.clone(), post.balance.clone()),
|
balance: Diff::new(pre.balance, post.balance),
|
||||||
nonce: Diff::new(pre.nonce.clone(), post.nonce.clone()),
|
nonce: Diff::new(pre.nonce, post.nonce),
|
||||||
code: Diff::new(pre.code.clone(), post.code.clone()),
|
code: Diff::new(pre.code.clone(), post.code.clone()),
|
||||||
storage: storage.into_iter().map(|k|
|
storage: storage.into_iter().map(|k|
|
||||||
(k.clone(), Diff::new(
|
(k.clone(), Diff::new(
|
||||||
|
@ -24,6 +24,7 @@ pub type LogBloom = H2048;
|
|||||||
/// Constant 2048-bit datum for 0. Often used as a default.
|
/// Constant 2048-bit datum for 0. Often used as a default.
|
||||||
pub static ZERO_LOGBLOOM: LogBloom = H2048([0x00; 256]);
|
pub static ZERO_LOGBLOOM: LogBloom = H2048([0x00; 256]);
|
||||||
|
|
||||||
|
#[allow(enum_variant_names)]
|
||||||
/// Semantic boolean for when a seal/signature is included.
|
/// Semantic boolean for when a seal/signature is included.
|
||||||
pub enum Seal {
|
pub enum Seal {
|
||||||
/// The seal/signature is included.
|
/// The seal/signature is included.
|
||||||
|
@ -87,6 +87,7 @@ struct QueueSignal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl QueueSignal {
|
impl QueueSignal {
|
||||||
|
#[allow(bool_comparison)]
|
||||||
fn set(&self) {
|
fn set(&self) {
|
||||||
if self.signalled.compare_and_swap(false, true, AtomicOrdering::Relaxed) == false {
|
if self.signalled.compare_and_swap(false, true, AtomicOrdering::Relaxed) == false {
|
||||||
self.message_channel.send(UserMessage(SyncMessage::BlockVerified)).expect("Error sending BlockVerified message");
|
self.message_channel.send(UserMessage(SyncMessage::BlockVerified)).expect("Error sending BlockVerified message");
|
||||||
|
@ -274,7 +274,7 @@ mod tests {
|
|||||||
use block::*;
|
use block::*;
|
||||||
use engine::*;
|
use engine::*;
|
||||||
use tests::helpers::*;
|
use tests::helpers::*;
|
||||||
use super::*;
|
use super::{Ethash};
|
||||||
use super::super::new_morden;
|
use super::super::new_morden;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -24,7 +24,7 @@ pub mod ethash;
|
|||||||
/// Export the denominations module.
|
/// Export the denominations module.
|
||||||
pub mod denominations;
|
pub mod denominations;
|
||||||
|
|
||||||
pub use self::ethash::*;
|
pub use self::ethash::{Ethash};
|
||||||
pub use self::denominations::*;
|
pub use self::denominations::*;
|
||||||
|
|
||||||
use super::spec::*;
|
use super::spec::*;
|
||||||
|
@ -258,6 +258,7 @@ impl<'a> CodeReader<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(enum_variant_names)]
|
||||||
enum InstructionCost {
|
enum InstructionCost {
|
||||||
Gas(U256),
|
Gas(U256),
|
||||||
GasMem(U256, U256),
|
GasMem(U256, U256),
|
||||||
@ -282,7 +283,7 @@ impl evm::Evm for Interpreter {
|
|||||||
let code = ¶ms.code.as_ref().unwrap();
|
let code = ¶ms.code.as_ref().unwrap();
|
||||||
let valid_jump_destinations = self.find_jump_destinations(&code);
|
let valid_jump_destinations = self.find_jump_destinations(&code);
|
||||||
|
|
||||||
let mut current_gas = params.gas.clone();
|
let mut current_gas = params.gas;
|
||||||
let mut stack = VecStack::with_capacity(ext.schedule().stack_limit, U256::zero());
|
let mut stack = VecStack::with_capacity(ext.schedule().stack_limit, U256::zero());
|
||||||
let mut mem = vec![];
|
let mut mem = vec![];
|
||||||
let mut reader = CodeReader {
|
let mut reader = CodeReader {
|
||||||
@ -380,10 +381,9 @@ impl Interpreter {
|
|||||||
|
|
||||||
let gas = if self.is_zero(&val) && !self.is_zero(newval) {
|
let gas = if self.is_zero(&val) && !self.is_zero(newval) {
|
||||||
schedule.sstore_set_gas
|
schedule.sstore_set_gas
|
||||||
} else if !self.is_zero(&val) && self.is_zero(newval) {
|
|
||||||
// Refund is added when actually executing sstore
|
|
||||||
schedule.sstore_reset_gas
|
|
||||||
} else {
|
} else {
|
||||||
|
// Refund for below case is added when actually executing sstore
|
||||||
|
// !self.is_zero(&val) && self.is_zero(newval)
|
||||||
schedule.sstore_reset_gas
|
schedule.sstore_reset_gas
|
||||||
};
|
};
|
||||||
InstructionCost::Gas(U256::from(gas))
|
InstructionCost::Gas(U256::from(gas))
|
||||||
@ -391,10 +391,7 @@ impl Interpreter {
|
|||||||
instructions::SLOAD => {
|
instructions::SLOAD => {
|
||||||
InstructionCost::Gas(U256::from(schedule.sload_gas))
|
InstructionCost::Gas(U256::from(schedule.sload_gas))
|
||||||
},
|
},
|
||||||
instructions::MSTORE => {
|
instructions::MSTORE | instructions::MLOAD => {
|
||||||
InstructionCost::GasMem(default_gas, try!(self.mem_needed_const(stack.peek(0), 32)))
|
|
||||||
},
|
|
||||||
instructions::MLOAD => {
|
|
||||||
InstructionCost::GasMem(default_gas, try!(self.mem_needed_const(stack.peek(0), 32)))
|
InstructionCost::GasMem(default_gas, try!(self.mem_needed_const(stack.peek(0), 32)))
|
||||||
},
|
},
|
||||||
instructions::MSTORE8 => {
|
instructions::MSTORE8 => {
|
||||||
@ -409,10 +406,7 @@ impl Interpreter {
|
|||||||
let gas = U256::from(schedule.sha3_gas) + (U256::from(schedule.sha3_word_gas) * words);
|
let gas = U256::from(schedule.sha3_gas) + (U256::from(schedule.sha3_word_gas) * words);
|
||||||
InstructionCost::GasMem(gas, try!(self.mem_needed(stack.peek(0), stack.peek(1))))
|
InstructionCost::GasMem(gas, try!(self.mem_needed(stack.peek(0), stack.peek(1))))
|
||||||
},
|
},
|
||||||
instructions::CALLDATACOPY => {
|
instructions::CALLDATACOPY | instructions::CODECOPY => {
|
||||||
InstructionCost::GasMemCopy(default_gas, try!(self.mem_needed(stack.peek(0), stack.peek(2))), stack.peek(2).clone())
|
|
||||||
},
|
|
||||||
instructions::CODECOPY => {
|
|
||||||
InstructionCost::GasMemCopy(default_gas, try!(self.mem_needed(stack.peek(0), stack.peek(2))), stack.peek(2).clone())
|
InstructionCost::GasMemCopy(default_gas, try!(self.mem_needed(stack.peek(0), stack.peek(2))), stack.peek(2).clone())
|
||||||
},
|
},
|
||||||
instructions::EXTCODECOPY => {
|
instructions::EXTCODECOPY => {
|
||||||
@ -736,8 +730,7 @@ impl Interpreter {
|
|||||||
},
|
},
|
||||||
instructions::CALLVALUE => {
|
instructions::CALLVALUE => {
|
||||||
stack.push(match params.value {
|
stack.push(match params.value {
|
||||||
ActionValue::Transfer(val) => val,
|
ActionValue::Transfer(val) | ActionValue::Apparent(val) => val
|
||||||
ActionValue::Apparent(val) => val,
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
instructions::CALLDATALOAD => {
|
instructions::CALLDATALOAD => {
|
||||||
@ -982,9 +975,9 @@ impl Interpreter {
|
|||||||
let (a, neg_a) = get_and_reset_sign(stack.pop_back());
|
let (a, neg_a) = get_and_reset_sign(stack.pop_back());
|
||||||
let (b, neg_b) = get_and_reset_sign(stack.pop_back());
|
let (b, neg_b) = get_and_reset_sign(stack.pop_back());
|
||||||
|
|
||||||
let is_positive_lt = a < b && (neg_a | neg_b) == false;
|
let is_positive_lt = a < b && !(neg_a | neg_b);
|
||||||
let is_negative_lt = a > b && (neg_a & neg_b) == true;
|
let is_negative_lt = a > b && (neg_a & neg_b);
|
||||||
let has_different_signs = neg_a == true && neg_b == false;
|
let has_different_signs = neg_a && !neg_b;
|
||||||
|
|
||||||
stack.push(self.bool_to_u256(is_positive_lt | is_negative_lt | has_different_signs));
|
stack.push(self.bool_to_u256(is_positive_lt | is_negative_lt | has_different_signs));
|
||||||
},
|
},
|
||||||
@ -997,9 +990,9 @@ impl Interpreter {
|
|||||||
let (a, neg_a) = get_and_reset_sign(stack.pop_back());
|
let (a, neg_a) = get_and_reset_sign(stack.pop_back());
|
||||||
let (b, neg_b) = get_and_reset_sign(stack.pop_back());
|
let (b, neg_b) = get_and_reset_sign(stack.pop_back());
|
||||||
|
|
||||||
let is_positive_gt = a > b && (neg_a | neg_b) == false;
|
let is_positive_gt = a > b && !(neg_a | neg_b);
|
||||||
let is_negative_gt = a < b && (neg_a & neg_b) == true;
|
let is_negative_gt = a < b && (neg_a & neg_b);
|
||||||
let has_different_signs = neg_a == false && neg_b == true;
|
let has_different_signs = !neg_a && neg_b;
|
||||||
|
|
||||||
stack.push(self.bool_to_u256(is_positive_gt | is_negative_gt | has_different_signs));
|
stack.push(self.bool_to_u256(is_positive_gt | is_negative_gt | has_different_signs));
|
||||||
},
|
},
|
||||||
|
@ -25,6 +25,7 @@ struct FakeLogEntry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Hash, Debug)]
|
#[derive(PartialEq, Eq, Hash, Debug)]
|
||||||
|
#[allow(enum_variant_names)] // Common prefix is C ;)
|
||||||
enum FakeCallType {
|
enum FakeCallType {
|
||||||
CALL, CREATE
|
CALL, CREATE
|
||||||
}
|
}
|
||||||
@ -84,7 +85,7 @@ impl Ext for FakeExt {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn balance(&self, address: &Address) -> U256 {
|
fn balance(&self, address: &Address) -> U256 {
|
||||||
self.balances.get(address).unwrap().clone()
|
*self.balances.get(address).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn blockhash(&self, number: &U256) -> H256 {
|
fn blockhash(&self, number: &U256) -> H256 {
|
||||||
@ -94,10 +95,10 @@ impl Ext for FakeExt {
|
|||||||
fn create(&mut self, gas: &U256, value: &U256, code: &[u8]) -> ContractCreateResult {
|
fn create(&mut self, gas: &U256, value: &U256, code: &[u8]) -> ContractCreateResult {
|
||||||
self.calls.insert(FakeCall {
|
self.calls.insert(FakeCall {
|
||||||
call_type: FakeCallType::CREATE,
|
call_type: FakeCallType::CREATE,
|
||||||
gas: gas.clone(),
|
gas: *gas,
|
||||||
sender_address: None,
|
sender_address: None,
|
||||||
receive_address: None,
|
receive_address: None,
|
||||||
value: Some(value.clone()),
|
value: Some(*value),
|
||||||
data: code.to_vec(),
|
data: code.to_vec(),
|
||||||
code_address: None
|
code_address: None
|
||||||
});
|
});
|
||||||
@ -115,14 +116,14 @@ impl Ext for FakeExt {
|
|||||||
|
|
||||||
self.calls.insert(FakeCall {
|
self.calls.insert(FakeCall {
|
||||||
call_type: FakeCallType::CALL,
|
call_type: FakeCallType::CALL,
|
||||||
gas: gas.clone(),
|
gas: *gas,
|
||||||
sender_address: Some(sender_address.clone()),
|
sender_address: Some(sender_address.clone()),
|
||||||
receive_address: Some(receive_address.clone()),
|
receive_address: Some(receive_address.clone()),
|
||||||
value: value,
|
value: value,
|
||||||
data: data.to_vec(),
|
data: data.to_vec(),
|
||||||
code_address: Some(code_address.clone())
|
code_address: Some(code_address.clone())
|
||||||
});
|
});
|
||||||
MessageCallResult::Success(gas.clone())
|
MessageCallResult::Success(*gas)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extcode(&self, address: &Address) -> Bytes {
|
fn extcode(&self, address: &Address) -> Bytes {
|
||||||
@ -898,7 +899,7 @@ fn test_calls(factory: super::Factory) {
|
|||||||
let mut ext = FakeExt::new();
|
let mut ext = FakeExt::new();
|
||||||
ext.balances = {
|
ext.balances = {
|
||||||
let mut s = HashMap::new();
|
let mut s = HashMap::new();
|
||||||
s.insert(params.address.clone(), params.gas.clone());
|
s.insert(params.address.clone(), params.gas);
|
||||||
s
|
s
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,10 +45,9 @@ impl OriginInfo {
|
|||||||
OriginInfo {
|
OriginInfo {
|
||||||
address: params.address.clone(),
|
address: params.address.clone(),
|
||||||
origin: params.origin.clone(),
|
origin: params.origin.clone(),
|
||||||
gas_price: params.gas_price.clone(),
|
gas_price: params.gas_price,
|
||||||
value: match params.value {
|
value: match params.value {
|
||||||
ActionValue::Transfer(val) => val,
|
ActionValue::Transfer(val) | ActionValue::Apparent(val) => val
|
||||||
ActionValue::Apparent(val) => val,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,8 +132,8 @@ impl<'a> Ext for Externalities<'a> {
|
|||||||
sender: self.origin_info.address.clone(),
|
sender: self.origin_info.address.clone(),
|
||||||
origin: self.origin_info.origin.clone(),
|
origin: self.origin_info.origin.clone(),
|
||||||
gas: *gas,
|
gas: *gas,
|
||||||
gas_price: self.origin_info.gas_price.clone(),
|
gas_price: self.origin_info.gas_price,
|
||||||
value: ActionValue::Transfer(value.clone()),
|
value: ActionValue::Transfer(*value),
|
||||||
code: Some(code.to_vec()),
|
code: Some(code.to_vec()),
|
||||||
data: None,
|
data: None,
|
||||||
};
|
};
|
||||||
@ -164,11 +163,11 @@ impl<'a> Ext for Externalities<'a> {
|
|||||||
let mut params = ActionParams {
|
let mut params = ActionParams {
|
||||||
sender: sender_address.clone(),
|
sender: sender_address.clone(),
|
||||||
address: receive_address.clone(),
|
address: receive_address.clone(),
|
||||||
value: ActionValue::Apparent(self.origin_info.value.clone()),
|
value: ActionValue::Apparent(self.origin_info.value),
|
||||||
code_address: code_address.clone(),
|
code_address: code_address.clone(),
|
||||||
origin: self.origin_info.origin.clone(),
|
origin: self.origin_info.origin.clone(),
|
||||||
gas: *gas,
|
gas: *gas,
|
||||||
gas_price: self.origin_info.gas_price.clone(),
|
gas_price: self.origin_info.gas_price,
|
||||||
code: self.state.code(code_address),
|
code: self.state.code(code_address),
|
||||||
data: Some(data.to_vec()),
|
data: Some(data.to_vec()),
|
||||||
};
|
};
|
||||||
@ -364,7 +363,7 @@ mod tests {
|
|||||||
&Address::new(),
|
&Address::new(),
|
||||||
&Address::new(),
|
&Address::new(),
|
||||||
Some(U256::from_str("0000000000000000000000000000000000000000000000000000000000150000").unwrap()),
|
Some(U256::from_str("0000000000000000000000000000000000000000000000000000000000150000").unwrap()),
|
||||||
&vec![],
|
&[],
|
||||||
&Address::new(),
|
&Address::new(),
|
||||||
&mut output);
|
&mut output);
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ declare_test!{StateTests_stSolidityTest, "StateTests/stSolidityTest"}
|
|||||||
declare_test!{StateTests_stSpecialTest, "StateTests/stSpecialTest"}
|
declare_test!{StateTests_stSpecialTest, "StateTests/stSpecialTest"}
|
||||||
declare_test!{StateTests_stSystemOperationsTest, "StateTests/stSystemOperationsTest"}
|
declare_test!{StateTests_stSystemOperationsTest, "StateTests/stSystemOperationsTest"}
|
||||||
declare_test!{StateTests_stTransactionTest, "StateTests/stTransactionTest"}
|
declare_test!{StateTests_stTransactionTest, "StateTests/stTransactionTest"}
|
||||||
declare_test!{StateTests_stTransitionTest, "StateTests/stTransitionTest"}
|
//declare_test!{StateTests_stTransitionTest, "StateTests/stTransitionTest"}
|
||||||
declare_test!{StateTests_stWalletTest, "StateTests/stWalletTest"}
|
declare_test!{StateTests_stWalletTest, "StateTests/stWalletTest"}
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,8 +18,15 @@
|
|||||||
#![feature(cell_extras)]
|
#![feature(cell_extras)]
|
||||||
#![feature(augmented_assignments)]
|
#![feature(augmented_assignments)]
|
||||||
#![feature(plugin)]
|
#![feature(plugin)]
|
||||||
|
// Clippy
|
||||||
#![plugin(clippy)]
|
#![plugin(clippy)]
|
||||||
#![allow(needless_range_loop, match_bool)]
|
// TODO [todr] not really sure
|
||||||
|
#![allow(needless_range_loop)]
|
||||||
|
// Shorter than if-else
|
||||||
|
#![allow(match_bool)]
|
||||||
|
// Keeps consistency (all lines with `.clone()`) and helpful when changing ref to non-ref.
|
||||||
|
#![allow(clone_on_copy)]
|
||||||
|
|
||||||
|
|
||||||
//! Ethcore library
|
//! Ethcore library
|
||||||
//!
|
//!
|
||||||
|
@ -43,8 +43,8 @@ impl PodAccount {
|
|||||||
/// NOTE: This will silently fail unless the account is fully cached.
|
/// NOTE: This will silently fail unless the account is fully cached.
|
||||||
pub fn from_account(acc: &Account) -> PodAccount {
|
pub fn from_account(acc: &Account) -> PodAccount {
|
||||||
PodAccount {
|
PodAccount {
|
||||||
balance: acc.balance().clone(),
|
balance: *acc.balance(),
|
||||||
nonce: acc.nonce().clone(),
|
nonce: *acc.nonce(),
|
||||||
storage: acc.storage_overlay().iter().fold(BTreeMap::new(), |mut m, (k, &(_, ref v))| {m.insert(k.clone(), v.clone()); m}),
|
storage: acc.storage_overlay().iter().fold(BTreeMap::new(), |mut m, (k, &(_, ref v))| {m.insert(k.clone(), v.clone()); m}),
|
||||||
code: acc.code().unwrap().to_vec(),
|
code: acc.code().unwrap().to_vec(),
|
||||||
}
|
}
|
||||||
|
@ -153,12 +153,12 @@ impl State {
|
|||||||
|
|
||||||
/// Get the balance of account `a`.
|
/// Get the balance of account `a`.
|
||||||
pub fn balance(&self, a: &Address) -> U256 {
|
pub fn balance(&self, a: &Address) -> U256 {
|
||||||
self.get(a, false).as_ref().map_or(U256::zero(), |account| account.balance().clone())
|
self.get(a, false).as_ref().map_or(U256::zero(), |account| *account.balance())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the nonce of account `a`.
|
/// Get the nonce of account `a`.
|
||||||
pub fn nonce(&self, a: &Address) -> U256 {
|
pub fn nonce(&self, a: &Address) -> U256 {
|
||||||
self.get(a, false).as_ref().map_or(U256::zero(), |account| account.nonce().clone())
|
self.get(a, false).as_ref().map_or(U256::zero(), |account| *account.nonce())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mutate storage of account `address` so that it is `value` for `key`.
|
/// Mutate storage of account `address` so that it is `value` for `key`.
|
||||||
|
3
evmjit/.gitignore
vendored
3
evmjit/.gitignore
vendored
@ -1,3 +0,0 @@
|
|||||||
target
|
|
||||||
Cargo.lock
|
|
||||||
*.swp
|
|
@ -36,6 +36,7 @@ extern crate ethcore_rpc as rpc;
|
|||||||
|
|
||||||
use std::net::{SocketAddr};
|
use std::net::{SocketAddr};
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use std::path::PathBuf;
|
||||||
use rlog::{LogLevelFilter};
|
use rlog::{LogLevelFilter};
|
||||||
use env_logger::LogBuilder;
|
use env_logger::LogBuilder;
|
||||||
use ctrlc::CtrlC;
|
use ctrlc::CtrlC;
|
||||||
@ -165,7 +166,7 @@ impl Configuration {
|
|||||||
}
|
}
|
||||||
Some(ref a) => {
|
Some(ref a) => {
|
||||||
public_address = SocketAddr::from_str(a.as_ref()).expect("Invalid listen/public address given with --address");
|
public_address = SocketAddr::from_str(a.as_ref()).expect("Invalid listen/public address given with --address");
|
||||||
listen_address = public_address.clone();
|
listen_address = public_address;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -207,6 +208,9 @@ fn main() {
|
|||||||
net_settings.listen_address = listen;
|
net_settings.listen_address = listen;
|
||||||
net_settings.public_address = public;
|
net_settings.public_address = public;
|
||||||
net_settings.use_secret = conf.args.flag_node_key.as_ref().map(|s| Secret::from_str(&s).expect("Invalid key string"));
|
net_settings.use_secret = conf.args.flag_node_key.as_ref().map(|s| Secret::from_str(&s).expect("Invalid key string"));
|
||||||
|
let mut net_path = PathBuf::from(&conf.path());
|
||||||
|
net_path.push("network");
|
||||||
|
net_settings.config_path = Some(net_path.to_str().unwrap().to_owned());
|
||||||
|
|
||||||
// Build client
|
// Build client
|
||||||
let mut service = ClientService::start(spec, net_settings, &Path::new(&conf.path())).unwrap();
|
let mut service = ClientService::start(spec, net_settings, &Path::new(&conf.path())).unwrap();
|
||||||
|
@ -9,13 +9,13 @@ authors = ["Ethcore <admin@ethcore.io"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
serde = "0.6.7"
|
serde = "0.6.7"
|
||||||
serde_macros = "0.6.10"
|
serde_macros = "0.6.13"
|
||||||
serde_json = "0.6.0"
|
serde_json = "0.6.0"
|
||||||
jsonrpc-core = "1.1"
|
jsonrpc-core = "1.1.2"
|
||||||
jsonrpc-http-server = "1.1"
|
jsonrpc-http-server = "1.1.2"
|
||||||
ethcore-util = { path = "../util" }
|
ethcore-util = { path = "../util" }
|
||||||
ethcore = { path = "../ethcore" }
|
ethcore = { path = "../ethcore" }
|
||||||
ethsync = { path = "../sync" }
|
ethsync = { path = "../sync" }
|
||||||
clippy = "0.0.37"
|
clippy = "0.0.41"
|
||||||
target_info = "0.1.0"
|
target_info = "0.1.0"
|
||||||
rustc-serialize = "0.3"
|
rustc-serialize = "0.3"
|
||||||
|
@ -55,6 +55,7 @@ impl Visitor for BlockNumberVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Into<BlockId> for BlockNumber {
|
impl Into<BlockId> for BlockNumber {
|
||||||
|
#[allow(match_same_arms)]
|
||||||
fn into(self) -> BlockId {
|
fn into(self) -> BlockId {
|
||||||
match self {
|
match self {
|
||||||
BlockNumber::Num(n) => BlockId::Number(n),
|
BlockNumber::Num(n) => BlockId::Number(n),
|
||||||
|
@ -10,7 +10,7 @@ authors = ["Ethcore <admin@ethcore.io"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
ethcore-util = { path = "../util" }
|
ethcore-util = { path = "../util" }
|
||||||
ethcore = { path = ".." }
|
ethcore = { path = ".." }
|
||||||
clippy = "0.0.37"
|
clippy = "0.0.41"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
env_logger = "0.3"
|
env_logger = "0.3"
|
||||||
time = "0.1.34"
|
time = "0.1.34"
|
||||||
|
@ -250,6 +250,8 @@ impl ChainSync {
|
|||||||
self.peers.clear();
|
self.peers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[allow(for_kv_map)] // Because it's not possible to get `values_mut()`
|
||||||
/// Rest sync. Clear all downloaded data but keep the queue
|
/// Rest sync. Clear all downloaded data but keep the queue
|
||||||
fn reset(&mut self) {
|
fn reset(&mut self) {
|
||||||
self.downloading_headers.clear();
|
self.downloading_headers.clear();
|
||||||
@ -466,6 +468,7 @@ impl ChainSync {
|
|||||||
trace!(target: "sync", "New block already queued {:?}", h);
|
trace!(target: "sync", "New block already queued {:?}", h);
|
||||||
},
|
},
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
|
self.last_imported_block = Some(header.number);
|
||||||
trace!(target: "sync", "New block queued {:?}", h);
|
trace!(target: "sync", "New block queued {:?}", h);
|
||||||
},
|
},
|
||||||
Err(ImportError::UnknownParent) => {
|
Err(ImportError::UnknownParent) => {
|
||||||
@ -1099,8 +1102,7 @@ impl ChainSync {
|
|||||||
let mut rlp_stream = RlpStream::new_list(route.blocks.len());
|
let mut rlp_stream = RlpStream::new_list(route.blocks.len());
|
||||||
for block_hash in route.blocks {
|
for block_hash in route.blocks {
|
||||||
let mut hash_rlp = RlpStream::new_list(2);
|
let mut hash_rlp = RlpStream::new_list(2);
|
||||||
let difficulty = chain.block_total_difficulty(BlockId::Hash(block_hash.clone())).unwrap();
|
let difficulty = chain.block_total_difficulty(BlockId::Hash(block_hash.clone())).expect("Mallformed block without a difficulty on the chain!");
|
||||||
|
|
||||||
hash_rlp.append(&block_hash);
|
hash_rlp.append(&block_hash);
|
||||||
hash_rlp.append(&difficulty);
|
hash_rlp.append(&difficulty);
|
||||||
rlp_stream.append_raw(&hash_rlp.out(), 1);
|
rlp_stream.append_raw(&hash_rlp.out(), 1);
|
||||||
|
@ -16,8 +16,11 @@
|
|||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![feature(plugin)]
|
#![feature(plugin)]
|
||||||
#![plugin(clippy)]
|
|
||||||
#![feature(augmented_assignments)]
|
#![feature(augmented_assignments)]
|
||||||
|
#![plugin(clippy)]
|
||||||
|
// Keeps consistency (all lines with `.clone()`) and helpful when changing ref to non-ref.
|
||||||
|
#![allow(clone_on_copy)]
|
||||||
|
|
||||||
//! Blockchain sync module
|
//! Blockchain sync module
|
||||||
//! Implements ethereum protocol version 63 as specified here:
|
//! Implements ethereum protocol version 63 as specified here:
|
||||||
//! https://github.com/ethereum/wiki/wiki/Ethereum-Wire-Protocol
|
//! https://github.com/ethereum/wiki/wiki/Ethereum-Wire-Protocol
|
||||||
|
@ -168,9 +168,9 @@ impl<K, V> RangeCollection<K, V> for Vec<(K, Vec<V>)> where K: Ord + PartialEq +
|
|||||||
fn insert_item(&mut self, key: K, value: V) {
|
fn insert_item(&mut self, key: K, value: V) {
|
||||||
assert!(!self.have_item(&key));
|
assert!(!self.have_item(&key));
|
||||||
|
|
||||||
|
// todo: fix warning
|
||||||
let lower = match self.binary_search_by(|&(k, _)| k.cmp(&key).reverse()) {
|
let lower = match self.binary_search_by(|&(k, _)| k.cmp(&key).reverse()) {
|
||||||
Ok(index) => index,
|
Ok(index) | Err(index) => index
|
||||||
Err(index) => index,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut to_remove: Option<usize> = None;
|
let mut to_remove: Option<usize> = None;
|
||||||
|
@ -160,3 +160,14 @@ fn propagade_blocks() {
|
|||||||
// NEW_BLOCK_PACKET
|
// NEW_BLOCK_PACKET
|
||||||
assert_eq!(0x07, net.peer(0).queue[0].packet_id);
|
assert_eq!(0x07, net.peer(0).queue[0].packet_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn restart_on_malformed_block() {
|
||||||
|
let mut net = TestNet::new(2);
|
||||||
|
net.peer_mut(1).chain.add_blocks(10, false);
|
||||||
|
net.peer_mut(1).chain.corrupt_block(6);
|
||||||
|
net.sync_steps(10);
|
||||||
|
|
||||||
|
assert_eq!(net.peer(0).chain.chain_info().best_block_number, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -71,6 +71,17 @@ impl TestBlockChainClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn corrupt_block(&mut self, n: BlockNumber) {
|
||||||
|
let hash = self.block_hash(BlockId::Number(n)).unwrap();
|
||||||
|
let mut header: BlockHeader = decode(&self.block_header(BlockId::Number(n)).unwrap());
|
||||||
|
header.parent_hash = H256::new();
|
||||||
|
let mut rlp = RlpStream::new_list(3);
|
||||||
|
rlp.append(&header);
|
||||||
|
rlp.append_raw(&rlp::NULL_RLP, 1);
|
||||||
|
rlp.append_raw(&rlp::NULL_RLP, 1);
|
||||||
|
self.blocks.write().unwrap().insert(hash, rlp.out());
|
||||||
|
}
|
||||||
|
|
||||||
pub fn block_hash_delta_minus(&mut self, delta: usize) -> H256 {
|
pub fn block_hash_delta_minus(&mut self, delta: usize) -> H256 {
|
||||||
let blocks_read = self.numbers.read().unwrap();
|
let blocks_read = self.numbers.read().unwrap();
|
||||||
let index = blocks_read.len() - delta;
|
let index = blocks_read.len() - delta;
|
||||||
|
@ -26,7 +26,7 @@ crossbeam = "0.2"
|
|||||||
slab = { git = "https://github.com/arkpar/slab.git" }
|
slab = { git = "https://github.com/arkpar/slab.git" }
|
||||||
sha3 = { path = "sha3" }
|
sha3 = { path = "sha3" }
|
||||||
serde = "0.6.7"
|
serde = "0.6.7"
|
||||||
clippy = "0.0.37"
|
clippy = "0.0.41"
|
||||||
json-tests = { path = "json-tests" }
|
json-tests = { path = "json-tests" }
|
||||||
target_info = "0.1.0"
|
target_info = "0.1.0"
|
||||||
igd = "0.4.2"
|
igd = "0.4.2"
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
|
||||||
extern crate test;
|
extern crate test;
|
||||||
extern crate rand;
|
|
||||||
extern crate ethcore_util;
|
extern crate ethcore_util;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
@ -170,8 +170,8 @@ pub trait BytesConvertable {
|
|||||||
fn to_bytes(&self) -> Bytes { self.as_slice().to_vec() }
|
fn to_bytes(&self) -> Bytes { self.as_slice().to_vec() }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> BytesConvertable for T where T: Deref<Target = [u8]> {
|
impl<T> BytesConvertable for T where T: AsRef<[u8]> {
|
||||||
fn bytes(&self) -> &[u8] { self.deref() }
|
fn bytes(&self) -> &[u8] { self.as_ref() }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -74,7 +74,6 @@ impl From<::secp256k1::Error> for CryptoError {
|
|||||||
match e {
|
match e {
|
||||||
::secp256k1::Error::InvalidMessage => CryptoError::InvalidMessage,
|
::secp256k1::Error::InvalidMessage => CryptoError::InvalidMessage,
|
||||||
::secp256k1::Error::InvalidPublicKey => CryptoError::InvalidPublic,
|
::secp256k1::Error::InvalidPublicKey => CryptoError::InvalidPublic,
|
||||||
::secp256k1::Error::InvalidSignature => CryptoError::InvalidSignature,
|
|
||||||
::secp256k1::Error::InvalidSecretKey => CryptoError::InvalidSecret,
|
::secp256k1::Error::InvalidSecretKey => CryptoError::InvalidSecret,
|
||||||
_ => CryptoError::InvalidSignature,
|
_ => CryptoError::InvalidSignature,
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,13 @@ macro_rules! impl_hash {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AsRef<[u8]> for $from {
|
||||||
|
#[inline]
|
||||||
|
fn as_ref(&self) -> &[u8] {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl DerefMut for $from {
|
impl DerefMut for $from {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn deref_mut(&mut self) -> &mut [u8] {
|
fn deref_mut(&mut self) -> &mut [u8] {
|
||||||
@ -290,7 +297,7 @@ macro_rules! impl_hash {
|
|||||||
try!(write!(f, "{:02x}", i));
|
try!(write!(f, "{:02x}", i));
|
||||||
}
|
}
|
||||||
try!(write!(f, "…"));
|
try!(write!(f, "…"));
|
||||||
for i in &self.0[$size - 4..$size] {
|
for i in &self.0[$size - 2..$size] {
|
||||||
try!(write!(f, "{:02x}", i));
|
try!(write!(f, "{:02x}", i));
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -641,7 +648,7 @@ mod tests {
|
|||||||
fn hash() {
|
fn hash() {
|
||||||
let h = H64([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
|
let h = H64([0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
|
||||||
assert_eq!(H64::from_str("0123456789abcdef").unwrap(), h);
|
assert_eq!(H64::from_str("0123456789abcdef").unwrap(), h);
|
||||||
assert_eq!(format!("{}", h), "0123…89abcdef");
|
assert_eq!(format!("{}", h), "0123…cdef");
|
||||||
assert_eq!(format!("{:?}", h), "0123456789abcdef");
|
assert_eq!(format!("{:?}", h), "0123456789abcdef");
|
||||||
assert_eq!(h.hex(), "0123456789abcdef");
|
assert_eq!(h.hex(), "0123456789abcdef");
|
||||||
assert!(h == h);
|
assert!(h == h);
|
||||||
|
@ -256,6 +256,11 @@ impl<Message> Handler for IoManager<Message> where Message: Send + Clone + Sync
|
|||||||
IoMessage::DeregisterStream { handler_id, token } => {
|
IoMessage::DeregisterStream { handler_id, token } => {
|
||||||
let handler = self.handlers.get(handler_id).expect("Unknown handler id").clone();
|
let handler = self.handlers.get(handler_id).expect("Unknown handler id").clone();
|
||||||
handler.deregister_stream(token, event_loop);
|
handler.deregister_stream(token, event_loop);
|
||||||
|
// unregister a timer associated with the token (if any)
|
||||||
|
let timer_id = token + handler_id * TOKENS_PER_HANDLER;
|
||||||
|
if let Some(timer) = self.timers.write().unwrap().remove(&timer_id) {
|
||||||
|
event_loop.clear_timeout(timer.timeout);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
IoMessage::UpdateStreamRegistration { handler_id, token } => {
|
IoMessage::UpdateStreamRegistration { handler_id, token } => {
|
||||||
let handler = self.handlers.get(handler_id).expect("Unknown handler id").clone();
|
let handler = self.handlers.get(handler_id).expect("Unknown handler id").clone();
|
||||||
|
@ -20,9 +20,17 @@
|
|||||||
#![feature(associated_consts)]
|
#![feature(associated_consts)]
|
||||||
#![feature(plugin)]
|
#![feature(plugin)]
|
||||||
#![feature(ip)]
|
#![feature(ip)]
|
||||||
#![plugin(clippy)]
|
|
||||||
#![allow(needless_range_loop, match_bool)]
|
|
||||||
#![feature(catch_panic)]
|
#![feature(catch_panic)]
|
||||||
|
// Clippy settings
|
||||||
|
#![plugin(clippy)]
|
||||||
|
// TODO [todr] not really sure
|
||||||
|
#![allow(needless_range_loop)]
|
||||||
|
// Shorter than if-else
|
||||||
|
#![allow(match_bool)]
|
||||||
|
// We use that to be more explicit about handled cases
|
||||||
|
#![allow(match_same_arms)]
|
||||||
|
// Keeps consistency (all lines with `.clone()`) and helpful when changing ref to non-ref.
|
||||||
|
#![allow(clone_on_copy)]
|
||||||
|
|
||||||
//! Ethcore-util library
|
//! Ethcore-util library
|
||||||
//!
|
//!
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
use std::net::SocketAddr;
|
||||||
use mio::{Handler, Token, EventSet, EventLoop, PollOpt, TryRead, TryWrite};
|
use mio::{Handler, Token, EventSet, EventLoop, PollOpt, TryRead, TryWrite};
|
||||||
use mio::tcp::*;
|
use mio::tcp::*;
|
||||||
use hash::*;
|
use hash::*;
|
||||||
@ -169,6 +170,11 @@ impl Connection {
|
|||||||
self.token = token;
|
self.token = token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get remote peer address
|
||||||
|
pub fn remote_addr(&self) -> io::Result<SocketAddr> {
|
||||||
|
self.socket.peer_addr()
|
||||||
|
}
|
||||||
|
|
||||||
/// Register this connection with the IO event loop.
|
/// Register this connection with the IO event loop.
|
||||||
pub fn register_socket<Host: Handler>(&self, reg: Token, event_loop: &mut EventLoop<Host>) -> io::Result<()> {
|
pub fn register_socket<Host: Handler>(&self, reg: Token, event_loop: &mut EventLoop<Host>) -> io::Result<()> {
|
||||||
trace!(target: "net", "connection register; token={:?}", reg);
|
trace!(target: "net", "connection register; token={:?}", reg);
|
||||||
@ -253,6 +259,11 @@ impl EncryptedConnection {
|
|||||||
self.connection.set_token(token);
|
self.connection.set_token(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get remote peer address
|
||||||
|
pub fn remote_addr(&self) -> io::Result<SocketAddr> {
|
||||||
|
self.connection.remote_addr()
|
||||||
|
}
|
||||||
|
|
||||||
/// Create an encrypted connection out of the handshake. Consumes a handshake object.
|
/// Create an encrypted connection out of the handshake. Consumes a handshake object.
|
||||||
pub fn new(mut handshake: Handshake) -> Result<EncryptedConnection, UtilError> {
|
pub fn new(mut handshake: Handshake) -> Result<EncryptedConnection, UtilError> {
|
||||||
let shared = try!(crypto::ecdh::agree(handshake.ecdhe.secret(), &handshake.remote_public));
|
let shared = try!(crypto::ecdh::agree(handshake.ecdhe.secret(), &handshake.remote_public));
|
||||||
|
@ -110,12 +110,20 @@ impl Discovery {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Add a new node to discovery table. Pings the node.
|
||||||
pub fn add_node(&mut self, e: NodeEntry) {
|
pub fn add_node(&mut self, e: NodeEntry) {
|
||||||
let endpoint = e.endpoint.clone();
|
let endpoint = e.endpoint.clone();
|
||||||
self.update_node(e);
|
self.update_node(e);
|
||||||
self.ping(&endpoint);
|
self.ping(&endpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Add a list of known nodes to the table.
|
||||||
|
pub fn init_node_list(&mut self, mut nodes: Vec<NodeEntry>) {
|
||||||
|
for n in nodes.drain(..) {
|
||||||
|
self.update_node(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn update_node(&mut self, e: NodeEntry) {
|
fn update_node(&mut self, e: NodeEntry) {
|
||||||
trace!(target: "discovery", "Inserting {:?}", &e);
|
trace!(target: "discovery", "Inserting {:?}", &e);
|
||||||
let ping = {
|
let ping = {
|
||||||
@ -209,7 +217,7 @@ impl Discovery {
|
|||||||
rlp.append(×tamp);
|
rlp.append(×tamp);
|
||||||
|
|
||||||
let bytes = rlp.drain();
|
let bytes = rlp.drain();
|
||||||
let hash = bytes.sha3();
|
let hash = bytes.as_ref().sha3();
|
||||||
let signature = match ec::sign(&self.secret, &hash) {
|
let signature = match ec::sign(&self.secret, &hash) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
@ -254,7 +262,7 @@ impl Discovery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut ret:Vec<NodeEntry> = Vec::new();
|
let mut ret:Vec<NodeEntry> = Vec::new();
|
||||||
for (_, nodes) in found {
|
for nodes in found.values() {
|
||||||
ret.extend(nodes.iter().map(|&n| n.clone()));
|
ret.extend(nodes.iter().map(|&n| n.clone()));
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
@ -368,7 +376,7 @@ impl Discovery {
|
|||||||
// TODO: validate pong packet
|
// TODO: validate pong packet
|
||||||
let dest = try!(NodeEndpoint::from_rlp(&try!(rlp.at(0))));
|
let dest = try!(NodeEndpoint::from_rlp(&try!(rlp.at(0))));
|
||||||
let timestamp: u64 = try!(rlp.val_at(2));
|
let timestamp: u64 = try!(rlp.val_at(2));
|
||||||
if timestamp > time::get_time().sec as u64 {
|
if timestamp < time::get_time().sec as u64 {
|
||||||
return Err(NetworkError::Expired);
|
return Err(NetworkError::Expired);
|
||||||
}
|
}
|
||||||
let mut entry = NodeEntry { id: node.clone(), endpoint: dest };
|
let mut entry = NodeEntry { id: node.clone(), endpoint: dest };
|
||||||
@ -386,7 +394,7 @@ impl Discovery {
|
|||||||
trace!(target: "discovery", "Got FindNode from {:?}", &from);
|
trace!(target: "discovery", "Got FindNode from {:?}", &from);
|
||||||
let target: NodeId = try!(rlp.val_at(0));
|
let target: NodeId = try!(rlp.val_at(0));
|
||||||
let timestamp: u64 = try!(rlp.val_at(1));
|
let timestamp: u64 = try!(rlp.val_at(1));
|
||||||
if timestamp > time::get_time().sec as u64 {
|
if timestamp < time::get_time().sec as u64 {
|
||||||
return Err(NetworkError::Expired);
|
return Err(NetworkError::Expired);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,8 +403,8 @@ impl Discovery {
|
|||||||
if nearest.is_empty() {
|
if nearest.is_empty() {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
let mut rlp = RlpStream::new_list(cmp::min(limit, nearest.len()));
|
let mut rlp = RlpStream::new_list(1);
|
||||||
rlp.begin_list(1);
|
rlp.begin_list(cmp::min(limit, nearest.len()));
|
||||||
for n in 0 .. nearest.len() {
|
for n in 0 .. nearest.len() {
|
||||||
rlp.begin_list(4);
|
rlp.begin_list(4);
|
||||||
nearest[n].endpoint.to_rlp(&mut rlp);
|
nearest[n].endpoint.to_rlp(&mut rlp);
|
||||||
@ -404,8 +412,8 @@ impl Discovery {
|
|||||||
if (n + 1) % limit == 0 || n == nearest.len() - 1 {
|
if (n + 1) % limit == 0 || n == nearest.len() - 1 {
|
||||||
self.send_packet(PACKET_NEIGHBOURS, &from, &rlp.drain());
|
self.send_packet(PACKET_NEIGHBOURS, &from, &rlp.drain());
|
||||||
trace!(target: "discovery", "Sent {} Neighbours to {:?}", n, &from);
|
trace!(target: "discovery", "Sent {} Neighbours to {:?}", n, &from);
|
||||||
rlp = RlpStream::new_list(cmp::min(limit, nearest.len() - n));
|
rlp = RlpStream::new_list(1);
|
||||||
rlp.begin_list(1);
|
rlp.begin_list(cmp::min(limit, nearest.len() - n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(None)
|
Ok(None)
|
||||||
@ -422,6 +430,9 @@ impl Discovery {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let node_id: NodeId = try!(r.val_at(3));
|
let node_id: NodeId = try!(r.val_at(3));
|
||||||
|
if node_id == self.id {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let entry = NodeEntry { id: node_id.clone(), endpoint: endpoint };
|
let entry = NodeEntry { id: node_id.clone(), endpoint: endpoint };
|
||||||
added.insert(node_id, entry.clone());
|
added.insert(node_id, entry.clone());
|
||||||
self.ping(&entry.endpoint);
|
self.ping(&entry.endpoint);
|
||||||
@ -476,3 +487,48 @@ impl Discovery {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use hash::*;
|
||||||
|
use std::net::*;
|
||||||
|
use network::node_table::*;
|
||||||
|
use crypto::KeyPair;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn discovery() {
|
||||||
|
let key1 = KeyPair::create().unwrap();
|
||||||
|
let key2 = KeyPair::create().unwrap();
|
||||||
|
let ep1 = NodeEndpoint { address: SocketAddr::from_str("127.0.0.1:40444").unwrap(), udp_port: 40444 };
|
||||||
|
let ep2 = NodeEndpoint { address: SocketAddr::from_str("127.0.0.1:40445").unwrap(), udp_port: 40445 };
|
||||||
|
let mut discovery1 = Discovery::new(&key1, ep1.clone(), 0);
|
||||||
|
let mut discovery2 = Discovery::new(&key2, ep2.clone(), 0);
|
||||||
|
|
||||||
|
let node1 = Node::from_str("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@127.0.0.1:7770").unwrap();
|
||||||
|
let node2 = Node::from_str("enode://b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@127.0.0.1:7771").unwrap();
|
||||||
|
discovery1.add_node(NodeEntry { id: node1.id.clone(), endpoint: node1. endpoint.clone() });
|
||||||
|
discovery1.add_node(NodeEntry { id: node2.id.clone(), endpoint: node2. endpoint.clone() });
|
||||||
|
|
||||||
|
discovery2.add_node(NodeEntry { id: key1.public().clone(), endpoint: ep1.clone() });
|
||||||
|
discovery2.refresh();
|
||||||
|
|
||||||
|
for _ in 0 .. 10 {
|
||||||
|
while !discovery1.send_queue.is_empty() {
|
||||||
|
let datagramm = discovery1.send_queue.pop_front().unwrap();
|
||||||
|
if datagramm.address == ep2.address {
|
||||||
|
discovery2.on_packet(&datagramm.payload, ep1.address.clone()).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while !discovery2.send_queue.is_empty() {
|
||||||
|
let datagramm = discovery2.send_queue.pop_front().unwrap();
|
||||||
|
if datagramm.address == ep1.address {
|
||||||
|
discovery1.on_packet(&datagramm.payload, ep2.address.clone()).ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
discovery2.round();
|
||||||
|
}
|
||||||
|
assert_eq!(Discovery::nearest_node_entries(&NodeId::new(), &discovery2.node_buckets).len(), 3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -21,6 +21,9 @@ use std::str::{FromStr};
|
|||||||
use std::sync::*;
|
use std::sync::*;
|
||||||
use std::ops::*;
|
use std::ops::*;
|
||||||
use std::cmp::min;
|
use std::cmp::min;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::io::{Read, Write};
|
||||||
|
use std::fs;
|
||||||
use mio::*;
|
use mio::*;
|
||||||
use mio::tcp::*;
|
use mio::tcp::*;
|
||||||
use target_info::Target;
|
use target_info::Target;
|
||||||
@ -340,7 +343,19 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
let addr = config.listen_address;
|
let addr = config.listen_address;
|
||||||
// Setup the server socket
|
// Setup the server socket
|
||||||
let tcp_listener = TcpListener::bind(&addr).unwrap();
|
let tcp_listener = TcpListener::bind(&addr).unwrap();
|
||||||
let keys = if let Some(ref secret) = config.use_secret { KeyPair::from_secret(secret.clone()).unwrap() } else { KeyPair::create().unwrap() };
|
let keys = if let Some(ref secret) = config.use_secret {
|
||||||
|
KeyPair::from_secret(secret.clone()).unwrap()
|
||||||
|
} else {
|
||||||
|
config.config_path.clone().and_then(|ref p| load_key(&Path::new(&p)))
|
||||||
|
.map_or_else(|| {
|
||||||
|
let key = KeyPair::create().unwrap();
|
||||||
|
if let Some(path) = config.config_path.clone() {
|
||||||
|
save_key(&Path::new(&path), &key.secret());
|
||||||
|
}
|
||||||
|
key
|
||||||
|
},
|
||||||
|
|s| KeyPair::from_secret(s).expect("Error creating node secret key"))
|
||||||
|
};
|
||||||
let endpoint = NodeEndpoint { address: addr.clone(), udp_port: addr.port() };
|
let endpoint = NodeEndpoint { address: addr.clone(), udp_port: addr.port() };
|
||||||
let discovery = Discovery::new(&keys, endpoint, DISCOVERY);
|
let discovery = Discovery::new(&keys, endpoint, DISCOVERY);
|
||||||
let path = config.config_path.clone();
|
let path = config.config_path.clone();
|
||||||
@ -371,6 +386,7 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
for n in boot_nodes {
|
for n in boot_nodes {
|
||||||
host.add_node(&n);
|
host.add_node(&n);
|
||||||
}
|
}
|
||||||
|
host.discovery.lock().unwrap().init_node_list(host.nodes.read().unwrap().unordered_entries());
|
||||||
host
|
host
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -648,6 +664,7 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let h = Arc::try_unwrap(h).ok().unwrap().into_inner().unwrap();
|
let h = Arc::try_unwrap(h).ok().unwrap().into_inner().unwrap();
|
||||||
|
let originated = h.originated;
|
||||||
let mut session = match Session::new(h, &self.info.read().unwrap()) {
|
let mut session = match Session::new(h, &self.info.read().unwrap()) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
@ -659,6 +676,14 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
|
|||||||
session.set_token(session_token);
|
session.set_token(session_token);
|
||||||
io.update_registration(session_token).expect("Error updating session registration");
|
io.update_registration(session_token).expect("Error updating session registration");
|
||||||
self.stats.inc_sessions();
|
self.stats.inc_sessions();
|
||||||
|
if !originated {
|
||||||
|
// Add it no node table
|
||||||
|
if let Ok(address) = session.remote_addr() {
|
||||||
|
let entry = NodeEntry { id: session.id().clone(), endpoint: NodeEndpoint { address: address, udp_port: address.port() } };
|
||||||
|
self.nodes.write().unwrap().add_node(Node::new(entry.id.clone(), entry.endpoint.clone()));
|
||||||
|
self.discovery.lock().unwrap().add_node(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
Arc::new(Mutex::new(session))
|
Arc::new(Mutex::new(session))
|
||||||
});
|
});
|
||||||
if result.is_none() {
|
if result.is_none() {
|
||||||
@ -914,3 +939,49 @@ impl<Message> IoHandler<NetworkIoMessage<Message>> for Host<Message> where Messa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn save_key(path: &Path, key: &Secret) {
|
||||||
|
let mut path_buf = PathBuf::from(path);
|
||||||
|
if let Err(e) = fs::create_dir_all(path_buf.as_path()) {
|
||||||
|
warn!("Error creating key directory: {:?}", e);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
path_buf.push("key");
|
||||||
|
let mut file = match fs::File::create(path_buf.as_path()) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error creating key file: {:?}", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Err(e) = file.write(&key.hex().into_bytes()) {
|
||||||
|
warn!("Error writing key file: {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_key(path: &Path) -> Option<Secret> {
|
||||||
|
let mut path_buf = PathBuf::from(path);
|
||||||
|
path_buf.push("key");
|
||||||
|
let mut file = match fs::File::open(path_buf.as_path()) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(e) => {
|
||||||
|
debug!("Error opening key file: {:?}", e);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let mut buf = String::new();
|
||||||
|
match file.read_to_string(&mut buf) {
|
||||||
|
Ok(_) => {},
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error reading key file: {:?}", e);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match Secret::from_str(&buf) {
|
||||||
|
Ok(key) => Some(key),
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error parsing key file: {:?}", e);
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
//! }
|
//! }
|
||||||
//!
|
//!
|
||||||
//! fn main () {
|
//! fn main () {
|
||||||
//! let mut service = NetworkService::<MyMessage>::start(NetworkConfiguration::new()).expect("Error creating network service");
|
//! let mut service = NetworkService::<MyMessage>::start(NetworkConfiguration::new_with_port(40412)).expect("Error creating network service");
|
||||||
//! service.register_protocol(Arc::new(MyHandler), "myproto", &[1u8]);
|
//! service.register_protocol(Arc::new(MyHandler), "myproto", &[1u8]);
|
||||||
//!
|
//!
|
||||||
//! // Wait for quit condition
|
//! // Wait for quit condition
|
||||||
|
@ -20,11 +20,17 @@ use std::net::{SocketAddr, ToSocketAddrs, SocketAddrV4, SocketAddrV6, Ipv4Addr,
|
|||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::str::{FromStr};
|
use std::str::{FromStr};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::fmt::{Display, Formatter};
|
||||||
|
use std::path::{PathBuf};
|
||||||
|
use std::fmt;
|
||||||
|
use std::fs;
|
||||||
|
use std::io::{Read, Write};
|
||||||
use hash::*;
|
use hash::*;
|
||||||
use rlp::*;
|
use rlp::*;
|
||||||
use time::Tm;
|
use time::Tm;
|
||||||
use error::*;
|
use error::*;
|
||||||
use network::discovery::TableUpdates;
|
use network::discovery::{TableUpdates, NodeEntry};
|
||||||
|
pub use rustc_serialize::json::Json;
|
||||||
|
|
||||||
/// Node public key
|
/// Node public key
|
||||||
pub type NodeId = H512;
|
pub type NodeId = H512;
|
||||||
@ -135,6 +141,17 @@ impl Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Display for Node {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||||
|
if self.endpoint.udp_port != self.endpoint.address.port() {
|
||||||
|
try!(write!(f, "enode://{}@{}+{}", self.id.hex(), self.endpoint.address, self.endpoint.udp_port));
|
||||||
|
} else {
|
||||||
|
try!(write!(f, "enode://{}@{}", self.id.hex(), self.endpoint.address));
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl FromStr for Node {
|
impl FromStr for Node {
|
||||||
type Err = UtilError;
|
type Err = UtilError;
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
@ -170,18 +187,23 @@ impl Hash for Node {
|
|||||||
|
|
||||||
/// Node table backed by disk file.
|
/// Node table backed by disk file.
|
||||||
pub struct NodeTable {
|
pub struct NodeTable {
|
||||||
nodes: HashMap<NodeId, Node>
|
nodes: HashMap<NodeId, Node>,
|
||||||
|
path: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NodeTable {
|
impl NodeTable {
|
||||||
pub fn new(_path: Option<String>) -> NodeTable {
|
pub fn new(path: Option<String>) -> NodeTable {
|
||||||
NodeTable {
|
NodeTable {
|
||||||
nodes: HashMap::new()
|
path: path.clone(),
|
||||||
|
nodes: NodeTable::load(path),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a node to table
|
/// Add a node to table
|
||||||
pub fn add_node(&mut self, node: Node) {
|
pub fn add_node(&mut self, mut node: Node) {
|
||||||
|
// preserve failure counter
|
||||||
|
let failures = self.nodes.get(&node.id).map_or(0, |n| n.failures);
|
||||||
|
node.failures = failures;
|
||||||
self.nodes.insert(node.id.clone(), node);
|
self.nodes.insert(node.id.clone(), node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,6 +214,12 @@ impl NodeTable {
|
|||||||
refs.iter().map(|n| n.id.clone()).collect()
|
refs.iter().map(|n| n.id.clone()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unordered list of all entries
|
||||||
|
pub fn unordered_entries(&self) -> Vec<NodeEntry> {
|
||||||
|
// preserve failure counter
|
||||||
|
self.nodes.values().map(|n| NodeEntry { endpoint: n.endpoint.clone(), id: n.id.clone() }).collect()
|
||||||
|
}
|
||||||
|
|
||||||
/// Get particular node
|
/// Get particular node
|
||||||
pub fn get_mut(&mut self, id: &NodeId) -> Option<&mut Node> {
|
pub fn get_mut(&mut self, id: &NodeId) -> Option<&mut Node> {
|
||||||
self.nodes.get_mut(id)
|
self.nodes.get_mut(id)
|
||||||
@ -208,11 +236,92 @@ impl NodeTable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Increase failure counte for a node
|
||||||
pub fn note_failure(&mut self, id: &NodeId) {
|
pub fn note_failure(&mut self, id: &NodeId) {
|
||||||
if let Some(node) = self.nodes.get_mut(id) {
|
if let Some(node) = self.nodes.get_mut(id) {
|
||||||
node.failures += 1;
|
node.failures += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn save(&self) {
|
||||||
|
if let Some(ref path) = self.path {
|
||||||
|
let mut path_buf = PathBuf::from(path);
|
||||||
|
if let Err(e) = fs::create_dir_all(path_buf.as_path()) {
|
||||||
|
warn!("Error creating node table directory: {:?}", e);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
path_buf.push("nodes.json");
|
||||||
|
let mut json = String::new();
|
||||||
|
json.push_str("{\n");
|
||||||
|
json.push_str("\"nodes\": [\n");
|
||||||
|
let node_ids = self.nodes();
|
||||||
|
for i in 0 .. node_ids.len() {
|
||||||
|
let node = self.nodes.get(&node_ids[i]).unwrap();
|
||||||
|
json.push_str(&format!("\t{{ \"url\": \"{}\", \"failures\": {} }}{}\n", node, node.failures, if i == node_ids.len() - 1 {""} else {","}))
|
||||||
|
}
|
||||||
|
json.push_str("]\n");
|
||||||
|
json.push_str("}");
|
||||||
|
let mut file = match fs::File::create(path_buf.as_path()) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error creating node table file: {:?}", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Err(e) = file.write(&json.into_bytes()) {
|
||||||
|
warn!("Error writing node table file: {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load(path: Option<String>) -> HashMap<NodeId, Node> {
|
||||||
|
let mut nodes: HashMap<NodeId, Node> = HashMap::new();
|
||||||
|
if let Some(path) = path {
|
||||||
|
let mut path_buf = PathBuf::from(path);
|
||||||
|
path_buf.push("nodes.json");
|
||||||
|
let mut file = match fs::File::open(path_buf.as_path()) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(e) => {
|
||||||
|
debug!("Error opening node table file: {:?}", e);
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let mut buf = String::new();
|
||||||
|
match file.read_to_string(&mut buf) {
|
||||||
|
Ok(_) => {},
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error reading node table file: {:?}", e);
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let json = match Json::from_str(&buf) {
|
||||||
|
Ok(json) => json,
|
||||||
|
Err(e) => {
|
||||||
|
warn!("Error parsing node table file: {:?}", e);
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(list) = json.as_object().and_then(|o| o.get("nodes")).and_then(|n| n.as_array()) {
|
||||||
|
for n in list.iter().filter_map(|n| n.as_object()) {
|
||||||
|
if let Some(url) = n.get("url").and_then(|u| u.as_string()) {
|
||||||
|
if let Ok(mut node) = Node::from_str(url) {
|
||||||
|
if let Some(failures) = n.get("failures").and_then(|f| f.as_u64()) {
|
||||||
|
node.failures = failures as u32;
|
||||||
|
}
|
||||||
|
nodes.insert(node.id.clone(), node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for NodeTable {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
self.save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -247,4 +356,84 @@ mod tests {
|
|||||||
H512::from_str("a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap(),
|
H512::from_str("a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap(),
|
||||||
node.id);
|
node.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn table_failure_order() {
|
||||||
|
let node1 = Node::from_str("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770").unwrap();
|
||||||
|
let node2 = Node::from_str("enode://b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770").unwrap();
|
||||||
|
let node3 = Node::from_str("enode://c979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770").unwrap();
|
||||||
|
let id1 = H512::from_str("a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap();
|
||||||
|
let id2 = H512::from_str("b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap();
|
||||||
|
let id3 = H512::from_str("c979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap();
|
||||||
|
let mut table = NodeTable::new(None);
|
||||||
|
table.add_node(node3);
|
||||||
|
table.add_node(node1);
|
||||||
|
table.add_node(node2);
|
||||||
|
|
||||||
|
table.note_failure(&id1);
|
||||||
|
table.note_failure(&id1);
|
||||||
|
table.note_failure(&id2);
|
||||||
|
|
||||||
|
let r = table.nodes();
|
||||||
|
assert_eq!(r[0][..], id3[..]);
|
||||||
|
assert_eq!(r[1][..], id2[..]);
|
||||||
|
assert_eq!(r[2][..], id1[..]);
|
||||||
|
}
|
||||||
|
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::env;
|
||||||
|
use std::fs::{remove_dir_all};
|
||||||
|
// TODO: use common impl
|
||||||
|
pub struct RandomTempPath {
|
||||||
|
path: PathBuf
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RandomTempPath {
|
||||||
|
pub fn new() -> RandomTempPath {
|
||||||
|
let mut dir = env::temp_dir();
|
||||||
|
dir.push(H32::random().hex());
|
||||||
|
RandomTempPath {
|
||||||
|
path: dir.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_path(&self) -> &PathBuf {
|
||||||
|
&self.path
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_str(&self) -> &str {
|
||||||
|
self.path.to_str().unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for RandomTempPath {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if let Err(e) = remove_dir_all(self.as_path()) {
|
||||||
|
panic!("failed to remove temp directory, probably something failed to destroyed ({})", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn table_save_load() {
|
||||||
|
let temp_path = RandomTempPath::new();
|
||||||
|
let node1 = Node::from_str("enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770").unwrap();
|
||||||
|
let node2 = Node::from_str("enode://b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@22.99.55.44:7770").unwrap();
|
||||||
|
let id1 = H512::from_str("a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap();
|
||||||
|
let id2 = H512::from_str("b979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c").unwrap();
|
||||||
|
{
|
||||||
|
let mut table = NodeTable::new(Some(temp_path.as_str().to_owned()));
|
||||||
|
table.add_node(node1);
|
||||||
|
table.add_node(node2);
|
||||||
|
table.note_failure(&id2);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
let table = NodeTable::new(Some(temp_path.as_str().to_owned()));
|
||||||
|
let r = table.nodes();
|
||||||
|
assert_eq!(r[0][..], id1[..]);
|
||||||
|
assert_eq!(r[1][..], id2[..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
// 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 std::net::SocketAddr;
|
||||||
|
use std::io;
|
||||||
use mio::*;
|
use mio::*;
|
||||||
use hash::*;
|
use hash::*;
|
||||||
use rlp::*;
|
use rlp::*;
|
||||||
@ -144,6 +146,11 @@ impl Session {
|
|||||||
self.connection.set_token(token);
|
self.connection.set_token(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get remote peer address
|
||||||
|
pub fn remote_addr(&self) -> io::Result<SocketAddr> {
|
||||||
|
self.connection.remote_addr()
|
||||||
|
}
|
||||||
|
|
||||||
/// Readable IO handler. Returns packet data if available.
|
/// Readable IO handler. Returns packet data if available.
|
||||||
pub fn readable<Message>(&mut self, io: &IoContext<Message>, host: &HostInfo) -> Result<SessionData, UtilError> where Message: Send + Sync + Clone {
|
pub fn readable<Message>(&mut self, io: &IoContext<Message>, host: &HostInfo) -> Result<SessionData, UtilError> where Message: Send + Sync + Clone {
|
||||||
match try!(self.connection.readable(io)) {
|
match try!(self.connection.readable(io)) {
|
||||||
@ -335,7 +342,7 @@ impl Session {
|
|||||||
let mut rlp = RlpStream::new();
|
let mut rlp = RlpStream::new();
|
||||||
rlp.append(&(PACKET_DISCONNECT as u32));
|
rlp.append(&(PACKET_DISCONNECT as u32));
|
||||||
rlp.begin_list(1);
|
rlp.begin_list(1);
|
||||||
rlp.append(&(reason.clone() as u32));
|
rlp.append(&(reason as u32));
|
||||||
self.connection.send_packet(&rlp.out()).ok();
|
self.connection.send_packet(&rlp.out()).ok();
|
||||||
NetworkError::Disconnect(reason)
|
NetworkError::Disconnect(reason)
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ impl NetworkProtocolHandler<TestProtocolMessage> for TestProtocol {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn net_service() {
|
fn net_service() {
|
||||||
let mut service = NetworkService::<TestProtocolMessage>::start(NetworkConfiguration::new()).expect("Error creating network service");
|
let mut service = NetworkService::<TestProtocolMessage>::start(NetworkConfiguration::new_with_port(40414)).expect("Error creating network service");
|
||||||
service.register_protocol(Arc::new(TestProtocol::default()), "myproto", &[1u8]).unwrap();
|
service.register_protocol(Arc::new(TestProtocol::default()), "myproto", &[1u8]).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ impl<F> OnPanicListener for F
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn convert_to_string(t: &Box<Any + Send>) -> Option<String> {
|
fn convert_to_string(t: &Box<Any + Send>) -> Option<String> {
|
||||||
let as_str = t.downcast_ref::<&'static str>().map(|t| t.clone().to_owned());
|
let as_str = t.downcast_ref::<&'static str>().cloned().map(|t| t.to_owned());
|
||||||
let as_string = t.downcast_ref::<String>().cloned();
|
let as_string = t.downcast_ref::<String>().cloned();
|
||||||
|
|
||||||
as_str.or(as_string)
|
as_str.or(as_string)
|
||||||
|
@ -408,7 +408,7 @@ impl Decodable for Vec<u8> {
|
|||||||
fn decode<D>(decoder: &D) -> Result<Self, DecoderError> where D: Decoder {
|
fn decode<D>(decoder: &D) -> Result<Self, DecoderError> where D: Decoder {
|
||||||
decoder.read_value(| bytes | {
|
decoder.read_value(| bytes | {
|
||||||
let mut res = vec![];
|
let mut res = vec![];
|
||||||
res.extend(bytes);
|
res.extend_from_slice(bytes);
|
||||||
Ok(res)
|
Ok(res)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ impl<T> Hashable for T where T: BytesConvertable {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn sha3_empty() {
|
fn sha3_empty() {
|
||||||
assert_eq!([0u8; 0].sha3(), SHA3_EMPTY);
|
assert_eq!((&[0u8; 0]).sha3(), SHA3_EMPTY);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn sha3_as() {
|
fn sha3_as() {
|
||||||
|
@ -293,7 +293,7 @@ impl<'a> Iterator for TrieDBIterator<'a> {
|
|||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
let b = match self.trail.last_mut() {
|
let b = match self.trail.last_mut() {
|
||||||
Some(ref mut b) => { b.increment(); b.clone() },
|
Some(mut b) => { b.increment(); b.clone() },
|
||||||
None => return None
|
None => return None
|
||||||
};
|
};
|
||||||
match (b.status, b.node) {
|
match (b.status, b.node) {
|
||||||
@ -309,9 +309,8 @@ impl<'a> Iterator for TrieDBIterator<'a> {
|
|||||||
self.trail.pop();
|
self.trail.pop();
|
||||||
self.next()
|
self.next()
|
||||||
},
|
},
|
||||||
(Status::At, Node::Leaf(_, v)) => Some((self.key(), v)),
|
(Status::At, Node::Leaf(_, v)) | (Status::At, Node::Branch(_, Some(v))) => Some((self.key(), v)),
|
||||||
(Status::At, Node::Extension(_, d)) => self.descend_next(d),
|
(Status::At, Node::Extension(_, d)) => self.descend_next(d),
|
||||||
(Status::At, Node::Branch(_, Some(v))) => Some((self.key(), v)),
|
|
||||||
(Status::At, Node::Branch(_, _)) => self.next(),
|
(Status::At, Node::Branch(_, _)) => self.next(),
|
||||||
(Status::AtChild(i), Node::Branch(children, _)) if children[i].len() > 0 => {
|
(Status::AtChild(i), Node::Branch(children, _)) if children[i].len() > 0 => {
|
||||||
match i {
|
match i {
|
||||||
|
Loading…
Reference in New Issue
Block a user