Merge branch 'master' into rpc_blockchain
This commit is contained in:
commit
4f7d44691a
|
@ -19,7 +19,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "abstract-ns"
|
||||
version = "0.2.1"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"futures 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -127,21 +127,21 @@ dependencies = [
|
|||
"bitcrypto 0.1.0",
|
||||
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"primitives 0.1.0",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serialization 0.1.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.19.0"
|
||||
version = "2.19.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"strsim 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"term_size 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-segmentation 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"vec_map 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -167,7 +167,7 @@ version = "0.14.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -180,6 +180,7 @@ dependencies = [
|
|||
"elastic-array 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ethcore-devtools 1.3.0",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lru-cache 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"primitives 0.1.0",
|
||||
"rocksdb 0.4.5 (git+https://github.com/ethcore/rust-rocksdb)",
|
||||
|
@ -231,10 +232,10 @@ version = "0.5.6"
|
|||
source = "git+https://github.com/ethcore/rust-secp256k1#f998f9a8c18227af200f0f7fdadf8a6560d391ff"
|
||||
dependencies = [
|
||||
"arrayvec 0.3.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gcc 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -264,7 +265,7 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "gcc"
|
||||
version = "0.3.38"
|
||||
version = "0.3.39"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rayon 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -294,7 +295,7 @@ dependencies = [
|
|||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"mime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rotor 0.6.3 (git+https://github.com/ethcore/rotor)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"spmc 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -330,10 +331,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
[[package]]
|
||||
name = "jsonrpc-core"
|
||||
version = "4.0.0"
|
||||
source = "git+https://github.com/ethcore/jsonrpc.git#1500da1b9613a0a17fc0109d825f3ccc60199a53"
|
||||
source = "git+https://github.com/ethcore/jsonrpc.git#140257f1a726e9190bdaafeb4625b2a5400de4da"
|
||||
dependencies = [
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parking_lot 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -342,7 +343,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "jsonrpc-http-server"
|
||||
version = "6.1.1"
|
||||
source = "git+https://github.com/ethcore/jsonrpc.git#1500da1b9613a0a17fc0109d825f3ccc60199a53"
|
||||
source = "git+https://github.com/ethcore/jsonrpc.git#140257f1a726e9190bdaafeb4625b2a5400de4da"
|
||||
dependencies = [
|
||||
"hyper 0.10.0-a.0 (git+https://github.com/ethcore/hyper)",
|
||||
"jsonrpc-core 4.0.0 (git+https://github.com/ethcore/jsonrpc.git)",
|
||||
|
@ -350,6 +351,15 @@ dependencies = [
|
|||
"unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonrpc-macros"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/ethcore/jsonrpc.git#140257f1a726e9190bdaafeb4625b2a5400de4da"
|
||||
dependencies = [
|
||||
"jsonrpc-core 4.0.0 (git+https://github.com/ethcore/jsonrpc.git)",
|
||||
"serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kernel32-sys"
|
||||
version = "0.2.2"
|
||||
|
@ -369,7 +379,7 @@ dependencies = [
|
|||
"lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"primitives 0.1.0",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -389,7 +399,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.17"
|
||||
version = "0.2.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "linked-hash-map"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -412,6 +427,14 @@ dependencies = [
|
|||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lru-cache"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"linked-hash-map 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matches"
|
||||
version = "0.1.4"
|
||||
|
@ -422,7 +445,7 @@ name = "memchr"
|
|||
version = "0.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -464,11 +487,11 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.6.1"
|
||||
source = "git+https://github.com/ethcore/mio.git#ef182bae193a9c7457cd2cf661fcaffb226e3eef"
|
||||
source = "git+https://github.com/ethcore/mio.git#15a577039bed3c72f2952459f8ad687a56f63e29"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"net2 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -484,7 +507,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)",
|
||||
"lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"net2 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -519,7 +542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -540,7 +563,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
dependencies = [
|
||||
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -559,7 +582,7 @@ name = "ns-dns-tokio"
|
|||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"abstract-ns 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"abstract-ns 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"domain 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"tokio-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -575,7 +598,7 @@ name = "num_cpus"
|
|||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -601,7 +624,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
name = "p2p"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"abstract-ns 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"abstract-ns 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitcrypto 0.1.0",
|
||||
"csv 0.14.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"futures 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -618,17 +641,6 @@ dependencies = [
|
|||
"tokio-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.2.8"
|
||||
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.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.3.6"
|
||||
|
@ -644,7 +656,7 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -657,7 +669,7 @@ dependencies = [
|
|||
"app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bencher 0.1.0",
|
||||
"chain 0.1.0",
|
||||
"clap 2.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"db 0.1.0",
|
||||
"env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"import 0.1.0",
|
||||
|
@ -679,7 +691,7 @@ name = "primitives"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -721,7 +733,7 @@ name = "rand"
|
|||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -730,7 +742,7 @@ version = "0.4.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
@ -757,7 +769,7 @@ name = "rocksdb"
|
|||
version = "0.4.5"
|
||||
source = "git+https://github.com/ethcore/rust-rocksdb#64c63ccbe1f62c2e2b39262486f9ba813793af58"
|
||||
dependencies = [
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)",
|
||||
]
|
||||
|
||||
|
@ -766,8 +778,8 @@ name = "rocksdb-sys"
|
|||
version = "0.3.0"
|
||||
source = "git+https://github.com/ethcore/rust-rocksdb#64c63ccbe1f62c2e2b39262486f9ba813793af58"
|
||||
dependencies = [
|
||||
"gcc 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -790,12 +802,13 @@ dependencies = [
|
|||
"db 0.1.0",
|
||||
"jsonrpc-core 4.0.0 (git+https://github.com/ethcore/jsonrpc.git)",
|
||||
"jsonrpc-http-server 6.1.1 (git+https://github.com/ethcore/jsonrpc.git)",
|
||||
"jsonrpc-macros 0.1.0 (git+https://github.com/ethcore/jsonrpc.git)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"miner 0.1.0",
|
||||
"network 0.1.0",
|
||||
"p2p 0.1.0",
|
||||
"primitives 0.1.0",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.8.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_codegen 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -812,16 +825,16 @@ name = "rust-crypto"
|
|||
version = "0.2.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"gcc 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-serialize"
|
||||
version = "0.3.21"
|
||||
version = "0.3.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -1002,9 +1015,9 @@ name = "syntex_errors"
|
|||
version = "0.44.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_pos 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1015,7 +1028,7 @@ name = "syntex_pos"
|
|||
version = "0.44.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1024,9 +1037,9 @@ version = "0.44.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_errors 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syntex_pos 0.44.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -1048,7 +1061,7 @@ version = "0.2.1"
|
|||
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.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1068,7 +1081,7 @@ version = "2.0.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -1085,7 +1098,7 @@ version = "0.1.35"
|
|||
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.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
|
@ -1124,7 +1137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "0.1.2"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
|
@ -1205,7 +1218,7 @@ version = "0.3.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[metadata]
|
||||
"checksum abstract-ns 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "179c25175ddfb957808aab46c48dd7d0c66a366bff79363813b527447c9f620c"
|
||||
"checksum abstract-ns 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ebf235e1c1f96a1501b02842111e95b81132df346eee751131779a2adca8090"
|
||||
"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
|
||||
"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
|
||||
"checksum app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7d1c0d48a81bbb13043847f957971f4d87c81542d80ece5e84ba3cba4058fd4"
|
||||
|
@ -1217,7 +1230,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||
"checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855"
|
||||
"checksum cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de1e760d7b6535af4241fca8bd8adf68e2e7edacc6b29f5d399050c5e48cf88c"
|
||||
"checksum clap 2.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef87e92396a3d29bf7e611c8a595be35ae90d9cb844a3571425900eaca4f51c8"
|
||||
"checksum clap 2.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "305ad043f009db535a110200541d4567b63e172b1fe030313fbb92565da7ed24"
|
||||
"checksum cookie 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d53b80dde876f47f03cda35303e368a79b91c70b0d65ecba5fd5280944a08591"
|
||||
"checksum crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"
|
||||
"checksum csv 0.14.7 (registry+https://github.com/rust-lang/crates.io-index)" = "266c1815d7ca63a5bd86284043faf91e8c95e943e55ce05dc0ae08e952de18bc"
|
||||
|
@ -1229,7 +1242,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum eth-secp256k1 0.5.6 (git+https://github.com/ethcore/rust-secp256k1)" = "<none>"
|
||||
"checksum futures 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bad0a2ac64b227fdc10c254051ae5af542cf19c9328704fd4092f7914196897"
|
||||
"checksum futures-cpupool 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bb982bb25cd8fa5da6a8eb3a460354c984ff1113da82bcb4f0b0862b5795db82"
|
||||
"checksum gcc 0.3.38 (registry+https://github.com/rust-lang/crates.io-index)" = "553f11439bdefe755bf366b264820f1da70f3aaf3924e594b886beb9c831bcf5"
|
||||
"checksum gcc 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "771e4a97ff6f237cf0f7d5f5102f6e28bb9743814b6198d684da5c58b76c11e0"
|
||||
"checksum heapsize 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8c80e194758495a9109566134dc06e42ea0423987d6ceca016edaa90381b3549"
|
||||
"checksum httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7a63e511f9edffbab707141fbb8707d1a3098615fb2adbd5769cdfcc9b17d"
|
||||
"checksum hyper 0.10.0-a.0 (git+https://github.com/ethcore/hyper)" = "<none>"
|
||||
|
@ -1237,13 +1250,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1"
|
||||
"checksum jsonrpc-core 4.0.0 (git+https://github.com/ethcore/jsonrpc.git)" = "<none>"
|
||||
"checksum jsonrpc-http-server 6.1.1 (git+https://github.com/ethcore/jsonrpc.git)" = "<none>"
|
||||
"checksum jsonrpc-macros 0.1.0 (git+https://github.com/ethcore/jsonrpc.git)" = "<none>"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
|
||||
"checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b"
|
||||
"checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
|
||||
"checksum libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "044d1360593a78f5c8e5e710beccdc24ab71d1f01bc19a29bcacdba22e8475d8"
|
||||
"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
|
||||
"checksum linked-hash-map 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bda158e0dabeb97ee8a401f4d17e479d6b891a14de0bba79d5cc2d4d325b5e48"
|
||||
"checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd"
|
||||
"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054"
|
||||
"checksum lru-cache 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "656fa4dfcb02bcf1063c592ba3ff6a5303ee1f2afe98c8a889e8b1a77c6dfdb7"
|
||||
"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
|
||||
"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
|
||||
"checksum mime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c93a4bd787ddc6e7833c519b73a50883deb5863d76d9b71eb8216fb7f94e66"
|
||||
|
@ -1260,7 +1276,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "c3df9b730298cea3a1c3faa90b7e2f9df3a9c400d0936d6015e6165734eefcba"
|
||||
"checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c"
|
||||
"checksum owning_ref 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8d91377085359426407a287ab16884a0111ba473aa6844ff01d4ec20ce3d75e7"
|
||||
"checksum parking_lot 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "968f685642555d2f7e202c48b8b11de80569e9bfea817f7f12d7c61aac62d4e6"
|
||||
"checksum parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e1435e7a2a00dfebededd6c6bdbd54008001e94b4a2aadd6aef0dc4c56317621"
|
||||
"checksum parking_lot_core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb1b97670a2ffadce7c397fb80a3d687c4f3060140b885621ef1653d0e5d5068"
|
||||
"checksum quasi 0.20.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94a532453b931a4483a5b2e40f0fe04aee35b6bc2c0eeec876f1bd2358a134d3"
|
||||
|
@ -1275,7 +1290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "<none>"
|
||||
"checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "<none>"
|
||||
"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a"
|
||||
"checksum rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)" = "bff9fc1c79f2dec76b253273d07682e94a978bd8f132ded071188122b2af9818"
|
||||
"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b"
|
||||
"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
|
||||
"checksum scoped-pool 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "817a3a15e704545ce59ed2b5c60a5d32bda4d7869befb8b36667b658a6c00b43"
|
||||
"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"
|
||||
|
@ -1305,7 +1320,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
"checksum unicase 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a5906ca2b98c799f4b1ab4557b76367ebd6ae5ef14930ec841c74aed5f3764"
|
||||
"checksum unicode-bidi 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c1f7ceb96afdfeedee42bade65a0d585a6a0106f681b6749c8ff4daa8df30b3f"
|
||||
"checksum unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "26643a2f83bac55f1976fb716c10234485f9202dcd65cfbdf9da49867b271172"
|
||||
"checksum unicode-segmentation 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b905d0fc2a1f0befd86b0e72e31d1787944efef9d38b9358a9e92a69757f7e3b"
|
||||
"checksum unicode-segmentation 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c3bc443ded17b11305ffffe6b37e2076f328a5a8cb6aa877b1b98f77699e98b5"
|
||||
"checksum unicode-width 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d6722facc10989f63ee0e20a83cd4e1714a9ae11529403ac7e0afd069abc39e"
|
||||
"checksum unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36dff09cafb4ec7c8cf0023eb0b686cb6ce65499116a12201c9e11840ca01beb"
|
||||
"checksum url 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "48ccf7bd87a81b769cf84ad556e034541fb90e1cd6d4bc375c822ed9500cd9d7"
|
||||
|
|
|
@ -7,7 +7,7 @@ The Parity Bitcoin client
|
|||
|
||||
![Graph][graph]
|
||||
|
||||
[graph]: https://github.com/ethcore/parity-bitcoin/blob/master/tools/graph.png
|
||||
[graph]: https://github.com/ethcore/parity-bitcoin/blob/master/tools/graph.svg
|
||||
[travis-image]: https://travis-ci.com/ethcore/parity-bitcoin.svg?token=DMFvZu71iaTbUYx9UypX&branch=master
|
||||
[travis-url]: https://travis-ci.com/ethcore/parity-bitcoin
|
||||
[doc-url]: https://ethcore.github.io/parity-bitcoin/pbtc/index.html
|
||||
|
|
|
@ -15,6 +15,7 @@ parking_lot = "0.3"
|
|||
test-data = { path = "../test-data" }
|
||||
bit-vec = "0.4"
|
||||
log = "0.3"
|
||||
lru-cache = "0.1.0"
|
||||
|
||||
[features]
|
||||
dev = []
|
||||
|
|
|
@ -1,158 +1,66 @@
|
|||
use chain;
|
||||
use primitives::hash::H256;
|
||||
use serialization::Serializable;
|
||||
use chain::{Block, OutPoint, TransactionOutput, merkle_root};
|
||||
use serialization::{Serializable, CompactInteger};
|
||||
use indexed_header::IndexedBlockHeader;
|
||||
use indexed_transaction::IndexedTransaction;
|
||||
use PreviousTransactionOutputProvider;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct IndexedBlock {
|
||||
header: chain::BlockHeader,
|
||||
header_hash: H256,
|
||||
transactions: Vec<chain::Transaction>,
|
||||
// guaranteed to be the same length as transactions
|
||||
transaction_hashes: Vec<H256>,
|
||||
pub header: IndexedBlockHeader,
|
||||
pub transactions: Vec<IndexedTransaction>,
|
||||
}
|
||||
|
||||
impl PreviousTransactionOutputProvider for IndexedBlock {
|
||||
fn previous_transaction_output(&self, prevout: &chain::OutPoint) -> Option<chain::TransactionOutput> {
|
||||
self.transaction(&prevout.hash)
|
||||
.and_then(|tx| tx.outputs.get(prevout.index as usize))
|
||||
.cloned()
|
||||
fn previous_transaction_output(&self, prevout: &OutPoint) -> Option<TransactionOutput> {
|
||||
let txs: &[_] = &self.transactions;
|
||||
txs.previous_transaction_output(prevout)
|
||||
}
|
||||
|
||||
fn is_spent(&self, _prevout: &chain::OutPoint) -> bool {
|
||||
// block does not need it to be checked
|
||||
fn is_spent(&self, _prevout: &OutPoint) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
impl From<chain::Block> for IndexedBlock {
|
||||
fn from(block: chain::Block) -> Self {
|
||||
let chain::Block { block_header, transactions } = block;
|
||||
let header_hash = block_header.hash();
|
||||
let hashes = transactions.iter().map(chain::Transaction::hash).collect();
|
||||
impl From<Block> for IndexedBlock {
|
||||
fn from(block: Block) -> Self {
|
||||
let Block { block_header, transactions } = block;
|
||||
|
||||
IndexedBlock {
|
||||
header: block_header,
|
||||
header_hash: header_hash,
|
||||
transactions: transactions,
|
||||
transaction_hashes: hashes,
|
||||
header: block_header.into(),
|
||||
transactions: transactions.into_iter().map(Into::into).collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexedBlock {
|
||||
pub fn new(header: chain::BlockHeader, transaction_index: Vec<(H256, chain::Transaction)>) -> Self {
|
||||
let mut block = IndexedBlock {
|
||||
header_hash: header.hash(),
|
||||
pub fn new(header: IndexedBlockHeader, transactions: Vec<IndexedTransaction>) -> Self {
|
||||
IndexedBlock {
|
||||
header: header,
|
||||
transactions: Vec::with_capacity(transaction_index.len()),
|
||||
transaction_hashes: Vec::with_capacity(transaction_index.len()),
|
||||
};
|
||||
|
||||
for (h256, tx) in transaction_index {
|
||||
block.transactions.push(tx);
|
||||
block.transaction_hashes.push(h256);
|
||||
transactions: transactions,
|
||||
}
|
||||
|
||||
block
|
||||
}
|
||||
|
||||
pub fn transaction(&self, hash: &H256) -> Option<&chain::Transaction> {
|
||||
self.transaction_hashes.iter()
|
||||
.position(|x| x == hash)
|
||||
.map(|position| &self.transactions[position])
|
||||
}
|
||||
|
||||
pub fn transactions(&self) -> IndexedTransactions {
|
||||
IndexedTransactions {
|
||||
position: 0,
|
||||
block: self,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn transaction_hashes(&self) -> &[H256] {
|
||||
&self.transaction_hashes
|
||||
}
|
||||
|
||||
pub fn header(&self) -> &chain::BlockHeader {
|
||||
&self.header
|
||||
}
|
||||
|
||||
pub fn hash(&self) -> &H256 {
|
||||
&self.header_hash
|
||||
&self.header.hash
|
||||
}
|
||||
|
||||
pub fn transaction_count(&self) -> usize {
|
||||
self.transaction_hashes.len()
|
||||
}
|
||||
|
||||
pub fn to_block(&self) -> chain::Block {
|
||||
chain::Block::new(
|
||||
self.header.clone(),
|
||||
self.transactions.clone(),
|
||||
)
|
||||
pub fn to_raw_block(self) -> Block {
|
||||
Block::new(self.header.raw, self.transactions.into_iter().map(|tx| tx.raw).collect())
|
||||
}
|
||||
|
||||
pub fn size(&self) -> usize {
|
||||
// todo: optimize
|
||||
self.to_block().serialized_size()
|
||||
let header_size = self.header.raw.serialized_size();
|
||||
let txs_len_size = CompactInteger::from(self.transactions.len()).serialized_size();
|
||||
let txs_size = self.transactions.iter().map(|tx| tx.raw.serialized_size()).sum::<usize>();
|
||||
header_size + txs_len_size + txs_size
|
||||
}
|
||||
|
||||
pub fn merkle_root(&self) -> H256 {
|
||||
chain::merkle_root(&self.transaction_hashes)
|
||||
merkle_root(&self.transactions.iter().map(|tx| tx.hash.clone()).collect::<Vec<_>>())
|
||||
}
|
||||
|
||||
pub fn is_final(&self, height: u32) -> bool {
|
||||
self.transactions.iter().all(|t| t.is_final(height, self.header.time))
|
||||
}
|
||||
|
||||
pub fn transaction_at(&self, index: usize) -> (&H256, &chain::Transaction) {
|
||||
(&self.transaction_hashes[index], &self.transactions[index])
|
||||
}
|
||||
}
|
||||
|
||||
pub struct IndexedTransactions<'a> {
|
||||
position: usize,
|
||||
block: &'a IndexedBlock,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for IndexedTransactions<'a> {
|
||||
type Item = (&'a H256, &'a chain::Transaction);
|
||||
|
||||
fn next(&mut self) -> Option<(&'a H256, &'a chain::Transaction)> {
|
||||
if self.position >= self.block.transactions.len() {
|
||||
None
|
||||
}
|
||||
else {
|
||||
let result = Some((&self.block.transaction_hashes[self.position], &self.block.transactions[self.position]));
|
||||
self.position += 1;
|
||||
result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use test_data;
|
||||
use super::IndexedBlock;
|
||||
|
||||
#[test]
|
||||
fn index() {
|
||||
let block = test_data::block_h1();
|
||||
let indexed_block: IndexedBlock = block.clone().into();
|
||||
|
||||
assert_eq!(*indexed_block.transactions().nth(0).unwrap().0, block.transactions()[0].hash());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn iter() {
|
||||
let block = test_data::block_builder()
|
||||
.header().build()
|
||||
.transaction().coinbase().output().value(3).build().build()
|
||||
.transaction().coinbase().output().value(5).build().build()
|
||||
.build();
|
||||
let indexed_block: IndexedBlock = block.clone().into();
|
||||
|
||||
assert_eq!(*indexed_block.transactions().nth(1).unwrap().0, block.transactions()[1].hash());
|
||||
self.transactions.iter().all(|tx| tx.raw.is_final(height, self.header.raw.time))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
use primitives::hash::H256;
|
||||
use chain::BlockHeader;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct IndexedBlockHeader {
|
||||
pub hash: H256,
|
||||
pub raw: BlockHeader,
|
||||
}
|
||||
|
||||
impl From<BlockHeader> for IndexedBlockHeader {
|
||||
fn from(header: BlockHeader) -> Self {
|
||||
IndexedBlockHeader {
|
||||
hash: header.hash(),
|
||||
raw: header,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexedBlockHeader {
|
||||
pub fn new(hash: H256, header: BlockHeader) -> Self {
|
||||
IndexedBlockHeader {
|
||||
hash: hash,
|
||||
raw: header,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,18 +3,26 @@ use primitives::hash::H256;
|
|||
use chain::{Transaction, OutPoint, TransactionOutput};
|
||||
use PreviousTransactionOutputProvider;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct IndexedTransaction {
|
||||
pub transaction: Transaction,
|
||||
pub hash: H256,
|
||||
pub raw: Transaction,
|
||||
}
|
||||
|
||||
impl From<Transaction> for IndexedTransaction {
|
||||
fn from(t: Transaction) -> Self {
|
||||
let hash = t.hash();
|
||||
fn from(tx: Transaction) -> Self {
|
||||
IndexedTransaction {
|
||||
hash: tx.hash(),
|
||||
raw: tx,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexedTransaction {
|
||||
pub fn new(hash: H256, transaction: Transaction) -> Self {
|
||||
IndexedTransaction {
|
||||
transaction: t,
|
||||
hash: hash,
|
||||
raw: transaction,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +37,8 @@ impl<'a> PreviousTransactionOutputProvider for &'a [IndexedTransaction] {
|
|||
fn previous_transaction_output(&self, prevout: &OutPoint) -> Option<TransactionOutput> {
|
||||
self.iter()
|
||||
.find(|tx| tx.hash == prevout.hash)
|
||||
.map(|tx| tx.transaction.outputs[prevout.index as usize].clone())
|
||||
.and_then(|tx| tx.raw.outputs.get(prevout.index as usize))
|
||||
.cloned()
|
||||
}
|
||||
|
||||
fn is_spent(&self, _prevout: &OutPoint) -> bool {
|
||||
|
|
|
@ -9,6 +9,7 @@ extern crate chain;
|
|||
extern crate serialization;
|
||||
extern crate bit_vec;
|
||||
#[macro_use] extern crate log;
|
||||
extern crate lru_cache;
|
||||
|
||||
#[cfg(test)]
|
||||
extern crate ethcore_devtools as devtools;
|
||||
|
@ -28,6 +29,7 @@ mod transaction_meta_provider;
|
|||
mod error;
|
||||
mod update_context;
|
||||
mod indexed_block;
|
||||
mod indexed_header;
|
||||
mod indexed_transaction;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
@ -72,8 +74,9 @@ pub use transaction_provider::{TransactionProvider, AsTransactionProvider, Previ
|
|||
pub use transaction_meta_provider::TransactionMetaProvider;
|
||||
pub use block_stapler::{BlockStapler, BlockInsertedChain};
|
||||
pub use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
|
||||
pub use indexed_block::{IndexedBlock, IndexedTransactions};
|
||||
pub use indexed_transaction::{IndexedTransaction};
|
||||
pub use indexed_block::IndexedBlock;
|
||||
pub use indexed_header::IndexedBlockHeader;
|
||||
pub use indexed_transaction::IndexedTransaction;
|
||||
|
||||
#[cfg(feature="dev")]
|
||||
pub use test_storage::TestStorage;
|
||||
|
|
|
@ -6,12 +6,13 @@ use kvdb::{Database, DatabaseConfig};
|
|||
use byteorder::{LittleEndian, ByteOrder};
|
||||
use primitives::hash::H256;
|
||||
use primitives::bytes::Bytes;
|
||||
use super::{BlockRef, BestBlock, BlockLocation, IndexedBlock, IndexedTransactions};
|
||||
use super::{BlockRef, BestBlock, BlockLocation, IndexedBlock};
|
||||
use serialization::{serialize, deserialize};
|
||||
use chain;
|
||||
use parking_lot::RwLock;
|
||||
use transaction_meta::TransactionMeta;
|
||||
use lru_cache::LruCache;
|
||||
|
||||
use transaction_meta::TransactionMeta;
|
||||
use error::{Error, ConsistencyError, MetaError};
|
||||
use update_context::UpdateContext;
|
||||
use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
|
||||
|
@ -19,6 +20,9 @@ use transaction_provider::TransactionProvider;
|
|||
use transaction_meta_provider::TransactionMetaProvider;
|
||||
use block_stapler::{BlockStapler, BlockInsertedChain, Reorganization};
|
||||
|
||||
use indexed_header::IndexedBlockHeader;
|
||||
use indexed_transaction::IndexedTransaction;
|
||||
|
||||
pub const COL_COUNT: u32 = 10;
|
||||
pub const COL_META: u32 = 0;
|
||||
pub const COL_BLOCK_HASHES: u32 = 1;
|
||||
|
@ -36,6 +40,7 @@ const DB_VERSION: u32 = 1;
|
|||
|
||||
// TODO: check how bitcoin core deals with long forks
|
||||
const MAX_FORK_ROUTE_PRESET: usize = 2048;
|
||||
const TRANSACTION_CACHE_SIZE: usize = 524288;
|
||||
|
||||
/// Blockchain storage interface
|
||||
pub trait Store : BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider + AsBlockHeaderProvider {
|
||||
|
@ -50,6 +55,8 @@ pub trait Store : BlockProvider + BlockStapler + TransactionProvider + Transacti
|
|||
pub struct Storage {
|
||||
database: Database,
|
||||
best_block: RwLock<Option<BestBlock>>,
|
||||
transaction_cache: RwLock<LruCache<H256, chain::Transaction>>,
|
||||
meta_cache: RwLock<LruCache<H256, TransactionMeta>>,
|
||||
}
|
||||
|
||||
const KEY_VERSION: &'static[u8] = b"version";
|
||||
|
@ -83,6 +90,8 @@ impl Storage {
|
|||
let storage = Storage {
|
||||
database: db,
|
||||
best_block: RwLock::default(),
|
||||
transaction_cache: RwLock::new(LruCache::new(TRANSACTION_CACHE_SIZE)),
|
||||
meta_cache: RwLock::new(LruCache::new(TRANSACTION_CACHE_SIZE)),
|
||||
};
|
||||
|
||||
match storage.read_meta_u32(KEY_VERSION) {
|
||||
|
@ -166,32 +175,34 @@ impl Storage {
|
|||
fn block_by_hash(&self, h: &H256) -> Option<IndexedBlock> {
|
||||
self.block_header_by_hash(h).map(|header| {
|
||||
let tx_hashes = self.block_transaction_hashes_by_hash(h);
|
||||
let txs = tx_hashes.iter()
|
||||
.map(|tx_hash| self.transaction(tx_hash).expect("Missing transaction, possible db corruption"))
|
||||
let txs = tx_hashes.into_iter()
|
||||
.map(|tx_hash| {
|
||||
let tx = self.transaction(&tx_hash).expect("Missing transaction, possible db corruption");
|
||||
IndexedTransaction::new(tx_hash, tx)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
let tx_index = tx_hashes.into_iter().zip(txs.into_iter()).collect();
|
||||
IndexedBlock::new(header, tx_index)
|
||||
IndexedBlock::new(IndexedBlockHeader::new(h.clone(), header), txs)
|
||||
})
|
||||
}
|
||||
|
||||
/// update transactions metadata in the specified database transaction
|
||||
fn update_transactions_meta(&self, context: &mut UpdateContext, number: u32, accepted_txs: &mut IndexedTransactions)
|
||||
fn update_transactions_meta(&self, context: &mut UpdateContext, number: u32, accepted_txs: &[IndexedTransaction])
|
||||
-> Result<(), Error>
|
||||
{
|
||||
if let Some((accepted_hash, accepted_tx)) = accepted_txs.next() {
|
||||
if let Some(tx) = accepted_txs.first() {
|
||||
context.meta.insert(
|
||||
accepted_hash.clone(),
|
||||
TransactionMeta::new_coinbase(number, accepted_tx.outputs.len())
|
||||
tx.hash.clone(),
|
||||
TransactionMeta::new_coinbase(number, tx.raw.outputs.len())
|
||||
);
|
||||
}
|
||||
|
||||
for (accepted_hash, accepted_tx) in accepted_txs {
|
||||
for tx in accepted_txs.iter().skip(1) {
|
||||
context.meta.insert(
|
||||
accepted_hash.clone(),
|
||||
TransactionMeta::new(number, accepted_tx.outputs.len())
|
||||
tx.hash.clone(),
|
||||
TransactionMeta::new(number, tx.raw.outputs.len())
|
||||
);
|
||||
|
||||
for input in &accepted_tx.inputs {
|
||||
for input in &tx.raw.inputs {
|
||||
use std::collections::hash_map::Entry;
|
||||
|
||||
match context.meta.entry(input.previous_output.hash.clone()) {
|
||||
|
@ -239,8 +250,9 @@ impl Storage {
|
|||
let tx = self.transaction(tx_hash)
|
||||
.expect("Transaction in the saved block should exist as a separate entity indefinitely");
|
||||
|
||||
// remove meta
|
||||
// remove meta & meta cache
|
||||
context.db_transaction.delete(Some(COL_TRANSACTIONS_META), &**tx_hash);
|
||||
self.meta_cache.write().remove(&tx_hash);
|
||||
|
||||
// coinbase transaction does not have inputs
|
||||
if tx_hash_num == 0 {
|
||||
|
@ -295,7 +307,7 @@ impl Storage {
|
|||
self.read_meta_u32(KEY_BEST_BLOCK_NUMBER)
|
||||
}
|
||||
|
||||
fn _best_hash(&self) -> Option<H256> {
|
||||
fn best_hash(&self) -> Option<H256> {
|
||||
self.get(COL_META, KEY_BEST_BLOCK_HASH).map(|val| H256::from(&**val))
|
||||
}
|
||||
|
||||
|
@ -303,7 +315,7 @@ impl Storage {
|
|||
trace!(target: "db", "Canonizing block {}", hash.to_reversed_str());
|
||||
|
||||
let block = try!(self.block_by_hash(hash).ok_or(Error::unknown_hash(hash)));
|
||||
try!(self.update_transactions_meta(context, at_height, &mut block.transactions()));
|
||||
try!(self.update_transactions_meta(context, at_height, &block.transactions));
|
||||
|
||||
// only canonical blocks are allowed to wield a number
|
||||
context.db_transaction.put(Some(COL_BLOCK_HASHES), &u32_key(at_height), &**hash);
|
||||
|
@ -397,6 +409,14 @@ impl Storage {
|
|||
best_number -= 1;
|
||||
result.push(next);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn difficulty(&self) -> f64 {
|
||||
self.best_hash()
|
||||
.and_then(|h| self.block_header_by_hash(&h))
|
||||
.map(|header| header.bits.to_f64())
|
||||
.unwrap_or(1.0f64)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -470,7 +490,7 @@ impl BlockStapler for Storage {
|
|||
let block_hash = block.hash();
|
||||
|
||||
let mut new_best_hash = match best_block.as_ref().map(|bb| &bb.hash) {
|
||||
Some(best_hash) if &block.header().previous_header_hash != best_hash => best_hash.clone(),
|
||||
Some(best_hash) if &block.header.raw.previous_header_hash != best_hash => best_hash.clone(),
|
||||
_ => block_hash.clone(),
|
||||
};
|
||||
|
||||
|
@ -482,14 +502,14 @@ impl BlockStapler for Storage {
|
|||
None => 0,
|
||||
};
|
||||
|
||||
let tx_space = block.transaction_count() * 32;
|
||||
let tx_space = block.transactions.len() * 32;
|
||||
let mut tx_refs = Vec::with_capacity(tx_space);
|
||||
for (tx_hash, tx) in block.transactions() {
|
||||
tx_refs.extend(&**tx_hash);
|
||||
for tx in &block.transactions {
|
||||
tx_refs.extend(&*tx.hash);
|
||||
context.db_transaction.put(
|
||||
Some(COL_TRANSACTIONS),
|
||||
&**tx_hash,
|
||||
&serialize(tx),
|
||||
&*tx.hash,
|
||||
&serialize(&tx.raw),
|
||||
);
|
||||
}
|
||||
context.db_transaction.put(Some(COL_BLOCK_TRANSACTIONS), &**block_hash, &tx_refs);
|
||||
|
@ -497,12 +517,12 @@ impl BlockStapler for Storage {
|
|||
context.db_transaction.put(
|
||||
Some(COL_BLOCK_HEADERS),
|
||||
&**block_hash,
|
||||
&serialize(block.header())
|
||||
&serialize(&block.header.raw)
|
||||
);
|
||||
|
||||
// the block is continuing the main chain
|
||||
let result = if best_block.as_ref().map(|b| b.number) != Some(new_best_number) {
|
||||
try!(self.update_transactions_meta(&mut context, new_best_number, &mut block.transactions()));
|
||||
try!(self.update_transactions_meta(&mut context, new_best_number, &block.transactions));
|
||||
context.db_transaction.write_u32(Some(COL_META), KEY_BEST_BLOCK_NUMBER, new_best_number);
|
||||
|
||||
// updating main chain height reference
|
||||
|
@ -516,14 +536,14 @@ impl BlockStapler for Storage {
|
|||
// but can cause reorganization here
|
||||
// this can canonize the block parent if block parent + this block is longer than the main chain
|
||||
else {
|
||||
match self.maybe_reorganize(&mut context, &block.header().previous_header_hash) {
|
||||
match self.maybe_reorganize(&mut context, &block.header.raw.previous_header_hash) {
|
||||
Ok(Some(mut reorg)) => {
|
||||
// if so, we have new best main chain block
|
||||
new_best_number = reorg.height + 1;
|
||||
new_best_hash = block_hash.clone();
|
||||
|
||||
// and we canonize it also by provisioning transactions
|
||||
try!(self.update_transactions_meta(&mut context, new_best_number, &mut block.transactions()));
|
||||
try!(self.update_transactions_meta(&mut context, new_best_number, &block.transactions));
|
||||
context.db_transaction.write_u32(Some(COL_META), KEY_BEST_BLOCK_NUMBER, new_best_number);
|
||||
context.db_transaction.put(Some(COL_BLOCK_HASHES), &u32_key(new_best_number), &*new_best_hash);
|
||||
context.db_transaction.write_u32(Some(COL_BLOCK_NUMBERS), &*new_best_hash, new_best_number);
|
||||
|
@ -585,7 +605,11 @@ impl BlockStapler for Storage {
|
|||
// we always update best hash even if it is not changed
|
||||
context.db_transaction.put(Some(COL_META), KEY_BEST_BLOCK_HASH, &*new_best_hash);
|
||||
|
||||
// write accumulated transactions meta
|
||||
// write accumulated transactions meta and update cache
|
||||
{
|
||||
let mut cache = self.meta_cache.write();
|
||||
for (hash, meta) in context.meta.iter() { cache.insert(hash.clone(), meta.clone()); }
|
||||
}
|
||||
try!(context.apply(&self.database));
|
||||
|
||||
trace!(target: "db", "Best block now ({}, {})", &new_best_hash.to_reversed_str(), &new_best_number);
|
||||
|
@ -625,18 +649,57 @@ impl TransactionProvider for Storage {
|
|||
}
|
||||
|
||||
fn transaction(&self, hash: &H256) -> Option<chain::Transaction> {
|
||||
self.transaction_bytes(hash).map(|tx_bytes| {
|
||||
deserialize(tx_bytes.as_ref()).expect("Failed to deserialize transaction: db corrupted?")
|
||||
})
|
||||
let mut cache = self.transaction_cache.write();
|
||||
|
||||
let (tx, is_cached) = {
|
||||
let cached_transaction = cache.get_mut(hash);
|
||||
match cached_transaction {
|
||||
None => {
|
||||
(
|
||||
self.transaction_bytes(hash).map(|tx_bytes| {
|
||||
let tx: chain::Transaction = deserialize(tx_bytes.as_ref())
|
||||
.expect("Failed to deserialize transaction: db corrupted?");
|
||||
tx
|
||||
}),
|
||||
false
|
||||
)
|
||||
},
|
||||
Some(tx) => (Some(tx.clone()), true)
|
||||
}
|
||||
};
|
||||
|
||||
match tx {
|
||||
Some(ref tx) => { if !is_cached { cache.insert(hash.clone(), tx.clone()); } }
|
||||
None => {}
|
||||
};
|
||||
|
||||
tx
|
||||
}
|
||||
}
|
||||
|
||||
impl TransactionMetaProvider for Storage {
|
||||
|
||||
fn transaction_meta(&self, hash: &H256) -> Option<TransactionMeta> {
|
||||
self.get(COL_TRANSACTIONS_META, &**hash).map(|val|
|
||||
TransactionMeta::from_bytes(&val).expect("Invalid transaction metadata: db corrupted?")
|
||||
)
|
||||
let mut cache = self.meta_cache.write();
|
||||
|
||||
let (meta, is_cached) = {
|
||||
let cached_meta = cache.get_mut(hash);
|
||||
match cached_meta {
|
||||
None => {
|
||||
(self.get(COL_TRANSACTIONS_META, &**hash).map(|val|
|
||||
TransactionMeta::from_bytes(&val).expect("Invalid transaction metadata: db corrupted?")
|
||||
), false)
|
||||
},
|
||||
Some(meta) => (Some(meta.clone()), true)
|
||||
}
|
||||
};
|
||||
|
||||
match meta {
|
||||
Some(ref meta) => { if !is_cached { cache.insert(hash.clone(), meta.clone()); } }
|
||||
None => {}
|
||||
};
|
||||
|
||||
meta
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -667,6 +730,7 @@ mod tests {
|
|||
use chain::Block;
|
||||
use super::super::{BlockRef, BlockLocation};
|
||||
use test_data;
|
||||
use primitives::Compact;
|
||||
|
||||
#[test]
|
||||
fn open_store() {
|
||||
|
@ -1195,6 +1259,7 @@ mod tests {
|
|||
store.decanonize_block(&mut update_context, &block_hash)
|
||||
.expect("Decanonizing block #1 which was just inserted should not fail");
|
||||
update_context.apply(&store.database).unwrap();
|
||||
store.meta_cache.write().clear();
|
||||
|
||||
let genesis_meta = store.transaction_meta(&genesis_coinbase)
|
||||
.expect("Transaction meta for the genesis coinbase transaction should exist");
|
||||
|
@ -1226,6 +1291,27 @@ mod tests {
|
|||
assert_eq!(inserted_chain, BlockInsertedChain::Main, "h1 should become main chain");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn difficulty() {
|
||||
let path = RandomTempPath::create_dir();
|
||||
let store = Storage::new(path.as_path()).unwrap();
|
||||
|
||||
let genesis = test_data::genesis();
|
||||
store.insert_block(&genesis)
|
||||
.expect("Genesis should be inserted with no issues");
|
||||
|
||||
assert_eq!(1f64, store.difficulty(), "There should be minimum 1 difficulty for just the genesis block");
|
||||
|
||||
let block = test_data::block_builder()
|
||||
.header().parent(genesis.hash()).bits(Compact::new(0x1b0404cb)).build()
|
||||
.transaction().coinbase().build()
|
||||
.build();
|
||||
store.insert_block(&block)
|
||||
.expect("Nest block with just nbits should be inserted with no issues");
|
||||
|
||||
assert_eq!(16307.420938523994f64, store.difficulty(), "There should be minimum updated difficulty for new best block");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chain_for_side() {
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ impl BlockProvider for TestStorage {
|
|||
impl BlockStapler for TestStorage {
|
||||
/// insert pre-processed block in the storage
|
||||
fn insert_indexed_block(&self, block: &IndexedBlock) -> Result<BlockInsertedChain, Error> {
|
||||
self.insert_block(&block.to_block())
|
||||
self.insert_block(&block.clone().to_raw_block())
|
||||
}
|
||||
|
||||
fn insert_block(&self, block: &chain::Block) -> Result<BlockInsertedChain, Error> {
|
||||
|
|
|
@ -183,20 +183,17 @@ impl BlockAssembler {
|
|||
let size_step = block_size.decide(transaction_size);
|
||||
let sigops_step = sigops.decide(sigops_count);
|
||||
|
||||
let transaction = IndexedTransaction {
|
||||
transaction: entry.transaction.clone(),
|
||||
hash: entry.hash.clone(),
|
||||
};
|
||||
|
||||
match size_step.and(sigops_step) {
|
||||
NextStep::Append => {
|
||||
let tx = IndexedTransaction::new(entry.hash.clone(), entry.transaction.clone());
|
||||
// miner_fee is i64, but we can safely cast it to u64
|
||||
// memory pool should restrict miner fee to be positive
|
||||
*coinbase_value += entry.miner_fee as u64;
|
||||
transactions.push(transaction);
|
||||
transactions.push(tx);
|
||||
},
|
||||
NextStep::FinishAndAppend => {
|
||||
transactions.push(transaction);
|
||||
let tx = IndexedTransaction::new(entry.hash.clone(), entry.transaction.clone());
|
||||
transactions.push(tx);
|
||||
break;
|
||||
},
|
||||
NextStep::Ignore => (),
|
||||
|
|
|
@ -76,6 +76,14 @@ impl Compact {
|
|||
assert!(size < 256);
|
||||
Compact(compact | (size << 24) as u32)
|
||||
}
|
||||
|
||||
pub fn to_f64(&self) -> f64 {
|
||||
let max_body = f64::from(0x00ffff).ln();
|
||||
let scaland = f64::from(256).ln();
|
||||
let ln1 = f64::from(self.0 & 0x00ffffff).ln();
|
||||
let s1 = scaland * f64::from(0x1d - ((self.0 & 0xff000000) >> 24));
|
||||
(max_body - ln1 + s1).exp()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -113,6 +121,11 @@ mod tests {
|
|||
let compact = Compact::new(0x05009234);
|
||||
let compact2 = Compact::from_u256(compact.to_u256().unwrap());
|
||||
assert_eq!(compact, compact2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn difficulty() {
|
||||
let nbits = Compact::new(0x1b0404cb);
|
||||
assert_eq!(nbits.to_f64(), 16307.420938523994f64);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,3 +13,4 @@ pub use rustc_serialize::hex;
|
|||
pub use uint::U256;
|
||||
pub use hash::{H160, H256};
|
||||
pub use bytes::Bytes;
|
||||
pub use compact::Compact;
|
||||
|
|
|
@ -14,7 +14,9 @@ rustc-serialize = "0.3"
|
|||
tokio-core = "0.1.1"
|
||||
serde_macros = { version = "0.8.0", optional = true }
|
||||
jsonrpc-core = { git = "https://github.com/ethcore/jsonrpc.git" }
|
||||
jsonrpc-macros = { git = "https://github.com/ethcore/jsonrpc.git" }
|
||||
jsonrpc-http-server = { git = "https://github.com/ethcore/jsonrpc.git" }
|
||||
|
||||
sync = { path = "../sync" }
|
||||
serialization = { path = "../serialization" }
|
||||
chain = { path = "../chain" }
|
||||
|
|
|
@ -6,6 +6,8 @@ extern crate rustc_serialize;
|
|||
extern crate serde;
|
||||
extern crate serde_json;
|
||||
extern crate jsonrpc_core;
|
||||
#[macro_use]
|
||||
extern crate jsonrpc_macros;
|
||||
extern crate jsonrpc_http_server;
|
||||
extern crate tokio_core;
|
||||
extern crate sync;
|
||||
|
|
|
@ -1,294 +0,0 @@
|
|||
// because we reuse the type names as idents in the macros as a dirty hack to
|
||||
// work around `concat_idents!` being unstable.
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
///! Automatically serialize and deserialize parameters around a strongly-typed function.
|
||||
|
||||
use super::errors;
|
||||
|
||||
use jsonrpc_core::{Error, Params, Value, from_params, to_value};
|
||||
use serde::{Serialize, Deserialize};
|
||||
|
||||
/// Auto-generates an RPC trait from trait definition.
|
||||
///
|
||||
/// This just copies out all the methods, docs, and adds another
|
||||
/// function `to_delegate` which will automatically wrap each strongly-typed
|
||||
/// function in a wrapper which handles parameter and output type serialization.
|
||||
///
|
||||
/// RPC functions may come in a couple forms: async and synchronous.
|
||||
/// These are parsed with the custom `#[rpc]` attribute, which must follow
|
||||
/// documentation.
|
||||
///
|
||||
/// ## The #[rpc] attribute
|
||||
///
|
||||
/// Valid forms:
|
||||
/// - `#[rpc(name = "name_here")]` (a synchronous rpc function which should be bound to the given name)
|
||||
/// - `#[rpc(async, name = "name_here")]` (an async rpc function which should be bound to the given name)
|
||||
///
|
||||
/// Synchronous function format:
|
||||
/// `fn foo(&self, Param1, Param2, Param3) -> Out`.
|
||||
///
|
||||
/// Asynchronous RPC functions must come in this form:
|
||||
/// `fn foo(&self, Param1, Param2, Param3, Ready<Out>);
|
||||
///
|
||||
/// Anything else will be rejected by the code generator.
|
||||
macro_rules! build_rpc_trait {
|
||||
// entry-point. todo: make another for traits w/ bounds.
|
||||
(
|
||||
$(#[$t_attr: meta])*
|
||||
pub trait $name: ident {
|
||||
$(
|
||||
$( #[doc=$m_doc:expr] )*
|
||||
#[ rpc( $($t:tt)* ) ]
|
||||
fn $m_name: ident ( $($p: tt)* ) $( -> Result<$out: ty, Error> )* ;
|
||||
)*
|
||||
}
|
||||
) => {
|
||||
$(#[$t_attr])*
|
||||
pub trait $name: Sized + Send + Sync + 'static {
|
||||
$(
|
||||
$(#[doc=$m_doc])*
|
||||
fn $m_name ( $($p)* ) $( -> Result<$out, Error> )* ;
|
||||
)*
|
||||
|
||||
/// Transform this into an `IoDelegate`, automatically wrapping
|
||||
/// the parameters.
|
||||
fn to_delegate(self) -> ::jsonrpc_core::IoDelegate<Self> {
|
||||
let mut del = ::jsonrpc_core::IoDelegate::new(self.into());
|
||||
$(
|
||||
build_rpc_trait!(WRAP del =>
|
||||
( $($t)* )
|
||||
fn $m_name ( $($p)* ) $( -> Result<$out, Error> )*
|
||||
);
|
||||
)*
|
||||
del
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
( WRAP $del: expr =>
|
||||
(name = $name: expr)
|
||||
fn $method: ident (&self $(, $param: ty)*) -> Result<$out: ty, Error>
|
||||
) => {
|
||||
$del.add_method($name, move |base, params| {
|
||||
(Self::$method as fn(&_ $(, $param)*) -> Result<$out, Error>).wrap_rpc(base, params)
|
||||
})
|
||||
};
|
||||
|
||||
( WRAP $del: expr =>
|
||||
(async, name = $name: expr)
|
||||
fn $method: ident (&self, Ready<$out: ty> $(, $param: ty)*)
|
||||
) => {
|
||||
$del.add_async_method($name, move |base, params, ready| {
|
||||
(Self::$method as fn(&_, Ready<$out> $(, $param)*)).wrap_rpc(base, params, ready)
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
/// A wrapper type without an implementation of `Deserialize`
|
||||
/// which allows a special implementation of `Wrap` for functions
|
||||
/// that take a trailing default parameter.
|
||||
pub struct Trailing<T: Default + Deserialize>(pub T);
|
||||
|
||||
/// A wrapper type for `jsonrpc_core`'s weakly-typed `Ready` struct.
|
||||
pub struct Ready<T: Serialize> {
|
||||
inner: ::jsonrpc_core::Ready,
|
||||
_marker: ::std::marker::PhantomData<T>,
|
||||
}
|
||||
|
||||
impl<T: Serialize> From<::jsonrpc_core::Ready> for Ready<T> {
|
||||
fn from(ready: ::jsonrpc_core::Ready) -> Self {
|
||||
Ready { inner: ready, _marker: ::std::marker::PhantomData }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Serialize> Ready<T> {
|
||||
/// Respond withthe asynchronous result.
|
||||
pub fn ready(self, result: Result<T, Error>) {
|
||||
self.inner.ready(result.map(to_value))
|
||||
}
|
||||
}
|
||||
|
||||
/// Wrapper trait for synchronous RPC functions.
|
||||
pub trait Wrap<B: Send + Sync + 'static> {
|
||||
fn wrap_rpc(&self, base: &B, params: Params) -> Result<Value, Error>;
|
||||
}
|
||||
|
||||
/// Wrapper trait for asynchronous RPC functions.
|
||||
pub trait WrapAsync<B: Send + Sync + 'static> {
|
||||
fn wrap_rpc(&self, base: &B, params: Params, ready: ::jsonrpc_core::Ready);
|
||||
}
|
||||
|
||||
// special impl for no parameters.
|
||||
impl<B, OUT> Wrap<B> for fn(&B) -> Result<OUT, Error>
|
||||
where B: Send + Sync + 'static, OUT: Serialize
|
||||
{
|
||||
fn wrap_rpc(&self, base: &B, params: Params) -> Result<Value, Error> {
|
||||
::v1::helpers::params::expect_no_params(params)
|
||||
.and_then(|()| (self)(base))
|
||||
.map(to_value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<B, OUT> WrapAsync<B> for fn(&B, Ready<OUT>)
|
||||
where B: Send + Sync + 'static, OUT: Serialize
|
||||
{
|
||||
fn wrap_rpc(&self, base: &B, params: Params, ready: ::jsonrpc_core::Ready) {
|
||||
match ::v1::helpers::params::expect_no_params(params) {
|
||||
Ok(()) => (self)(base, ready.into()),
|
||||
Err(e) => ready.ready(Err(e)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// creates a wrapper implementation which deserializes the parameters,
|
||||
// calls the function with concrete type, and serializes the output.
|
||||
macro_rules! wrap {
|
||||
($($x: ident),+) => {
|
||||
|
||||
// synchronous implementation
|
||||
impl <
|
||||
BASE: Send + Sync + 'static,
|
||||
OUT: Serialize,
|
||||
$($x: Deserialize,)+
|
||||
> Wrap<BASE> for fn(&BASE, $($x,)+) -> Result<OUT, Error> {
|
||||
fn wrap_rpc(&self, base: &BASE, params: Params) -> Result<Value, Error> {
|
||||
from_params::<($($x,)+)>(params).and_then(|($($x,)+)| {
|
||||
(self)(base, $($x,)+)
|
||||
}).map(to_value)
|
||||
}
|
||||
}
|
||||
|
||||
// asynchronous implementation
|
||||
impl <
|
||||
BASE: Send + Sync + 'static,
|
||||
OUT: Serialize,
|
||||
$($x: Deserialize,)+
|
||||
> WrapAsync<BASE> for fn(&BASE, Ready<OUT>, $($x,)+ ) {
|
||||
fn wrap_rpc(&self, base: &BASE, params: Params, ready: ::jsonrpc_core::Ready) {
|
||||
match from_params::<($($x,)+)>(params) {
|
||||
Ok(($($x,)+)) => (self)(base, ready.into(), $($x,)+),
|
||||
Err(e) => ready.ready(Err(e)),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// special impl for no parameters other than block parameter.
|
||||
impl<B, OUT, T> Wrap<B> for fn(&B, Trailing<T>) -> Result<OUT, Error>
|
||||
where B: Send + Sync + 'static, OUT: Serialize, T: Default + Deserialize
|
||||
{
|
||||
fn wrap_rpc(&self, base: &B, params: Params) -> Result<Value, Error> {
|
||||
let len = match params {
|
||||
Params::Array(ref v) => v.len(),
|
||||
Params::None => 0,
|
||||
_ => return Err(errors::invalid_params("not an array", "")),
|
||||
};
|
||||
|
||||
let (id,) = match len {
|
||||
0 => (T::default(),),
|
||||
1 => try!(from_params::<(T,)>(params)),
|
||||
_ => return Err(Error::invalid_params()),
|
||||
};
|
||||
|
||||
(self)(base, Trailing(id)).map(to_value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<B, OUT, T> WrapAsync<B> for fn(&B, Ready<OUT>, Trailing<T>)
|
||||
where B: Send + Sync + 'static, OUT: Serialize, T: Default + Deserialize
|
||||
{
|
||||
fn wrap_rpc(&self, base: &B, params: Params, ready: ::jsonrpc_core::Ready) {
|
||||
let len = match params {
|
||||
Params::Array(ref v) => v.len(),
|
||||
Params::None => 0,
|
||||
_ => return ready.ready(Err(errors::invalid_params("not an array", ""))),
|
||||
};
|
||||
|
||||
let id = match len {
|
||||
0 => Ok((T::default(),)),
|
||||
1 => from_params::<(T,)>(params),
|
||||
_ => Err(Error::invalid_params()),
|
||||
};
|
||||
|
||||
match id {
|
||||
Ok((id,)) => (self)(base, ready.into(), Trailing(id)),
|
||||
Err(e) => ready.ready(Err(e)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// similar to `wrap!`, but handles a single default trailing parameter
|
||||
// accepts an additional argument indicating the number of non-trailing parameters.
|
||||
macro_rules! wrap_with_trailing {
|
||||
($num: expr, $($x: ident),+) => {
|
||||
// synchronous implementation
|
||||
impl <
|
||||
BASE: Send + Sync + 'static,
|
||||
OUT: Serialize,
|
||||
$($x: Deserialize,)+
|
||||
TRAILING: Default + Deserialize,
|
||||
> Wrap<BASE> for fn(&BASE, $($x,)+ Trailing<TRAILING>) -> Result<OUT, Error> {
|
||||
fn wrap_rpc(&self, base: &BASE, params: Params) -> Result<Value, Error> {
|
||||
let len = match params {
|
||||
Params::Array(ref v) => v.len(),
|
||||
Params::None => 0,
|
||||
_ => return Err(errors::invalid_params("not an array", "")),
|
||||
};
|
||||
|
||||
let params = match len - $num {
|
||||
0 => from_params::<($($x,)+)>(params)
|
||||
.map(|($($x,)+)| ($($x,)+ TRAILING::default())),
|
||||
1 => from_params::<($($x,)+ TRAILING)>(params)
|
||||
.map(|($($x,)+ id)| ($($x,)+ id)),
|
||||
_ => Err(Error::invalid_params()),
|
||||
};
|
||||
|
||||
let ($($x,)+ id) = try!(params);
|
||||
(self)(base, $($x,)+ Trailing(id)).map(to_value)
|
||||
}
|
||||
}
|
||||
|
||||
// asynchronous implementation
|
||||
impl <
|
||||
BASE: Send + Sync + 'static,
|
||||
OUT: Serialize,
|
||||
$($x: Deserialize,)+
|
||||
TRAILING: Default + Deserialize,
|
||||
> WrapAsync<BASE> for fn(&BASE, Ready<OUT>, $($x,)+ Trailing<TRAILING>) {
|
||||
fn wrap_rpc(&self, base: &BASE, params: Params, ready: ::jsonrpc_core::Ready) {
|
||||
let len = match params {
|
||||
Params::Array(ref v) => v.len(),
|
||||
Params::None => 0,
|
||||
_ => return ready.ready(Err(errors::invalid_params("not an array", ""))),
|
||||
};
|
||||
|
||||
let params = match len - $num {
|
||||
0 => from_params::<($($x,)+)>(params)
|
||||
.map(|($($x,)+)| ($($x,)+ TRAILING::default())),
|
||||
1 => from_params::<($($x,)+ TRAILING)>(params)
|
||||
.map(|($($x,)+ id)| ($($x,)+ id)),
|
||||
_ => Err(Error::invalid_params()),
|
||||
};
|
||||
|
||||
match params {
|
||||
Ok(($($x,)+ id)) => (self)(base, ready.into(), $($x,)+ Trailing(id)),
|
||||
Err(e) => ready.ready(Err(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wrap!(A, B, C, D, E);
|
||||
wrap!(A, B, C, D);
|
||||
wrap!(A, B, C);
|
||||
wrap!(A, B);
|
||||
wrap!(A);
|
||||
|
||||
wrap_with_trailing!(5, A, B, C, D, E);
|
||||
wrap_with_trailing!(4, A, B, C, D);
|
||||
wrap_with_trailing!(3, A, B, C);
|
||||
wrap_with_trailing!(2, A, B);
|
||||
wrap_with_trailing!(1, A);
|
|
@ -6,22 +6,9 @@ mod codes {
|
|||
pub const BLOCK_NOT_FOUND: i64 = -32099;
|
||||
}
|
||||
|
||||
|
||||
macro_rules! rpc_unimplemented {
|
||||
() => (Err(::v1::helpers::errors::unimplemented(None)))
|
||||
}
|
||||
|
||||
use std::fmt;
|
||||
use jsonrpc_core::{Error, ErrorCode, Value};
|
||||
|
||||
pub fn unimplemented(details: Option<String>) -> Error {
|
||||
Error {
|
||||
code: ErrorCode::InternalError,
|
||||
message: "This request is not implemented yet. Please create an issue on Github repo.".into(),
|
||||
data: details.map(Value::String),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn invalid_params<T: fmt::Debug>(param: &str, details: T) -> Error {
|
||||
Error {
|
||||
code: ErrorCode::InvalidParams,
|
||||
|
|
|
@ -1,5 +1 @@
|
|||
#[macro_use]
|
||||
pub mod auto_args;
|
||||
#[macro_use]
|
||||
pub mod errors;
|
||||
mod params;
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
///! Parameters parsing helpers
|
||||
|
||||
use jsonrpc_core::{Error, Params};
|
||||
use v1::helpers::errors;
|
||||
|
||||
pub fn expect_no_params(params: Params) -> Result<(), Error> {
|
||||
match params {
|
||||
Params::None => Ok(()),
|
||||
p => Err(errors::invalid_params("No parameters were expected", p)),
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
use jsonrpc_core::Error;
|
||||
|
||||
use v1::helpers::auto_args::Wrap;
|
||||
use v1::types::{BlockTemplate, BlockTemplateRequest};
|
||||
|
||||
build_rpc_trait! {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
use jsonrpc_core::Error;
|
||||
|
||||
use v1::helpers::auto_args::Wrap;
|
||||
use v1::types::RawTransaction;
|
||||
use v1::types::H256;
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ impl From<miner::BlockTemplate> for BlockTemplate {
|
|||
impl From<db::IndexedTransaction> for BlockTemplateTransaction {
|
||||
fn from(transaction: db::IndexedTransaction) -> Self {
|
||||
use ser::serialize;
|
||||
let serialize = serialize(&transaction.transaction);
|
||||
let serialize = serialize(&transaction.raw);
|
||||
BlockTemplateTransaction {
|
||||
data: RawTransaction::new(Vec::from((*serialize).clone())),
|
||||
..Default::default()
|
||||
|
|
|
@ -48,7 +48,7 @@ impl BlocksWriter {
|
|||
return Ok(());
|
||||
}
|
||||
// verify && insert only if parent block is already in the storage
|
||||
if !self.storage.contains_block(db::BlockRef::Hash(indexed_block.header().previous_header_hash.clone())) {
|
||||
if !self.storage.contains_block(db::BlockRef::Hash(indexed_block.header.raw.previous_header_hash.clone())) {
|
||||
self.orphaned_blocks_pool.insert_orphaned_block(indexed_block.hash().clone(), indexed_block);
|
||||
// we can't hold many orphaned blocks in memory during import
|
||||
if self.orphaned_blocks_pool.len() > MAX_ORPHANED_BLOCKS {
|
||||
|
|
|
@ -15,27 +15,27 @@ pub fn build_compact_block(block: IndexedBlock, prefilled_transactions_indexes:
|
|||
let nonce: u64 = thread_rng().gen();
|
||||
|
||||
let prefilled_transactions_len = prefilled_transactions_indexes.len();
|
||||
let mut short_ids: Vec<ShortTransactionID> = Vec::with_capacity(block.transaction_count() - prefilled_transactions_len);
|
||||
let mut short_ids: Vec<ShortTransactionID> = Vec::with_capacity(block.transactions.len() - prefilled_transactions_len);
|
||||
let mut prefilled_transactions: Vec<PrefilledTransaction> = Vec::with_capacity(prefilled_transactions_len);
|
||||
let mut prefilled_transactions_size: usize = 0;
|
||||
|
||||
let (key0, key1) = short_transaction_id_keys(nonce, block.header());
|
||||
for (transaction_index, (transaction_hash, transaction)) in block.transactions().enumerate() {
|
||||
let transaction_size = transaction.serialized_size();
|
||||
let (key0, key1) = short_transaction_id_keys(nonce, &block.header.raw);
|
||||
for (transaction_index, transaction) in block.transactions.into_iter().enumerate() {
|
||||
let transaction_size = transaction.raw.serialized_size();
|
||||
if prefilled_transactions_size + transaction_size < MAX_COMPACT_BLOCK_PREFILLED_SIZE
|
||||
&& prefilled_transactions_indexes.contains(&transaction_index) {
|
||||
prefilled_transactions_size += transaction_size;
|
||||
prefilled_transactions.push(PrefilledTransaction {
|
||||
index: transaction_index,
|
||||
transaction: transaction.clone(),
|
||||
transaction: transaction.raw,
|
||||
})
|
||||
} else {
|
||||
short_ids.push(short_transaction_id(key0, key1, transaction_hash));
|
||||
short_ids.push(short_transaction_id(key0, key1, &transaction.hash));
|
||||
}
|
||||
}
|
||||
|
||||
BlockHeaderAndIDs {
|
||||
header: block.header().clone(),
|
||||
header: block.header.raw,
|
||||
nonce: nonce,
|
||||
short_ids: short_ids,
|
||||
prefilled_transactions: prefilled_transactions,
|
||||
|
|
|
@ -42,7 +42,7 @@ impl OrphanBlocksPool {
|
|||
/// Insert orphaned block, for which we have already requested its parent block
|
||||
pub fn insert_orphaned_block(&mut self, hash: H256, block: IndexedBlock) {
|
||||
self.orphaned_blocks
|
||||
.entry(block.header().previous_header_hash.clone())
|
||||
.entry(block.header.raw.previous_header_hash.clone())
|
||||
.or_insert_with(HashMap::new)
|
||||
.insert(hash, block);
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ impl OrphanTransactionsPool {
|
|||
let child_entry = self.by_hash.get_mut(child).expect("every entry in by_parent.values() has corresponding entry in by_hash.keys()");
|
||||
child_entry.remove_known_parent(&hash)
|
||||
};
|
||||
|
||||
|
||||
if all_parents_are_known {
|
||||
removed_orphans_hashes.push(child.clone());
|
||||
removed_orphans.push((child.clone(), self.by_hash.remove(child).expect("checked couple of lines above").transaction));
|
||||
|
|
|
@ -352,7 +352,7 @@ impl Chain {
|
|||
|
||||
/// Insert new best block to storage
|
||||
pub fn insert_best_block(&mut self, hash: H256, block: &IndexedBlock) -> Result<BlockInsertionResult, db::Error> {
|
||||
let is_appending_to_main_branch = self.best_storage_block.hash == block.header().previous_header_hash;
|
||||
let is_appending_to_main_branch = self.best_storage_block.hash == block.header.raw.previous_header_hash;
|
||||
|
||||
// insert to storage
|
||||
let storage_insertion = try!(self.storage.insert_indexed_block(&block));
|
||||
|
@ -371,10 +371,10 @@ impl Chain {
|
|||
// all transactions from this block were accepted
|
||||
// => delete accepted transactions from verification queue and from the memory pool
|
||||
// + also remove transactions which spent outputs which have been spent by transactions from the block
|
||||
for (tx_hash, tx) in block.transactions() {
|
||||
self.memory_pool.remove_by_hash(tx_hash);
|
||||
self.verifying_transactions.remove(tx_hash);
|
||||
for tx_input in &tx.inputs {
|
||||
for tx in &block.transactions {
|
||||
self.memory_pool.remove_by_hash(&tx.hash);
|
||||
self.verifying_transactions.remove(&tx.hash);
|
||||
for tx_input in &tx.raw.inputs {
|
||||
self.memory_pool.remove_by_prevout(&tx_input.previous_output);
|
||||
}
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ impl Chain {
|
|||
// all transactions from this block were accepted
|
||||
// + all transactions from previous blocks of this fork were accepted
|
||||
// => delete accepted transactions from verification queue and from the memory pool
|
||||
let this_block_transactions_hashes: Vec<H256> = block.transaction_hashes().iter().cloned().collect();
|
||||
let this_block_transactions_hashes = block.transactions.iter().map(|tx| tx.hash.clone()).collect::<Vec<_>>();
|
||||
let mut canonized_blocks_hashes: Vec<H256> = Vec::new();
|
||||
let mut new_main_blocks_transactions_hashes: Vec<H256> = Vec::new();
|
||||
while let Some(canonized_block_hash) = reorganization.pop_canonized() {
|
||||
|
|
|
@ -593,9 +593,9 @@ impl<T> ClientCore for SynchronizationClientCore<T> where T: TaskExecutor {
|
|||
None => notfound.push(item),
|
||||
Some(block) => {
|
||||
let indexed_block: IndexedBlock = block.into();
|
||||
let prefilled_transactions_indexes = indexed_block.transactions().enumerate()
|
||||
let prefilled_transactions_indexes = indexed_block.transactions.iter().enumerate()
|
||||
// we do not filter by fee rate here, because it only reasonable for non-mined transactions
|
||||
.filter(|&(_, (h, t))| filter.filter_transaction(h, t, None))
|
||||
.filter(|&(_, tx)| filter.filter_transaction(&tx.hash, &tx.raw, None))
|
||||
.map(|(idx, _)| idx)
|
||||
.collect();
|
||||
let compact_block = types::CompactBlock {
|
||||
|
@ -1314,9 +1314,9 @@ impl<T> SynchronizationClientCore<T> where T: TaskExecutor {
|
|||
|
||||
let block_header_and_ids: Vec<_> = indexed_blocks.into_iter()
|
||||
.filter_map(|b| if self.peers.filter(peer_index).filter_block(&b.hash()) {
|
||||
let prefilled_transactions_indexes = b.transactions().enumerate()
|
||||
let prefilled_transactions_indexes = b.transactions.iter().enumerate()
|
||||
// we do not filter by fee rate here, because it only reasonable for non-mined transactions
|
||||
.filter(|&(_, (h, t))| self.peers.filter_mut(peer_index).filter_transaction(h, t, None))
|
||||
.filter(|&(_, tx)| self.peers.filter_mut(peer_index).filter_transaction(&tx.hash, &tx.raw, None))
|
||||
.map(|(idx, _)| idx)
|
||||
.collect();
|
||||
Some(build_compact_block(b, prefilled_transactions_indexes))
|
||||
|
@ -1484,7 +1484,7 @@ impl<T> SynchronizationClientCore<T> where T: TaskExecutor {
|
|||
}
|
||||
|
||||
// check parent block state
|
||||
let parent_block_state = chain.block_state(&block.header().previous_header_hash);
|
||||
let parent_block_state = chain.block_state(&block.header.raw.previous_header_hash);
|
||||
match parent_block_state {
|
||||
BlockState::Unknown | BlockState::DeadEnd => {
|
||||
if parent_block_state == BlockState::DeadEnd {
|
||||
|
@ -1528,7 +1528,7 @@ impl<T> SynchronizationClientCore<T> where T: TaskExecutor {
|
|||
let blocks_hashes_to_forget: Vec<_> = blocks_to_verify.iter().map(|t| t.0.clone()).collect();
|
||||
chain.forget_blocks_leave_header(&blocks_hashes_to_forget);
|
||||
// remember that we are verifying these blocks
|
||||
let blocks_headers_to_verify: Vec<_> = blocks_to_verify.iter().map(|&(ref h, ref b)| (h.clone(), b.header().clone())).collect();
|
||||
let blocks_headers_to_verify: Vec<_> = blocks_to_verify.iter().map(|&(ref h, ref b)| (h.clone(), b.header.raw.clone())).collect();
|
||||
chain.verify_blocks(blocks_headers_to_verify);
|
||||
// remember that we are verifying block from this peer
|
||||
for verifying_block_hash in blocks_to_verify.iter().map(|&(ref h, _)| h.clone()) {
|
||||
|
|
|
@ -10,7 +10,11 @@ cargo update -p pbtc
|
|||
|
||||
# And draw dependencies graph using cargo graph
|
||||
cargo graph --build-shape box --build-line-style dashed > tools/graph.dot
|
||||
dot -Tpng > tools/graph.png tools/graph.dot
|
||||
|
||||
# Let's fix graph ratio
|
||||
patch tools/graph.dot tools/graph_ratio.diff
|
||||
|
||||
dot -Tsvg > tools/graph.svg tools/graph.dot
|
||||
|
||||
# Finally let's bring back old Cargo.toml file
|
||||
patch Cargo.toml tools/workspace.diff
|
||||
|
|
715
tools/graph.dot
715
tools/graph.dot
|
@ -1,4 +1,6 @@
|
|||
digraph dependencies {
|
||||
ratio=1.0;
|
||||
size="5,5";
|
||||
N0[label="pbtc",shape=box];
|
||||
N1[label="app_dirs",shape=box];
|
||||
N2[label="bencher",shape=box];
|
||||
|
@ -14,88 +16,124 @@ digraph dependencies {
|
|||
N12[label="miner",shape=box];
|
||||
N13[label="network",shape=box];
|
||||
N14[label="p2p",shape=box];
|
||||
N15[label="script",shape=box];
|
||||
N16[label="sync",shape=box];
|
||||
N17[label="verification",shape=box];
|
||||
N18[label="abstract-ns",shape=box];
|
||||
N19[label="futures",shape=box];
|
||||
N20[label="quick-error",shape=box];
|
||||
N21[label="rand",shape=box];
|
||||
N22[label="aho-corasick",shape=box];
|
||||
N23[label="memchr",shape=box];
|
||||
N24[label="ansi_term",shape=box];
|
||||
N25[label="ole32-sys",shape=box];
|
||||
N26[label="shell32-sys",shape=box];
|
||||
N27[label="winapi",shape=box];
|
||||
N28[label="xdg",shape=box];
|
||||
N29[label="arrayvec",shape=box];
|
||||
N30[label="nodrop",shape=box];
|
||||
N31[label="odds",shape=box];
|
||||
N32[label="base58",shape=box];
|
||||
N33[label="ethcore-devtools",shape=box];
|
||||
N34[label="primitives",shape=box];
|
||||
N35[label="test-data",shape=box];
|
||||
N36[label="time",shape=box];
|
||||
N37[label="bit-vec",shape=box];
|
||||
N38[label="bitcrypto",shape=box];
|
||||
N39[label="rust-crypto",shape=box];
|
||||
N40[label="siphasher",shape=box];
|
||||
N41[label="bitflags v0.4.0",shape=box];
|
||||
N42[label="bitflags v0.7.0",shape=box];
|
||||
N43[label="byteorder",shape=box];
|
||||
N44[label="cfg-if",shape=box];
|
||||
N45[label="heapsize",shape=box];
|
||||
N46[label="rustc-serialize",shape=box];
|
||||
N47[label="serialization",shape=box];
|
||||
N48[label="libc",shape=box];
|
||||
N49[label="strsim",shape=box];
|
||||
N50[label="term_size",shape=box];
|
||||
N51[label="unicode-segmentation",shape=box];
|
||||
N52[label="unicode-width",shape=box];
|
||||
N53[label="vec_map",shape=box];
|
||||
N54[label="yaml-rust",shape=box];
|
||||
N55[label="crossbeam",shape=box];
|
||||
N56[label="csv",shape=box];
|
||||
N57[label="elastic-array",shape=box];
|
||||
N58[label="parking_lot",shape=box];
|
||||
N59[label="rocksdb",shape=box];
|
||||
N60[label="deque",shape=box];
|
||||
N61[label="domain",shape=box];
|
||||
N62[label="tokio-core",shape=box];
|
||||
N63[label="regex",shape=box];
|
||||
N64[label="eth-secp256k1",shape=box];
|
||||
N65[label="gcc",shape=box];
|
||||
N66[label="futures-cpupool",shape=box];
|
||||
N67[label="num_cpus",shape=box];
|
||||
N68[label="rayon",shape=box];
|
||||
N69[label="kernel32-sys",shape=box];
|
||||
N70[label="winapi-build",shape=box];
|
||||
N71[label="lazy_static",shape=box];
|
||||
N72[label="lazycell",shape=box];
|
||||
N73[label="linked-hash-map",shape=box];
|
||||
N74[label="mio",shape=box];
|
||||
N75[label="miow",shape=box];
|
||||
N76[label="net2",shape=box];
|
||||
N77[label="nix",shape=box];
|
||||
N78[label="slab",shape=box];
|
||||
N79[label="ws2_32-sys",shape=box];
|
||||
N80[label="murmur3",shape=box];
|
||||
N81[label="rustc_version",shape=box];
|
||||
N82[label="semver",shape=box];
|
||||
N83[label="void",shape=box];
|
||||
N84[label="ns-dns-tokio",shape=box];
|
||||
N85[label="owning_ref",shape=box];
|
||||
N86[label="parking_lot_core",shape=box];
|
||||
N87[label="smallvec",shape=box];
|
||||
N88[label="regex-syntax",shape=box];
|
||||
N89[label="thread_local",shape=box];
|
||||
N90[label="utf8-ranges",shape=box];
|
||||
N91[label="rocksdb-sys",shape=box];
|
||||
N92[label="scoped-pool",shape=box];
|
||||
N93[label="scopeguard",shape=box];
|
||||
N94[label="variance",shape=box];
|
||||
N95[label="scoped-tls",shape=box];
|
||||
N96[label="thread-id",shape=box];
|
||||
N15[label="rpc",shape=box];
|
||||
N16[label="script",shape=box];
|
||||
N17[label="sync",shape=box];
|
||||
N18[label="verification",shape=box];
|
||||
N19[label="abstract-ns",shape=box];
|
||||
N20[label="futures",shape=box];
|
||||
N21[label="quick-error",shape=box];
|
||||
N22[label="rand",shape=box];
|
||||
N23[label="aho-corasick",shape=box];
|
||||
N24[label="memchr",shape=box];
|
||||
N25[label="ansi_term",shape=box];
|
||||
N26[label="ole32-sys",shape=box];
|
||||
N27[label="shell32-sys",shape=box];
|
||||
N28[label="winapi",shape=box];
|
||||
N29[label="xdg",shape=box];
|
||||
N30[label="arrayvec",shape=box];
|
||||
N31[label="nodrop",shape=box];
|
||||
N32[label="odds",shape=box];
|
||||
N33[label="aster",shape=box];
|
||||
N34[label="syntex_syntax",shape=box];
|
||||
N35[label="base58",shape=box];
|
||||
N36[label="ethcore-devtools",shape=box];
|
||||
N37[label="primitives",shape=box];
|
||||
N38[label="test-data",shape=box];
|
||||
N39[label="time",shape=box];
|
||||
N40[label="bit-vec",shape=box];
|
||||
N41[label="bitcrypto",shape=box];
|
||||
N42[label="rust-crypto",shape=box];
|
||||
N43[label="siphasher",shape=box];
|
||||
N44[label="bitflags v0.4.0",shape=box];
|
||||
N45[label="bitflags v0.7.0",shape=box];
|
||||
N46[label="byteorder",shape=box];
|
||||
N47[label="cfg-if",shape=box];
|
||||
N48[label="heapsize",shape=box];
|
||||
N49[label="rustc-serialize",shape=box];
|
||||
N50[label="serialization",shape=box];
|
||||
N51[label="libc",shape=box];
|
||||
N52[label="strsim",shape=box];
|
||||
N53[label="term_size",shape=box];
|
||||
N54[label="unicode-segmentation",shape=box];
|
||||
N55[label="unicode-width",shape=box];
|
||||
N56[label="vec_map",shape=box];
|
||||
N57[label="yaml-rust",shape=box];
|
||||
N58[label="cookie",shape=box];
|
||||
N59[label="url",shape=box];
|
||||
N60[label="crossbeam",shape=box];
|
||||
N61[label="csv",shape=box];
|
||||
N62[label="elastic-array",shape=box];
|
||||
N63[label="lru-cache",shape=box];
|
||||
N64[label="parking_lot v0.3.6",shape=box];
|
||||
N65[label="rocksdb",shape=box];
|
||||
N66[label="deque",shape=box];
|
||||
N67[label="domain",shape=box];
|
||||
N68[label="tokio-core",shape=box];
|
||||
N69[label="dtoa",shape=box];
|
||||
N70[label="regex",shape=box];
|
||||
N71[label="eth-secp256k1",shape=box];
|
||||
N72[label="gcc",shape=box];
|
||||
N73[label="futures-cpupool",shape=box];
|
||||
N74[label="num_cpus",shape=box];
|
||||
N75[label="rayon",shape=box];
|
||||
N76[label="kernel32-sys",shape=box];
|
||||
N77[label="httparse",shape=box];
|
||||
N78[label="hyper",shape=box];
|
||||
N79[label="language-tags",shape=box];
|
||||
N80[label="mime",shape=box];
|
||||
N81[label="rotor",shape=box];
|
||||
N82[label="spmc",shape=box];
|
||||
N83[label="unicase",shape=box];
|
||||
N84[label="vecio",shape=box];
|
||||
N85[label="idna",shape=box];
|
||||
N86[label="matches",shape=box];
|
||||
N87[label="unicode-bidi",shape=box];
|
||||
N88[label="unicode-normalization",shape=box];
|
||||
N89[label="itoa",shape=box];
|
||||
N90[label="jsonrpc-core",shape=box];
|
||||
N91[label="parking_lot v0.2.8",shape=box];
|
||||
N92[label="serde",shape=box];
|
||||
N93[label="serde_codegen",shape=box];
|
||||
N94[label="serde_json",shape=box];
|
||||
N95[label="jsonrpc-http-server",shape=box];
|
||||
N96[label="winapi-build",shape=box];
|
||||
N97[label="lazy_static",shape=box];
|
||||
N98[label="lazycell",shape=box];
|
||||
N99[label="linked-hash-map v0.2.1",shape=box];
|
||||
N100[label="linked-hash-map v0.3.0",shape=box];
|
||||
N101[label="mio",shape=box];
|
||||
N102[label="miow",shape=box];
|
||||
N103[label="net2",shape=box];
|
||||
N104[label="nix",shape=box];
|
||||
N105[label="slab",shape=box];
|
||||
N106[label="ws2_32-sys",shape=box];
|
||||
N107[label="murmur3",shape=box];
|
||||
N108[label="rustc_version",shape=box];
|
||||
N109[label="semver",shape=box];
|
||||
N110[label="void",shape=box];
|
||||
N111[label="ns-dns-tokio",shape=box];
|
||||
N112[label="num-traits",shape=box];
|
||||
N113[label="owning_ref",shape=box];
|
||||
N114[label="smallvec",shape=box];
|
||||
N115[label="parking_lot_core",shape=box];
|
||||
N116[label="quasi",shape=box];
|
||||
N117[label="syntex_errors",shape=box];
|
||||
N118[label="quasi_codegen",shape=box];
|
||||
N119[label="syntex",shape=box];
|
||||
N120[label="regex-syntax",shape=box];
|
||||
N121[label="thread_local",shape=box];
|
||||
N122[label="utf8-ranges",shape=box];
|
||||
N123[label="rocksdb-sys",shape=box];
|
||||
N124[label="scoped-pool",shape=box];
|
||||
N125[label="scopeguard",shape=box];
|
||||
N126[label="variance",shape=box];
|
||||
N127[label="scoped-tls",shape=box];
|
||||
N128[label="serde_codegen_internals",shape=box];
|
||||
N129[label="syntex_pos",shape=box];
|
||||
N130[label="term",shape=box];
|
||||
N131[label="unicode-xid",shape=box];
|
||||
N132[label="thread-id",shape=box];
|
||||
N0 -> N1[label="",style=dashed];
|
||||
N0 -> N2[label="",style=dashed];
|
||||
N0 -> N3[label="",style=dashed];
|
||||
|
@ -113,252 +151,355 @@ digraph dependencies {
|
|||
N0 -> N15[label="",style=dashed];
|
||||
N0 -> N16[label="",style=dashed];
|
||||
N0 -> N17[label="",style=dashed];
|
||||
N1 -> N25[label="",style=dashed];
|
||||
N0 -> N18[label="",style=dashed];
|
||||
N1 -> N26[label="",style=dashed];
|
||||
N1 -> N27[label="",style=dashed];
|
||||
N1 -> N28[label="",style=dashed];
|
||||
N1 -> N29[label="",style=dashed];
|
||||
N2 -> N3[label="",style=dashed];
|
||||
N2 -> N5[label="",style=dashed];
|
||||
N2 -> N17[label="",style=dashed];
|
||||
N2 -> N33[label="",style=dashed];
|
||||
N2 -> N34[label="",style=dashed];
|
||||
N2 -> N35[label="",style=dashed];
|
||||
N2 -> N18[label="",style=dashed];
|
||||
N2 -> N36[label="",style=dashed];
|
||||
N3 -> N34[label="",style=dashed];
|
||||
N3 -> N38[label="",style=dashed];
|
||||
N3 -> N45[label="",style=dashed];
|
||||
N3 -> N46[label="",style=dashed];
|
||||
N3 -> N47[label="",style=dashed];
|
||||
N4 -> N24[label="",style=dashed];
|
||||
N4 -> N42[label="",style=dashed];
|
||||
N4 -> N48[label="",style=dashed];
|
||||
N4 -> N49[label="",style=dashed];
|
||||
N4 -> N50[label="",style=dashed];
|
||||
N2 -> N37[label="",style=dashed];
|
||||
N2 -> N38[label="",style=dashed];
|
||||
N2 -> N39[label="",style=dashed];
|
||||
N3 -> N37[label="",style=dashed];
|
||||
N3 -> N41[label="",style=dashed];
|
||||
N3 -> N48[label="",style=dashed];
|
||||
N3 -> N49[label="",style=dashed];
|
||||
N3 -> N50[label="",style=dashed];
|
||||
N4 -> N25[label="",style=dashed];
|
||||
N4 -> N45[label="",style=dashed];
|
||||
N4 -> N51[label="",style=dashed];
|
||||
N4 -> N52[label="",style=dashed];
|
||||
N4 -> N53[label="",style=dashed];
|
||||
N4 -> N54[label="",style=dashed];
|
||||
N4 -> N55[label="",style=dashed];
|
||||
N4 -> N56[label="",style=dashed];
|
||||
N4 -> N57[label="",style=dashed];
|
||||
N5 -> N3[label="",style=dashed];
|
||||
N5 -> N9[label="",style=dashed];
|
||||
N5 -> N33[label="",style=dashed];
|
||||
N5 -> N34[label="",style=dashed];
|
||||
N5 -> N35[label="",style=dashed];
|
||||
N5 -> N36[label="",style=dashed];
|
||||
N5 -> N37[label="",style=dashed];
|
||||
N5 -> N43[label="",style=dashed];
|
||||
N5 -> N47[label="",style=dashed];
|
||||
N5 -> N57[label="",style=dashed];
|
||||
N5 -> N58[label="",style=dashed];
|
||||
N5 -> N59[label="",style=dashed];
|
||||
N5 -> N38[label="",style=dashed];
|
||||
N5 -> N40[label="",style=dashed];
|
||||
N5 -> N46[label="",style=dashed];
|
||||
N5 -> N50[label="",style=dashed];
|
||||
N5 -> N62[label="",style=dashed];
|
||||
N5 -> N63[label="",style=dashed];
|
||||
N5 -> N64[label="",style=dashed];
|
||||
N5 -> N65[label="",style=dashed];
|
||||
N6 -> N9[label="",style=dashed];
|
||||
N6 -> N63[label="",style=dashed];
|
||||
N6 -> N70[label="",style=dashed];
|
||||
N7 -> N3[label="",style=dashed];
|
||||
N7 -> N9[label="",style=dashed];
|
||||
N7 -> N34[label="",style=dashed];
|
||||
N7 -> N47[label="",style=dashed];
|
||||
N8 -> N21[label="",style=dashed];
|
||||
N8 -> N32[label="",style=dashed];
|
||||
N8 -> N34[label="",style=dashed];
|
||||
N8 -> N38[label="",style=dashed];
|
||||
N8 -> N46[label="",style=dashed];
|
||||
N8 -> N64[label="",style=dashed];
|
||||
N7 -> N37[label="",style=dashed];
|
||||
N7 -> N50[label="",style=dashed];
|
||||
N8 -> N22[label="",style=dashed];
|
||||
N8 -> N35[label="",style=dashed];
|
||||
N8 -> N37[label="",style=dashed];
|
||||
N8 -> N41[label="",style=dashed];
|
||||
N8 -> N49[label="",style=dashed];
|
||||
N8 -> N71[label="",style=dashed];
|
||||
N8 -> N97[label="",style=dashed];
|
||||
N10 -> N6[label="",style=dashed];
|
||||
N10 -> N9[label="",style=dashed];
|
||||
N10 -> N24[label="",style=dashed];
|
||||
N10 -> N36[label="",style=dashed];
|
||||
N10 -> N25[label="",style=dashed];
|
||||
N10 -> N39[label="",style=dashed];
|
||||
N11 -> N3[label="",style=dashed];
|
||||
N11 -> N13[label="",style=dashed];
|
||||
N11 -> N34[label="",style=dashed];
|
||||
N11 -> N38[label="",style=dashed];
|
||||
N11 -> N43[label="",style=dashed];
|
||||
N11 -> N47[label="",style=dashed];
|
||||
N11 -> N37[label="",style=dashed];
|
||||
N11 -> N41[label="",style=dashed];
|
||||
N11 -> N46[label="",style=dashed];
|
||||
N11 -> N50[label="",style=dashed];
|
||||
N12 -> N3[label="",style=dashed];
|
||||
N12 -> N5[label="",style=dashed];
|
||||
N12 -> N34[label="",style=dashed];
|
||||
N12 -> N35[label="",style=dashed];
|
||||
N12 -> N45[label="",style=dashed];
|
||||
N12 -> N47[label="",style=dashed];
|
||||
N12 -> N13[label="",style=dashed];
|
||||
N12 -> N18[label="",style=dashed];
|
||||
N12 -> N37[label="",style=dashed];
|
||||
N12 -> N38[label="",style=dashed];
|
||||
N12 -> N41[label="",style=dashed];
|
||||
N12 -> N46[label="",style=dashed];
|
||||
N12 -> N48[label="",style=dashed];
|
||||
N12 -> N50[label="",style=dashed];
|
||||
N13 -> N3[label="",style=dashed];
|
||||
N13 -> N34[label="",style=dashed];
|
||||
N13 -> N47[label="",style=dashed];
|
||||
N13 -> N37[label="",style=dashed];
|
||||
N13 -> N50[label="",style=dashed];
|
||||
N14 -> N9[label="",style=dashed];
|
||||
N14 -> N11[label="",style=dashed];
|
||||
N14 -> N13[label="",style=dashed];
|
||||
N14 -> N18[label="",style=dashed];
|
||||
N14 -> N19[label="",style=dashed];
|
||||
N14 -> N21[label="",style=dashed];
|
||||
N14 -> N34[label="",style=dashed];
|
||||
N14 -> N36[label="",style=dashed];
|
||||
N14 -> N38[label="",style=dashed];
|
||||
N14 -> N47[label="",style=dashed];
|
||||
N14 -> N56[label="",style=dashed];
|
||||
N14 -> N58[label="",style=dashed];
|
||||
N14 -> N62[label="",style=dashed];
|
||||
N14 -> N66[label="",style=dashed];
|
||||
N14 -> N84[label="",style=dashed];
|
||||
N14 -> N20[label="",style=dashed];
|
||||
N14 -> N22[label="",style=dashed];
|
||||
N14 -> N37[label="",style=dashed];
|
||||
N14 -> N39[label="",style=dashed];
|
||||
N14 -> N41[label="",style=dashed];
|
||||
N14 -> N50[label="",style=dashed];
|
||||
N14 -> N61[label="",style=dashed];
|
||||
N14 -> N64[label="",style=dashed];
|
||||
N14 -> N68[label="",style=dashed];
|
||||
N14 -> N73[label="",style=dashed];
|
||||
N14 -> N111[label="",style=dashed];
|
||||
N15 -> N3[label="",style=dashed];
|
||||
N15 -> N8[label="",style=dashed];
|
||||
N15 -> N5[label="",style=dashed];
|
||||
N15 -> N9[label="",style=dashed];
|
||||
N15 -> N34[label="",style=dashed];
|
||||
N15 -> N12[label="",style=dashed];
|
||||
N15 -> N13[label="",style=dashed];
|
||||
N15 -> N14[label="",style=dashed];
|
||||
N15 -> N17[label="",style=dashed];
|
||||
N15 -> N37[label="",style=dashed];
|
||||
N15 -> N38[label="",style=dashed];
|
||||
N15 -> N47[label="",style=dashed];
|
||||
N15 -> N49[label="",style=dashed];
|
||||
N15 -> N50[label="",style=dashed];
|
||||
N15 -> N68[label="",style=dashed];
|
||||
N15 -> N90[label="",style=dashed];
|
||||
N15 -> N92[label="",style=dashed];
|
||||
N15 -> N93[label="",style=dashed];
|
||||
N15 -> N94[label="",style=dashed];
|
||||
N15 -> N95[label="",style=dashed];
|
||||
N16 -> N3[label="",style=dashed];
|
||||
N16 -> N5[label="",style=dashed];
|
||||
N16 -> N8[label="",style=dashed];
|
||||
N16 -> N9[label="",style=dashed];
|
||||
N16 -> N11[label="",style=dashed];
|
||||
N16 -> N12[label="",style=dashed];
|
||||
N16 -> N13[label="",style=dashed];
|
||||
N16 -> N14[label="",style=dashed];
|
||||
N16 -> N15[label="",style=dashed];
|
||||
N16 -> N17[label="",style=dashed];
|
||||
N16 -> N19[label="",style=dashed];
|
||||
N16 -> N21[label="",style=dashed];
|
||||
N16 -> N33[label="",style=dashed];
|
||||
N16 -> N34[label="",style=dashed];
|
||||
N16 -> N35[label="",style=dashed];
|
||||
N16 -> N36[label="",style=dashed];
|
||||
N16 -> N37[label="",style=dashed];
|
||||
N16 -> N38[label="",style=dashed];
|
||||
N16 -> N43[label="",style=dashed];
|
||||
N16 -> N47[label="",style=dashed];
|
||||
N16 -> N58[label="",style=dashed];
|
||||
N16 -> N62[label="",style=dashed];
|
||||
N16 -> N66[label="",style=dashed];
|
||||
N16 -> N73[label="",style=dashed];
|
||||
N16 -> N80[label="",style=dashed];
|
||||
N16 -> N41[label="",style=dashed];
|
||||
N16 -> N50[label="",style=dashed];
|
||||
N17 -> N3[label="",style=dashed];
|
||||
N17 -> N5[label="",style=dashed];
|
||||
N17 -> N9[label="",style=dashed];
|
||||
N17 -> N11[label="",style=dashed];
|
||||
N17 -> N12[label="",style=dashed];
|
||||
N17 -> N13[label="",style=dashed];
|
||||
N17 -> N15[label="",style=dashed];
|
||||
N17 -> N33[label="",style=dashed];
|
||||
N17 -> N34[label="",style=dashed];
|
||||
N17 -> N35[label="",style=dashed];
|
||||
N17 -> N14[label="",style=dashed];
|
||||
N17 -> N16[label="",style=dashed];
|
||||
N17 -> N18[label="",style=dashed];
|
||||
N17 -> N20[label="",style=dashed];
|
||||
N17 -> N22[label="",style=dashed];
|
||||
N17 -> N36[label="",style=dashed];
|
||||
N17 -> N43[label="",style=dashed];
|
||||
N17 -> N47[label="",style=dashed];
|
||||
N17 -> N58[label="",style=dashed];
|
||||
N17 -> N37[label="",style=dashed];
|
||||
N17 -> N38[label="",style=dashed];
|
||||
N17 -> N39[label="",style=dashed];
|
||||
N17 -> N40[label="",style=dashed];
|
||||
N17 -> N41[label="",style=dashed];
|
||||
N17 -> N46[label="",style=dashed];
|
||||
N17 -> N50[label="",style=dashed];
|
||||
N17 -> N64[label="",style=dashed];
|
||||
N17 -> N68[label="",style=dashed];
|
||||
N17 -> N73[label="",style=dashed];
|
||||
N17 -> N92[label="",style=dashed];
|
||||
N18 -> N19[label="",style=dashed];
|
||||
N18 -> N20[label="",style=dashed];
|
||||
N18 -> N21[label="",style=dashed];
|
||||
N19 -> N9[label="",style=dashed];
|
||||
N21 -> N48[label="",style=dashed];
|
||||
N22 -> N23[label="",style=dashed];
|
||||
N23 -> N48[label="",style=dashed];
|
||||
N25 -> N27[label="",style=dashed];
|
||||
N25 -> N70[label="",style=dashed];
|
||||
N26 -> N27[label="",style=dashed];
|
||||
N26 -> N70[label="",style=dashed];
|
||||
N29 -> N30[label=""];
|
||||
N29 -> N31[label=""];
|
||||
N17 -> N100[label="",style=dashed];
|
||||
N17 -> N107[label="",style=dashed];
|
||||
N18 -> N3[label="",style=dashed];
|
||||
N18 -> N5[label="",style=dashed];
|
||||
N18 -> N9[label="",style=dashed];
|
||||
N18 -> N13[label="",style=dashed];
|
||||
N18 -> N16[label="",style=dashed];
|
||||
N18 -> N36[label="",style=dashed];
|
||||
N18 -> N37[label="",style=dashed];
|
||||
N18 -> N38[label="",style=dashed];
|
||||
N18 -> N39[label="",style=dashed];
|
||||
N18 -> N46[label="",style=dashed];
|
||||
N18 -> N50[label="",style=dashed];
|
||||
N18 -> N64[label="",style=dashed];
|
||||
N18 -> N124[label="",style=dashed];
|
||||
N19 -> N20[label="",style=dashed];
|
||||
N19 -> N21[label="",style=dashed];
|
||||
N19 -> N22[label="",style=dashed];
|
||||
N20 -> N9[label="",style=dashed];
|
||||
N22 -> N51[label="",style=dashed];
|
||||
N23 -> N24[label="",style=dashed];
|
||||
N24 -> N51[label="",style=dashed];
|
||||
N26 -> N28[label="",style=dashed];
|
||||
N26 -> N96[label="",style=dashed];
|
||||
N27 -> N28[label="",style=dashed];
|
||||
N27 -> N96[label="",style=dashed];
|
||||
N30 -> N31[label=""];
|
||||
N33 -> N21[label="",style=dashed];
|
||||
N30 -> N32[label=""];
|
||||
N31 -> N32[label=""];
|
||||
N33 -> N34[label="",style=dashed];
|
||||
N34 -> N9[label="",style=dashed];
|
||||
N34 -> N45[label="",style=dashed];
|
||||
N34 -> N46[label="",style=dashed];
|
||||
N34 -> N81[label="",style=dashed];
|
||||
N35 -> N3[label="",style=dashed];
|
||||
N35 -> N34[label="",style=dashed];
|
||||
N35 -> N36[label="",style=dashed];
|
||||
N35 -> N47[label="",style=dashed];
|
||||
N36 -> N27[label="",style=dashed];
|
||||
N36 -> N48[label="",style=dashed];
|
||||
N36 -> N69[label="",style=dashed];
|
||||
N38 -> N34[label="",style=dashed];
|
||||
N34 -> N49[label="",style=dashed];
|
||||
N34 -> N51[label="",style=dashed];
|
||||
N34 -> N117[label="",style=dashed];
|
||||
N34 -> N129[label="",style=dashed];
|
||||
N34 -> N130[label="",style=dashed];
|
||||
N34 -> N131[label="",style=dashed];
|
||||
N36 -> N22[label="",style=dashed];
|
||||
N37 -> N48[label="",style=dashed];
|
||||
N37 -> N49[label="",style=dashed];
|
||||
N37 -> N108[label="",style=dashed];
|
||||
N38 -> N3[label="",style=dashed];
|
||||
N38 -> N37[label="",style=dashed];
|
||||
N38 -> N39[label="",style=dashed];
|
||||
N38 -> N40[label="",style=dashed];
|
||||
N39 -> N21[label="",style=dashed];
|
||||
N39 -> N36[label="",style=dashed];
|
||||
N39 -> N46[label="",style=dashed];
|
||||
N39 -> N48[label="",style=dashed];
|
||||
N39 -> N65[label="",style=dashed];
|
||||
N45 -> N69[label="",style=dashed];
|
||||
N47 -> N34[label="",style=dashed];
|
||||
N47 -> N43[label="",style=dashed];
|
||||
N50 -> N27[label="",style=dashed];
|
||||
N50 -> N48[label="",style=dashed];
|
||||
N50 -> N69[label="",style=dashed];
|
||||
N56 -> N43[label="",style=dashed];
|
||||
N56 -> N46[label="",style=dashed];
|
||||
N58 -> N85[label="",style=dashed];
|
||||
N58 -> N86[label="",style=dashed];
|
||||
N59 -> N48[label="",style=dashed];
|
||||
N59 -> N91[label="",style=dashed];
|
||||
N60 -> N21[label="",style=dashed];
|
||||
N61 -> N19[label="",style=dashed];
|
||||
N61 -> N21[label="",style=dashed];
|
||||
N61 -> N43[label="",style=dashed];
|
||||
N61 -> N62[label="",style=dashed];
|
||||
N62 -> N9[label="",style=dashed];
|
||||
N62 -> N19[label="",style=dashed];
|
||||
N62 -> N74[label="",style=dashed];
|
||||
N62 -> N78[label="",style=dashed];
|
||||
N62 -> N95[label="",style=dashed];
|
||||
N63 -> N22[label="",style=dashed];
|
||||
N63 -> N23[label="",style=dashed];
|
||||
N63 -> N88[label="",style=dashed];
|
||||
N63 -> N89[label="",style=dashed];
|
||||
N63 -> N90[label="",style=dashed];
|
||||
N64 -> N21[label="",style=dashed];
|
||||
N64 -> N29[label="",style=dashed];
|
||||
N64 -> N46[label="",style=dashed];
|
||||
N64 -> N48[label="",style=dashed];
|
||||
N64 -> N65[label="",style=dashed];
|
||||
N65 -> N68[label="",style=dashed];
|
||||
N66 -> N19[label="",style=dashed];
|
||||
N66 -> N55[label="",style=dashed];
|
||||
N66 -> N67[label="",style=dashed];
|
||||
N67 -> N48[label="",style=dashed];
|
||||
N68 -> N21[label="",style=dashed];
|
||||
N68 -> N48[label="",style=dashed];
|
||||
N68 -> N60[label="",style=dashed];
|
||||
N68 -> N67[label="",style=dashed];
|
||||
N69 -> N27[label="",style=dashed];
|
||||
N69 -> N70[label="",style=dashed];
|
||||
N74 -> N9[label="",style=dashed];
|
||||
N74 -> N27[label="",style=dashed];
|
||||
N74 -> N48[label="",style=dashed];
|
||||
N74 -> N69[label="",style=dashed];
|
||||
N74 -> N72[label="",style=dashed];
|
||||
N74 -> N75[label="",style=dashed];
|
||||
N74 -> N76[label="",style=dashed];
|
||||
N74 -> N77[label="",style=dashed];
|
||||
N74 -> N78[label="",style=dashed];
|
||||
N75 -> N27[label="",style=dashed];
|
||||
N75 -> N69[label="",style=dashed];
|
||||
N75 -> N76[label="",style=dashed];
|
||||
N75 -> N79[label="",style=dashed];
|
||||
N76 -> N27[label="",style=dashed];
|
||||
N76 -> N44[label="",style=dashed];
|
||||
N76 -> N48[label="",style=dashed];
|
||||
N76 -> N69[label="",style=dashed];
|
||||
N76 -> N79[label="",style=dashed];
|
||||
N77 -> N41[label="",style=dashed];
|
||||
N77 -> N44[label="",style=dashed];
|
||||
N77 -> N48[label="",style=dashed];
|
||||
N77 -> N81[label="",style=dashed];
|
||||
N77 -> N82[label="",style=dashed];
|
||||
N77 -> N83[label="",style=dashed];
|
||||
N79 -> N27[label="",style=dashed];
|
||||
N79 -> N70[label="",style=dashed];
|
||||
N80 -> N43[label="",style=dashed];
|
||||
N81 -> N82[label="",style=dashed];
|
||||
N84 -> N18[label="",style=dashed];
|
||||
N84 -> N19[label="",style=dashed];
|
||||
N84 -> N61[label="",style=dashed];
|
||||
N84 -> N62[label="",style=dashed];
|
||||
N86 -> N21[label="",style=dashed];
|
||||
N86 -> N27[label="",style=dashed];
|
||||
N86 -> N48[label="",style=dashed];
|
||||
N86 -> N69[label="",style=dashed];
|
||||
N86 -> N87[label="",style=dashed];
|
||||
N89 -> N96[label="",style=dashed];
|
||||
N91 -> N48[label="",style=dashed];
|
||||
N91 -> N65[label="",style=dashed];
|
||||
N92 -> N55[label="",style=dashed];
|
||||
N92 -> N93[label="",style=dashed];
|
||||
N92 -> N94[label="",style=dashed];
|
||||
N96 -> N48[label="",style=dashed];
|
||||
N96 -> N69[label="",style=dashed];
|
||||
N38 -> N50[label="",style=dashed];
|
||||
N39 -> N28[label="",style=dashed];
|
||||
N39 -> N51[label="",style=dashed];
|
||||
N39 -> N76[label="",style=dashed];
|
||||
N41 -> N37[label="",style=dashed];
|
||||
N41 -> N42[label="",style=dashed];
|
||||
N41 -> N43[label="",style=dashed];
|
||||
N42 -> N22[label="",style=dashed];
|
||||
N42 -> N39[label="",style=dashed];
|
||||
N42 -> N49[label="",style=dashed];
|
||||
N42 -> N51[label="",style=dashed];
|
||||
N42 -> N72[label="",style=dashed];
|
||||
N48 -> N76[label="",style=dashed];
|
||||
N50 -> N37[label="",style=dashed];
|
||||
N50 -> N46[label="",style=dashed];
|
||||
N53 -> N28[label="",style=dashed];
|
||||
N53 -> N51[label="",style=dashed];
|
||||
N53 -> N76[label="",style=dashed];
|
||||
N58 -> N39[label=""];
|
||||
N58 -> N59[label=""];
|
||||
N59 -> N85[label=""];
|
||||
N59 -> N86[label=""];
|
||||
N61 -> N46[label="",style=dashed];
|
||||
N61 -> N49[label="",style=dashed];
|
||||
N63 -> N99[label="",style=dashed];
|
||||
N64 -> N113[label="",style=dashed];
|
||||
N64 -> N115[label="",style=dashed];
|
||||
N65 -> N51[label="",style=dashed];
|
||||
N65 -> N123[label="",style=dashed];
|
||||
N66 -> N22[label="",style=dashed];
|
||||
N67 -> N20[label="",style=dashed];
|
||||
N67 -> N22[label="",style=dashed];
|
||||
N67 -> N46[label="",style=dashed];
|
||||
N67 -> N68[label="",style=dashed];
|
||||
N68 -> N9[label="",style=dashed];
|
||||
N68 -> N20[label="",style=dashed];
|
||||
N68 -> N101[label="",style=dashed];
|
||||
N68 -> N105[label="",style=dashed];
|
||||
N68 -> N127[label="",style=dashed];
|
||||
N70 -> N23[label="",style=dashed];
|
||||
N70 -> N24[label="",style=dashed];
|
||||
N70 -> N120[label="",style=dashed];
|
||||
N70 -> N121[label="",style=dashed];
|
||||
N70 -> N122[label="",style=dashed];
|
||||
N71 -> N22[label="",style=dashed];
|
||||
N71 -> N30[label="",style=dashed];
|
||||
N71 -> N49[label="",style=dashed];
|
||||
N71 -> N51[label="",style=dashed];
|
||||
N71 -> N72[label="",style=dashed];
|
||||
N72 -> N75[label="",style=dashed];
|
||||
N73 -> N20[label="",style=dashed];
|
||||
N73 -> N60[label="",style=dashed];
|
||||
N73 -> N74[label="",style=dashed];
|
||||
N74 -> N51[label="",style=dashed];
|
||||
N75 -> N22[label="",style=dashed];
|
||||
N75 -> N51[label="",style=dashed];
|
||||
N75 -> N66[label="",style=dashed];
|
||||
N75 -> N74[label="",style=dashed];
|
||||
N76 -> N28[label="",style=dashed];
|
||||
N76 -> N96[label="",style=dashed];
|
||||
N78 -> N9[label="",style=dashed];
|
||||
N78 -> N39[label="",style=dashed];
|
||||
N78 -> N49[label="",style=dashed];
|
||||
N78 -> N58[label=""];
|
||||
N78 -> N59[label=""];
|
||||
N78 -> N77[label=""];
|
||||
N78 -> N79[label=""];
|
||||
N78 -> N80[label=""];
|
||||
N78 -> N81[label=""];
|
||||
N78 -> N82[label=""];
|
||||
N78 -> N83[label="",style=dashed];
|
||||
N78 -> N84[label=""];
|
||||
N80 -> N9[label=""];
|
||||
N81 -> N9[label=""];
|
||||
N81 -> N21[label=""];
|
||||
N81 -> N101[label=""];
|
||||
N81 -> N105[label=""];
|
||||
N81 -> N110[label=""];
|
||||
N83 -> N108[label="",style=dashed];
|
||||
N84 -> N28[label=""];
|
||||
N84 -> N106[label=""];
|
||||
N85 -> N86[label=""];
|
||||
N85 -> N87[label=""];
|
||||
N85 -> N88[label=""];
|
||||
N87 -> N86[label=""];
|
||||
N90 -> N9[label="",style=dashed];
|
||||
N90 -> N91[label="",style=dashed];
|
||||
N90 -> N92[label="",style=dashed];
|
||||
N90 -> N93[label="",style=dashed];
|
||||
N90 -> N94[label="",style=dashed];
|
||||
N91 -> N28[label="",style=dashed];
|
||||
N91 -> N51[label="",style=dashed];
|
||||
N91 -> N76[label="",style=dashed];
|
||||
N91 -> N114[label="",style=dashed];
|
||||
N93 -> N33[label="",style=dashed];
|
||||
N93 -> N34[label="",style=dashed];
|
||||
N93 -> N116[label="",style=dashed];
|
||||
N93 -> N118[label="",style=dashed];
|
||||
N93 -> N119[label="",style=dashed];
|
||||
N93 -> N128[label="",style=dashed];
|
||||
N94 -> N69[label="",style=dashed];
|
||||
N94 -> N89[label="",style=dashed];
|
||||
N94 -> N92[label="",style=dashed];
|
||||
N94 -> N112[label="",style=dashed];
|
||||
N95 -> N9[label="",style=dashed];
|
||||
N95 -> N78[label="",style=dashed];
|
||||
N95 -> N83[label="",style=dashed];
|
||||
N95 -> N90[label="",style=dashed];
|
||||
N101 -> N9[label="",style=dashed];
|
||||
N101 -> N28[label="",style=dashed];
|
||||
N101 -> N51[label="",style=dashed];
|
||||
N101 -> N76[label="",style=dashed];
|
||||
N101 -> N98[label="",style=dashed];
|
||||
N101 -> N102[label="",style=dashed];
|
||||
N101 -> N103[label="",style=dashed];
|
||||
N101 -> N104[label="",style=dashed];
|
||||
N101 -> N105[label="",style=dashed];
|
||||
N102 -> N28[label="",style=dashed];
|
||||
N102 -> N76[label="",style=dashed];
|
||||
N102 -> N103[label="",style=dashed];
|
||||
N102 -> N106[label="",style=dashed];
|
||||
N103 -> N28[label="",style=dashed];
|
||||
N103 -> N47[label="",style=dashed];
|
||||
N103 -> N51[label="",style=dashed];
|
||||
N103 -> N76[label="",style=dashed];
|
||||
N103 -> N106[label="",style=dashed];
|
||||
N104 -> N44[label="",style=dashed];
|
||||
N104 -> N47[label="",style=dashed];
|
||||
N104 -> N51[label="",style=dashed];
|
||||
N104 -> N108[label="",style=dashed];
|
||||
N104 -> N109[label="",style=dashed];
|
||||
N104 -> N110[label="",style=dashed];
|
||||
N106 -> N28[label="",style=dashed];
|
||||
N106 -> N96[label="",style=dashed];
|
||||
N107 -> N46[label="",style=dashed];
|
||||
N108 -> N109[label="",style=dashed];
|
||||
N111 -> N19[label="",style=dashed];
|
||||
N111 -> N20[label="",style=dashed];
|
||||
N111 -> N67[label="",style=dashed];
|
||||
N111 -> N68[label="",style=dashed];
|
||||
N115 -> N22[label="",style=dashed];
|
||||
N115 -> N28[label="",style=dashed];
|
||||
N115 -> N51[label="",style=dashed];
|
||||
N115 -> N76[label="",style=dashed];
|
||||
N115 -> N114[label="",style=dashed];
|
||||
N116 -> N34[label="",style=dashed];
|
||||
N116 -> N117[label="",style=dashed];
|
||||
N117 -> N9[label="",style=dashed];
|
||||
N117 -> N49[label="",style=dashed];
|
||||
N117 -> N51[label="",style=dashed];
|
||||
N117 -> N129[label="",style=dashed];
|
||||
N117 -> N130[label="",style=dashed];
|
||||
N117 -> N131[label="",style=dashed];
|
||||
N118 -> N33[label="",style=dashed];
|
||||
N118 -> N34[label="",style=dashed];
|
||||
N118 -> N117[label="",style=dashed];
|
||||
N118 -> N119[label="",style=dashed];
|
||||
N119 -> N34[label="",style=dashed];
|
||||
N119 -> N117[label="",style=dashed];
|
||||
N121 -> N132[label="",style=dashed];
|
||||
N123 -> N51[label="",style=dashed];
|
||||
N123 -> N72[label="",style=dashed];
|
||||
N124 -> N60[label="",style=dashed];
|
||||
N124 -> N125[label="",style=dashed];
|
||||
N124 -> N126[label="",style=dashed];
|
||||
N128 -> N34[label="",style=dashed];
|
||||
N128 -> N117[label="",style=dashed];
|
||||
N129 -> N49[label="",style=dashed];
|
||||
N130 -> N28[label="",style=dashed];
|
||||
N130 -> N76[label="",style=dashed];
|
||||
N132 -> N51[label="",style=dashed];
|
||||
N132 -> N76[label="",style=dashed];
|
||||
}
|
||||
|
|
BIN
tools/graph.png
BIN
tools/graph.png
Binary file not shown.
Before Width: | Height: | Size: 1.0 MiB |
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 173 KiB |
|
@ -0,0 +1,11 @@
|
|||
diff --git tools/graph.dot tools/graph.dot
|
||||
index f842267..1a831d2 100644
|
||||
--- tools/graph.dot
|
||||
+++ tools/graph.dot
|
||||
@@ -1,4 +1,6 @@
|
||||
digraph dependencies {
|
||||
+ ratio=1.0;
|
||||
+ size="5,5";
|
||||
N0[label="pbtc",shape=box];
|
||||
N1[label="app_dirs",shape=box];
|
||||
N2[label="bencher",shape=box];
|
|
@ -14,8 +14,8 @@ const COINBASE_MATURITY: u32 = 100; // 2 hours
|
|||
pub const MAX_BLOCK_SIZE: usize = 1_000_000;
|
||||
pub const MAX_BLOCK_SIGOPS: usize = 20_000;
|
||||
|
||||
const TRANSACTIONS_VERIFY_THREADS: usize = 4;
|
||||
const TRANSACTIONS_VERIFY_PARALLEL_THRESHOLD: usize = 16;
|
||||
const TRANSACTIONS_VERIFY_THREADS: usize = 8;
|
||||
const TRANSACTIONS_VERIFY_PARALLEL_THRESHOLD: usize = 32;
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
/// Block verification chain
|
||||
|
@ -78,8 +78,8 @@ impl ChainVerifier {
|
|||
// strict pay-to-script-hash signature operations count toward block
|
||||
// signature operations limit is enforced with BIP16
|
||||
let store = StoreWithUnretainedOutputs::new(&self.store, block);
|
||||
let bip16_active = self.verify_p2sh(block.header().time);
|
||||
block.transactions().map(|(_, tx)| transaction_sigops(tx, &store, bip16_active)).sum()
|
||||
let bip16_active = self.verify_p2sh(block.header.raw.time);
|
||||
block.transactions.iter().map(|tx| transaction_sigops(&tx.raw, &store, bip16_active)).sum()
|
||||
}
|
||||
|
||||
fn ordered_verify(&self, block: &db::IndexedBlock, at_height: u32) -> Result<(), Error> {
|
||||
|
@ -98,28 +98,24 @@ impl ChainVerifier {
|
|||
//if let Some(work) = self.work_required(block, at_height) {
|
||||
if at_height != 0 && !self.skip_pow {
|
||||
let work = utils::work_required(
|
||||
block.header().previous_header_hash.clone(),
|
||||
block.header().time,
|
||||
block.header.raw.previous_header_hash.clone(),
|
||||
block.header.raw.time,
|
||||
at_height,
|
||||
self.store.as_block_header_provider(),
|
||||
self.network
|
||||
);
|
||||
if !self.skip_pow && work != block.header().bits {
|
||||
if !self.skip_pow && work != block.header.raw.bits {
|
||||
trace!(target: "verification", "pow verification error at height: {}", at_height);
|
||||
trace!(target: "verification", "expected work: {:?}, got {:?}", work, block.header().bits);
|
||||
trace!(target: "verification", "expected work: {:?}, got {:?}", work, block.header.raw.bits);
|
||||
return Err(Error::Difficulty);
|
||||
}
|
||||
}
|
||||
|
||||
let coinbase_spends = block.transactions()
|
||||
.nth(0)
|
||||
.expect("block emptyness should be checked at this point")
|
||||
.1
|
||||
.total_spends();
|
||||
let coinbase_spends = block.transactions[0].raw.total_spends();
|
||||
|
||||
// bip30
|
||||
for (tx_index, (tx_hash, _)) in block.transactions().enumerate() {
|
||||
if let Some(meta) = self.store.transaction_meta(tx_hash) {
|
||||
for (tx_index, tx) in block.transactions.iter().enumerate() {
|
||||
if let Some(meta) = self.store.transaction_meta(&tx.hash) {
|
||||
if !meta.is_fully_spent() && !self.consensus_params.is_bip30_exception(&block_hash, at_height) {
|
||||
return Err(Error::Transaction(tx_index, TransactionError::UnspentTransactionWithTheSameHash));
|
||||
}
|
||||
|
@ -128,9 +124,9 @@ impl ChainVerifier {
|
|||
|
||||
let unretained_store = StoreWithUnretainedOutputs::new(&self.store, block);
|
||||
let mut total_unspent = 0u64;
|
||||
for (tx_index, (_, tx)) in block.transactions().enumerate().skip(1) {
|
||||
for (tx_index, tx) in block.transactions.iter().enumerate().skip(1) {
|
||||
let mut total_claimed: u64 = 0;
|
||||
for input in &tx.inputs {
|
||||
for input in &tx.raw.inputs {
|
||||
// Coinbase maturity check
|
||||
if let Some(previous_meta) = self.store.transaction_meta(&input.previous_output.hash) {
|
||||
// check if it exists only
|
||||
|
@ -147,7 +143,7 @@ impl ChainVerifier {
|
|||
total_claimed += previous_output.value;
|
||||
}
|
||||
|
||||
let total_spends = tx.total_spends();
|
||||
let total_spends = tx.raw.total_spends();
|
||||
|
||||
if total_claimed < total_spends {
|
||||
return Err(Error::Transaction(tx_index, TransactionError::Overspend));
|
||||
|
@ -265,12 +261,12 @@ impl ChainVerifier {
|
|||
let hash = block.hash();
|
||||
|
||||
// There should be at least 1 transaction
|
||||
if block.transaction_count() == 0 {
|
||||
if block.transactions.is_empty() {
|
||||
return Err(Error::Empty);
|
||||
}
|
||||
|
||||
// block header checks
|
||||
try!(self.verify_block_header(self.store.as_block_header_provider(), &hash, block.header()));
|
||||
try!(self.verify_block_header(self.store.as_block_header_provider(), &hash, &block.header.raw));
|
||||
|
||||
// todo: serialized_size function is at least suboptimal
|
||||
let size = block.size();
|
||||
|
@ -279,11 +275,11 @@ impl ChainVerifier {
|
|||
}
|
||||
|
||||
// verify merkle root
|
||||
if block.merkle_root() != block.header().merkle_root_hash {
|
||||
if block.merkle_root() != block.header.raw.merkle_root_hash {
|
||||
return Err(Error::MerkleRoot);
|
||||
}
|
||||
|
||||
let first_tx = block.transactions().nth(0).expect("transaction count is checked above to be greater than 0").1;
|
||||
let first_tx = &block.transactions[0].raw;
|
||||
// check first transaction is a coinbase transaction
|
||||
if !first_tx.is_coinbase() {
|
||||
return Err(Error::Coinbase)
|
||||
|
@ -295,19 +291,19 @@ impl ChainVerifier {
|
|||
return Err(Error::CoinbaseSignatureLength(coinbase_script_len));
|
||||
}
|
||||
|
||||
let location = match self.store.accepted_location(block.header()) {
|
||||
let location = match self.store.accepted_location(&block.header.raw) {
|
||||
Some(location) => location,
|
||||
None => return Ok(Chain::Orphan),
|
||||
};
|
||||
|
||||
if block.transaction_count() > TRANSACTIONS_VERIFY_PARALLEL_THRESHOLD {
|
||||
if block.transactions.len() > TRANSACTIONS_VERIFY_PARALLEL_THRESHOLD {
|
||||
// todo: might use on-stack vector (smallvec/elastic array)
|
||||
let mut transaction_tasks: Vec<Task> = Vec::with_capacity(TRANSACTIONS_VERIFY_THREADS);
|
||||
let mut last = 0;
|
||||
for num_task in 0..TRANSACTIONS_VERIFY_THREADS {
|
||||
let from = last;
|
||||
last = ::std::cmp::max(1, block.transaction_count() / TRANSACTIONS_VERIFY_THREADS);
|
||||
if num_task == TRANSACTIONS_VERIFY_THREADS - 1 { last = block.transaction_count(); };
|
||||
last = from + ::std::cmp::max(1, block.transactions.len() / TRANSACTIONS_VERIFY_THREADS);
|
||||
if num_task == TRANSACTIONS_VERIFY_THREADS - 1 { last = block.transactions.len(); };
|
||||
transaction_tasks.push(Task::new(block, location.height(), from, last));
|
||||
}
|
||||
|
||||
|
@ -325,8 +321,8 @@ impl ChainVerifier {
|
|||
}
|
||||
}
|
||||
else {
|
||||
for (index, (_, tx)) in block.transactions().enumerate() {
|
||||
if let Err(tx_err) = self.verify_transaction(block, location.height(), block.header().time, tx, index) {
|
||||
for (index, tx) in block.transactions.iter().enumerate() {
|
||||
if let Err(tx_err) = self.verify_transaction(block, location.height(), block.header.raw.time, &tx.raw, index) {
|
||||
return Err(Error::Transaction(index, tx_err));
|
||||
}
|
||||
}
|
||||
|
@ -372,7 +368,7 @@ impl Verify for ChainVerifier {
|
|||
trace!(
|
||||
target: "verification", "Block {} (transactions: {}) verification finished. Result {:?}",
|
||||
block.hash().to_reversed_str(),
|
||||
block.transaction_count(),
|
||||
block.transactions.len(),
|
||||
result,
|
||||
);
|
||||
result
|
||||
|
|
|
@ -25,7 +25,7 @@ impl<'a> Task<'a> {
|
|||
|
||||
pub fn progress(&mut self, verifier: &ChainVerifier) {
|
||||
for index in self.from..self.to {
|
||||
if let Err(e) = verifier.verify_transaction(self.block, self.block_height, self.block.header().time, self.block.transaction_at(index).1, index) {
|
||||
if let Err(e) = verifier.verify_transaction(self.block, self.block_height, self.block.header.raw.time, &self.block.transactions[index].raw, index) {
|
||||
self.result = Err((index, e))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue