Merge remote-tracking branch 'remotes/upstream/master' into transactions-permission-contract-fix
This commit is contained in:
commit
45116099c5
103
Cargo.lock
generated
103
Cargo.lock
generated
@ -244,28 +244,6 @@ dependencies = [
|
|||||||
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clippy"
|
|
||||||
version = "0.0.103"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"clippy_lints 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clippy_lints"
|
|
||||||
version = "0.0.103"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "coco"
|
name = "coco"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -480,7 +458,6 @@ dependencies = [
|
|||||||
"bloomchain 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bloomchain 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bn 0.4.4 (git+https://github.com/paritytech/bn)",
|
"bn 0.4.4 (git+https://github.com/paritytech/bn)",
|
||||||
"byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"common-types 0.1.0",
|
"common-types 0.1.0",
|
||||||
"crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethash 1.9.0",
|
"ethash 1.9.0",
|
||||||
@ -654,7 +631,6 @@ version = "1.9.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
@ -739,32 +715,14 @@ dependencies = [
|
|||||||
name = "ethcore-util"
|
name = "ethcore-util"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"eth-secp256k1 0.5.7 (git+https://github.com/paritytech/rust-secp256k1)",
|
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
"ethcore-logger 1.9.0",
|
|
||||||
"hashdb 0.1.1",
|
"hashdb 0.1.1",
|
||||||
"heapsize 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"journaldb 0.1.0",
|
|
||||||
"keccak-hash 0.1.0",
|
"keccak-hash 0.1.0",
|
||||||
"kvdb 0.1.0",
|
|
||||||
"kvdb-memorydb 0.1.0",
|
|
||||||
"libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memorydb 0.1.1",
|
"memorydb 0.1.1",
|
||||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"patricia-trie 0.1.0",
|
"patricia-trie 0.1.0",
|
||||||
"rlp 0.2.1",
|
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"triehash 0.1.0",
|
"triehash 0.1.0",
|
||||||
"util-error 0.1.0",
|
|
||||||
"vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -783,7 +741,6 @@ dependencies = [
|
|||||||
name = "ethjson"
|
name = "ethjson"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -865,7 +822,6 @@ dependencies = [
|
|||||||
name = "ethsync"
|
name = "ethsync"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore 1.9.0",
|
"ethcore 1.9.0",
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
@ -1755,11 +1711,6 @@ dependencies = [
|
|||||||
"odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
"odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nom"
|
|
||||||
version = "1.2.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ntp"
|
name = "ntp"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
@ -1928,7 +1879,6 @@ dependencies = [
|
|||||||
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)",
|
"ctrlc 1.1.1 (git+https://github.com/paritytech/rust-ctrlc.git)",
|
||||||
"daemonize 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"daemonize 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"docopt 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1971,6 +1921,7 @@ dependencies = [
|
|||||||
"parity-rpc 1.9.0",
|
"parity-rpc 1.9.0",
|
||||||
"parity-rpc-client 1.4.0",
|
"parity-rpc-client 1.4.0",
|
||||||
"parity-updater 1.9.0",
|
"parity-updater 1.9.0",
|
||||||
|
"parity-version 1.9.0",
|
||||||
"parity-whisper 0.1.0",
|
"parity-whisper 0.1.0",
|
||||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"path 0.1.0",
|
"path 0.1.0",
|
||||||
@ -1996,7 +1947,6 @@ name = "parity-dapps"
|
|||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base32 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"base32 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
"ethcore-bytes 0.1.0",
|
"ethcore-bytes 0.1.0",
|
||||||
@ -2017,6 +1967,7 @@ dependencies = [
|
|||||||
"parity-hash-fetch 1.9.0",
|
"parity-hash-fetch 1.9.0",
|
||||||
"parity-reactor 0.1.0",
|
"parity-reactor 0.1.0",
|
||||||
"parity-ui 1.9.0",
|
"parity-ui 1.9.0",
|
||||||
|
"parity-version 1.9.0",
|
||||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2032,7 +1983,6 @@ name = "parity-dapps-glue"
|
|||||||
version = "1.9.1"
|
version = "1.9.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mime_guess 2.0.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mime_guess 2.0.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2130,7 +2080,6 @@ version = "1.9.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"ethash 1.9.0",
|
"ethash 1.9.0",
|
||||||
"ethcore 1.9.0",
|
"ethcore 1.9.0",
|
||||||
"ethcore-bigint 0.2.1",
|
"ethcore-bigint 0.2.1",
|
||||||
@ -2166,6 +2115,7 @@ dependencies = [
|
|||||||
"order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-reactor 0.1.0",
|
"parity-reactor 0.1.0",
|
||||||
"parity-updater 1.9.0",
|
"parity-updater 1.9.0",
|
||||||
|
"parity-version 1.9.0",
|
||||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -2246,7 +2196,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "parity-ui-old-precompiled"
|
name = "parity-ui-old-precompiled"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
source = "git+https://github.com/js-dist-paritytech/parity-master-1-9-v1.git#95f866ff500abcf7cec527378f099cfc81e18093"
|
source = "git+https://github.com/js-dist-paritytech/parity-master-1-9-v1.git#d95164e94df10cb2bbcaa5dad36d6b61b760c3e1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"parity-dapps-glue 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-dapps-glue 1.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
@ -2273,12 +2223,24 @@ dependencies = [
|
|||||||
"log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"parity-hash-fetch 1.9.0",
|
"parity-hash-fetch 1.9.0",
|
||||||
"parity-reactor 0.1.0",
|
"parity-reactor 0.1.0",
|
||||||
|
"parity-version 1.9.0",
|
||||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"path 0.1.0",
|
"path 0.1.0",
|
||||||
"semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"target_info 0.1.0 (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 = "parity-version"
|
||||||
|
version = "1.9.0"
|
||||||
|
dependencies = [
|
||||||
|
"ethcore-bytes 0.1.0",
|
||||||
|
"rlp 0.2.1",
|
||||||
|
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"vergen 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parity-wasm"
|
name = "parity-wasm"
|
||||||
version = "0.15.3"
|
version = "0.15.3"
|
||||||
@ -2558,11 +2520,6 @@ name = "quick-error"
|
|||||||
version = "1.2.1"
|
version = "1.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "quine-mc_cluskey"
|
|
||||||
version = "0.2.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quote"
|
name = "quote"
|
||||||
version = "0.3.15"
|
version = "0.3.15"
|
||||||
@ -2623,11 +2580,6 @@ dependencies = [
|
|||||||
"utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "regex-syntax"
|
|
||||||
version = "0.3.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
@ -2856,14 +2808,6 @@ name = "semver"
|
|||||||
version = "0.1.20"
|
version = "0.1.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "semver"
|
|
||||||
version = "0.2.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "semver"
|
name = "semver"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
@ -3276,14 +3220,6 @@ dependencies = [
|
|||||||
"tokio-io 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tokio-io 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "toml"
|
|
||||||
version = "0.1.30"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.4.5"
|
version = "0.4.5"
|
||||||
@ -3615,8 +3551,6 @@ dependencies = [
|
|||||||
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
||||||
"checksum cid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "34aa7da06f10541fbca6850719cdaa8fa03060a5d2fb33840f149cf8133a00c7"
|
"checksum cid 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "34aa7da06f10541fbca6850719cdaa8fa03060a5d2fb33840f149cf8133a00c7"
|
||||||
"checksum clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3451e409013178663435d6f15fdb212f14ee4424a3d74f979d081d0a66b6f1f2"
|
"checksum clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3451e409013178663435d6f15fdb212f14ee4424a3d74f979d081d0a66b6f1f2"
|
||||||
"checksum clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "5b4fabf979ddf6419a313c1c0ada4a5b95cfd2049c56e8418d622d27b4b6ff32"
|
|
||||||
"checksum clippy_lints 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)" = "ce96ec05bfe018a0d5d43da115e54850ea2217981ff0f2e462780ab9d594651a"
|
|
||||||
"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd"
|
"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd"
|
||||||
"checksum conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299"
|
"checksum conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299"
|
||||||
"checksum cookie 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d53b80dde876f47f03cda35303e368a79b91c70b0d65ecba5fd5280944a08591"
|
"checksum cookie 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d53b80dde876f47f03cda35303e368a79b91c70b0d65ecba5fd5280944a08591"
|
||||||
@ -3710,7 +3644,6 @@ dependencies = [
|
|||||||
"checksum native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04b781c9134a954c84f0594b9ab3f5606abc516030388e8511887ef4c204a1e5"
|
"checksum native-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04b781c9134a954c84f0594b9ab3f5606abc516030388e8511887ef4c204a1e5"
|
||||||
"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
|
"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
|
||||||
"checksum nodrop 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "52cd74cd09beba596430cc6e3091b74007169a56246e1262f0ba451ea95117b2"
|
"checksum nodrop 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "52cd74cd09beba596430cc6e3091b74007169a56246e1262f0ba451ea95117b2"
|
||||||
"checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
|
|
||||||
"checksum ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "143149743832c6543b60a8ef2a26cd9122dfecec2b767158e852a7beecf6d7a0"
|
"checksum ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "143149743832c6543b60a8ef2a26cd9122dfecec2b767158e852a7beecf6d7a0"
|
||||||
"checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
|
"checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
|
||||||
"checksum num-bigint 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "8fd0f8dbb4c0960998958a796281d88c16fbe68d87b1baa6f31e2979e81fd0bd"
|
"checksum num-bigint 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "8fd0f8dbb4c0960998958a796281d88c16fbe68d87b1baa6f31e2979e81fd0bd"
|
||||||
@ -3756,7 +3689,6 @@ dependencies = [
|
|||||||
"checksum quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4"
|
"checksum quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9e25fa23c044c1803f43ca59c98dac608976dd04ce799411edd58ece776d4"
|
||||||
"checksum quasi_macros 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29cec87bc2816766d7e4168302d505dd06b0a825aed41b00633d296e922e02dd"
|
"checksum quasi_macros 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29cec87bc2816766d7e4168302d505dd06b0a825aed41b00633d296e922e02dd"
|
||||||
"checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4"
|
"checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4"
|
||||||
"checksum quine-mc_cluskey 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "07589615d719a60c8dd8a4622e7946465dfef20d1a428f969e3443e7386d5f45"
|
|
||||||
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
|
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
|
||||||
"checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf"
|
"checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf"
|
||||||
"checksum rayon 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a77c51c07654ddd93f6cb543c7a849863b03abc7e82591afda6dc8ad4ac3ac4a"
|
"checksum rayon 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a77c51c07654ddd93f6cb543c7a849863b03abc7e82591afda6dc8ad4ac3ac4a"
|
||||||
@ -3764,7 +3696,6 @@ dependencies = [
|
|||||||
"checksum rayon-core 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7febc28567082c345f10cddc3612c6ea020fc3297a1977d472cf9fdb73e6e493"
|
"checksum rayon-core 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7febc28567082c345f10cddc3612c6ea020fc3297a1977d472cf9fdb73e6e493"
|
||||||
"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"
|
"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"
|
||||||
"checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
|
"checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
|
||||||
"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
|
|
||||||
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
|
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
|
||||||
"checksum reqwest 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5866613d84e2a39c0479a960bf2d0eff1fbfc934f02cd42b5c08c1e1efc5b1fd"
|
"checksum reqwest 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5866613d84e2a39c0479a960bf2d0eff1fbfc934f02cd42b5c08c1e1efc5b1fd"
|
||||||
"checksum ring 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "24293de46bac74c9b9c05b40ff8496bbc8b9ae242a9b89f754e1154a43bc7c4c"
|
"checksum ring 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "24293de46bac74c9b9c05b40ff8496bbc8b9ae242a9b89f754e1154a43bc7c4c"
|
||||||
@ -3787,7 +3718,6 @@ dependencies = [
|
|||||||
"checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332"
|
"checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332"
|
||||||
"checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead"
|
"checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead"
|
||||||
"checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"
|
"checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"
|
||||||
"checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f"
|
|
||||||
"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
|
"checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
|
||||||
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||||
"checksum serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "6a7046c9d4c6c522d10b2d098f9bebe2bef227e0e74044d8c1bfcf6b476af799"
|
"checksum serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "6a7046c9d4c6c522d10b2d098f9bebe2bef227e0e74044d8c1bfcf6b476af799"
|
||||||
@ -3835,7 +3765,6 @@ dependencies = [
|
|||||||
"checksum tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc"
|
"checksum tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc"
|
||||||
"checksum tokio-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d88e411cac1c87e405e4090be004493c5d8072a370661033b1a64ea205ec2e13"
|
"checksum tokio-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d88e411cac1c87e405e4090be004493c5d8072a370661033b1a64ea205ec2e13"
|
||||||
"checksum tokio-uds 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6116c71be48f8f1656551fd16458247fdd6c03201d7893ad81189055fcde03e8"
|
"checksum tokio-uds 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6116c71be48f8f1656551fd16458247fdd6c03201d7893ad81189055fcde03e8"
|
||||||
"checksum toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)" = "0590d72182e50e879c4da3b11c6488dae18fccb1ae0c7a3eda18e16795844796"
|
|
||||||
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
|
"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
|
||||||
"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
|
"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
|
||||||
"checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f"
|
"checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f"
|
||||||
|
@ -55,6 +55,7 @@ parity-reactor = { path = "util/reactor" }
|
|||||||
parity-rpc = { path = "rpc" }
|
parity-rpc = { path = "rpc" }
|
||||||
parity-rpc-client = { path = "rpc_client" }
|
parity-rpc-client = { path = "rpc_client" }
|
||||||
parity-updater = { path = "updater" }
|
parity-updater = { path = "updater" }
|
||||||
|
parity-version = { path = "util/version" }
|
||||||
parity-whisper = { path = "whisper" }
|
parity-whisper = { path = "whisper" }
|
||||||
path = { path = "util/path" }
|
path = { path = "util/path" }
|
||||||
panic_hook = { path = "panic_hook" }
|
panic_hook = { path = "panic_hook" }
|
||||||
@ -65,7 +66,6 @@ kvdb-rocksdb = { path = "util/kvdb-rocksdb" }
|
|||||||
journaldb = { path = "util/journaldb" }
|
journaldb = { path = "util/journaldb" }
|
||||||
|
|
||||||
parity-dapps = { path = "dapps", optional = true }
|
parity-dapps = { path = "dapps", optional = true }
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
ethcore-secretstore = { path = "secret_store", optional = true }
|
ethcore-secretstore = { path = "secret_store", optional = true }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
@ -94,13 +94,11 @@ ui-precompiled = [
|
|||||||
ui-enabled = ["dapps"]
|
ui-enabled = ["dapps"]
|
||||||
dapps = ["parity-dapps"]
|
dapps = ["parity-dapps"]
|
||||||
jit = ["ethcore/jit"]
|
jit = ["ethcore/jit"]
|
||||||
dev = ["clippy", "ethcore/dev", "ethcore-util/dev", "ethsync/dev", "parity-rpc/dev", "parity-dapps/dev"]
|
|
||||||
json-tests = ["ethcore/json-tests"]
|
json-tests = ["ethcore/json-tests"]
|
||||||
test-heavy = ["ethcore/test-heavy"]
|
test-heavy = ["ethcore/test-heavy"]
|
||||||
evm-debug = ["ethcore/evm-debug"]
|
evm-debug = ["ethcore/evm-debug"]
|
||||||
evm-debug-tests = ["ethcore/evm-debug-tests"]
|
evm-debug-tests = ["ethcore/evm-debug-tests"]
|
||||||
slow-blocks = ["ethcore/slow-blocks"]
|
slow-blocks = ["ethcore/slow-blocks"]
|
||||||
final = ["ethcore-util/final"]
|
|
||||||
secretstore = ["ethcore-secretstore"]
|
secretstore = ["ethcore-secretstore"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
|
@ -37,15 +37,12 @@ parity-hash-fetch = { path = "../hash-fetch" }
|
|||||||
parity-reactor = { path = "../util/reactor" }
|
parity-reactor = { path = "../util/reactor" }
|
||||||
parity-ui = { path = "./ui" }
|
parity-ui = { path = "./ui" }
|
||||||
keccak-hash = { path = "../util/hash" }
|
keccak-hash = { path = "../util/hash" }
|
||||||
|
parity-version = { path = "../util/version" }
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
env_logger = "0.4"
|
env_logger = "0.4"
|
||||||
ethcore-devtools = { path = "../devtools" }
|
ethcore-devtools = { path = "../devtools" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
dev = ["clippy", "ethcore-util/dev"]
|
|
||||||
|
|
||||||
ui = ["parity-ui/no-precompiled-js"]
|
ui = ["parity-ui/no-precompiled-js"]
|
||||||
ui-precompiled = ["parity-ui/use-precompiled-js"]
|
ui-precompiled = ["parity-ui/use-precompiled-js"]
|
||||||
|
@ -18,13 +18,10 @@ quasi = { version = "0.32", default-features = false }
|
|||||||
quasi_macros = { version = "0.32", optional = true }
|
quasi_macros = { version = "0.32", optional = true }
|
||||||
syntex = { version = "0.58", optional = true }
|
syntex = { version = "0.58", optional = true }
|
||||||
syntex_syntax = { version = "0.58", optional = true }
|
syntex_syntax = { version = "0.58", optional = true }
|
||||||
clippy = { version = "0.0.103", optional = true }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
dev = ["clippy"]
|
|
||||||
default = ["with-syntex"]
|
default = ["with-syntex"]
|
||||||
nightly = ["quasi_macros"]
|
nightly = ["quasi_macros"]
|
||||||
nightly-testing = ["clippy"]
|
|
||||||
with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"]
|
with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"]
|
||||||
use-precompiled-js = []
|
use-precompiled-js = []
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
use hyper::{self, mime, header};
|
use hyper::{self, mime, header};
|
||||||
use hyper::StatusCode;
|
use hyper::StatusCode;
|
||||||
|
|
||||||
use util::version;
|
use parity_version::version;
|
||||||
|
|
||||||
use handlers::add_security_headers;
|
use handlers::add_security_headers;
|
||||||
use Embeddable;
|
use Embeddable;
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
//! Ethcore Webapplications for Parity
|
//! Ethcore Webapplications for Parity
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="nightly", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="nightly", plugin(clippy))]
|
|
||||||
|
|
||||||
extern crate base32;
|
extern crate base32;
|
||||||
extern crate futures_cpupool;
|
extern crate futures_cpupool;
|
||||||
@ -43,6 +41,7 @@ extern crate parity_dapps_glue as parity_dapps;
|
|||||||
extern crate parity_hash_fetch as hash_fetch;
|
extern crate parity_hash_fetch as hash_fetch;
|
||||||
extern crate parity_ui;
|
extern crate parity_ui;
|
||||||
extern crate keccak_hash as hash;
|
extern crate keccak_hash as hash;
|
||||||
|
extern crate parity_version;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate futures;
|
extern crate futures;
|
||||||
|
@ -11,7 +11,6 @@ ansi_term = "0.9"
|
|||||||
bloomchain = "0.1"
|
bloomchain = "0.1"
|
||||||
bn = { git = "https://github.com/paritytech/bn" }
|
bn = { git = "https://github.com/paritytech/bn" }
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
common-types = { path = "types" }
|
common-types = { path = "types" }
|
||||||
crossbeam = "0.2.9"
|
crossbeam = "0.2.9"
|
||||||
ethash = { path = "../ethash" }
|
ethash = { path = "../ethash" }
|
||||||
@ -83,6 +82,5 @@ evm-debug-tests = ["evm-debug"]
|
|||||||
slow-blocks = [] # Use SLOW_TX_DURATION="50" (compile time!) to track transactions over 50ms
|
slow-blocks = [] # Use SLOW_TX_DURATION="50" (compile time!) to track transactions over 50ms
|
||||||
json-tests = []
|
json-tests = []
|
||||||
test-heavy = []
|
test-heavy = []
|
||||||
dev = ["clippy"]
|
|
||||||
default = []
|
default = []
|
||||||
benches = []
|
benches = []
|
||||||
|
@ -32,7 +32,6 @@ macro_rules! overflowing {
|
|||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(enum_variant_names))]
|
|
||||||
enum Request<Cost: ::evm::CostType> {
|
enum Request<Cost: ::evm::CostType> {
|
||||||
Gas(Cost),
|
Gas(Cost),
|
||||||
GasMem(Cost, Cost),
|
GasMem(Cost, Cost),
|
||||||
@ -101,7 +100,6 @@ impl<Gas: evm::CostType> Gasometer<Gas> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity))]
|
|
||||||
/// Determine how much gas is used by the given instruction, given the machine's state.
|
/// Determine how much gas is used by the given instruction, given the machine's state.
|
||||||
///
|
///
|
||||||
/// We guarantee that the final element of the returned tuple (`provided`) will be `Some`
|
/// We guarantee that the final element of the returned tuple (`provided`) will be `Some`
|
||||||
|
@ -66,7 +66,6 @@ struct CodeReader<'a> {
|
|||||||
code: &'a [u8]
|
code: &'a [u8]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(len_without_is_empty))]
|
|
||||||
impl<'a> CodeReader<'a> {
|
impl<'a> CodeReader<'a> {
|
||||||
|
|
||||||
/// Create new code reader - starting at position 0.
|
/// Create new code reader - starting at position 0.
|
||||||
@ -287,7 +286,6 @@ impl<Cost: CostType> Interpreter<Cost> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn exec_instruction(
|
fn exec_instruction(
|
||||||
&mut self,
|
&mut self,
|
||||||
gas: Cost,
|
gas: Cost,
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit d6185ea16eaba7ff685c069c2064819f9549c4d7
|
Subproject commit d9d6133c1bc5dca4c74c9eb758a39546a0d46b45
|
@ -22,7 +22,6 @@ pub type LogBloom = ::log_entry::LogBloom;
|
|||||||
/// 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 = ::bigint::hash::H2048([0x00; 256]);
|
pub static ZERO_LOGBLOOM: LogBloom = ::bigint::hash::H2048([0x00; 256]);
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", 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.
|
||||||
|
@ -301,7 +301,6 @@ pub struct SealedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'x> OpenBlock<'x> {
|
impl<'x> OpenBlock<'x> {
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
/// Create a new `OpenBlock` ready for transaction pushing.
|
/// Create a new `OpenBlock` ready for transaction pushing.
|
||||||
pub fn new(
|
pub fn new(
|
||||||
engine: &'x EthEngine,
|
engine: &'x EthEngine,
|
||||||
@ -614,7 +613,6 @@ impl IsBlock for SealedBlock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Enact the block given by block header, transactions and uncles
|
/// Enact the block given by block header, transactions and uncles
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
pub fn enact(
|
pub fn enact(
|
||||||
header: &Header,
|
header: &Header,
|
||||||
transactions: &[SignedTransaction],
|
transactions: &[SignedTransaction],
|
||||||
@ -688,7 +686,6 @@ fn push_transactions(block: &mut OpenBlock, transactions: &[SignedTransaction])
|
|||||||
|
|
||||||
// TODO [ToDr] Pass `PreverifiedBlock` by move, this will avoid unecessary allocation
|
// TODO [ToDr] Pass `PreverifiedBlock` by move, this will avoid unecessary allocation
|
||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
pub fn enact_verified(
|
pub fn enact_verified(
|
||||||
block: &PreverifiedBlock,
|
block: &PreverifiedBlock,
|
||||||
engine: &EthEngine,
|
engine: &EthEngine,
|
||||||
@ -731,7 +728,6 @@ mod tests {
|
|||||||
use transaction::SignedTransaction;
|
use transaction::SignedTransaction;
|
||||||
|
|
||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn enact_bytes(
|
fn enact_bytes(
|
||||||
block_bytes: &[u8],
|
block_bytes: &[u8],
|
||||||
engine: &EthEngine,
|
engine: &EthEngine,
|
||||||
@ -778,7 +774,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header. Seal the block aferwards
|
/// Enact the block given by `block_bytes` using `engine` on the database `db` with given `parent` block header. Seal the block aferwards
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn enact_and_seal(
|
fn enact_and_seal(
|
||||||
block_bytes: &[u8],
|
block_bytes: &[u8],
|
||||||
engine: &EthEngine,
|
engine: &EthEngine,
|
||||||
|
@ -970,7 +970,6 @@ impl BlockChain {
|
|||||||
self.cache_man.lock().note_used(CacheId::BlockDetails(block_hash));
|
self.cache_man.lock().note_used(CacheId::BlockDetails(block_hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
/// Inserts the block into backing cache database.
|
/// Inserts the block into backing cache database.
|
||||||
/// Expects the block to be valid and already verified.
|
/// Expects the block to be valid and already verified.
|
||||||
/// If the block is already known, does nothing.
|
/// If the block is already known, does nothing.
|
||||||
@ -1475,7 +1474,6 @@ impl BlockChain {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
@ -1583,7 +1581,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity))]
|
|
||||||
fn test_find_uncles() {
|
fn test_find_uncles() {
|
||||||
let mut canon_chain = ChainGenerator::default();
|
let mut canon_chain = ChainGenerator::default();
|
||||||
let mut finalizer = BlockFinalizer::default();
|
let mut finalizer = BlockFinalizer::default();
|
||||||
@ -1793,7 +1790,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity))]
|
|
||||||
fn test_small_fork() {
|
fn test_small_fork() {
|
||||||
let mut canon_chain = ChainGenerator::default();
|
let mut canon_chain = ChainGenerator::default();
|
||||||
let mut finalizer = BlockFinalizer::default();
|
let mut finalizer = BlockFinalizer::default();
|
||||||
|
@ -1857,7 +1857,7 @@ impl MiningBlockChainClient for Client {
|
|||||||
let mut open_block = OpenBlock::new(
|
let mut open_block = OpenBlock::new(
|
||||||
engine,
|
engine,
|
||||||
self.factories.clone(),
|
self.factories.clone(),
|
||||||
false, // TODO: this will need to be parameterised once we want to do immediate mining insertion.
|
self.tracedb.read().tracing_enabled(),
|
||||||
self.state_db.lock().boxed_clone_canon(&h),
|
self.state_db.lock().boxed_clone_canon(&h),
|
||||||
best_header,
|
best_header,
|
||||||
self.build_last_hashes(h.clone()),
|
self.build_last_hashes(h.clone()),
|
||||||
|
@ -51,8 +51,12 @@ mod finality;
|
|||||||
|
|
||||||
/// `AuthorityRound` params.
|
/// `AuthorityRound` params.
|
||||||
pub struct AuthorityRoundParams {
|
pub struct AuthorityRoundParams {
|
||||||
/// Time to wait before next block or authority switching.
|
/// Time to wait before next block or authority switching,
|
||||||
pub step_duration: Duration,
|
/// in seconds.
|
||||||
|
///
|
||||||
|
/// Deliberately typed as u16 as too high of a value leads
|
||||||
|
/// to slow block issuance.
|
||||||
|
pub step_duration: u16,
|
||||||
/// Starting step,
|
/// Starting step,
|
||||||
pub start_step: Option<u64>,
|
pub start_step: Option<u64>,
|
||||||
/// Valid validators.
|
/// Valid validators.
|
||||||
@ -71,10 +75,17 @@ pub struct AuthorityRoundParams {
|
|||||||
pub maximum_uncle_count: usize,
|
pub maximum_uncle_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const U16_MAX: usize = ::std::u16::MAX as usize;
|
||||||
|
|
||||||
impl From<ethjson::spec::AuthorityRoundParams> for AuthorityRoundParams {
|
impl From<ethjson::spec::AuthorityRoundParams> for AuthorityRoundParams {
|
||||||
fn from(p: ethjson::spec::AuthorityRoundParams) -> Self {
|
fn from(p: ethjson::spec::AuthorityRoundParams) -> Self {
|
||||||
|
let mut step_duration_usize: usize = p.step_duration.into();
|
||||||
|
if step_duration_usize > U16_MAX {
|
||||||
|
step_duration_usize = U16_MAX;
|
||||||
|
warn!(target: "engine", "step_duration is too high ({}), setting it to {}", step_duration_usize, U16_MAX);
|
||||||
|
}
|
||||||
AuthorityRoundParams {
|
AuthorityRoundParams {
|
||||||
step_duration: Duration::from_secs(p.step_duration.into()),
|
step_duration: step_duration_usize as u16,
|
||||||
validators: new_validator_set(p.validators),
|
validators: new_validator_set(p.validators),
|
||||||
start_step: p.start_step.map(Into::into),
|
start_step: p.start_step.map(Into::into),
|
||||||
validate_score_transition: p.validate_score_transition.map_or(0, Into::into),
|
validate_score_transition: p.validate_score_transition.map_or(0, Into::into),
|
||||||
@ -92,26 +103,47 @@ impl From<ethjson::spec::AuthorityRoundParams> for AuthorityRoundParams {
|
|||||||
struct Step {
|
struct Step {
|
||||||
calibrate: bool, // whether calibration is enabled.
|
calibrate: bool, // whether calibration is enabled.
|
||||||
inner: AtomicUsize,
|
inner: AtomicUsize,
|
||||||
duration: Duration,
|
duration: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Step {
|
impl Step {
|
||||||
fn load(&self) -> usize { self.inner.load(AtomicOrdering::SeqCst) }
|
fn load(&self) -> usize { self.inner.load(AtomicOrdering::SeqCst) }
|
||||||
fn duration_remaining(&self) -> Duration {
|
fn duration_remaining(&self) -> Duration {
|
||||||
let now = unix_now();
|
let now = unix_now();
|
||||||
let step_end = self.duration * (self.load() as u32 + 1);
|
let expected_seconds = (self.load() as u64)
|
||||||
|
.checked_add(1)
|
||||||
|
.and_then(|ctr| ctr.checked_mul(self.duration as u64));
|
||||||
|
match expected_seconds {
|
||||||
|
Some(secs) => {
|
||||||
|
let step_end = Duration::from_secs(secs);
|
||||||
if step_end > now {
|
if step_end > now {
|
||||||
step_end - now
|
step_end - now
|
||||||
} else {
|
} else {
|
||||||
Duration::from_secs(0)
|
Duration::from_secs(0)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
let ctr = self.load();
|
||||||
|
error!(target: "engine", "Step counter is too high: {}, aborting", ctr);
|
||||||
|
panic!("step counter is too high: {}", ctr)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
fn increment(&self) {
|
fn increment(&self) {
|
||||||
self.inner.fetch_add(1, AtomicOrdering::SeqCst);
|
use std::usize;
|
||||||
|
// fetch_add won't panic on overflow but will rather wrap
|
||||||
|
// around, leading to zero as the step counter, which might
|
||||||
|
// lead to unexpected situations, so it's better to shut down.
|
||||||
|
if self.inner.fetch_add(1, AtomicOrdering::SeqCst) == usize::MAX {
|
||||||
|
error!(target: "engine", "Step counter is too high: {}, aborting", usize::MAX);
|
||||||
|
panic!("step counter is too high: {}", usize::MAX);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
fn calibrate(&self) {
|
fn calibrate(&self) {
|
||||||
if self.calibrate {
|
if self.calibrate {
|
||||||
let new_step = unix_now().as_secs() / self.duration.as_secs();
|
let new_step = unix_now().as_secs() / (self.duration as u64);
|
||||||
self.inner.store(new_step as usize, AtomicOrdering::SeqCst);
|
self.inner.store(new_step as usize, AtomicOrdering::SeqCst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -359,8 +391,12 @@ impl AsMillis for Duration {
|
|||||||
impl AuthorityRound {
|
impl AuthorityRound {
|
||||||
/// Create a new instance of AuthorityRound engine.
|
/// Create a new instance of AuthorityRound engine.
|
||||||
pub fn new(our_params: AuthorityRoundParams, machine: EthereumMachine) -> Result<Arc<Self>, Error> {
|
pub fn new(our_params: AuthorityRoundParams, machine: EthereumMachine) -> Result<Arc<Self>, Error> {
|
||||||
|
if our_params.step_duration == 0 {
|
||||||
|
error!(target: "engine", "Authority Round step duration can't be zero, aborting");
|
||||||
|
panic!("authority_round: step duration can't be zero")
|
||||||
|
}
|
||||||
let should_timeout = our_params.start_step.is_none();
|
let should_timeout = our_params.start_step.is_none();
|
||||||
let initial_step = our_params.start_step.unwrap_or_else(|| (unix_now().as_secs() / our_params.step_duration.as_secs())) as usize;
|
let initial_step = our_params.start_step.unwrap_or_else(|| (unix_now().as_secs() / (our_params.step_duration as u64))) as usize;
|
||||||
let engine = Arc::new(
|
let engine = Arc::new(
|
||||||
AuthorityRound {
|
AuthorityRound {
|
||||||
transition_service: IoService::<()>::start()?,
|
transition_service: IoService::<()>::start()?,
|
||||||
@ -1019,7 +1055,7 @@ mod tests {
|
|||||||
fn reports_skipped() {
|
fn reports_skipped() {
|
||||||
let last_benign = Arc::new(AtomicUsize::new(0));
|
let last_benign = Arc::new(AtomicUsize::new(0));
|
||||||
let params = AuthorityRoundParams {
|
let params = AuthorityRoundParams {
|
||||||
step_duration: Default::default(),
|
step_duration: 1,
|
||||||
start_step: Some(1),
|
start_step: Some(1),
|
||||||
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
||||||
validate_score_transition: 0,
|
validate_score_transition: 0,
|
||||||
@ -1059,7 +1095,7 @@ mod tests {
|
|||||||
fn test_uncles_transition() {
|
fn test_uncles_transition() {
|
||||||
let last_benign = Arc::new(AtomicUsize::new(0));
|
let last_benign = Arc::new(AtomicUsize::new(0));
|
||||||
let params = AuthorityRoundParams {
|
let params = AuthorityRoundParams {
|
||||||
step_duration: Default::default(),
|
step_duration: 1,
|
||||||
start_step: Some(1),
|
start_step: Some(1),
|
||||||
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
||||||
validate_score_transition: 0,
|
validate_score_transition: 0,
|
||||||
@ -1081,4 +1117,50 @@ mod tests {
|
|||||||
assert_eq!(aura.maximum_uncle_count(1), 0);
|
assert_eq!(aura.maximum_uncle_count(1), 0);
|
||||||
assert_eq!(aura.maximum_uncle_count(100), 0);
|
assert_eq!(aura.maximum_uncle_count(100), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected="counter is too high")]
|
||||||
|
fn test_counter_increment_too_high() {
|
||||||
|
use super::Step;
|
||||||
|
let step = Step {
|
||||||
|
calibrate: false,
|
||||||
|
inner: AtomicUsize::new(::std::usize::MAX),
|
||||||
|
duration: 1,
|
||||||
|
};
|
||||||
|
step.increment();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected="counter is too high")]
|
||||||
|
fn test_counter_duration_remaining_too_high() {
|
||||||
|
use super::Step;
|
||||||
|
let step = Step {
|
||||||
|
calibrate: false,
|
||||||
|
inner: AtomicUsize::new(::std::usize::MAX),
|
||||||
|
duration: 1,
|
||||||
|
};
|
||||||
|
step.duration_remaining();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected="authority_round: step duration can't be zero")]
|
||||||
|
fn test_step_duration_zero() {
|
||||||
|
let last_benign = Arc::new(AtomicUsize::new(0));
|
||||||
|
let params = AuthorityRoundParams {
|
||||||
|
step_duration: 0,
|
||||||
|
start_step: Some(1),
|
||||||
|
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
||||||
|
validate_score_transition: 0,
|
||||||
|
validate_step_transition: 0,
|
||||||
|
immediate_transitions: true,
|
||||||
|
maximum_uncle_count_transition: 0,
|
||||||
|
maximum_uncle_count: 0,
|
||||||
|
block_reward: Default::default(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut c_params = ::spec::CommonParams::default();
|
||||||
|
c_params.gas_limit_bound_divisor = 5.into();
|
||||||
|
let machine = ::machine::EthereumMachine::regular(c_params, Default::default());
|
||||||
|
AuthorityRound::new(params, machine).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ impl ValidatorContract {
|
|||||||
let client = self.client.read().clone();
|
let client = self.client.read().clone();
|
||||||
Box::new(move |a, d| client.as_ref()
|
Box::new(move |a, d| client.as_ref()
|
||||||
.and_then(Weak::upgrade)
|
.and_then(Weak::upgrade)
|
||||||
.ok_or("No client!".into())
|
.ok_or_else(|| "No client!".into())
|
||||||
.and_then(|c| {
|
.and_then(|c| {
|
||||||
match c.as_full_client() {
|
match c.as_full_client() {
|
||||||
Some(c) => c.transact_contract(a, d)
|
Some(c) => c.transact_contract(a, d)
|
||||||
|
@ -138,7 +138,7 @@ impl ValidatorSet for Multi {
|
|||||||
}
|
}
|
||||||
*self.block_number.write() = Box::new(move |id| client
|
*self.block_number.write() = Box::new(move |id| client
|
||||||
.upgrade()
|
.upgrade()
|
||||||
.ok_or("No client!".into())
|
.ok_or_else(|| "No client!".into())
|
||||||
.and_then(|c| c.block_number(id).ok_or("Unknown block".into())));
|
.and_then(|c| c.block_number(id).ok_or("Unknown block".into())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ impl ValidatorSet for ValidatorSafeContract {
|
|||||||
let client = self.client.read().clone();
|
let client = self.client.read().clone();
|
||||||
Box::new(move |addr, data| client.as_ref()
|
Box::new(move |addr, data| client.as_ref()
|
||||||
.and_then(Weak::upgrade)
|
.and_then(Weak::upgrade)
|
||||||
.ok_or("No client!".into())
|
.ok_or_else(|| "No client!".into())
|
||||||
.and_then(|c| {
|
.and_then(|c| {
|
||||||
match c.as_full_client() {
|
match c.as_full_client() {
|
||||||
Some(c) => c.call_contract(id, addr, data),
|
Some(c) => c.call_contract(id, addr, data),
|
||||||
|
@ -336,7 +336,6 @@ impl Engine<EthereumMachine> for Arc<Ethash> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
impl Ethash {
|
impl Ethash {
|
||||||
fn calculate_difficulty(&self, header: &Header, parent: &Header) -> U256 {
|
fn calculate_difficulty(&self, header: &Header, parent: &Header) -> U256 {
|
||||||
const EXP_DIFF_PERIOD: u64 = 100_000;
|
const EXP_DIFF_PERIOD: u64 = 100_000;
|
||||||
|
@ -85,7 +85,6 @@ impl<'a, T: 'a, V: 'a, B: 'a> Externalities<'a, T, V, B>
|
|||||||
where T: Tracer, V: VMTracer, B: StateBackend
|
where T: Tracer, V: VMTracer, B: StateBackend
|
||||||
{
|
{
|
||||||
/// Basic `Externalities` constructor.
|
/// Basic `Externalities` constructor.
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
pub fn new(state: &'a mut State<B>,
|
pub fn new(state: &'a mut State<B>,
|
||||||
env_info: &'a EnvInfo,
|
env_info: &'a EnvInfo,
|
||||||
machine: &'a Machine,
|
machine: &'a Machine,
|
||||||
@ -302,7 +301,6 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for Externalities<'a, T, V, B>
|
|||||||
Ok(self.state.code_size(address)?.unwrap_or(0))
|
Ok(self.state.code_size(address)?.unwrap_or(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(match_ref_pats))]
|
|
||||||
fn ret(mut self, gas: &U256, data: &ReturnData, apply_state: bool) -> vm::Result<U256>
|
fn ret(mut self, gas: &U256, data: &ReturnData, apply_state: bool) -> vm::Result<U256>
|
||||||
where Self: Sized {
|
where Self: Sized {
|
||||||
let handle_copy = |to: &mut Option<&mut Bytes>| {
|
let handle_copy = |to: &mut Option<&mut Bytes>| {
|
||||||
|
@ -16,23 +16,6 @@
|
|||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="benches", feature(test))]
|
#![cfg_attr(feature="benches", feature(test))]
|
||||||
#![cfg_attr(feature="dev", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="dev", plugin(clippy))]
|
|
||||||
|
|
||||||
// Clippy settings
|
|
||||||
// Most of the time much more readable
|
|
||||||
#![cfg_attr(feature="dev", allow(needless_range_loop))]
|
|
||||||
// Shorter than if-else
|
|
||||||
#![cfg_attr(feature="dev", allow(match_bool))]
|
|
||||||
// Keeps consistency (all lines with `.clone()`).
|
|
||||||
#![cfg_attr(feature="dev", allow(clone_on_copy))]
|
|
||||||
// Complains on Box<E> when implementing From<Box<E>>
|
|
||||||
#![cfg_attr(feature="dev", allow(boxed_local))]
|
|
||||||
// Complains about nested modules with same name as parent
|
|
||||||
#![cfg_attr(feature="dev", allow(module_inception))]
|
|
||||||
// TODO [todr] a lot of warnings to be fixed
|
|
||||||
#![cfg_attr(feature="dev", allow(assign_op_pattern))]
|
|
||||||
|
|
||||||
|
|
||||||
//! Ethcore library
|
//! Ethcore library
|
||||||
//!
|
//!
|
||||||
|
@ -366,7 +366,6 @@ impl Miner {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(match_same_arms))]
|
|
||||||
/// Prepares new block for sealing including top transactions from queue.
|
/// Prepares new block for sealing including top transactions from queue.
|
||||||
fn prepare_block(&self, chain: &MiningBlockChainClient) -> (ClosedBlock, Option<H256>) {
|
fn prepare_block(&self, chain: &MiningBlockChainClient) -> (ClosedBlock, Option<H256>) {
|
||||||
let _timer = PerfTimer::new("prepare_block");
|
let _timer = PerfTimer::new("prepare_block");
|
||||||
@ -729,8 +728,6 @@ impl Miner {
|
|||||||
/// Are we allowed to do a non-mandatory reseal?
|
/// Are we allowed to do a non-mandatory reseal?
|
||||||
fn tx_reseal_allowed(&self) -> bool { Instant::now() > *self.next_allowed_reseal.lock() }
|
fn tx_reseal_allowed(&self) -> bool { Instant::now() > *self.next_allowed_reseal.lock() }
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
#[cfg_attr(feature="dev", allow(redundant_closure))]
|
|
||||||
fn from_pending_block<H, F, G>(&self, latest_block_number: BlockNumber, from_chain: F, map_block: G) -> H
|
fn from_pending_block<H, F, G>(&self, latest_block_number: BlockNumber, from_chain: F, map_block: G) -> H
|
||||||
where F: Fn() -> H, G: FnOnce(&ClosedBlock) -> H {
|
where F: Fn() -> H, G: FnOnce(&ClosedBlock) -> H {
|
||||||
let sealing_work = self.sealing_work.lock();
|
let sealing_work = self.sealing_work.lock();
|
||||||
@ -890,7 +887,6 @@ impl MinerService for Miner {
|
|||||||
results
|
results
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(collapsible_if))]
|
|
||||||
fn import_own_transaction(
|
fn import_own_transaction(
|
||||||
&self,
|
&self,
|
||||||
chain: &MiningBlockChainClient,
|
chain: &MiningBlockChainClient,
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(all(nightly, feature="dev"), feature(plugin))]
|
|
||||||
#![cfg_attr(all(nightly, feature="dev"), plugin(clippy))]
|
|
||||||
|
|
||||||
//! Miner module
|
//! Miner module
|
||||||
//! Keeps track of transactions and mined block.
|
//! Keeps track of transactions and mined block.
|
||||||
|
@ -136,7 +136,6 @@ impl PartialOrd for TransactionOrigin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Ord for TransactionOrigin {
|
impl Ord for TransactionOrigin {
|
||||||
#[cfg_attr(feature="dev", allow(match_same_arms))]
|
|
||||||
fn cmp(&self, other: &TransactionOrigin) -> Ordering {
|
fn cmp(&self, other: &TransactionOrigin) -> Ordering {
|
||||||
if *other == *self {
|
if *other == *self {
|
||||||
return Ordering::Equal;
|
return Ordering::Equal;
|
||||||
@ -516,7 +515,6 @@ pub struct AccountDetails {
|
|||||||
const GAS_PRICE_BUMP_SHIFT: usize = 3; // 2 = 25%, 3 = 12.5%, 4 = 6.25%
|
const GAS_PRICE_BUMP_SHIFT: usize = 3; // 2 = 25%, 3 = 12.5%, 4 = 6.25%
|
||||||
|
|
||||||
/// Describes the strategy used to prioritize transactions in the queue.
|
/// Describes the strategy used to prioritize transactions in the queue.
|
||||||
#[cfg_attr(feature="dev", allow(enum_variant_names))]
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum PrioritizationStrategy {
|
pub enum PrioritizationStrategy {
|
||||||
/// Use only gas price. Disregards the actual computation cost of the transaction.
|
/// Use only gas price. Disregards the actual computation cost of the transaction.
|
||||||
|
@ -186,7 +186,6 @@ impl IoHandler<ClientIoMessage> for ClientIoHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(single_match))]
|
|
||||||
fn message(&self, _io: &IoContext<ClientIoMessage>, net_message: &ClientIoMessage) {
|
fn message(&self, _io: &IoContext<ClientIoMessage>, net_message: &ClientIoMessage) {
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
|
@ -57,7 +57,6 @@ impl StateProducer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(let_and_return))]
|
|
||||||
/// Tick the state producer. This alters the state, writing new data into
|
/// Tick the state producer. This alters the state, writing new data into
|
||||||
/// the database.
|
/// the database.
|
||||||
pub fn tick<R: Rng>(&mut self, rng: &mut R, db: &mut HashDB) {
|
pub fn tick<R: Rng>(&mut self, rng: &mut R, db: &mut HashDB) {
|
||||||
|
@ -35,6 +35,15 @@ use std::cell::{RefCell, Cell};
|
|||||||
|
|
||||||
const STORAGE_CACHE_ITEMS: usize = 8192;
|
const STORAGE_CACHE_ITEMS: usize = 8192;
|
||||||
|
|
||||||
|
/// Boolean type for clean/dirty status.
|
||||||
|
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
||||||
|
pub enum Filth {
|
||||||
|
/// Data has not been changed.
|
||||||
|
Clean,
|
||||||
|
/// Data has been changed.
|
||||||
|
Dirty,
|
||||||
|
}
|
||||||
|
|
||||||
/// Single account in the system.
|
/// Single account in the system.
|
||||||
/// Keeps track of changes to the code and storage.
|
/// Keeps track of changes to the code and storage.
|
||||||
/// The changes are applied in `commit_storage` and `commit_code`
|
/// The changes are applied in `commit_storage` and `commit_code`
|
||||||
|
@ -604,7 +604,6 @@ impl<B: Backend> State<B> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Add `incr` to the balance of account `a`.
|
/// Add `incr` to the balance of account `a`.
|
||||||
#[cfg_attr(feature="dev", allow(single_match))]
|
|
||||||
pub fn add_balance(&mut self, a: &Address, incr: &U256, cleanup_mode: CleanupMode) -> trie::Result<()> {
|
pub fn add_balance(&mut self, a: &Address, incr: &U256, cleanup_mode: CleanupMode) -> trie::Result<()> {
|
||||||
trace!(target: "state", "add_balance({}, {}): {}", a, incr, self.balance(a)?);
|
trace!(target: "state", "add_balance({}, {}): {}", a, incr, self.balance(a)?);
|
||||||
let is_value_transfer = !incr.is_zero();
|
let is_value_transfer = !incr.is_zero();
|
||||||
@ -744,8 +743,6 @@ impl<B: Backend> State<B> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Commits our cached account changes into the trie.
|
/// Commits our cached account changes into the trie.
|
||||||
#[cfg_attr(feature="dev", allow(match_ref_pats))]
|
|
||||||
#[cfg_attr(feature="dev", allow(needless_borrow))]
|
|
||||||
pub fn commit(&mut self) -> Result<(), Error> {
|
pub fn commit(&mut self) -> Result<(), Error> {
|
||||||
// first, commit the sub trees.
|
// first, commit the sub trees.
|
||||||
let mut accounts = self.cache.borrow_mut();
|
let mut accounts = self.cache.borrow_mut();
|
||||||
|
@ -58,7 +58,6 @@ impl Substate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get the cleanup mode object from this.
|
/// Get the cleanup mode object from this.
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
pub fn to_cleanup_mode(&mut self, schedule: &Schedule) -> CleanupMode {
|
pub fn to_cleanup_mode(&mut self, schedule: &Schedule) -> CleanupMode {
|
||||||
match (schedule.kill_dust != CleanDustMode::Off, schedule.no_empty, schedule.kill_empty) {
|
match (schedule.kill_dust != CleanDustMode::Off, schedule.no_empty, schedule.kill_empty) {
|
||||||
(false, false, _) => CleanupMode::ForceCreate,
|
(false, false, _) => CleanupMode::ForceCreate,
|
||||||
|
@ -427,7 +427,6 @@ impl state::Backend for StateDB {
|
|||||||
cache.accounts.get_mut(addr).map(|a| a.as_ref().map(|a| a.clone_basic()))
|
cache.accounts.get_mut(addr).map(|a| a.as_ref().map(|a| a.clone_basic()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(map_clone))]
|
|
||||||
fn get_cached_code(&self, hash: &H256) -> Option<Arc<Vec<u8>>> {
|
fn get_cached_code(&self, hash: &H256) -> Option<Arc<Vec<u8>>> {
|
||||||
let mut cache = self.code_cache.lock();
|
let mut cache = self.code_cache.lock();
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@ use cache_manager::CacheManager;
|
|||||||
const TRACE_DB_VER: &'static [u8] = b"1.0";
|
const TRACE_DB_VER: &'static [u8] = b"1.0";
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
#[cfg_attr(feature="dev", allow(enum_variant_names))]
|
|
||||||
enum TraceDBIndex {
|
enum TraceDBIndex {
|
||||||
/// Block traces index.
|
/// Block traces index.
|
||||||
BlockTraces = 0,
|
BlockTraces = 0,
|
||||||
|
@ -164,7 +164,6 @@ struct QueueSignal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl QueueSignal {
|
impl QueueSignal {
|
||||||
#[cfg_attr(feature="dev", allow(bool_comparison))]
|
|
||||||
fn set_sync(&self) {
|
fn set_sync(&self) {
|
||||||
// Do not signal when we are about to close
|
// Do not signal when we are about to close
|
||||||
if self.deleting.load(AtomicOrdering::Relaxed) {
|
if self.deleting.load(AtomicOrdering::Relaxed) {
|
||||||
@ -179,7 +178,6 @@ impl QueueSignal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(bool_comparison))]
|
|
||||||
fn set_async(&self) {
|
fn set_async(&self) {
|
||||||
// Do not signal when we are about to close
|
// Do not signal when we are about to close
|
||||||
if self.deleting.load(AtomicOrdering::Relaxed) {
|
if self.deleting.load(AtomicOrdering::Relaxed) {
|
||||||
|
@ -498,7 +498,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
fn test_verify_block() {
|
fn test_verify_block() {
|
||||||
use rlp::RlpStream;
|
use rlp::RlpStream;
|
||||||
|
|
||||||
|
@ -96,7 +96,6 @@ pub trait Ext {
|
|||||||
/// Returns Err, if we run out of gas.
|
/// Returns Err, if we run out of gas.
|
||||||
/// Otherwise returns call_result which contains gas left
|
/// Otherwise returns call_result which contains gas left
|
||||||
/// and true if subcall was successfull.
|
/// and true if subcall was successfull.
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn call(&mut self,
|
fn call(&mut self,
|
||||||
gas: &U256,
|
gas: &U256,
|
||||||
sender_address: &Address,
|
sender_address: &Address,
|
||||||
|
@ -69,17 +69,17 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[
|
|||||||
),
|
),
|
||||||
Static(
|
Static(
|
||||||
"_ccall",
|
"_ccall",
|
||||||
&[I32; 6],
|
&[I64, I32, I32, I32, I32, I32, I32],
|
||||||
Some(I32),
|
Some(I32),
|
||||||
),
|
),
|
||||||
Static(
|
Static(
|
||||||
"_dcall",
|
"_dcall",
|
||||||
&[I32; 5],
|
&[I64, I32, I32, I32, I32, I32],
|
||||||
Some(I32),
|
Some(I32),
|
||||||
),
|
),
|
||||||
Static(
|
Static(
|
||||||
"_scall",
|
"_scall",
|
||||||
&[I32; 5],
|
&[I64, I32, I32, I32, I32, I32],
|
||||||
Some(I32),
|
Some(I32),
|
||||||
),
|
),
|
||||||
Static(
|
Static(
|
||||||
|
@ -111,6 +111,7 @@ impl vm::Vm for WasmInterpreter {
|
|||||||
address: params.address,
|
address: params.address,
|
||||||
sender: params.sender,
|
sender: params.sender,
|
||||||
origin: params.origin,
|
origin: params.origin,
|
||||||
|
code_address: params.code_address,
|
||||||
value: params.value.value(),
|
value: params.value.value(),
|
||||||
},
|
},
|
||||||
&self.program,
|
&self.program,
|
||||||
|
@ -104,6 +104,7 @@ pub struct RuntimeContext {
|
|||||||
pub address: Address,
|
pub address: Address,
|
||||||
pub sender: Address,
|
pub sender: Address,
|
||||||
pub origin: Address,
|
pub origin: Address,
|
||||||
|
pub code_address: Address,
|
||||||
pub value: U256,
|
pub value: U256,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,6 +306,7 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
//
|
//
|
||||||
// method signature:
|
// method signature:
|
||||||
// fn (
|
// fn (
|
||||||
|
// gas: i64,
|
||||||
// address: *const u8,
|
// address: *const u8,
|
||||||
// val_ptr: *const u8,
|
// val_ptr: *const u8,
|
||||||
// input_ptr: *const u8,
|
// input_ptr: *const u8,
|
||||||
@ -323,6 +325,7 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
//
|
//
|
||||||
// signature (same as static call):
|
// signature (same as static call):
|
||||||
// fn (
|
// fn (
|
||||||
|
// gas: i64,
|
||||||
// address: *const u8,
|
// address: *const u8,
|
||||||
// input_ptr: *const u8,
|
// input_ptr: *const u8,
|
||||||
// input_len: u32,
|
// input_len: u32,
|
||||||
@ -330,7 +333,7 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
// result_len: u32,
|
// result_len: u32,
|
||||||
// ) -> i32
|
// ) -> i32
|
||||||
|
|
||||||
self.do_call(false, CallType::CallCode, context)
|
self.do_call(false, CallType::DelegateCall, context)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn do_call(
|
fn do_call(
|
||||||
@ -363,6 +366,9 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
let address = self.pop_address(&mut context)?;
|
let address = self.pop_address(&mut context)?;
|
||||||
trace!(target: "wasm", " address: {:?}", address);
|
trace!(target: "wasm", " address: {:?}", address);
|
||||||
|
|
||||||
|
let gas = context.value_stack.pop_as::<i64>()? as u64;
|
||||||
|
trace!(target: "wasm", " gas: {:?}", gas);
|
||||||
|
|
||||||
if let Some(ref val) = val {
|
if let Some(ref val) = val {
|
||||||
let address_balance = self.ext.balance(&self.context.address)
|
let address_balance = self.ext.balance(&self.context.address)
|
||||||
.map_err(|_| UserTrap::BalanceQueryError)?;
|
.map_err(|_| UserTrap::BalanceQueryError)?;
|
||||||
@ -377,16 +383,16 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
|
|
||||||
let mut result = Vec::with_capacity(result_alloc_len as usize);
|
let mut result = Vec::with_capacity(result_alloc_len as usize);
|
||||||
result.resize(result_alloc_len as usize, 0);
|
result.resize(result_alloc_len as usize, 0);
|
||||||
let gas = self.gas_left()
|
|
||||||
.map_err(|_| UserTrap::InvalidGasState)?
|
|
||||||
.into();
|
|
||||||
// todo: optimize to use memory views once it's in
|
// todo: optimize to use memory views once it's in
|
||||||
let payload = self.memory.get(input_ptr, input_len as usize)?;
|
let payload = self.memory.get(input_ptr, input_len as usize)?;
|
||||||
|
|
||||||
|
self.charge(|_| gas.into())?;
|
||||||
|
|
||||||
let call_result = self.ext.call(
|
let call_result = self.ext.call(
|
||||||
&gas,
|
&gas.into(),
|
||||||
&self.context.sender,
|
match call_type { CallType::DelegateCall => &self.context.sender, _ => &self.context.address },
|
||||||
&self.context.address,
|
match call_type { CallType::Call | CallType::StaticCall => &address, _ => &self.context.address },
|
||||||
val,
|
val,
|
||||||
&payload,
|
&payload,
|
||||||
&address,
|
&address,
|
||||||
@ -396,12 +402,16 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
|
|
||||||
match call_result {
|
match call_result {
|
||||||
vm::MessageCallResult::Success(gas_left, _) => {
|
vm::MessageCallResult::Success(gas_left, _) => {
|
||||||
self.gas_counter = self.gas_limit - gas_left.low_u64();
|
// cannot overflow, before making call gas_counter was incremented with gas, and gas_left < gas
|
||||||
|
self.gas_counter = self.gas_counter - gas_left.low_u64();
|
||||||
|
|
||||||
self.memory.set(result_ptr, &result)?;
|
self.memory.set(result_ptr, &result)?;
|
||||||
Ok(Some(0i32.into()))
|
Ok(Some(0i32.into()))
|
||||||
},
|
},
|
||||||
vm::MessageCallResult::Reverted(gas_left, _) => {
|
vm::MessageCallResult::Reverted(gas_left, _) => {
|
||||||
self.gas_counter = self.gas_limit - gas_left.low_u64();
|
// cannot overflow, before making call gas_counter was incremented with gas, and gas_left < gas
|
||||||
|
self.gas_counter = self.gas_counter - gas_left.low_u64();
|
||||||
|
|
||||||
self.memory.set(result_ptr, &result)?;
|
self.memory.set(result_ptr, &result)?;
|
||||||
Ok(Some((-1i32).into()))
|
Ok(Some((-1i32).into()))
|
||||||
},
|
},
|
||||||
@ -416,6 +426,7 @@ impl<'a, 'b> Runtime<'a, 'b> {
|
|||||||
{
|
{
|
||||||
// signature (same as code call):
|
// signature (same as code call):
|
||||||
// fn (
|
// fn (
|
||||||
|
// gas: i64,
|
||||||
// address: *const u8,
|
// address: *const u8,
|
||||||
// input_ptr: *const u8,
|
// input_ptr: *const u8,
|
||||||
// input_len: u32,
|
// input_len: u32,
|
||||||
|
@ -60,7 +60,7 @@ fn empty() {
|
|||||||
test_finalize(interpreter.exec(params, &mut ext)).unwrap()
|
test_finalize(interpreter.exec(params, &mut ext)).unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(gas_left, U256::from(99_982));
|
assert_eq!(gas_left, U256::from(96_678));
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test checks if the contract deserializes payload header properly.
|
// This test checks if the contract deserializes payload header properly.
|
||||||
@ -112,7 +112,7 @@ fn logger() {
|
|||||||
U256::from(1_000_000_000),
|
U256::from(1_000_000_000),
|
||||||
"Logger sets 0x04 key to the trasferred value"
|
"Logger sets 0x04 key to the trasferred value"
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(19_147));
|
assert_eq!(gas_left, U256::from(15_860));
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test checks if the contract can allocate memory and pass pointer to the result stream properly.
|
// This test checks if the contract can allocate memory and pass pointer to the result stream properly.
|
||||||
@ -147,7 +147,7 @@ fn identity() {
|
|||||||
sender,
|
sender,
|
||||||
"Idenity test contract does not return the sender passed"
|
"Idenity test contract does not return the sender passed"
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(99_844));
|
assert_eq!(gas_left, U256::from(96_540));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dispersion test sends byte array and expect the contract to 'disperse' the original elements with
|
// Dispersion test sends byte array and expect the contract to 'disperse' the original elements with
|
||||||
@ -180,7 +180,7 @@ fn dispersion() {
|
|||||||
result,
|
result,
|
||||||
vec![0u8, 0, 125, 11, 197, 7, 255, 8, 19, 0]
|
vec![0u8, 0, 125, 11, 197, 7, 255, 8, 19, 0]
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(96_393));
|
assert_eq!(gas_left, U256::from(96_116));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -208,7 +208,7 @@ fn suicide_not() {
|
|||||||
result,
|
result,
|
||||||
vec![0u8]
|
vec![0u8]
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(96_725));
|
assert_eq!(gas_left, U256::from(96_461));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -240,7 +240,7 @@ fn suicide() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert!(ext.suicides.contains(&refund));
|
assert!(ext.suicides.contains(&refund));
|
||||||
assert_eq!(gas_left, U256::from(96_687));
|
assert_eq!(gas_left, U256::from(96_429));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -270,7 +270,7 @@ fn create() {
|
|||||||
assert!(ext.calls.contains(
|
assert!(ext.calls.contains(
|
||||||
&FakeCall {
|
&FakeCall {
|
||||||
call_type: FakeCallType::Create,
|
call_type: FakeCallType::Create,
|
||||||
gas: U256::from(65_899),
|
gas: U256::from(62_545),
|
||||||
sender_address: None,
|
sender_address: None,
|
||||||
receive_address: None,
|
receive_address: None,
|
||||||
value: Some(1_000_000_000.into()),
|
value: Some(1_000_000_000.into()),
|
||||||
@ -278,9 +278,52 @@ fn create() {
|
|||||||
code_address: None,
|
code_address: None,
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
assert_eq!(gas_left, U256::from(65_892));
|
assert_eq!(gas_left, U256::from(62_538));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn call_msg() {
|
||||||
|
::ethcore_logger::init_log();
|
||||||
|
|
||||||
|
let sender: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap();
|
||||||
|
let receiver: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap();
|
||||||
|
let contract_address: Address = "0d461d4174b4ae35775c4a342f1e5e1e4e6c4db5".parse().unwrap();
|
||||||
|
|
||||||
|
let mut params = ActionParams::default();
|
||||||
|
params.sender = sender.clone();
|
||||||
|
params.address = receiver.clone();
|
||||||
|
params.code_address = contract_address.clone();
|
||||||
|
params.gas = U256::from(100_000);
|
||||||
|
params.code = Some(Arc::new(load_sample!("call.wasm")));
|
||||||
|
params.data = Some(Vec::new());
|
||||||
|
|
||||||
|
let mut ext = FakeExt::new();
|
||||||
|
ext.balances.insert(receiver.clone(), U256::from(10000000000u64));
|
||||||
|
|
||||||
|
let gas_left = {
|
||||||
|
let mut interpreter = wasm_interpreter();
|
||||||
|
let result = interpreter.exec(params, &mut ext).expect("Interpreter to execute without any errors");
|
||||||
|
match result {
|
||||||
|
GasLeft::Known(gas_left) => gas_left,
|
||||||
|
GasLeft::NeedsReturn { .. } => { panic!("Call test should not return payload"); },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
trace!(target: "wasm", "fake_calls: {:?}", &ext.calls);
|
||||||
|
assert!(ext.calls.contains(
|
||||||
|
&FakeCall {
|
||||||
|
call_type: FakeCallType::Call,
|
||||||
|
gas: U256::from(33_000),
|
||||||
|
sender_address: Some(receiver),
|
||||||
|
receive_address: Some(Address::from([99, 88, 77, 66, 55, 44, 33, 22, 11, 0, 11, 22, 33, 44, 55, 66, 77, 88, 99, 0])),
|
||||||
|
value: Some(1000000000.into()),
|
||||||
|
data: vec![129u8, 123, 113, 107, 101, 97],
|
||||||
|
code_address: Some(Address::from([99, 88, 77, 66, 55, 44, 33, 22, 11, 0, 11, 22, 33, 44, 55, 66, 77, 88, 99, 0])),
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
|
assert_eq!(gas_left, U256::from(95_699));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn call_code() {
|
fn call_code() {
|
||||||
@ -312,7 +355,7 @@ fn call_code() {
|
|||||||
assert!(ext.calls.contains(
|
assert!(ext.calls.contains(
|
||||||
&FakeCall {
|
&FakeCall {
|
||||||
call_type: FakeCallType::Call,
|
call_type: FakeCallType::Call,
|
||||||
gas: U256::from(98_713),
|
gas: U256::from(20_000),
|
||||||
sender_address: Some(sender),
|
sender_address: Some(sender),
|
||||||
receive_address: Some(receiver),
|
receive_address: Some(receiver),
|
||||||
value: None,
|
value: None,
|
||||||
@ -324,7 +367,7 @@ fn call_code() {
|
|||||||
// siphash result
|
// siphash result
|
||||||
let res = LittleEndian::read_u32(&result[..]);
|
let res = LittleEndian::read_u32(&result[..]);
|
||||||
assert_eq!(res, 4198595614);
|
assert_eq!(res, 4198595614);
|
||||||
assert_eq!(gas_left, U256::from(93_855));
|
assert_eq!(gas_left, U256::from(90_550));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -333,6 +376,7 @@ fn call_static() {
|
|||||||
|
|
||||||
let sender: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap();
|
let sender: Address = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6".parse().unwrap();
|
||||||
let receiver: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap();
|
let receiver: Address = "01030507090b0d0f11131517191b1d1f21232527".parse().unwrap();
|
||||||
|
let contract_address: Address = "0d461d4174b4ae35775c4a342f1e5e1e4e6c4db5".parse().unwrap();
|
||||||
|
|
||||||
let mut params = ActionParams::default();
|
let mut params = ActionParams::default();
|
||||||
params.sender = sender.clone();
|
params.sender = sender.clone();
|
||||||
@ -341,6 +385,7 @@ fn call_static() {
|
|||||||
params.code = Some(Arc::new(load_sample!("call_static.wasm")));
|
params.code = Some(Arc::new(load_sample!("call_static.wasm")));
|
||||||
params.data = Some(Vec::new());
|
params.data = Some(Vec::new());
|
||||||
params.value = ActionValue::transfer(1_000_000_000);
|
params.value = ActionValue::transfer(1_000_000_000);
|
||||||
|
params.code_address = contract_address.clone();
|
||||||
|
|
||||||
let mut ext = FakeExt::new();
|
let mut ext = FakeExt::new();
|
||||||
|
|
||||||
@ -357,9 +402,9 @@ fn call_static() {
|
|||||||
assert!(ext.calls.contains(
|
assert!(ext.calls.contains(
|
||||||
&FakeCall {
|
&FakeCall {
|
||||||
call_type: FakeCallType::Call,
|
call_type: FakeCallType::Call,
|
||||||
gas: U256::from(98_713),
|
gas: U256::from(20_000),
|
||||||
sender_address: Some(sender),
|
sender_address: Some(receiver),
|
||||||
receive_address: Some(receiver),
|
receive_address: Some("13077bfb00000000000000000000000000000000".parse().unwrap()),
|
||||||
value: None,
|
value: None,
|
||||||
data: vec![1u8, 2, 3, 5, 7, 11],
|
data: vec![1u8, 2, 3, 5, 7, 11],
|
||||||
code_address: Some("13077bfb00000000000000000000000000000000".parse().unwrap()),
|
code_address: Some("13077bfb00000000000000000000000000000000".parse().unwrap()),
|
||||||
@ -370,7 +415,7 @@ fn call_static() {
|
|||||||
let res = LittleEndian::read_u32(&result[..]);
|
let res = LittleEndian::read_u32(&result[..]);
|
||||||
assert_eq!(res, 317632590);
|
assert_eq!(res, 317632590);
|
||||||
|
|
||||||
assert_eq!(gas_left, U256::from(93_855));
|
assert_eq!(gas_left, U256::from(90_550));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Realloc test
|
// Realloc test
|
||||||
@ -393,7 +438,7 @@ fn realloc() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
assert_eq!(result, vec![0u8; 2]);
|
assert_eq!(result, vec![0u8; 2]);
|
||||||
assert_eq!(gas_left, U256::from(96_723));
|
assert_eq!(gas_left, U256::from(96_445));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests that contract's ability to read from a storage
|
// Tests that contract's ability to read from a storage
|
||||||
@ -419,7 +464,7 @@ fn storage_read() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(Address::from(&result[12..32]), address);
|
assert_eq!(Address::from(&result[12..32]), address);
|
||||||
assert_eq!(gas_left, U256::from(99_767));
|
assert_eq!(gas_left, U256::from(96_463));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tests keccak calculation
|
// Tests keccak calculation
|
||||||
@ -445,7 +490,7 @@ fn keccak() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87"));
|
assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87"));
|
||||||
assert_eq!(gas_left, U256::from(81_446));
|
assert_eq!(gas_left, U256::from(81_067));
|
||||||
}
|
}
|
||||||
|
|
||||||
// memcpy test.
|
// memcpy test.
|
||||||
@ -477,7 +522,7 @@ fn memcpy() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(result, test_payload);
|
assert_eq!(result, test_payload);
|
||||||
assert_eq!(gas_left, U256::from(72_216));
|
assert_eq!(gas_left, U256::from(71_940));
|
||||||
}
|
}
|
||||||
|
|
||||||
// memmove test.
|
// memmove test.
|
||||||
@ -509,7 +554,7 @@ fn memmove() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(result, test_payload);
|
assert_eq!(result, test_payload);
|
||||||
assert_eq!(gas_left, U256::from(72_216));
|
assert_eq!(gas_left, U256::from(71_940));
|
||||||
}
|
}
|
||||||
|
|
||||||
// memset test
|
// memset test
|
||||||
@ -534,7 +579,7 @@ fn memset() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(result, vec![228u8; 8192]);
|
assert_eq!(result, vec![228u8; 8192]);
|
||||||
assert_eq!(gas_left, U256::from(72_196));
|
assert_eq!(gas_left, U256::from(71_921));
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! reqrep_test {
|
macro_rules! reqrep_test {
|
||||||
@ -591,7 +636,7 @@ fn math_add() {
|
|||||||
U256::from_dec_str("1888888888888888888888888888887").unwrap(),
|
U256::from_dec_str("1888888888888888888888888888887").unwrap(),
|
||||||
(&result[..]).into()
|
(&result[..]).into()
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(95_524));
|
assert_eq!(gas_left, U256::from(95_384));
|
||||||
}
|
}
|
||||||
|
|
||||||
// multiplication
|
// multiplication
|
||||||
@ -613,7 +658,7 @@ fn math_mul() {
|
|||||||
U256::from_dec_str("888888888888888888888888888887111111111111111111111111111112").unwrap(),
|
U256::from_dec_str("888888888888888888888888888887111111111111111111111111111112").unwrap(),
|
||||||
(&result[..]).into()
|
(&result[..]).into()
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(94_674));
|
assert_eq!(gas_left, U256::from(94_374));
|
||||||
}
|
}
|
||||||
|
|
||||||
// subtraction
|
// subtraction
|
||||||
@ -635,7 +680,7 @@ fn math_sub() {
|
|||||||
U256::from_dec_str("111111111111111111111111111111").unwrap(),
|
U256::from_dec_str("111111111111111111111111111111").unwrap(),
|
||||||
(&result[..]).into()
|
(&result[..]).into()
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(95_516));
|
assert_eq!(gas_left, U256::from(95_372));
|
||||||
}
|
}
|
||||||
|
|
||||||
// subtraction with overflow
|
// subtraction with overflow
|
||||||
@ -677,7 +722,7 @@ fn math_div() {
|
|||||||
U256::from_dec_str("1125000").unwrap(),
|
U256::from_dec_str("1125000").unwrap(),
|
||||||
(&result[..]).into()
|
(&result[..]).into()
|
||||||
);
|
);
|
||||||
assert_eq!(gas_left, U256::from(88_514));
|
assert_eq!(gas_left, U256::from(88_356));
|
||||||
}
|
}
|
||||||
|
|
||||||
// This test checks the ability of wasm contract to invoke
|
// This test checks the ability of wasm contract to invoke
|
||||||
@ -765,7 +810,7 @@ fn externs() {
|
|||||||
"Gas limit requested and returned does not match"
|
"Gas limit requested and returned does not match"
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(gas_left, U256::from(94_858));
|
assert_eq!(gas_left, U256::from(95_321));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -791,7 +836,7 @@ fn embedded_keccak() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87"));
|
assert_eq!(H256::from_slice(&result), H256::from("68371d7e884c168ae2022c82bd837d51837718a7f7dfb7aa3f753074a35e1d87"));
|
||||||
assert_eq!(gas_left, U256::from(81_446));
|
assert_eq!(gas_left, U256::from(81_067));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This test checks the correctness of log extern
|
/// This test checks the correctness of log extern
|
||||||
@ -826,5 +871,5 @@ fn events() {
|
|||||||
assert_eq!(&log_entry.data, b"gnihtemos");
|
assert_eq!(&log_entry.data, b"gnihtemos");
|
||||||
|
|
||||||
assert_eq!(&result, b"gnihtemos");
|
assert_eq!(&result, b"gnihtemos");
|
||||||
assert_eq!(gas_left, U256::from(79_637));
|
assert_eq!(gas_left, U256::from(79_206));
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,6 @@ pub mod aes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// ECDH functions
|
/// ECDH functions
|
||||||
#[cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
pub mod ecdh {
|
pub mod ecdh {
|
||||||
use secp256k1::{ecdh, key, Error as SecpError};
|
use secp256k1::{ecdh, key, Error as SecpError};
|
||||||
use ethkey::{Secret, Public, SECP256K1};
|
use ethkey::{Secret, Public, SECP256K1};
|
||||||
@ -199,7 +198,6 @@ pub mod ecdh {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// ECIES function
|
/// ECIES function
|
||||||
#[cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
pub mod ecies {
|
pub mod ecies {
|
||||||
use rcrypto::digest::Digest;
|
use rcrypto::digest::Digest;
|
||||||
use rcrypto::sha2::Sha256;
|
use rcrypto::sha2::Sha256;
|
||||||
|
@ -29,8 +29,6 @@ use presale::PresaleWallet;
|
|||||||
use json::{self, Uuid, OpaqueKeyFile};
|
use json::{self, Uuid, OpaqueKeyFile};
|
||||||
use {import, Error, SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation, OpaqueSecret};
|
use {import, Error, SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation, OpaqueSecret};
|
||||||
|
|
||||||
const REFRESH_TIME_SEC: u64 = 5;
|
|
||||||
|
|
||||||
/// Accounts store.
|
/// Accounts store.
|
||||||
pub struct EthStore {
|
pub struct EthStore {
|
||||||
store: EthMultiStore,
|
store: EthMultiStore,
|
||||||
@ -49,6 +47,16 @@ impl EthStore {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Modify account refresh timeout - how often they are re-read from `KeyDirectory`.
|
||||||
|
///
|
||||||
|
/// Setting this to low values (or 0) will cause new accounts to be picked up quickly,
|
||||||
|
/// although it may induce heavy disk reads and is not recommended if you manage many keys (say over 10k).
|
||||||
|
///
|
||||||
|
/// By default refreshing is disabled, so only accounts created using this instance of `EthStore` are taken into account.
|
||||||
|
pub fn set_refresh_time(&self, time: Duration) {
|
||||||
|
self.store.set_refresh_time(time)
|
||||||
|
}
|
||||||
|
|
||||||
fn get(&self, account: &StoreAccountRef) -> Result<SafeAccount, Error> {
|
fn get(&self, account: &StoreAccountRef) -> Result<SafeAccount, Error> {
|
||||||
let mut accounts = self.store.get_accounts(account)?.into_iter();
|
let mut accounts = self.store.get_accounts(account)?.into_iter();
|
||||||
accounts.next().ok_or(Error::InvalidAccount)
|
accounts.next().ok_or(Error::InvalidAccount)
|
||||||
@ -254,6 +262,7 @@ pub struct EthMultiStore {
|
|||||||
struct Timestamp {
|
struct Timestamp {
|
||||||
dir_hash: Option<u64>,
|
dir_hash: Option<u64>,
|
||||||
last_checked: Instant,
|
last_checked: Instant,
|
||||||
|
refresh_time: Duration,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EthMultiStore {
|
impl EthMultiStore {
|
||||||
@ -272,16 +281,28 @@ impl EthMultiStore {
|
|||||||
timestamp: Mutex::new(Timestamp {
|
timestamp: Mutex::new(Timestamp {
|
||||||
dir_hash: None,
|
dir_hash: None,
|
||||||
last_checked: Instant::now(),
|
last_checked: Instant::now(),
|
||||||
|
// by default we never refresh accounts
|
||||||
|
refresh_time: Duration::from_secs(u64::max_value()),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
store.reload_accounts()?;
|
store.reload_accounts()?;
|
||||||
Ok(store)
|
Ok(store)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Modify account refresh timeout - how often they are re-read from `KeyDirectory`.
|
||||||
|
///
|
||||||
|
/// Setting this to low values (or 0) will cause new accounts to be picked up quickly,
|
||||||
|
/// although it may induce heavy disk reads and is not recommended if you manage many keys (say over 10k).
|
||||||
|
///
|
||||||
|
/// By default refreshing is disabled, so only accounts created using this instance of `EthStore` are taken into account.
|
||||||
|
pub fn set_refresh_time(&self, time: Duration) {
|
||||||
|
self.timestamp.lock().refresh_time = time;
|
||||||
|
}
|
||||||
|
|
||||||
fn reload_if_changed(&self) -> Result<(), Error> {
|
fn reload_if_changed(&self) -> Result<(), Error> {
|
||||||
let mut last_timestamp = self.timestamp.lock();
|
let mut last_timestamp = self.timestamp.lock();
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
if (now - last_timestamp.last_checked) > Duration::from_secs(REFRESH_TIME_SEC) {
|
if now - last_timestamp.last_checked > last_timestamp.refresh_time {
|
||||||
let dir_hash = Some(self.dir.unique_repr()?);
|
let dir_hash = Some(self.dir.unique_repr()?);
|
||||||
last_timestamp.last_checked = now;
|
last_timestamp.last_checked = now;
|
||||||
if last_timestamp.dir_hash == dir_hash {
|
if last_timestamp.dir_hash == dir_hash {
|
||||||
@ -319,22 +340,23 @@ impl EthMultiStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_accounts(&self, account: &StoreAccountRef) -> Result<Vec<SafeAccount>, Error> {
|
fn get_accounts(&self, account: &StoreAccountRef) -> Result<Vec<SafeAccount>, Error> {
|
||||||
{
|
let from_cache = |account| {
|
||||||
let cache = self.cache.read();
|
let cache = self.cache.read();
|
||||||
if let Some(accounts) = cache.get(account) {
|
if let Some(accounts) = cache.get(account) {
|
||||||
if !accounts.is_empty() {
|
if !accounts.is_empty() {
|
||||||
return Ok(accounts.clone())
|
return Some(accounts.clone())
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
|
match from_cache(account) {
|
||||||
|
Some(accounts) => Ok(accounts),
|
||||||
|
None => {
|
||||||
self.reload_if_changed()?;
|
self.reload_if_changed()?;
|
||||||
let cache = self.cache.read();
|
from_cache(account).ok_or(Error::InvalidAccount)
|
||||||
let accounts = cache.get(account).ok_or(Error::InvalidAccount)?;
|
}
|
||||||
if accounts.is_empty() {
|
|
||||||
Err(Error::InvalidAccount)
|
|
||||||
} else {
|
|
||||||
Ok(accounts.clone())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,11 +492,20 @@ impl SimpleSecretStore for EthMultiStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn account_ref(&self, address: &Address) -> Result<StoreAccountRef, Error> {
|
fn account_ref(&self, address: &Address) -> Result<StoreAccountRef, Error> {
|
||||||
|
let read_from_cache = |address: &Address| {
|
||||||
use std::collections::Bound;
|
use std::collections::Bound;
|
||||||
self.reload_if_changed()?;
|
|
||||||
let cache = self.cache.read();
|
let cache = self.cache.read();
|
||||||
let mut r = cache.range((Bound::Included(*address), Bound::Included(*address)));
|
let mut r = cache.range((Bound::Included(*address), Bound::Included(*address)));
|
||||||
r.next().ok_or(Error::InvalidAccount).map(|(k, _)| k.clone())
|
r.next().map(|(k, _)| k.clone())
|
||||||
|
};
|
||||||
|
|
||||||
|
match read_from_cache(address) {
|
||||||
|
Some(account) => Ok(account),
|
||||||
|
None => {
|
||||||
|
self.reload_if_changed()?;
|
||||||
|
read_from_cache(address).ok_or(Error::InvalidAccount)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn accounts(&self) -> Result<Vec<StoreAccountRef>, Error> {
|
fn accounts(&self) -> Result<Vec<StoreAccountRef>, Error> {
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
background-color: rgba(0, 0, 0, 0.8);
|
background-color: rgba(0, 0, 0, 0.8);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
transition: transform ease-out 0.1s;
|
transition: transform ease-out 0.1s;
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
|
@ -105,9 +105,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inputContainer {
|
.inputContainer {
|
||||||
display: flex;
|
justify-content: flex-start;
|
||||||
flex-direction: column;
|
|
||||||
flex: 1;
|
|
||||||
|
|
||||||
.input {
|
.input {
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
@ -134,8 +132,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.category {
|
.category {
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
margin: 0 0.5em;
|
margin: 0 0.5em;
|
||||||
max-width: 35em;
|
max-width: 35em;
|
||||||
|
|
||||||
@ -149,12 +145,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cards {
|
.cards {
|
||||||
flex: 1;
|
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
margin: 1em 0;
|
margin: 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,7 +335,7 @@ class AddressSelect extends Component {
|
|||||||
|
|
||||||
content = (
|
content = (
|
||||||
<div className={ styles.cards }>
|
<div className={ styles.cards }>
|
||||||
<div>{ cards }</div>
|
{ cards }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -82,10 +82,9 @@ $popoverZ: 3600;
|
|||||||
/* but may well be) will scretch to non-visible areas.
|
/* but may well be) will scretch to non-visible areas.
|
||||||
*/
|
*/
|
||||||
&.small {
|
&.small {
|
||||||
margin: 1.5em auto;
|
left: 50%;
|
||||||
max-width: 768px;
|
margin: 1.5em -384px;
|
||||||
position: relative;
|
width: 768px;
|
||||||
width: 75%;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
@ -29,7 +28,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
2
js/package-lock.json
generated
2
js/package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Parity",
|
"name": "Parity",
|
||||||
"version": "1.9.39",
|
"version": "1.9.40",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Parity",
|
"name": "Parity",
|
||||||
"version": "1.9.39",
|
"version": "1.9.40",
|
||||||
"main": "src/index.parity.js",
|
"main": "src/index.parity.js",
|
||||||
"jsnext:main": "src/index.parity.js",
|
"jsnext:main": "src/index.parity.js",
|
||||||
"author": "Parity Team <admin@parity.io>",
|
"author": "Parity Team <admin@parity.io>",
|
||||||
|
@ -9,5 +9,4 @@ rustc-hex = "1.0"
|
|||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ use super::ValidatorSet;
|
|||||||
/// Authority params deserialization.
|
/// Authority params deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
pub struct AuthorityRoundParams {
|
pub struct AuthorityRoundParams {
|
||||||
/// Block duration.
|
/// Block duration, in seconds.
|
||||||
#[serde(rename="stepDuration")]
|
#[serde(rename="stepDuration")]
|
||||||
pub step_duration: Uint,
|
pub step_duration: Uint,
|
||||||
/// Valid authorities
|
/// Valid authorities
|
||||||
|
@ -335,6 +335,10 @@ usage! {
|
|||||||
"--keys-iterations=[NUM]",
|
"--keys-iterations=[NUM]",
|
||||||
"Specify the number of iterations to use when deriving key from the password (bigger is more secure)",
|
"Specify the number of iterations to use when deriving key from the password (bigger is more secure)",
|
||||||
|
|
||||||
|
ARG arg_accounts_refresh: (u64) = 5u64, or |c: &Config| otry!(c.account).refresh_time.clone(),
|
||||||
|
"--accounts-refresh=[TIME]",
|
||||||
|
"Specify the cache time of accounts read from disk. If you manage thousands of accounts set this to 0 to disable refresh.",
|
||||||
|
|
||||||
ARG arg_unlock: (Option<String>) = None, or |c: &Config| otry!(c.account).unlock.as_ref().map(|vec| vec.join(",")),
|
ARG arg_unlock: (Option<String>) = None, or |c: &Config| otry!(c.account).unlock.as_ref().map(|vec| vec.join(",")),
|
||||||
"--unlock=[ACCOUNTS]",
|
"--unlock=[ACCOUNTS]",
|
||||||
"Unlock ACCOUNTS for the duration of the execution. ACCOUNTS is a comma-delimited list of addresses. Implies --no-ui.",
|
"Unlock ACCOUNTS for the duration of the execution. ACCOUNTS is a comma-delimited list of addresses. Implies --no-ui.",
|
||||||
@ -462,9 +466,9 @@ usage! {
|
|||||||
"--jsonrpc-threads=[THREADS]",
|
"--jsonrpc-threads=[THREADS]",
|
||||||
"Turn on additional processing threads in all RPC servers. Setting this to non-zero value allows parallel cpu-heavy queries execution.",
|
"Turn on additional processing threads in all RPC servers. Setting this to non-zero value allows parallel cpu-heavy queries execution.",
|
||||||
|
|
||||||
ARG arg_jsonrpc_cors: (Option<String>) = None, or |c: &Config| otry!(c.rpc).cors.clone(),
|
ARG arg_jsonrpc_cors: (String) = "none", or |c: &Config| otry!(c.rpc).cors.as_ref().map(|vec| vec.join(",")),
|
||||||
"--jsonrpc-cors=[URL]",
|
"--jsonrpc-cors=[URL]",
|
||||||
"Specify CORS header for JSON-RPC API responses.",
|
"Specify CORS header for JSON-RPC API responses. Special options: \"all\", \"none\".",
|
||||||
|
|
||||||
ARG arg_jsonrpc_server_threads: (Option<usize>) = None, or |c: &Config| otry!(c.rpc).server_threads,
|
ARG arg_jsonrpc_server_threads: (Option<usize>) = None, or |c: &Config| otry!(c.rpc).server_threads,
|
||||||
"--jsonrpc-server-threads=[NUM]",
|
"--jsonrpc-server-threads=[NUM]",
|
||||||
@ -534,9 +538,9 @@ usage! {
|
|||||||
"--ipfs-api-hosts=[HOSTS]",
|
"--ipfs-api-hosts=[HOSTS]",
|
||||||
"List of allowed Host header values. This option will validate the Host header sent by the browser, it is additional security against some attack vectors. Special options: \"all\", \"none\".",
|
"List of allowed Host header values. This option will validate the Host header sent by the browser, it is additional security against some attack vectors. Special options: \"all\", \"none\".",
|
||||||
|
|
||||||
ARG arg_ipfs_api_cors: (Option<String>) = None, or |c: &Config| otry!(c.ipfs).cors.clone(),
|
ARG arg_ipfs_api_cors: (String) = "none", or |c: &Config| otry!(c.ipfs).cors.as_ref().map(|vec| vec.join(",")),
|
||||||
"--ipfs-api-cors=[URL]",
|
"--ipfs-api-cors=[URL]",
|
||||||
"Specify CORS header for IPFS API responses.",
|
"Specify CORS header for IPFS API responses. Special options: \"all\", \"none\".",
|
||||||
|
|
||||||
["Secret store options"]
|
["Secret store options"]
|
||||||
FLAG flag_no_secretstore: (bool) = false, or |c: &Config| otry!(c.secretstore).disable.clone(),
|
FLAG flag_no_secretstore: (bool) = false, or |c: &Config| otry!(c.secretstore).disable.clone(),
|
||||||
@ -1009,6 +1013,7 @@ struct Account {
|
|||||||
unlock: Option<Vec<String>>,
|
unlock: Option<Vec<String>>,
|
||||||
password: Option<Vec<String>>,
|
password: Option<Vec<String>>,
|
||||||
keys_iterations: Option<u32>,
|
keys_iterations: Option<u32>,
|
||||||
|
refresh_time: Option<u64>,
|
||||||
disable_hardware: Option<bool>,
|
disable_hardware: Option<bool>,
|
||||||
fast_unlock: Option<bool>,
|
fast_unlock: Option<bool>,
|
||||||
}
|
}
|
||||||
@ -1047,7 +1052,7 @@ struct Rpc {
|
|||||||
disable: Option<bool>,
|
disable: Option<bool>,
|
||||||
port: Option<u16>,
|
port: Option<u16>,
|
||||||
interface: Option<String>,
|
interface: Option<String>,
|
||||||
cors: Option<String>,
|
cors: Option<Vec<String>>,
|
||||||
apis: Option<Vec<String>>,
|
apis: Option<Vec<String>>,
|
||||||
hosts: Option<Vec<String>>,
|
hosts: Option<Vec<String>>,
|
||||||
server_threads: Option<usize>,
|
server_threads: Option<usize>,
|
||||||
@ -1103,7 +1108,7 @@ struct Ipfs {
|
|||||||
enable: Option<bool>,
|
enable: Option<bool>,
|
||||||
port: Option<u16>,
|
port: Option<u16>,
|
||||||
interface: Option<String>,
|
interface: Option<String>,
|
||||||
cors: Option<String>,
|
cors: Option<Vec<String>>,
|
||||||
hosts: Option<Vec<String>>,
|
hosts: Option<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1428,6 +1433,7 @@ mod tests {
|
|||||||
arg_unlock: Some("0xdeadbeefcafe0000000000000000000000000000".into()),
|
arg_unlock: Some("0xdeadbeefcafe0000000000000000000000000000".into()),
|
||||||
arg_password: vec!["~/.safe/password.file".into()],
|
arg_password: vec!["~/.safe/password.file".into()],
|
||||||
arg_keys_iterations: 10240u32,
|
arg_keys_iterations: 10240u32,
|
||||||
|
arg_accounts_refresh: 5u64,
|
||||||
flag_no_hardware_wallets: false,
|
flag_no_hardware_wallets: false,
|
||||||
flag_fast_unlock: false,
|
flag_fast_unlock: false,
|
||||||
|
|
||||||
@ -1462,7 +1468,7 @@ mod tests {
|
|||||||
flag_no_jsonrpc: false,
|
flag_no_jsonrpc: false,
|
||||||
arg_jsonrpc_port: 8545u16,
|
arg_jsonrpc_port: 8545u16,
|
||||||
arg_jsonrpc_interface: "local".into(),
|
arg_jsonrpc_interface: "local".into(),
|
||||||
arg_jsonrpc_cors: Some("null".into()),
|
arg_jsonrpc_cors: "null".into(),
|
||||||
arg_jsonrpc_apis: "web3,eth,net,parity,traces,rpc,secretstore".into(),
|
arg_jsonrpc_apis: "web3,eth,net,parity,traces,rpc,secretstore".into(),
|
||||||
arg_jsonrpc_hosts: "none".into(),
|
arg_jsonrpc_hosts: "none".into(),
|
||||||
arg_jsonrpc_server_threads: None,
|
arg_jsonrpc_server_threads: None,
|
||||||
@ -1501,7 +1507,7 @@ mod tests {
|
|||||||
flag_ipfs_api: false,
|
flag_ipfs_api: false,
|
||||||
arg_ipfs_api_port: 5001u16,
|
arg_ipfs_api_port: 5001u16,
|
||||||
arg_ipfs_api_interface: "local".into(),
|
arg_ipfs_api_interface: "local".into(),
|
||||||
arg_ipfs_api_cors: Some("null".into()),
|
arg_ipfs_api_cors: "null".into(),
|
||||||
arg_ipfs_api_hosts: "none".into(),
|
arg_ipfs_api_hosts: "none".into(),
|
||||||
|
|
||||||
// -- Sealing/Mining Options
|
// -- Sealing/Mining Options
|
||||||
@ -1665,6 +1671,7 @@ mod tests {
|
|||||||
unlock: Some(vec!["0x1".into(), "0x2".into(), "0x3".into()]),
|
unlock: Some(vec!["0x1".into(), "0x2".into(), "0x3".into()]),
|
||||||
password: Some(vec!["passwdfile path".into()]),
|
password: Some(vec!["passwdfile path".into()]),
|
||||||
keys_iterations: None,
|
keys_iterations: None,
|
||||||
|
refresh_time: None,
|
||||||
disable_hardware: None,
|
disable_hardware: None,
|
||||||
fast_unlock: None,
|
fast_unlock: None,
|
||||||
}),
|
}),
|
||||||
|
@ -49,7 +49,7 @@ reserved_peers = "./path_to_file"
|
|||||||
disable = false
|
disable = false
|
||||||
port = 8545
|
port = 8545
|
||||||
interface = "local"
|
interface = "local"
|
||||||
cors = "null"
|
cors = ["null"]
|
||||||
apis = ["web3", "eth", "net", "parity", "traces", "rpc", "secretstore"]
|
apis = ["web3", "eth", "net", "parity", "traces", "rpc", "secretstore"]
|
||||||
hosts = ["none"]
|
hosts = ["none"]
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ path = "$HOME/.parity/secretstore"
|
|||||||
enable = false
|
enable = false
|
||||||
port = 5001
|
port = 5001
|
||||||
interface = "local"
|
interface = "local"
|
||||||
cors = "null"
|
cors = ["null"]
|
||||||
hosts = ["none"]
|
hosts = ["none"]
|
||||||
|
|
||||||
[mining]
|
[mining]
|
||||||
|
@ -152,7 +152,7 @@ macro_rules! usage {
|
|||||||
use toml;
|
use toml;
|
||||||
use std::{fs, io, process};
|
use std::{fs, io, process};
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use util::version;
|
use parity_version::version;
|
||||||
use clap::{Arg, App, SubCommand, AppSettings, ArgMatches as ClapArgMatches, Error as ClapError, ErrorKind as ClapErrorKind};
|
use clap::{Arg, App, SubCommand, AppSettings, ArgMatches as ClapArgMatches, Error as ClapError, ErrorKind as ClapErrorKind};
|
||||||
use helpers::replace_home;
|
use helpers::replace_home;
|
||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
|
@ -25,7 +25,8 @@ use cli::{Args, ArgsError};
|
|||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use bigint::prelude::U256;
|
use bigint::prelude::U256;
|
||||||
use bigint::hash::H256;
|
use bigint::hash::H256;
|
||||||
use util::{version_data, Address, version};
|
use util::Address;
|
||||||
|
use parity_version::{version_data, version};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use ansi_term::Colour;
|
use ansi_term::Colour;
|
||||||
use ethsync::{NetworkConfiguration, validate_node_url, self};
|
use ethsync::{NetworkConfiguration, validate_node_url, self};
|
||||||
@ -484,6 +485,7 @@ impl Configuration {
|
|||||||
fn accounts_config(&self) -> Result<AccountsConfig, String> {
|
fn accounts_config(&self) -> Result<AccountsConfig, String> {
|
||||||
let cfg = AccountsConfig {
|
let cfg = AccountsConfig {
|
||||||
iterations: self.args.arg_keys_iterations,
|
iterations: self.args.arg_keys_iterations,
|
||||||
|
refresh_time: self.args.arg_accounts_refresh,
|
||||||
testnet: self.args.flag_testnet,
|
testnet: self.args.flag_testnet,
|
||||||
password_files: self.args.arg_password.clone(),
|
password_files: self.args.arg_password.clone(),
|
||||||
unlocked_accounts: to_addresses(&self.args.arg_unlock)?,
|
unlocked_accounts: to_addresses(&self.args.arg_unlock)?,
|
||||||
@ -773,13 +775,19 @@ impl Configuration {
|
|||||||
apis.join(",")
|
apis.join(",")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cors(cors: Option<&String>) -> Option<Vec<String>> {
|
fn cors(cors: &str) -> Option<Vec<String>> {
|
||||||
cors.map(|ref c| c.split(',').map(Into::into).collect())
|
match cors {
|
||||||
|
"none" => return Some(Vec::new()),
|
||||||
|
"*" | "all" | "any" => return None,
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(cors.split(',').map(Into::into).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rpc_cors(&self) -> Option<Vec<String>> {
|
fn rpc_cors(&self) -> Option<Vec<String>> {
|
||||||
let cors = self.args.arg_jsonrpc_cors.as_ref().or(self.args.arg_rpccorsdomain.as_ref());
|
let cors = self.args.arg_rpccorsdomain.clone().unwrap_or_else(|| self.args.arg_jsonrpc_cors.to_owned());
|
||||||
Self::cors(cors)
|
Self::cors(&cors)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ipfs_cors(&self) -> Option<Vec<String>> {
|
fn ipfs_cors(&self) -> Option<Vec<String>> {
|
||||||
@ -1456,7 +1464,7 @@ mod tests {
|
|||||||
assert_eq!(net.rpc_enabled, true);
|
assert_eq!(net.rpc_enabled, true);
|
||||||
assert_eq!(net.rpc_interface, "0.0.0.0".to_owned());
|
assert_eq!(net.rpc_interface, "0.0.0.0".to_owned());
|
||||||
assert_eq!(net.rpc_port, 8000);
|
assert_eq!(net.rpc_port, 8000);
|
||||||
assert_eq!(conf.rpc_cors(), Some(vec!["*".to_owned()]));
|
assert_eq!(conf.rpc_cors(), None);
|
||||||
assert_eq!(conf.rpc_apis(), "web3,eth".to_owned());
|
assert_eq!(conf.rpc_apis(), "web3,eth".to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1523,8 +1531,8 @@ mod tests {
|
|||||||
let conf2 = parse(&["parity", "--ipfs-api-cors", "http://parity.io,http://something.io"]);
|
let conf2 = parse(&["parity", "--ipfs-api-cors", "http://parity.io,http://something.io"]);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assert_eq!(conf0.ipfs_cors(), None);
|
assert_eq!(conf0.ipfs_cors(), Some(vec![]));
|
||||||
assert_eq!(conf1.ipfs_cors(), Some(vec!["*".into()]));
|
assert_eq!(conf1.ipfs_cors(), None);
|
||||||
assert_eq!(conf2.ipfs_cors(), Some(vec!["http://parity.io".into(),"http://something.io".into()]));
|
assert_eq!(conf2.ipfs_cors(), Some(vec!["http://parity.io".into(),"http://something.io".into()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,11 +213,10 @@ pub fn default_network_config() -> ::ethsync::NetworkConfiguration {
|
|||||||
ip_filter: IpFilter::default(),
|
ip_filter: IpFilter::default(),
|
||||||
reserved_nodes: Vec::new(),
|
reserved_nodes: Vec::new(),
|
||||||
allow_non_reserved: true,
|
allow_non_reserved: true,
|
||||||
client_version: ::util::version(),
|
client_version: ::parity_version::version(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "dev", allow(too_many_arguments))]
|
|
||||||
pub fn to_client_config(
|
pub fn to_client_config(
|
||||||
cache_config: &CacheConfig,
|
cache_config: &CacheConfig,
|
||||||
spec_name: String,
|
spec_name: String,
|
||||||
@ -453,7 +452,6 @@ but the first password is trimmed
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature = "dev", allow(float_cmp))]
|
|
||||||
fn test_to_price() {
|
fn test_to_price() {
|
||||||
assert_eq!(to_price("1").unwrap(), 1.0);
|
assert_eq!(to_price("1").unwrap(), 1.0);
|
||||||
assert_eq!(to_price("2.3").unwrap(), 2.3);
|
assert_eq!(to_price("2.3").unwrap(), 2.3);
|
||||||
|
@ -252,7 +252,6 @@ impl<T: InformantData> Informant<T> {
|
|||||||
self.in_shutdown.store(true, ::std::sync::atomic::Ordering::SeqCst);
|
self.in_shutdown.store(true, ::std::sync::atomic::Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(match_bool))]
|
|
||||||
pub fn tick(&self) {
|
pub fn tick(&self) {
|
||||||
let elapsed = self.last_tick.read().elapsed();
|
let elapsed = self.last_tick.read().elapsed();
|
||||||
if elapsed < Duration::from_secs(5) {
|
if elapsed < Duration::from_secs(5) {
|
||||||
|
@ -34,8 +34,8 @@ impl Default for Configuration {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
port: 5001,
|
port: 5001,
|
||||||
interface: "127.0.0.1".into(),
|
interface: "127.0.0.1".into(),
|
||||||
cors: None,
|
cors: Some(vec![]),
|
||||||
hosts: Some(Vec::new()),
|
hosts: Some(vec![]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,6 @@
|
|||||||
//! Ethcore client application.
|
//! Ethcore client application.
|
||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="dev", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="dev", plugin(clippy))]
|
|
||||||
#![cfg_attr(feature="dev", allow(useless_format))]
|
|
||||||
#![cfg_attr(feature="dev", allow(match_bool))]
|
|
||||||
|
|
||||||
extern crate ansi_term;
|
extern crate ansi_term;
|
||||||
extern crate app_dirs;
|
extern crate app_dirs;
|
||||||
@ -71,6 +67,7 @@ extern crate parity_local_store as local_store;
|
|||||||
extern crate parity_reactor;
|
extern crate parity_reactor;
|
||||||
extern crate parity_rpc;
|
extern crate parity_rpc;
|
||||||
extern crate parity_updater as updater;
|
extern crate parity_updater as updater;
|
||||||
|
extern crate parity_version;
|
||||||
extern crate parity_whisper;
|
extern crate parity_whisper;
|
||||||
extern crate path;
|
extern crate path;
|
||||||
extern crate rpc_cli;
|
extern crate rpc_cli;
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
use std::{str, fs, fmt};
|
use std::{str, fs, fmt};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use bigint::prelude::U256;
|
use bigint::prelude::U256;
|
||||||
use util::{Address, version_data};
|
use util::Address;
|
||||||
|
use parity_version::version_data;
|
||||||
use journaldb::Algorithm;
|
use journaldb::Algorithm;
|
||||||
use ethcore::spec::{Spec, SpecParams};
|
use ethcore::spec::{Spec, SpecParams};
|
||||||
use ethcore::ethereum;
|
use ethcore::ethereum;
|
||||||
@ -188,6 +189,7 @@ impl str::FromStr for ResealPolicy {
|
|||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct AccountsConfig {
|
pub struct AccountsConfig {
|
||||||
pub iterations: u32,
|
pub iterations: u32,
|
||||||
|
pub refresh_time: u64,
|
||||||
pub testnet: bool,
|
pub testnet: bool,
|
||||||
pub password_files: Vec<String>,
|
pub password_files: Vec<String>,
|
||||||
pub unlocked_accounts: Vec<Address>,
|
pub unlocked_accounts: Vec<Address>,
|
||||||
@ -199,6 +201,7 @@ impl Default for AccountsConfig {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
AccountsConfig {
|
AccountsConfig {
|
||||||
iterations: 10240,
|
iterations: 10240,
|
||||||
|
refresh_time: 5,
|
||||||
testnet: false,
|
testnet: false,
|
||||||
password_files: Vec::new(),
|
password_files: Vec::new(),
|
||||||
unlocked_accounts: Vec::new(),
|
unlocked_accounts: Vec::new(),
|
||||||
|
@ -59,8 +59,8 @@ impl Default for HttpConfiguration {
|
|||||||
interface: "127.0.0.1".into(),
|
interface: "127.0.0.1".into(),
|
||||||
port: 8545,
|
port: 8545,
|
||||||
apis: ApiSet::UnsafeContext,
|
apis: ApiSet::UnsafeContext,
|
||||||
cors: None,
|
cors: Some(vec![]),
|
||||||
hosts: Some(Vec::new()),
|
hosts: Some(vec![]),
|
||||||
server_threads: 1,
|
server_threads: 1,
|
||||||
processing_threads: 4,
|
processing_threads: 4,
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ impl From<UiConfiguration> for HttpConfiguration {
|
|||||||
interface: conf.interface,
|
interface: conf.interface,
|
||||||
port: conf.port,
|
port: conf.port,
|
||||||
apis: rpc_apis::ApiSet::UnsafeContext,
|
apis: rpc_apis::ApiSet::UnsafeContext,
|
||||||
cors: None,
|
cors: Some(vec![]),
|
||||||
hosts: conf.hosts,
|
hosts: conf.hosts,
|
||||||
server_threads: 1,
|
server_threads: 1,
|
||||||
processing_threads: 0,
|
processing_threads: 0,
|
||||||
|
@ -39,7 +39,7 @@ use parity_reactor::EventLoop;
|
|||||||
use parity_rpc::{NetworkSettings, informant, is_major_importing};
|
use parity_rpc::{NetworkSettings, informant, is_major_importing};
|
||||||
use updater::{UpdatePolicy, Updater};
|
use updater::{UpdatePolicy, Updater};
|
||||||
use ansi_term::Colour;
|
use ansi_term::Colour;
|
||||||
use util::version;
|
use parity_version::version;
|
||||||
use parking_lot::{Condvar, Mutex};
|
use parking_lot::{Condvar, Mutex};
|
||||||
use node_filter::NodeFilter;
|
use node_filter::NodeFilter;
|
||||||
use journaldb::Algorithm;
|
use journaldb::Algorithm;
|
||||||
@ -909,9 +909,15 @@ fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str,
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let ethstore = EthStore::open_with_iterations(dir, cfg.iterations).map_err(|e| format!("Could not open keys directory: {}", e))?;
|
||||||
|
if cfg.refresh_time > 0 {
|
||||||
|
ethstore.set_refresh_time(::std::time::Duration::from_secs(cfg.refresh_time));
|
||||||
|
}
|
||||||
let account_provider = AccountProvider::new(
|
let account_provider = AccountProvider::new(
|
||||||
Box::new(EthStore::open_with_iterations(dir, cfg.iterations).map_err(|e| format!("Could not open keys directory: {}", e))?),
|
Box::new(ethstore),
|
||||||
account_settings);
|
account_settings,
|
||||||
|
);
|
||||||
|
|
||||||
for a in cfg.unlocked_accounts {
|
for a in cfg.unlocked_accounts {
|
||||||
// Check if the account exists
|
// Check if the account exists
|
||||||
|
@ -121,7 +121,7 @@ mod server {
|
|||||||
// Attempt to sign in the engine signer.
|
// Attempt to sign in the engine signer.
|
||||||
let password = deps.accounts_passwords.iter()
|
let password = deps.accounts_passwords.iter()
|
||||||
.find(|p| deps.account_provider.sign(account.clone(), Some((*p).clone()), Default::default()).is_ok())
|
.find(|p| deps.account_provider.sign(account.clone(), Some((*p).clone()), Default::default()).is_ok())
|
||||||
.ok_or(format!("No valid password for the secret store node account {}", account))?;
|
.ok_or_else(|| format!("No valid password for the secret store node account {}", account))?;
|
||||||
Arc::new(ethcore_secretstore::KeyStoreNodeKeyPair::new(deps.account_provider, account, password.clone())
|
Arc::new(ethcore_secretstore::KeyStoreNodeKeyPair::new(deps.account_provider, account, password.clone())
|
||||||
.map_err(|e| format!("{}", e))?)
|
.map_err(|e| format!("{}", e))?)
|
||||||
},
|
},
|
||||||
|
@ -27,7 +27,6 @@ use dir::{DatabaseDirectories, default_data_path};
|
|||||||
use helpers::replace_home;
|
use helpers::replace_home;
|
||||||
use journaldb::Algorithm;
|
use journaldb::Algorithm;
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(enum_variant_names))]
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
CannotCreateConfigPath,
|
CannotCreateConfigPath,
|
||||||
|
@ -54,19 +54,15 @@ fetch = { path = "../util/fetch" }
|
|||||||
node-health = { path = "../dapps/node-health" }
|
node-health = { path = "../dapps/node-health" }
|
||||||
parity-reactor = { path = "../util/reactor" }
|
parity-reactor = { path = "../util/reactor" }
|
||||||
parity-updater = { path = "../updater" }
|
parity-updater = { path = "../updater" }
|
||||||
|
parity-version = { path = "../util/version" }
|
||||||
rlp = { path = "../util/rlp" }
|
rlp = { path = "../util/rlp" }
|
||||||
stats = { path = "../util/stats" }
|
stats = { path = "../util/stats" }
|
||||||
vm = { path = "../ethcore/vm" }
|
vm = { path = "../ethcore/vm" }
|
||||||
keccak-hash = { path = "../util/hash" }
|
keccak-hash = { path = "../util/hash" }
|
||||||
hardware-wallet = { path = "../hw" }
|
hardware-wallet = { path = "../hw" }
|
||||||
|
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
pretty_assertions = "0.1"
|
pretty_assertions = "0.1"
|
||||||
macros = { path = "../util/macros" }
|
macros = { path = "../util/macros" }
|
||||||
ethcore-network = { path = "../util/network" }
|
ethcore-network = { path = "../util/network" }
|
||||||
kvdb-memorydb = { path = "../util/kvdb-memorydb" }
|
kvdb-memorydb = { path = "../util/kvdb-memorydb" }
|
||||||
|
|
||||||
[features]
|
|
||||||
dev = ["clippy", "ethcore/dev", "ethcore-util/dev", "ethsync/dev"]
|
|
||||||
|
@ -83,7 +83,6 @@ pub struct AuthCodes<T: TimeProvider = DefaultTimeProvider> {
|
|||||||
impl AuthCodes<DefaultTimeProvider> {
|
impl AuthCodes<DefaultTimeProvider> {
|
||||||
|
|
||||||
/// Reads `AuthCodes` from file and creates new instance using `DefaultTimeProvider`.
|
/// Reads `AuthCodes` from file and creates new instance using `DefaultTimeProvider`.
|
||||||
#[cfg_attr(feature="dev", allow(single_char_pattern))]
|
|
||||||
pub fn from_file(file: &Path) -> io::Result<AuthCodes> {
|
pub fn from_file(file: &Path) -> io::Result<AuthCodes> {
|
||||||
let content = {
|
let content = {
|
||||||
if let Ok(mut file) = fs::File::open(file) {
|
if let Ok(mut file) = fs::File::open(file) {
|
||||||
@ -154,7 +153,6 @@ impl<T: TimeProvider> AuthCodes<T> {
|
|||||||
|
|
||||||
/// Checks if given hash is correct authcode of `SignerUI`
|
/// Checks if given hash is correct authcode of `SignerUI`
|
||||||
/// Updates this hash last used field in case it's valid.
|
/// Updates this hash last used field in case it's valid.
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
pub fn is_valid(&mut self, hash: &H256, time: u64) -> bool {
|
pub fn is_valid(&mut self, hash: &H256, time: u64) -> bool {
|
||||||
let now = self.now.now();
|
let now = self.now.now();
|
||||||
// check time
|
// check time
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
//! Parity RPC.
|
//! Parity RPC.
|
||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="dev", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="dev", plugin(clippy))]
|
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate futures;
|
extern crate futures;
|
||||||
@ -64,6 +62,7 @@ extern crate fetch;
|
|||||||
extern crate node_health;
|
extern crate node_health;
|
||||||
extern crate parity_reactor;
|
extern crate parity_reactor;
|
||||||
extern crate parity_updater as updater;
|
extern crate parity_updater as updater;
|
||||||
|
extern crate parity_version as version;
|
||||||
extern crate rlp;
|
extern crate rlp;
|
||||||
extern crate stats;
|
extern crate stats;
|
||||||
extern crate keccak_hash as hash;
|
extern crate keccak_hash as hash;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::collections::{BTreeMap, HashSet};
|
use std::collections::{BTreeMap, HashSet};
|
||||||
|
|
||||||
use util::misc::version_data;
|
use version::version_data;
|
||||||
|
|
||||||
use crypto::{ecies, DEFAULT_MAC};
|
use crypto::{ecies, DEFAULT_MAC};
|
||||||
use ethkey::{Brain, Generator};
|
use ethkey::{Brain, Generator};
|
||||||
|
@ -20,7 +20,7 @@ use std::str::FromStr;
|
|||||||
use std::collections::{BTreeMap, HashSet};
|
use std::collections::{BTreeMap, HashSet};
|
||||||
|
|
||||||
use util::Address;
|
use util::Address;
|
||||||
use util::misc::version_data;
|
use version::version_data;
|
||||||
|
|
||||||
use crypto::{DEFAULT_MAC, ecies};
|
use crypto::{DEFAULT_MAC, ecies};
|
||||||
use ethkey::{Brain, Generator};
|
use ethkey::{Brain, Generator};
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
//! Web3 rpc implementation.
|
//! Web3 rpc implementation.
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use jsonrpc_core::Result;
|
use jsonrpc_core::Result;
|
||||||
use util::version;
|
use version::version;
|
||||||
use v1::traits::Web3;
|
use v1::traits::Web3;
|
||||||
use v1::types::{H256, Bytes};
|
use v1::types::{H256, Bytes};
|
||||||
|
|
||||||
|
@ -234,14 +234,14 @@ fn rpc_parity_chain_id() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rpc_parity_default_extra_data() {
|
fn rpc_parity_default_extra_data() {
|
||||||
use util::misc;
|
use version::version_data;
|
||||||
use bytes::ToPretty;
|
use bytes::ToPretty;
|
||||||
|
|
||||||
let deps = Dependencies::new();
|
let deps = Dependencies::new();
|
||||||
let io = deps.default_client();
|
let io = deps.default_client();
|
||||||
|
|
||||||
let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultExtraData", "params": [], "id": 1}"#;
|
let request = r#"{"jsonrpc": "2.0", "method": "parity_defaultExtraData", "params": [], "id": 1}"#;
|
||||||
let response = format!(r#"{{"jsonrpc":"2.0","result":"0x{}","id":1}}"#, misc::version_data().to_hex());
|
let response = format!(r#"{{"jsonrpc":"2.0","result":"0x{}","id":1}}"#, version_data().to_hex());
|
||||||
|
|
||||||
assert_eq!(io.handle_request_sync(request), Some(response));
|
assert_eq!(io.handle_request_sync(request), Some(response));
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use jsonrpc_core::IoHandler;
|
use jsonrpc_core::IoHandler;
|
||||||
use util::version;
|
use version::version;
|
||||||
use v1::{Web3, Web3Client};
|
use v1::{Web3, Web3Client};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -111,7 +111,7 @@ impl CachedContract {
|
|||||||
let do_call = |a, d| future::done(
|
let do_call = |a, d| future::done(
|
||||||
self.client
|
self.client
|
||||||
.upgrade()
|
.upgrade()
|
||||||
.ok_or("Calling contract without client".into())
|
.ok_or_else(|| "Calling contract without client".into())
|
||||||
.and_then(|c| c.call_contract(BlockId::Latest, a, d)));
|
.and_then(|c| c.call_contract(BlockId::Latest, a, d)));
|
||||||
contract.check_permissions(do_call, address, document.clone())
|
contract.check_permissions(do_call, address, document.clone())
|
||||||
.map_err(|err| Error::Internal(err))
|
.map_err(|err| Error::Internal(err))
|
||||||
|
@ -258,7 +258,7 @@ impl<T> SessionImpl<T> where T: SessionTransport {
|
|||||||
let admin_public = self.core.admin_public.as_ref().cloned().ok_or(Error::ConsensusUnreachable)?;
|
let admin_public = self.core.admin_public.as_ref().cloned().ok_or(Error::ConsensusUnreachable)?;
|
||||||
|
|
||||||
// key share version is required on ShareAdd master node
|
// key share version is required on ShareAdd master node
|
||||||
let key_share = self.core.key_share.as_ref().ok_or(Error::KeyStorage("key share is not found on master node".into()))?;
|
let key_share = self.core.key_share.as_ref().ok_or_else(|| Error::KeyStorage("key share is not found on master node".into()))?;
|
||||||
let key_version = key_share.version(&version).map_err(|e| Error::KeyStorage(e.into()))?;
|
let key_version = key_share.version(&version).map_err(|e| Error::KeyStorage(e.into()))?;
|
||||||
|
|
||||||
// old nodes set is all non-isolated owners of version holders
|
// old nodes set is all non-isolated owners of version holders
|
||||||
|
@ -188,7 +188,7 @@ impl<T> SessionImpl<T> where T: SessionTransport {
|
|||||||
let is_consensus_pre_established = data.shares_to_move.is_some();
|
let is_consensus_pre_established = data.shares_to_move.is_some();
|
||||||
if !is_consensus_pre_established {
|
if !is_consensus_pre_established {
|
||||||
let shares_to_move_reversed = shares_to_move_reversed.ok_or(Error::InvalidMessage)?;
|
let shares_to_move_reversed = shares_to_move_reversed.ok_or(Error::InvalidMessage)?;
|
||||||
let key_share = self.core.key_share.as_ref().ok_or(Error::KeyStorage("key share is not found on master node".into()))?;
|
let key_share = self.core.key_share.as_ref().ok_or_else(|| Error::KeyStorage("key share is not found on master node".into()))?;
|
||||||
check_shares_to_move(&self.core.meta.self_node_id, &shares_to_move_reversed, Some(&key_share.id_numbers))?;
|
check_shares_to_move(&self.core.meta.self_node_id, &shares_to_move_reversed, Some(&key_share.id_numbers))?;
|
||||||
|
|
||||||
let old_set_signature = old_set_signature.ok_or(Error::InvalidMessage)?;
|
let old_set_signature = old_set_signature.ok_or(Error::InvalidMessage)?;
|
||||||
|
@ -149,7 +149,7 @@ impl PersistentKeyStorage {
|
|||||||
pub fn new(config: &ServiceConfiguration) -> Result<Self, Error> {
|
pub fn new(config: &ServiceConfiguration) -> Result<Self, Error> {
|
||||||
let mut db_path = PathBuf::from(&config.data_path);
|
let mut db_path = PathBuf::from(&config.data_path);
|
||||||
db_path.push("db");
|
db_path.push("db");
|
||||||
let db_path = db_path.to_str().ok_or(Error::Database("Invalid secretstore path".to_owned()))?;
|
let db_path = db_path.to_str().ok_or_else(|| Error::Database("Invalid secretstore path".to_owned()))?;
|
||||||
|
|
||||||
let db = Database::open_default(&db_path)?;
|
let db = Database::open_default(&db_path)?;
|
||||||
let db = upgrade_db(db)?;
|
let db = upgrade_db(db)?;
|
||||||
|
@ -20,7 +20,6 @@ keccak-hash = { path = "../util/hash" }
|
|||||||
triehash = { path = "../util/triehash" }
|
triehash = { path = "../util/triehash" }
|
||||||
kvdb = { path = "../util/kvdb" }
|
kvdb = { path = "../util/kvdb" }
|
||||||
macros = { path = "../util/macros" }
|
macros = { path = "../util/macros" }
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
env_logger = "0.4"
|
env_logger = "0.4"
|
||||||
time = "0.1.34"
|
time = "0.1.34"
|
||||||
@ -34,7 +33,3 @@ ipnetwork = "0.12.6"
|
|||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
ethkey = { path = "../ethkey" }
|
ethkey = { path = "../ethkey" }
|
||||||
kvdb-memorydb = { path = "../util/kvdb-memorydb" }
|
kvdb-memorydb = { path = "../util/kvdb-memorydb" }
|
||||||
|
|
||||||
[features]
|
|
||||||
default = []
|
|
||||||
dev = ["clippy", "ethcore/dev", "ethcore-util/dev"]
|
|
||||||
|
@ -469,7 +469,6 @@ impl ChainSync {
|
|||||||
self.peers.clear();
|
self.peers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(for_kv_map))] // Because it's not possible to get `values_mut()`
|
|
||||||
/// Reset sync. Clear all downloaded data but keep the queue
|
/// Reset sync. Clear all downloaded data but keep the queue
|
||||||
fn reset(&mut self, io: &mut SyncIo) {
|
fn reset(&mut self, io: &mut SyncIo) {
|
||||||
self.new_blocks.reset();
|
self.new_blocks.reset();
|
||||||
@ -672,7 +671,6 @@ impl ChainSync {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity, needless_borrow))]
|
|
||||||
/// Called by peer once it has new block headers during sync
|
/// Called by peer once it has new block headers during sync
|
||||||
fn on_peer_block_headers(&mut self, io: &mut SyncIo, peer_id: PeerId, r: &UntrustedRlp) -> Result<(), PacketDecodeError> {
|
fn on_peer_block_headers(&mut self, io: &mut SyncIo, peer_id: PeerId, r: &UntrustedRlp) -> Result<(), PacketDecodeError> {
|
||||||
let confirmed = match self.peers.get_mut(&peer_id) {
|
let confirmed = match self.peers.get_mut(&peer_id) {
|
||||||
@ -883,7 +881,6 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Called by peer once it has new block bodies
|
/// Called by peer once it has new block bodies
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity))]
|
|
||||||
fn on_peer_new_block(&mut self, io: &mut SyncIo, peer_id: PeerId, r: &UntrustedRlp) -> Result<(), PacketDecodeError> {
|
fn on_peer_new_block(&mut self, io: &mut SyncIo, peer_id: PeerId, r: &UntrustedRlp) -> Result<(), PacketDecodeError> {
|
||||||
if !self.peers.get(&peer_id).map_or(false, |p| p.can_sync()) {
|
if !self.peers.get(&peer_id).map_or(false, |p| p.can_sync()) {
|
||||||
trace!(target: "sync", "Ignoring new block from unconfirmed peer {}", peer_id);
|
trace!(target: "sync", "Ignoring new block from unconfirmed peer {}", peer_id);
|
||||||
@ -1333,7 +1330,6 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if there are blocks fully downloaded that can be imported into the blockchain and does the import.
|
/// Checks if there are blocks fully downloaded that can be imported into the blockchain and does the import.
|
||||||
#[cfg_attr(feature="dev", allow(block_in_if_condition_stmt))]
|
|
||||||
fn collect_blocks(&mut self, io: &mut SyncIo, block_set: BlockSet) {
|
fn collect_blocks(&mut self, io: &mut SyncIo, block_set: BlockSet) {
|
||||||
match block_set {
|
match block_set {
|
||||||
BlockSet::NewBlocks => {
|
BlockSet::NewBlocks => {
|
||||||
@ -1353,7 +1349,6 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Request headers from a peer by block hash
|
/// Request headers from a peer by block hash
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn request_headers_by_hash(&mut self, sync: &mut SyncIo, peer_id: PeerId, h: &H256, count: u64, skip: u64, reverse: bool, set: BlockSet) {
|
fn request_headers_by_hash(&mut self, sync: &mut SyncIo, peer_id: PeerId, h: &H256, count: u64, skip: u64, reverse: bool, set: BlockSet) {
|
||||||
trace!(target: "sync", "{} <- GetBlockHeaders: {} entries starting from {}, set = {:?}", peer_id, count, h, set);
|
trace!(target: "sync", "{} <- GetBlockHeaders: {} entries starting from {}, set = {:?}", peer_id, count, h, set);
|
||||||
let mut rlp = RlpStream::new_list(4);
|
let mut rlp = RlpStream::new_list(4);
|
||||||
@ -1368,7 +1363,6 @@ impl ChainSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Request headers from a peer by block number
|
/// Request headers from a peer by block number
|
||||||
#[cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn request_fork_header_by_number(&mut self, sync: &mut SyncIo, peer_id: PeerId, n: BlockNumber) {
|
fn request_fork_header_by_number(&mut self, sync: &mut SyncIo, peer_id: PeerId, n: BlockNumber) {
|
||||||
trace!(target: "sync", "{} <- GetForkHeader: at {}", peer_id, n);
|
trace!(target: "sync", "{} <- GetForkHeader: at {}", peer_id, n);
|
||||||
let mut rlp = RlpStream::new_list(4);
|
let mut rlp = RlpStream::new_list(4);
|
||||||
@ -1783,7 +1777,6 @@ impl ChainSync {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(match_same_arms))]
|
|
||||||
pub fn maintain_peers(&mut self, io: &mut SyncIo) {
|
pub fn maintain_peers(&mut self, io: &mut SyncIo) {
|
||||||
let tick = time::precise_time_ns();
|
let tick = time::precise_time_ns();
|
||||||
let mut aborting = Vec::new();
|
let mut aborting = Vec::new();
|
||||||
|
@ -15,12 +15,6 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="dev", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="dev", plugin(clippy))]
|
|
||||||
// Keeps consistency (all lines with `.clone()`) and helpful when changing ref to non-ref.
|
|
||||||
#![cfg_attr(feature="dev", allow(clone_on_copy))]
|
|
||||||
// In most cases it expresses function flow better
|
|
||||||
#![cfg_attr(feature="dev", allow(if_not_else))]
|
|
||||||
|
|
||||||
//! Blockchain sync module
|
//! Blockchain sync module
|
||||||
//! Implements ethereum protocol version 63 as specified here:
|
//! Implements ethereum protocol version 63 as specified here:
|
||||||
|
@ -19,4 +19,5 @@ futures = "0.1"
|
|||||||
parking_lot = "0.4"
|
parking_lot = "0.4"
|
||||||
parity-hash-fetch = { path = "../hash-fetch" }
|
parity-hash-fetch = { path = "../hash-fetch" }
|
||||||
parity-reactor = { path = "../util/reactor" }
|
parity-reactor = { path = "../util/reactor" }
|
||||||
|
parity-version = { path = "../util/version" }
|
||||||
path = { path = "../util/path" }
|
path = { path = "../util/path" }
|
||||||
|
@ -28,6 +28,7 @@ extern crate ethsync;
|
|||||||
extern crate futures;
|
extern crate futures;
|
||||||
extern crate target_info;
|
extern crate target_info;
|
||||||
extern crate parity_reactor;
|
extern crate parity_reactor;
|
||||||
|
extern crate parity_version as version;
|
||||||
extern crate path;
|
extern crate path;
|
||||||
extern crate semver;
|
extern crate semver;
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use semver::{Version};
|
use semver::{Version};
|
||||||
use bigint::hash::H160;
|
use bigint::hash::H160;
|
||||||
use util::misc::raw_package_info;
|
use version::raw_package_info;
|
||||||
use types::ReleaseTrack;
|
use types::ReleaseTrack;
|
||||||
|
|
||||||
/// Version information of a particular release.
|
/// Version information of a particular release.
|
||||||
|
@ -34,7 +34,7 @@ use bigint::hash::{H160, H256};
|
|||||||
use util::Address;
|
use util::Address;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use util::misc;
|
use version;
|
||||||
|
|
||||||
/// Filter for releases.
|
/// Filter for releases.
|
||||||
#[derive(Debug, Eq, PartialEq, Clone)]
|
#[derive(Debug, Eq, PartialEq, Clone)]
|
||||||
@ -115,7 +115,7 @@ fn platform() -> String {
|
|||||||
} else if cfg!(target_os = "linux") {
|
} else if cfg!(target_os = "linux") {
|
||||||
format!("{}-unknown-linux-gnu", Target::arch())
|
format!("{}-unknown-linux-gnu", Target::arch())
|
||||||
} else {
|
} else {
|
||||||
misc::platform()
|
version::platform()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,41 +5,15 @@ license = "GPL-3.0"
|
|||||||
name = "ethcore-util"
|
name = "ethcore-util"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.3"
|
|
||||||
env_logger = "0.4"
|
|
||||||
rustc-hex = "1.0"
|
|
||||||
eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1" }
|
|
||||||
elastic-array = "0.9"
|
|
||||||
rlp = { path = "rlp" }
|
|
||||||
heapsize = "0.4"
|
|
||||||
keccak-hash = { path = "hash" }
|
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
libc = "0.2.7"
|
|
||||||
target_info = "0.1"
|
|
||||||
ethcore-bigint = { path = "bigint", features = ["heapsizeof"] }
|
ethcore-bigint = { path = "bigint", features = ["heapsizeof"] }
|
||||||
parking_lot = "0.4"
|
|
||||||
tiny-keccak= "1.0"
|
|
||||||
ethcore-logger = { path = "../logger" }
|
|
||||||
triehash = { path = "triehash" }
|
|
||||||
hashdb = { path = "hashdb" }
|
hashdb = { path = "hashdb" }
|
||||||
patricia-trie = { path = "patricia_trie" }
|
|
||||||
ethcore-bytes = { path = "bytes" }
|
|
||||||
memorydb = { path = "memorydb" }
|
memorydb = { path = "memorydb" }
|
||||||
util-error = { path = "error" }
|
|
||||||
kvdb = { path = "kvdb" }
|
|
||||||
journaldb = { path = "journaldb" }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
kvdb-memorydb = { path = "kvdb-memorydb" }
|
ethcore-bytes = { path = "bytes" }
|
||||||
|
keccak-hash = { path = "hash" }
|
||||||
[features]
|
log = "0.3"
|
||||||
default = []
|
patricia-trie = { path = "patricia_trie" }
|
||||||
dev = ["clippy"]
|
triehash = { path = "triehash" }
|
||||||
final = []
|
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
vergen = "0.1"
|
|
||||||
rustc_version = "0.1.0"
|
|
||||||
|
@ -179,7 +179,6 @@ macro_rules! impl_hash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Copy for $from {}
|
impl Copy for $from {}
|
||||||
#[cfg_attr(feature="dev", allow(expl_impl_clone_on_copy))]
|
|
||||||
impl Clone for $from {
|
impl Clone for $from {
|
||||||
fn clone(&self) -> $from {
|
fn clone(&self) -> $from {
|
||||||
let mut ret = $from::new();
|
let mut ret = $from::new();
|
||||||
@ -464,7 +463,6 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature="dev", allow(eq_op))]
|
|
||||||
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);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[project]
|
[package]
|
||||||
name = "ethcore-bloom-journal"
|
name = "ethcore-bloom-journal"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
@ -196,8 +196,6 @@ impl JournalDB for ArchiveDB {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![cfg_attr(feature="dev", allow(blacklisted_name))]
|
|
||||||
#![cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
|
|
||||||
use keccak::keccak;
|
use keccak::keccak;
|
||||||
use hashdb::{HashDB, DBValue};
|
use hashdb::{HashDB, DBValue};
|
||||||
|
@ -447,7 +447,6 @@ impl JournalDB for EarlyMergeDB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(cyclomatic_complexity))]
|
|
||||||
fn mark_canonical(&mut self, batch: &mut DBTransaction, end_era: u64, canon_id: &H256) -> Result<u32, UtilError> {
|
fn mark_canonical(&mut self, batch: &mut DBTransaction, end_era: u64, canon_id: &H256) -> Result<u32, UtilError> {
|
||||||
let mut refs = self.refs.as_ref().unwrap().write();
|
let mut refs = self.refs.as_ref().unwrap().write();
|
||||||
|
|
||||||
@ -544,8 +543,6 @@ impl JournalDB for EarlyMergeDB {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![cfg_attr(feature="dev", allow(blacklisted_name))]
|
|
||||||
#![cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
|
|
||||||
use keccak::keccak;
|
use keccak::keccak;
|
||||||
use hashdb::{HashDB, DBValue};
|
use hashdb::{HashDB, DBValue};
|
||||||
|
@ -202,7 +202,6 @@ impl HashDB for OverlayDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(feature="dev", allow(blacklisted_name))]
|
|
||||||
fn overlaydb_revert() {
|
fn overlaydb_revert() {
|
||||||
let mut m = OverlayDB::new_temp();
|
let mut m = OverlayDB::new_temp();
|
||||||
let foo = m.insert(b"foo"); // insert foo.
|
let foo = m.insert(b"foo"); // insert foo.
|
||||||
|
@ -452,8 +452,6 @@ impl HashDB for OverlayRecentDB {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![cfg_attr(feature="dev", allow(blacklisted_name))]
|
|
||||||
#![cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
|
|
||||||
use keccak::keccak;
|
use keccak::keccak;
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -205,8 +205,6 @@ impl JournalDB for RefCountedDB {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![cfg_attr(feature="dev", allow(blacklisted_name))]
|
|
||||||
#![cfg_attr(feature="dev", allow(similar_names))]
|
|
||||||
|
|
||||||
use keccak::keccak;
|
use keccak::keccak;
|
||||||
use hashdb::{HashDB, DBValue};
|
use hashdb::{HashDB, DBValue};
|
||||||
|
@ -15,7 +15,6 @@ time = "0.1.34"
|
|||||||
tiny-keccak = "1.3"
|
tiny-keccak = "1.3"
|
||||||
rust-crypto = "0.2.34"
|
rust-crypto = "0.2.34"
|
||||||
slab = "0.2"
|
slab = "0.2"
|
||||||
clippy = { version = "0.0.103", optional = true}
|
|
||||||
igd = "0.6"
|
igd = "0.6"
|
||||||
libc = "0.2.7"
|
libc = "0.2.7"
|
||||||
parking_lot = "0.4"
|
parking_lot = "0.4"
|
||||||
@ -41,4 +40,3 @@ tempdir = "0.3"
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
dev = ["clippy"]
|
|
||||||
|
@ -281,7 +281,6 @@ impl Discovery {
|
|||||||
self.send_to(packet, address.clone());
|
self.send_to(packet, address.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(map_clone))]
|
|
||||||
fn nearest_node_entries(target: &NodeId, buckets: &[NodeBucket]) -> Vec<NodeEntry> {
|
fn nearest_node_entries(target: &NodeId, buckets: &[NodeBucket]) -> Vec<NodeEntry> {
|
||||||
let mut found: BTreeMap<u32, Vec<&NodeEntry>> = BTreeMap::new();
|
let mut found: BTreeMap<u32, Vec<&NodeEntry>> = BTreeMap::new();
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
|
@ -705,7 +705,6 @@ impl Host {
|
|||||||
debug!(target: "network", "Connecting peers: {} sessions, {} pending, {} started", self.session_count(), self.handshake_count(), started);
|
debug!(target: "network", "Connecting peers: {} sessions, {} pending, {} started", self.session_count(), self.handshake_count(), started);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(single_match))]
|
|
||||||
fn connect_peer(&self, id: &NodeId, io: &IoContext<NetworkIoMessage>) {
|
fn connect_peer(&self, id: &NodeId, io: &IoContext<NetworkIoMessage>) {
|
||||||
if self.have_session(id) {
|
if self.have_session(id) {
|
||||||
trace!(target: "network", "Aborted connect. Node already connected.");
|
trace!(target: "network", "Aborted connect. Node already connected.");
|
||||||
@ -744,7 +743,6 @@ impl Host {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(block_in_if_condition_stmt))]
|
|
||||||
fn create_connection(&self, socket: TcpStream, id: Option<&NodeId>, io: &IoContext<NetworkIoMessage>) -> Result<(), Error> {
|
fn create_connection(&self, socket: TcpStream, id: Option<&NodeId>, io: &IoContext<NetworkIoMessage>) -> Result<(), Error> {
|
||||||
let nonce = self.info.write().next_nonce();
|
let nonce = self.info.write().next_nonce();
|
||||||
let mut sessions = self.sessions.write();
|
let mut sessions = self.sessions.write();
|
||||||
@ -805,7 +803,6 @@ impl Host {
|
|||||||
self.kill_connection(token, io, true);
|
self.kill_connection(token, io, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(collapsible_if))]
|
|
||||||
fn session_readable(&self, token: StreamToken, io: &IoContext<NetworkIoMessage>) {
|
fn session_readable(&self, token: StreamToken, io: &IoContext<NetworkIoMessage>) {
|
||||||
let mut ready_data: Vec<ProtocolId> = Vec::new();
|
let mut ready_data: Vec<ProtocolId> = Vec::new();
|
||||||
let mut packet_data: Vec<(ProtocolId, PacketId, Vec<u8>)> = Vec::new();
|
let mut packet_data: Vec<(ProtocolId, PacketId, Vec<u8>)> = Vec::new();
|
||||||
|
@ -365,7 +365,6 @@ fn can_map_external_address_or_fail() {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ipv4_properties() {
|
fn ipv4_properties() {
|
||||||
#![cfg_attr(feature="dev", allow(too_many_arguments))]
|
|
||||||
fn check(octets: &[u8; 4], unspec: bool, loopback: bool,
|
fn check(octets: &[u8; 4], unspec: bool, loopback: bool,
|
||||||
private: bool, link_local: bool, global: bool,
|
private: bool, link_local: bool, global: bool,
|
||||||
multicast: bool, broadcast: bool, documentation: bool) {
|
multicast: bool, broadcast: bool, documentation: bool) {
|
||||||
|
@ -268,7 +268,6 @@ impl<'db> Trie for TrieKinds<'db> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
impl TrieFactory {
|
impl TrieFactory {
|
||||||
/// Creates new factory.
|
/// Creates new factory.
|
||||||
pub fn new(spec: TrieSpec) -> Self {
|
pub fn new(spec: TrieSpec) -> Self {
|
||||||
|
@ -57,7 +57,6 @@ pub struct TrieDB<'db> {
|
|||||||
pub hash_count: usize,
|
pub hash_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(wrong_self_convention))]
|
|
||||||
impl<'db> TrieDB<'db> {
|
impl<'db> TrieDB<'db> {
|
||||||
/// Create a new trie with the backing database `db` and `root`
|
/// Create a new trie with the backing database `db` and `root`
|
||||||
/// Returns an error if `root` does not exist
|
/// Returns an error if `root` does not exist
|
||||||
|
@ -436,7 +436,6 @@ impl<'a> TrieDBMut<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// the insertion inspector.
|
/// the insertion inspector.
|
||||||
#[cfg_attr(feature = "dev", allow(cyclomatic_complexity))]
|
|
||||||
fn insert_inspector(&mut self, node: Node, partial: NibbleSlice, value: DBValue, old_val: &mut Option<DBValue>)
|
fn insert_inspector(&mut self, node: Node, partial: NibbleSlice, value: DBValue, old_val: &mut Option<DBValue>)
|
||||||
-> super::Result<InsertAction>
|
-> super::Result<InsertAction>
|
||||||
{
|
{
|
||||||
|
@ -15,23 +15,6 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![cfg_attr(feature="dev", feature(plugin))]
|
|
||||||
#![cfg_attr(feature="dev", plugin(clippy))]
|
|
||||||
|
|
||||||
// Clippy settings
|
|
||||||
// Most of the time much more readable
|
|
||||||
#![cfg_attr(feature="dev", allow(needless_range_loop))]
|
|
||||||
// Shorter than if-else
|
|
||||||
#![cfg_attr(feature="dev", allow(match_bool))]
|
|
||||||
// We use that to be more explicit about handled cases
|
|
||||||
#![cfg_attr(feature="dev", allow(match_same_arms))]
|
|
||||||
// Keeps consistency (all lines with `.clone()`).
|
|
||||||
#![cfg_attr(feature="dev", allow(clone_on_copy))]
|
|
||||||
// Some false positives when doing pattern matching.
|
|
||||||
#![cfg_attr(feature="dev", allow(needless_borrow))]
|
|
||||||
// TODO [todr] a lot of warnings to be fixed
|
|
||||||
#![cfg_attr(feature="dev", allow(assign_op_pattern))]
|
|
||||||
|
|
||||||
|
|
||||||
//! Ethcore-util library
|
//! Ethcore-util library
|
||||||
//!
|
//!
|
||||||
@ -87,33 +70,10 @@
|
|||||||
//! cargo build --release
|
//! cargo build --release
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
extern crate rustc_hex;
|
|
||||||
extern crate env_logger;
|
|
||||||
extern crate secp256k1;
|
|
||||||
extern crate elastic_array;
|
|
||||||
extern crate libc;
|
|
||||||
extern crate target_info;
|
|
||||||
extern crate ethcore_bigint as bigint;
|
extern crate ethcore_bigint as bigint;
|
||||||
extern crate ethcore_bytes as bytes;
|
|
||||||
extern crate parking_lot;
|
|
||||||
extern crate tiny_keccak;
|
|
||||||
extern crate rlp;
|
|
||||||
extern crate heapsize;
|
|
||||||
extern crate ethcore_logger;
|
|
||||||
extern crate keccak_hash as keccak;
|
|
||||||
extern crate hashdb;
|
extern crate hashdb;
|
||||||
extern crate memorydb;
|
extern crate memorydb;
|
||||||
extern crate patricia_trie as trie;
|
|
||||||
extern crate kvdb;
|
|
||||||
extern crate util_error as error;
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
extern crate kvdb_memorydb;
|
|
||||||
|
|
||||||
|
|
||||||
pub mod misc;
|
|
||||||
|
|
||||||
pub use misc::*;
|
|
||||||
pub use hashdb::*;
|
pub use hashdb::*;
|
||||||
pub use memorydb::MemoryDB;
|
pub use memorydb::MemoryDB;
|
||||||
|
|
||||||
|
15
util/version/Cargo.toml
Normal file
15
util/version/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "parity-version"
|
||||||
|
# NOTE: this value is used for Parity version string.
|
||||||
|
version = "1.9.0"
|
||||||
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
build = "build.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
ethcore-bytes = { path = "../bytes" }
|
||||||
|
rlp = { path = "../rlp" }
|
||||||
|
target_info = "0.1"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
vergen = "0.1"
|
||||||
|
rustc_version = "0.1.0"
|
@ -17,11 +17,11 @@
|
|||||||
extern crate vergen;
|
extern crate vergen;
|
||||||
extern crate rustc_version;
|
extern crate rustc_version;
|
||||||
|
|
||||||
use vergen::*;
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use vergen::{vergen, OutputFns};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
vergen(OutputFns::all()).unwrap();
|
vergen(OutputFns::all()).unwrap();
|
@ -16,9 +16,13 @@
|
|||||||
|
|
||||||
//! Diff misc.
|
//! Diff misc.
|
||||||
|
|
||||||
use rlp::RlpStream;
|
extern crate target_info;
|
||||||
|
extern crate ethcore_bytes as bytes;
|
||||||
|
extern crate rlp;
|
||||||
|
|
||||||
use target_info::Target;
|
use target_info::Target;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
use rlp::RlpStream;
|
||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/version.rs"));
|
include!(concat!(env!("OUT_DIR"), "/version.rs"));
|
||||||
include!(concat!(env!("OUT_DIR"), "/rustc_version.rs"));
|
include!(concat!(env!("OUT_DIR"), "/rustc_version.rs"));
|
||||||
@ -31,15 +35,6 @@ const THIS_TRACK: &'static str = "nightly";
|
|||||||
const THIS_TRACK: &'static str = "unstable";
|
const THIS_TRACK: &'static str = "unstable";
|
||||||
// ^^^ This gets used when we're not building a final release; should stay as "unstable".
|
// ^^^ This gets used when we're not building a final release; should stay as "unstable".
|
||||||
|
|
||||||
/// Boolean type for clean/dirty status.
|
|
||||||
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
|
|
||||||
pub enum Filth {
|
|
||||||
/// Data has not been changed.
|
|
||||||
Clean,
|
|
||||||
/// Data has been changed.
|
|
||||||
Dirty,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the platform identifier.
|
/// Get the platform identifier.
|
||||||
pub fn platform() -> String {
|
pub fn platform() -> String {
|
||||||
let env = Target::env();
|
let env = Target::env();
|
Loading…
Reference in New Issue
Block a user