Compare commits
11 Commits
v1.11.3
...
v1.11.5-ci
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6dfc251bd9 | ||
|
|
7484749be1 | ||
|
|
ca9e1e8bd9 | ||
|
|
13e2c002ac | ||
|
|
28a9134d5e | ||
|
|
d622111d93 | ||
|
|
33268e12e6 | ||
|
|
e687f2972d | ||
|
|
de4f4832a9 | ||
|
|
cc44ae9cb5 | ||
|
|
f26a7fe6fa |
@@ -201,6 +201,9 @@ docker-build:
|
||||
stage: build
|
||||
only:
|
||||
- tags
|
||||
- master
|
||||
- beta
|
||||
- stable
|
||||
- triggers
|
||||
before_script:
|
||||
- docker info
|
||||
|
||||
105
Cargo.lock
generated
105
Cargo.lock
generated
@@ -687,7 +687,6 @@ dependencies = [
|
||||
"parity-reactor 0.1.0",
|
||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"price-info 1.11.0",
|
||||
"rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rlp 0.2.1",
|
||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"trace-time 0.1.0",
|
||||
@@ -1358,7 +1357,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-core"
|
||||
version = "8.0.1"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -1370,7 +1369,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-http-server"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"hyper 0.11.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
@@ -1383,7 +1382,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-ipc-server"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
"jsonrpc-server-utils 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
@@ -1395,7 +1394,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-macros"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
"jsonrpc-pubsub 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
@@ -1405,7 +1404,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-pubsub"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -1415,7 +1414,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-server-utils"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"globset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -1428,7 +1427,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-tcp-server"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
"jsonrpc-server-utils 8.0.0 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
@@ -1440,7 +1439,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "jsonrpc-ws-server"
|
||||
version = "8.0.0"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#06bec6ab682ec4ce16d7e7daf2612870c4272028"
|
||||
source = "git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11#c8e6336798be4444953def351099078617d40efd"
|
||||
dependencies = [
|
||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"jsonrpc-core 8.0.1 (git+https://github.com/paritytech/jsonrpc.git?branch=parity-1.11)",
|
||||
@@ -1724,14 +1723,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "mio-named-pipes"
|
||||
version = "0.1.4"
|
||||
source = "git+https://github.com/alexcrichton/mio-named-pipes#9c1bbb985b74374d3b7eda76937279f8e977ef81"
|
||||
version = "0.1.5"
|
||||
source = "git+https://github.com/alexcrichton/mio-named-pipes#6ad80e67fe7993423b281bc13d307785ade05d37"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miow 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1754,6 +1752,15 @@ dependencies = [
|
||||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "miow"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "msdos_time"
|
||||
version = "0.1.6"
|
||||
@@ -1956,7 +1963,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "parity"
|
||||
version = "1.11.3"
|
||||
version = "1.11.5"
|
||||
dependencies = [
|
||||
"ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atty 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -2007,7 +2014,7 @@ dependencies = [
|
||||
"parity-rpc 1.11.0",
|
||||
"parity-rpc-client 1.4.0",
|
||||
"parity-updater 1.11.0",
|
||||
"parity-version 1.11.3",
|
||||
"parity-version 1.11.5",
|
||||
"parity-whisper 0.1.0",
|
||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"path 0.1.0",
|
||||
@@ -2055,7 +2062,7 @@ dependencies = [
|
||||
"parity-reactor 0.1.0",
|
||||
"parity-ui 1.11.0",
|
||||
"parity-ui-deprecation 1.10.0",
|
||||
"parity-version 1.11.3",
|
||||
"parity-version 1.11.5",
|
||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"registrar 0.0.1",
|
||||
@@ -2067,20 +2074,6 @@ dependencies = [
|
||||
"zip 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parity-dapps-glue"
|
||||
version = "1.9.1"
|
||||
dependencies = [
|
||||
"aster 0.41.0 (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)",
|
||||
"quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quasi_macros 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parity-dapps-glue"
|
||||
version = "1.9.1"
|
||||
@@ -2211,7 +2204,7 @@ dependencies = [
|
||||
"order-stat 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parity-reactor 0.1.0",
|
||||
"parity-updater 1.11.0",
|
||||
"parity-version 1.11.3",
|
||||
"parity-version 1.11.5",
|
||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"patricia-trie 0.1.0",
|
||||
"pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -2252,12 +2245,12 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "parity-tokio-ipc"
|
||||
version = "0.1.5"
|
||||
source = "git+https://github.com/nikvolf/parity-tokio-ipc#d6c5b3cfcc913a1b9cf0f0562a10b083ceb9fb7c"
|
||||
source = "git+https://github.com/nikvolf/parity-tokio-ipc#2af3e5b6b746552d8181069a2c6be068377df1de"
|
||||
dependencies = [
|
||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)",
|
||||
"mio-named-pipes 0.1.5 (git+https://github.com/alexcrichton/mio-named-pipes)",
|
||||
"miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -2332,7 +2325,7 @@ dependencies = [
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parity-hash-fetch 1.11.0",
|
||||
"parity-version 1.11.3",
|
||||
"parity-version 1.11.5",
|
||||
"parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"path 0.1.0",
|
||||
"rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -2343,7 +2336,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "parity-version"
|
||||
version = "1.11.3"
|
||||
version = "1.11.5"
|
||||
dependencies = [
|
||||
"ethcore-bytes 0.1.0",
|
||||
"rlp 0.2.1",
|
||||
@@ -2633,14 +2626,6 @@ dependencies = [
|
||||
"syntex_syntax 0.58.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quasi_macros"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"quasi_codegen 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.5.1"
|
||||
@@ -2691,7 +2676,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.31"
|
||||
version = "0.1.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
@@ -2699,7 +2684,7 @@ name = "redox_termios"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3035,6 +3020,17 @@ dependencies = [
|
||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.0.0"
|
||||
@@ -3139,7 +3135,7 @@ dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@@ -3168,7 +3164,7 @@ version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@@ -3204,7 +3200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
@@ -3275,7 +3271,7 @@ source = "git+https://github.com/nikvolf/tokio-named-pipes#0b9b728eaeb0a6673c287
|
||||
dependencies = [
|
||||
"bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)",
|
||||
"mio-named-pipes 0.1.5 (git+https://github.com/alexcrichton/mio-named-pipes)",
|
||||
"tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@@ -3899,9 +3895,10 @@ dependencies = [
|
||||
"checksum miniz_oxide 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa2d3ad070f428fffbd7d3ca2ea20bb0d8cffe9024405c44e1840bc1418b398"
|
||||
"checksum miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "92d98fdbd6145645828069b37ea92ca3de225e000d80702da25c20d3584b38a5"
|
||||
"checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe"
|
||||
"checksum mio-named-pipes 0.1.4 (git+https://github.com/alexcrichton/mio-named-pipes)" = "<none>"
|
||||
"checksum mio-named-pipes 0.1.5 (git+https://github.com/alexcrichton/mio-named-pipes)" = "<none>"
|
||||
"checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673"
|
||||
"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
|
||||
"checksum miow 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9224c91f82b3c47cf53dcf78dfaa20d6888fbcc5d272d5f2fcdf8a697f3c987d"
|
||||
"checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729"
|
||||
"checksum multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9c35dac080fd6e16a99924c8dfdef0af89d797dd851adab25feaffacf7850d6"
|
||||
"checksum multihash 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d49add5f49eb08bfc4d01ff286b84a48f53d45314f165c2d6efe477222d24f3"
|
||||
@@ -3949,13 +3946,12 @@ dependencies = [
|
||||
"checksum pwasm-utils 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d51e9954a77aab7b4b606dc315a49cbed187924f163b6750cdf6d5677dbf0839"
|
||||
"checksum quasi 0.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18c45c4854d6d1cf5d531db97c75880feb91c958b0720f4ec1057135fec358b3"
|
||||
"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 quote 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0ff51282f28dc1b53fd154298feaa2e77c5ea0dba68e1fd8b03b72fbe13d2a"
|
||||
"checksum rand 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)" = "512870020642bb8c221bf68baa1b2573da814f6ccfe5c9699b1c303047abe9b1"
|
||||
"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
|
||||
"checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1"
|
||||
"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8"
|
||||
"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"
|
||||
"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1"
|
||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||
"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa"
|
||||
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
|
||||
@@ -3994,6 +3990,7 @@ dependencies = [
|
||||
"checksum smallvec 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8fcd03faf178110ab0334d74ca9631d77f94c8c11cc77fcb59538abf0025695d"
|
||||
"checksum snappy 0.1.0 (git+https://github.com/paritytech/rust-snappy)" = "<none>"
|
||||
"checksum snappy-sys 0.1.0 (git+https://github.com/paritytech/rust-snappy)" = "<none>"
|
||||
"checksum socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "06dc9f86ee48652b7c80f3d254e3b9accb67a928c562c64d10d7b016d3d98dab"
|
||||
"checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
|
||||
"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
|
||||
"checksum subtle 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7f6353c2ee5407358d063a14cccc1630804527090a6fb5a9489ce4924280fb"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
description = "Parity Ethereum client"
|
||||
name = "parity"
|
||||
# NOTE Make sure to update util/version/Cargo.toml as well
|
||||
version = "1.11.3"
|
||||
version = "1.11.5"
|
||||
license = "GPL-3.0"
|
||||
authors = ["Parity Technologies <admin@parity.io>"]
|
||||
|
||||
@@ -123,7 +123,6 @@ panic = "abort"
|
||||
[workspace]
|
||||
members = [
|
||||
"chainspec",
|
||||
"dapps/js-glue",
|
||||
"ethcore/wasm/run",
|
||||
"ethcore/types",
|
||||
"ethkey/cli",
|
||||
|
||||
@@ -54,6 +54,7 @@ pub trait Provider: Send + Sync {
|
||||
/// results within must adhere to the `skip` and `reverse` parameters.
|
||||
fn block_headers(&self, req: request::CompleteHeadersRequest) -> Option<request::HeadersResponse> {
|
||||
use request::HashOrNumber;
|
||||
const MAX_HEADERS_TO_SEND: u64 = 512;
|
||||
|
||||
if req.max == 0 { return None }
|
||||
|
||||
@@ -82,10 +83,12 @@ pub trait Provider: Send + Sync {
|
||||
}
|
||||
};
|
||||
|
||||
let headers: Vec<_> = (0u64..req.max as u64)
|
||||
.map(|x: u64| x.saturating_mul(req.skip + 1))
|
||||
let max = ::std::cmp::min(MAX_HEADERS_TO_SEND, req.max);
|
||||
|
||||
let headers: Vec<_> = (0u64..max)
|
||||
.map(|x: u64| x.saturating_mul(req.skip.saturating_add(1)))
|
||||
.take_while(|x| if req.reverse { x < &start_num } else { best_num.saturating_sub(start_num) >= *x })
|
||||
.map(|x| if req.reverse { start_num - x } else { start_num + x })
|
||||
.map(|x| if req.reverse { start_num.saturating_sub(x) } else { start_num.saturating_add(x) })
|
||||
.map(|x| self.block_header(BlockId::Number(x)))
|
||||
.take_while(|x| x.is_some())
|
||||
.flat_map(|x| x)
|
||||
|
||||
@@ -66,6 +66,7 @@ pub use error::{Error, ErrorKind};
|
||||
|
||||
use std::sync::{Arc, Weak};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::time::Duration;
|
||||
use ethereum_types::{H128, H256, U256, Address};
|
||||
use hash::keccak;
|
||||
use rlp::*;
|
||||
@@ -78,7 +79,7 @@ use ethcore::executed::{Executed};
|
||||
use transaction::{SignedTransaction, Transaction, Action, UnverifiedTransaction};
|
||||
use ethcore::{contract_address as ethcore_contract_address};
|
||||
use ethcore::client::{
|
||||
Client, ChainNotify, ChainMessageType, ClientIoMessage, BlockId, CallContract
|
||||
Client, ChainNotify, ChainRoute, ChainMessageType, ClientIoMessage, BlockId, CallContract
|
||||
};
|
||||
use ethcore::account_provider::AccountProvider;
|
||||
use ethcore::miner::{self, Miner, MinerService};
|
||||
@@ -679,7 +680,7 @@ fn find_account_password(passwords: &Vec<String>, account_provider: &AccountProv
|
||||
}
|
||||
|
||||
impl ChainNotify for Provider {
|
||||
fn new_blocks(&self, imported: Vec<H256>, _invalid: Vec<H256>, _enacted: Vec<H256>, _retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: u64) {
|
||||
fn new_blocks(&self, imported: Vec<H256>, _invalid: Vec<H256>, _route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: Duration) {
|
||||
if !imported.is_empty() {
|
||||
trace!("New blocks imported, try to prune the queue");
|
||||
if let Err(err) = self.process_queue() {
|
||||
|
||||
@@ -57,7 +57,8 @@
|
||||
"enode://814920f1ec9510aa9ea1c8f79d8b6e6a462045f09caa2ae4055b0f34f7416fca6facd3dd45f1cf1673c0209e0503f02776b8ff94020e98b6679a0dc561b4eba0@104.154.136.117:30303",
|
||||
"enode://72e445f4e89c0f476d404bc40478b0df83a5b500d2d2e850e08eb1af0cd464ab86db6160d0fde64bd77d5f0d33507ae19035671b3c74fec126d6e28787669740@104.198.71.200:30303",
|
||||
"enode://39abab9d2a41f53298c0c9dc6bbca57b0840c3ba9dccf42aa27316addc1b7e56ade32a0a9f7f52d6c5db4fe74d8824bcedfeaecf1a4e533cacb71cf8100a9442@144.76.238.49:30303",
|
||||
"enode://f50e675a34f471af2438b921914b5f06499c7438f3146f6b8936f1faeb50b8a91d0d0c24fb05a66f05865cd58c24da3e664d0def806172ddd0d4c5bdbf37747e@144.76.238.49:30306"
|
||||
"enode://f50e675a34f471af2438b921914b5f06499c7438f3146f6b8936f1faeb50b8a91d0d0c24fb05a66f05865cd58c24da3e664d0def806172ddd0d4c5bdbf37747e@144.76.238.49:30306",
|
||||
"enode://83b33409349ffa25e150555f7b4f8deebc68f3d34d782129dc3c8ba07b880c209310a4191e1725f2f6bef59bce9452d821111eaa786deab08a7e6551fca41f4f@159.89.223.6:30303"
|
||||
],
|
||||
"accounts": {
|
||||
"0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
||||
|
||||
@@ -174,8 +174,8 @@
|
||||
"stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
||||
},
|
||||
"hardcodedSync": {
|
||||
"header": "f90216a03b798fd7d7c51f61fdbe7a08d6d2257eea4501c12dfc5442146b85837c0da51fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ea674fdde714fd979de3edf0f56aa9716b898ec8a0a2df7c321f2a532f63cdaf4e234227dd067f3782787db2ac892e875a8cb6842fa0c3a3f2c96c938633c7a99531a3876d544dbb8d5fac06879bea8e3cc5b6ece09da0221863f4a4fa6ca8dc7b6eed0eaefea36a5069f06ba9a61e78b87b634b5e4409b9010000a02080204012000000004100800000c0a08040041160000000740200200148000000000104011040800081808000102001180000000a80000011401020002c14008402000000100014400e20082080400000aa004100000000d10e8a0026180020882008200400a548000000201010088080000c0020800000001004046200600000052004020001800400800400420001800084002c1200040088028840004604020820400000264000005808500400410451c0808020140380c02014000440000002010422080800000240000000048a80072140000400409020020220810010020018008021800280a05008020000400000000044178000008000044410870b075e7ebe9d268353f001837a11f88379cd17845adfefa59565746865726d696e652d6177732d61736961312d32a0c92755fe5da24ea52d89783e387d88e1c2e24ac202641dd9906fc704a88979d28818d4dcc0009d0541",
|
||||
"totalDifficulty": "3828700463149109414955",
|
||||
"header": "f90207a0cdaf426b80edd4363b336b351cbfec8c38b44847cdbd814aa92e92bc9ec05333a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949435d50503aee35c8757ae4933f7a0ab56597805a03f28b2b384dbfd29bc0a10343e8a419e61b92782f880046170bf1d11455e94bba0f3712ef3ff24efe1afc7da11ffb2ca495a94fe7958f42e9f1599d66ed72af13ba06d01d03a15f807da601bd2dfde7490bbe91d9bb11c11eda435db9daad6e7b1efb9010000008c0000c000000000440100108040000082000800000000000000040801001004001000000010000000001000043300001000008000800000002000200040000000580c0004108000040c0008000006000000000280800080000800000000402000000a000000a810226200002881004000208006020000000510030000100040010100000086c20000000009000100000190008c80060000008000202080420008056040000000001000400001100010140822800220000c804004002000108000160001400200088082008000000412100010080205011000000800a0000810021005000000000002840000000400000000880000006000000000200002870bfca554dbc6398358b001837a137083473c8e845b27f4fd86436f72746578a0dbf31fd28bd8f69f1103196e1782a9dfb636bcfa726362ab0767235cb8d56e7188264402501145497f",
|
||||
"totalDifficulty": "4838383800145139949936",
|
||||
"CHTs": [
|
||||
"0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc",
|
||||
"0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11",
|
||||
@@ -2862,20 +2862,169 @@
|
||||
"0x4a3295525bfdda29bb9a552d8dc5c992649699f5694f96ff5bb0647910386db2",
|
||||
"0x337389b3e800bae87fdbe5271f2167f169ffeb4710ecdcea30f08b2cefba57b1",
|
||||
"0x2978e1e3c2b5dfe0b41ceb5c9c4029f42d346a2123a199c52ba6efdbf1d5fb68",
|
||||
"0x8abbdb4f1f88fe8900afdfe15f3d03244435d4fb871606a689c11f6420145b45"
|
||||
"0x8abbdb4f1f88fe8900afdfe15f3d03244435d4fb871606a689c11f6420145b45",
|
||||
"0x986dd2ca80e46f37a604b7186ce5683d3e5e114384ed6ccc39102228fbdd0eaa",
|
||||
"0x27fed9eeaab228907e106872d14473d621559176063f3c19c98393215ec87e02",
|
||||
"0xb743e115e42ff9ea8240082a5fcc9f5878221ab742d0db8f1b0edc6317484f30",
|
||||
"0xf6d2172dff821efc35df518767fbbf59eac9fcbbf6d89246bf845b588f5277ab",
|
||||
"0x1c608dc9a9114a38c14d81a75c038efb591259dbecdf00a41f0bf402f4dbbd92",
|
||||
"0x0ec49c3e2e0617fa336c1f9e36bcdf6ed25e548281abf1ae0286c5d92571752a",
|
||||
"0xcdd7dd5d936b3b685352a9797b52419c6f9aeadf33e5dc6dd8b0ff35a85d2a35",
|
||||
"0x9bc44252049c89b94967579c0ab737e14dfbdc95eb23d14579a73f3e68a81def",
|
||||
"0xe67fffbb7a6dec1a39c46e838d72f6bf7c48023a2759f2c3e4340bcbdba057fe",
|
||||
"0x55008d64590ccbf16e1288121b2a885d4852dda11cdf4bc21c578f85fc7eca70",
|
||||
"0x0ab47947ffc76c87f5a4d8c5eed162bf0b56b0cac11e425b44f270868f22fd8b",
|
||||
"0x7f5810f6e39bca9e268e1d0f2fe8b3b172f60a84e51e61f2b9056854c2dfbfd1",
|
||||
"0xea68e4e38860b5fbb0f509266afd110d50b6d34c7bc083f772878716469f7202",
|
||||
"0x203cddd6d6a1ed1174ad13faf518d08a11bca1ed4809bfd9d2e8947ff21664b7",
|
||||
"0x00e1378e25cf45e210f0757da309b30328b3ba3a1d270a065bf797acfd696eaa",
|
||||
"0x4327597fcde5e099327889cb075d1db345f5fc996888b058d3d17a0e49708e51",
|
||||
"0x6ca6195a4887f9dd5112621a13fa67463bf945d7aea39578feb1a1107c88eb79",
|
||||
"0x5ea64f4ead2b127c29cb51c79b3c28b81e345e2eecd237ef57fde7adb8702972",
|
||||
"0xb2c8f6e30f4b70a2983b508502cb50e6150fdac3b6d60c8458f9bc3e9b0c1fdb",
|
||||
"0xdcb684901513685c0bb7582aed9ee01b98297e05e9b054f3ad6917515e7a8620",
|
||||
"0xab7ac631c98ebba065ca7d6d81b58e8cee0d1304b6828ed4699f07ff2d7b0f18",
|
||||
"0x21f12ed6ecd4fcb2455ce8472f01ef78081fe3f3d4eee5a7edc7b546bec5e01d",
|
||||
"0x0735e851626195dd9baacc806903c5a623eb3d3902ac2514db9b088292f6ce31",
|
||||
"0xf8008dd2e9b354b284425bca8b378fd2081449c30cd6bdec3a8859b0021953c2",
|
||||
"0x809f2803965be44e3dc219d279acd5b3bee6c25780cd498d15dae3325d8d568e",
|
||||
"0x5fe269bcbeb9d2d2b253cdf4f0f2bf669c93be6cf428996b2137b68911ea0724",
|
||||
"0x41e04646fcf4a232b331a15619978ecfb13e9095ef266edd812aa1793e1a8a54",
|
||||
"0x0553fdd5e662e92852697a7f41679b1a82940b5d2acdea812b0925b7ea3892b9",
|
||||
"0x6e77324bca3ecd57316541eeb110f007a06359dab94131d98c245c0a137015ce",
|
||||
"0x217b4e8911ca232af5cf1673679137cd720e530dd704d11987eb8fbd612a8b16",
|
||||
"0x42bb0c8c8d5a2c49dce7bc4ed6f97869fe1335d3ac3f8df89d4701ebe8a609e9",
|
||||
"0x2cefcc4dfddaa49857629290b1b97af2ed03ef3b8e3fc67271315c6961038972",
|
||||
"0x6db8fc507494b4b5b6d7c95e056fe15571cee06adf6e7d21dbe4c5d1787b9bd3",
|
||||
"0xaf5c85ac940764c2e50ec0cf57c37febdbf1e4539dbccea24e7e0dc499e4b38a",
|
||||
"0x063f930786584fec4dc4aca21922770de0547b455e437a7b0b245edb9d161005",
|
||||
"0x94dcc780bc2c40ede15992b2ef6667965dd346bcf00cba42e718d8f83c68f325",
|
||||
"0xbf5f4beb305c3cbe0ef9142f3f588804f0437c9696fd2190c35face26db36c6e",
|
||||
"0xe8ab9b3503167c91116debe3ce48d0d76e23ed1c1cd12da09876e4ee518a39f2",
|
||||
"0x1fae4431c7874fa5d2787a520b27b8a0826f095398d7ca1e94b234650c04ea98",
|
||||
"0x7f5d261d5c29232b5ed9c55a26a59fedda566fd3f6bfbaff11d63c4ff161f5fd",
|
||||
"0x763d7abaa36d8262b659783a6a310e965a10b362e9bb7d907bef107a70f14e50",
|
||||
"0x0dc66388e318c83fa3cfdd1136b621323e9d80cc2b97a84029bffd53eba93cf1",
|
||||
"0xb422530c15aa6e8b4fa35535040e4b7b64de68a41937a439592be5d9afd4f699",
|
||||
"0x3fe4f704e67fd2d9ac629ce20c622f1634deae9fbe0a42b02da21c4f119250b8",
|
||||
"0xdd6ce24b6084576c646a2d8e42aeee919ecd2b2842964812c31c6c18adbe8676",
|
||||
"0xad0b9133894fbeef5ca4562aff4caae74218922542f6b20f73f99a4e5f30096c",
|
||||
"0x751d56d8e50e1f6b1473ceeed9ddf34030f0b203c9e705a8703a4988d1b0a3aa",
|
||||
"0x777800d29fb6fd9f7fbab607b4d9852f50f2aa3bd52b7383f7cdc287771181bb",
|
||||
"0xa34077e2a2e59e10649fe850757e3db69cf1fe0be2cd34fd4ac1a2793668f0d5",
|
||||
"0xea7d03f2cbf31f66327d8dcc7eab05c9f7fe98517f3d88cedc1c590742829106",
|
||||
"0x9c834993c9a684c8c726866c0a0013c3a92c275002137fa0288368268f513c8b",
|
||||
"0x30134d868fdd3c9d3e17c19c2813605dd3d5fdc9867baac66312b3089f1931d6",
|
||||
"0x35c44b2ab3def27f323b69a679c1536d8c4ca8e8c5dd33fb4db1c28214db48ea",
|
||||
"0x4da76c0233f32f66d1117d436aab4e73a7c7d3675aa2fa0abbef5498973fbbca",
|
||||
"0x02aa3319e1c7710604fc26a1622651dc319b5119a68ee4e887aba1b66f85e4a3",
|
||||
"0x642722b31dd1cf026be151a590ae81c8886812d858159c1ea9c40fb93b88e73d",
|
||||
"0x84942ffdfe4af44680244f7810239ce734981f2c9b6a42a951261a3955bd31fe",
|
||||
"0x4bccaf057f4fc0914ff58b56f4ffefd096ee71c508d4e94f70d30f59a3c8ef07",
|
||||
"0xfbb306bf85220f2a93533747e5d081281d323419adc3458327be9f50ce700dfe",
|
||||
"0xd3ebe4dca06c2005fd62be1448f92d0bc8cbddec22564e3adadd11e4001432ee",
|
||||
"0x4537177c35266327008bf899944a740739fce625930df5b89fec5cd43401c665",
|
||||
"0x3346cfb4b3b5f6a2c34b478f823d5a5cea08bcd026d1dc1f8cf885064d6a696a",
|
||||
"0x6d7d217e6f196549a651bb51500e693299a5838e23651902e54a36aa26d3cecb",
|
||||
"0x03fc17e1d0df60cb54874c848627ea0a86fdd8eba989faf64fe5ec3ece8293d1",
|
||||
"0x3a671486102a9dc591f67b937106a1dcee58680062a328f2fadf8fecd8fffd7d",
|
||||
"0xdfa484a44d55c86e2c3b05429144bbb3e6758e31e12283226eee25d58fce1e04",
|
||||
"0xe01ef4307108875450a351b5df82c5fea4a3d34a662cc87f7071cdabc7e5e4b6",
|
||||
"0xd04e6b7fca513c797b05b49ca345a2102243b6e893407f45247b0b406fa7cc6b",
|
||||
"0xc54725a8216701640e068f8a8ef8e77db86c7e30cf4add44f1fd125a6ac4dc11",
|
||||
"0x10851f13c23fed1edd5434deeb6a07d466d922f1516a282c23ce7834faeaaf62",
|
||||
"0xb4c3613b7c51412a171f1a2b36ffc01801abe4594b05ecc5eba6026139892f0f",
|
||||
"0xccfa7a95e0a7eabc97d234da53c80e94b811f270bebb6f6ac8759657e3750e3a",
|
||||
"0x3adf3ad22a66a6205a76c91d488b8f315c12df4955c52605724082d1f3b93da1",
|
||||
"0x9cd530ef2e1e14f8003b8d8651802bd1b0a4dceba53dcedb93a115ce4ee127a5",
|
||||
"0x803bf4629682228ddb883c5a81bce39a234768de6c299f65a07a3ee5895087e9",
|
||||
"0x8b6af66caee2b87a3fd2643c72e8d84ec9c0c75fa271456c48cbde2774b2b134",
|
||||
"0xc361af073d0a9044e2e28cace7fa6dbbcf7c05e41cc372ae13c2c5e3b1d42ea8",
|
||||
"0xaf73a3936f76a401a3a137bb6479978acbcaff7b8b0f6758a72a0c772fc2ca1c",
|
||||
"0x53259e3f0ed789a4397fb6897f768d526de648c4cfe50e4b88a95ea93232e404",
|
||||
"0x2145a286266f525fcaefe549221f470a5b8472db76d35e820c62e9dd09f41ef3",
|
||||
"0x9834dc8c6a845e685219a66157f77809c2dc52dbebdbf36a7a768aa4d2a89edb",
|
||||
"0x300e7319a340f894b96281edb2697fe70c650d5e1a112760f22f10deb32ce547",
|
||||
"0x0465a059e6b40cc6ac10a2bc78b6d064d6765c0adb0c20a45290e65560bd1e1b",
|
||||
"0xe935237f4f93f5de4d7b768627ce849aae62d8a5d807e0398f142677165fc3ba",
|
||||
"0x943f9abefc54fe4f118401b9682c44c9d7d97d6cf03ddf38d32cb694f9af1c32",
|
||||
"0xf658af875a69361211c9894ff4a77e595026d4e815b3c18e9cb83774790a5cca",
|
||||
"0xb5ace322f7b347062e8b728b312ebcddf6bb95dc24842c6ab783430cbd5e52a8",
|
||||
"0x8ac46515d61b24567ee93b19a3bb407a14016ee4b3b99b954c74923504e5baf9",
|
||||
"0xb7c2a9de470c3a43b7618fa31d4cc0b9ac879a2168ef6ed1348fc66c486340cd",
|
||||
"0x9eb593e57bc9784336500e4a593200274abd0e9da1c8a16b39acdee94a0be676",
|
||||
"0x361e998b3e24f213348db959f4cb65a04ffd1de7a705047fc10733034fbe1c66",
|
||||
"0x47b2b5d68a3080d6f11ada3bf0af1d90759f8f08421151f6a2ed5af64974f262",
|
||||
"0x002fe24eae8abd356bf631051897ac8ae1a754f7c5bdbd5fc521bcd364fdfd96",
|
||||
"0xff53d1ae5e5902c1a1b66bc36f88f3264bb01f14dd84def0ea0f94c7c7eadec3",
|
||||
"0x93813bf1b6a660f87410f862123d1ee694eedf4e7464a1a9e4556e3e3e2f9a18",
|
||||
"0x077cf660cd2cc0f4c4cda9cec68d8dda36d7c95d04cdace3b70c8d010441a68e",
|
||||
"0x367029ca5dc7cf420efed09c07561e9981b0dbd8dd1b1126ebb829cec9b5bafc",
|
||||
"0xa111113ef2ef722bd548b5adf4d75ddea2a7530d4d843b022c2a54ec25ba8c41",
|
||||
"0xfb2337d6125ede563770a84191a6f158ff45a00ad5006153765bbb72f51f6e83",
|
||||
"0x1ede4c16ea063d9ab7e7962957b4c067b0fe25c2403deffa5b38af79c563aae9",
|
||||
"0x067bc5f7409eac44326e4adced1eb688e3d9834310de73f141e90c4c63342dc9",
|
||||
"0x909d8a9ea7bd84097eb6129b8609773b90296d9d01729f592b4bc50981d9f1f1",
|
||||
"0x11f09438cd48f7895d90a6bb2dc9fdc342b8f11074d988b272f2c95b76f99fbf",
|
||||
"0x7ed2111c775c418ac81e55886fdf8fefab1f639e243f47f2c5526ac85b3309fc",
|
||||
"0x376919526e0fff65b9655bc34020d9df4c91300c0747b225ba9ac5e9adbf97c8",
|
||||
"0xf6ae43cfd33c14899af2575283288239210f3c00de11364175c3a1556637830d",
|
||||
"0x544063d4d8cc6b471b354b0e57773d841052ecc0110870b37f6e8657d4256381",
|
||||
"0xc1f6d5b592da819a2ebaea65a0a6448f63ce09fdfcf1c15f93fa20fb8b67e074",
|
||||
"0xc337d4acdae3bbbe7275c21b07b04b2ccf72a87b5666ee002ed54b7f56c6a276",
|
||||
"0x8956d8aed9c2ae1b76b1aeec8210cd24cd900ad5fb14cf0e86e86ba35f5b04f6",
|
||||
"0x06219a3301edd50166ff67184586c2caf2b3553b73e863cddd7a3c35b7f88022",
|
||||
"0x52b99f92dd3ffa353c0b54466fea2bd1876b3af2b64953c12cbbabc266197e04",
|
||||
"0x5c69f7312b8786144aa2161b3c965cbef42cfd41c8b586d117336ae8717b65f5",
|
||||
"0xe57747520a141a1be0140ce4b45e2973479ee8f4a50a85162dcdcf5090380528",
|
||||
"0x1f73420c464ceb6bd25e2eadff6a248ba092dbbeb5b3046ee809567dff1f34cc",
|
||||
"0x1df7ccc998af1e233e61adeef0f757caa4a80270eb6d5be5e920d6b085a4cfc7",
|
||||
"0x514024457e175885e55034f5c28c666611ce6bc1b8be8c3f253028f24091672e",
|
||||
"0x7574d79098c1aa62802b6ae31f43b47fc5e17ff1cb3b79b7065ec42dc1ee402f",
|
||||
"0x11329c45c6c4691bcd77cd97b9ecd27fc9108d909877abbc5ce894f081e0a4cc",
|
||||
"0x098a826b2a276c2cbf3c67b88caaedbb62316e37a570f5bdac257f9b901d355b",
|
||||
"0x56b14ea493e2280d63db496606a64f44646e2565e52ef36590bfa40e9a5dba63",
|
||||
"0x16b83703c9ffd53c3deaffab57d5d3c7252cebeec4a0b1ae957c17e56613a19b",
|
||||
"0xfc004311f603989357c1bffde7a42a59227d0ae6ce052ef010f8c9f4c31926d3",
|
||||
"0x1da81ae9ecb576ef9d74b05d15364e904cb252a54403fb2427eef5b49c8655fd",
|
||||
"0x2260c1c27d3bac445984b282a3432361d68f4b2f61165cb330854d3b8507c4ce",
|
||||
"0x0225d0c83107075de447a805d0892a8affec5e24b8229d79f327021a0848397c",
|
||||
"0xf1fb6333242f439dc53aff6bc68cd267f21f77fbe805b824710412b2f45b5468",
|
||||
"0x9fd2c82902d6890fad571d4125c02a1308dcc05ec53ace2b3a0c7d3cc46d16c1",
|
||||
"0x7b9248e0a83b6cc1e47e4828ad33af3b37cbb586295727d9b19fdf2ef62ec4ba",
|
||||
"0x352a0c2a06c5036b590a640c7d080a248dc1ddc1dbae67a5cf6698108b75955b",
|
||||
"0x6737bb1c9b05f740e28f1813f57a8f9d18ebfd042f260edef963fafc553994ca",
|
||||
"0x40d02212c95bfac0971766e71a339890ce86cfa96e2bd0ef0b270976062c5344",
|
||||
"0xa493f9c86347f4b0c5d0d29232afdd5681e7b0582575ca88574a2e04d3dfd061",
|
||||
"0xb748487ec35f299c2527260495fc2155ee354c488040f8b8de7aab0c232f6a5b",
|
||||
"0x76ba5a1f7c4d314bc773e241dcd15e0237de6d5d1a7f990d1d750da9e4bfe2ea",
|
||||
"0xcd8a379b7dff8c0732bfd151fb4c77b631e7d018b513cd34a2c7e1be3ed5b10f",
|
||||
"0x29d471c421d1624ffe4093894d79aa57e818dcf4042cf58a10fe244f1d2b43b3",
|
||||
"0x50a0d79e38620fb0f28dced7689486bc9790389041fc6b2731be8908c8f0027b",
|
||||
"0x1587ad177b7eef5a475045374b69ab13a38101a92fa9bf3c2d7b686b5058b0f9",
|
||||
"0xd79d13f96b5a91cde57290a87678630ce212aa11974f4244e2468f2a245796d6",
|
||||
"0x8f86548742ea82892829ced29ecf75947b42743e25c4c0b485f66160e0a2c1fc",
|
||||
"0x09650fb97435d4c7ae472f2b6cb3b9efcfde8f2c67e6c007c6c7b6f89529af16",
|
||||
"0x60221758839c34e2841c76a443675df9934027e1d365c91136d9d7089fc8c373",
|
||||
"0x4a524bd23dce7b76d06158ae7c8c8b973be2d8edafab5b6921fa1c2cba3cc4d9",
|
||||
"0xd6e51f25afb4eb839766ffde785a598185dd1e34870538a4a8b4eb9115a045fd",
|
||||
"0x84d6430ed5924bbc86da700f650536f3474f093bc9f61e52ee4f7f74a207464b",
|
||||
"0x9d2cb8b8ba17dfb9fb7562f902a43219c977ffd38697b990bb11b3708ff3718a",
|
||||
"0x89909eb848d74ee94b1b73ea6b1af8058ff771491ad131d3e13e2d95c2115903",
|
||||
"0x118b3ae7ad25ab96fe8a63973312c758d4ce9ecd39cc24913c26a65b4b5534de",
|
||||
"0x19cd088af8dbe2d3e6ca7987d9ee1564ea2256f482840b1d2f0da85060de9a86",
|
||||
"0x98bc07422cf8b0c4d1428afb759300d9a7637de2518528d34f7d237be7e863be",
|
||||
"0x0c64526b393066911c7da3f17f9e652cfa38112ae324e3c84416e811d3fe7cad"
|
||||
]
|
||||
},
|
||||
"nodes": [
|
||||
"enode://81863f47e9bd652585d3f78b4b2ee07b93dad603fd9bc3c293e1244250725998adc88da0cef48f1de89b15ab92b15db8f43dc2b6fb8fbd86a6f217a1dd886701@193.70.55.37:30303",
|
||||
"enode://4afb3a9137a88267c02651052cf6fb217931b8c78ee058bb86643542a4e2e0a8d24d47d871654e1b78a276c363f3c1bc89254a973b00adc359c9e9a48f140686@144.217.139.5:30303",
|
||||
"enode://c16d390b32e6eb1c312849fe12601412313165df1a705757d671296f1ac8783c5cff09eab0118ac1f981d7148c85072f0f26407e5c68598f3ad49209fade404d@139.99.51.203:30303",
|
||||
"enode://4faf867a2e5e740f9b874e7c7355afee58a2d1ace79f7b692f1d553a1134eddbeb5f9210dd14dc1b774a46fd5f063a8bc1fa90579e13d9d18d1f59bac4a4b16b@139.99.160.213:30303",
|
||||
"enode://6a868ced2dec399c53f730261173638a93a40214cf299ccf4d42a76e3fa54701db410669e8006347a4b3a74fa090bb35af0320e4bc8d04cf5b7f582b1db285f5@163.172.131.191:30303",
|
||||
"enode://66a483383882a518fcc59db6c017f9cd13c71261f13c8d7e67ed43adbbc82a932d88d2291f59be577e9425181fc08828dc916fdd053af935a9491edf9d6006ba@212.47.247.103:30303",
|
||||
"enode://cd6611461840543d5b9c56fbf088736154c699c43973b3a1a32390cf27106f87e58a818a606ccb05f3866de95a4fe860786fea71bf891ea95f234480d3022aa3@163.172.157.114:30303",
|
||||
"enode://78b094cb27ceeecbe311bc278f4fde8b9a265db42d268c88484c94d7a2d19b82a1bd22dfd6c2bd4d90f9b05e6d42255e6eb85de15f73848ff82ed0be9cdf5202@52.233.198.218:30303",
|
||||
"enode://00526537cb7e1aa6cf49714f0635fd0f608904d8d0693b949eea2dcdfdb0abbe4c794003a5fe57aa662d0a9215e8dfa4d2deb6ef0101c5e185e2617721813d43@40.65.122.44:30303",
|
||||
"enode://4a456b4b6e6ee1f51389763e51b80fe04782c762445d96c32a96ebd34bd9178c1894924d5101123eacfd4f0fc4da25b5e1ee7f18832ac0bf4c6d6ac81442d698@40.71.6.49:3030",
|
||||
"enode://68f85e7403976aa92318eff804cbe9bc988e0f5230d9d07ae4def030cbae16603262638e272d19875b7e5c54e296ba88ab6ec6e98face9e2537346c4dce78882@52.243.47.211:30303",
|
||||
"enode://dc72806c3aa8fda207c8c018aba8d6cf143728b3628b6ded8d5e8cdeb8aa05cbd53f710ecd014c9a8f0d1e98f2874bff8afb15a229202f510a9c0258d1f6d109@159.203.210.80:30303",
|
||||
"enode://5a62f19d35c0da8b576c9414568c728d4744e6e9d436c0f9db27456400011414f515871f13a6b8e0468534b5116cfe765d7630f680f1707a38467940a9f62511@45.55.33.62:30303",
|
||||
"enode://605e04a43b1156966b3a3b66b980c87b7f18522f7f712035f84576016be909a2798a438b2b17b1a8c58db314d88539a77419ca4be36148c086900fba487c9d39@188.166.255.12:30303",
|
||||
"enode://1d1f7bcb159d308eb2f3d5e32dc5f8786d714ec696bb2f7e3d982f9bcd04c938c139432f13aadcaf5128304a8005e8606aebf5eebd9ec192a1471c13b5e31d49@138.201.223.35:30303",
|
||||
"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303",
|
||||
"enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303",
|
||||
@@ -2887,7 +3036,6 @@
|
||||
"enode://1c7a64d76c0334b0418c004af2f67c50e36a3be60b5e4790bdac0439d21603469a85fad36f2473c9a80eb043ae60936df905fa28f1ff614c3e5dc34f15dcd2dc@40.118.3.223:30308",
|
||||
"enode://85c85d7143ae8bb96924f2b54f1b3e70d8c4d367af305325d30a61385a432f247d2c75c45c6b4a60335060d072d7f5b35dd1d4c45f76941f62a4f83b6e75daaf@40.118.3.223:30309",
|
||||
"enode://de471bccee3d042261d52e9bff31458daecc406142b401d4cd848f677479f73104b9fdeb090af9583d3391b7f10cb2ba9e26865dd5fca4fcdc0fb1e3b723c786@54.94.239.50:30303",
|
||||
"enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303",
|
||||
"enode://4cd540b2c3292e17cff39922e864094bf8b0741fcc8c5dcea14957e389d7944c70278d872902e3d0345927f621547efa659013c400865485ab4bfa0c6596936f@138.201.144.135:30303",
|
||||
"enode://01f76fa0561eca2b9a7e224378dd854278735f1449793c46ad0c4e79e8775d080c21dcc455be391e90a98153c3b05dcc8935c8440de7b56fe6d67251e33f4e3c@51.15.42.252:30303",
|
||||
"enode://2c9059f05c352b29d559192fe6bca272d965c9f2290632a2cfda7f83da7d2634f3ec45ae3a72c54dd4204926fb8082dcf9686e0d7504257541c86fc8569bcf4b@163.172.171.38:30303",
|
||||
|
||||
@@ -56,8 +56,8 @@
|
||||
"gasLimit": "0x5B8D80"
|
||||
},
|
||||
"hardcodedSync": {
|
||||
"header": "f9023ea032ac0e3f2dcc2042b6b47cbe502d5c7dc39d27d147e3273e17fbdf7966518a69a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479400e4a10650e5a6d6001c38ff8e64f97016a1645ca0c97490dcc8dc3a85050fb7df999bd772c3ab40cababcf5df4ea7141a9a183353a002bc045bf48b7208ffc5764f48c35162f488bd1213c5e96b3b06c0dd3a32f24ea07041b8f6d8db9964497fcb512b3de8e71cb87d89ab7ef592caff47b444f30637b901000008000000004000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000200000000000020080000004000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000080000040020800000000000000000000800000000000000000000000000000000000000000000000000000008000002000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000200000001000400000000000000000000000000000010000000000000000000000010090fffffffffffffffffffffffffffffffe836ac001837a1200830a4245845ae02fd896d583010a008650617269747986312e32342e31826c698416b80bf6b841cfbb3c579ee8e631a9b2916de71778e0c4f477d1424ed65cc9ca7958899c4cab09721b8eada42b49c146c870291efe475bb8d88652810819dc03ebda2659f3f100",
|
||||
"totalDifficulty": "2330161772435517944412054200548742154048251186",
|
||||
"header": "f9023ea070413bfe3ceb9160c7dee87bf060a0cc5e324f7c539cfce4e78802ff805063b6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479400e4a10650e5a6d6001c38ff8e64f97016a1645ca0f8ac12c30b4fd0d27a1a50c090659014574b554ba6e9cdb76f57efbcfbd390a9a0b474ac6cc4673c17c5f511a8b43cc44dbb01bb028735830163667d7a3a2582b9a0bcd44b7c04fa24760df7d733ca8ecd99e8da89de0716e6017fffa434bfd7519ab901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090fffffffffffffffffffffffffffffffd83755801837a11f88301d8de845b27471c96d583010b038650617269747986312e32362e31826c698416c9d1c7b8418bc805f23fb01fdd498b37df5519f49691d65160fe6a6794b8106e2ecc4782407f0dae3a512546b7d93e89bbb2a761c750553deeea1f9401231f56ae0ccb059201",
|
||||
"totalDifficulty": "2566410291882451733317698215999610733750372193",
|
||||
"CHTs": [
|
||||
"0xdb9557458495268ddd69409fc1f66631ed5ff9bf6c479be6eabe5d83a460acac",
|
||||
"0xd413800c22172be6e0b7a36348c90098955991f119ddad32c5b928e8db4deb02",
|
||||
@@ -3474,7 +3474,346 @@
|
||||
"0xce0b41fa28c47f7a420ea5efe6ec77e413f22b6f67e9fd8f6728ddd73e5c6baa",
|
||||
"0x9e7b2c49c92a224a444f4f91221ac2173993decf40b21118ff5962dea3969fd1",
|
||||
"0x6a611eaca85f609f1f79bfce34df97fb975f450e87e1f24d9a93b59ee0b0083f",
|
||||
"0x70ec7e2b800c43d093f7b1dec60e6743244b4516394ff861e8fa9f265efdd28d"
|
||||
"0x70ec7e2b800c43d093f7b1dec60e6743244b4516394ff861e8fa9f265efdd28d",
|
||||
"0x7e80326c6eaf085eb48567fe017f21354bf202072b1a2d7a94e9d76d0dde38aa",
|
||||
"0xea7baad3d12481364a0cd85ca78d71e3d86738938c4073a90d9e5b71162dba6f",
|
||||
"0x4e3b7094fdeead9a0275de1aaa590fa5d45fc57d164709ca56f209f1285c3707",
|
||||
"0x12e56845b0e6206f75fbc6fe75fb28167fcbebd2571fbfa2373707af352aff2a",
|
||||
"0xc7dc260bf1335f5002e7351b0ecd446379c71520e9d0f086dae2eeb37301b644",
|
||||
"0x50f25018c84c40c0b854dc197a82e15fd95ff58bcae5226aff17ddf9f44f1e2d",
|
||||
"0x0c71edfd14a52a3c18f56c0e8e94bb8a6b78a1e50736293983d8539bf02b0914",
|
||||
"0x9f914ff32cd2535bf2f0e430a6d4f85a144480049d29717c0a28d0c8ed02858c",
|
||||
"0x97c1ebee13b480651350851b8438fe7d709ca397985c6fb392c6e56102ac926f",
|
||||
"0xd75ee7dddc445d9f6361f2eb079a20a0d0a0ee9e7356c219647081f3d778ea60",
|
||||
"0xbbc2f0f7dcb1bdcc0390c75d85e37e1b393b8cf7529ce79fdca968ad2b330691",
|
||||
"0x0eea82ff391f47f7df4e04e0307621e1d8b6aa976995f6eba3cc95253c9aca29",
|
||||
"0xeabe8946289ac1a562ef5ee5c553129356a4fce4e3c108dd723678bda915e4a5",
|
||||
"0x4e3d7341bf8f7269481cafacff7dc5146f33d27e5df25a0504a42caa1f94c3f5",
|
||||
"0x4681710108d0aa64c8d0ea1405431334ff66977169c12c3e6f7cf76479dd5c56",
|
||||
"0x62cfebf32a022ba6667365f686352407e6129c107cb845105780910c9c405421",
|
||||
"0x9894915fe24dd0aa6b4b639b17bfc60d9ca0848738f143c6287d33d0cdfd2a1e",
|
||||
"0x00d0d949ed8c01b85b8b9da7d833668eafe52760d4725c4266347948073b6827",
|
||||
"0x5ecdc5570106bf27ade344bef187f64bc8591a8d9905e56ae52ae697566c5575",
|
||||
"0x754ea4f76f4b3ad9c7afdd856dff50eb161214673504b232d4a63a0a42883145",
|
||||
"0x8641f93482761679fa7397dab41d8a9495a95b9d693c6be903ad2e5517b6278c",
|
||||
"0x78ae59068cb5011d88567d919a3ed02f05beee15bfeab463f38fc39d7b25aa47",
|
||||
"0x8f8024181efe6a6709a9957d4895734d4552d63e399d806f31305e50d94c6c16",
|
||||
"0x40f098cc8a06180c95ac29f82a86d78951bfa1a14cc25e4cd8da929a0871e979",
|
||||
"0x1c76272e776ef34c5e202b476577ec3ea7613a332dad195afa1340b874648ea3",
|
||||
"0xc5492ca8fb2784ce1c3ad733137fd1b9d946fc349e06f899530d37fd6628e9f6",
|
||||
"0x0b7034da8e247df9b12dc65b577f3b75c4cf6ecc557ed3fce1a40f4455da5066",
|
||||
"0x2d5b70732a72057a6bc6d5d74e2e2fb4854dcc17159faffdbda00611173e50a8",
|
||||
"0xd92b2ed7c324bd17569cbb18b317aea888e361f9b998b58ec8af5a838f7988a5",
|
||||
"0x709d9dd243ad51600cebd449527debbeb8230afec92e6061b6c0e6010ff765d2",
|
||||
"0x277d7db1198e452cc42f7c814c8796e448a8321aa730e6351979f56f64f2aa08",
|
||||
"0xd1ebf26edc0e6dab23c7a6b9a26a6ac6b5a5eb8c17c355c7b5b6306c35d25634",
|
||||
"0x7c8d98fef8ae97c2d84b0ba15534656340c776e0e2f303ee6c0b5d72c1be048c",
|
||||
"0x98d4de7e589c593df79125171b2e02ea165d548fce644563a3ca1f455daca5c7",
|
||||
"0x4a69319a826ab82fdd111defb028c67f582063335325a680597e4ca972881210",
|
||||
"0x57f90e73b19a459899a25eac9958508fbb015edbcffa33a8a09ee66ec3ebee3a",
|
||||
"0x9772aa0cae90e3b96a5a907b6bf975e05e664b6f6bbc98681fc71ad5a3e0b42b",
|
||||
"0x81272c15403b6bc823541a12502b89a5511c198fa2f2a316a81975c77678f938",
|
||||
"0x68ab134f9289300446f3dec929a2385d6ebe5e087aecb806181377a911602e70",
|
||||
"0x135c03ac38c2830f5e43b09541e0f69899e79a83d9ca2d5a97a37fd44f4c1901",
|
||||
"0x3f579b811867a044bb1837f3591cb92b3cdb806651d87a7a887456338c644f74",
|
||||
"0x17d3e74034424ee46c93a106f8322ff9fc3f3cd499ee347f0b2e388dad853028",
|
||||
"0xe6fdee346df741d742eee7112aa685b5addfd907ad08401c9c1b27475f71021c",
|
||||
"0x1c0ce4a7d444672e9118044e3ac1e141d85c9030f14f62c0bba3f2b409b93ae0",
|
||||
"0x76548fbb7c106bb0ff13db5c7153710d3bcd4439aed48cee4b68a8e4cc978054",
|
||||
"0x1723acc5b7d8a7456471c598abc14feba6f3702aa732ffa009036cd9773d7733",
|
||||
"0xb01c82d4eaa7c5e1cb4ff0b0dda7ad1558418c3576705cbce343b340b03ade5c",
|
||||
"0x1d0326e10f506633798707287553cd7025246773fe7975c8a19f4ae3e59cb9bd",
|
||||
"0xed9eb55217788e468d7e5a586429a80822e89fda2d24151882f1716a6491602e",
|
||||
"0x0b4fc5e070deeec3d5d33ac8c5a9da85e594f03e2550a0d84a7e40571dba6f4f",
|
||||
"0xa56a7fd51a720aa2c05c3b1d73bdaa9cf8e417381731f25a4d534db59ef5e83e",
|
||||
"0x44522186801bc1e053bb5dceb8450117b6e16de04a789bba4aaba25580fa9d98",
|
||||
"0x3b74841d03b2a2cf79b7c4592ac9ae180cab171462b55507f2126a3dd7884851",
|
||||
"0x8bc3afdea84e0a559bf844f964fff3af35d2b2578c3b666b749d8f7583b0192d",
|
||||
"0xfb9ab198c8aeee666cd69fe20598722cd187cf349bb5b1db396fab23187d2335",
|
||||
"0xb56912ae6bbe67f55b1803e2a93728ff2615b65f54f3d88424de4454f6b0a92f",
|
||||
"0xfc3ec0c31f6999bca315e3f122dcbd1bba7f31dd45b5e936f79231b1e61b4d2e",
|
||||
"0xca247a4196143fa609f4ef7b5160528b89a14732d33f84748911aeda600e053a",
|
||||
"0xa48b8477fd330f3432a928b3fbb6c2b16b37dc065703f892b20c86c16459d4fd",
|
||||
"0xa793b8d41d239f047e1a2b446323f557e89307dca9a48de78f147f62ea078c33",
|
||||
"0x1f4543fc48bd23e0b043719ac1bb39afea92ddc5774f34e06e0a14a58036534e",
|
||||
"0x3ed6a22fcbb2344725c7228f2ac4543fb9d3fc835d4ba9d94fb807481557b7d4",
|
||||
"0x121d1e123ca87801e5336b9de23dfb3c5bd42452adb0c52197136b210ab38520",
|
||||
"0x4ad96b36710da80dab7128cbcd36bf946824b45322ff10f21ec4037d09104e93",
|
||||
"0xa30733e12726b6855ff857358cf26191734c811ff91979ce68f3f4bd0e3740a1",
|
||||
"0xaff3716f450ad70cf575313f3c311edc425140deb4121d744d1a9e366772618d",
|
||||
"0x9771fd12411da7ec1bdbb3bdd5d9293e1e691f2c9a4a7b705710cda9e6204458",
|
||||
"0xbd88569eea71d0833810135d6e2898db7acfd85d00c586ff755332e44d2039ad",
|
||||
"0x214e1662b559cb1efb7a49a97b01778e606789d641025e1e255e7474265963f4",
|
||||
"0x1b92313a0f069097213fe62b51680d050f6292e5ef9b2f2a4d5217b03d1ea3e7",
|
||||
"0x88b0faf7930fd989537d1c3e8b1f2f7a6e9cb3b1117eeb5829030f9250277dce",
|
||||
"0x22c4f4dac7ca24b2d6d524bc3293eef5fd73286e2928bc3554652b75c12111c3",
|
||||
"0x45af9039d3783f75bec64d71dcbe829bedefe2de5cadb592dd2e9af0585b125c",
|
||||
"0x60fbced492f778db766f3171c1e346e5a0498086b657da5d17817e05ab194496",
|
||||
"0x14d6adbb6fda237b95e8f220844759f8f32e976147138c674c3c060466bb9d8d",
|
||||
"0x1b27c87183f787d614d4e187ce3f1c19b794f933b33a1cf8b8c7f66443968d7a",
|
||||
"0x08471ad5316cfe0bb68cee4d624d76c3725f7fea983a42c49473a06ccd072175",
|
||||
"0x45673d37daa58c1a84bf6676386b008b2c80287a648490629d2fbd6fd6095b36",
|
||||
"0x19e4615dae6265f6bd96aea8614d2212a5d0b1895f2d6fca5e3a61b96a9b4fc6",
|
||||
"0x9b01ab59ae3b7da27f73c8578036d3295a76f529e7c3460f3e05f8d04f3c204b",
|
||||
"0x5fe63007389fd90552fc916ccb5bd547c23e15dbc7293d930148874d59400776",
|
||||
"0xa862a5eed290236b6e87f643cf80890b2d021d68952812765c97fabcb37d4a0a",
|
||||
"0x38c18afb3ab2908625feb753e4c5f9b0738aa6f92641a6d74cedd742085389ab",
|
||||
"0x7045a71a34952d008c7a45f774ad095115b2b39c66ac399666875c091f66a080",
|
||||
"0x4e5df6d0367eb18a6b3a6274d54a85529156ef43e089d01ea270217bd91bc099",
|
||||
"0x12f5b3943a86799e2601fc3a4a1fb165b113e8b6e30af6631cc96c8b02691338",
|
||||
"0x75816b7bc3777bc579337dcc1623acc080eaa28a0d269ba12998f8ac28672fd0",
|
||||
"0x93da08b8deb0256046bc0fcc1f7f320f374d778fa822d9266936ee14b7b605cf",
|
||||
"0xa7a8837e083b1126b978a647ffc8ac454fb341feb0187b1bb740a311e27d794b",
|
||||
"0x947942f80495b860e402648969c13b1d67644a610a8655e6331d917ce9d9ae66",
|
||||
"0x8e59cbbb6225ab2e0a905f26cef3885727fe29435e83edabcc119cdcf01edfa6",
|
||||
"0x27382765727cbc0df44ae8b56c973e8da67d4fde2e04455d00f299f9731b94a5",
|
||||
"0x6333067c15a31397bcf1e16dcaad3e9eee2ff3a4ec6fa203575110fbcc9a404b",
|
||||
"0xb624f0fb2bce352a20bda177528fd445efbca0fac5575dbec526df4b6ba1f967",
|
||||
"0xe211244c1887ec9267c7455bf64cdc473845df8500a090bc1886d4ef15d94bae",
|
||||
"0x459b10cb3605a7bbb537b237d7877e5ec16fedfe417ac434214f1e48d6cb9db7",
|
||||
"0x00c6cb05293954996edad819dadb9dee132c47e0bff4f40883b553bd46465861",
|
||||
"0x75fdcbbae564cc730b8b29811efe8550d3b2d889f33788c4c9c65ec8420be2b5",
|
||||
"0x48a6349cdd9065fe2312b7434e5b382864b71a3a30f6bef527fb767641033024",
|
||||
"0x2d524c91dc1e4c0bc7af72af23a23dea03023f4ac88d5360d39fde979d8c7c12",
|
||||
"0xdc785ecde7cb892d935cddc32f3d2e803c36a1349e7c7303a063813ef1a29e6e",
|
||||
"0xc918b72e98f95d38f7dcdd74c222582bb8647d54ac05e607ec71a5230007b046",
|
||||
"0x201c1d511a764472724c906c15d754584dee39b682104876e916b83662409039",
|
||||
"0x8524adc2f89a500dcbb273fdc8338800e4a12df36880dbf004e85d6dee27d0ed",
|
||||
"0x19ff16cb234e3f3a251b57a572e05025c5f469d40580f73adeb7997774678e5a",
|
||||
"0xad697abefff1cf702f041a4ff551ec2dea735e8614143553dabe82232eb1fe23",
|
||||
"0x2f82cb8f448965874012ebe4291b98c9c2069237f35dcc86fd44bf3665ce8582",
|
||||
"0x5204cdefbf66a6ca03f3095785754349ac03d148cb260040c30dcd245358e69a",
|
||||
"0xd9678cf8987d88e40c7dc0fd369c10aa0149d78d8795f2180c0b6261847f6d68",
|
||||
"0xb83cdf2e9cb8ad90c17d04d9a7645c6a3d63892c500354c95266d6e727d33748",
|
||||
"0x3c448dbe297ec1e8bab5481f381d0e81700970e64ee3148b80f255e7d3c4431f",
|
||||
"0xa535dae65ec4ef42aa05c7a110db91d419ef56cb78a528b6e06825488a539bcf",
|
||||
"0x60660ad6d027f00f2e84df6f8ac7514b834553a3933ec17e7af6be3f4137098e",
|
||||
"0x558c04aa7d8d828d40d55e1d27cb7371c89b83b5482909f6a490e1f8f12c0e78",
|
||||
"0xcebd138a8d5eaabc37145801c95f5fb3073f98bf08a4670419561e2d0f798b8c",
|
||||
"0xe185cfd8b4dfede3bf2eb898cc51436cc506705b8c8df97a0c62312428b9eaa8",
|
||||
"0x8329c45d28e8384be558cbfe2c9af7d0338d098935081429a2a5323d065a4f6f",
|
||||
"0x3846ef3ec37b442c2b94abea75141bda5b08fe6a4381c777dc7c15499399aa11",
|
||||
"0xbfe141ecac9cc63cf17a5e5fc95745fa7808133e1bf8898ec9c06810a29bb84b",
|
||||
"0x3d81adb143559eed09d410aea093d162cb5e378ac688665cedff53e37362c7cc",
|
||||
"0x48bbdc92d5236ccd98a8f1803d512495ba412021d02f723fb8f7209a11198cde",
|
||||
"0x588929461728d5f15fefe68a26218cedaebe9890282cc6a2be9f8170812b3f46",
|
||||
"0x54b514ccc3cbdb1cd902ae0ed7b5ae0f91ae4118f54ac831b76f8ca8dd009323",
|
||||
"0x6387311a39c020e1fbd3aa4de7a92b36da549f088043343629ed912a47207ba5",
|
||||
"0x20c6399f2509cfde9093485d84aae197351bf688ef700f6b75ec43acabd635f5",
|
||||
"0x6b7db93566738b7a09f004490f02794085c8a49b8b669984fd6492477696df70",
|
||||
"0x70e080cb818578443f092d2426e76b898b077bd09a83449b1d615e241097944e",
|
||||
"0xb2af0965e3a22fdc87b46cd70bf9fb69a8111974cf0133f63ff2fd6bc6e41367",
|
||||
"0xaad34d97ead1e29ebb1bde538691b50690f6860e4ed8d9bb423c395ff0a37456",
|
||||
"0xe55ad2c514b12c91354b18ae577a229b338c37c620a7cad86f7b4bdccb56da1d",
|
||||
"0x4f0b9cd3797887659aed4dcef6ecd2f022fbb77b83779abf068c12ceae6f15bf",
|
||||
"0xe4087d8f1bdef1a7b3a5144cdb5f5d2d553115a4cfe6b72beda5a929eaeec57a",
|
||||
"0xc3c1aff8ca588e7fa86d2517718d76ee301e7a4fe6f1c2341b02a12d1534fe12",
|
||||
"0xbf4d3ea7101078738cdd2fbd691b6b60ab7b3dba56b7595f7b6f706178981da0",
|
||||
"0xd24b2320e7c3401797aebaf1efd0212596788a23507eba9e92b51551e1b2fbb0",
|
||||
"0x6b14253803767b19ca3cb24a95086c8d7d3eabdc2bc2196be00139f89afd6d80",
|
||||
"0x3e3781d97b5d8285ea66c68512157a70ed198c3c9fac4e4c797d3b0e878fd19a",
|
||||
"0x6c1665c4b9b68d0eecda5be2530b142af404e6e6d6dca6802877fbc64d52a16c",
|
||||
"0xc9a1e9ef2dc8d230c7ffcf46cee9b7b93e4bffcacf3ff9a5baf5103156ee1621",
|
||||
"0x2c9d18bdcd673d8c3cfbee0b109255a83a83e0a70172676739b55d71519cd91a",
|
||||
"0xba052c6ec43b5226718ae924a2b2065d52dd42c53bcde249a4fca0ea9e2bf32d",
|
||||
"0x2183368bf77cf039f4e22ff970ab84f6eef3d69a2a081d2d0b0fdc023346277d",
|
||||
"0x25347d86261fecbf1aa99b6a1e245bfb7a4d3ca3a1caf87a70328ea86d528c6b",
|
||||
"0x4506c19fdeff0b1763516120996b864174bdf33cd6ed8f3642cf522d7453897c",
|
||||
"0xfa0dbce75686d24e02884c7c44ffda3ad81c99d2c2c820533cf0983e6cafa258",
|
||||
"0xea20b4d719c85b5f0f9bc3581cf0b9db484e5ebae5b9275678710d9a4bf82937",
|
||||
"0x3871c8de36feba00ac1e0a5fde6770dd4259b934c49db43232372d4bb9ed8c30",
|
||||
"0x0630cb6a0da32bdf5aed6adf8f75eede08dd8ad4ffc6f662d63c7d4f8700a838",
|
||||
"0x09f0b8b297163a9689dde20f383dcbf3accf9b9fa266b74240fb4e26e737a13d",
|
||||
"0xfed679cdce753b97c3d19778ebeb7616f1f308d6cf57143637c23150dbbe1114",
|
||||
"0x0559b097b7974cc3bcf176f5d4826b4fe47487c9bc461b1fcd89182a5fd739c3",
|
||||
"0x799d0651b0e9a12c74dce11ec9af3ed15b762a1f8ae35d7516ad73833691e17e",
|
||||
"0xda8e0a23e9ef595ebe087eb6ddffe63a933a54783ff0238cd232c6345bfe24b3",
|
||||
"0x454b1c9f7130ed4bc573eff46cec616ddedef3c14a3e06ab0e03b48dd98709eb",
|
||||
"0x73b0f4158f7b98180f282768776cb1b37d2f70b7a4c923324e20933f289f7c14",
|
||||
"0x2f8266751554c995018c4497b150a0f76e8a70715c3e33f5745136227a830164",
|
||||
"0x0a1a9d2252e93028c9bb69cf1fa9ae1090699d960baa15b68f6aef9678788820",
|
||||
"0x8b13ec3689127f51d5e82862b380a04162880aa1e1950a82fb9115f83bfea27b",
|
||||
"0xd0c56341ecd38ad5ecc8c24867d64a75747596757afdcbcec26174d92e42ce59",
|
||||
"0xb75d2027372551198eab90a3c88beb48a61224aa50b3f30a9deae317a02e3dba",
|
||||
"0x4941ee21957780ceae3e609baa52a94afb7dcd9fd7ff8446fa044d0bd3ca5095",
|
||||
"0xe99f45bff96e3015cc698a19dd2b7f25611e642fbc4cf814bd391278a3a5fc63",
|
||||
"0xeb7847c727c6fed9604c19d1cf156d9c1d382eb338d62b600da4fe5a9cb32f9c",
|
||||
"0x8718e416eeb9975a729671c15e0812de63dd45875ffc1dd2f07d3353e00b78e5",
|
||||
"0x3c249822618a0f5861a90866d95f758d1af741951acd38575e7e80ffe4fa3d61",
|
||||
"0xcf53052c009a76eaf5f629c471e71ed0f850a201c216f140646b804f5143c8e3",
|
||||
"0x68d4ce1820fe96d02aeb10a178ebd16aa6cf5dafb36e6190be20642bdf5156b8",
|
||||
"0xf45f0d504dcb1d37fdf73a0cbc0a3c1c0def4c47f5f3fb1290db85e86eff05cc",
|
||||
"0x9786adb9c499160b9c57af19c40d3cd1c8f49544084527f1145db275320109a9",
|
||||
"0x2de8bf50d3f2bdfc7a69d9d84d8ca0e41cbb9bf193364633eb984dc5777391c1",
|
||||
"0x7f39b95ce80f4b91541d81741d59357c4f1feadf6beb85968a5baf4eececa375",
|
||||
"0xda4faa35feca143f1f5dd4503c456a448e2e8fbe0033ef501146698f72ae07a2",
|
||||
"0x69d03b07980a0256ed44d16c0084c7b72b07ad433b8b77b9c175858a80113f3a",
|
||||
"0xc4f0286c31e1f69ec8611efbd82798add4247162ca01674dfdab4e89c807403c",
|
||||
"0xb3d4788c109ced056b7837b1c6a9ebc7d296bbee42df618c2d32b2ba7342c2e4",
|
||||
"0xff111f1b94658b12baf7e655cb92f713f4166580981207f13a55e55b13fc375e",
|
||||
"0xcccac759f059e428771fb21ddd4fde11fc4342d6d9554912887c975dee85203e",
|
||||
"0x88c0f0974ff6b07f53b464123924e2066cfbc07e9b8782bda5e116e175268de4",
|
||||
"0x7b1a526fd2af68abf236f9ea30e4802eb49c3ed2b9ed983916fe8cc11a3ef08f",
|
||||
"0x1032304f9e041de697abf23a0b50858008efd95c4e2e6cf24c524b234af758c2",
|
||||
"0xdfb69e60d16a021b267f15659c72dd566da9bae1775ee003c207b3fbfc3daef1",
|
||||
"0x4de8251aa14a1058c827391b62e70b1b2a09b4d169982656029ef39f734a73c0",
|
||||
"0xd04aa0f4fb73f96b1948d9099be3a3ef9f4bb1755007d692f995fd49c344a005",
|
||||
"0xe8bf94d4615e95aafbde3669413e40670184088cfb023f9fdc128fd482c78d63",
|
||||
"0x3ba788d9abf5242973b1cb7f8f6e2d5d08093b8a736897e4414e524826643fe7",
|
||||
"0x16ceff7c5463b0080c62547529b4b96a08dd01d49d3b2527c61ed151097e614a",
|
||||
"0x0d7d9a889d28c14047b740fe86b68918bcb7f3cd1c29e410ce9ee2cfbdd95764",
|
||||
"0x2d31827b3af0bc45349bfe388d503215bc882d90bcbf2d35bc100ae95f1cdead",
|
||||
"0x84b77d4f0b6076c88d985125e73118e892a3d9c41e4ebebdfe16bcb435253fc6",
|
||||
"0x2a47008833dea7abd3858a580d87106b57355712df26e0cd2ca4436fb6deca34",
|
||||
"0x44a5f14487bfc776bdaeccf1672040548afe787b1237945aaa4ecaa73ff5a41c",
|
||||
"0x3ee99634e1f6fef4520538f32fdbf31dbb77e45a88e9ca56e67c45aa9c3461d1",
|
||||
"0xfc26a8fc353fdfd173571954755d8a9a68157754f1162f4b31f6d8f2b9c86577",
|
||||
"0xe360df35dfb599811c35572a67e21c6e9fb53ab13c833155e6f320b23ce5984b",
|
||||
"0xfb9da18c11f56c2c43d8f38d4efaceb681ccac318cce0bbb0823b4f954fafc9a",
|
||||
"0x0b9b7b663ff8d9d42050aabf2c9d8a1cbc39aae18ec7e1d1e17cd213e89d8998",
|
||||
"0x3e991008da81b6f383e6e5b7499b5af8ef6f5182e5af863d1d0087c6015d75f5",
|
||||
"0x74b1a66ef34f589deb51f8f2fd9e1e422c8703ea027c21387cd45e522f4146a3",
|
||||
"0x4285fcc0deceeaa9bd076fbe956950eb4f3678f2917357fbcb642befd3c5c2a8",
|
||||
"0x52792742145a34104b19b72655cdeab1b5425476fcd68c9596c265cb7becd9c2",
|
||||
"0x1a8b6fa728cc7ead440ec82a9ce3aa0e9211d8a9b210eff5009ced5e6fa9d9a7",
|
||||
"0xc8e72083635887f82299e02d331ac39c61b2749f916a91c1db66943fad9efb75",
|
||||
"0x587bc54ae5c8944ed2d0dcb8beabc55988dc32c4c69ce67f0c4b187badc3807d",
|
||||
"0x19629653ee703764df75ccb9e03c4bf73cbaa0a441c95ea1ecf0cad9f63ee997",
|
||||
"0x9f0d38b7b39838df6ddc474aca1ab5a485bc95dff8cd7ffc9e1001dbf58eff5a",
|
||||
"0x3973c16d0d93ae934cf37c626545e2d938a28fccf359aba3b6676f7be02331fe",
|
||||
"0xa61692812f3ee1abf7c3bc4ed63d94cac20b6c29214ba3489e8259a292a986c7",
|
||||
"0x7ae72f35e70c9b7da0103d34ec208a87b07242eb7f2e62f5c1e3def6dea24f9a",
|
||||
"0x5b026f1a5cac5375a40db884e19f508b175417e7a2994864e321f12494367f40",
|
||||
"0xbc1fb39c00f9c4fd425b4322122174e5eafd71457e8391b551712b3237d0534e",
|
||||
"0x7d7bddabff7dd77f2a4814dc6e78bf75024ad2a399939fcf81a937dc2f2badce",
|
||||
"0x4c978814039087ac7b5f4c9f648d3f1fcb6c8384763626c0897ff5ef32919057",
|
||||
"0x13ebc79e9f13a2592fcc8f9133463f504087c1b948ce044e05c62a8804f1b07d",
|
||||
"0x80bd912a6162263b0d37344089605fa4a947c04f6e7eda2639ae95452296b167",
|
||||
"0xe882df4079584defee65af2156ea7e2591bdea9fb74f0b088c4d0ee10a05f400",
|
||||
"0x4db1886f3f468f3ff17599334c8c74d89d454ca9ce8961f91d55d6d582edc522",
|
||||
"0x086f713234cdade930fccf4d61df5002bd1991b9ba8c5fdc117ab43bde3af22c",
|
||||
"0x1c90c79b72d152595023e861c5a5c7763c84f2b235d18ccde15885d0c714b085",
|
||||
"0x1485bc3b230da6cd97dd81db8afa2a0c60f8a4ed73d6d82b86670f7d26f69be1",
|
||||
"0xb9cd873b3b93734040fa9abf5c867a6cfd9c7a58bd04a9d68949f9d513495cb4",
|
||||
"0xb3b85ae9c30c9a66783730c1e32b7c120543852e7ef2bbb5827d8a15c537478c",
|
||||
"0x36452e6b3b7fd4b17476a429ea6708b8c06f0f2786923e2bf68ae52cddc84df0",
|
||||
"0xb9032a6baa87da1f7b6c48cb00cbf21c0304ca49e9951c08588b9cde7492eb01",
|
||||
"0x76bbe74500f790556ff66bce48c5456192436ced60355aa5aaa45cd549651a8e",
|
||||
"0x3b765f68302bc19b2682dc5de0fc5c6e8e82953d62414c74df1274a29cf404b9",
|
||||
"0x5a797683d466f5a256a20d6141c239d079c3d1b003eb9891c3767b2281273844",
|
||||
"0xb789ec584bb0811cfd1d5491df32deb73660fa2f64329ddb3d71b4fa76b8bda5",
|
||||
"0x0b0e69b821f708f5b86e4d75d9dfa9870ec72b82a0ca96d3e68c6d4f671d530e",
|
||||
"0x506fb874a33e8e80b65bf55fc5efdd23734e86abe150ced7e18c518de3c93b81",
|
||||
"0xd51363ce9a53449678b83eb8a083a8137b3c87e2e6750f2834887c4d3cec325f",
|
||||
"0xfd03fc9a8810f5b5066529b8af38de0f404728ddf0f0813aef7c78cd644f4e93",
|
||||
"0x1f32b92e19891cdb1fa6771ecba7edefbfe97613d1c75b863b9d1def3929a114",
|
||||
"0xaf209ec861712fda0c95e228cc04c1789e4e432ee93abb08aacd0f2777872370",
|
||||
"0xdab1a1858b608c092204e1b2000879090d9c356fee44bb2c79d738d24973d36a",
|
||||
"0x3b8eae3caebf4a011cf24e35d42da5a769b779425b2be793726cfd29a0c25aef",
|
||||
"0xfe661a177cc0932fc78619d2ca605c2b5cb21cc314aec3d07102977e86da2b26",
|
||||
"0x81099b456321a56766f425572d86f5140a1c5adac0c325968aee54801c6cbaf7",
|
||||
"0x9629ebcc5d107a338f4d4d6d90554bd6beb44e009493fc2957d15022331307d9",
|
||||
"0x411d843c497015655abc8ae017f6c8adbf1ce52adae67d13e3adadd88116fdbd",
|
||||
"0x458ceb9ef6549feb3a8a6938f5dea17bfdc355609168091df4911fc1595cad53",
|
||||
"0x2b71649e13089a86dd8c0c1c5081342943d3603ad690e5ead98959c1d686e7eb",
|
||||
"0xe8b298ddfcf62f30b19d80fa80d99d020b3b09f7130349842b1231b3a70645af",
|
||||
"0x36c514c85f3caf8d20523a47572d0475c54a9c42a243feef9291dc679b4ff9da",
|
||||
"0x457a8fa8ae3aea0f7ba861ed2e2b690d38c423c495cce91f0f9dce7488981966",
|
||||
"0x8d195066df807b88acde7f29a9e9ad3498ab8a90f2de2efeb804a8b1139db3f7",
|
||||
"0x3d4bdc98bb6dcd363d9cab40816294086b85633999f7fab221d064c35e329b1f",
|
||||
"0x6a8f2c0cb4cd11cbf2fe39e7c1385dfdebc18db53fdfd553d18c632c46e2dde6",
|
||||
"0xfa818fa1ebc8848b03890051d1b24bf8d151b494b57d7f744615d36aec0db675",
|
||||
"0xac2b249ff31fbdb19aca82718353f2535b45a403495b1b9dd468307f60d98c1e",
|
||||
"0x043e4829c45e250b5f468f5a5ce6da7cb80cc22e8b39cf8032cc86012432cc84",
|
||||
"0x1e576b0877c05ca0e3bd93f8ac2d5396bcd141401751601015907430408a1527",
|
||||
"0x08eadfcc05f4c72efa77bfbae1da0be69ab0fb3c35c7eb568ba93d5d9a072354",
|
||||
"0xaf584d18fed3cd45fa374e9b2b7b9c2c92b1a13d3710d8a9c85e3d8a4e9c87e3",
|
||||
"0xbba83c31c86df1f18007bf62eeeabc364512d490ac6f4ac2a19d5c94e02892f9",
|
||||
"0x64ba9a791d21bf9ebc9b7eb5906006ca99c2f8d82533bc575e910c459b6c837a",
|
||||
"0x1d9e2af1472c96ca43fbbaa293dd7d0934c5604f97cd83f5ecc8d1192205f832",
|
||||
"0x73b035d933685c94ad6ce8ee9cd330f6de4e58e69a4b67ede772c625d08336fd",
|
||||
"0x15bd38181e750225222645a6a0a994266f3961dbcf922f4b9094bbe883e7d283",
|
||||
"0xbcf07b08a9d71b3d35621436d4b07e6b9f54cf250a7c100ebec46b0e85c64cca",
|
||||
"0x1916e862ac6ac13cd4d536a785cdb5fe9e7900e9cd0116e495516ac7f8eaf9e7",
|
||||
"0x64667df61f3ea30a8df061dc9c3063f7e53d9d617f7c97351a47ff2bfec22d4f",
|
||||
"0x854a14169dec6c155afaecbb4d511b6c513be9da27568c0d64ef94b88151e8f7",
|
||||
"0xdba8470330f3b6190f1fcdbeb6e1bda7705e95ffe539633e4ed39f05b9ef4bd7",
|
||||
"0xc71a75c73354d8accaab246eafb170be2e740e800d2b8fa269e710c0ae5e0318",
|
||||
"0x1e50fdc54fddb8b9ec8cc5559dd09537f6062caae18f377b9638aa15572cd74b",
|
||||
"0x3608775dac141092631d66b6a722b58588dc4217a8b6a33dace5d9beddbec657",
|
||||
"0xcc4929d85b2d45ef071b8bb74ce6ad9c7a1820c5838615b94b0d8c9b5d0c4488",
|
||||
"0xeb82d368783b186067be65faba3ed37051b4608f29469dbe746d77171e8c1b5e",
|
||||
"0xd4c595dbf9937b36d1ff1212431e4d0b7ade86a49dc56b62afe2eb7b8cc3cb39",
|
||||
"0x8b2b6c343f36af2dc6a30ef3e9954c789f1236cdd9ee970cc34bd126d5e1c8b8",
|
||||
"0x2bcb0aafc9b29b5c6f7d416dd3aa4ea2b3711c1a551cd9173bf3469cafc6a0e8",
|
||||
"0xe6f04922427e5d7f4c292b9d8f17128fafef19bf20acbb179402c4b83575d024",
|
||||
"0x7c8ee3a97999f0d1c2d65d74ca72ecdd592ed0f504d7cfc02a691a2a2ee87ace",
|
||||
"0xbccdd3bae30bd8a51cf23d218dedcf7d2a2d19fd7f16b3ce2965411d6a8b5000",
|
||||
"0x7e30ab210475c0c73047e2a19ef5c00de6f88cad38fc45e1c7324b2d9b1b7848",
|
||||
"0x0f388ae201bbde36fd43522ba45beb8a6aa9c63bffb0c8937ddcf52f1d6a119b",
|
||||
"0xec6b556c591fe61f349d3b1ef8452b3ed73b7d1dd532372f6fce7595c20453ad",
|
||||
"0xdef410ea480cc214857c404f3560128abf451a131c8bbdc9ac9c726b09eb876e",
|
||||
"0x53cf6a57275ab72a3a0c0e7ab573f39de720d254ab2f3898b5d9446c87c84747",
|
||||
"0xf7c0b80b9a3ddacb729249bc117531902bdb4e0f32b2bb9f289bf2e6da8d40ec",
|
||||
"0x4f27b8550a1ccc34f235fc0cbd2c8a9ebc23ee63f849541af017a474262ea9ac",
|
||||
"0xa463469b7e38dd31f077c838bcfd7e0863f8dbfd73e5066eff1a54a4d05f4ce0",
|
||||
"0xff74aff9fb5807dbe34a595ea457e37412dbca7572b5a44eb5a01fed29a6ba88",
|
||||
"0x908a052d390b315a0f6a96be93ec83a944a9f0364d3d66408db0fc89646f0c92",
|
||||
"0xa44a0ad82a8261aebc439dbb855ab79fc16e32b5379a02cd9a35bf7540de7568",
|
||||
"0xcaa390abae456f7341ad03a6c3f75f5e8ce37ad7b475040fd9da26c1b4759c58",
|
||||
"0xd27db4849e8d13d09bae2edab4ebb53f4a9e3a482b42aba03a5da8c09f313d61",
|
||||
"0x64a2804dd657f03b432f511609a7c3f4ccdcb95d7a0795f93ad78ac25f16f6d9",
|
||||
"0x8df793bf7ea14f04f97402e7e32b38bef2a67338a4b07e2fd9eb56bde2a2bf07",
|
||||
"0x61af9dff3186bf0683a32e5d9c4f4b19c486c015257fa010fb5a78a13e6ddf5e",
|
||||
"0x95b7445c6f7a4829ebc26ce2810571cfb0feff98baaf4bb614f119f5f1da28d9",
|
||||
"0x803ed381cee8191cfab87f046d8a4a52c44430a27af9ed734dc45fe098c66ed5",
|
||||
"0xa0403d2f502ed8c0276b89d5266e2f4e0a6239808cb597e64273c065676a3d47",
|
||||
"0x6f873dd4b1c1212fc1d27db1244e7b05b92cba90a2cc7def330662d3dfa883d6",
|
||||
"0x777f773b7458d3cab3d343d1f5ec39902465aa33d8c93dbea0a7b3d780c3c334",
|
||||
"0x5105901dbcb4680e2fe9ac03f95d014073ca54513ba9f9e7e83a2de46c0a6bba",
|
||||
"0x0183af52777466a1777064712f9255965c73fa24b69de42aa6bb259c19beccc3",
|
||||
"0x938bd32da6b99e0ce404e79790115d9d6678d13ee73e7ca41a6f62d39250f288",
|
||||
"0x7ce5d07372133ed0b39e39e2d342f6eb307171bf58025f48be599a868308ee6c",
|
||||
"0xaeab8e20a6a7933d03a240481df80881df64f96363e114e75af8c95ef37840d9",
|
||||
"0xbd3a5c163974691b00ff0c2fb8a5c99461df825f803f685342fbe8963fa113e5",
|
||||
"0x11b0bf19a5e7f6431ce978222aa961d6b4807462a7991fc79cdbb730bb0573e1",
|
||||
"0xe52aba6a911de3310416eaaa6566280f6c092f36a2c5265290a94e5d55116f16",
|
||||
"0xe1c44c8dcb79e1f4fb5fb104deba26de64d640120e183c5b7e49a1b645743d17",
|
||||
"0x6ef7c7469ee5f5578cdf12ef9b1392df8268e3cf6730697a8a38cd3794e7a9a4",
|
||||
"0xb63357d84981d93c270bbc2b930d783098901a529d338683c2af494c59032bc2",
|
||||
"0x43bf340e40f73e5e6130892e3b9e7febdaa8ab3010d02a2fc2b5be529509fab8",
|
||||
"0xecb0e609e25033c3ab24565ae07580c0c3433ec51fc1338e9071d1a13de2ee31",
|
||||
"0x0912295aa7a8ae5b781b6704b0c47ddc4f4a0c91b4ef79038f889070806781e3",
|
||||
"0x7ded59d270f1dccac585627bb1f3a577b5f507a1e45de94796e0c8d1f861fe63",
|
||||
"0x48750dc05ec66a4e9d9889ae06c58b36b80cd0b8019b7dacc7c3c441ad428e98",
|
||||
"0x53b757f762c6b8f1fd2f9e9ff6dff31d3db0bf325cee0d595773f17585ace7b8",
|
||||
"0xe00cd3d3e7e92feba2b431d7978188dc54feef4effb980c78f18c3646e04749e",
|
||||
"0xc0327f98dad58853bb02588058fcfeaaca268f379228da1dcd1ab05672a055c9",
|
||||
"0x8affeb37939d7ec174ea9c6ae6cd32433bade565494346eeb1c221f1559e1643",
|
||||
"0x78b3c061f2cec2e0324b400933f979f2e8ce920b9c8555b9a5c366b75c3e2e5f",
|
||||
"0xf84eb7d08007ae4891c274208b6f1ce98be7201078e53493f1ef94b9795345ee",
|
||||
"0x6b549294005d285ba7375596c060f2c2dd8d42ba18f533a2b836f7e33c1294f8",
|
||||
"0x2db95fee415c28b95957a54168d542d2659383b602e490f7a76881706f4cddff",
|
||||
"0x558f76d84c39fd6b226672758172f0fb94599061b00700f7c3e360d1464f2faf",
|
||||
"0x5ddca9fb2881b9ae4d0e3ff488987b04856e72ab13b227aa90b277ac18e63c4c",
|
||||
"0xd4a5c132154217e9d026f005fbaf367fccff273091102f04fbd4a7e18fdd2036",
|
||||
"0x6fcd2319ee9439bcc80b6b43e7e4e7755dff4c43a17602a3749c8cb0b5af899b",
|
||||
"0x2159d0c84d1bd380f110b144017096f3307cb229bd33b48ad06796fb95c27179",
|
||||
"0x3ae630c2eab81c778e997ad714e6633d6b71d833c35073853785a53075eed2f9",
|
||||
"0x45b99759dd456a15b1dc318bb4e8067618f18ff18c54fce71655d14b91a32d9e",
|
||||
"0x472ee91d3312972f8df1839027818f5cb890dcab810aed0636a868490d0038d1",
|
||||
"0x4e31c58a256bf19d1e715de52ed0a909fbfa1466292bf00ad759178d4e1745eb",
|
||||
"0x8de82fa65607d7de5bc24a7d44664db7cce9edd606fb7f63efcf2c1e5ac696a7",
|
||||
"0x9b9c7b302722ffbe115c3d3e04871ea434485baaaa7132eef6f0b2113bc8e41e",
|
||||
"0x2e1f2b7dd68827ec0e15e96b67159dc07d5ff796be6f6dae578afc42a3a335a4",
|
||||
"0x9fe4d2e36e10377b604112c507929a43bcd9929034d06d82a83e060614738ef6",
|
||||
"0x5ae4fb3f4b6194ff92b565ce3044de3b8f0fa4b6c026b3df743bf5d5f1defedb",
|
||||
"0xcad14e9d379330699382f121820a82b9465b1f34fe369d596309da29b49d4e0a",
|
||||
"0xd13c8ad553db419a6eca3a9202f8fbdac08e878a4e7a58300135e65a8f1d9bf1",
|
||||
"0x5d71aff2a12d4f1d05c7f760d07b417a39eb0eaa72a01333befc6a2eb6b7d72a",
|
||||
"0x8dd7de9195d2852aeb6812638ba22e73ff5ca0a8ad921c6e924cae1dd5952255",
|
||||
"0x8f1828b4cdc6c38c112b1ffee7790953112dd2225ec82581a5095e5ae4d71cae",
|
||||
"0xfeac88ae6c8529e87a55a259f475b7d162d01e8fa5f36c90d4665dd6105b1743"
|
||||
]
|
||||
},
|
||||
"accounts": {
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
"maximumExtraDataSize": "0x20",
|
||||
"minGasLimit": "0x1388",
|
||||
"networkID" : "0x3",
|
||||
"forkBlock": 641350,
|
||||
"forkCanonHash": "0x8033403e9fe5811a7b6d6b469905915de1c59207ce2172cbcf5d6ff14fa6a2eb",
|
||||
"forkBlock": 3383558,
|
||||
"forkCanonHash": "0x6b4b80d65951375a70bc1ecf9a270d152dd355454d57869abbae2e42c213e0f3",
|
||||
"maxCodeSize": 24576,
|
||||
"maxCodeSizeTransition": 10,
|
||||
"eip155Transition": 10,
|
||||
@@ -53,8 +53,8 @@
|
||||
"gasLimit": "0x1000000"
|
||||
},
|
||||
"hardcodedSync": {
|
||||
"header": "f90214a0e11154bd22ac6a45e9569882d75fca57d12e44e5def1050de0a7b99452fb80d9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794006b2b96ab71a8df73dfabc11ae790f9c8c259a1a0d6216dd88ad006659c6214fd81887150e1bd1f87b248316d3a58cbfe40f521eea026802d5f81a58db8519436e768eae8b11f7de071d7f274487e5b5dd9e6954d7fa03ab8cae24350c9290ed5bb29777ae22498e0b8aa87f0ca85f2bfa74fd95c61b3b901000000000000004002000001000010000004000000000000010000001060000000000000040000000000000000004000040202000c0000000000000421002681102000000001000000000000080010000000010400000410900000000000000210000000025040080000000100000220100010000010000000200000100048008000000000000400800420020004000000208010000000002000000000800000000000000000005000800000000100200000100000000000000000000000000220802180020000000100040000010200000200000000000000000904000000420000008000000022000000000000000000001800000000100000000000008000108412d5f8f8832f60018347b78483449c5b845ae0127896d5830109058650617269747986312e32342e31827769a04a1c4062b2593568cf5fe861cd1b9b9024189927a3c75d09471efa029f7483b08863e584beff5c7905",
|
||||
"totalDifficulty": "8154014315272113",
|
||||
"header": "f90214a04d45aaeb1f0e00495b99f5fdc46c2c1e6b0fd48c693678de72afc1cb6f47a086a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794120c78af68df5957e776554d138a6b75f2c34b6ca0f2746b213421be4ec9cab40fa41aabfb4a3e8acccb6506d6cea4863774374dafa0225a348dfb2ef00db09da39b1a11b31741b6d14fd4456cdf4c2528961f398b74a09528322c1ce98449eed355ddabe0192fac920910a0d88965444b9efc1ac218eab901008000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000040000000000000000000000200000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000100000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000400000000000000000000000000000000000000000000000000000000000000000000008426e4d4518334e0018389545c8306529d845b284db896d583010a068650617269747986312e32362e32826c69a066f990a9ad374c2cb0017e96d3776e6c787f679d77c9079fe2b046279453d0f88851bec8da753bda19",
|
||||
"totalDifficulty": "8635599198809021",
|
||||
"CHTs": [
|
||||
"0x614648fc0a459451850bdfe353a932b5ff824e1b568478394f78b3ed5427e37a",
|
||||
"0x1eae561c582dbb7f4e041998e084e165d0332c915d3a6da367638a8d24f3fafc",
|
||||
@@ -1571,7 +1571,183 @@
|
||||
"0x89ebc269c4a123f9622e89fd221d22776def13c4a9637a7f69176504ed48ac2e",
|
||||
"0x808d7a4793aa0afd91d35a6a46eb4f3ed522c77716fbd27765ad2104d2638d75",
|
||||
"0x5766e58d79181a27639e4e2b1c141de7825e6abe3996d3d06a518bc87044abb0",
|
||||
"0x53e304b2ae212fac8b059d283f8f97553cb16fb3332e8833305a32db18abb5fa"
|
||||
"0x53e304b2ae212fac8b059d283f8f97553cb16fb3332e8833305a32db18abb5fa",
|
||||
"0xae7cbb3a3c753f730905201d09056662cbdd85c288fe94265aec6f1791ecea09",
|
||||
"0xf6521ebf26b89ec9e3f437a8e3f60aee8063a821aa8e2e0694a90835b782b2df",
|
||||
"0xb1e372bf9048f7e44d08b12c45b0a17028571fa84238954760da69bf7565cfa5",
|
||||
"0xfce7f2160459a7e6aae2c85d9d48b5005179c05d703ce890a74b21d993fdb05e",
|
||||
"0xc630b644d1083d77a698f658819ff7440c3e688aa89e18480167e651f8d1ec67",
|
||||
"0x15ce3af581eaafaf4456af97352c4feb66b25aa20d3bd711221bdf8532639406",
|
||||
"0x84600535f9a3338270d3055cb823c2d5a3e7e8a0ad2cc8be198557ea69d15c01",
|
||||
"0x970435f2511428138573c6f1d67c860703ba5504cefcd675c0a77c37b17640f5",
|
||||
"0xa6c0ac36032f2848a2ca230a5773760f2ea3afbd1294c0c8c8734d24f9a2c6ac",
|
||||
"0x3cc9fcbd313d84afa7277112910029782b3b083500080ff34e10507b8b85c249",
|
||||
"0x84cb76db3547f6ae1c91b7cf3196f8db451c020353776199f44b8b529c810ae4",
|
||||
"0xff50e061106f378ccee04ddeaacb2aaf2af4ee90b1504f13a88ee325de268eb7",
|
||||
"0xfc0d53a97fcc0a95f8681674e2f174f789becf7301c0742405c6cd28749acf3a",
|
||||
"0xc0853233a2d93a9fcd5c67da4c233a248df9bd424d3765546c1ed39c42a437e5",
|
||||
"0x8fdfabd694bd2266c71796cf19e8d4967ab9a42dc0d6aaac495c47ed4da9373c",
|
||||
"0x2a8dc4cb7db4cf55beb0eb8662747d464e2907a3dfd0d58ce1067c85de2be0e8",
|
||||
"0xf082d07fdff2f3665019d0fceece5b202c79f8c3b13d4f533f2eab2a83925f23",
|
||||
"0xc155e24d5513d109af50284b49b723cdb1f812ded6d65eb1336cbc2d95b91f0b",
|
||||
"0x435a39e77aa40920f0e7a67fa4547f67e2f099775f3f8a3db3dd1e48b0b2c376",
|
||||
"0xc9a68f80733f9b39794101dc6750747cb6550b7858773de7e323140b1248839d",
|
||||
"0x482140091ed9921f8774a0a1acc3644d2ec7b7019a5d50a0e8f42d9cc729e94e",
|
||||
"0x88e75515699bc267d85f9410411ffa8ea0a852d7ee2fd2826e1260ca0218d497",
|
||||
"0xee78dc1b01b7938dab9691b3a44d10497684fdecbfa4b175c3c688b22c9f563c",
|
||||
"0xf7982d19a9779ea1077bf9cf6392057aa68b834ea3f8b301530484c0b9bbd567",
|
||||
"0x125ef0450026699707ec50bee796181e783efddbf4141f3cdaa000ceada9b77a",
|
||||
"0x3091b7728400f191e3764d5e9ecb8b4887e5e99fdc36b67d1a6f006c16e75ff1",
|
||||
"0x169d3504fb8dd8fe74afef89d5eecaba66adc07f119f1fdc03b4b22419d6c586",
|
||||
"0x6fe28b55a792cb900d1b830a047653e15d12374408a4b5d261e6b0daaa6a654f",
|
||||
"0xe4adf68e5daeb9bedcb6329924c76eb6ff1770e93a7b3ad77d456bfb414c0b94",
|
||||
"0x2ca7094ccb9beb1654ef7aac79af810e31f48e0063525e96ea4cc7548283b120",
|
||||
"0xf087f8821c63865ada8f912bd4da2f6590d00a8a8e530c50d09600be91ea879d",
|
||||
"0xbc106c39ae71e3d8d9c0b8869c63d21a2833cd09104a7fe13c988a1bc115dcfd",
|
||||
"0x8310fa11f25180a7eaec83ad49e58f8344bc1b7b48f15ec12c16afb4399d4b28",
|
||||
"0x5d9902bf98d0edfdf77a8605f15dc36c0d9fbe8fc16330099d8491450ed97819",
|
||||
"0xe1715793831ca9e851f293dca235f53d1985ade89ec0dd08d8478ffac8837fac",
|
||||
"0x86bd483291ed25a967f742e4eabd3f77e178be0fe9af43ce61595fd26e4089a5",
|
||||
"0x3c01d8d2282c6406878471d453f97bc4247ba285ce0bd1fe7bafd21f617fa760",
|
||||
"0xbfc1bfa277a866dc1b1a6739648202e15a90718c67db76af083ea57229e9ea03",
|
||||
"0x1ab9c0778dfb859bc6e13cf425f29c796de5889593130ed9b591e1f854de51f9",
|
||||
"0x235936c148f7a6c4875dfbf30b9a4101cbf329e3d682ec3bd2a6c79473efcd61",
|
||||
"0x70c8282991bed0d69a19adf4c95312dc44f24822f59b915c8aa93a2e8bc322f3",
|
||||
"0xeb2111dc14eec6dc250a382b529af8314a7d8a25bb7672c35685a53d0a6eaf2e",
|
||||
"0x98242a2cef0a5d9258fde45048730a73321b46af2d218203bfd3da274bc3ecea",
|
||||
"0x41de7ce88b052390dedb6dae965ef4b3254dfdb91ef0cff77ed0f990e6d53d1d",
|
||||
"0xb307a83fb32e43ce73d5be05b8dec5791b55ea97abfa2916c3a118540cd8cf14",
|
||||
"0x19c74a02ae96e9581017b8d1845344c0c20f7cb8b8f1cc0e298608e25429ba40",
|
||||
"0x8fd7b83114f3294d9ef1994f96cc5dc3309b80feb86d7384c4797bd88914b4eb",
|
||||
"0x6cbe4c1f28f393db37851436a41d739bc6d64e32553bc3b74a6d390390e29c9b",
|
||||
"0xaff1d11010b3a90a863334bc65678fd1b719a424271c6a384321eaced720521c",
|
||||
"0xb30947d573b684f02f2bdaf32241f9984e0fe1ccd2398013d7f55d0de0e8db7b",
|
||||
"0x2777c4133201edad3b7478cf06b4418573bbb0b35a94956489f2c207a8ce07d1",
|
||||
"0x852612bd283bec671358a009c4c02f57d7b150c466a673ffb7094ab8167e195b",
|
||||
"0xb9b88021540165e714518c5ea97152e7a57214c2bb30143d0aeecd650b69c011",
|
||||
"0xfa3a3d52ffe85f56b28a7d3613c50ab16a98dd0e5b14690676a0917b0d9821a6",
|
||||
"0x1b4251f32144ee3ff35ec96c13739bf11940a7b7c0ad7819fb14508e37318179",
|
||||
"0xb47b35b1a9efb47e5267e75bdd43cca5730b1dfe7c74fe70c854c26bc67eac20",
|
||||
"0xcfcb740a8d76d44484ac862bc7bdf6b932a76a1128c77f4543e3310ad408416f",
|
||||
"0x3c01a05b0ca98646fdcc76b2a95ff1ff958f61aa6f7ff199bdda9e354a7de21b",
|
||||
"0x337c18196aa613d56cd098d128126403cb03b5172175f9b0cb3599c76499c358",
|
||||
"0xe1773100b144b6612c5a811e80b6c4ce002ca6c0afedf9e2c82228c0d499586a",
|
||||
"0x7f10533e666fe853571ed79da196262e8a69c2cb99222d26e0165808ab6d7582",
|
||||
"0x2532a4dca10fcdb5d33c84c0b295dc6bddaec6f29030f4a74585a7718aa04bd7",
|
||||
"0x1f6c65ac839c5e76c955848ef97b3aa1a095b9b77faa155278f793996cb8d438",
|
||||
"0xc80d98e457a316951cb28828744885346b14e545dee625ce24c062ae30fb7867",
|
||||
"0xb12c58437021718ad76e64e66259186a53421366acf78f871d53ecceab7bfaf3",
|
||||
"0x4fced8fe6a8c19e32144376daaf080b4d6c8a77ab8e7f91d099881fbbfc091fc",
|
||||
"0x1c2afc3229797fcaeb2df0293259564f45b4cf1fba17c2e5e266747fd24472d1",
|
||||
"0x087e44d23f6cbc2233738ab793cf30306c222445e2404e1346c1609ccafae040",
|
||||
"0x75e290747c7001e7e2fd8d26ea54c3b733e697a6dc5832e9c518041d58810a31",
|
||||
"0xe7e457e551cd6797d18ce084d19d4d87ed31d07cde475f2e25f5ed1b750c2c64",
|
||||
"0xde5c26097beb3a1d3212c9aa0de1970f599a16ecd9197abee5b3a3b281e57cfc",
|
||||
"0x45a1df846c4b8b4e2ff8d674d7133bac3e98098ca6b594714007d2e5f211950e",
|
||||
"0x6617fad5c634c52d5fa9118e6cf0a53d5f13eec7c1ac9220f15ef53746c82aa8",
|
||||
"0xd34a1393ebb316793e8fce4212a9853a4f44710fc9a9838caa605518b4fca573",
|
||||
"0x3e8a846225e07e62bc18df6e31929b830aba74aa96fe661d5cc0b100fd999b17",
|
||||
"0x3193c7cfbe7d2ecca6d37e6385d69463362d4b12e6f9e4d2f6ee996e6413afdc",
|
||||
"0x2ce3aaebfe489553bca7435ae95401731f4cdfa2256a570f64abfb407f7063ed",
|
||||
"0x3173dd10922eb73900cf8e32f91dac0ad05d347c9068905b549f743a8f16a751",
|
||||
"0x62fd37c8031ef4693dc0de52dbe06c293249ce2ce4b3be0b7a02c607bfded1c4",
|
||||
"0xc2580dae73e6b96af85676116914b8a247ab8b368ebb1d2d38640b8a726fe0fd",
|
||||
"0x8025d1c443ce28c8d35974af5e31d934bb3b08cd10a24c95bbd1efc78bc7eb10",
|
||||
"0x7a05e4e6aee417c062142c03a47a8be9674d57b445ec0f8629936dc9f5bfd52f",
|
||||
"0xac55c7dc4cd5f7a90bfd9a386d598e95501b8aad159cdd0d8ddab691eba76049",
|
||||
"0x3296a64eb4b70230366b27a448b42177c5cee1fa7913938d4767696a6570b4f8",
|
||||
"0x478ecfbe71160700d04a9052cbb91d62920db80489534887c382be5399776faf",
|
||||
"0x4530a0a6e3fe3fee4e79c60bd0599c76dc82e841523ef667885d4b1cd02ddd4f",
|
||||
"0x25d4fa59ecec69d0ff70e70fcba3c7fa6ca5b0689048ce038141293775a8dcd0",
|
||||
"0x03020dc01c0785c3e3fed74535db3aa3546916d25cd49876839632a929e51268",
|
||||
"0xeb9ba2f7ea0d80cf7a563ce5e7edbc4ef638962a5a4c16f74ba8feca76668a0d",
|
||||
"0x6a7a46ffefc8ff2edaffb608a0b7f57ff514398e54f4dc10a1d4cf218b20c7a9",
|
||||
"0x5bc4c7f447e2821b1b4c94e2eaf754e9478c50d2488d246243b524e8addd18d3",
|
||||
"0xd3eed3c14d29c81ec39a8ff6f75bbea5a8eae9f713e2e2e54bb6b824ed05028c",
|
||||
"0x39429d962be1e6aa0b47cef6fb92c3433c54775718d865d5cf7110463613b7ae",
|
||||
"0x51f19c8404e99f31c464e2cdbc5e44ed0d9486cd0efeea7894c740fae39ea641",
|
||||
"0xc3695934786b04d41b3c5da84445a06e1fbb5a20e344146c1065845acc9abcd1",
|
||||
"0xf177f104e6bb76e81e553ed80eb7064d3e6b74b2617c96a446ab9742e2d62002",
|
||||
"0xe827aacb085e41a63526fa9809b3044f2a5186a04ef4e257dff1621c9052cb32",
|
||||
"0x9fdd2ae7875a3129242552756462870f1bb831077f48b436608fbc9c11a0d629",
|
||||
"0xacc8c222a52ca74e17aafa6f0f1d962107c0ab9ce4445a429ad955692d7c7aac",
|
||||
"0xfea8015b875507e5621ad868954241c2b6de02545a2acaeb2f9109fa30384215",
|
||||
"0x869cfeeb4898e17ab4850bd5e3797bc141f4814e5409df02725d345b57c64ad3",
|
||||
"0x38b6c1377ada6abc07a7e7f3a92779907ce2f1064abd0b9be038d6ae51a4b276",
|
||||
"0xf54091e4e9e9a758fdd8b00b9a78b4c91e17c01ce305041b4bf69d21c743fc45",
|
||||
"0xd230e2b5c01fbb2ae97c27d70a8a1264c003e815809fb4240f7b500c63bfe82e",
|
||||
"0xc126f31bd32f9aecb8012f206c64e6c05b60f863af3a9225c8971903290990ad",
|
||||
"0xf6cdbf25100cc3839c4944180eb9f3f1beec798737a3f6f6074e612520d3de30",
|
||||
"0xea3098d0600c35c4c62b440181092fd61676c207bddf3482c31bcd19fb352c87",
|
||||
"0xc0c9da7c976544e331c40b34830f208b9638670fff5103d0c800542ee3f81b9f",
|
||||
"0x5fa65f0d1c70d8340feb251a52e955a10151b0cb8200c00514b4a8df1995ca8e",
|
||||
"0xeb44462413e46dcd9f49c3d5cb556eccc8e881861459fa35d83e256e7e007dac",
|
||||
"0x3e44a1713f55e1f6f9130b8846dce91f710c1fb8c77298de2d09425c725c04e7",
|
||||
"0x66fd8f8922d09de2f4e9dbd8d45c04a9461bdb5d88c5df9e897acf165f7634f5",
|
||||
"0x6ad50a6f3f0db27728a9e948bd18db4d8ad025878bc1401fe8f9786446163bc2",
|
||||
"0xe93822a027e88efdf7089adc382857f2fdc960c906314284759b6b5b6d3d4181",
|
||||
"0x883772056f1957b772374333addcd927ca88de3f750ef89cf8dd4ba9f6f212dc",
|
||||
"0x588861a7f2b707bdc3c85168ae2116c9775321b2d8c6f877309fb02e17a42c84",
|
||||
"0xc8a88e9261c63b7a96b2345b7ce9d3a9b94d99469b68a400d73d808d84c5b0e0",
|
||||
"0x1d7e0b13963d58e279ef24c9ce3d67d010dea519afc4bfad84e518a719f73755",
|
||||
"0x057ab7682cc73ccdde80b76f64ceaf1702da7010953691e1d2d305daaa0e2770",
|
||||
"0xb3e06d340bedc968190ec1aa0f7c2798472bce88eb07e016ab81033037b7ca96",
|
||||
"0x6c4a17d4fbfd0ee8ced914ba9c2c83e394527fa36e2027e1b22cfcc49f069de7",
|
||||
"0x9c66d88937ac802e5fd961fd0da8f5e493de32f6ff63bb8d2ab785e8f87192f5",
|
||||
"0x3fdb9093f1a679d472e4ea81dacaaec8b3a060f71422ce815e3318ba212fad97",
|
||||
"0x17792f6c2d5c2be0666702249fcb36904fe029bb7f6b1dca95af32182295f3e1",
|
||||
"0xe6aafe170dac781c3e576d7616bf963dbfd5d1d27738e0cd6fdd759e6174700a",
|
||||
"0x6321683aa65da9013794d27333fd3b7d570c4e100156d44e999a930a634a3cdd",
|
||||
"0x8aa56c35f7c70629a4b9272b1391e13c080c97c03b3ed675bd46737119f341b8",
|
||||
"0x0f8384a649c8dfc242484c669ac4a798bb19b89f85d4d245b8415aa4dad0711d",
|
||||
"0x041669c526354ff960ef721d72306b3a9d5e5a59501d565aaf1036f8d6d1aa0d",
|
||||
"0x0af7915a53ade49d28eaefc8f43f24500a5a12acd06f23c80b8ab675220ade3e",
|
||||
"0x5aeee4a33bacd934feac2c3e6a46cae5d00cac6ff8fa57167100d66e5ee73456",
|
||||
"0x44aa02ff76be04a0ac59b4491ae9a6ae8cd475fb058dbd4c94220d26d554126a",
|
||||
"0xed5b8883a073d192663e45eaaa55eaa840155bb9a201065cc61eefe2917c6ed2",
|
||||
"0x4d856173cdfb61fb83d755b1957e39609a915c45f3b29950acb4cffd012cc3ad",
|
||||
"0x50af3f28ce9ce9e95f664d2fa59afa461e88e949a0584407a92c113828248844",
|
||||
"0x2ab900c46ed0980623eaa1cb61df89ff92d949bfdccc568ccb2183f83ef622a1",
|
||||
"0xf2765636da2615454790b314148be63ad8008d0f6880dfc7767d36b88b753c31",
|
||||
"0xc5df53c2589fbb388cae91b2efd03c1c707615e05e12f3e681def70e0d913697",
|
||||
"0xa386bbfb9634a6f910e7052e188a81c9a6a1a318d340703c8e29dcee4b57eea6",
|
||||
"0xad19889349d7d41230cb039ed46289e7e9ea0fb76ef2ee427d5a05892fe680ef",
|
||||
"0xda6802024bf8ce4c2152fd2f1c166868159a2c4c70df00b28ede48644ee731cc",
|
||||
"0xa563da16e6fa8a65b523d67399fdb3b5492508901037ad76f5f41aaa174a780d",
|
||||
"0x9ee367b021d6ac2e516f16f48961de800b89f9b7115ae616b52d746b7ba8ef0b",
|
||||
"0x37aeefeb48b2613b4afac289022e1707da0c596d6d8b85e59505ec5a3f47b7f5",
|
||||
"0xbd0a3c7cb0d4c60411db3290cd2d0cda5c21cf22d9e36b8dc77fb7f572c806b7",
|
||||
"0xe5d875bca8c6da0c24c0b7ee191168e22af7c99d3b7d58246eb1675bd3c090f4",
|
||||
"0x9365c55d9be42230ba376054ca9df4346803e63ea4cb683261de4c497f92b329",
|
||||
"0x0b8024d771e5f167db261b3da6f16e745198fb5ff550c51e689c3387fafc3efd",
|
||||
"0x9cb78e33aed15fa5b6094e978883d147e8329ccd7371518cbf6da96b97dc9f70",
|
||||
"0x6f6dcaf8f0ae184c7c065e322e390f27e27f3c4c554158bee433430aa5319108",
|
||||
"0x0c729da3730254b379cc130776a9ea79575e7cd88071423a0635aa18f4aed0d5",
|
||||
"0x0f918fff241f4492e630717a91c58af660b02201a64bd14d3a577b1c9390f5bc",
|
||||
"0x6a33af88b454aeb3fcddcfa5043af313158de701d5227915e2d835bd8f2eb7db",
|
||||
"0x7344a8e8ceafb36aee8bc1e3a1ca73168f583ecc7959e72b8a223fe252ad60dc",
|
||||
"0xf457f0572ddee6c71e79f5f8d0643e4b59abd1798ac9dc5f158ea75efaff389d",
|
||||
"0x0cbe584ca5e7a45b7fabdda306eb5c0f9b015cfe6f30ca451065bb38541b2bfd",
|
||||
"0x91f35848c79274053eb0294be8395082ce4e5c08b5e6560fb9f3758609066ccc",
|
||||
"0x4999f6428a7e0077f71eb127218270468f57561da1799470cfd736992013e074",
|
||||
"0x042f9db538d5b8344279fadd5d3c8da5b4b9b455ee1d94aac1606272d052eca3",
|
||||
"0xfb28b022f556e4344360b479d809cdad7ba7ee86a5e4943928f1dcf3f57a133d",
|
||||
"0x687178fcd4ced35dc148a0e142276524d03240f750fe5cfa3d034e3fb9fcb4eb",
|
||||
"0x441172f8e8b24698a50668aa6136b489bc85b7b21648e29f8ed1683399e7c56a",
|
||||
"0x5f8c54d03b4fd64a2e5b526058bad1a27ba26f0feafc914fd6fb01b7fd31eb57",
|
||||
"0x112af02bf0fafb42cc9e7b2b3985c5be78c3320550768d8bd271d62743a3a04c",
|
||||
"0xf84b6ecc88fdd759a1c2263a0a4226a753b62a10df3fd7f094a1c9df7ea5918e",
|
||||
"0x54ae04f6da0a8351f4ee4a2e36e1832329d5b6dd22452374abe1335914b36baa",
|
||||
"0x52ab4533e536b7649979822857b1369df6cb0299f0f4ab32da6b8a7d2cff864c",
|
||||
"0x8fc44fa1f6fe9e0b96b1f72da8b9936419a10a49ea5c02ba543a22b9f32e0618",
|
||||
"0x95ee4eeba33f81a8d5eda57de81c3617fe03f785e7d9e90c085b91fe23a57a1c",
|
||||
"0xadbc77bb5afc1c93a42d799fdff05e15998a17aa17d477611d9ba1d68b4abaa0",
|
||||
"0x80ef051da1139c8f714f152629ca8b4607e82abc097d5f67bf66e26e3ec4b83b",
|
||||
"0x6dad58c6230b60017db9536548b99c725644168f55d4cb2a1a0353a5e948b0de",
|
||||
"0x8baa0703e1a050c40f85dc850fe477881f432c951b1cc1b2b71ffb68ab7fe0d7",
|
||||
"0x14ca94dfd343548e32ef5659c043d6e28f0e577fd38da1ee12f11c08e281d775",
|
||||
"0xef25357970c76a8b72a6e52f49bc30651f711c7df70444d4667e80febc0e3b2a",
|
||||
"0x41b8b4ebd5919dad3bc609ded524b97403d88f019367f0f4f622561131644ffb"
|
||||
]
|
||||
},
|
||||
"nodes": [
|
||||
|
||||
@@ -272,8 +272,8 @@ impl AccountProvider {
|
||||
}
|
||||
|
||||
/// Checks whether an account with a given address is present.
|
||||
pub fn has_account(&self, address: Address) -> Result<bool, Error> {
|
||||
Ok(self.sstore.account_ref(&address).is_ok() && !self.blacklisted_accounts.contains(&address))
|
||||
pub fn has_account(&self, address: Address) -> bool {
|
||||
self.sstore.account_ref(&address).is_ok() && !self.blacklisted_accounts.contains(&address)
|
||||
}
|
||||
|
||||
/// Returns addresses of all accounts.
|
||||
|
||||
@@ -1394,18 +1394,24 @@ impl BlockChain {
|
||||
|
||||
/// Returns general blockchain information
|
||||
pub fn chain_info(&self) -> BlockChainInfo {
|
||||
// Make sure to call internal methods first to avoid
|
||||
// recursive locking of `best_block`.
|
||||
let first_block_hash = self.first_block();
|
||||
let first_block_number = self.first_block_number().into();
|
||||
let genesis_hash = self.genesis_hash();
|
||||
|
||||
// ensure data consistencly by locking everything first
|
||||
let best_block = self.best_block.read();
|
||||
let best_ancient_block = self.best_ancient_block.read();
|
||||
BlockChainInfo {
|
||||
total_difficulty: best_block.total_difficulty,
|
||||
pending_total_difficulty: best_block.total_difficulty,
|
||||
genesis_hash: self.genesis_hash(),
|
||||
genesis_hash,
|
||||
best_block_hash: best_block.header.hash(),
|
||||
best_block_number: best_block.header.number(),
|
||||
best_block_timestamp: best_block.header.timestamp(),
|
||||
first_block_hash: self.first_block(),
|
||||
first_block_number: From::from(self.first_block_number()),
|
||||
first_block_hash,
|
||||
first_block_number,
|
||||
ancient_block_hash: best_ancient_block.as_ref().map(|b| b.hash),
|
||||
ancient_block_number: best_ancient_block.as_ref().map(|b| b.number),
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ use ethereum_types::H256;
|
||||
use blockchain::block_info::{BlockInfo, BlockLocation};
|
||||
|
||||
/// Import route for newly inserted block.
|
||||
#[derive(Debug, PartialEq)]
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
pub struct ImportRoute {
|
||||
/// Blocks that were invalidated by new block.
|
||||
pub retracted: Vec<H256>,
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
use bytes::Bytes;
|
||||
use ethereum_types::H256;
|
||||
use transaction::UnverifiedTransaction;
|
||||
use blockchain::ImportRoute;
|
||||
use std::time::Duration;
|
||||
use std::collections::HashMap;
|
||||
|
||||
/// Messages to broadcast via chain
|
||||
pub enum ChainMessageType {
|
||||
@@ -28,6 +31,89 @@ pub enum ChainMessageType {
|
||||
SignedPrivateTransaction(Vec<u8>),
|
||||
}
|
||||
|
||||
/// Route type to indicate whether it is enacted or retracted.
|
||||
#[derive(Clone)]
|
||||
pub enum ChainRouteType {
|
||||
/// Enacted block
|
||||
Enacted,
|
||||
/// Retracted block
|
||||
Retracted
|
||||
}
|
||||
|
||||
/// A complete chain enacted retracted route.
|
||||
#[derive(Default, Clone)]
|
||||
pub struct ChainRoute {
|
||||
route: Vec<(H256, ChainRouteType)>,
|
||||
enacted: Vec<H256>,
|
||||
retracted: Vec<H256>,
|
||||
}
|
||||
|
||||
impl<'a> From<&'a [ImportRoute]> for ChainRoute {
|
||||
fn from(import_results: &'a [ImportRoute]) -> ChainRoute {
|
||||
ChainRoute::new(import_results.iter().flat_map(|route| {
|
||||
route.retracted.iter().map(|h| (*h, ChainRouteType::Retracted))
|
||||
.chain(route.enacted.iter().map(|h| (*h, ChainRouteType::Enacted)))
|
||||
}).collect())
|
||||
}
|
||||
}
|
||||
|
||||
impl ChainRoute {
|
||||
/// Create a new ChainRoute based on block hash and route type pairs.
|
||||
pub fn new(route: Vec<(H256, ChainRouteType)>) -> Self {
|
||||
let (enacted, retracted) = Self::to_enacted_retracted(&route);
|
||||
|
||||
Self { route, enacted, retracted }
|
||||
}
|
||||
|
||||
/// Gather all non-duplicate enacted and retracted blocks.
|
||||
fn to_enacted_retracted(route: &[(H256, ChainRouteType)]) -> (Vec<H256>, Vec<H256>) {
|
||||
fn map_to_vec(map: Vec<(H256, bool)>) -> Vec<H256> {
|
||||
map.into_iter().map(|(k, _v)| k).collect()
|
||||
}
|
||||
|
||||
// Because we are doing multiple inserts some of the blocks that were enacted in import `k`
|
||||
// could be retracted in import `k+1`. This is why to understand if after all inserts
|
||||
// the block is enacted or retracted we iterate over all routes and at the end final state
|
||||
// will be in the hashmap
|
||||
let map = route.iter().fold(HashMap::new(), |mut map, route| {
|
||||
match &route.1 {
|
||||
&ChainRouteType::Enacted => {
|
||||
map.insert(route.0, true);
|
||||
},
|
||||
&ChainRouteType::Retracted => {
|
||||
map.insert(route.0, false);
|
||||
},
|
||||
}
|
||||
map
|
||||
});
|
||||
|
||||
// Split to enacted retracted (using hashmap value)
|
||||
let (enacted, retracted) = map.into_iter().partition(|&(_k, v)| v);
|
||||
// And convert tuples to keys
|
||||
(map_to_vec(enacted), map_to_vec(retracted))
|
||||
}
|
||||
|
||||
/// Consume route and return the enacted retracted form.
|
||||
pub fn into_enacted_retracted(self) -> (Vec<H256>, Vec<H256>) {
|
||||
(self.enacted, self.retracted)
|
||||
}
|
||||
|
||||
/// All non-duplicate enacted blocks.
|
||||
pub fn enacted(&self) -> &[H256] {
|
||||
&self.enacted
|
||||
}
|
||||
|
||||
/// All non-duplicate retracted blocks.
|
||||
pub fn retracted(&self) -> &[H256] {
|
||||
&self.retracted
|
||||
}
|
||||
|
||||
/// All blocks in the route.
|
||||
pub fn route(&self) -> &[(H256, ChainRouteType)] {
|
||||
&self.route
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents what has to be handled by actor listening to chain events
|
||||
pub trait ChainNotify : Send + Sync {
|
||||
/// fires when chain has new blocks.
|
||||
@@ -35,12 +121,11 @@ pub trait ChainNotify : Send + Sync {
|
||||
&self,
|
||||
_imported: Vec<H256>,
|
||||
_invalid: Vec<H256>,
|
||||
_enacted: Vec<H256>,
|
||||
_retracted: Vec<H256>,
|
||||
_route: ChainRoute,
|
||||
_sealed: Vec<H256>,
|
||||
// Block bytes.
|
||||
_proposed: Vec<Bytes>,
|
||||
_duration: u64,
|
||||
_duration: Duration,
|
||||
) {
|
||||
// does nothing by default
|
||||
}
|
||||
|
||||
@@ -14,12 +14,12 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use std::collections::{HashSet, HashMap, BTreeMap, BTreeSet, VecDeque};
|
||||
use std::collections::{HashSet, BTreeMap, BTreeSet, VecDeque};
|
||||
use std::fmt;
|
||||
use std::str::FromStr;
|
||||
use std::sync::{Arc, Weak};
|
||||
use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering};
|
||||
use std::time::{Instant};
|
||||
use std::time::{Instant, Duration};
|
||||
|
||||
// util
|
||||
use hash::keccak;
|
||||
@@ -33,7 +33,7 @@ use util_error::UtilError;
|
||||
// other
|
||||
use ethereum_types::{H256, Address, U256};
|
||||
use block::{IsBlock, LockedBlock, Drain, ClosedBlock, OpenBlock, enact_verified, SealedBlock};
|
||||
use blockchain::{BlockChain, BlockProvider, TreeRoute, ImportRoute, TransactionAddress};
|
||||
use blockchain::{BlockChain, BlockProvider, TreeRoute, ImportRoute, TransactionAddress};
|
||||
use client::ancient_import::AncientVerifier;
|
||||
use client::Error as ClientError;
|
||||
use client::{
|
||||
@@ -46,8 +46,8 @@ use client::{
|
||||
use client::{
|
||||
BlockId, TransactionId, UncleId, TraceId, ClientConfig, BlockChainClient,
|
||||
TraceFilter, CallAnalytics, BlockImportError, Mode,
|
||||
ChainNotify, PruningInfo, ProvingBlockChainClient, EngineInfo, ChainMessageType,
|
||||
IoClient,
|
||||
ChainMessageType, ChainNotify, ChainRoute, PruningInfo, ProvingBlockChainClient,
|
||||
EngineInfo, IoClient,
|
||||
};
|
||||
use encoded;
|
||||
use engines::{EthEngine, EpochTransition};
|
||||
@@ -125,7 +125,7 @@ impl<'a> ::std::ops::Sub<&'a ClientReport> for ClientReport {
|
||||
self.blocks_imported -= other.blocks_imported;
|
||||
self.transactions_applied -= other.transactions_applied;
|
||||
self.gas_processed = self.gas_processed - other.gas_processed;
|
||||
self.state_db_mem = higher_mem - lower_mem;
|
||||
self.state_db_mem = higher_mem - lower_mem;
|
||||
|
||||
self
|
||||
}
|
||||
@@ -257,32 +257,6 @@ impl Importer {
|
||||
})
|
||||
}
|
||||
|
||||
fn calculate_enacted_retracted(&self, import_results: &[ImportRoute]) -> (Vec<H256>, Vec<H256>) {
|
||||
fn map_to_vec(map: Vec<(H256, bool)>) -> Vec<H256> {
|
||||
map.into_iter().map(|(k, _v)| k).collect()
|
||||
}
|
||||
|
||||
// In ImportRoute we get all the blocks that have been enacted and retracted by single insert.
|
||||
// Because we are doing multiple inserts some of the blocks that were enacted in import `k`
|
||||
// could be retracted in import `k+1`. This is why to understand if after all inserts
|
||||
// the block is enacted or retracted we iterate over all routes and at the end final state
|
||||
// will be in the hashmap
|
||||
let map = import_results.iter().fold(HashMap::new(), |mut map, route| {
|
||||
for hash in &route.enacted {
|
||||
map.insert(hash.clone(), true);
|
||||
}
|
||||
for hash in &route.retracted {
|
||||
map.insert(hash.clone(), false);
|
||||
}
|
||||
map
|
||||
});
|
||||
|
||||
// Split to enacted retracted (using hashmap value)
|
||||
let (enacted, retracted) = map.into_iter().partition(|&(_k, v)| v);
|
||||
// And convert tuples to keys
|
||||
(map_to_vec(enacted), map_to_vec(retracted))
|
||||
}
|
||||
|
||||
/// This is triggered by a message coming from a block queue when the block is ready for insertion
|
||||
pub fn import_verified_blocks(&self, client: &Client) -> usize {
|
||||
|
||||
@@ -343,27 +317,22 @@ impl Importer {
|
||||
self.block_queue.mark_as_bad(&invalid_blocks);
|
||||
}
|
||||
let is_empty = self.block_queue.mark_as_good(&imported_blocks);
|
||||
let duration_ns = {
|
||||
let elapsed = start.elapsed();
|
||||
elapsed.as_secs() * 1_000_000_000 + elapsed.subsec_nanos() as u64
|
||||
};
|
||||
(imported_blocks, import_results, invalid_blocks, imported, proposed_blocks, duration_ns, is_empty)
|
||||
(imported_blocks, import_results, invalid_blocks, imported, proposed_blocks, start.elapsed(), is_empty)
|
||||
};
|
||||
|
||||
{
|
||||
if !imported_blocks.is_empty() && is_empty {
|
||||
let (enacted, retracted) = self.calculate_enacted_retracted(&import_results);
|
||||
let route = ChainRoute::from(import_results.as_ref());
|
||||
|
||||
if is_empty {
|
||||
self.miner.chain_new_blocks(client, &imported_blocks, &invalid_blocks, &enacted, &retracted, false);
|
||||
self.miner.chain_new_blocks(client, &imported_blocks, &invalid_blocks, route.enacted(), route.retracted(), false);
|
||||
}
|
||||
|
||||
client.notify(|notify| {
|
||||
notify.new_blocks(
|
||||
imported_blocks.clone(),
|
||||
invalid_blocks.clone(),
|
||||
enacted.clone(),
|
||||
retracted.clone(),
|
||||
route.clone(),
|
||||
Vec::new(),
|
||||
proposed_blocks.clone(),
|
||||
duration,
|
||||
@@ -1030,7 +999,8 @@ impl Client {
|
||||
/// Otherwise, this can fail (but may not) if the DB prunes state.
|
||||
pub fn state_at_beginning(&self, id: BlockId) -> Option<State<StateDB>> {
|
||||
match self.block_number(id) {
|
||||
None | Some(0) => None,
|
||||
None => None,
|
||||
Some(0) => self.state_at(id),
|
||||
Some(n) => self.state_at(BlockId::Number(n - 1)),
|
||||
}
|
||||
}
|
||||
@@ -1446,7 +1416,7 @@ impl Call for Client {
|
||||
}
|
||||
|
||||
fn estimate_gas(&self, t: &SignedTransaction, state: &Self::State, header: &Header) -> Result<U256, CallError> {
|
||||
let (mut upper, max_upper, env_info) = {
|
||||
let (mut upper, max_upper, env_info) = {
|
||||
let init = *header.gas_limit();
|
||||
let max = init * U256::from(10);
|
||||
|
||||
@@ -2041,15 +2011,16 @@ impl IoClient for Client {
|
||||
let first = queued.write().1.pop_front();
|
||||
if let Some((header, block_bytes, receipts_bytes)) = first {
|
||||
let hash = header.hash();
|
||||
client.importer.import_old_block(
|
||||
let result = client.importer.import_old_block(
|
||||
&header,
|
||||
&block_bytes,
|
||||
&receipts_bytes,
|
||||
&**client.db.read(),
|
||||
&*client.chain.read()
|
||||
).ok().map_or((), |e| {
|
||||
&*client.chain.read(),
|
||||
);
|
||||
if let Err(e) = result {
|
||||
error!(target: "client", "Error importing ancient block: {}", e);
|
||||
});
|
||||
}
|
||||
// remove from pending
|
||||
queued.write().0.remove(&hash);
|
||||
} else {
|
||||
@@ -2171,20 +2142,16 @@ impl ImportSealedBlock for Client {
|
||||
self.state_db.write().sync_cache(&route.enacted, &route.retracted, false);
|
||||
route
|
||||
};
|
||||
let (enacted, retracted) = self.importer.calculate_enacted_retracted(&[route]);
|
||||
self.importer.miner.chain_new_blocks(self, &[h.clone()], &[], &enacted, &retracted, self.engine.seals_internally().is_some());
|
||||
let route = ChainRoute::from([route].as_ref());
|
||||
self.importer.miner.chain_new_blocks(self, &[h.clone()], &[], route.enacted(), route.retracted(), true);
|
||||
self.notify(|notify| {
|
||||
notify.new_blocks(
|
||||
vec![h.clone()],
|
||||
vec![],
|
||||
enacted.clone(),
|
||||
retracted.clone(),
|
||||
route.clone(),
|
||||
vec![h.clone()],
|
||||
vec![],
|
||||
{
|
||||
let elapsed = start.elapsed();
|
||||
elapsed.as_secs() * 1_000_000_000 + elapsed.subsec_nanos() as u64
|
||||
},
|
||||
start.elapsed(),
|
||||
);
|
||||
});
|
||||
self.db.read().flush().expect("DB flush failed.");
|
||||
@@ -2194,15 +2161,15 @@ impl ImportSealedBlock for Client {
|
||||
|
||||
impl BroadcastProposalBlock for Client {
|
||||
fn broadcast_proposal_block(&self, block: SealedBlock) {
|
||||
const DURATION_ZERO: Duration = Duration::from_millis(0);
|
||||
self.notify(|notify| {
|
||||
notify.new_blocks(
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
ChainRoute::default(),
|
||||
vec![],
|
||||
vec![block.rlp_bytes()],
|
||||
0,
|
||||
DURATION_ZERO,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ pub use self::error::Error;
|
||||
pub use self::evm_test_client::{EvmTestClient, EvmTestError, TransactResult};
|
||||
pub use self::io_message::ClientIoMessage;
|
||||
pub use self::test_client::{TestBlockChainClient, EachBlockWith};
|
||||
pub use self::chain_notify::{ChainNotify, ChainMessageType};
|
||||
pub use self::chain_notify::{ChainNotify, ChainRoute, ChainRouteType, ChainMessageType};
|
||||
pub use self::traits::{
|
||||
Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, CallContract, TransactionInfo, RegistryInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock,
|
||||
StateOrBlock, StateClient, Call, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter
|
||||
|
||||
@@ -382,12 +382,16 @@ impl Decodable for SealedEmptyStep {
|
||||
}
|
||||
}
|
||||
|
||||
struct PermissionedStep {
|
||||
inner: Step,
|
||||
can_propose: AtomicBool,
|
||||
}
|
||||
|
||||
/// Engine using `AuthorityRound` proof-of-authority BFT consensus.
|
||||
pub struct AuthorityRound {
|
||||
transition_service: IoService<()>,
|
||||
step: Arc<Step>,
|
||||
can_propose: AtomicBool,
|
||||
client: RwLock<Option<Weak<EngineClient>>>,
|
||||
step: Arc<PermissionedStep>,
|
||||
client: Arc<RwLock<Option<Weak<EngineClient>>>>,
|
||||
signer: RwLock<EngineSigner>,
|
||||
validators: Box<ValidatorSet>,
|
||||
validate_score_transition: u64,
|
||||
@@ -407,7 +411,7 @@ pub struct AuthorityRound {
|
||||
|
||||
// header-chain validator.
|
||||
struct EpochVerifier {
|
||||
step: Arc<Step>,
|
||||
step: Arc<PermissionedStep>,
|
||||
subchain_validators: SimpleList,
|
||||
empty_steps_transition: u64,
|
||||
}
|
||||
@@ -415,7 +419,7 @@ struct EpochVerifier {
|
||||
impl super::EpochVerifier<EthereumMachine> for EpochVerifier {
|
||||
fn verify_light(&self, header: &Header) -> Result<(), Error> {
|
||||
// Validate the timestamp
|
||||
verify_timestamp(&*self.step, header_step(header, self.empty_steps_transition)?)?;
|
||||
verify_timestamp(&self.step.inner, header_step(header, self.empty_steps_transition)?)?;
|
||||
// always check the seal since it's fast.
|
||||
// nothing heavier to do.
|
||||
verify_external(header, &self.subchain_validators, self.empty_steps_transition)
|
||||
@@ -615,13 +619,15 @@ impl AuthorityRound {
|
||||
let engine = Arc::new(
|
||||
AuthorityRound {
|
||||
transition_service: IoService::<()>::start()?,
|
||||
step: Arc::new(Step {
|
||||
inner: AtomicUsize::new(initial_step),
|
||||
calibrate: our_params.start_step.is_none(),
|
||||
duration: our_params.step_duration,
|
||||
step: Arc::new(PermissionedStep {
|
||||
inner: Step {
|
||||
inner: AtomicUsize::new(initial_step),
|
||||
calibrate: our_params.start_step.is_none(),
|
||||
duration: our_params.step_duration,
|
||||
},
|
||||
can_propose: AtomicBool::new(true),
|
||||
}),
|
||||
can_propose: AtomicBool::new(true),
|
||||
client: RwLock::new(None),
|
||||
client: Arc::new(RwLock::new(None)),
|
||||
signer: Default::default(),
|
||||
validators: our_params.validators,
|
||||
validate_score_transition: our_params.validate_score_transition,
|
||||
@@ -641,7 +647,10 @@ impl AuthorityRound {
|
||||
|
||||
// Do not initialize timeouts for tests.
|
||||
if should_timeout {
|
||||
let handler = TransitionHandler { engine: Arc::downgrade(&engine) };
|
||||
let handler = TransitionHandler {
|
||||
step: engine.step.clone(),
|
||||
client: engine.client.clone(),
|
||||
};
|
||||
engine.transition_service.register_handler(Arc::new(handler))?;
|
||||
}
|
||||
Ok(engine)
|
||||
@@ -667,7 +676,7 @@ impl AuthorityRound {
|
||||
}
|
||||
|
||||
fn generate_empty_step(&self, parent_hash: &H256) {
|
||||
let step = self.step.load();
|
||||
let step = self.step.inner.load();
|
||||
let empty_step_rlp = empty_step_rlp(step, parent_hash);
|
||||
|
||||
if let Ok(signature) = self.sign(keccak(&empty_step_rlp)).map(Into::into) {
|
||||
@@ -699,34 +708,37 @@ fn unix_now() -> Duration {
|
||||
}
|
||||
|
||||
struct TransitionHandler {
|
||||
engine: Weak<AuthorityRound>,
|
||||
step: Arc<PermissionedStep>,
|
||||
client: Arc<RwLock<Option<Weak<EngineClient>>>>,
|
||||
}
|
||||
|
||||
const ENGINE_TIMEOUT_TOKEN: TimerToken = 23;
|
||||
|
||||
impl IoHandler<()> for TransitionHandler {
|
||||
fn initialize(&self, io: &IoContext<()>) {
|
||||
if let Some(engine) = self.engine.upgrade() {
|
||||
let remaining = engine.step.duration_remaining().as_millis();
|
||||
io.register_timer_once(ENGINE_TIMEOUT_TOKEN, Duration::from_millis(remaining))
|
||||
.unwrap_or_else(|e| warn!(target: "engine", "Failed to start consensus step timer: {}.", e))
|
||||
}
|
||||
let remaining = self.step.inner.duration_remaining().as_millis();
|
||||
io.register_timer_once(ENGINE_TIMEOUT_TOKEN, Duration::from_millis(remaining))
|
||||
.unwrap_or_else(|e| warn!(target: "engine", "Failed to start consensus step timer: {}.", e))
|
||||
}
|
||||
|
||||
fn timeout(&self, io: &IoContext<()>, timer: TimerToken) {
|
||||
if timer == ENGINE_TIMEOUT_TOKEN {
|
||||
if let Some(engine) = self.engine.upgrade() {
|
||||
// NOTE we might be lagging by couple of steps in case the timeout
|
||||
// has not been called fast enough.
|
||||
// Make sure to advance up to the actual step.
|
||||
while engine.step.duration_remaining().as_millis() == 0 {
|
||||
engine.step();
|
||||
// NOTE we might be lagging by couple of steps in case the timeout
|
||||
// has not been called fast enough.
|
||||
// Make sure to advance up to the actual step.
|
||||
while self.step.inner.duration_remaining().as_millis() == 0 {
|
||||
self.step.inner.increment();
|
||||
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
||||
if let Some(ref weak) = *self.client.read() {
|
||||
if let Some(c) = weak.upgrade() {
|
||||
c.update_sealing();
|
||||
}
|
||||
}
|
||||
|
||||
let next_run_at = engine.step.duration_remaining().as_millis() >> 2;
|
||||
io.register_timer_once(ENGINE_TIMEOUT_TOKEN, Duration::from_millis(next_run_at))
|
||||
.unwrap_or_else(|e| warn!(target: "engine", "Failed to restart consensus step timer: {}.", e))
|
||||
}
|
||||
|
||||
let next_run_at = self.step.inner.duration_remaining().as_millis() >> 2;
|
||||
io.register_timer_once(ENGINE_TIMEOUT_TOKEN, Duration::from_millis(next_run_at))
|
||||
.unwrap_or_else(|e| warn!(target: "engine", "Failed to restart consensus step timer: {}.", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -743,8 +755,8 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
}
|
||||
|
||||
fn step(&self) {
|
||||
self.step.increment();
|
||||
self.can_propose.store(true, AtomicOrdering::SeqCst);
|
||||
self.step.inner.increment();
|
||||
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
||||
if let Some(ref weak) = *self.client.read() {
|
||||
if let Some(c) = weak.upgrade() {
|
||||
c.update_sealing();
|
||||
@@ -791,7 +803,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
|
||||
fn populate_from_parent(&self, header: &mut Header, parent: &Header) {
|
||||
let parent_step = header_step(parent, self.empty_steps_transition).expect("Header has been verified; qed");
|
||||
let current_step = self.step.load();
|
||||
let current_step = self.step.inner.load();
|
||||
|
||||
let current_empty_steps_len = if header.number() >= self.empty_steps_transition {
|
||||
self.empty_steps(parent_step.into(), current_step.into(), parent.hash()).len()
|
||||
@@ -817,7 +829,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
let empty_step: EmptyStep = rlp.as_val().map_err(fmt_err)?;;
|
||||
|
||||
if empty_step.verify(&*self.validators).unwrap_or(false) {
|
||||
if self.step.check_future(empty_step.step).is_ok() {
|
||||
if self.step.inner.check_future(empty_step.step).is_ok() {
|
||||
trace!(target: "engine", "handle_message: received empty step message {:?}", empty_step);
|
||||
self.handle_empty_step_message(empty_step);
|
||||
} else {
|
||||
@@ -837,7 +849,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
fn generate_seal(&self, block: &ExecutedBlock, parent: &Header) -> Seal {
|
||||
// first check to avoid generating signature most of the time
|
||||
// (but there's still a race to the `compare_and_swap`)
|
||||
if !self.can_propose.load(AtomicOrdering::SeqCst) {
|
||||
if !self.step.can_propose.load(AtomicOrdering::SeqCst) {
|
||||
trace!(target: "engine", "Aborting seal generation. Can't propose.");
|
||||
return Seal::None;
|
||||
}
|
||||
@@ -846,7 +858,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
let parent_step: U256 = header_step(parent, self.empty_steps_transition)
|
||||
.expect("Header has been verified; qed").into();
|
||||
|
||||
let step = self.step.load();
|
||||
let step = self.step.inner.load();
|
||||
|
||||
// filter messages from old and future steps and different parents
|
||||
let empty_steps = if header.number() >= self.empty_steps_transition {
|
||||
@@ -923,7 +935,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
trace!(target: "engine", "generate_seal: Issuing a block for step {}.", step);
|
||||
|
||||
// only issue the seal if we were the first to reach the compare_and_swap.
|
||||
if self.can_propose.compare_and_swap(true, false, AtomicOrdering::SeqCst) {
|
||||
if self.step.can_propose.compare_and_swap(true, false, AtomicOrdering::SeqCst) {
|
||||
|
||||
self.clear_empty_steps(parent_step);
|
||||
|
||||
@@ -999,7 +1011,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
.decode()?;
|
||||
|
||||
let parent_step = header_step(&parent, self.empty_steps_transition)?;
|
||||
let current_step = self.step.load();
|
||||
let current_step = self.step.inner.load();
|
||||
self.empty_steps(parent_step.into(), current_step.into(), parent.hash())
|
||||
} else {
|
||||
// we're verifying a block, extract empty steps from the seal
|
||||
@@ -1049,7 +1061,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
// If yes then probably benign reporting needs to be moved further in the verification.
|
||||
let set_number = header.number();
|
||||
|
||||
match verify_timestamp(&*self.step, header_step(header, self.empty_steps_transition)?) {
|
||||
match verify_timestamp(&self.step.inner, header_step(header, self.empty_steps_transition)?) {
|
||||
Err(BlockError::InvalidSeal) => {
|
||||
self.validators.report_benign(header.author(), set_number, header.number());
|
||||
Err(BlockError::InvalidSeal.into())
|
||||
@@ -1291,7 +1303,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
||||
// This way, upon encountering an epoch change, the proposer from the
|
||||
// new set will be forced to wait until the next step to avoid sealing a
|
||||
// block that breaks the invariant that the parent's step < the block's step.
|
||||
self.can_propose.store(false, AtomicOrdering::SeqCst);
|
||||
self.step.can_propose.store(false, AtomicOrdering::SeqCst);
|
||||
return Some(combine_proofs(signal_number, &pending.proof, &*finality_proof));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,6 +126,8 @@ pub struct MinerOptions {
|
||||
pub tx_queue_strategy: PrioritizationStrategy,
|
||||
/// Simple senders penalization.
|
||||
pub tx_queue_penalization: Penalization,
|
||||
/// Do we want to mark transactions recieved locally (e.g. RPC) as local if we don't have the sending account?
|
||||
pub tx_queue_no_unfamiliar_locals: bool,
|
||||
/// Do we refuse to accept service transactions even if sender is certified.
|
||||
pub refuse_service_transactions: bool,
|
||||
/// Transaction pool limits.
|
||||
@@ -149,6 +151,7 @@ impl Default for MinerOptions {
|
||||
infinite_pending_block: false,
|
||||
tx_queue_strategy: PrioritizationStrategy::GasPriceOnly,
|
||||
tx_queue_penalization: Penalization::Disabled,
|
||||
tx_queue_no_unfamiliar_locals: false,
|
||||
refuse_service_transactions: false,
|
||||
pool_limits: pool::Options {
|
||||
max_count: 8_192,
|
||||
@@ -688,6 +691,20 @@ impl Miner {
|
||||
// Return if we restarted
|
||||
prepare_new
|
||||
}
|
||||
|
||||
/// Prepare pending block, check whether sealing is needed, and then update sealing.
|
||||
fn prepare_and_update_sealing<C: miner::BlockChainClient>(&self, chain: &C) {
|
||||
use miner::MinerService;
|
||||
|
||||
// Make sure to do it after transaction is imported and lock is dropped.
|
||||
// We need to create pending block and enable sealing.
|
||||
if self.engine.seals_internally().unwrap_or(false) || !self.prepare_pending_block(chain) {
|
||||
// If new block has not been prepared (means we already had one)
|
||||
// or Engine might be able to seal internally,
|
||||
// we need to update sealing.
|
||||
self.update_sealing(chain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const SEALING_TIMEOUT_IN_BLOCKS : u64 = 5;
|
||||
@@ -754,12 +771,12 @@ impl miner::MinerService for Miner {
|
||||
transactions.into_iter().map(pool::verifier::Transaction::Unverified).collect(),
|
||||
);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// | NOTE Code below requires sealing locks. |
|
||||
// | Make sure to release the locks before calling that method. |
|
||||
// --------------------------------------------------------------------------
|
||||
if !results.is_empty() && self.options.reseal_on_external_tx && self.sealing.lock().reseal_allowed() {
|
||||
// --------------------------------------------------------------------------
|
||||
// | NOTE Code below requires sealing locks. |
|
||||
// | Make sure to release the locks before calling that method. |
|
||||
// --------------------------------------------------------------------------
|
||||
self.update_sealing(chain);
|
||||
self.prepare_and_update_sealing(chain);
|
||||
}
|
||||
|
||||
results
|
||||
@@ -768,8 +785,9 @@ impl miner::MinerService for Miner {
|
||||
fn import_own_transaction<C: miner::BlockChainClient>(
|
||||
&self,
|
||||
chain: &C,
|
||||
pending: PendingTransaction,
|
||||
pending: PendingTransaction
|
||||
) -> Result<(), transaction::Error> {
|
||||
// note: you may want to use `import_claimed_local_transaction` instead of this one.
|
||||
|
||||
trace!(target: "own_tx", "Importing transaction: {:?}", pending);
|
||||
|
||||
@@ -784,19 +802,34 @@ impl miner::MinerService for Miner {
|
||||
// | Make sure to release the locks before calling that method. |
|
||||
// --------------------------------------------------------------------------
|
||||
if imported.is_ok() && self.options.reseal_on_own_tx && self.sealing.lock().reseal_allowed() {
|
||||
// Make sure to do it after transaction is imported and lock is droped.
|
||||
// We need to create pending block and enable sealing.
|
||||
if self.engine.seals_internally().unwrap_or(false) || !self.prepare_pending_block(chain) {
|
||||
// If new block has not been prepared (means we already had one)
|
||||
// or Engine might be able to seal internally,
|
||||
// we need to update sealing.
|
||||
self.update_sealing(chain);
|
||||
}
|
||||
self.prepare_and_update_sealing(chain);
|
||||
}
|
||||
|
||||
imported
|
||||
}
|
||||
|
||||
fn import_claimed_local_transaction<C: miner::BlockChainClient>(
|
||||
&self,
|
||||
chain: &C,
|
||||
pending: PendingTransaction,
|
||||
trusted: bool
|
||||
) -> Result<(), transaction::Error> {
|
||||
// treat the tx as local if the option is enabled, or if we have the account
|
||||
let sender = pending.sender();
|
||||
let treat_as_local = trusted
|
||||
|| !self.options.tx_queue_no_unfamiliar_locals
|
||||
|| self.accounts.as_ref().map(|accts| accts.has_account(sender)).unwrap_or(false);
|
||||
|
||||
if treat_as_local {
|
||||
self.import_own_transaction(chain, pending)
|
||||
} else {
|
||||
// We want to replicate behaviour for external transactions if we're not going to treat
|
||||
// this as local. This is important with regards to sealing blocks
|
||||
self.import_external_transactions(chain, vec![pending.transaction.into()])
|
||||
.pop().expect("one result per tx, as in `import_own_transaction`")
|
||||
}
|
||||
}
|
||||
|
||||
fn local_transactions(&self) -> BTreeMap<H256, pool::local_transactions::Status> {
|
||||
self.transaction_queue.local_transactions()
|
||||
}
|
||||
@@ -1133,6 +1166,7 @@ mod tests {
|
||||
infinite_pending_block: false,
|
||||
tx_queue_penalization: Penalization::Disabled,
|
||||
tx_queue_strategy: PrioritizationStrategy::GasPriceOnly,
|
||||
tx_queue_no_unfamiliar_locals: false,
|
||||
refuse_service_transactions: false,
|
||||
pool_limits: Default::default(),
|
||||
pool_verification_options: pool::verifier::Options {
|
||||
@@ -1147,8 +1181,10 @@ mod tests {
|
||||
)
|
||||
}
|
||||
|
||||
const TEST_CHAIN_ID: u64 = 2;
|
||||
|
||||
fn transaction() -> SignedTransaction {
|
||||
transaction_with_chain_id(2)
|
||||
transaction_with_chain_id(TEST_CHAIN_ID)
|
||||
}
|
||||
|
||||
fn transaction_with_chain_id(chain_id: u64) -> SignedTransaction {
|
||||
@@ -1222,6 +1258,53 @@ mod tests {
|
||||
assert_eq!(miner.ready_transactions(&client).len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_treat_unfamiliar_locals_selectively() {
|
||||
// given
|
||||
let keypair = Random.generate().unwrap();
|
||||
let client = TestBlockChainClient::default();
|
||||
let account_provider = AccountProvider::transient_provider();
|
||||
account_provider.insert_account(keypair.secret().clone(), "").expect("can add accounts to the provider we just created");
|
||||
|
||||
let miner = Miner::new(
|
||||
MinerOptions {
|
||||
tx_queue_no_unfamiliar_locals: true,
|
||||
..miner().options
|
||||
},
|
||||
GasPricer::new_fixed(0u64.into()),
|
||||
&Spec::new_test(),
|
||||
Some(Arc::new(account_provider)),
|
||||
);
|
||||
let transaction = transaction();
|
||||
let best_block = 0;
|
||||
// when
|
||||
// This transaction should not be marked as local because our account_provider doesn't have the sender
|
||||
let res = miner.import_claimed_local_transaction(&client, PendingTransaction::new(transaction.clone(), None), false);
|
||||
|
||||
// then
|
||||
// Check the same conditions as `should_import_external_transaction` first. Behaviour should be identical.
|
||||
// That is: it's treated as though we added it through `import_external_transactions`
|
||||
assert_eq!(res.unwrap(), ());
|
||||
assert_eq!(miner.pending_transactions(best_block), None);
|
||||
assert_eq!(miner.pending_receipts(best_block), None);
|
||||
assert_eq!(miner.ready_transactions(&client).len(), 0);
|
||||
assert!(miner.prepare_pending_block(&client));
|
||||
assert_eq!(miner.ready_transactions(&client).len(), 1);
|
||||
|
||||
// when - 2nd part: create a local transaction from account_provider.
|
||||
// Borrow the transaction used before & sign with our generated keypair.
|
||||
let local_transaction = transaction.deconstruct().0.as_unsigned().clone().sign(keypair.secret(), Some(TEST_CHAIN_ID));
|
||||
let res2 = miner.import_claimed_local_transaction(&client, PendingTransaction::new(local_transaction, None), false);
|
||||
|
||||
// then - 2nd part: we add on the results from the last pending block.
|
||||
// This is borrowed from `should_make_pending_block_when_importing_own_transaction` and slightly modified.
|
||||
assert_eq!(res2.unwrap(), ());
|
||||
assert_eq!(miner.pending_transactions(best_block).unwrap().len(), 2);
|
||||
assert_eq!(miner.pending_receipts(best_block).unwrap().len(), 2);
|
||||
assert_eq!(miner.ready_transactions(&client).len(), 2);
|
||||
assert!(!miner.prepare_pending_block(&client));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_not_seal_unless_enabled() {
|
||||
let miner = miner();
|
||||
|
||||
@@ -139,6 +139,12 @@ pub trait MinerService : Send + Sync {
|
||||
-> Result<(), transaction::Error>
|
||||
where C: BlockChainClient;
|
||||
|
||||
/// Imports transactions from potentially external sources, with behaviour determined
|
||||
/// by the config flag `tx_queue_allow_unfamiliar_locals`
|
||||
fn import_claimed_local_transaction<C>(&self, chain: &C, transaction: PendingTransaction, trusted: bool)
|
||||
-> Result<(), transaction::Error>
|
||||
where C: BlockChainClient;
|
||||
|
||||
/// Removes transaction from the pool.
|
||||
///
|
||||
/// Attempts to "cancel" a transaction. If it was not propagated yet (or not accepted by other peers)
|
||||
|
||||
@@ -124,7 +124,7 @@ impl<'a, C: 'a> pool::client::Client for PoolClient<'a, C> where
|
||||
pool::client::AccountDetails {
|
||||
nonce: self.cached_nonces.account_nonce(address),
|
||||
balance: self.chain.latest_balance(address),
|
||||
is_local: self.accounts.map_or(false, |accounts| accounts.has_account(*address).unwrap_or(false)),
|
||||
is_local: self.accounts.map_or(false, |accounts| accounts.has_account(*address)),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -215,7 +215,7 @@ fn fixed_to_contract_only() {
|
||||
secret!("dog42"),
|
||||
]);
|
||||
|
||||
assert!(provider.has_account(*RICH_ADDR).unwrap());
|
||||
assert!(provider.has_account(*RICH_ADDR));
|
||||
|
||||
let client = make_chain(provider, 3, vec![
|
||||
Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]),
|
||||
@@ -248,7 +248,7 @@ fn fixed_to_contract_to_contract() {
|
||||
secret!("dog42"),
|
||||
]);
|
||||
|
||||
assert!(provider.has_account(*RICH_ADDR).unwrap());
|
||||
assert!(provider.has_account(*RICH_ADDR));
|
||||
|
||||
let client = make_chain(provider, 3, vec![
|
||||
Transition::Manual(3, vec![addrs[2], addrs[3], addrs[5], addrs[7]]),
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
//! Watcher for snapshot-related chain events.
|
||||
|
||||
use parking_lot::Mutex;
|
||||
use client::{BlockInfo, Client, ChainNotify, ClientIoMessage};
|
||||
use client::{BlockInfo, Client, ChainNotify, ChainRoute, ClientIoMessage};
|
||||
use ids::BlockId;
|
||||
|
||||
use io::IoChannel;
|
||||
use ethereum_types::H256;
|
||||
use bytes::Bytes;
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::{sync::Arc, time::Duration};
|
||||
|
||||
// helper trait for transforming hashes to numbers and checking if syncing.
|
||||
trait Oracle: Send + Sync {
|
||||
@@ -103,11 +103,10 @@ impl ChainNotify for Watcher {
|
||||
&self,
|
||||
imported: Vec<H256>,
|
||||
_: Vec<H256>,
|
||||
_: Vec<H256>,
|
||||
_: Vec<H256>,
|
||||
_: ChainRoute,
|
||||
_: Vec<H256>,
|
||||
_: Vec<Bytes>,
|
||||
_duration: u64)
|
||||
_duration: Duration)
|
||||
{
|
||||
if self.oracle.is_major_importing() { return }
|
||||
|
||||
@@ -131,11 +130,12 @@ impl ChainNotify for Watcher {
|
||||
mod tests {
|
||||
use super::{Broadcast, Oracle, Watcher};
|
||||
|
||||
use client::ChainNotify;
|
||||
use client::{ChainNotify, ChainRoute};
|
||||
|
||||
use ethereum_types::{H256, U256};
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::time::Duration;
|
||||
|
||||
struct TestOracle(HashMap<H256, u64>);
|
||||
|
||||
@@ -158,6 +158,8 @@ mod tests {
|
||||
|
||||
// helper harness for tests which expect a notification.
|
||||
fn harness(numbers: Vec<u64>, period: u64, history: u64, expected: Option<u64>) {
|
||||
const DURATION_ZERO: Duration = Duration::from_millis(0);
|
||||
|
||||
let hashes: Vec<_> = numbers.clone().into_iter().map(|x| H256::from(U256::from(x))).collect();
|
||||
let map = hashes.clone().into_iter().zip(numbers).collect();
|
||||
|
||||
@@ -171,11 +173,10 @@ mod tests {
|
||||
watcher.new_blocks(
|
||||
hashes,
|
||||
vec![],
|
||||
ChainRoute::default(),
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
vec![],
|
||||
0,
|
||||
DURATION_ZERO,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@ impl<'a, 'view> ViewRlp<'a> where 'a : 'view {
|
||||
|
||||
/// Returns a new instance replacing existing rlp with new rlp, maintaining debug info
|
||||
fn new_from_rlp(&self, rlp: Rlp<'a>) -> Self {
|
||||
ViewRlp {
|
||||
rlp,
|
||||
ViewRlp {
|
||||
rlp,
|
||||
file: self.file,
|
||||
line: self.line
|
||||
line: self.line
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,12 @@ impl<'a, 'view> ViewRlp<'a> where 'a : 'view {
|
||||
}
|
||||
|
||||
fn expect_valid_rlp<T>(&self, r: Result<T, DecoderError>) -> T {
|
||||
r.expect(&format!("View rlp is trusted and should be valid. Constructed in {} on line {}", self.file, self.line))
|
||||
r.unwrap_or_else(|e| panic!(
|
||||
"View rlp is trusted and should be valid. Constructed in {} on line {}: {}",
|
||||
self.file,
|
||||
self.line,
|
||||
e
|
||||
))
|
||||
}
|
||||
|
||||
/// Returns rlp at the given index, panics if no rlp at that index
|
||||
@@ -75,7 +80,7 @@ impl<'a, 'view> ViewRlp<'a> where 'a : 'view {
|
||||
/// Returns decoded value at the given index, panics not present or valid at that index
|
||||
pub fn val_at<T>(&self, index: usize) -> T where T : Decodable {
|
||||
self.expect_valid_rlp(self.rlp.val_at(index))
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns decoded list of values, panics if rlp is invalid
|
||||
pub fn list_at<T>(&self, index: usize) -> Vec<T> where T: Decodable {
|
||||
|
||||
@@ -25,7 +25,7 @@ use network::{NetworkProtocolHandler, NetworkContext, HostInfo, PeerId, Protocol
|
||||
use ethereum_types::{H256, H512, U256};
|
||||
use io::{TimerToken};
|
||||
use ethcore::ethstore::ethkey::Secret;
|
||||
use ethcore::client::{BlockChainClient, ChainNotify, ChainMessageType};
|
||||
use ethcore::client::{BlockChainClient, ChainNotify, ChainRoute, ChainMessageType};
|
||||
use ethcore::snapshot::SnapshotService;
|
||||
use ethcore::header::BlockNumber;
|
||||
use sync_io::NetSyncIo;
|
||||
@@ -410,11 +410,10 @@ impl ChainNotify for EthSync {
|
||||
fn new_blocks(&self,
|
||||
imported: Vec<H256>,
|
||||
invalid: Vec<H256>,
|
||||
enacted: Vec<H256>,
|
||||
retracted: Vec<H256>,
|
||||
route: ChainRoute,
|
||||
sealed: Vec<H256>,
|
||||
proposed: Vec<Bytes>,
|
||||
_duration: u64)
|
||||
_duration: Duration)
|
||||
{
|
||||
use light::net::Announcement;
|
||||
|
||||
@@ -425,8 +424,8 @@ impl ChainNotify for EthSync {
|
||||
&mut sync_io,
|
||||
&imported,
|
||||
&invalid,
|
||||
&enacted,
|
||||
&retracted,
|
||||
route.enacted(),
|
||||
route.retracted(),
|
||||
&sealed,
|
||||
&proposed);
|
||||
});
|
||||
@@ -453,7 +452,7 @@ impl ChainNotify for EthSync {
|
||||
|
||||
fn start(&self) {
|
||||
match self.network.start().map_err(Into::into) {
|
||||
Err(ErrorKind::Io(ref e)) if e.kind() == io::ErrorKind::AddrInUse => warn!("Network port {:?} is already in use, make sure that another instance of an Ethereum client is not running or change the port using the --port option.", self.network.config().listen_address.expect("Listen address is not set.")),
|
||||
Err(ErrorKind::Io(ref e)) if e.kind() == io::ErrorKind::AddrInUse => warn!("Network port {:?} is already in use, make sure that another instance of an Ethereum client is not running or change the port using the --port option.", self.network.config().listen_address.expect("Listen address is not set.")),
|
||||
Err(err) => warn!("Error starting network: {}", err),
|
||||
_ => {},
|
||||
}
|
||||
@@ -626,7 +625,7 @@ impl NetworkConfiguration {
|
||||
config_path: self.config_path,
|
||||
net_config_path: self.net_config_path,
|
||||
listen_address: match self.listen_address { None => None, Some(addr) => Some(SocketAddr::from_str(&addr)?) },
|
||||
public_address: match self.public_address { None => None, Some(addr) => Some(SocketAddr::from_str(&addr)?) },
|
||||
public_address: match self.public_address { None => None, Some(addr) => Some(SocketAddr::from_str(&addr)?) },
|
||||
udp_port: self.udp_port,
|
||||
nat_enabled: self.nat_enabled,
|
||||
discovery_enabled: self.discovery_enabled,
|
||||
|
||||
@@ -133,7 +133,7 @@ impl SyncSupplier {
|
||||
let max_count = cmp::min(MAX_HEADERS_TO_SEND, max_headers);
|
||||
let mut count = 0;
|
||||
let mut data = Bytes::new();
|
||||
let inc = (skip + 1) as BlockNumber;
|
||||
let inc = skip.saturating_add(1) as BlockNumber;
|
||||
let overlay = io.chain_overlay().read();
|
||||
|
||||
// We are checking the `overlay` as well since it's where the ForkBlock
|
||||
@@ -155,9 +155,9 @@ impl SyncSupplier {
|
||||
if number <= inc || number == 0 {
|
||||
break;
|
||||
}
|
||||
number -= inc;
|
||||
number = number.saturating_sub(inc);
|
||||
} else {
|
||||
number += inc;
|
||||
number = number.saturating_add(inc);
|
||||
}
|
||||
}
|
||||
let mut rlp = RlpStream::new_list(count as usize);
|
||||
|
||||
@@ -16,13 +16,14 @@
|
||||
|
||||
use std::collections::{VecDeque, HashSet, HashMap};
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
use ethereum_types::H256;
|
||||
use parking_lot::{RwLock, Mutex};
|
||||
use bytes::Bytes;
|
||||
use network::{self, PeerId, ProtocolId, PacketId, SessionInfo};
|
||||
use tests::snapshot::*;
|
||||
use ethcore::client::{TestBlockChainClient, BlockChainClient, Client as EthcoreClient,
|
||||
ClientConfig, ChainNotify, ChainMessageType, ClientIoMessage};
|
||||
ClientConfig, ChainNotify, ChainRoute, ChainMessageType, ClientIoMessage};
|
||||
use ethcore::header::BlockNumber;
|
||||
use ethcore::snapshot::SnapshotService;
|
||||
use ethcore::spec::Spec;
|
||||
@@ -532,12 +533,13 @@ impl ChainNotify for EthPeer<EthcoreClient> {
|
||||
fn new_blocks(&self,
|
||||
imported: Vec<H256>,
|
||||
invalid: Vec<H256>,
|
||||
enacted: Vec<H256>,
|
||||
retracted: Vec<H256>,
|
||||
route: ChainRoute,
|
||||
sealed: Vec<H256>,
|
||||
proposed: Vec<Bytes>,
|
||||
_duration: u64)
|
||||
_duration: Duration)
|
||||
{
|
||||
let (enacted, retracted) = route.into_enacted_retracted();
|
||||
|
||||
self.new_blocks_queue.write().push_back(NewBlockMessage {
|
||||
imported,
|
||||
invalid,
|
||||
|
||||
@@ -462,7 +462,7 @@
|
||||
<key>OVERWRITE_PERMISSIONS</key>
|
||||
<false/>
|
||||
<key>VERSION</key>
|
||||
<string>1.11.3</string>
|
||||
<string>1.11.5</string>
|
||||
</dict>
|
||||
<key>UUID</key>
|
||||
<string>2DCD5B81-7BAF-4DA1-9251-6274B089FD36</string>
|
||||
|
||||
@@ -27,7 +27,6 @@ linked-hash-map = "0.5"
|
||||
log = "0.3"
|
||||
parking_lot = "0.5"
|
||||
price-info = { path = "../price-info" }
|
||||
rayon = "1.0"
|
||||
rlp = { path = "../util/rlp" }
|
||||
trace-time = { path = "../util/trace-time" }
|
||||
transaction-pool = { path = "../transaction-pool" }
|
||||
|
||||
@@ -29,7 +29,6 @@ extern crate keccak_hash as hash;
|
||||
extern crate linked_hash_map;
|
||||
extern crate parking_lot;
|
||||
extern crate price_info;
|
||||
extern crate rayon;
|
||||
extern crate rlp;
|
||||
extern crate trace_time;
|
||||
extern crate transaction_pool as txpool;
|
||||
|
||||
@@ -23,7 +23,6 @@ use std::collections::BTreeMap;
|
||||
|
||||
use ethereum_types::{H256, U256, Address};
|
||||
use parking_lot::RwLock;
|
||||
use rayon::prelude::*;
|
||||
use transaction;
|
||||
use txpool::{self, Verifier};
|
||||
|
||||
@@ -179,8 +178,14 @@ impl TransactionQueue {
|
||||
|
||||
let verifier = verifier::Verifier::new(client, options, self.insertion_id.clone());
|
||||
let results = transactions
|
||||
.into_par_iter()
|
||||
.map(|transaction| verifier.verify_transaction(transaction))
|
||||
.into_iter()
|
||||
.map(|transaction| {
|
||||
if self.pool.read().find(&transaction.hash()).is_some() {
|
||||
bail!(transaction::Error::AlreadyImported)
|
||||
}
|
||||
|
||||
verifier.verify_transaction(transaction)
|
||||
})
|
||||
.map(|result| result.and_then(|verified| {
|
||||
self.pool.write().import(verified)
|
||||
.map(|_imported| ())
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use std::sync::{atomic, Arc};
|
||||
|
||||
use ethereum_types::{U256, H256, Address};
|
||||
use rlp::Rlp;
|
||||
use transaction::{self, Transaction, SignedTransaction, UnverifiedTransaction};
|
||||
@@ -25,6 +27,7 @@ const MAX_TRANSACTION_SIZE: usize = 15 * 1024;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct TestClient {
|
||||
verification_invoked: Arc<atomic::AtomicBool>,
|
||||
account_details: AccountDetails,
|
||||
gas_required: U256,
|
||||
is_service_transaction: bool,
|
||||
@@ -35,6 +38,7 @@ pub struct TestClient {
|
||||
impl Default for TestClient {
|
||||
fn default() -> Self {
|
||||
TestClient {
|
||||
verification_invoked: Default::default(),
|
||||
account_details: AccountDetails {
|
||||
nonce: 123.into(),
|
||||
balance: 63_100.into(),
|
||||
@@ -88,6 +92,10 @@ impl TestClient {
|
||||
insertion_id: 1,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn was_verification_triggered(&self) -> bool {
|
||||
self.verification_invoked.load(atomic::Ordering::SeqCst)
|
||||
}
|
||||
}
|
||||
|
||||
impl pool::client::Client for TestClient {
|
||||
@@ -98,6 +106,7 @@ impl pool::client::Client for TestClient {
|
||||
fn verify_transaction(&self, tx: UnverifiedTransaction)
|
||||
-> Result<SignedTransaction, transaction::Error>
|
||||
{
|
||||
self.verification_invoked.store(true, atomic::Ordering::SeqCst);
|
||||
Ok(SignedTransaction::new(tx)?)
|
||||
}
|
||||
|
||||
|
||||
@@ -798,3 +798,37 @@ fn should_include_local_transaction_to_a_full_pool() {
|
||||
// then
|
||||
assert_eq!(txq.status().status.transaction_count, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_avoid_verifying_transaction_already_in_pool() {
|
||||
// given
|
||||
let txq = TransactionQueue::new(
|
||||
txpool::Options {
|
||||
max_count: 1,
|
||||
max_per_sender: 2,
|
||||
max_mem_usage: 50
|
||||
},
|
||||
verifier::Options {
|
||||
minimal_gas_price: 1.into(),
|
||||
block_gas_limit: 1_000_000.into(),
|
||||
tx_gas_limit: 1_000_000.into(),
|
||||
},
|
||||
PrioritizationStrategy::GasPriceOnly,
|
||||
);
|
||||
let client = TestClient::new();
|
||||
let tx1 = Tx::default().signed().unverified();
|
||||
|
||||
let res = txq.import(client.clone(), vec![tx1.clone()]);
|
||||
assert_eq!(res, vec![Ok(())]);
|
||||
assert_eq!(txq.status().status.transaction_count, 1);
|
||||
assert!(client.was_verification_triggered());
|
||||
|
||||
// when
|
||||
let client = TestClient::new();
|
||||
let res = txq.import(client.clone(), vec![tx1]);
|
||||
assert_eq!(res, vec![Err(transaction::Error::AlreadyImported)]);
|
||||
assert!(!client.was_verification_triggered());
|
||||
|
||||
// then
|
||||
assert_eq!(txq.status().status.transaction_count, 1);
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ impl Default for Options {
|
||||
}
|
||||
|
||||
/// Transaction to verify.
|
||||
#[cfg_attr(test, derive(Clone))]
|
||||
pub enum Transaction {
|
||||
/// Fresh, never verified transaction.
|
||||
///
|
||||
@@ -75,7 +76,8 @@ pub enum Transaction {
|
||||
}
|
||||
|
||||
impl Transaction {
|
||||
fn hash(&self) -> H256 {
|
||||
/// Return transaction hash
|
||||
pub fn hash(&self) -> H256 {
|
||||
match *self {
|
||||
Transaction::Unverified(ref tx) => tx.hash(),
|
||||
Transaction::Retracted(ref tx) => tx.hash(),
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
!define DESCRIPTION "Fast, light, robust Ethereum implementation"
|
||||
!define VERSIONMAJOR 1
|
||||
!define VERSIONMINOR 11
|
||||
!define VERSIONBUILD 3
|
||||
!define VERSIONBUILD 5
|
||||
!define ARGS ""
|
||||
!define FIRST_START_ARGS "--mode=passive ui"
|
||||
|
||||
|
||||
@@ -665,6 +665,10 @@ usage! {
|
||||
"--remove-solved",
|
||||
"Move solved blocks from the work package queue instead of cloning them. This gives a slightly faster import speed, but means that extra solutions submitted for the same work package will go unused.",
|
||||
|
||||
FLAG flag_tx_queue_no_unfamiliar_locals: (bool) = false, or |c: &Config| c.mining.as_ref()?.tx_queue_no_unfamiliar_locals.clone(),
|
||||
"--tx-queue-no-unfamiliar-locals",
|
||||
"Transactions recieved via local means (RPC, WS, etc) will be treated as external if the sending account is unknown.",
|
||||
|
||||
FLAG flag_refuse_service_transactions: (bool) = false, or |c: &Config| c.mining.as_ref()?.refuse_service_transactions.clone(),
|
||||
"--refuse-service-transactions",
|
||||
"Always refuse service transactions.",
|
||||
@@ -1241,6 +1245,7 @@ struct Mining {
|
||||
tx_queue_strategy: Option<String>,
|
||||
tx_queue_ban_count: Option<u16>,
|
||||
tx_queue_ban_time: Option<u16>,
|
||||
tx_queue_no_unfamiliar_locals: Option<bool>,
|
||||
remove_solved: Option<bool>,
|
||||
notify_work: Option<Vec<String>>,
|
||||
refuse_service_transactions: Option<bool>,
|
||||
@@ -1657,6 +1662,7 @@ mod tests {
|
||||
arg_gas_floor_target: "4700000".into(),
|
||||
arg_gas_cap: "6283184".into(),
|
||||
arg_extra_data: Some("Parity".into()),
|
||||
flag_tx_queue_no_unfamiliar_locals: false,
|
||||
arg_tx_queue_size: 8192usize,
|
||||
arg_tx_queue_per_sender: None,
|
||||
arg_tx_queue_mem_limit: 4u32,
|
||||
@@ -1922,6 +1928,7 @@ mod tests {
|
||||
tx_queue_strategy: None,
|
||||
tx_queue_ban_count: None,
|
||||
tx_queue_ban_time: None,
|
||||
tx_queue_no_unfamiliar_locals: None,
|
||||
tx_gas_limit: None,
|
||||
tx_time_limit: None,
|
||||
extra_data: None,
|
||||
|
||||
@@ -133,6 +133,7 @@ tx_queue_ban_count = 1
|
||||
tx_queue_ban_time = 180 #s
|
||||
tx_gas_limit = "6283184"
|
||||
tx_time_limit = 100 #ms
|
||||
tx_queue_no_unfamiliar_locals = false
|
||||
extra_data = "Parity"
|
||||
remove_solved = false
|
||||
notify_work = ["http://localhost:3001"]
|
||||
|
||||
@@ -549,6 +549,7 @@ impl Configuration {
|
||||
|
||||
tx_queue_penalization: to_queue_penalization(self.args.arg_tx_time_limit)?,
|
||||
tx_queue_strategy: to_queue_strategy(&self.args.arg_tx_queue_strategy)?,
|
||||
tx_queue_no_unfamiliar_locals: self.args.flag_tx_queue_no_unfamiliar_locals,
|
||||
refuse_service_transactions: self.args.flag_refuse_service_transactions,
|
||||
|
||||
pool_limits: self.pool_limits()?,
|
||||
|
||||
@@ -25,7 +25,7 @@ use std::time::{Instant, Duration};
|
||||
use atty;
|
||||
use ethcore::client::{
|
||||
BlockId, BlockChainClient, ChainInfo, BlockInfo, BlockChainInfo,
|
||||
BlockQueueInfo, ChainNotify, ClientReport, Client, ClientIoMessage
|
||||
BlockQueueInfo, ChainNotify, ChainRoute, ClientReport, Client, ClientIoMessage
|
||||
};
|
||||
use ethcore::header::BlockNumber;
|
||||
use ethcore::snapshot::{RestorationStatus, SnapshotService as SS};
|
||||
@@ -360,7 +360,7 @@ impl<T: InformantData> Informant<T> {
|
||||
}
|
||||
|
||||
impl ChainNotify for Informant<FullNodeInformantData> {
|
||||
fn new_blocks(&self, imported: Vec<H256>, _invalid: Vec<H256>, _enacted: Vec<H256>, _retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, duration: u64) {
|
||||
fn new_blocks(&self, imported: Vec<H256>, _invalid: Vec<H256>, _route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, duration: Duration) {
|
||||
let mut last_import = self.last_import.lock();
|
||||
let client = &self.target.client;
|
||||
|
||||
@@ -382,7 +382,7 @@ impl ChainNotify for Informant<FullNodeInformantData> {
|
||||
Colour::White.bold().paint(format!("{}", header_view.hash())),
|
||||
Colour::Yellow.bold().paint(format!("{}", block.transactions_count())),
|
||||
Colour::Yellow.bold().paint(format!("{:.2}", header_view.gas_used().low_u64() as f32 / 1000000f32)),
|
||||
Colour::Purple.bold().paint(format!("{:.2}", duration as f32 / 1000000f32)),
|
||||
Colour::Purple.bold().paint(format!("{}", duration.as_milliseconds())),
|
||||
Colour::Blue.bold().paint(format!("{:.2}", size as f32 / 1024f32)),
|
||||
if skipped > 0 {
|
||||
format!(" + another {} block(s) containing {} tx(s)",
|
||||
|
||||
@@ -562,7 +562,7 @@ fn execute_impl<Cr, Rr>(cmd: RunCmd, logger: Arc<RotatingLogger>, on_client_rq:
|
||||
let engine_signer = cmd.miner_extras.engine_signer;
|
||||
if engine_signer != Default::default() {
|
||||
// Check if engine signer exists
|
||||
if !account_provider.has_account(engine_signer).unwrap_or(false) {
|
||||
if !account_provider.has_account(engine_signer) {
|
||||
return Err(format!("Consensus signer account not found for the current chain. {}", build_create_account_hint(&cmd.spec, &cmd.dirs.keys)));
|
||||
}
|
||||
|
||||
@@ -1067,7 +1067,7 @@ fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str,
|
||||
|
||||
for a in cfg.unlocked_accounts {
|
||||
// Check if the account exists
|
||||
if !account_provider.has_account(a).unwrap_or(false) {
|
||||
if !account_provider.has_account(a) {
|
||||
return Err(format!("Account {} not found for the current chain. {}", a, build_create_account_hint(spec, &dirs.keys)));
|
||||
}
|
||||
|
||||
@@ -1092,7 +1092,7 @@ fn prepare_account_provider(spec: &SpecType, dirs: &Directories, data_dir: &str,
|
||||
fn insert_dev_account(account_provider: &AccountProvider) {
|
||||
let secret: ethkey::Secret = "4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7".into();
|
||||
let dev_account = ethkey::KeyPair::from_secret(secret.clone()).expect("Valid secret produces valid key;qed");
|
||||
if let Ok(false) = account_provider.has_account(dev_account.address()) {
|
||||
if !account_provider.has_account(dev_account.address()) {
|
||||
match account_provider.insert_account(secret, "") {
|
||||
Err(e) => warn!("Unable to add development account: {}", e),
|
||||
Ok(address) => {
|
||||
|
||||
@@ -144,7 +144,7 @@ mod server {
|
||||
KeyPair::from_secret(secret).map_err(|e| format!("invalid secret: {}", e))?)),
|
||||
Some(NodeSecretKey::KeyStore(account)) => {
|
||||
// Check if account exists
|
||||
if !deps.account_provider.has_account(account.clone()).unwrap_or(false) {
|
||||
if !deps.account_provider.has_account(account.clone()) {
|
||||
return Err(format!("Account {} passed as secret store node key is not found", account));
|
||||
}
|
||||
|
||||
|
||||
@@ -123,10 +123,13 @@ impl<C: miner::BlockChainClient, M: MinerService> FullDispatcher<C, M> {
|
||||
}
|
||||
|
||||
/// Imports transaction to the miner's queue.
|
||||
pub fn dispatch_transaction(client: &C, miner: &M, signed_transaction: PendingTransaction) -> Result<H256> {
|
||||
pub fn dispatch_transaction(client: &C, miner: &M, signed_transaction: PendingTransaction, trusted: bool) -> Result<H256> {
|
||||
let hash = signed_transaction.transaction.hash();
|
||||
|
||||
miner.import_own_transaction(client, signed_transaction)
|
||||
// use `import_claimed_local_transaction` so we can decide (based on config flags) if we want to treat
|
||||
// it as local or not. Nodes with public RPC interfaces will want these transactions to be treated like
|
||||
// external transactions.
|
||||
miner.import_claimed_local_transaction(client, signed_transaction, trusted)
|
||||
.map_err(errors::transaction)
|
||||
.map(|_| hash)
|
||||
}
|
||||
@@ -180,7 +183,7 @@ impl<C: miner::BlockChainClient + BlockChainClient, M: MinerService> Dispatcher
|
||||
}
|
||||
|
||||
fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result<H256> {
|
||||
Self::dispatch_transaction(&*self.client, &*self.miner, signed_transaction)
|
||||
Self::dispatch_transaction(&*self.client, &*self.miner, signed_transaction, true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use transaction::{Transaction, SignedTransaction, Action};
|
||||
use ethereum_types::U256;
|
||||
|
||||
use jsonrpc_core::Error;
|
||||
use v1::helpers::CallRequest;
|
||||
@@ -29,7 +28,7 @@ pub fn sign_call(request: CallRequest, gas_cap: bool) -> Result<SignedTransactio
|
||||
}
|
||||
Some(gas) => gas,
|
||||
None if gas_cap => max_gas,
|
||||
None => U256::from(2) << 50,
|
||||
None => max_gas * 10,
|
||||
};
|
||||
let from = request.from.unwrap_or(0.into());
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ pub use self::requests::{
|
||||
TransactionRequest, FilledTransactionRequest, ConfirmationRequest, ConfirmationPayload, CallRequest,
|
||||
};
|
||||
pub use self::signing_queue::{
|
||||
ConfirmationsQueue, ConfirmationReceiver, ConfirmationResult,
|
||||
ConfirmationsQueue, ConfirmationReceiver, ConfirmationResult, ConfirmationSender,
|
||||
SigningQueue, QueueEvent, DefaultAccount,
|
||||
QUEUE_LIMIT as SIGNING_QUEUE_LIMIT,
|
||||
};
|
||||
|
||||
@@ -13,8 +13,8 @@ pub enum PollFilter {
|
||||
Block(BlockNumber),
|
||||
/// Hashes of all transactions which client was notified about.
|
||||
PendingTransaction(Vec<H256>),
|
||||
/// Number of From block number, pending logs and log filter itself.
|
||||
Logs(BlockNumber, HashSet<Log>, Filter)
|
||||
/// Number of From block number, last seen block hash, pending logs and log filter itself.
|
||||
Logs(BlockNumber, Option<H256>, HashSet<Log>, Filter)
|
||||
}
|
||||
|
||||
/// Returns only last `n` logs
|
||||
|
||||
@@ -75,16 +75,17 @@ pub trait SigningQueue: Send + Sync {
|
||||
/// `ConfirmationReceiver` is a `Future` awaiting for resolution of the given request.
|
||||
fn add_request(&self, request: ConfirmationPayload, origin: Origin) -> Result<(U256, ConfirmationReceiver), QueueAddError>;
|
||||
|
||||
/// Removes a request from the queue.
|
||||
/// Notifies possible token holders that request was rejected.
|
||||
fn request_rejected(&self, id: U256) -> Option<ConfirmationRequest>;
|
||||
fn request_rejected(&self, sender: ConfirmationSender) -> Option<ConfirmationRequest>;
|
||||
|
||||
/// Removes a request from the queue.
|
||||
/// Notifies possible token holders that request was confirmed and given hash was assigned.
|
||||
fn request_confirmed(&self, id: U256, result: ConfirmationResult) -> Option<ConfirmationRequest>;
|
||||
fn request_confirmed(&self, sender: ConfirmationSender, result: ConfirmationResult) -> Option<ConfirmationRequest>;
|
||||
|
||||
/// Returns a request if it is contained in the queue.
|
||||
fn peek(&self, id: &U256) -> Option<ConfirmationRequest>;
|
||||
/// Put a request taken from `SigningQueue::take` back to the queue.
|
||||
fn request_untouched(&self, sender: ConfirmationSender);
|
||||
|
||||
/// Returns and removes a request if it is contained in the queue.
|
||||
fn take(&self, id: &U256) -> Option<ConfirmationSender>;
|
||||
|
||||
/// Return copy of all the requests in the queue.
|
||||
fn requests(&self) -> Vec<ConfirmationRequest>;
|
||||
@@ -96,9 +97,12 @@ pub trait SigningQueue: Send + Sync {
|
||||
fn is_empty(&self) -> bool;
|
||||
}
|
||||
|
||||
struct ConfirmationSender {
|
||||
/// Confirmation request information with result notifier.
|
||||
pub struct ConfirmationSender {
|
||||
/// Confirmation request information.
|
||||
pub request: ConfirmationRequest,
|
||||
|
||||
sender: oneshot::Sender<ConfirmationResult>,
|
||||
request: ConfirmationRequest,
|
||||
}
|
||||
|
||||
/// Receiving end of the Confirmation channel; can be used as a `Future` to await for `ConfirmationRequest`
|
||||
@@ -122,36 +126,29 @@ impl ConfirmationsQueue {
|
||||
/// Notifies consumer that the communcation is over.
|
||||
/// No more events will be sent after this function is invoked.
|
||||
pub fn finish(&self) {
|
||||
self.notify(QueueEvent::Finish);
|
||||
self.notify_message(QueueEvent::Finish);
|
||||
self.on_event.write().clear();
|
||||
}
|
||||
|
||||
/// Notifies receiver about the event happening in this queue.
|
||||
fn notify(&self, message: QueueEvent) {
|
||||
for listener in &*self.on_event.read() {
|
||||
listener(message.clone())
|
||||
}
|
||||
/// Notifies `ConfirmationReceiver` holder about the result given a request.
|
||||
fn notify_result(&self, sender: ConfirmationSender, result: Option<ConfirmationResult>) -> Option<ConfirmationRequest> {
|
||||
// notify receiver about the event
|
||||
self.notify_message(result.clone().map_or_else(
|
||||
|| QueueEvent::RequestRejected(sender.request.id),
|
||||
|_| QueueEvent::RequestConfirmed(sender.request.id)
|
||||
));
|
||||
|
||||
// notify confirmation receiver about resolution
|
||||
let result = result.ok_or(errors::request_rejected());
|
||||
sender.sender.send(result);
|
||||
|
||||
Some(sender.request)
|
||||
}
|
||||
|
||||
/// Removes requests from this queue and notifies `ConfirmationReceiver` holder about the result.
|
||||
/// Notifies also a receiver about that event.
|
||||
fn remove(&self, id: U256, result: Option<ConfirmationResult>) -> Option<ConfirmationRequest> {
|
||||
let sender = self.queue.write().remove(&id);
|
||||
|
||||
if let Some(sender) = sender {
|
||||
// notify receiver about the event
|
||||
self.notify(result.clone().map_or_else(
|
||||
|| QueueEvent::RequestRejected(id),
|
||||
|_| QueueEvent::RequestConfirmed(id)
|
||||
));
|
||||
|
||||
// notify confirmation receiver about resolution
|
||||
let result = result.ok_or(errors::request_rejected());
|
||||
sender.sender.send(result);
|
||||
|
||||
Some(sender.request)
|
||||
} else {
|
||||
None
|
||||
/// Notifies receiver about the event happening in this queue.
|
||||
fn notify_message(&self, message: QueueEvent) {
|
||||
for listener in &*self.on_event.read() {
|
||||
listener(message.clone())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,22 +190,26 @@ impl SigningQueue for ConfirmationsQueue {
|
||||
(id, receiver)
|
||||
};
|
||||
// Notify listeners
|
||||
self.notify(QueueEvent::NewRequest(id));
|
||||
self.notify_message(QueueEvent::NewRequest(id));
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
fn peek(&self, id: &U256) -> Option<ConfirmationRequest> {
|
||||
self.queue.read().get(id).map(|sender| sender.request.clone())
|
||||
fn take(&self, id: &U256) -> Option<ConfirmationSender> {
|
||||
self.queue.write().remove(id)
|
||||
}
|
||||
|
||||
fn request_rejected(&self, id: U256) -> Option<ConfirmationRequest> {
|
||||
debug!(target: "own_tx", "Signer: Request rejected ({:?}).", id);
|
||||
self.remove(id, None)
|
||||
fn request_rejected(&self, sender: ConfirmationSender) -> Option<ConfirmationRequest> {
|
||||
debug!(target: "own_tx", "Signer: Request rejected ({:?}).", sender.request.id);
|
||||
self.notify_result(sender, None)
|
||||
}
|
||||
|
||||
fn request_confirmed(&self, id: U256, result: ConfirmationResult) -> Option<ConfirmationRequest> {
|
||||
debug!(target: "own_tx", "Signer: Transaction confirmed ({:?}).", id);
|
||||
self.remove(id, Some(result))
|
||||
fn request_confirmed(&self, sender: ConfirmationSender, result: ConfirmationResult) -> Option<ConfirmationRequest> {
|
||||
debug!(target: "own_tx", "Signer: Request confirmed ({:?}).", sender.request.id);
|
||||
self.notify_result(sender, Some(result))
|
||||
}
|
||||
|
||||
fn request_untouched(&self, sender: ConfirmationSender) {
|
||||
self.queue.write().insert(sender.request.id, sender);
|
||||
}
|
||||
|
||||
fn requests(&self) -> Vec<ConfirmationRequest> {
|
||||
@@ -261,7 +262,8 @@ mod test {
|
||||
|
||||
// when
|
||||
let (id, future) = queue.add_request(request, Default::default()).unwrap();
|
||||
queue.request_confirmed(id, Ok(ConfirmationResponse::SendTransaction(1.into())));
|
||||
let sender = queue.take(&id).unwrap();
|
||||
queue.request_confirmed(sender, Ok(ConfirmationResponse::SendTransaction(1.into())));
|
||||
|
||||
// then
|
||||
let confirmation = future.wait().unwrap();
|
||||
|
||||
@@ -824,6 +824,7 @@ impl<C, SN: ?Sized, S: ?Sized, M, EM, T: StateInfo + 'static> Eth for EthClient<
|
||||
&*self.client,
|
||||
&*self.miner,
|
||||
signed_transaction.into(),
|
||||
false
|
||||
)
|
||||
})
|
||||
.map(Into::into)
|
||||
|
||||
@@ -39,7 +39,7 @@ pub trait Filterable {
|
||||
fn best_block_number(&self) -> u64;
|
||||
|
||||
/// Get a block hash by block id.
|
||||
fn block_hash(&self, id: BlockId) -> Option<RpcH256>;
|
||||
fn block_hash(&self, id: BlockId) -> Option<H256>;
|
||||
|
||||
/// pending transaction hashes at the given block.
|
||||
fn pending_transactions_hashes(&self) -> Vec<H256>;
|
||||
@@ -52,6 +52,9 @@ pub trait Filterable {
|
||||
|
||||
/// Get a reference to the poll manager.
|
||||
fn polls(&self) -> &Mutex<PollManager<PollFilter>>;
|
||||
|
||||
/// Get removed logs within route from the given block to the nearest canon block, not including the canon block. Also returns how many logs have been traversed.
|
||||
fn removed_logs(&self, block_hash: H256, filter: &EthcoreFilter) -> (Vec<Log>, u64);
|
||||
}
|
||||
|
||||
/// Eth filter rpc implementation for a full node.
|
||||
@@ -80,8 +83,8 @@ impl<C, M> Filterable for EthFilterClient<C, M> where
|
||||
self.client.chain_info().best_block_number
|
||||
}
|
||||
|
||||
fn block_hash(&self, id: BlockId) -> Option<RpcH256> {
|
||||
self.client.block_hash(id).map(Into::into)
|
||||
fn block_hash(&self, id: BlockId) -> Option<H256> {
|
||||
self.client.block_hash(id)
|
||||
}
|
||||
|
||||
fn pending_transactions_hashes(&self) -> Vec<H256> {
|
||||
@@ -100,6 +103,40 @@ impl<C, M> Filterable for EthFilterClient<C, M> where
|
||||
}
|
||||
|
||||
fn polls(&self) -> &Mutex<PollManager<PollFilter>> { &self.polls }
|
||||
|
||||
fn removed_logs(&self, block_hash: H256, filter: &EthcoreFilter) -> (Vec<Log>, u64) {
|
||||
let inner = || -> Option<Vec<H256>> {
|
||||
let mut route = Vec::new();
|
||||
|
||||
let mut current_block_hash = block_hash;
|
||||
let mut current_block_header = self.client.block_header(BlockId::Hash(current_block_hash))?;
|
||||
|
||||
while current_block_hash != self.client.block_hash(BlockId::Number(current_block_header.number()))? {
|
||||
route.push(current_block_hash);
|
||||
|
||||
current_block_hash = current_block_header.parent_hash();
|
||||
current_block_header = self.client.block_header(BlockId::Hash(current_block_hash))?;
|
||||
}
|
||||
|
||||
Some(route)
|
||||
};
|
||||
|
||||
let route = inner().unwrap_or_default();
|
||||
let route_len = route.len() as u64;
|
||||
(route.into_iter().flat_map(|block_hash| {
|
||||
let mut filter = filter.clone();
|
||||
filter.from_block = BlockId::Hash(block_hash);
|
||||
filter.to_block = filter.from_block;
|
||||
|
||||
self.client.logs(filter).into_iter().map(|log| {
|
||||
let mut log: Log = log.into();
|
||||
log.log_type = "removed".into();
|
||||
log.removed = true;
|
||||
|
||||
log
|
||||
})
|
||||
}).collect(), route_len)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +145,7 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
fn new_filter(&self, filter: Filter) -> Result<RpcU256> {
|
||||
let mut polls = self.polls().lock();
|
||||
let block_number = self.best_block_number();
|
||||
let id = polls.create_poll(PollFilter::Logs(block_number, Default::default(), filter));
|
||||
let id = polls.create_poll(PollFilter::Logs(block_number, None, Default::default(), filter));
|
||||
Ok(id.into())
|
||||
}
|
||||
|
||||
@@ -136,7 +173,7 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
let current_number = self.best_block_number() + 1;
|
||||
let hashes = (*block_number..current_number).into_iter()
|
||||
.map(BlockId::Number)
|
||||
.filter_map(|id| self.block_hash(id))
|
||||
.filter_map(|id| self.block_hash(id).map(Into::into))
|
||||
.collect::<Vec<RpcH256>>();
|
||||
|
||||
*block_number = current_number;
|
||||
@@ -166,7 +203,7 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
// return new hashes
|
||||
Either::A(future::ok(FilterChanges::Hashes(new_hashes)))
|
||||
},
|
||||
PollFilter::Logs(ref mut block_number, ref mut previous_logs, ref filter) => {
|
||||
PollFilter::Logs(ref mut block_number, ref mut last_block_hash, ref mut previous_logs, ref filter) => {
|
||||
// retrive the current block number
|
||||
let current_number = self.best_block_number();
|
||||
|
||||
@@ -175,6 +212,11 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
|
||||
// build appropriate filter
|
||||
let mut filter: EthcoreFilter = filter.clone().into();
|
||||
|
||||
// retrieve reorg logs
|
||||
let (mut reorg, reorg_len) = last_block_hash.map_or_else(|| (Vec::new(), 0), |h| self.removed_logs(h, &filter));
|
||||
*block_number -= reorg_len as u64;
|
||||
|
||||
filter.from_block = BlockId::Number(*block_number);
|
||||
filter.to_block = BlockId::Latest;
|
||||
|
||||
@@ -200,9 +242,14 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
// we want to get logs
|
||||
*block_number = current_number + 1;
|
||||
|
||||
// save the current block hash, which we used to get back to the
|
||||
// canon chain in case of reorg.
|
||||
*last_block_hash = self.block_hash(BlockId::Number(current_number));
|
||||
|
||||
// retrieve logs in range from_block..min(BlockId::Latest..to_block)
|
||||
let limit = filter.limit;
|
||||
Either::B(self.logs(filter)
|
||||
.map(move |logs| { reorg.extend(logs); reorg }) // append reorg logs in the front
|
||||
.map(move |mut logs| { logs.extend(pending); logs }) // append fetched pending logs
|
||||
.map(move |logs| limit_logs(logs, limit)) // limit the logs
|
||||
.map(FilterChanges::Logs))
|
||||
@@ -216,7 +263,7 @@ impl<T: Filterable + Send + Sync + 'static> EthFilter for T {
|
||||
let mut polls = self.polls().lock();
|
||||
|
||||
match polls.poll(&index.value()) {
|
||||
Some(&PollFilter::Logs(ref _block_number, ref _previous_log, ref filter)) => filter.clone(),
|
||||
Some(&PollFilter::Logs(ref _block_number, ref _last_block_hash, ref _previous_log, ref filter)) => filter.clone(),
|
||||
// just empty array
|
||||
Some(_) => return Box::new(future::ok(Vec::new())),
|
||||
None => return Box::new(future::err(errors::filter_not_found())),
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
use std::sync::{Arc, Weak};
|
||||
use std::collections::BTreeMap;
|
||||
use std::time::Duration;
|
||||
|
||||
use jsonrpc_core::{BoxFuture, Result, Error};
|
||||
use jsonrpc_core::futures::{self, Future, IntoFuture};
|
||||
@@ -33,7 +34,7 @@ use v1::types::{pubsub, RichHeader, Log};
|
||||
|
||||
use ethcore::encoded;
|
||||
use ethcore::filter::Filter as EthFilter;
|
||||
use ethcore::client::{BlockChainClient, ChainNotify, BlockId};
|
||||
use ethcore::client::{BlockChainClient, ChainNotify, ChainRoute, ChainRouteType, BlockId};
|
||||
use sync::LightSync;
|
||||
use light::cache::Cache;
|
||||
use light::on_demand::OnDemand;
|
||||
@@ -140,19 +141,20 @@ impl<C> ChainNotificationHandler<C> {
|
||||
}
|
||||
}
|
||||
|
||||
fn notify_logs<F, T>(&self, enacted: &[H256], logs: F) where
|
||||
F: Fn(EthFilter) -> T,
|
||||
fn notify_logs<F, T, Ex>(&self, enacted: &[(H256, Ex)], logs: F) where
|
||||
F: Fn(EthFilter, &Ex) -> T,
|
||||
Ex: Send,
|
||||
T: IntoFuture<Item = Vec<Log>, Error = Error>,
|
||||
T::Future: Send + 'static,
|
||||
{
|
||||
for &(ref subscriber, ref filter) in self.logs_subscribers.read().values() {
|
||||
let logs = futures::future::join_all(enacted
|
||||
.iter()
|
||||
.map(|hash| {
|
||||
.map(|&(hash, ref ex)| {
|
||||
let mut filter = filter.clone();
|
||||
filter.from_block = BlockId::Hash(*hash);
|
||||
filter.from_block = BlockId::Hash(hash);
|
||||
filter.to_block = filter.from_block.clone();
|
||||
logs(filter).into_future()
|
||||
logs(filter, ex).into_future()
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
);
|
||||
@@ -213,7 +215,7 @@ impl<C: LightClient> LightChainNotify for ChainNotificationHandler<C> {
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
self.notify_heads(&headers);
|
||||
self.notify_logs(&enacted, |filter| self.client.logs(filter))
|
||||
self.notify_logs(&enacted.iter().map(|h| (*h, ())).collect::<Vec<_>>(), |filter, _| self.client.logs(filter))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,17 +224,21 @@ impl<C: BlockChainClient> ChainNotify for ChainNotificationHandler<C> {
|
||||
&self,
|
||||
_imported: Vec<H256>,
|
||||
_invalid: Vec<H256>,
|
||||
enacted: Vec<H256>,
|
||||
retracted: Vec<H256>,
|
||||
route: ChainRoute,
|
||||
_sealed: Vec<H256>,
|
||||
// Block bytes.
|
||||
_proposed: Vec<Bytes>,
|
||||
_duration: u64,
|
||||
_duration: Duration,
|
||||
) {
|
||||
const EXTRA_INFO_PROOF: &'static str = "Object exists in in blockchain (fetched earlier), extra_info is always available if object exists; qed";
|
||||
let headers = enacted
|
||||
let headers = route.route()
|
||||
.iter()
|
||||
.filter_map(|hash| self.client.block_header(BlockId::Hash(*hash)))
|
||||
.filter_map(|&(hash, ref typ)| {
|
||||
match typ {
|
||||
&ChainRouteType::Retracted => None,
|
||||
&ChainRouteType::Enacted => self.client.block_header(BlockId::Hash(hash))
|
||||
}
|
||||
})
|
||||
.map(|header| {
|
||||
let hash = header.hash();
|
||||
(header, self.client.block_extra_info(BlockId::Hash(hash)).expect(EXTRA_INFO_PROOF))
|
||||
@@ -242,17 +248,18 @@ impl<C: BlockChainClient> ChainNotify for ChainNotificationHandler<C> {
|
||||
// Headers
|
||||
self.notify_heads(&headers);
|
||||
|
||||
// Enacted logs
|
||||
self.notify_logs(&enacted, |filter| {
|
||||
Ok(self.client.logs(filter).into_iter().map(Into::into).collect())
|
||||
});
|
||||
|
||||
// Retracted logs
|
||||
self.notify_logs(&retracted, |filter| {
|
||||
Ok(self.client.logs(filter).into_iter().map(Into::into).map(|mut log: Log| {
|
||||
log.log_type = "removed".into();
|
||||
log
|
||||
}).collect())
|
||||
// We notify logs enacting and retracting as the order in route.
|
||||
self.notify_logs(route.route(), |filter, ex| {
|
||||
match ex {
|
||||
&ChainRouteType::Enacted =>
|
||||
Ok(self.client.logs(filter).into_iter().map(Into::into).collect()),
|
||||
&ChainRouteType::Retracted =>
|
||||
Ok(self.client.logs(filter).into_iter().map(Into::into).map(|mut log: Log| {
|
||||
log.log_type = "removed".into();
|
||||
log.removed = true;
|
||||
log
|
||||
}).collect()),
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,8 +529,8 @@ impl<T: LightChainClient + 'static> Eth for EthClient<T> {
|
||||
impl<T: LightChainClient + 'static> Filterable for EthClient<T> {
|
||||
fn best_block_number(&self) -> u64 { self.client.chain_info().best_block_number }
|
||||
|
||||
fn block_hash(&self, id: BlockId) -> Option<RpcH256> {
|
||||
self.client.block_hash(id).map(Into::into)
|
||||
fn block_hash(&self, id: BlockId) -> Option<::ethereum_types::H256> {
|
||||
self.client.block_hash(id)
|
||||
}
|
||||
|
||||
fn pending_transactions_hashes(&self) -> Vec<::ethereum_types::H256> {
|
||||
@@ -548,6 +548,10 @@ impl<T: LightChainClient + 'static> Filterable for EthClient<T> {
|
||||
fn polls(&self) -> &Mutex<PollManager<PollFilter>> {
|
||||
&self.polls
|
||||
}
|
||||
|
||||
fn removed_logs(&self, _block_hash: ::ethereum_types::H256, _filter: &EthcoreFilter) -> (Vec<Log>, u64) {
|
||||
(Default::default(), 0)
|
||||
}
|
||||
}
|
||||
|
||||
fn extract_uncle_at_index<T: LightChainClient>(block: encoded::Block, index: Index, client: Arc<T>) -> Option<RichBlock> {
|
||||
|
||||
@@ -92,11 +92,11 @@ impl<D: Dispatcher + 'static> SignerClient<D> {
|
||||
let dispatcher = self.dispatcher.clone();
|
||||
let signer = self.signer.clone();
|
||||
|
||||
Box::new(signer.peek(&id).map(|confirmation| {
|
||||
let mut payload = confirmation.payload.clone();
|
||||
Box::new(signer.take(&id).map(|sender| {
|
||||
let mut payload = sender.request.payload.clone();
|
||||
// Modify payload
|
||||
if let ConfirmationPayload::SendTransaction(ref mut request) = payload {
|
||||
if let Some(sender) = modification.sender.clone() {
|
||||
if let Some(sender) = modification.sender {
|
||||
request.from = sender.into();
|
||||
// Altering sender should always reset the nonce.
|
||||
request.nonce = None;
|
||||
@@ -115,7 +115,9 @@ impl<D: Dispatcher + 'static> SignerClient<D> {
|
||||
Either::A(fut.into_future().then(move |result| {
|
||||
// Execute
|
||||
if let Ok(ref response) = result {
|
||||
signer.request_confirmed(id, Ok((*response).clone()));
|
||||
signer.request_confirmed(sender, Ok((*response).clone()));
|
||||
} else {
|
||||
signer.request_untouched(sender);
|
||||
}
|
||||
|
||||
result
|
||||
@@ -194,8 +196,9 @@ impl<D: Dispatcher + 'static> Signer for SignerClient<D> {
|
||||
fn confirm_request_raw(&self, id: U256, bytes: Bytes) -> Result<ConfirmationResponse> {
|
||||
let id = id.into();
|
||||
|
||||
self.signer.peek(&id).map(|confirmation| {
|
||||
let result = match confirmation.payload {
|
||||
self.signer.take(&id).map(|sender| {
|
||||
let payload = sender.request.payload.clone();
|
||||
let result = match payload {
|
||||
ConfirmationPayload::SendTransaction(request) => {
|
||||
Self::verify_transaction(bytes, request, |pending_transaction| {
|
||||
self.dispatcher.dispatch_transaction(pending_transaction)
|
||||
@@ -224,14 +227,16 @@ impl<D: Dispatcher + 'static> Signer for SignerClient<D> {
|
||||
},
|
||||
};
|
||||
if let Ok(ref response) = result {
|
||||
self.signer.request_confirmed(id, Ok(response.clone()));
|
||||
self.signer.request_confirmed(sender, Ok(response.clone()));
|
||||
} else {
|
||||
self.signer.request_untouched(sender);
|
||||
}
|
||||
result
|
||||
}).unwrap_or_else(|| Err(errors::invalid_params("Unknown RequestID", id)))
|
||||
}
|
||||
|
||||
fn reject_request(&self, id: U256) -> Result<bool> {
|
||||
let res = self.signer.request_rejected(id.into());
|
||||
let res = self.signer.take(&id.into()).map(|sender| self.signer.request_rejected(sender));
|
||||
Ok(res.is_some())
|
||||
}
|
||||
|
||||
|
||||
@@ -155,7 +155,14 @@ impl MinerService for TestMinerService {
|
||||
}
|
||||
|
||||
/// Imports transactions to transaction queue.
|
||||
fn import_own_transaction<C: Nonce + Sync>(&self, chain: &C, pending: PendingTransaction)
|
||||
fn import_own_transaction<C: Nonce + Sync>(&self, _chain: &C, _pending: PendingTransaction)
|
||||
-> Result<(), transaction::Error> {
|
||||
// this function is no longer called directly from RPC
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
/// Imports transactions to queue - treats as local based on trusted flag, config, and tx source
|
||||
fn import_claimed_local_transaction<C: Nonce + Sync>(&self, chain: &C, pending: PendingTransaction, _trusted: bool)
|
||||
-> Result<(), transaction::Error> {
|
||||
|
||||
// keep the pending nonces up to date
|
||||
|
||||
@@ -226,8 +226,8 @@ fn rpc_eth_logs() {
|
||||
let request2 = r#"{"jsonrpc": "2.0", "method": "eth_getLogs", "params": [{"limit":1}], "id": 1}"#;
|
||||
let request3 = r#"{"jsonrpc": "2.0", "method": "eth_getLogs", "params": [{"limit":0}], "id": 1}"#;
|
||||
|
||||
let response1 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x0","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"},{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response2 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response1 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x0","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"},{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response2 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response3 = r#"{"jsonrpc":"2.0","result":[],"id":1}"#;
|
||||
|
||||
assert_eq!(tester.io.handle_request_sync(request1), Some(response1.to_owned()));
|
||||
@@ -276,8 +276,8 @@ fn rpc_logs_filter() {
|
||||
|
||||
let request_changes1 = r#"{"jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": ["0x0"], "id": 1}"#;
|
||||
let request_changes2 = r#"{"jsonrpc": "2.0", "method": "eth_getFilterChanges", "params": ["0x1"], "id": 1}"#;
|
||||
let response1 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x0","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"},{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response2 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response1 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x0","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"},{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
let response2 = r#"{"jsonrpc":"2.0","result":[{"address":"0x0000000000000000000000000000000000000000","blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","blockNumber":"0x1","data":"0x010203","logIndex":"0x1","removed":false,"topics":[],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x1","type":"mined"}],"id":1}"#;
|
||||
|
||||
assert_eq!(tester.io.handle_request_sync(request_changes1), Some(response1.to_owned()));
|
||||
assert_eq!(tester.io.handle_request_sync(request_changes2), Some(response2.to_owned()));
|
||||
@@ -1045,7 +1045,7 @@ fn rpc_eth_transaction_receipt() {
|
||||
"params": ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],
|
||||
"id": 1
|
||||
}"#;
|
||||
let response = r#"{"jsonrpc":"2.0","result":{"blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","contractAddress":null,"cumulativeGasUsed":"0x20","gasUsed":"0x10","logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","data":"0x","logIndex":"0x1","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"}],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","root":"0x0000000000000000000000000000000000000000000000000000000000000000","status":null,"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0"},"id":1}"#;
|
||||
let response = r#"{"jsonrpc":"2.0","result":{"blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","contractAddress":null,"cumulativeGasUsed":"0x20","gasUsed":"0x10","logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","data":"0x","logIndex":"0x1","removed":false,"topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"}],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","root":"0x0000000000000000000000000000000000000000000000000000000000000000","status":null,"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0"},"id":1}"#;
|
||||
|
||||
assert_eq!(tester.io.handle_request_sync(request), Some(response.to_owned()));
|
||||
}
|
||||
|
||||
@@ -20,11 +20,15 @@ use jsonrpc_core::MetaIoHandler;
|
||||
use jsonrpc_core::futures::{self, Stream, Future};
|
||||
use jsonrpc_pubsub::Session;
|
||||
|
||||
use std::time::Duration;
|
||||
|
||||
use v1::{EthPubSub, EthPubSubClient, Metadata};
|
||||
|
||||
use ethcore::client::{TestBlockChainClient, EachBlockWith, ChainNotify};
|
||||
use ethcore::client::{TestBlockChainClient, EachBlockWith, ChainNotify, ChainRoute, ChainRouteType};
|
||||
use parity_reactor::EventLoop;
|
||||
|
||||
const DURATION_ZERO: Duration = Duration::from_millis(0);
|
||||
|
||||
#[test]
|
||||
fn should_subscribe_to_new_heads() {
|
||||
// given
|
||||
@@ -53,13 +57,13 @@ fn should_subscribe_to_new_heads() {
|
||||
assert_eq!(io.handle_request_sync(request, metadata.clone()), Some(response.to_owned()));
|
||||
|
||||
// Check notifications
|
||||
handler.new_blocks(vec![], vec![], vec![h1], vec![], vec![], vec![], 0);
|
||||
handler.new_blocks(vec![], vec![], ChainRoute::new(vec![(h1, ChainRouteType::Enacted)]), vec![], vec![], DURATION_ZERO);
|
||||
let (res, receiver) = receiver.into_future().wait().unwrap();
|
||||
let response = r#"{"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"author":"0x0000000000000000000000000000000000000000","difficulty":"0x1","extraData":"0x","gasLimit":"0xf4240","gasUsed":"0x0","hash":"0x3457d2fa2e3dd33c78ac681cf542e429becf718859053448748383af67e23218","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","miner":"0x0000000000000000000000000000000000000000","number":"0x1","parentHash":"0x0cd786a2425d16f152c658316c423e6ce1181e15c3295826d7c9904cba9ce303","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","sealFields":[],"sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","size":"0x1c9","stateRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","timestamp":"0x0","transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"},"subscription":"0x416d77337e24399d"}}"#;
|
||||
assert_eq!(res, Some(response.into()));
|
||||
|
||||
// Notify about two blocks
|
||||
handler.new_blocks(vec![], vec![], vec![h2, h3], vec![], vec![], vec![], 0);
|
||||
handler.new_blocks(vec![], vec![], ChainRoute::new(vec![(h2, ChainRouteType::Enacted), (h3, ChainRouteType::Enacted)]), vec![], vec![], DURATION_ZERO);
|
||||
|
||||
// Receive both
|
||||
let (res, receiver) = receiver.into_future().wait().unwrap();
|
||||
@@ -125,17 +129,17 @@ fn should_subscribe_to_logs() {
|
||||
assert_eq!(io.handle_request_sync(request, metadata.clone()), Some(response.to_owned()));
|
||||
|
||||
// Check notifications (enacted)
|
||||
handler.new_blocks(vec![], vec![], vec![h1], vec![], vec![], vec![], 0);
|
||||
handler.new_blocks(vec![], vec![], ChainRoute::new(vec![(h1, ChainRouteType::Enacted)]), vec![], vec![], DURATION_ZERO);
|
||||
let (res, receiver) = receiver.into_future().wait().unwrap();
|
||||
let response = r#"{"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"address":"0x0000000000000000000000000000000000000005","blockHash":"0x3457d2fa2e3dd33c78ac681cf542e429becf718859053448748383af67e23218","blockNumber":"0x1","data":"0x","logIndex":"0x0","topics":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"transactionHash":""#.to_owned()
|
||||
let response = r#"{"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"address":"0x0000000000000000000000000000000000000005","blockHash":"0x3457d2fa2e3dd33c78ac681cf542e429becf718859053448748383af67e23218","blockNumber":"0x1","data":"0x","logIndex":"0x0","removed":false,"topics":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"transactionHash":""#.to_owned()
|
||||
+ &format!("0x{:x}", tx_hash)
|
||||
+ r#"","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"mined"},"subscription":"0x416d77337e24399d"}}"#;
|
||||
assert_eq!(res, Some(response.into()));
|
||||
|
||||
// Check notifications (retracted)
|
||||
handler.new_blocks(vec![], vec![], vec![], vec![h1], vec![], vec![], 0);
|
||||
handler.new_blocks(vec![], vec![], ChainRoute::new(vec![(h1, ChainRouteType::Retracted)]), vec![], vec![], DURATION_ZERO);
|
||||
let (res, receiver) = receiver.into_future().wait().unwrap();
|
||||
let response = r#"{"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"address":"0x0000000000000000000000000000000000000005","blockHash":"0x3457d2fa2e3dd33c78ac681cf542e429becf718859053448748383af67e23218","blockNumber":"0x1","data":"0x","logIndex":"0x0","topics":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"transactionHash":""#.to_owned()
|
||||
let response = r#"{"jsonrpc":"2.0","method":"eth_subscription","params":{"result":{"address":"0x0000000000000000000000000000000000000005","blockHash":"0x3457d2fa2e3dd33c78ac681cf542e429becf718859053448748383af67e23218","blockNumber":"0x1","data":"0x","logIndex":"0x0","removed":true,"topics":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"transactionHash":""#.to_owned()
|
||||
+ &format!("0x{:x}", tx_hash)
|
||||
+ r#"","transactionIndex":"0x0","transactionLogIndex":"0x0","type":"removed"},"subscription":"0x416d77337e24399d"}}"#;
|
||||
assert_eq!(res, Some(response.into()));
|
||||
|
||||
@@ -110,7 +110,8 @@ fn should_add_sign_to_queue() {
|
||||
::std::thread::spawn(move || loop {
|
||||
if signer.requests().len() == 1 {
|
||||
// respond
|
||||
signer.request_confirmed(1.into(), Ok(ConfirmationResponse::Signature(0.into())));
|
||||
let sender = signer.take(&1.into()).unwrap();
|
||||
signer.request_confirmed(sender, Ok(ConfirmationResponse::Signature(0.into())));
|
||||
break
|
||||
}
|
||||
::std::thread::sleep(Duration::from_millis(100))
|
||||
@@ -188,7 +189,8 @@ fn should_check_status_of_request_when_its_resolved() {
|
||||
"id": 1
|
||||
}"#;
|
||||
tester.io.handle_request_sync(&request).expect("Sent");
|
||||
tester.signer.request_confirmed(1.into(), Ok(ConfirmationResponse::Signature(1.into())));
|
||||
let sender = tester.signer.take(&1.into()).unwrap();
|
||||
tester.signer.request_confirmed(sender, Ok(ConfirmationResponse::Signature(1.into())));
|
||||
|
||||
// This is not ideal, but we need to give futures some time to be executed, and they need to run in a separate thread
|
||||
thread::sleep(Duration::from_millis(20));
|
||||
@@ -259,7 +261,8 @@ fn should_add_transaction_to_queue() {
|
||||
::std::thread::spawn(move || loop {
|
||||
if signer.requests().len() == 1 {
|
||||
// respond
|
||||
signer.request_confirmed(1.into(), Ok(ConfirmationResponse::SendTransaction(0.into())));
|
||||
let sender = signer.take(&1.into()).unwrap();
|
||||
signer.request_confirmed(sender, Ok(ConfirmationResponse::SendTransaction(0.into())));
|
||||
break
|
||||
}
|
||||
::std::thread::sleep(Duration::from_millis(100))
|
||||
@@ -335,7 +338,8 @@ fn should_add_sign_transaction_to_the_queue() {
|
||||
::std::thread::spawn(move || loop {
|
||||
if signer.requests().len() == 1 {
|
||||
// respond
|
||||
signer.request_confirmed(1.into(), Ok(ConfirmationResponse::SignTransaction(
|
||||
let sender = signer.take(&1.into()).unwrap();
|
||||
signer.request_confirmed(sender, Ok(ConfirmationResponse::SignTransaction(
|
||||
RichRawTransaction::from_signed(t.into(), 0x0, u64::max_value())
|
||||
)));
|
||||
break
|
||||
@@ -442,7 +446,8 @@ fn should_add_decryption_to_the_queue() {
|
||||
::std::thread::spawn(move || loop {
|
||||
if signer.requests().len() == 1 {
|
||||
// respond
|
||||
signer.request_confirmed(1.into(), Ok(ConfirmationResponse::Decrypt(vec![0x1, 0x2].into())));
|
||||
let sender = signer.take(&1.into()).unwrap();
|
||||
signer.request_confirmed(sender, Ok(ConfirmationResponse::Decrypt(vec![0x1, 0x2].into())));
|
||||
break
|
||||
}
|
||||
::std::thread::sleep(Duration::from_millis(10))
|
||||
|
||||
@@ -47,6 +47,9 @@ pub struct Log {
|
||||
/// Log Type
|
||||
#[serde(rename="type")]
|
||||
pub log_type: String,
|
||||
/// Whether Log Type is Removed (Geth Compatibility Field)
|
||||
#[serde(default)]
|
||||
pub removed: bool,
|
||||
}
|
||||
|
||||
impl From<LocalizedLogEntry> for Log {
|
||||
@@ -62,6 +65,7 @@ impl From<LocalizedLogEntry> for Log {
|
||||
log_index: Some(e.log_index.into()),
|
||||
transaction_log_index: Some(e.transaction_log_index.into()),
|
||||
log_type: "mined".to_owned(),
|
||||
removed: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -79,6 +83,7 @@ impl From<LogEntry> for Log {
|
||||
log_index: None,
|
||||
transaction_log_index: None,
|
||||
log_type: "pending".to_owned(),
|
||||
removed: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,7 +96,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn log_serialization() {
|
||||
let s = r#"{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":"0x1","type":"mined"}"#;
|
||||
let s = r#"{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":"0x1","type":"mined","removed":false}"#;
|
||||
|
||||
let log = Log {
|
||||
address: H160::from_str("33990122638b9132ca29c723bdf037f1a891a70c").unwrap(),
|
||||
@@ -107,6 +112,7 @@ mod tests {
|
||||
transaction_log_index: Some(1.into()),
|
||||
log_index: Some(U256::from(1)),
|
||||
log_type: "mined".to_owned(),
|
||||
removed: false,
|
||||
};
|
||||
|
||||
let serialized = serde_json::to_string(&log).unwrap();
|
||||
|
||||
@@ -131,7 +131,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn receipt_serialization() {
|
||||
let s = r#"{"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","cumulativeGasUsed":"0x20","gasUsed":"0x10","contractAddress":null,"logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":null,"type":"mined"}],"root":"0x000000000000000000000000000000000000000000000000000000000000000a","logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","status":"0x1"}"#;
|
||||
let s = r#"{"transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","cumulativeGasUsed":"0x20","gasUsed":"0x10","contractAddress":null,"logs":[{"address":"0x33990122638b9132ca29c723bdf037f1a891a70c","topics":["0xa6697e974e6a320f454390be03f74955e8978f1a6971ea6730542e37b66179bc","0x4861736852656700000000000000000000000000000000000000000000000000"],"data":"0x","blockHash":"0xed76641c68a1c641aee09a94b3b471f4dc0316efe5ac19cf488e2674cf8d05b5","blockNumber":"0x4510c","transactionHash":"0x0000000000000000000000000000000000000000000000000000000000000000","transactionIndex":"0x0","logIndex":"0x1","transactionLogIndex":null,"type":"mined","removed":false}],"root":"0x000000000000000000000000000000000000000000000000000000000000000a","logsBloom":"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f","status":"0x1"}"#;
|
||||
|
||||
let receipt = Receipt {
|
||||
transaction_hash: Some(0.into()),
|
||||
@@ -155,6 +155,7 @@ mod tests {
|
||||
transaction_log_index: None,
|
||||
log_index: Some(1.into()),
|
||||
log_type: "mined".into(),
|
||||
removed: false,
|
||||
}],
|
||||
logs_bloom: 15.into(),
|
||||
state_root: Some(10.into()),
|
||||
@@ -165,4 +166,3 @@ mod tests {
|
||||
assert_eq!(serialized, s);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
cd docker/hub
|
||||
DOCKER_BUILD_TAG=$1
|
||||
echo "Docker build tag: " $DOCKER_BUILD_TAG
|
||||
docker build --build-arg BUILD_TAG=$DOCKER_BUILD_TAG --no-cache=true --tag parity/parity:$DOCKER_BUILD_TAG .
|
||||
if [[ "$DOCKER_BUILD_TAG" = "latest" ]]; then
|
||||
docker build --build-arg BUILD_TAG="master" --no-cache=true --tag parity/parity:$DOCKER_BUILD_TAG .
|
||||
else
|
||||
docker build --build-arg BUILD_TAG=$DOCKER_BUILD_TAG --no-cache=true --tag parity/parity:$DOCKER_BUILD_TAG .
|
||||
fi
|
||||
docker run -it parity/parity:$DOCKER_BUILD_TAG -v
|
||||
docker push parity/parity:$DOCKER_BUILD_TAG
|
||||
|
||||
@@ -165,6 +165,10 @@ make_pkg () {
|
||||
}
|
||||
sign_exe () {
|
||||
./sign.cmd $keyfile $certpass "target/$PLATFORM/release/parity.exe"
|
||||
./sign.cmd $keyfile $certpass "target/$PLATFORM/release/parity-evm.exe"
|
||||
./sign.cmd $keyfile $certpass "target/$PLATFORM/release/ethstore.exe"
|
||||
./sign.cmd $keyfile $certpass "target/$PLATFORM/release/ethkey.exe"
|
||||
./sign.cmd $keyfile $certpass "target/$PLATFORM/release/whisper.exe"
|
||||
}
|
||||
make_exe () {
|
||||
./msbuild.cmd
|
||||
@@ -325,7 +329,7 @@ case $BUILD_PLATFORM in
|
||||
snapcraft clean
|
||||
echo "Prepare snapcraft.yaml for build on Gitlab CI in Docker image"
|
||||
sed -i 's/git/'"$VER"'/g' snap/snapcraft.yaml
|
||||
if [[ "$CI_BUILD_REF_NAME" = "beta" || "$VER" == *1.11* ]];
|
||||
if [[ "$CI_BUILD_REF_NAME" = "stable" || "$CI_BUILD_REF_NAME" = "beta" || "$VER" == *1.10* || "$VER" == *1.11* ]];
|
||||
then
|
||||
sed -i -e 's/grade: devel/grade: stable/' snap/snapcraft.yaml;
|
||||
fi
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::time::Duration;
|
||||
use parking_lot::{Mutex, RwLock};
|
||||
use ethcore::client::{BlockId, ChainNotify, CallContract, RegistryInfo};
|
||||
use ethcore::client::{BlockId, ChainNotify, ChainRoute, CallContract, RegistryInfo};
|
||||
use ethereum_types::{H256, Address};
|
||||
use bytes::Bytes;
|
||||
use trusted_client::TrustedClient;
|
||||
@@ -75,8 +76,8 @@ impl AclStorage for OnChainAclStorage {
|
||||
}
|
||||
|
||||
impl ChainNotify for OnChainAclStorage {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, enacted: Vec<H256>, retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: u64) {
|
||||
if !enacted.is_empty() || !retracted.is_empty() {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: Duration) {
|
||||
if !route.enacted().is_empty() || !route.retracted().is_empty() {
|
||||
self.contract.lock().update()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,9 @@
|
||||
use std::sync::Arc;
|
||||
use std::net::SocketAddr;
|
||||
use std::collections::{BTreeMap, HashSet};
|
||||
use std::time::Duration;
|
||||
use parking_lot::Mutex;
|
||||
use ethcore::client::{Client, BlockChainClient, BlockId, ChainNotify, CallContract, RegistryInfo};
|
||||
use ethcore::client::{Client, BlockChainClient, BlockId, ChainNotify, ChainRoute, CallContract, RegistryInfo};
|
||||
use ethcore::filter::Filter;
|
||||
use ethkey::public_to_address;
|
||||
use hash::keccak;
|
||||
@@ -162,7 +163,9 @@ impl KeyServerSet for OnChainKeyServerSet {
|
||||
}
|
||||
|
||||
impl ChainNotify for OnChainKeyServerSet {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, enacted: Vec<H256>, retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: u64) {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: Duration) {
|
||||
let (enacted, retracted) = route.into_enacted_retracted();
|
||||
|
||||
if !enacted.is_empty() || !retracted.is_empty() {
|
||||
self.contract.lock().update(enacted, retracted)
|
||||
}
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
use std::collections::HashSet;
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::time::Duration;
|
||||
use std::thread;
|
||||
use parking_lot::Mutex;
|
||||
use ethcore::client::ChainNotify;
|
||||
use ethcore::client::{ChainNotify, ChainRoute};
|
||||
use ethkey::{Public, public_to_address};
|
||||
use bytes::Bytes;
|
||||
use ethereum_types::{H256, U256, Address};
|
||||
@@ -428,8 +429,8 @@ impl Drop for ServiceContractListener {
|
||||
}
|
||||
|
||||
impl ChainNotify for ServiceContractListener {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, enacted: Vec<H256>, _retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: u64) {
|
||||
let enacted_len = enacted.len();
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: Duration) {
|
||||
let enacted_len = route.enacted().len();
|
||||
if enacted_len == 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@ parts:
|
||||
parity:
|
||||
source: .
|
||||
plugin: rust
|
||||
# rust-channel: stable # @TODO enable after https://bugs.launchpad.net/snapcraft/+bug/1778530
|
||||
rust-revision: 1.26.2 # @TODO remove after https://bugs.launchpad.net/snapcraft/+bug/1778530
|
||||
build-attributes: [no-system-libraries]
|
||||
build-packages: [g++, libudev-dev, libssl-dev, make, pkg-config]
|
||||
stage-packages: [libc6, libssl1.0.0, libudev1, libstdc++6]
|
||||
|
||||
@@ -28,7 +28,7 @@ use target_info::Target;
|
||||
use bytes::Bytes;
|
||||
use ethcore::BlockNumber;
|
||||
use ethcore::filter::Filter;
|
||||
use ethcore::client::{BlockId, BlockChainClient, ChainNotify};
|
||||
use ethcore::client::{BlockId, BlockChainClient, ChainNotify, ChainRoute};
|
||||
use ethereum_types::H256;
|
||||
use sync::{SyncProvider};
|
||||
use hash_fetch::{self as fetch, HashFetch};
|
||||
@@ -660,7 +660,7 @@ impl<O: OperationsClient, F: HashFetch, T: TimeProvider, R: GenRange> Updater<O,
|
||||
}
|
||||
|
||||
impl ChainNotify for Updater {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, _enacted: Vec<H256>, _retracted: Vec<H256>, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: u64) {
|
||||
fn new_blocks(&self, _imported: Vec<H256>, _invalid: Vec<H256>, _route: ChainRoute, _sealed: Vec<H256>, _proposed: Vec<Bytes>, _duration: Duration) {
|
||||
match (self.client.upgrade(), self.sync.as_ref().and_then(Weak::upgrade)) {
|
||||
(Some(ref c), Some(ref s)) if !s.status().is_syncing(c.queue_info()) => self.poll(),
|
||||
_ => {},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
[package]
|
||||
name = "parity-version"
|
||||
# NOTE: this value is used for Parity version string (via env CARGO_PKG_VERSION)
|
||||
version = "1.11.3"
|
||||
version = "1.11.5"
|
||||
authors = ["Parity Technologies <admin@parity.io>"]
|
||||
build = "build.rs"
|
||||
|
||||
@@ -12,14 +12,13 @@ build = "build.rs"
|
||||
# Used by auto-updater and for Parity version string.
|
||||
track = "beta"
|
||||
|
||||
# Indicates a critical release in this track (i.e. consensus issue)
|
||||
critical = true
|
||||
|
||||
# Latest supported fork blocks for various networks. Used ONLY by auto-updater.
|
||||
[package.metadata.forks]
|
||||
foundation = 4370000
|
||||
ropsten = 10
|
||||
kovan = 6600000
|
||||
# Network specific settings, used ONLY by auto-updater.
|
||||
# Latest supported fork blocks.
|
||||
# Indicates a critical release in this track (i.e. consensus issue).
|
||||
[package.metadata.networks]
|
||||
foundation = { forkBlock = 4370000, critical = false }
|
||||
ropsten = { forkBlock = 10, critical = false }
|
||||
kovan = { forkBlock = 6600000, critical = false }
|
||||
|
||||
[dependencies]
|
||||
ethcore-bytes = { path = "../bytes" }
|
||||
|
||||
Reference in New Issue
Block a user