diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c92fdca83..5c97864d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -516,6 +516,7 @@ test-coverage: # - echo "Coverage:" $COVERAGE tags: - kcov + allow_failure: true test-darwin: stage: test only: diff --git a/Cargo.lock b/Cargo.lock index 5502d9556..f6cf05cb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -205,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "integer-encoding 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "multihash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -254,7 +254,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -262,7 +262,7 @@ name = "core-foundation-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -285,7 +285,7 @@ version = "1.1.1" source = "git+https://github.com/ethcore/rust-ctrlc.git#f4927770f89eca80ec250911eea3adcbf579ac48" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -294,7 +294,7 @@ name = "daemonize" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -349,7 +349,7 @@ source = "git+https://github.com/ethcore/rust-secp256k1#98ad9b9ecae44a563efdd642 dependencies = [ "arrayvec 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -414,7 +414,7 @@ dependencies = [ "semver 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "transient-hashmap 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -423,7 +423,7 @@ version = "0.1.2" dependencies = [ "bigint 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -493,7 +493,7 @@ version = "1.7.0" dependencies = [ "ethcore-devtools 1.7.0", "ethcore-util 1.7.0", - "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)", + "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)", "semver 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -516,7 +516,7 @@ dependencies = [ "ethcore-ipc-codegen 1.7.0", "ethcore-ipc-nano 1.7.0", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)", + "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)", "semver 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -528,7 +528,7 @@ dependencies = [ "ethcore-ipc 1.7.0", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)", + "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)", ] [[package]] @@ -541,7 +541,7 @@ dependencies = [ "ethcore-ipc-nano 1.7.0", "ethcore-util 1.7.0", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)", + "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)", "semver 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -590,7 +590,7 @@ dependencies = [ "ethcrypto 0.1.0", "ethkey 0.2.0", "igd 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.1 (git+https://github.com/ethcore/mio)", "parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -638,7 +638,7 @@ dependencies = [ "serde_json 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", "stats 0.1.0", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", - "transient-hashmap 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -714,7 +714,7 @@ dependencies = [ "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "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)", @@ -782,7 +782,7 @@ dependencies = [ "ethkey 0.2.0", "itertools 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -843,7 +843,7 @@ name = "fdlimit" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -863,7 +863,7 @@ name = "flate2" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -935,7 +935,7 @@ version = "0.3.1" source = "git+https://github.com/ethcore/hidapi-rs#9a127c1dca7e327e4fdd428406a76c9f5ef48563" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1062,7 +1062,7 @@ version = "0.1.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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1171,7 +1171,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1180,7 +1180,7 @@ version = "0.3.0" source = "git+https://github.com/ethcore/libusb-rs#32bacf61abd981d5cbd4a8fecca5a2dc0b762a96" dependencies = [ "bit-set 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "libusb-sys 0.2.3 (git+https://github.com/ethcore/libusb-sys)", ] @@ -1190,7 +1190,7 @@ version = "0.2.3" source = "git+https://github.com/ethcore/libusb-sys#c10b1180646c9dc3f23a9b6bb825abcd3b7487ce" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1226,7 +1226,7 @@ name = "memchr" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1254,7 +1254,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1263,7 +1263,7 @@ version = "0.5.1" source = "git+https://github.com/ethcore/mio?branch=v0.5.x#3842d3b250ffd7bd9b16f9586b875ddcbac2b0dd" dependencies = [ "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1279,7 +1279,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1295,7 +1295,7 @@ version = "0.6.0-dev" source = "git+https://github.com/ethcore/mio?branch=timer-fix#31eccc40ece3d47abaefaf23bb2114033175b972" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1311,7 +1311,7 @@ source = "git+https://github.com/ethcore/mio#ef182bae193a9c7457cd2cf661fcaffb226 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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1327,7 +1327,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1367,29 +1367,29 @@ dependencies = [ [[package]] name = "multihash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ring 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nanomsg" version = "0.5.1" -source = "git+https://github.com/ethcore/nanomsg.rs.git#c40fe442c9afaea5b38009a3d992ca044dcceb00" +source = "git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7#673b79beef6e149273899850d7692335a481a920" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", - "nanomsg-sys 0.5.0 (git+https://github.com/ethcore/nanomsg.rs.git)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", + "nanomsg-sys 0.5.0 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)", ] [[package]] name = "nanomsg-sys" version = "0.5.0" -source = "git+https://github.com/ethcore/nanomsg.rs.git#c40fe442c9afaea5b38009a3d992ca044dcceb00" +source = "git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7#673b79beef6e149273899850d7692335a481a920" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1411,7 +1411,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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)", ] @@ -1422,7 +1422,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1432,7 +1432,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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)", @@ -1445,7 +1445,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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)", @@ -1535,7 +1535,7 @@ name = "num_cpus" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1567,7 +1567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-sys 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1577,7 +1577,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1632,7 +1632,7 @@ dependencies = [ "hyper 0.10.0-a.0 (git+https://github.com/ethcore/hyper)", "jsonrpc-http-server 6.0.0 (git+https://github.com/ethcore/jsonrpc.git?branch=parity-1.6)", "mime 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "multihash 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "multihash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rlp 0.1.0", ] @@ -1696,7 +1696,7 @@ dependencies = [ [[package]] name = "parity-ui-precompiled" version = "1.4.0" -source = "git+https://github.com/ethcore/js-precompiled.git#547a5352d779bc7821a7a2ec14c6d480833aeabb" +source = "git+https://github.com/ethcore/js-precompiled.git#7039b5b8e44196718333dc3fcdfcadae2a97c7fd" dependencies = [ "parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1733,7 +1733,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (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)", @@ -1862,7 +1862,7 @@ name = "rand" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1871,7 +1871,7 @@ version = "0.6.0" 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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1909,10 +1909,11 @@ dependencies = [ [[package]] name = "ring" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1920,6 +1921,7 @@ dependencies = [ name = "rlp" version = "0.1.0" dependencies = [ + "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "elastic-array 0.6.0 (git+https://github.com/ethcore/elastic-array)", "ethcore-bigint 0.1.2", "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1931,7 +1933,7 @@ name = "rocksdb" version = "0.4.5" source = "git+https://github.com/ethcore/rust-rocksdb#64c63ccbe1f62c2e2b39262486f9ba813793af58" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)", ] @@ -1941,7 +1943,7 @@ version = "0.3.0" source = "git+https://github.com/ethcore/rust-rocksdb#64c63ccbe1f62c2e2b39262486f9ba813793af58" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1962,7 +1964,7 @@ version = "0.2.2" 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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1973,7 +1975,7 @@ version = "0.3.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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1996,7 +1998,7 @@ version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.43 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2058,7 +2060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "security-framework-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2068,7 +2070,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2274,7 +2276,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (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.19 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2317,7 +2319,7 @@ name = "termios" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2326,7 +2328,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2343,7 +2345,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.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2411,7 +2413,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "transient-hashmap" -version = "0.1.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2647,7 +2649,7 @@ dependencies = [ "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f" "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b" -"checksum libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "408014cace30ee0f767b1c4517980646a573ec61a57957aeeabcac8ac0a02e8d" +"checksum libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "88ee81885f9f04bff991e306fea7c1c60a5f0f9e409e99f6b40e3311a3363135" "checksum libusb 0.3.0 (git+https://github.com/ethcore/libusb-rs)" = "" "checksum libusb-sys 0.2.3 (git+https://github.com/ethcore/libusb-sys)" = "" "checksum linked-hash-map 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bda158e0dabeb97ee8a401f4d17e479d6b891a14de0bba79d5cc2d4d325b5e48" @@ -2667,9 +2669,9 @@ dependencies = [ "checksum miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d5bfc6782530ac8ace97af10a540054a37126b63b0702ddaaa243b73b5745b9a" "checksum msdos_time 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c04b68cc63a8480fb2550343695f7be72effdec953a9d4508161c3e69041c7d8" "checksum multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9c35dac080fd6e16a99924c8dfdef0af89d797dd851adab25feaffacf7850d6" -"checksum multihash 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "755d5a39bee3faaf649437e873beab334990221b2faf1f2e56ca10a9e4600235" -"checksum nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)" = "" -"checksum nanomsg-sys 0.5.0 (git+https://github.com/ethcore/nanomsg.rs.git)" = "" +"checksum multihash 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c9f70f2402fa07c16c40be8fd0a748a39257c5dc3ff5c857cbbde2f39135c505" +"checksum nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)" = "" +"checksum nanomsg-sys 0.5.0 (git+https://github.com/ethcore/nanomsg.rs.git?branch=parity-1.7)" = "" "checksum native-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aa4e52995154bb6f0b41e4379a279482c9387c1632e3798ba4e511ef8c54ee09" "checksum net2 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "6a816012ca11cb47009693c1e0c6130e26d39e4d97ee2a13c50e868ec83e3204" "checksum nix 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f05c2fc965fc1cd6b73fa57fa7b89f288178737f2f3ce9e63e4a6a141189000e" @@ -2717,7 +2719,7 @@ dependencies = [ "checksum regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)" = "b4329b8928a284580a1c63ec9d846b12f6d3472317243ff7077aff11f23f2b29" "checksum regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "841591b1e05609a643e3b4d0045fce04f701daba7151ddcd3ad47b080693d5a9" "checksum reqwest 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bef9ed8fdfcc30947d6b774938dc0c3f369a474efe440df2c7f278180b2d2e6" -"checksum ring 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "87ac4fce2ee4bb10dd106788e90fdfa4c5a7f3f9f6aae29824db77dc57e2767d" +"checksum ring 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "595afba2db7545b940ec900dc59b5281f719d327fc0674eeadc9953617e55357" "checksum rocksdb 0.4.5 (git+https://github.com/ethcore/rust-rocksdb)" = "" "checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "" "checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "" @@ -2775,7 +2777,7 @@ dependencies = [ "checksum toml 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "fcd27a04ca509aff336ba5eb2abc58d456f52c4ff64d9724d88acb85ead560b6" "checksum toml 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a442dfc13508e603c3f763274361db7f79d7469a0e95c411cde53662ab30fc72" "checksum traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "07eaeb7689bb7fca7ce15628319635758eda769fed481ecfe6686ddef2600616" -"checksum transient-hashmap 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15f7cc7116182edca1ed08f6f8c4da92104555ca77addbabea4eaa59b20373d0" +"checksum transient-hashmap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "715254c8f0811be1a79ad3ea5e6fa3c8eddec2b03d7f5ba78cf093e56d79c24f" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "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" diff --git a/README.md b/README.md index 2511e7a4f..33954f67a 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ of RPC APIs. If you run into an issue while using parity, feel free to file one in this repository or hop on our [gitter chat room][gitter-url] to ask a question. We are glad to help! -Parity's current release is 1.5. You can download it at https://ethcore.io/parity.html or follow the instructions +Parity's current release is 1.5. You can download it at https://parity.io or follow the instructions below to build from source. ---- diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index 39bf20070..cdf0135e7 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -24,7 +24,7 @@ bit-set = "0.4" time = "0.1" rand = "0.3" byteorder = "1.0" -transient-hashmap = "0.1" +transient-hashmap = "0.4" linked-hash-map = "0.3.0" lru-cache = "0.1.0" ethabi = "1.0.0" diff --git a/ethcore/light/src/cht.rs b/ethcore/light/src/cht.rs index 1fcb7b26a..94b9946c0 100644 --- a/ethcore/light/src/cht.rs +++ b/ethcore/light/src/cht.rs @@ -23,7 +23,7 @@ use ethcore::ids::BlockId; use util::{Bytes, H256, U256, HashDB, MemoryDB}; use util::trie::{self, TrieMut, TrieDBMut, Trie, TrieDB, Recorder}; -use rlp::{Stream, RlpStream, UntrustedRlp, View}; +use rlp::{RlpStream, UntrustedRlp, View}; // encode a key. macro_rules! key { diff --git a/ethcore/light/src/net/mod.rs b/ethcore/light/src/net/mod.rs index 402f3ac3a..de86f1ce5 100644 --- a/ethcore/light/src/net/mod.rs +++ b/ethcore/light/src/net/mod.rs @@ -22,7 +22,7 @@ use ethcore::transaction::UnverifiedTransaction; use io::TimerToken; use network::{NetworkProtocolHandler, NetworkContext, PeerId}; -use rlp::{RlpStream, Stream, UntrustedRlp, View}; +use rlp::{RlpStream, UntrustedRlp, View}; use util::hash::H256; use util::{DBValue, Mutex, RwLock, U256}; use time::{Duration, SteadyTime}; @@ -313,7 +313,7 @@ impl LightProtocol { let req_id = ReqId(self.req_id.fetch_add(1, Ordering::SeqCst)); io.send(*peer_id, packet::REQUEST, { let mut stream = RlpStream::new_list(2); - stream.append(&req_id.0).append(&requests.requests()); + stream.append(&req_id.0).append_list(&requests.requests()); stream.out() }); @@ -713,7 +713,7 @@ impl LightProtocol { io.respond(packet::RESPONSE, { let mut stream = RlpStream::new_list(3); let cur_credits = peer.local_credits.current(); - stream.append(&req_id).append(&cur_credits).append(&responses); + stream.append(&req_id).append(&cur_credits).append_list(&responses); stream.out() }); Ok(()) diff --git a/ethcore/light/src/net/status.rs b/ethcore/light/src/net/status.rs index 3a09be3c2..f5464c036 100644 --- a/ethcore/light/src/net/status.rs +++ b/ethcore/light/src/net/status.rs @@ -16,7 +16,7 @@ //! Peer status and capabilities. -use rlp::{DecoderError, RlpDecodable, RlpEncodable, RlpStream, Stream, UntrustedRlp, View}; +use rlp::{DecoderError, RlpDecodable, Encodable, RlpStream, UntrustedRlp, View}; use util::{H256, U256}; use super::request_credits::FlowParams; @@ -126,7 +126,7 @@ impl<'a> Parser<'a> { } // Helper for encoding a key-value pair -fn encode_pair(key: Key, val: &T) -> Vec { +fn encode_pair(key: Key, val: &T) -> Vec { let mut s = RlpStream::new_list(2); s.append(&key.as_str()).append(val); s.out() @@ -374,7 +374,7 @@ mod tests { use super::*; use super::super::request_credits::FlowParams; use util::{U256, H256}; - use rlp::{RlpStream, Stream ,UntrustedRlp, View}; + use rlp::{RlpStream, UntrustedRlp, View}; #[test] fn full_handshake() { diff --git a/ethcore/light/src/net/tests/mod.rs b/ethcore/light/src/net/tests/mod.rs index bc7ab2e10..e2081534c 100644 --- a/ethcore/light/src/net/tests/mod.rs +++ b/ethcore/light/src/net/tests/mod.rs @@ -48,7 +48,7 @@ fn encode_single(request: Request) -> Requests { // helper for making a packet out of `Requests`. fn make_packet(req_id: usize, requests: &Requests) -> Vec { let mut stream = RlpStream::new_list(2); - stream.append(&req_id).append(&requests.requests()); + stream.append(&req_id).append_list(&requests.requests()); stream.out() } @@ -309,7 +309,7 @@ fn get_block_headers() { })]; let mut stream = RlpStream::new_list(3); - stream.append(&req_id).append(&new_creds).append(&response); + stream.append(&req_id).append(&new_creds).append_list(&response); stream.out() }; @@ -358,7 +358,7 @@ fn get_block_bodies() { let new_creds = *flow_params.limit() - flow_params.compute_cost_multi(requests.requests()); let mut response_stream = RlpStream::new_list(3); - response_stream.append(&req_id).append(&new_creds).append(&bodies); + response_stream.append(&req_id).append(&new_creds).append_list(&bodies); response_stream.out() }; @@ -413,7 +413,7 @@ fn get_block_receipts() { let new_creds = *flow_params.limit() - flow_params.compute_cost_multi(requests.requests()); let mut response_stream = RlpStream::new_list(3); - response_stream.append(&req_id).append(&new_creds).append(&receipts); + response_stream.append(&req_id).append(&new_creds).append_list(&receipts); response_stream.out() }; @@ -471,7 +471,7 @@ fn get_state_proofs() { let new_creds = *flow_params.limit() - flow_params.compute_cost_multi(requests.requests()); let mut response_stream = RlpStream::new_list(3); - response_stream.append(&req_id).append(&new_creds).append(&responses); + response_stream.append(&req_id).append(&new_creds).append_list(&responses); response_stream.out() }; @@ -514,7 +514,7 @@ fn get_contract_code() { let mut response_stream = RlpStream::new_list(3); - response_stream.append(&req_id).append(&new_creds).append(&response); + response_stream.append(&req_id).append(&new_creds).append_list(&response); response_stream.out() }; diff --git a/ethcore/light/src/on_demand/mod.rs b/ethcore/light/src/on_demand/mod.rs index aceba66e2..572dd20f6 100644 --- a/ethcore/light/src/on_demand/mod.rs +++ b/ethcore/light/src/on_demand/mod.rs @@ -30,7 +30,7 @@ use ethcore::executed::{Executed, ExecutionError}; use futures::{Async, Poll, Future}; use futures::sync::oneshot::{self, Sender, Receiver}; use network::PeerId; -use rlp::{RlpStream, Stream}; +use rlp::RlpStream; use util::{Bytes, RwLock, Mutex, U256, H256}; use util::sha3::{SHA3_NULL_RLP, SHA3_EMPTY_LIST_RLP}; diff --git a/ethcore/light/src/on_demand/request.rs b/ethcore/light/src/on_demand/request.rs index ece35fc21..1ae9a50ac 100644 --- a/ethcore/light/src/on_demand/request.rs +++ b/ethcore/light/src/on_demand/request.rs @@ -26,7 +26,7 @@ use ethcore::receipt::Receipt; use ethcore::state::{self, ProvedExecution}; use ethcore::transaction::SignedTransaction; -use rlp::{RlpStream, Stream, UntrustedRlp, View}; +use rlp::{RlpStream, UntrustedRlp, View}; use util::{Address, Bytes, DBValue, HashDB, H256, U256}; use util::memorydb::MemoryDB; use util::sha3::Hashable; @@ -310,7 +310,7 @@ mod tests { #[test] fn check_body() { - use rlp::{RlpStream, Stream}; + use rlp::RlpStream; let header = Header::new(); let mut body_stream = RlpStream::new_list(2); @@ -348,7 +348,7 @@ mod tests { #[test] fn check_state_proof() { - use rlp::{RlpStream, Stream}; + use rlp::RlpStream; let mut root = H256::default(); let mut db = MemoryDB::new(); diff --git a/ethcore/light/src/types/request/mod.rs b/ethcore/light/src/types/request/mod.rs index a3880da44..46dadfe4a 100644 --- a/ethcore/light/src/types/request/mod.rs +++ b/ethcore/light/src/types/request/mod.rs @@ -16,7 +16,7 @@ //! Light protocol request types. -use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; +use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::H256; mod builder; @@ -525,7 +525,7 @@ pub trait IncompleteRequest: Sized { pub mod header { use super::{Field, HashOrNumber, NoSuchOutput, OutputKind, Output}; use ethcore::encoded; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; /// Potentially incomplete headers request. #[derive(Debug, Clone, PartialEq, Eq)] @@ -655,7 +655,7 @@ pub mod header { /// Request and response for header proofs. pub mod header_proof { use super::{Field, NoSuchOutput, OutputKind, Output}; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::{Bytes, U256, H256}; /// Potentially incomplete header proof request. @@ -751,10 +751,12 @@ pub mod header_proof { impl Encodable for Response { fn rlp_append(&self, s: &mut RlpStream) { - s.begin_list(3) - .append(&self.proof) - .append(&self.hash) - .append(&self.td); + s.begin_list(3).begin_list(self.proof.len()); + for item in &self.proof { + s.append_list(&item); + } + + s.append(&self.hash).append(&self.td); } } } @@ -763,7 +765,7 @@ pub mod header_proof { pub mod block_receipts { use super::{Field, NoSuchOutput, OutputKind, Output}; use ethcore::receipt::Receipt; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::H256; /// Potentially incomplete block receipts request. @@ -849,7 +851,7 @@ pub mod block_receipts { impl Encodable for Response { fn rlp_append(&self, s: &mut RlpStream) { - s.append(&self.receipts); + s.append_list(&self.receipts); } } } @@ -858,7 +860,7 @@ pub mod block_receipts { pub mod block_body { use super::{Field, NoSuchOutput, OutputKind, Output}; use ethcore::encoded; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::H256; /// Potentially incomplete block body request. @@ -959,7 +961,7 @@ pub mod block_body { /// A request for an account proof. pub mod account { use super::{Field, NoSuchOutput, OutputKind, Output}; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::{Bytes, U256, H256}; /// Potentially incomplete request for an account proof. @@ -1083,9 +1085,12 @@ pub mod account { impl Encodable for Response { fn rlp_append(&self, s: &mut RlpStream) { - s.begin_list(5) - .append(&self.proof) - .append(&self.nonce) + s.begin_list(5).begin_list(self.proof.len()); + for item in &self.proof { + s.append_list(&item); + } + + s.append(&self.nonce) .append(&self.balance) .append(&self.code_hash) .append(&self.storage_root); @@ -1096,7 +1101,7 @@ pub mod account { /// A request for a storage proof. pub mod storage { use super::{Field, NoSuchOutput, OutputKind, Output}; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::{Bytes, H256}; /// Potentially incomplete request for an storage proof. @@ -1227,9 +1232,11 @@ pub mod storage { impl Encodable for Response { fn rlp_append(&self, s: &mut RlpStream) { - s.begin_list(2) - .append(&self.proof) - .append(&self.value); + s.begin_list(2).begin_list(self.proof.len()); + for item in &self.proof { + s.append_list(&item); + } + s.append(&self.value); } } } @@ -1237,7 +1244,7 @@ pub mod storage { /// A request for contract code. pub mod contract_code { use super::{Field, NoSuchOutput, OutputKind, Output}; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::{Bytes, H256}; /// Potentially incomplete contract code request. @@ -1351,7 +1358,7 @@ pub mod contract_code { pub mod execution { use super::{Field, NoSuchOutput, OutputKind, Output}; use ethcore::transaction::Action; - use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, Stream, View}; + use rlp::{Encodable, Decodable, Decoder, DecoderError, RlpStream, View}; use util::{Bytes, Address, U256, H256, DBValue}; /// Potentially incomplete execution proof request. @@ -1722,7 +1729,7 @@ mod tests { }).map(Request::Execution).collect(); let mut stream = RlpStream::new_list(2); - stream.append(&100usize).append(&reqs); + stream.append(&100usize).append_list(&reqs); let out = stream.out(); let rlp = UntrustedRlp::new(&out); diff --git a/ethcore/src/block.rs b/ethcore/src/block.rs index 14f3df799..c0ae90bb4 100644 --- a/ethcore/src/block.rs +++ b/ethcore/src/block.rs @@ -20,7 +20,7 @@ use std::cmp; use std::sync::Arc; use std::collections::HashSet; -use rlp::{UntrustedRlp, RlpStream, Encodable, Decodable, Decoder, DecoderError, View, Stream}; +use rlp::{UntrustedRlp, RlpStream, Encodable, Decodable, Decoder, DecoderError, View}; use util::{Bytes, Address, Uint, Hashable, U256, H256, ordered_trie_root, SHA3_NULL_RLP}; use util::error::{Mismatch, OutOfBounds}; @@ -59,8 +59,8 @@ impl Block { pub fn rlp_bytes(&self, seal: Seal) -> Bytes { let mut block_rlp = RlpStream::new_list(3); self.header.stream_rlp(&mut block_rlp, seal); - block_rlp.append(&self.transactions); - block_rlp.append(&self.uncles); + block_rlp.append_list(&self.transactions); + block_rlp.append_list(&self.uncles); block_rlp.out() } } @@ -507,7 +507,7 @@ impl SealedBlock { pub fn rlp_bytes(&self) -> Bytes { let mut block_rlp = RlpStream::new_list(3); self.block.header.stream_rlp(&mut block_rlp, Seal::With); - block_rlp.append(&self.block.transactions); + block_rlp.append_list(&self.block.transactions); block_rlp.append_raw(&self.uncle_bytes, 1); block_rlp.out() } diff --git a/ethcore/src/blockchain/extras.rs b/ethcore/src/blockchain/extras.rs index 0e6dadbfe..3122a78d7 100644 --- a/ethcore/src/blockchain/extras.rs +++ b/ethcore/src/blockchain/extras.rs @@ -172,7 +172,7 @@ impl Encodable for BlockDetails { s.append(&self.number); s.append(&self.total_difficulty); s.append(&self.parent); - s.append(&self.children); + s.append_list(&self.children); } } @@ -233,7 +233,7 @@ impl Decodable for BlockReceipts { impl Encodable for BlockReceipts { fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.receipts, s); + s.append_list(&self.receipts); } } diff --git a/ethcore/src/blockchain/generator/block.rs b/ethcore/src/blockchain/generator/block.rs index d7c958430..9dacb070e 100644 --- a/ethcore/src/blockchain/generator/block.rs +++ b/ethcore/src/blockchain/generator/block.rs @@ -37,8 +37,8 @@ impl Encodable for Block { fn rlp_append(&self, s: &mut RlpStream) { s.begin_list(3); s.append(&self.header); - s.append(&self.transactions); - s.append(&self.uncles); + s.append_list(&self.transactions); + s.append_list(&self.uncles); } } diff --git a/ethcore/src/blooms/bloom_group.rs b/ethcore/src/blooms/bloom_group.rs index c2961a7eb..6d8c40f75 100644 --- a/ethcore/src/blooms/bloom_group.rs +++ b/ethcore/src/blooms/bloom_group.rs @@ -63,7 +63,7 @@ impl Decodable for BloomGroup { impl Encodable for BloomGroup { fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.blooms, s) + s.append_list(&self.blooms); } } diff --git a/ethcore/src/engines/tendermint/message.rs b/ethcore/src/engines/tendermint/message.rs index 1f6359ad4..ead58ba98 100644 --- a/ethcore/src/engines/tendermint/message.rs +++ b/ethcore/src/engines/tendermint/message.rs @@ -20,7 +20,7 @@ use util::*; use super::{Height, View, BlockHash, Step}; use error::Error; use header::Header; -use rlp::{Rlp, UntrustedRlp, RlpStream, Stream, RlpEncodable, Encodable, Decodable, Decoder, DecoderError, View as RlpView}; +use rlp::{Rlp, UntrustedRlp, RlpStream, Encodable, Decodable, Decoder, DecoderError, View as RlpView}; use ethkey::{recover, public_to_address}; use super::super::vote_collector::Message; @@ -162,7 +162,7 @@ impl Decodable for Step { impl Encodable for Step { fn rlp_append(&self, s: &mut RlpStream) { - RlpEncodable::rlp_append(&self.number(), s); + s.append_internal(&self.number()); } } @@ -278,6 +278,7 @@ mod tests { ::rlp::encode(&H520::default()).to_vec(), Vec::new() ]; + header.set_seal(seal); let message = ConsensusMessage::new_proposal(&header).unwrap(); assert_eq!( diff --git a/ethcore/src/engines/tendermint/mod.rs b/ethcore/src/engines/tendermint/mod.rs index aac101447..2d2714e97 100644 --- a/ethcore/src/engines/tendermint/mod.rs +++ b/ethcore/src/engines/tendermint/mod.rs @@ -243,7 +243,7 @@ impl Tendermint { let seal = vec![ ::rlp::encode(&view).to_vec(), ::rlp::encode(&seal.proposal).to_vec(), - ::rlp::encode(&seal.votes).to_vec() + ::rlp::encode_list(&seal.votes).to_vec() ]; self.submit_seal(block_hash, seal); self.to_next_height(height); @@ -825,7 +825,7 @@ mod tests { let vote_info = message_info_rlp(&VoteStep::new(2, 0, Step::Precommit), Some(header.bare_hash())); let signature1 = tap.sign(proposer, None, vote_info.sha3()).unwrap(); - seal[2] = ::rlp::encode(&vec![H520::from(signature1.clone())]).to_vec(); + seal[2] = ::rlp::encode_list(&vec![H520::from(signature1.clone())]).to_vec(); header.set_seal(seal.clone()); // One good signature is not enough. @@ -837,7 +837,7 @@ mod tests { let voter = insert_and_unlock(&tap, "0"); let signature0 = tap.sign(voter, None, vote_info.sha3()).unwrap(); - seal[2] = ::rlp::encode(&vec![H520::from(signature1.clone()), H520::from(signature0.clone())]).to_vec(); + seal[2] = ::rlp::encode_list(&vec![H520::from(signature1.clone()), H520::from(signature0.clone())]).to_vec(); header.set_seal(seal.clone()); assert!(engine.verify_block_family(&header, &parent_header, None).is_ok()); @@ -845,7 +845,7 @@ mod tests { let bad_voter = insert_and_unlock(&tap, "101"); let bad_signature = tap.sign(bad_voter, None, vote_info.sha3()).unwrap(); - seal[2] = ::rlp::encode(&vec![H520::from(signature1), H520::from(bad_signature)]).to_vec(); + seal[2] = ::rlp::encode_list(&vec![H520::from(signature1), H520::from(bad_signature)]).to_vec(); header.set_seal(seal); // One good and one bad signature. diff --git a/ethcore/src/engines/vote_collector.rs b/ethcore/src/engines/vote_collector.rs index 3f1354ad5..a2969db3a 100644 --- a/ethcore/src/engines/vote_collector.rs +++ b/ethcore/src/engines/vote_collector.rs @@ -245,7 +245,7 @@ mod tests { #[test] fn seal_retrieval() { - let collector = VoteCollector::default(); + let collector = VoteCollector::default(); let bh = Some("1".sha3()); let mut signatures = Vec::new(); for _ in 0..5 { @@ -284,7 +284,7 @@ mod tests { #[test] fn count_votes() { - let collector = VoteCollector::default(); + let collector = VoteCollector::default(); let round1 = 1; let round3 = 3; // good 1 @@ -318,7 +318,7 @@ mod tests { #[test] fn remove_old() { - let collector = VoteCollector::default(); + let collector = VoteCollector::default(); let vote = |round, hash| { random_vote(&collector, H520::random(), round, hash); }; @@ -334,7 +334,7 @@ mod tests { #[test] fn malicious_authority() { - let collector = VoteCollector::default(); + let collector = VoteCollector::default(); let round = 3; // Vote is inserted fine. assert!(full_vote(&collector, H520::random(), round, Some("0".sha3()), &Address::default()).is_none()); diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index 924f3353c..db1fe6a4e 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -36,7 +36,7 @@ const STACK_SIZE_PER_DEPTH: usize = 24*1024; /// Returns new address created from address and given nonce. pub fn contract_address(address: &Address, nonce: &U256) -> Address { - use rlp::{RlpStream, Stream}; + use rlp::RlpStream; let mut stream = RlpStream::new_list(2); stream.append(address); diff --git a/ethcore/src/migrations/state/v7.rs b/ethcore/src/migrations/state/v7.rs index bcfaf8c5d..9e2d3c110 100644 --- a/ethcore/src/migrations/state/v7.rs +++ b/ethcore/src/migrations/state/v7.rs @@ -26,7 +26,7 @@ use util::migration::{Batch, Config, Error, Migration, SimpleMigration, Progress use util::sha3::Hashable; use std::sync::Arc; -use rlp::{decode, Rlp, RlpStream, Stream, View}; +use rlp::{decode, Rlp, RlpStream, View}; // attempt to migrate a key, value pair. None if migration not possible. @@ -199,7 +199,7 @@ impl OverlayRecentV7 { stream.begin_list(2).append(&k).append(&v); } - stream.append(&deleted_keys); + stream.append_list(&deleted_keys); // and insert it into the new database. batch.insert(entry_key, stream.out(), dest)?; diff --git a/ethcore/src/migrations/v9.rs b/ethcore/src/migrations/v9.rs index 68c1e0655..7e469fb7b 100644 --- a/ethcore/src/migrations/v9.rs +++ b/ethcore/src/migrations/v9.rs @@ -17,7 +17,7 @@ //! This migration consolidates all databases into single one using Column Families. -use rlp::{Rlp, RlpStream, View, Stream}; +use rlp::{Rlp, RlpStream, View}; use util::kvdb::Database; use util::migration::{Batch, Config, Error, Migration, Progress}; use std::sync::Arc; diff --git a/ethcore/src/miner/banning_queue.rs b/ethcore/src/miner/banning_queue.rs index 66fae59aa..a77008ba6 100644 --- a/ethcore/src/miner/banning_queue.rs +++ b/ethcore/src/miner/banning_queue.rs @@ -19,7 +19,6 @@ use std::time::Duration; use std::ops::{Deref, DerefMut}; -use std::cell::Cell; use transaction::{SignedTransaction, Action}; use transient_hashmap::TransientHashMap; use miner::{TransactionQueue, TransactionQueueDetailsProvider, TransactionImportResult, TransactionOrigin}; @@ -47,15 +46,15 @@ impl Default for Threshold { pub struct BanningTransactionQueue { queue: TransactionQueue, ban_threshold: Threshold, - senders_bans: TransientHashMap>, - recipients_bans: TransientHashMap>, - codes_bans: TransientHashMap>, + senders_bans: TransientHashMap, + recipients_bans: TransientHashMap, + codes_bans: TransientHashMap, } impl BanningTransactionQueue { /// Creates new banlisting transaction queue pub fn new(queue: TransactionQueue, ban_threshold: Threshold, ban_lifetime: Duration) -> Self { - let ban_lifetime_sec = ban_lifetime.as_secs(); + let ban_lifetime_sec = ban_lifetime.as_secs() as u32; assert!(ban_lifetime_sec > 0, "Lifetime has to be specified in seconds."); BanningTransactionQueue { queue: queue, @@ -87,7 +86,7 @@ impl BanningTransactionQueue { // Check sender let sender = transaction.sender(); - let count = self.senders_bans.direct().get(&sender).map(|v| v.get()).unwrap_or(0); + let count = self.senders_bans.direct().get(&sender).cloned().unwrap_or(0); if count > threshold { debug!(target: "txqueue", "Ignoring transaction {:?} because sender is banned.", transaction.hash()); return Err(Error::Transaction(TransactionError::SenderBanned)); @@ -95,7 +94,7 @@ impl BanningTransactionQueue { // Check recipient if let Action::Call(recipient) = transaction.action { - let count = self.recipients_bans.direct().get(&recipient).map(|v| v.get()).unwrap_or(0); + let count = self.recipients_bans.direct().get(&recipient).cloned().unwrap_or(0); if count > threshold { debug!(target: "txqueue", "Ignoring transaction {:?} because recipient is banned.", transaction.hash()); return Err(Error::Transaction(TransactionError::RecipientBanned)); @@ -105,7 +104,7 @@ impl BanningTransactionQueue { // Check code if let Action::Create = transaction.action { let code_hash = transaction.data.sha3(); - let count = self.codes_bans.direct().get(&code_hash).map(|v| v.get()).unwrap_or(0); + let count = self.codes_bans.direct().get(&code_hash).cloned().unwrap_or(0); if count > threshold { debug!(target: "txqueue", "Ignoring transaction {:?} because code is banned.", transaction.hash()); return Err(Error::Transaction(TransactionError::CodeBanned)); @@ -147,9 +146,9 @@ impl BanningTransactionQueue { /// queue. fn ban_sender(&mut self, address: Address) -> bool { let count = { - let mut count = self.senders_bans.entry(address).or_insert_with(|| Cell::new(0)); - *count.get_mut() = count.get().saturating_add(1); - count.get() + let mut count = self.senders_bans.entry(address).or_insert_with(|| 0); + *count = count.saturating_add(1); + *count }; match self.ban_threshold { Threshold::BanAfter(threshold) if count > threshold => { @@ -167,9 +166,9 @@ impl BanningTransactionQueue { /// Returns true if bans threshold has been reached. fn ban_recipient(&mut self, address: Address) -> bool { let count = { - let mut count = self.recipients_bans.entry(address).or_insert_with(|| Cell::new(0)); - *count.get_mut() = count.get().saturating_add(1); - count.get() + let mut count = self.recipients_bans.entry(address).or_insert_with(|| 0); + *count = count.saturating_add(1); + *count }; match self.ban_threshold { // TODO [ToDr] Consider removing other transactions to the same recipient from the queue? @@ -183,12 +182,12 @@ impl BanningTransactionQueue { /// If bans threshold is reached all subsequent transactions to contracts with this codehash will be rejected. /// Returns true if bans threshold has been reached. fn ban_codehash(&mut self, code_hash: H256) -> bool { - let mut count = self.codes_bans.entry(code_hash).or_insert_with(|| Cell::new(0)); - *count.get_mut() = count.get().saturating_add(1); + let mut count = self.codes_bans.entry(code_hash).or_insert_with(|| 0); + *count = count.saturating_add(1); match self.ban_threshold { // TODO [ToDr] Consider removing other transactions with the same code from the queue? - Threshold::BanAfter(threshold) if count.get() > threshold => true, + Threshold::BanAfter(threshold) if *count > threshold => true, _ => false, } } diff --git a/ethcore/src/miner/miner.rs b/ethcore/src/miner/miner.rs index d9df86cef..c4a99df3a 100644 --- a/ethcore/src/miner/miner.rs +++ b/ethcore/src/miner/miner.rs @@ -212,7 +212,7 @@ struct SealingWork { /// Handles preparing work for "work sealing" or seals "internally" if Engine does not require work. pub struct Miner { // NOTE [ToDr] When locking always lock in this order! - transaction_queue: Arc>, + transaction_queue: Arc>, sealing_work: Mutex, next_allowed_reseal: Mutex, next_mandatory_reseal: RwLock, @@ -234,7 +234,8 @@ pub struct Miner { impl Miner { /// Push notifier that will handle new jobs pub fn push_notifier(&self, notifier: Box) { - self.notifiers.write().push(notifier) + self.notifiers.write().push(notifier); + self.sealing_work.lock().enabled = true; } /// Creates new instance of miner Arc. @@ -270,7 +271,7 @@ impl Miner { }; Miner { - transaction_queue: Arc::new(Mutex::new(txq)), + transaction_queue: Arc::new(RwLock::new(txq)), next_allowed_reseal: Mutex::new(Instant::now()), next_mandatory_reseal: RwLock::new(Instant::now() + options.reseal_max_period), sealing_block_last_request: Mutex::new(0), @@ -303,9 +304,7 @@ impl Miner { } fn forced_sealing(&self) -> bool { - self.options.force_sealing - || !self.options.new_work_notify.is_empty() - || Instant::now() > *self.next_mandatory_reseal.read() + self.options.force_sealing || !self.notifiers.read().is_empty() } /// Clear all pending block states @@ -329,7 +328,7 @@ impl Miner { let _timer = PerfTimer::new("prepare_block"); let chain_info = chain.chain_info(); let (transactions, mut open_block, original_work_hash) = { - let transactions = {self.transaction_queue.lock().top_transactions_at(chain_info.best_block_number, chain_info.best_block_timestamp)}; + let transactions = {self.transaction_queue.read().top_transactions_at(chain_info.best_block_number, chain_info.best_block_timestamp)}; let mut sealing_work = self.sealing_work.lock(); let last_work_hash = sealing_work.queue.peek_last_ref().map(|pb| pb.block().fields().header.hash()); let best_hash = chain_info.best_block_hash; @@ -376,7 +375,7 @@ impl Miner { // Check for heavy transactions match self.options.tx_queue_banning { Banning::Enabled { ref offend_threshold, .. } if &took > offend_threshold => { - match self.transaction_queue.lock().ban_transaction(&hash) { + match self.transaction_queue.write().ban_transaction(&hash) { true => { warn!(target: "miner", "Detected heavy transaction. Banning the sender and recipient/code."); }, @@ -429,7 +428,7 @@ impl Miner { let fetch_nonce = |a: &Address| chain.latest_nonce(a); { - let mut queue = self.transaction_queue.lock(); + let mut queue = self.transaction_queue.write(); for hash in invalid_transactions { queue.remove_invalid(&hash, &fetch_nonce); } @@ -446,13 +445,13 @@ impl Miner { let txq = self.transaction_queue.clone(); self.gas_pricer.lock().recalibrate(move |price| { debug!(target: "miner", "minimal_gas_price: Got gas price! {}", price); - txq.lock().set_minimal_gas_price(price); + txq.write().set_minimal_gas_price(price); }); } /// Check is reseal is allowed and necessary. fn requires_reseal(&self, best_block: BlockNumber) -> bool { - let has_local_transactions = self.transaction_queue.lock().has_local_pending_transactions(); + let has_local_transactions = self.transaction_queue.read().has_local_pending_transactions(); let mut sealing_work = self.sealing_work.lock(); if sealing_work.enabled { trace!(target: "miner", "requires_reseal: sealing enabled"); @@ -483,7 +482,7 @@ impl Miner { /// Attempts to perform internal sealing (one that does not require work) and handles the result depending on the type of Seal. fn seal_and_import_block_internally(&self, chain: &MiningBlockChainClient, block: ClosedBlock) -> bool { - if !block.transactions().is_empty() || self.forced_sealing() { + if !block.transactions().is_empty() || self.forced_sealing() || Instant::now() > *self.next_mandatory_reseal.read() { trace!(target: "miner", "seal_block_internally: attempting internal seal."); match self.engine.generate_seal(block.block()) { // Save proposal for later seal submission and broadcast it. @@ -558,7 +557,7 @@ impl Miner { fn update_gas_limit(&self, client: &MiningBlockChainClient) { let gas_limit = client.best_block_header().gas_limit(); - let mut queue = self.transaction_queue.lock(); + let mut queue = self.transaction_queue.write(); queue.set_gas_limit(gas_limit); if let GasLimit::Auto = self.options.tx_queue_gas_limit { // Set total tx queue gas limit to be 20x the block gas limit. @@ -680,7 +679,7 @@ const SEALING_TIMEOUT_IN_BLOCKS : u64 = 5; impl MinerService for Miner { fn clear_and_reset(&self, chain: &MiningBlockChainClient) { - self.transaction_queue.lock().clear(); + self.transaction_queue.write().clear(); // -------------------------------------------------------------------------- // | NOTE Code below requires transaction_queue and sealing_work locks. | // | Make sure to release the locks before calling that method. | @@ -689,7 +688,7 @@ impl MinerService for Miner { } fn status(&self) -> MinerStatus { - let status = self.transaction_queue.lock().status(); + let status = self.transaction_queue.read().status(); let sealing_work = self.sealing_work.lock(); MinerStatus { transactions_in_pending_queue: status.pending, @@ -819,16 +818,16 @@ impl MinerService for Miner { } fn set_minimal_gas_price(&self, min_gas_price: U256) { - self.transaction_queue.lock().set_minimal_gas_price(min_gas_price); + self.transaction_queue.write().set_minimal_gas_price(min_gas_price); } fn minimal_gas_price(&self) -> U256 { - *self.transaction_queue.lock().minimal_gas_price() + *self.transaction_queue.read().minimal_gas_price() } fn sensible_gas_price(&self) -> U256 { // 10% above our minimum. - *self.transaction_queue.lock().minimal_gas_price() * 110.into() / 100.into() + *self.transaction_queue.read().minimal_gas_price() * 110.into() / 100.into() } fn sensible_gas_limit(&self) -> U256 { @@ -836,15 +835,15 @@ impl MinerService for Miner { } fn transactions_limit(&self) -> usize { - self.transaction_queue.lock().limit() + self.transaction_queue.read().limit() } fn set_transactions_limit(&self, limit: usize) { - self.transaction_queue.lock().set_limit(limit) + self.transaction_queue.write().set_limit(limit) } fn set_tx_gas_limit(&self, limit: U256) { - self.transaction_queue.lock().set_tx_gas_limit(limit) + self.transaction_queue.write().set_tx_gas_limit(limit) } /// Get the author that we will seal blocks as. @@ -874,7 +873,7 @@ impl MinerService for Miner { ) -> Vec> { trace!(target: "external_tx", "Importing external transactions"); let results = { - let mut transaction_queue = self.transaction_queue.lock(); + let mut transaction_queue = self.transaction_queue.write(); self.add_transactions_to_queue( chain, transactions, TransactionOrigin::External, None, &mut transaction_queue ) @@ -901,7 +900,7 @@ impl MinerService for Miner { let imported = { // Be sure to release the lock before we call prepare_work_sealing - let mut transaction_queue = self.transaction_queue.lock(); + let mut transaction_queue = self.transaction_queue.write(); // We need to re-validate transactions let import = self.add_transactions_to_queue( chain, vec![pending.transaction.into()], TransactionOrigin::Local, pending.condition, &mut transaction_queue @@ -938,12 +937,12 @@ impl MinerService for Miner { } fn pending_transactions(&self) -> Vec { - let queue = self.transaction_queue.lock(); + let queue = self.transaction_queue.read(); queue.pending_transactions(BlockNumber::max_value(), u64::max_value()) } fn local_transactions(&self) -> BTreeMap { - let queue = self.transaction_queue.lock(); + let queue = self.transaction_queue.read(); queue.local_transactions() .iter() .map(|(hash, status)| (*hash, status.clone())) @@ -951,11 +950,11 @@ impl MinerService for Miner { } fn future_transactions(&self) -> Vec { - self.transaction_queue.lock().future_transactions() + self.transaction_queue.read().future_transactions() } fn ready_transactions(&self, best_block: BlockNumber, best_block_timestamp: u64) -> Vec { - let queue = self.transaction_queue.lock(); + let queue = self.transaction_queue.read(); match self.options.pending_set { PendingSet::AlwaysQueue => queue.pending_transactions(best_block, best_block_timestamp), PendingSet::SealingOrElseQueue => { @@ -976,7 +975,7 @@ impl MinerService for Miner { } fn pending_transactions_hashes(&self, best_block: BlockNumber) -> Vec { - let queue = self.transaction_queue.lock(); + let queue = self.transaction_queue.read(); match self.options.pending_set { PendingSet::AlwaysQueue => queue.pending_hashes(), PendingSet::SealingOrElseQueue => { @@ -997,7 +996,7 @@ impl MinerService for Miner { } fn transaction(&self, best_block: BlockNumber, hash: &H256) -> Option { - let queue = self.transaction_queue.lock(); + let queue = self.transaction_queue.read(); match self.options.pending_set { PendingSet::AlwaysQueue => queue.find(hash), PendingSet::SealingOrElseQueue => { @@ -1017,6 +1016,16 @@ impl MinerService for Miner { } } + fn remove_pending_transaction(&self, chain: &MiningBlockChainClient, hash: &H256) -> Option { + let mut queue = self.transaction_queue.write(); + let tx = queue.find(hash); + if tx.is_some() { + let fetch_nonce = |a: &Address| chain.latest_nonce(a); + queue.remove_invalid(hash, &fetch_nonce); + } + tx + } + fn pending_receipt(&self, best_block: BlockNumber, hash: &H256) -> Option { self.from_pending_block( best_block, @@ -1068,7 +1077,7 @@ impl MinerService for Miner { } fn last_nonce(&self, address: &Address) -> Option { - self.transaction_queue.lock().last_nonce(address) + self.transaction_queue.read().last_nonce(address) } /// Update sealing if required. @@ -1158,7 +1167,7 @@ impl MinerService for Miner { // Then import all transactions... { - let mut transaction_queue = self.transaction_queue.lock(); + let mut transaction_queue = self.transaction_queue.write(); for hash in retracted { let block = chain.block(BlockId::Hash(*hash)) .expect("Client is sending message after commit to db and inserting to chain; the block is available; qed"); @@ -1176,7 +1185,7 @@ impl MinerService for Miner { balance: chain.latest_balance(a), }; let time = chain.chain_info().best_block_number; - let mut transaction_queue = self.transaction_queue.lock(); + let mut transaction_queue = self.transaction_queue.write(); transaction_queue.remove_old(&fetch_account, time); } diff --git a/ethcore/src/miner/mod.rs b/ethcore/src/miner/mod.rs index 403aca760..a9e7a9a5d 100644 --- a/ethcore/src/miner/mod.rs +++ b/ethcore/src/miner/mod.rs @@ -150,6 +150,10 @@ pub trait MinerService : Send + Sync { /// Query pending transactions for hash. fn transaction(&self, best_block: BlockNumber, hash: &H256) -> Option; + /// Removes transaction from the queue. + /// NOTE: The transaction is not removed from pending block if mining. + fn remove_pending_transaction(&self, chain: &MiningBlockChainClient, hash: &H256) -> Option; + /// Get a list of all pending transactions in the queue. fn pending_transactions(&self) -> Vec; diff --git a/ethcore/src/miner/stratum.rs b/ethcore/src/miner/stratum.rs index e67cbb5e1..4da5d1849 100644 --- a/ethcore/src/miner/stratum.rs +++ b/ethcore/src/miner/stratum.rs @@ -211,6 +211,8 @@ impl From for Error { impl super::work_notify::NotifyWork for Stratum { fn notify(&self, pow_hash: H256, difficulty: U256, number: u64) { + trace!(target: "stratum", "Notify work"); + self.service.push_work_all( self.dispatcher.payload(pow_hash, difficulty, number) ).unwrap_or_else( diff --git a/ethcore/src/pod_account.rs b/ethcore/src/pod_account.rs index 98321639f..4b5dc8921 100644 --- a/ethcore/src/pod_account.rs +++ b/ethcore/src/pod_account.rs @@ -19,7 +19,7 @@ use state::Account; use account_db::AccountDBMut; use ethjson; use types::account_diff::*; -use rlp::{self, RlpStream, Stream}; +use rlp::{self, RlpStream}; #[derive(Debug, Clone, PartialEq, Eq)] /// An account, expressed as Plain-Old-Data (hence the name). diff --git a/ethcore/src/snapshot/account.rs b/ethcore/src/snapshot/account.rs index 44c8093b7..62ee28f89 100644 --- a/ethcore/src/snapshot/account.rs +++ b/ethcore/src/snapshot/account.rs @@ -22,7 +22,7 @@ use snapshot::Error; use util::{U256, H256, Bytes, HashDB, SHA3_EMPTY, SHA3_NULL_RLP}; use util::trie::{TrieDB, Trie}; -use rlp::{RlpStream, Stream, UntrustedRlp, View}; +use rlp::{RlpStream, UntrustedRlp, View}; use std::collections::HashSet; diff --git a/ethcore/src/snapshot/block.rs b/ethcore/src/snapshot/block.rs index 048724ec9..0eee05575 100644 --- a/ethcore/src/snapshot/block.rs +++ b/ethcore/src/snapshot/block.rs @@ -20,7 +20,7 @@ use block::Block; use header::Header; use views::BlockView; -use rlp::{DecoderError, RlpStream, Stream, UntrustedRlp, View}; +use rlp::{DecoderError, RlpStream, UntrustedRlp, View}; use util::{Bytes, Hashable, H256}; use util::triehash::ordered_trie_root; @@ -69,7 +69,9 @@ impl AbridgedBlock { .append(&header.extra_data()); // write block values. - stream.append(&block_view.transactions()).append(&block_view.uncles()); + stream + .append_list(&block_view.transactions()) + .append_list(&block_view.uncles()); // write seal fields. for field in seal_fields { @@ -108,7 +110,7 @@ impl AbridgedBlock { header.set_receipts_root(receipts_root); let mut uncles_rlp = RlpStream::new(); - uncles_rlp.append(&uncles); + uncles_rlp.append_list(&uncles); header.set_uncles_hash(uncles_rlp.as_raw().sha3()); let mut seal_fields = Vec::new(); diff --git a/ethcore/src/snapshot/io.rs b/ethcore/src/snapshot/io.rs index 362faf80b..45f3ec4df 100644 --- a/ethcore/src/snapshot/io.rs +++ b/ethcore/src/snapshot/io.rs @@ -27,7 +27,7 @@ use std::path::{Path, PathBuf}; use util::Bytes; use util::hash::H256; -use rlp::{self, Encodable, RlpStream, UntrustedRlp, Stream, View}; +use rlp::{self, Encodable, RlpStream, UntrustedRlp, View}; use super::ManifestData; @@ -122,8 +122,8 @@ impl SnapshotWriter for PackedWriter { // they are consistent with ours. let mut stream = RlpStream::new_list(5); stream - .append(&self.state_hashes) - .append(&self.block_hashes) + .append_list(&self.state_hashes) + .append_list(&self.block_hashes) .append(&manifest.state_root) .append(&manifest.block_number) .append(&manifest.block_hash); @@ -428,4 +428,4 @@ mod tests { reader.chunk(hash.clone()).unwrap(); } } -} \ No newline at end of file +} diff --git a/ethcore/src/snapshot/mod.rs b/ethcore/src/snapshot/mod.rs index e8001e54b..473c91e4d 100644 --- a/ethcore/src/snapshot/mod.rs +++ b/ethcore/src/snapshot/mod.rs @@ -37,7 +37,7 @@ use util::journaldb::{self, Algorithm, JournalDB}; use util::kvdb::Database; use util::trie::{TrieDB, TrieDBMut, Trie, TrieMut}; use util::sha3::SHA3_NULL_RLP; -use rlp::{RlpStream, Stream, UntrustedRlp, View}; +use rlp::{RlpStream, UntrustedRlp, View}; use bloom_journal::Bloom; use self::block::AbridgedBlock; diff --git a/ethcore/src/snapshot/tests/blocks.rs b/ethcore/src/snapshot/tests/blocks.rs index 89a01fbd7..f2ee40a7b 100644 --- a/ethcore/src/snapshot/tests/blocks.rs +++ b/ethcore/src/snapshot/tests/blocks.rs @@ -99,7 +99,7 @@ fn chunk_and_restore_40k() { chunk_and_restore(40000) } #[test] fn checks_flag() { - use ::rlp::{RlpStream, Stream}; + use rlp::RlpStream; use util::H256; let mut stream = RlpStream::new_list(5); diff --git a/ethcore/src/snapshot/tests/state.rs b/ethcore/src/snapshot/tests/state.rs index 809e9fe21..854cd07d4 100644 --- a/ethcore/src/snapshot/tests/state.rs +++ b/ethcore/src/snapshot/tests/state.rs @@ -95,7 +95,7 @@ fn snap_and_restore() { #[test] fn get_code_from_prev_chunk() { use std::collections::HashSet; - use rlp::{RlpStream, Stream}; + use rlp::RlpStream; use util::{HashDB, H256, U256, Hashable}; use account_db::{AccountDBMut, AccountDB}; diff --git a/ethcore/src/spec/seal.rs b/ethcore/src/spec/seal.rs index 6e301a9ac..a1e929604 100644 --- a/ethcore/src/spec/seal.rs +++ b/ethcore/src/spec/seal.rs @@ -64,9 +64,12 @@ impl Into for AuthorityRound { impl Into for Tendermint { fn into(self) -> Generic { - let mut s = RlpStream::new_list(3); - s.append(&self.round).append(&self.proposal).append(&self.precommits); - Generic(s.out()) + let mut stream = RlpStream::new_list(3); + stream + .append(&self.round) + .append(&self.proposal) + .append_list(&self.precommits); + Generic(stream.out()) } } diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs index 3b7f84acf..1bc693a4f 100644 --- a/ethcore/src/spec/spec.rs +++ b/ethcore/src/spec/spec.rs @@ -34,7 +34,7 @@ use super::genesis::Genesis; use super::seal::Generic as GenericSeal; use ethereum; use ethjson; -use rlp::{Rlp, RlpStream, View, Stream}; +use rlp::{Rlp, RlpStream, View}; /// Parameters common to all engines. #[derive(Debug, PartialEq, Clone, Default)] diff --git a/ethcore/src/tests/helpers.rs b/ethcore/src/tests/helpers.rs index 7de46b0b3..dcb173b63 100644 --- a/ethcore/src/tests/helpers.rs +++ b/ethcore/src/tests/helpers.rs @@ -34,7 +34,7 @@ use devtools::*; use miner::Miner; use header::Header; use transaction::{Action, Transaction, SignedTransaction}; -use rlp::{self, RlpStream, Stream}; +use rlp::{self, RlpStream}; use views::BlockView; #[cfg(feature = "json-tests")] @@ -129,7 +129,7 @@ pub fn create_test_block_with_data(header: &Header, transactions: &[SignedTransa for t in transactions { rlp.append_raw(&rlp::encode(t).to_vec(), 1); } - rlp.append(&uncles); + rlp.append_list(&uncles); rlp.out() } diff --git a/ethcore/src/trace/bloom.rs b/ethcore/src/trace/bloom.rs index 4e2bd4eca..e0a32d5ae 100644 --- a/ethcore/src/trace/bloom.rs +++ b/ethcore/src/trace/bloom.rs @@ -83,7 +83,7 @@ impl Decodable for BlockTracesBloomGroup { impl Encodable for BlockTracesBloomGroup { fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.blooms, s) + s.append_list(&self.blooms); } } diff --git a/ethcore/src/types/log_entry.rs b/ethcore/src/types/log_entry.rs index 23155148a..3eac1dad5 100644 --- a/ethcore/src/types/log_entry.rs +++ b/ethcore/src/types/log_entry.rs @@ -41,7 +41,7 @@ impl Encodable for LogEntry { fn rlp_append(&self, s: &mut RlpStream) { s.begin_list(3); s.append(&self.address); - s.append(&self.topics); + s.append_list(&self.topics); s.append(&self.data); } } diff --git a/ethcore/src/types/receipt.rs b/ethcore/src/types/receipt.rs index f9e478b6a..5db74b0b6 100644 --- a/ethcore/src/types/receipt.rs +++ b/ethcore/src/types/receipt.rs @@ -60,7 +60,7 @@ impl Encodable for Receipt { } s.append(&self.gas_used); s.append(&self.log_bloom); - s.append(&self.logs); + s.append_list(&self.logs); } } diff --git a/ethcore/src/types/snapshot_manifest.rs b/ethcore/src/types/snapshot_manifest.rs index 24f56efeb..910a038bd 100644 --- a/ethcore/src/types/snapshot_manifest.rs +++ b/ethcore/src/types/snapshot_manifest.rs @@ -40,8 +40,8 @@ impl ManifestData { /// Encode the manifest data to rlp. pub fn into_rlp(self) -> Bytes { let mut stream = RlpStream::new_list(5); - stream.append(&self.state_hashes); - stream.append(&self.block_hashes); + stream.append_list(&self.state_hashes); + stream.append_list(&self.block_hashes); stream.append(&self.state_root); stream.append(&self.block_number); stream.append(&self.block_hash); diff --git a/ethcore/src/types/trace_types/error.rs b/ethcore/src/types/trace_types/error.rs index ea3d32679..33ccf2bb7 100644 --- a/ethcore/src/types/trace_types/error.rs +++ b/ethcore/src/types/trace_types/error.rs @@ -17,7 +17,7 @@ //! Trace errors. use std::fmt; -use rlp::{RlpEncodable, Encodable, RlpStream, Decodable, Decoder, DecoderError, View}; +use rlp::{Encodable, RlpStream, Decodable, Decoder, DecoderError, View}; use evm::Error as EvmError; /// Trace evm errors. @@ -85,7 +85,8 @@ impl Encodable for Error { OutOfStack => 4, Internal => 5, }; - RlpEncodable::rlp_append(&value, s); + + s.append_internal(&value); } } diff --git a/ethcore/src/types/trace_types/flat.rs b/ethcore/src/types/trace_types/flat.rs index 870f13802..832e7d055 100644 --- a/ethcore/src/types/trace_types/flat.rs +++ b/ethcore/src/types/trace_types/flat.rs @@ -59,7 +59,7 @@ impl Encodable for FlatTrace { s.append(&self.action); s.append(&self.result); s.append(&self.subtraces); - s.append(&self.trace_address.clone().into_iter().collect::>()); + s.append_list::(&self.trace_address.iter().collect::>()); } } @@ -103,7 +103,7 @@ impl FlatTransactionTraces { impl Encodable for FlatTransactionTraces { fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.0, s); + s.append_list(&self.0); } } @@ -144,7 +144,7 @@ impl FlatBlockTraces { impl Encodable for FlatBlockTraces { fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.0, s); + s.append_list(&self.0); } } diff --git a/ethcore/src/types/trace_types/trace.rs b/ethcore/src/types/trace_types/trace.rs index 12df1de25..9c3377dac 100644 --- a/ethcore/src/types/trace_types/trace.rs +++ b/ethcore/src/types/trace_types/trace.rs @@ -475,7 +475,7 @@ impl Encodable for VMExecutedOperation { fn rlp_append(&self, s: &mut RlpStream) { s.begin_list(4); s.append(&self.gas_used); - s.append(&self.stack_push); + s.append_list(&self.stack_push); s.append(&self.mem_diff); s.append(&self.store_diff); } @@ -551,8 +551,8 @@ impl Encodable for VMTrace { s.begin_list(4); s.append(&self.parent_step); s.append(&self.code); - s.append(&self.operations); - s.append(&self.subs); + s.append_list(&self.operations); + s.append_list(&self.subs); } } diff --git a/ethcore/src/verification/verification.rs b/ethcore/src/verification/verification.rs index c2c932066..7fbeb29bb 100644 --- a/ethcore/src/verification/verification.rs +++ b/ethcore/src/verification/verification.rs @@ -395,7 +395,7 @@ mod tests { #[test] #[cfg_attr(feature="dev", allow(similar_names))] fn test_verify_block() { - use rlp::{RlpStream, Stream}; + use rlp::RlpStream; // Test against morden let mut good = Header::new(); @@ -460,7 +460,7 @@ mod tests { let good_uncles = vec![ good_uncle1.clone(), good_uncle2.clone() ]; let mut uncles_rlp = RlpStream::new(); - uncles_rlp.append(&good_uncles); + uncles_rlp.append_list(&good_uncles); let good_uncles_hash = uncles_rlp.as_raw().sha3(); let good_transactions_root = ordered_trie_root(good_transactions.iter().map(|t| ::rlp::encode::(t).to_vec())); diff --git a/hw/src/ledger.rs b/hw/src/ledger.rs index fca1d0c3a..bc449e251 100644 --- a/hw/src/ledger.rs +++ b/hw/src/ledger.rs @@ -271,7 +271,7 @@ impl Manager { chunk_size += size; } trace!("writing {:?}", &hid_chunk[..]); - let n = handle.write(&hid_chunk[0..chunk_size])?; + let n = handle.write(&hid_chunk[..])?; if n < chunk_size { return Err(Error::Protocol("Write data size mismatch")); } diff --git a/ipc/hypervisor/Cargo.toml b/ipc/hypervisor/Cargo.toml index 21955bdf3..8dc12d4bd 100644 --- a/ipc/hypervisor/Cargo.toml +++ b/ipc/hypervisor/Cargo.toml @@ -9,7 +9,7 @@ build = "build.rs" [dependencies] ethcore-ipc = { path = "../rpc" } -nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git" } +nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git", branch = "parity-1.7" } ethcore-ipc-nano = { path = "../nano" } semver = "0.5" log = "0.3" diff --git a/ipc/nano/Cargo.toml b/ipc/nano/Cargo.toml index 9948820fe..59e11aef1 100644 --- a/ipc/nano/Cargo.toml +++ b/ipc/nano/Cargo.toml @@ -8,6 +8,6 @@ license = "GPL-3.0" [dependencies] ethcore-ipc = { path = "../rpc" } -nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git" } +nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git", branch = "parity-1.7" } log = "0.3" lazy_static = "0.2" diff --git a/ipc/rpc/Cargo.toml b/ipc/rpc/Cargo.toml index d8be8b444..6f56b3c98 100644 --- a/ipc/rpc/Cargo.toml +++ b/ipc/rpc/Cargo.toml @@ -8,6 +8,6 @@ license = "GPL-3.0" [dependencies] ethcore-devtools = { path = "../../devtools" } -nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git" } +nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git", branch = "parity-1.7" } ethcore-util = { path = "../../util" } semver = "0.5" diff --git a/ipc/tests/Cargo.toml b/ipc/tests/Cargo.toml index 1e29c5c35..1dffa7cb5 100644 --- a/ipc/tests/Cargo.toml +++ b/ipc/tests/Cargo.toml @@ -11,7 +11,7 @@ path = "run.rs" ethcore-ipc = { path = "../rpc" } ethcore-devtools = { path = "../../devtools" } semver = "0.5" -nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git" } +nanomsg = { git = "https://github.com/ethcore/nanomsg.rs.git", branch = "parity-1.7" } ethcore-ipc-nano = { path = "../nano" } ethcore-util = { path = "../../util" } log = "0.3" diff --git a/ipfs/src/route.rs b/ipfs/src/route.rs index 5b571885d..fecafb264 100644 --- a/ipfs/src/route.rs +++ b/ipfs/src/route.rs @@ -79,7 +79,7 @@ impl IpfsHandler { fn block_list(&self, hash: H256) -> Result { let uncles = self.client().find_uncles(&hash).ok_or(Error::BlockNotFound)?; - Ok(Out::OctetStream(rlp::encode(&uncles).to_vec())) + Ok(Out::OctetStream(rlp::encode_list(&uncles).to_vec())) } /// Get transaction by hash and return as raw binary. diff --git a/js/package.json b/js/package.json index 61cdce158..9d50ebe07 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "parity.js", - "version": "1.7.18", + "version": "1.7.19", "main": "release/index.js", "jsnext:main": "src/index.js", "author": "Parity Team ", diff --git a/js/src/mobx/hardwareStore.js b/js/src/mobx/hardwareStore.js index 65213ad4e..46bf3fa58 100644 --- a/js/src/mobx/hardwareStore.js +++ b/js/src/mobx/hardwareStore.js @@ -120,20 +120,22 @@ export default class HardwareStore { }); } - createAccountInfo (entry) { + createAccountInfo (entry, original = {}) { const { address, manufacturer, name } = entry; return Promise .all([ - this._api.parity.setAccountName(address, name), - this._api.parity.setAccountMeta(address, { + original.name + ? Promise.resolve(true) + : this._api.parity.setAccountName(address, name), + this._api.parity.setAccountMeta(address, Object.assign({ description: `${manufacturer} ${name}`, hardware: { manufacturer }, tags: ['hardware'], timestamp: Date.now() - }) + }, original.meta || {})) ]) .catch((error) => { console.warn('HardwareStore::createEntry', error); diff --git a/js/src/mobx/hardwareStore.spec.js b/js/src/mobx/hardwareStore.spec.js index 14feb5740..784fc3f10 100644 --- a/js/src/mobx/hardwareStore.spec.js +++ b/js/src/mobx/hardwareStore.spec.js @@ -130,25 +130,58 @@ describe('mobx/HardwareStore', () => { describe('operations', () => { describe('createAccountInfo', () => { - beforeEach(() => { - return store.createAccountInfo({ - address: 'testAddr', - manufacturer: 'testMfg', - name: 'testName' + describe('when not existing', () => { + beforeEach(() => { + return store.createAccountInfo({ + address: 'testAddr', + manufacturer: 'testMfg', + name: 'testName' + }); + }); + + it('calls into parity_setAccountName', () => { + expect(api.parity.setAccountName).to.have.been.calledWith('testAddr', 'testName'); + }); + + it('calls into parity_setAccountMeta', () => { + expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({ + description: 'testMfg testName', + hardware: { + manufacturer: 'testMfg' + }, + tags: ['hardware'] + })); }); }); - it('calls into parity_setAccountName', () => { - expect(api.parity.setAccountName).to.have.been.calledWith('testAddr', 'testName'); - }); + describe('when already exists', () => { + beforeEach(() => { + return store.createAccountInfo({ + address: 'testAddr', + manufacturer: 'testMfg', + name: 'testName' + }, { + name: 'originalName', + meta: { + description: 'originalDescription', + tags: ['tagA', 'tagB'] + } + }); + }); - it('calls into parity_setAccountMeta', () => { - expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({ - description: 'testMfg testName', - hardware: { - manufacturer: 'testMfg' - } - })); + it('does not call into parity_setAccountName', () => { + expect(api.parity.setAccountName).not.to.have.been.called; + }); + + it('calls into parity_setAccountMeta', () => { + expect(api.parity.setAccountMeta).to.have.been.calledWith('testAddr', sinon.match({ + description: 'originalDescription', + hardware: { + manufacturer: 'testMfg' + }, + tags: ['tagA', 'tagB'] + })); + }); }); }); diff --git a/js/src/ui/Portal/portal.css b/js/src/ui/Portal/portal.css index 2e6ff8370..85e8be4f1 100644 --- a/js/src/ui/Portal/portal.css +++ b/js/src/ui/Portal/portal.css @@ -68,12 +68,13 @@ $popoverZ: 3600; } &.modal { + z-index: $modalZ; + &:not(.small) { bottom: $modalBottom; left: $modalLeft; right: $modalRight; top: $modalTop; - z-index: $modalZ; } /* TODO: Small Portals don't adjust their overall height like we have with the diff --git a/js/src/views/Accounts/accounts.js b/js/src/views/Accounts/accounts.js index 7067e8cb1..107fcc248 100644 --- a/js/src/views/Accounts/accounts.js +++ b/js/src/views/Accounts/accounts.js @@ -394,8 +394,12 @@ class Accounts extends Component { Object .keys(wallets) - .filter((address) => !accountsInfo[address]) - .forEach((address) => this.hwstore.createAccountInfo(wallets[address])); + .filter((address) => { + const account = accountsInfo[address]; + + return !account || !account.meta || !account.meta.hardware; + }) + .forEach((address) => this.hwstore.createAccountInfo(wallets[address], accountsInfo[address])); this.setVisibleAccounts(); } diff --git a/js/src/views/Accounts/accounts.spec.js b/js/src/views/Accounts/accounts.spec.js new file mode 100644 index 000000000..7bd798105 --- /dev/null +++ b/js/src/views/Accounts/accounts.spec.js @@ -0,0 +1,122 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { shallow } from 'enzyme'; +import React from 'react'; +import sinon from 'sinon'; + +import Accounts from './'; + +let api; +let component; +let hwstore; +let instance; +let redux; + +function createApi () { + api = {}; + + return api; +} + +function createHwStore (walletAddress = '0x456') { + hwstore = { + wallets: { + [walletAddress]: { + address: walletAddress + } + }, + createAccountInfo: sinon.stub() + }; + + return hwstore; +} + +function createRedux () { + redux = { + dispatch: sinon.stub(), + subscribe: sinon.stub(), + getState: () => { + return { + personal: { + accounts: {}, + accountsInfo: { + '0x123': { meta: '1' }, + '0x999': { meta: { hardware: {} } } + } + }, + balances: { + balances: {} + } + }; + } + }; + + return redux; +} + +function render (props = {}) { + component = shallow( + , + { + context: { + store: createRedux() + } + } + ).find('Accounts').shallow({ + context: { + api: createApi() + } + }); + instance = component.instance(); + + return component; +} + +describe('views/Accounts', () => { + beforeEach(() => { + render(); + }); + + it('renders defaults', () => { + expect(component).to.be.ok; + }); + + describe('instance event methods', () => { + describe('onHardwareChange', () => { + it('detects completely new entries', () => { + instance.hwstore = createHwStore(); + instance.onHardwareChange(); + + expect(hwstore.createAccountInfo).to.have.been.calledWith({ address: '0x456' }); + }); + + it('detects addressbook entries', () => { + instance.hwstore = createHwStore('0x123'); + instance.onHardwareChange(); + + expect(hwstore.createAccountInfo).to.have.been.calledWith({ address: '0x123' }, { meta: '1' }); + }); + + it('ignores existing hardware entries', () => { + instance.hwstore = createHwStore('0x999'); + instance.onHardwareChange(); + + expect(hwstore.createAccountInfo).not.to.have.been.called; + }); + }); + }); +}); diff --git a/js/src/views/Contract/Queries/queries.js b/js/src/views/Contract/Queries/queries.js index 299d1ee84..de939a93d 100644 --- a/js/src/views/Contract/Queries/queries.js +++ b/js/src/views/Contract/Queries/queries.js @@ -40,7 +40,6 @@ export default class Queries extends Component { if (!contract) { return null; } - const queries = contract.functions .filter((fn) => fn.constant) .sort(this._sortEntries); @@ -113,7 +112,12 @@ export default class Queries extends Component { } renderQuery (fn) { - const { values } = this.props; + const { abi } = fn; + let values = this.props.values[fn.name] || []; + + if (values && typeof values.slice === 'function') { + values = values.slice(); + } return (
@@ -125,40 +129,59 @@ export default class Queries extends Component { - { this.renderValue(values[fn.name], fn.outputs[0].kind.type) } + { + abi.outputs + .map((output, index) => this.renderValue(values[index], output, index)) + }
); } - renderValue (value, type) { - if (typeof value === 'undefined') { + renderValue (tokenValue, output, key) { + if (typeof tokenValue === 'undefined') { return null; } - const { api } = this.context; const { accountsInfo } = this.props; + const { name, type } = output; + const label = `${name ? `${name}: ` : ''}${type}`; + const value = this.getTokenValue(tokenValue); - let valueToDisplay = value; - - if (api.util.isArray(value)) { - valueToDisplay = api.util.bytesToHex(value); - } else if (typeof value === 'boolean') { - valueToDisplay = value ? 'true' : 'false'; - } return ( ); } + getTokenValue (token) { + const { api } = this.context; + const { type, value } = token; + + if (value === null || value === undefined) { + return 'no data'; + } + + if (type === 'array' || type === 'fixedArray') { + return value.map((tok) => this.getTokenValue(tok)); + } + + if (Array.isArray(value)) { + return api.util.bytesToHex(value); + } + + return value; + } + _sortEntries (a, b) { return a.name.localeCompare(b.name); } diff --git a/js/src/views/Contract/contract.js b/js/src/views/Contract/contract.js index 801bd3f43..9f75bcbe8 100644 --- a/js/src/views/Contract/contract.js +++ b/js/src/views/Contract/contract.js @@ -363,12 +363,15 @@ class Contract extends Component { .filter((fn) => !fn.inputs.length); Promise - .all(queries.map((query) => query.call())) + .all(queries.map((query) => query.call({ rawTokens: true }))) .then(results => { const values = queries.reduce((object, fn, idx) => { const key = fn.name; - object[key] = results[idx]; + object[key] = fn.outputs.length === 1 + ? [ results[idx] ] + : results[idx]; + return object; }, {}); diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index 1a5347eba..0b3cc4b82 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -16,7 +16,7 @@ serde_json = "0.9" serde_derive = "0.9" rustc-serialize = "0.3" time = "0.1" -transient-hashmap = "0.1" +transient-hashmap = "0.4" order-stat = "0.1" jsonrpc-core = { git = "https://github.com/ethcore/jsonrpc.git", branch = "parity-1.6" } jsonrpc-http-server = { git = "https://github.com/ethcore/jsonrpc.git", branch = "parity-1.6" } diff --git a/rpc/src/v1/helpers/dispatch.rs b/rpc/src/v1/helpers/dispatch.rs index 36d1b330f..8a99a7239 100644 --- a/rpc/src/v1/helpers/dispatch.rs +++ b/rpc/src/v1/helpers/dispatch.rs @@ -25,7 +25,7 @@ use light::cache::Cache as LightDataCache; use light::client::LightChainClient; use light::on_demand::{request, OnDemand}; use light::TransactionQueue as LightTransactionQueue; -use rlp::{self, Stream as StreamRlp}; +use rlp; use util::{Address, H520, H256, U256, Uint, Bytes, Mutex, RwLock}; use util::sha3::Hashable; use stats::Corpus; diff --git a/rpc/src/v1/helpers/mod.rs b/rpc/src/v1/helpers/mod.rs index ae8990cdc..76d34abdf 100644 --- a/rpc/src/v1/helpers/mod.rs +++ b/rpc/src/v1/helpers/mod.rs @@ -38,5 +38,6 @@ pub use self::requests::{ }; pub use self::signing_queue::{ ConfirmationsQueue, ConfirmationPromise, ConfirmationResult, SigningQueue, QueueEvent, DefaultAccount, + QUEUE_LIMIT as SIGNING_QUEUE_LIMIT, }; pub use self::signer::SignerService; diff --git a/rpc/src/v1/helpers/poll_manager.rs b/rpc/src/v1/helpers/poll_manager.rs index f6ca5ac62..ab44dc35f 100644 --- a/rpc/src/v1/helpers/poll_manager.rs +++ b/rpc/src/v1/helpers/poll_manager.rs @@ -19,7 +19,7 @@ use transient_hashmap::{TransientHashMap, Timer, StandardTimer}; /// Lifetime of poll (in seconds). -const POLL_LIFETIME: u64 = 60; +const POLL_LIFETIME: u32 = 60; pub type PollId = usize; diff --git a/rpc/src/v1/helpers/signer.rs b/rpc/src/v1/helpers/signer.rs index 56991f487..52c3e731d 100644 --- a/rpc/src/v1/helpers/signer.rs +++ b/rpc/src/v1/helpers/signer.rs @@ -23,7 +23,7 @@ use ethstore::random_string; use v1::helpers::signing_queue::{ConfirmationsQueue}; -const TOKEN_LIFETIME_SECS: u64 = 3600; +const TOKEN_LIFETIME_SECS: u32 = 3600; /// Manages communication with Signer crate pub struct SignerService { diff --git a/rpc/src/v1/helpers/signing_queue.rs b/rpc/src/v1/helpers/signing_queue.rs index 36563d061..70f116a4f 100644 --- a/rpc/src/v1/helpers/signing_queue.rs +++ b/rpc/src/v1/helpers/signing_queue.rs @@ -77,7 +77,7 @@ pub enum QueueAddError { } // TODO [todr] to consider: timeout instead of limit? -const QUEUE_LIMIT: usize = 50; +pub const QUEUE_LIMIT: usize = 50; /// A queue of transactions awaiting to be confirmed and signed. pub trait SigningQueue: Send + Sync { diff --git a/rpc/src/v1/impls/light/parity_set.rs b/rpc/src/v1/impls/light/parity_set.rs index 2127db345..40af2f44c 100644 --- a/rpc/src/v1/impls/light/parity_set.rs +++ b/rpc/src/v1/impls/light/parity_set.rs @@ -28,7 +28,7 @@ use util::sha3; use jsonrpc_core::Error; use v1::helpers::errors; use v1::traits::ParitySet; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo}; +use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; /// Parity-specific rpc interface for operations altering the settings. pub struct ParitySetClient { @@ -139,4 +139,8 @@ impl ParitySet for ParitySetClient { fn execute_upgrade(&self) -> Result { Err(errors::light_unimplemented(None)) } + + fn remove_transaction(&self, _hash: H256) -> Result, Error> { + Err(errors::light_unimplemented(None)) + } } diff --git a/rpc/src/v1/impls/parity_set.rs b/rpc/src/v1/impls/parity_set.rs index 0c844c163..19483635c 100644 --- a/rpc/src/v1/impls/parity_set.rs +++ b/rpc/src/v1/impls/parity_set.rs @@ -30,15 +30,10 @@ use updater::{Service as UpdateService}; use jsonrpc_core::Error; use v1::helpers::errors; use v1::traits::ParitySet; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo}; +use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; /// Parity-specific rpc interface for operations altering the settings. -pub struct ParitySetClient where - C: MiningBlockChainClient, - M: MinerService, - U: UpdateService, - F: Fetch, -{ +pub struct ParitySetClient { client: Weak, miner: Weak, updater: Weak, @@ -46,12 +41,7 @@ pub struct ParitySetClient where fetch: F, } -impl ParitySetClient where - C: MiningBlockChainClient, - M: MinerService, - U: UpdateService, - F: Fetch, -{ +impl ParitySetClient { /// Creates new `ParitySetClient` with given `Fetch`. pub fn new(client: &Arc, miner: &Arc, updater: &Arc, net: &Arc, fetch: F) -> Self { ParitySetClient { @@ -181,4 +171,12 @@ impl ParitySet for ParitySetClient where let updater = take_weak!(self.updater); Ok(updater.execute_upgrade()) } + + fn remove_transaction(&self, hash: H256) -> Result, Error> { + let miner = take_weak!(self.miner); + let client = take_weak!(self.client); + let hash = hash.into(); + + Ok(miner.remove_pending_transaction(&*client, &hash).map(Into::into)) + } } diff --git a/rpc/src/v1/impls/signing.rs b/rpc/src/v1/impls/signing.rs index d737131a6..dcda6fa9e 100644 --- a/rpc/src/v1/impls/signing.rs +++ b/rpc/src/v1/impls/signing.rs @@ -27,7 +27,7 @@ use jsonrpc_core::Error; use v1::helpers::{ errors, DefaultAccount, - SigningQueue, ConfirmationPromise, ConfirmationResult, SignerService + SIGNING_QUEUE_LIMIT, SigningQueue, ConfirmationPromise, ConfirmationResult, SignerService }; use v1::helpers::dispatch::{self, Dispatcher}; use v1::metadata::Metadata; @@ -42,7 +42,10 @@ use v1::types::{ Origin, }; -const MAX_PENDING_DURATION: u64 = 60 * 60; +/// After 60s entries that are not queried with `check_request` will get garbage collected. +const MAX_PENDING_DURATION_SEC: u32 = 60; +/// Max number of total requests pending and completed, before we start garbage collecting them. +const MAX_TOTAL_REQUESTS: usize = SIGNING_QUEUE_LIMIT; enum DispatchResult { Promise(ConfirmationPromise), @@ -71,6 +74,21 @@ fn handle_dispatch(res: Result, on_response: } } +fn collect_garbage(map: &mut TransientHashMap) { + map.prune(); + if map.len() > MAX_TOTAL_REQUESTS { + // Remove all non-waiting entries. + let non_waiting: Vec<_> = map + .iter() + .filter(|&(_, val)| val.result() != ConfirmationResult::Waiting) + .map(|(key, _)| *key) + .collect(); + for k in non_waiting { + map.remove(&k); + } + } +} + impl SigningQueueClient { /// Creates a new signing queue client given shared signing queue. pub fn new(signer: &Arc, dispatcher: D, accounts: &Arc) -> Self { @@ -78,7 +96,7 @@ impl SigningQueueClient { signer: Arc::downgrade(signer), accounts: Arc::downgrade(accounts), dispatcher: dispatcher, - pending: Arc::new(Mutex::new(TransientHashMap::new(MAX_PENDING_DURATION))), + pending: Arc::new(Mutex::new(TransientHashMap::new(MAX_PENDING_DURATION_SEC))), } } @@ -124,7 +142,10 @@ impl ParitySigning for SigningQueueClient { DispatchResult::Value(v) => RpcEither::Or(v), DispatchResult::Promise(promise) => { let id = promise.id(); - pending.lock().insert(id, promise); + let mut pending = pending.lock(); + collect_garbage(&mut pending); + pending.insert(id, promise); + RpcEither::Either(id.into()) }, }) @@ -138,7 +159,10 @@ impl ParitySigning for SigningQueueClient { DispatchResult::Value(v) => RpcEither::Or(v), DispatchResult::Promise(promise) => { let id = promise.id(); - pending.lock().insert(id, promise); + let mut pending = pending.lock(); + collect_garbage(&mut pending); + pending.insert(id, promise); + RpcEither::Either(id.into()) }, }) @@ -146,18 +170,15 @@ impl ParitySigning for SigningQueueClient { } fn check_request(&self, id: RpcU256) -> Result, Error> { - let mut pending = self.pending.lock(); let id: U256 = id.into(); - let res = match pending.get(&id) { + match self.pending.lock().get(&id) { Some(ref promise) => match promise.result() { - ConfirmationResult::Waiting => { return Ok(None); } + ConfirmationResult::Waiting => Ok(None), ConfirmationResult::Rejected => Err(errors::request_rejected()), ConfirmationResult::Confirmed(rpc_response) => rpc_response.map(Some), }, - _ => { return Err(errors::request_not_found()); } - }; - pending.remove(&id); - res + _ => Err(errors::request_not_found()), + } } fn decrypt_message(&self, meta: Metadata, address: RpcH160, data: RpcBytes) -> BoxFuture { diff --git a/rpc/src/v1/tests/helpers/miner_service.rs b/rpc/src/v1/tests/helpers/miner_service.rs index f84431e6e..4cdfbbd8c 100644 --- a/rpc/src/v1/tests/helpers/miner_service.rs +++ b/rpc/src/v1/tests/helpers/miner_service.rs @@ -221,6 +221,10 @@ impl MinerService for TestMinerService { self.pending_transactions.lock().get(hash).cloned().map(Into::into) } + fn remove_pending_transaction(&self, _chain: &MiningBlockChainClient, hash: &H256) -> Option { + self.pending_transactions.lock().remove(hash).map(Into::into) + } + fn pending_transactions(&self) -> Vec { self.pending_transactions.lock().values().cloned().map(Into::into).collect() } diff --git a/rpc/src/v1/tests/mocked/parity_set.rs b/rpc/src/v1/tests/mocked/parity_set.rs index 337090499..65d69775a 100644 --- a/rpc/src/v1/tests/mocked/parity_set.rs +++ b/rpc/src/v1/tests/mocked/parity_set.rs @@ -204,3 +204,31 @@ fn rpc_parity_set_hash_content() { assert_eq!(io.handle_request_sync(request), Some(response.to_owned())); } +#[test] +fn rpc_parity_remove_transaction() { + use ethcore::transaction::{Transaction, Action}; + + let miner = miner_service(); + let client = client_service(); + let network = network_service(); + let updater = updater_service(); + let mut io = IoHandler::new(); + io.extend_with(parity_set_client(&client, &miner, &updater, &network).to_delegate()); + + let tx = Transaction { + nonce: 1.into(), + gas_price: 0x9184e72a000u64.into(), + gas: 0x76c0.into(), + action: Action::Call(5.into()), + value: 0x9184e72au64.into(), + data: vec![] + }; + let signed = tx.fake_sign(2.into()); + let hash = signed.hash(); + + let request = r#"{"jsonrpc": "2.0", "method": "parity_removeTransaction", "params":[""#.to_owned() + &format!("0x{:?}", hash) + r#""], "id": 1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":null,"condition":null,"creates":null,"from":"0x0000000000000000000000000000000000000002","gas":"0x76c0","gasPrice":"0x9184e72a000","hash":"0x0072c69d780cdfbfc02fed5c7d184151f9a166971d045e55e27695aaa5bcb55e","input":"0x","networkId":null,"nonce":"0x1","publicKey":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","r":"0x0","raw":"0xe9018609184e72a0008276c0940000000000000000000000000000000000000005849184e72a80808080","s":"0x0","standardV":"0x4","to":"0x0000000000000000000000000000000000000005","transactionIndex":null,"v":"0x0","value":"0x9184e72a"},"id":1}"#; + + miner.pending_transactions.lock().insert(hash, signed); + assert_eq!(io.handle_request_sync(&request), Some(response.to_owned())); +} diff --git a/rpc/src/v1/traits/parity_set.rs b/rpc/src/v1/traits/parity_set.rs index d5fc066fa..b91b33574 100644 --- a/rpc/src/v1/traits/parity_set.rs +++ b/rpc/src/v1/traits/parity_set.rs @@ -19,7 +19,7 @@ use jsonrpc_core::Error; use futures::BoxFuture; -use v1::types::{Bytes, H160, H256, U256, ReleaseInfo}; +use v1::types::{Bytes, H160, H256, U256, ReleaseInfo, Transaction}; build_rpc_trait! { /// Parity-specific rpc interface for operations altering the settings. @@ -103,5 +103,14 @@ build_rpc_trait! { /// Execute a release which is ready according to upgrade_ready(). #[rpc(name = "parity_executeUpgrade")] fn execute_upgrade(&self) -> Result; + + /// Removes transaction from transaction queue. + /// Makes sense only for transactions that were not propagated to other peers yet + /// like scheduled transactions or transactions in future. + /// It might also work for some local transactions with to low gas price + /// or excessive gas limit that are not accepted by other peers whp. + /// Returns `true` when transaction was removed, `false` if it was not found. + #[rpc(name = "parity_removeTransaction")] + fn remove_transaction(&self, H256) -> Result, Error>; } } diff --git a/scripts/parity.service b/scripts/parity.service index 9a2a1f29f..b798908bb 100644 --- a/scripts/parity.service +++ b/scripts/parity.service @@ -1,5 +1,6 @@ [Unit] Description=Parity Daemon +After=network.target [Service] EnvironmentFile=%h/.parity/parity.conf diff --git a/sync/src/chain.rs b/sync/src/chain.rs index 2212876d1..415b44a39 100644 --- a/sync/src/chain.rs +++ b/sync/src/chain.rs @@ -2177,7 +2177,7 @@ mod tests { use util::sha3::Hashable; use util::hash::H256; use util::bytes::Bytes; - use rlp::{Rlp, RlpStream, UntrustedRlp, View, Stream}; + use rlp::{Rlp, RlpStream, UntrustedRlp, View}; use super::*; use ::SyncConfig; use super::{PeerInfo, PeerAsking}; diff --git a/util/network/src/discovery.rs b/util/network/src/discovery.rs index f3a8aa523..ae4c7e565 100644 --- a/util/network/src/discovery.rs +++ b/util/network/src/discovery.rs @@ -213,7 +213,7 @@ impl Discovery { let nearest = Discovery::nearest_node_entries(&self.discovery_id, &self.node_buckets).into_iter(); let nearest = nearest.filter(|x| !self.discovery_nodes.contains(&x.id)).take(ALPHA).collect::>(); for r in nearest { - let rlp = encode(&(&[self.discovery_id.clone()][..])); + let rlp = encode_list(&(&[self.discovery_id.clone()][..])); self.send_packet(PACKET_FIND_NODE, &r.endpoint.udp_address(), &rlp); self.discovery_nodes.insert(r.id.clone()); tried_count += 1; diff --git a/util/network/src/session.rs b/util/network/src/session.rs index dc4a5464c..bc416b8d8 100644 --- a/util/network/src/session.rs +++ b/util/network/src/session.rs @@ -59,8 +59,8 @@ pub struct Session { ping_time_ns: u64, pong_time_ns: Option, state: State, - // Protocol states -- accumulates pending packets until signaled as ready. - protocol_states: HashMap, + // Protocol states -- accumulates pending packets until signaled as ready. + protocol_states: HashMap, } enum State { @@ -198,7 +198,7 @@ impl Session { ping_time_ns: 0, pong_time_ns: None, expired: false, - protocol_states: HashMap::new(), + protocol_states: HashMap::new(), }) } @@ -374,16 +374,16 @@ impl Session { self.connection().token() } - /// Signal that a subprotocol has handled the connection successfully and + /// Signal that a subprotocol has handled the connection successfully and /// get all pending packets in order received. pub fn mark_connected(&mut self, protocol: ProtocolId) -> Vec<(ProtocolId, u8, Vec)> { match self.protocol_states.insert(protocol, ProtocolState::Connected) { - None => Vec::new(), + None => Vec::new(), Some(ProtocolState::Connected) => { debug!(target: "network", "Protocol {:?} marked as connected more than once", protocol); Vec::new() } - Some(ProtocolState::Pending(pending)) => + Some(ProtocolState::Pending(pending)) => pending.into_iter().map(|(data, id)| (protocol, id, data)).collect(), } } @@ -463,7 +463,7 @@ impl Session { rlp.begin_list(5) .append(&host.protocol_version) .append(&host.client_version) - .append(&host.capabilities) + .append_list(&host.capabilities) .append(&host.local_endpoint.address.port()) .append(host.id()); self.send(io, rlp) @@ -515,7 +515,7 @@ impl Session { self.info.protocol_version = protocol; self.info.client_version = client_version; self.info.capabilities = caps; - self.info.peer_capabilities = peer_caps; + self.info.peer_capabilities = peer_caps; if self.info.capabilities.is_empty() { trace!(target: "network", "No common capabilities with peer."); return Err(From::from(self.disconnect(io, DisconnectReason::UselessPeer))); diff --git a/util/rlp/Cargo.toml b/util/rlp/Cargo.toml index ae6b4accd..4f31e9467 100644 --- a/util/rlp/Cargo.toml +++ b/util/rlp/Cargo.toml @@ -10,3 +10,4 @@ elastic-array = { git = "https://github.com/ethcore/elastic-array" } ethcore-bigint = { path = "../bigint" } lazy_static = "0.2" rustc-serialize = "0.3" +byteorder = "1.0" diff --git a/util/rlp/src/bytes.rs b/util/rlp/src/bytes.rs index 30d434203..e5f266f92 100644 --- a/util/rlp/src/bytes.rs +++ b/util/rlp/src/bytes.rs @@ -17,152 +17,9 @@ //! Unified interfaces for RLP bytes operations on basic types //! -use std::mem; -use std::fmt; -use std::cmp::Ordering; +use std::{mem, fmt, cmp}; use std::error::Error as StdError; -use bigint::prelude::{Uint, U128, U256, H64, H128, H160, H256, H512, H520, H2048}; -use elastic_array::*; - -/// Vector like object -pub trait VecLike { - /// Add an element to the collection - fn vec_push(&mut self, value: T); - - /// Add a slice to the collection - fn vec_extend(&mut self, slice: &[T]); -} - -impl VecLike for Vec where T: Copy { - fn vec_push(&mut self, value: T) { - Vec::::push(self, value) - } - - fn vec_extend(&mut self, slice: &[T]) { - Vec::::extend_from_slice(self, slice) - } -} - -macro_rules! impl_veclike_for_elastic_array { - ($from: ident) => { - impl VecLike for $from where T: Copy { - fn vec_push(&mut self, value: T) { - $from::::push(self, value) - } - fn vec_extend(&mut self, slice: &[T]) { - $from::::append_slice(self, slice) - - } - } - } -} - -impl_veclike_for_elastic_array!(ElasticArray16); -impl_veclike_for_elastic_array!(ElasticArray32); -impl_veclike_for_elastic_array!(ElasticArray1024); - -/// Converts given type to its shortest representation in bytes -/// -/// TODO: optimise some conversations -pub trait ToBytes { - /// Serialize self to byte array - fn to_bytes>(&self, out: &mut V); - /// Get length of serialized data in bytes - fn to_bytes_len(&self) -> usize; -} - -impl <'a> ToBytes for &'a str { - fn to_bytes>(&self, out: &mut V) { - out.vec_extend(self.as_bytes()); - } - - fn to_bytes_len(&self) -> usize { - self.as_bytes().len() - } -} - -impl ToBytes for String { - fn to_bytes>(&self, out: &mut V) { - out.vec_extend(self.as_bytes()); - } - - fn to_bytes_len(&self) -> usize { - self.len() - } -} - -impl ToBytes for u64 { - fn to_bytes>(&self, out: &mut V) { - let count = self.to_bytes_len(); - for i in 0..count { - let j = count - 1 - i; - out.vec_push((*self >> (j * 8)) as u8); - } - } - - fn to_bytes_len(&self) -> usize { 8 - self.leading_zeros() as usize / 8 } -} - -impl ToBytes for bool { - fn to_bytes>(&self, out: &mut V) { - out.vec_push(if *self { 1u8 } else { 0u8 }) - } - - fn to_bytes_len(&self) -> usize { 1 } -} - -macro_rules! impl_map_to_bytes { - ($from: ident, $to: ty) => { - impl ToBytes for $from { - fn to_bytes>(&self, out: &mut V) { - (*self as $to).to_bytes(out) - } - - fn to_bytes_len(&self) -> usize { (*self as $to).to_bytes_len() } - } - } -} - -impl_map_to_bytes!(usize, u64); -impl_map_to_bytes!(u16, u64); -impl_map_to_bytes!(u32, u64); - -macro_rules! impl_uint_to_bytes { - ($name: ident) => { - impl ToBytes for $name { - fn to_bytes>(&self, out: &mut V) { - let count = self.to_bytes_len(); - for i in 0..count { - let j = count - 1 - i; - out.vec_push(self.byte(j)); - } - } - fn to_bytes_len(&self) -> usize { (self.bits() + 7) / 8 } - } - } -} - -impl_uint_to_bytes!(U256); -impl_uint_to_bytes!(U128); - -macro_rules! impl_hash_to_bytes { - ($name: ident) => { - impl ToBytes for $name { - fn to_bytes>(&self, out: &mut V) { - out.vec_extend(&self); - } - fn to_bytes_len(&self) -> usize { self.len() } - } - } -} - -impl_hash_to_bytes!(H64); -impl_hash_to_bytes!(H128); -impl_hash_to_bytes!(H160); -impl_hash_to_bytes!(H256); -impl_hash_to_bytes!(H512); -impl_hash_to_bytes!(H520); -impl_hash_to_bytes!(H2048); +use bigint::prelude::{U128, U256, H64, H128, H160, H256, H512, H520, H2048}; /// Error returned when `FromBytes` conversation goes wrong #[derive(Debug, PartialEq, Eq)] @@ -268,9 +125,9 @@ macro_rules! impl_hash_from_bytes { impl FromBytes for $name { fn from_bytes(bytes: &[u8]) -> FromBytesResult<$name> { match bytes.len().cmp(&$size) { - Ordering::Less => Err(FromBytesError::DataIsTooShort), - Ordering::Greater => Err(FromBytesError::DataIsTooLong), - Ordering::Equal => { + cmp::Ordering::Less => Err(FromBytesError::DataIsTooShort), + cmp::Ordering::Greater => Err(FromBytesError::DataIsTooLong), + cmp::Ordering::Equal => { let mut t = [0u8; $size]; t.copy_from_slice(bytes); Ok($name(t)) diff --git a/util/rlp/src/commonrlps.rs b/util/rlp/src/common.rs similarity index 98% rename from util/rlp/src/commonrlps.rs rename to util/rlp/src/common.rs index 4dd8788cd..0be63864a 100644 --- a/util/rlp/src/commonrlps.rs +++ b/util/rlp/src/common.rs @@ -16,7 +16,7 @@ //! Contains RLPs used for compression. -use rlpcompression::InvalidRlpSwapper; +use compression::InvalidRlpSwapper; lazy_static! { /// Swapper for snapshot compression. @@ -47,4 +47,4 @@ static COMMON_RLPS: &'static [&'static [u8]] = &[ &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ]; -static INVALID_RLPS: &'static [&'static [u8]] = &[&[0x81, 0x0], &[0x81, 0x1], &[0x81, 0x2], &[0x81, 0x3], &[0x81, 0x4], &[0x81, 0x5], &[0x81, 0x6], &[0x81, 0x7], &[0x81, 0x8], &[0x81, 0x9], &[0x81, 0xa], &[0x81, 0xb], &[0x81, 0xc], &[0x81, 0xd], &[0x81, 0xe], &[0x81, 0xf], &[0x81, 0x10], &[0x81, 0x11], &[0x81, 0x12], &[0x81, 0x13], &[0x81, 0x14], &[0x81, 0x15], &[0x81, 0x16], &[0x81, 0x17], &[0x81, 0x18], &[0x81, 0x19], &[0x81, 0x1a], &[0x81, 0x1b], &[0x81, 0x1c], &[0x81, 0x1d], &[0x81, 0x1e], &[0x81, 0x1f], &[0x81, 0x20], &[0x81, 0x21], &[0x81, 0x22], &[0x81, 0x23], &[0x81, 0x24], &[0x81, 0x25], &[0x81, 0x26], &[0x81, 0x27], &[0x81, 0x28], &[0x81, 0x29], &[0x81, 0x2a], &[0x81, 0x2b], &[0x81, 0x2c], &[0x81, 0x2d], &[0x81, 0x2e], &[0x81, 0x2f], &[0x81, 0x30], &[0x81, 0x31], &[0x81, 0x32], &[0x81, 0x33], &[0x81, 0x34], &[0x81, 0x35], &[0x81, 0x36], &[0x81, 0x37], &[0x81, 0x38], &[0x81, 0x39], &[0x81, 0x3a], &[0x81, 0x3b], &[0x81, 0x3c], &[0x81, 0x3d], &[0x81, 0x3e], &[0x81, 0x3f], &[0x81, 0x40], &[0x81, 0x41], &[0x81, 0x42], &[0x81, 0x43], &[0x81, 0x44], &[0x81, 0x45], &[0x81, 0x46], &[0x81, 0x47], &[0x81, 0x48], &[0x81, 0x49], &[0x81, 0x4a], &[0x81, 0x4b], &[0x81, 0x4c], &[0x81, 0x4d], &[0x81, 0x4e], &[0x81, 0x4f], &[0x81, 0x50], &[0x81, 0x51], &[0x81, 0x52], &[0x81, 0x53], &[0x81, 0x54], &[0x81, 0x55], &[0x81, 0x56], &[0x81, 0x57], &[0x81, 0x58], &[0x81, 0x59], &[0x81, 0x5a], &[0x81, 0x5b], &[0x81, 0x5c], &[0x81, 0x5d], &[0x81, 0x5e], &[0x81, 0x5f], &[0x81, 0x60], &[0x81, 0x61], &[0x81, 0x62], &[0x81, 0x63], &[0x81, 0x64], &[0x81, 0x65], &[0x81, 0x66], &[0x81, 0x67], &[0x81, 0x68], &[0x81, 0x69], &[0x81, 0x6a], &[0x81, 0x6b], &[0x81, 0x6c], &[0x81, 0x6d], &[0x81, 0x6e], &[0x81, 0x6f], &[0x81, 0x70], &[0x81, 0x71], &[0x81, 0x72], &[0x81, 0x73], &[0x81, 0x74], &[0x81, 0x75], &[0x81, 0x76], &[0x81, 0x77], &[0x81, 0x78], &[0x81, 0x79], &[0x81, 0x7a], &[0x81, 0x7b], &[0x81, 0x7c], &[0x81, 0x7d], &[0x81, 0x7e]]; \ No newline at end of file +static INVALID_RLPS: &'static [&'static [u8]] = &[&[0x81, 0x0], &[0x81, 0x1], &[0x81, 0x2], &[0x81, 0x3], &[0x81, 0x4], &[0x81, 0x5], &[0x81, 0x6], &[0x81, 0x7], &[0x81, 0x8], &[0x81, 0x9], &[0x81, 0xa], &[0x81, 0xb], &[0x81, 0xc], &[0x81, 0xd], &[0x81, 0xe], &[0x81, 0xf], &[0x81, 0x10], &[0x81, 0x11], &[0x81, 0x12], &[0x81, 0x13], &[0x81, 0x14], &[0x81, 0x15], &[0x81, 0x16], &[0x81, 0x17], &[0x81, 0x18], &[0x81, 0x19], &[0x81, 0x1a], &[0x81, 0x1b], &[0x81, 0x1c], &[0x81, 0x1d], &[0x81, 0x1e], &[0x81, 0x1f], &[0x81, 0x20], &[0x81, 0x21], &[0x81, 0x22], &[0x81, 0x23], &[0x81, 0x24], &[0x81, 0x25], &[0x81, 0x26], &[0x81, 0x27], &[0x81, 0x28], &[0x81, 0x29], &[0x81, 0x2a], &[0x81, 0x2b], &[0x81, 0x2c], &[0x81, 0x2d], &[0x81, 0x2e], &[0x81, 0x2f], &[0x81, 0x30], &[0x81, 0x31], &[0x81, 0x32], &[0x81, 0x33], &[0x81, 0x34], &[0x81, 0x35], &[0x81, 0x36], &[0x81, 0x37], &[0x81, 0x38], &[0x81, 0x39], &[0x81, 0x3a], &[0x81, 0x3b], &[0x81, 0x3c], &[0x81, 0x3d], &[0x81, 0x3e], &[0x81, 0x3f], &[0x81, 0x40], &[0x81, 0x41], &[0x81, 0x42], &[0x81, 0x43], &[0x81, 0x44], &[0x81, 0x45], &[0x81, 0x46], &[0x81, 0x47], &[0x81, 0x48], &[0x81, 0x49], &[0x81, 0x4a], &[0x81, 0x4b], &[0x81, 0x4c], &[0x81, 0x4d], &[0x81, 0x4e], &[0x81, 0x4f], &[0x81, 0x50], &[0x81, 0x51], &[0x81, 0x52], &[0x81, 0x53], &[0x81, 0x54], &[0x81, 0x55], &[0x81, 0x56], &[0x81, 0x57], &[0x81, 0x58], &[0x81, 0x59], &[0x81, 0x5a], &[0x81, 0x5b], &[0x81, 0x5c], &[0x81, 0x5d], &[0x81, 0x5e], &[0x81, 0x5f], &[0x81, 0x60], &[0x81, 0x61], &[0x81, 0x62], &[0x81, 0x63], &[0x81, 0x64], &[0x81, 0x65], &[0x81, 0x66], &[0x81, 0x67], &[0x81, 0x68], &[0x81, 0x69], &[0x81, 0x6a], &[0x81, 0x6b], &[0x81, 0x6c], &[0x81, 0x6d], &[0x81, 0x6e], &[0x81, 0x6f], &[0x81, 0x70], &[0x81, 0x71], &[0x81, 0x72], &[0x81, 0x73], &[0x81, 0x74], &[0x81, 0x75], &[0x81, 0x76], &[0x81, 0x77], &[0x81, 0x78], &[0x81, 0x79], &[0x81, 0x7a], &[0x81, 0x7b], &[0x81, 0x7c], &[0x81, 0x7d], &[0x81, 0x7e]]; diff --git a/util/rlp/src/rlpcompression.rs b/util/rlp/src/compression.rs similarity index 97% rename from util/rlp/src/rlpcompression.rs rename to util/rlp/src/compression.rs index e26105a24..b7cf72a4f 100644 --- a/util/rlp/src/rlpcompression.rs +++ b/util/rlp/src/compression.rs @@ -14,11 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . -use ::{UntrustedRlp, View, Compressible, encode, Stream, RlpStream}; -use commonrlps::{BLOCKS_RLP_SWAPPER, SNAPSHOT_RLP_SWAPPER}; - use std::collections::HashMap; use elastic_array::ElasticArray1024; +use common::{BLOCKS_RLP_SWAPPER, SNAPSHOT_RLP_SWAPPER}; +use {UntrustedRlp, View, Compressible, encode, RlpStream}; /// Stores RLPs used for compression pub struct InvalidRlpSwapper<'a> { @@ -149,8 +148,6 @@ fn deep_decompress(rlp: &UntrustedRlp, swapper: &InvalidRlpSwapper) -> Option Compressible for UntrustedRlp<'a> { type DataType = RlpType; @@ -171,8 +168,8 @@ impl<'a> Compressible for UntrustedRlp<'a> { #[cfg(test)] mod tests { - use ::{UntrustedRlp, Compressible, View, RlpType}; - use rlpcompression::InvalidRlpSwapper; + use compression::InvalidRlpSwapper; + use {UntrustedRlp, Compressible, View, RlpType}; #[test] fn invalid_rlp_swapper() { diff --git a/util/rlp/src/rlperrors.rs b/util/rlp/src/error.rs similarity index 100% rename from util/rlp/src/rlperrors.rs rename to util/rlp/src/error.rs diff --git a/util/rlp/src/impls.rs b/util/rlp/src/impls.rs new file mode 100644 index 000000000..affac1ddc --- /dev/null +++ b/util/rlp/src/impls.rs @@ -0,0 +1,120 @@ +use byteorder::{ByteOrder, BigEndian}; +use bigint::prelude::{Uint, U128, U256, H64, H128, H160, H256, H512, H520, H2048}; +use traits::Encodable; +use stream::RlpStream; + +impl Encodable for bool { + fn rlp_append(&self, s: &mut RlpStream) { + if *self { + s.encoder().encode_value(&[1]); + } else { + s.encoder().encode_value(&[0]); + } + } +} + +impl<'a> Encodable for &'a [u8] { + fn rlp_append(&self, s: &mut RlpStream) { + s.encoder().encode_value(self); + } +} + +impl Encodable for Vec { + fn rlp_append(&self, s: &mut RlpStream) { + s.encoder().encode_value(self); + } +} + +impl Encodable for Option where T: Encodable { + fn rlp_append(&self, s: &mut RlpStream) { + match *self { + None => { + s.begin_list(0); + }, + Some(ref value) => { + s.begin_list(1); + s.append(value); + } + } + } +} + +impl Encodable for u8 { + fn rlp_append(&self, s: &mut RlpStream) { + if *self != 0 { + s.encoder().encode_value(&[*self]); + } else { + s.encoder().encode_value(&[]); + } + } +} + +macro_rules! impl_encodable_for_u { + ($name: ident, $func: ident, $size: expr) => { + impl Encodable for $name { + fn rlp_append(&self, s: &mut RlpStream) { + let leading_empty_bytes = self.leading_zeros() as usize / 8; + let mut buffer = [0u8; $size]; + BigEndian::$func(&mut buffer, *self); + s.encoder().encode_value(&buffer[leading_empty_bytes..]); + } + } + } +} + +impl_encodable_for_u!(u16, write_u16, 2); +impl_encodable_for_u!(u32, write_u32, 4); +impl_encodable_for_u!(u64, write_u64, 8); + +impl Encodable for usize { + fn rlp_append(&self, s: &mut RlpStream) { + (*self as u64).rlp_append(s); + } +} + +macro_rules! impl_encodable_for_hash { + ($name: ident) => { + impl Encodable for $name { + fn rlp_append(&self, s: &mut RlpStream) { + s.encoder().encode_value(self); + } + } + } +} + +impl_encodable_for_hash!(H64); +impl_encodable_for_hash!(H128); +impl_encodable_for_hash!(H160); +impl_encodable_for_hash!(H256); +impl_encodable_for_hash!(H512); +impl_encodable_for_hash!(H520); +impl_encodable_for_hash!(H2048); + +macro_rules! impl_encodable_for_uint { + ($name: ident, $size: expr) => { + impl Encodable for $name { + fn rlp_append(&self, s: &mut RlpStream) { + let leading_empty_bytes = $size - (self.bits() + 7) / 8; + let mut buffer = [0u8; $size]; + self.to_big_endian(&mut buffer); + s.encoder().encode_value(&buffer[leading_empty_bytes..]); + } + } + } +} + +impl_encodable_for_uint!(U256, 32); +impl_encodable_for_uint!(U128, 16); + +impl<'a> Encodable for &'a str { + fn rlp_append(&self, s: &mut RlpStream) { + s.encoder().encode_value(self.as_bytes()); + } +} + +impl Encodable for String { + fn rlp_append(&self, s: &mut RlpStream) { + s.encoder().encode_value(self.as_bytes()); + } +} + diff --git a/util/rlp/src/lib.rs b/util/rlp/src/lib.rs index d060a2d23..406501b1e 100644 --- a/util/rlp/src/lib.rs +++ b/util/rlp/src/lib.rs @@ -46,25 +46,7 @@ //! * You want to get view onto rlp-slice. //! * You don't want to decode whole rlp at once. -pub mod rlptraits; -mod rlperrors; -mod rlpin; -mod untrusted_rlp; -mod rlpstream; -mod rlpcompression; -mod commonrlps; -mod bytes; - -#[cfg(test)] -mod tests; - -pub use self::rlperrors::DecoderError; -pub use self::rlptraits::{Decoder, Decodable, View, Stream, Encodable, Encoder, RlpEncodable, RlpDecodable, Compressible}; -pub use self::untrusted_rlp::{UntrustedRlp, UntrustedRlpIterator, PayloadInfo, Prototype}; -pub use self::rlpin::{Rlp, RlpIterator}; -pub use self::rlpstream::RlpStream; -pub use self::rlpcompression::RlpType; - +extern crate byteorder; extern crate ethcore_bigint as bigint; extern crate elastic_array; extern crate rustc_serialize; @@ -72,8 +54,29 @@ extern crate rustc_serialize; #[macro_use] extern crate lazy_static; +mod traits; +mod error; +mod rlpin; +mod untrusted_rlp; +mod stream; +mod compression; +mod common; +mod bytes; +mod impls; + +#[cfg(test)] +mod tests; + +use std::borrow::Borrow; use elastic_array::ElasticArray1024; +pub use error::DecoderError; +pub use traits::{Decoder, Decodable, View, Encodable, RlpDecodable, Compressible}; +pub use untrusted_rlp::{UntrustedRlp, UntrustedRlpIterator, PayloadInfo, Prototype}; +pub use rlpin::{Rlp, RlpIterator}; +pub use stream::RlpStream; +pub use compression::RlpType; + /// The RLP encoded empty data (used to mean "null value"). pub const NULL_RLP: [u8; 1] = [0x80; 1]; /// The RLP encoded empty list. @@ -106,8 +109,14 @@ pub fn decode(bytes: &[u8]) -> T where T: RlpDecodable { /// assert_eq!(out, vec![0x83, b'c', b'a', b't']); /// } /// ``` -pub fn encode(object: &E) -> ElasticArray1024 where E: RlpEncodable { +pub fn encode(object: &E) -> ElasticArray1024 where E: Encodable { let mut stream = RlpStream::new(); stream.append(object); stream.drain() } + +pub fn encode_list(object: &[K]) -> ElasticArray1024 where E: Encodable, K: Borrow { + let mut stream = RlpStream::new(); + stream.append_list(object); + stream.drain() +} diff --git a/util/rlp/src/rlpin.rs b/util/rlp/src/rlpin.rs index 81941a89b..7ae715649 100644 --- a/util/rlp/src/rlpin.rs +++ b/util/rlp/src/rlpin.rs @@ -16,7 +16,7 @@ use std::fmt; use rustc_serialize::hex::ToHex; -use ::{View, DecoderError, UntrustedRlp, PayloadInfo, Prototype, RlpDecodable}; +use {View, DecoderError, UntrustedRlp, PayloadInfo, Prototype, RlpDecodable}; impl<'a> From> for Rlp<'a> { fn from(rlp: UntrustedRlp<'a>) -> Rlp<'a> { diff --git a/util/rlp/src/rlpstream.rs b/util/rlp/src/rlpstream.rs deleted file mode 100644 index 190d69e31..000000000 --- a/util/rlp/src/rlpstream.rs +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2015-2017 Parity Technologies (UK) Ltd. -// This file is part of Parity. - -// Parity is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Parity is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Parity. If not, see . - -use elastic_array::*; - -use ::{Stream, Encoder, Encodable}; -use bytes::{ToBytes, VecLike}; -use rlptraits::{ByteEncodable, RlpEncodable}; - -#[derive(Debug, Copy, Clone)] -struct ListInfo { - position: usize, - current: usize, - max: usize, -} - -impl ListInfo { - fn new(position: usize, max: usize) -> ListInfo { - ListInfo { - position: position, - current: 0, - max: max, - } - } -} - -/// Appendable rlp encoder. -pub struct RlpStream { - unfinished_lists: ElasticArray16, - encoder: BasicEncoder, - finished_list: bool, -} - -impl Default for RlpStream { - fn default() -> Self { - RlpStream::new() - } -} - -impl Stream for RlpStream { - fn new() -> Self { - RlpStream { - unfinished_lists: ElasticArray16::new(), - encoder: BasicEncoder::new(), - finished_list: false, - } - } - - fn new_list(len: usize) -> Self { - let mut stream = RlpStream::new(); - stream.begin_list(len); - stream - } - - fn append<'a, E>(&'a mut self, value: &E) -> &'a mut Self where E: RlpEncodable { - self.finished_list = false; - value.rlp_append(self); - if !self.finished_list { - self.note_appended(1); - } - self - } - - fn begin_list(&mut self, len: usize) -> &mut RlpStream { - self.finished_list = false; - match len { - 0 => { - // we may finish, if the appended list len is equal 0 - self.encoder.bytes.push(0xc0u8); - self.note_appended(1); - self.finished_list = true; - }, - _ => { - let position = self.encoder.bytes.len(); - self.unfinished_lists.push(ListInfo::new(position, len)); - }, - } - - // return chainable self - self - } - - fn append_empty_data(&mut self) -> &mut RlpStream { - // self push raw item - self.encoder.bytes.push(0x80); - - // try to finish and prepend the length - self.note_appended(1); - - // return chainable self - self - } - - fn append_raw<'a>(&'a mut self, bytes: &[u8], item_count: usize) -> &'a mut RlpStream { - // push raw items - self.encoder.bytes.append_slice(bytes); - - // try to finish and prepend the length - self.note_appended(item_count); - - // return chainable self - self - } - - fn clear(&mut self) { - // clear bytes - self.encoder.bytes.clear(); - - // clear lists - self.unfinished_lists.clear(); - } - - fn is_finished(&self) -> bool { - self.unfinished_lists.len() == 0 - } - - fn as_raw(&self) -> &[u8] { - &self.encoder.bytes - } - - fn out(self) -> Vec { - match self.is_finished() { - true => self.encoder.out().to_vec(), - false => panic!() - } - } -} - -impl RlpStream { - - /// Appends primitive value to the end of stream - fn append_value(&mut self, object: &E) where E: ByteEncodable { - // encode given value and add it at the end of the stream - self.encoder.emit_value(object); - } - - fn append_internal<'a, E>(&'a mut self, value: &E) -> &'a mut Self where E: Encodable { - self.finished_list = false; - value.rlp_append(self); - if !self.finished_list { - self.note_appended(1); - } - self - } - - /// Try to finish lists - fn note_appended(&mut self, inserted_items: usize) -> () { - if self.unfinished_lists.len() == 0 { - return; - } - - let back = self.unfinished_lists.len() - 1; - let should_finish = match self.unfinished_lists.get_mut(back) { - None => false, - Some(ref mut x) => { - x.current += inserted_items; - if x.current > x.max { - panic!("You cannot append more items then you expect!"); - } - x.current == x.max - } - }; - - if should_finish { - let x = self.unfinished_lists.pop().unwrap(); - let len = self.encoder.bytes.len() - x.position; - self.encoder.insert_list_len_at_pos(len, x.position); - self.note_appended(1); - } - self.finished_list = should_finish; - } - - /// Drain the object and return the underlying ElasticArray. - pub fn drain(self) -> ElasticArray1024 { - match self.is_finished() { - true => self.encoder.bytes, - false => panic!() - } - } -} - -struct BasicEncoder { - bytes: ElasticArray1024, -} - -impl Default for BasicEncoder { - fn default() -> Self { - BasicEncoder::new() - } -} - -impl BasicEncoder { - fn new() -> Self { - BasicEncoder { bytes: ElasticArray1024::new() } - } - - /// inserts list prefix at given position - /// TODO: optimise it further? - fn insert_list_len_at_pos(&mut self, len: usize, pos: usize) -> () { - let mut res = ElasticArray16::new(); - match len { - 0...55 => res.push(0xc0u8 + len as u8), - _ => { - res.push(0xf7u8 + len.to_bytes_len() as u8); - ToBytes::to_bytes(&len, &mut res); - } - }; - - self.bytes.insert_slice(pos, &res); - } - - /// get encoded value - fn out(self) -> ElasticArray1024 { - self.bytes - } -} - -impl Encoder for BasicEncoder { - fn emit_value(&mut self, value: &E) { - match value.bytes_len() { - // just 0 - 0 => self.bytes.push(0x80u8), - // byte is its own encoding if < 0x80 - 1 => { - value.to_bytes(&mut self.bytes); - let len = self.bytes.len(); - let last_byte = self.bytes[len - 1]; - if last_byte >= 0x80 { - self.bytes.push(last_byte); - self.bytes[len - 1] = 0x81; - } - } - // (prefix + length), followed by the string - len @ 2 ... 55 => { - self.bytes.push(0x80u8 + len as u8); - value.to_bytes(&mut self.bytes); - } - // (prefix + length of length), followed by the length, followd by the string - len => { - self.bytes.push(0xb7 + len.to_bytes_len() as u8); - ToBytes::to_bytes(&len, &mut self.bytes); - value.to_bytes(&mut self.bytes); - } - } - } - - fn emit_raw(&mut self, bytes: &[u8]) -> () { - self.bytes.append_slice(bytes); - } -} - -impl ByteEncodable for T where T: ToBytes { - fn to_bytes>(&self, out: &mut V) { - ToBytes::to_bytes(self, out) - } - - fn bytes_len(&self) -> usize { - ToBytes::to_bytes_len(self) - } -} - -struct U8Slice<'a>(&'a [u8]); - -impl<'a> ByteEncodable for U8Slice<'a> { - fn to_bytes>(&self, out: &mut V) { - out.vec_extend(self.0) - } - - fn bytes_len(&self) -> usize { - self.0.len() - } -} - -impl<'a> Encodable for &'a[u8] { - fn rlp_append(&self, s: &mut RlpStream) { - s.append_value(&U8Slice(self)) - } -} - -impl Encodable for Vec { - fn rlp_append(&self, s: &mut RlpStream) { - s.append_value(&U8Slice(self)) - } -} - -impl Encodable for T where T: ByteEncodable { - fn rlp_append(&self, s: &mut RlpStream) { - s.append_value(self) - } -} - -struct EncodableU8 (u8); - -impl ByteEncodable for EncodableU8 { - fn to_bytes>(&self, out: &mut V) { - if self.0 != 0 { - out.vec_push(self.0) - } - } - - fn bytes_len(&self) -> usize { - match self.0 { 0 => 0, _ => 1 } - } -} - -impl RlpEncodable for u8 { - fn rlp_append(&self, s: &mut RlpStream) { - s.append_value(&EncodableU8(*self)) - } -} - -impl<'a, T> Encodable for &'a[T] where T: Encodable { - fn rlp_append(&self, s: &mut RlpStream) { - s.begin_list(self.len()); - for el in self.iter() { - s.append_internal(el); - } - } -} - -impl Encodable for Vec where T: Encodable { - fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(&self.as_slice(), s); - } -} - -impl Encodable for Option where T: Encodable { - fn rlp_append(&self, s: &mut RlpStream) { - match *self { - None => { s.begin_list(0); }, - Some(ref x) => { - s.begin_list(1); - s.append_internal(x); - } - } - } -} - -impl RlpEncodable for T where T: Encodable { - fn rlp_append(&self, s: &mut RlpStream) { - Encodable::rlp_append(self, s) - } -} - diff --git a/util/rlp/src/stream.rs b/util/rlp/src/stream.rs new file mode 100644 index 000000000..318e019fc --- /dev/null +++ b/util/rlp/src/stream.rs @@ -0,0 +1,335 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::borrow::Borrow; +use byteorder::{ByteOrder, BigEndian}; +use elastic_array::{ElasticArray16, ElasticArray1024}; +use traits::Encodable; + +#[derive(Debug, Copy, Clone)] +struct ListInfo { + position: usize, + current: usize, + max: usize, +} + +impl ListInfo { + fn new(position: usize, max: usize) -> ListInfo { + ListInfo { + position: position, + current: 0, + max: max, + } + } +} + +/// Appendable rlp encoder. +pub struct RlpStream { + unfinished_lists: ElasticArray16, + buffer: ElasticArray1024, + finished_list: bool, +} + +impl Default for RlpStream { + fn default() -> Self { + RlpStream::new() + } +} + +impl RlpStream { + /// Initializes instance of empty `Stream`. + pub fn new() -> Self { + RlpStream { + unfinished_lists: ElasticArray16::new(), + buffer: ElasticArray1024::new(), + finished_list: false, + } + } + + /// Initializes the `Stream` as a list. + pub fn new_list(len: usize) -> Self { + let mut stream = RlpStream::new(); + stream.begin_list(len); + stream + } + + /// Appends value to the end of stream, chainable. + /// + /// ```rust + /// extern crate rlp; + /// use rlp::*; + /// + /// fn main () { + /// let mut stream = RlpStream::new_list(2); + /// stream.append(&"cat").append(&"dog"); + /// let out = stream.out(); + /// assert_eq!(out, vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']); + /// } + /// ``` + pub fn append<'a, E>(&'a mut self, value: &E) -> &'a mut Self where E: Encodable { + self.finished_list = false; + value.rlp_append(self); + if !self.finished_list { + self.note_appended(1); + } + self + } + + /// Appends list of values to the end of stream, chainable. + pub fn append_list<'a, E, K>(&'a mut self, values: &[K]) -> &'a mut Self where E: Encodable, K: Borrow { + self.begin_list(values.len()); + for value in values { + self.append(value.borrow()); + } + self + } + + /// Appends value to the end of stream, but do not count it as an appended item. + /// It's useful for wrapper types + pub fn append_internal<'a, E>(&'a mut self, value: &E) -> &'a mut Self where E: Encodable { + value.rlp_append(self); + self + } + + /// Declare appending the list of given size, chainable. + /// + /// ```rust + /// extern crate rlp; + /// use rlp::*; + /// + /// fn main () { + /// let mut stream = RlpStream::new_list(2); + /// stream.begin_list(2).append(&"cat").append(&"dog"); + /// stream.append(&""); + /// let out = stream.out(); + /// assert_eq!(out, vec![0xca, 0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g', 0x80]); + /// } + /// ``` + pub fn begin_list(&mut self, len: usize) -> &mut RlpStream { + self.finished_list = false; + match len { + 0 => { + // we may finish, if the appended list len is equal 0 + self.buffer.push(0xc0u8); + self.note_appended(1); + self.finished_list = true; + }, + _ => { + // payload is longer than 1 byte only for lists > 55 bytes + // by pushing always this 1 byte we may avoid unnecessary shift of data + self.buffer.push(0); + + let position = self.buffer.len(); + self.unfinished_lists.push(ListInfo::new(position, len)); + }, + } + + // return chainable self + self + } + + /// Apends null to the end of stream, chainable. + /// + /// ```rust + /// extern crate rlp; + /// use rlp::*; + /// + /// fn main () { + /// let mut stream = RlpStream::new_list(2); + /// stream.append_empty_data().append_empty_data(); + /// let out = stream.out(); + /// assert_eq!(out, vec![0xc2, 0x80, 0x80]); + /// } + /// ``` + pub fn append_empty_data(&mut self) -> &mut RlpStream { + // self push raw item + self.buffer.push(0x80); + + // try to finish and prepend the length + self.note_appended(1); + + // return chainable self + self + } + + /// Appends raw (pre-serialised) RLP data. Use with caution. Chainable. + pub fn append_raw<'a>(&'a mut self, bytes: &[u8], item_count: usize) -> &'a mut RlpStream { + // push raw items + self.buffer.append_slice(bytes); + + // try to finish and prepend the length + self.note_appended(item_count); + + // return chainable self + self + } + + /// Clear the output stream so far. + /// + /// ```rust + /// extern crate rlp; + /// use rlp::*; + /// + /// fn main () { + /// let mut stream = RlpStream::new_list(3); + /// stream.append(&"cat"); + /// stream.clear(); + /// stream.append(&"dog"); + /// let out = stream.out(); + /// assert_eq!(out, vec![0x83, b'd', b'o', b'g']); + /// } + pub fn clear(&mut self) { + // clear bytes + self.buffer.clear(); + + // clear lists + self.unfinished_lists.clear(); + } + + /// Returns true if stream doesnt expect any more items. + /// + /// ```rust + /// extern crate rlp; + /// use rlp::*; + /// + /// fn main () { + /// let mut stream = RlpStream::new_list(2); + /// stream.append(&"cat"); + /// assert_eq!(stream.is_finished(), false); + /// stream.append(&"dog"); + /// assert_eq!(stream.is_finished(), true); + /// let out = stream.out(); + /// assert_eq!(out, vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']); + /// } + pub fn is_finished(&self) -> bool { + self.unfinished_lists.len() == 0 + } + + /// Get raw encoded bytes + pub fn as_raw(&self) -> &[u8] { + //&self.encoder.bytes + &self.buffer + } + + /// Streams out encoded bytes. + /// + /// panic! if stream is not finished. + pub fn out(self) -> Vec { + match self.is_finished() { + //true => self.encoder.out().to_vec(), + true => self.buffer.to_vec(), + false => panic!() + } + } + + /// Try to finish lists + fn note_appended(&mut self, inserted_items: usize) -> () { + if self.unfinished_lists.len() == 0 { + return; + } + + let back = self.unfinished_lists.len() - 1; + let should_finish = match self.unfinished_lists.get_mut(back) { + None => false, + Some(ref mut x) => { + x.current += inserted_items; + if x.current > x.max { + panic!("You cannot append more items then you expect!"); + } + x.current == x.max + } + }; + + if should_finish { + let x = self.unfinished_lists.pop().unwrap(); + let len = self.buffer.len() - x.position; + self.encoder().insert_list_payload(len, x.position); + self.note_appended(1); + } + self.finished_list = should_finish; + } + + pub fn encoder(&mut self) -> BasicEncoder { + BasicEncoder::new(self) + } + + /// Drain the object and return the underlying ElasticArray. + pub fn drain(self) -> ElasticArray1024 { + match self.is_finished() { + true => self.buffer, + false => panic!() + } + } +} + +pub struct BasicEncoder<'a> { + buffer: &'a mut ElasticArray1024, +} + +impl<'a> BasicEncoder<'a> { + fn new(stream: &'a mut RlpStream) -> Self { + BasicEncoder { + buffer: &mut stream.buffer + } + } + + fn insert_size(&mut self, size: usize, position: usize) -> u8 { + let size = size as u32; + let leading_empty_bytes = size.leading_zeros() as usize / 8; + let size_bytes = 4 - leading_empty_bytes as u8; + let mut buffer = [0u8; 4]; + BigEndian::write_u32(&mut buffer, size); + self.buffer.insert_slice(position, &buffer[leading_empty_bytes..]); + size_bytes as u8 + } + + /// Inserts list prefix at given position + fn insert_list_payload(&mut self, len: usize, pos: usize) { + // 1 byte was already reserved for payload earlier + match len { + 0...55 => { + self.buffer[pos - 1] = 0xc0u8 + len as u8; + }, + _ => { + let inserted_bytes = self.insert_size(len, pos); + self.buffer[pos - 1] = 0xf7u8 + inserted_bytes; + } + }; + } + + /// Pushes encoded value to the end of buffer + pub fn encode_value(&mut self, value: &[u8]) { + match value.len() { + // just 0 + 0 => self.buffer.push(0x80u8), + // byte is its own encoding if < 0x80 + 1 if value[0] < 0x80 => self.buffer.push(value[0]), + // (prefix + length), followed by the string + len @ 1 ... 55 => { + self.buffer.push(0x80u8 + len as u8); + self.buffer.append_slice(value); + } + // (prefix + length of length), followed by the length, followd by the string + len => { + self.buffer.push(0); + let position = self.buffer.len(); + let inserted_bytes = self.insert_size(len, position); + self.buffer[position - 1] = 0xb7 + inserted_bytes; + self.buffer.append_slice(value); + } + } + } +} diff --git a/util/rlp/src/tests.rs b/util/rlp/src/tests.rs index 151619571..bd3abfe63 100644 --- a/util/rlp/src/tests.rs +++ b/util/rlp/src/tests.rs @@ -15,9 +15,8 @@ // along with Parity. If not, see . use std::{fmt, cmp}; -use std::str::FromStr; -use ::{Encodable, RlpDecodable, UntrustedRlp, RlpStream, View, Stream, DecoderError}; use bigint::prelude::U256; +use {Encodable, RlpDecodable, UntrustedRlp, RlpStream, View, DecoderError}; #[test] fn rlp_at() { @@ -95,6 +94,17 @@ fn run_encode_tests(tests: Vec>) } } +struct VETestPair(Vec, Vec) where T: Encodable; + +fn run_encode_tests_list(tests: Vec>) + where T: Encodable +{ + for t in &tests { + let res = super::encode_list(&t.0); + assert_eq!(&res[..], &t.1[..]); + } +} + #[test] fn encode_u16() { let tests = vec![ @@ -131,9 +141,8 @@ fn encode_u256() { ETestPair(U256::from(0x1000000u64), vec![0x84, 0x01, 0x00, 0x00, 0x00]), ETestPair(U256::from(0xffffffffu64), vec![0x84, 0xff, 0xff, 0xff, 0xff]), - ETestPair(U256::from_str("8090a0b0c0d0e0f00910203040506077000000000000\ - 000100000000000012f0") - .unwrap(), + ETestPair(("8090a0b0c0d0e0f00910203040506077000000000000\ + 000100000000000012f0").into(), vec![0xa0, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x09, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, @@ -186,19 +195,19 @@ fn encode_vector_u8() { #[test] fn encode_vector_u64() { let tests = vec![ - ETestPair(vec![], vec![0xc0]), - ETestPair(vec![15u64], vec![0xc1, 0x0f]), - ETestPair(vec![1, 2, 3, 7, 0xff], vec![0xc6, 1, 2, 3, 7, 0x81, 0xff]), - ETestPair(vec![0xffffffff, 1, 2, 3, 7, 0xff], vec![0xcb, 0x84, 0xff, 0xff, 0xff, 0xff, 1, 2, 3, 7, 0x81, 0xff]), + VETestPair(vec![], vec![0xc0]), + VETestPair(vec![15u64], vec![0xc1, 0x0f]), + VETestPair(vec![1, 2, 3, 7, 0xff], vec![0xc6, 1, 2, 3, 7, 0x81, 0xff]), + VETestPair(vec![0xffffffff, 1, 2, 3, 7, 0xff], vec![0xcb, 0x84, 0xff, 0xff, 0xff, 0xff, 1, 2, 3, 7, 0x81, 0xff]), ]; - run_encode_tests(tests); + run_encode_tests_list(tests); } #[test] fn encode_vector_str() { - let tests = vec![ETestPair(vec!["cat", "dog"], + let tests = vec![VETestPair(vec!["cat", "dog"], vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g'])]; - run_encode_tests(tests); + run_encode_tests_list(tests); } struct DTestPair(T, Vec) where T: RlpDecodable + fmt::Debug + cmp::Eq; @@ -265,9 +274,8 @@ fn decode_untrusted_u256() { DTestPair(U256::from(0x1000000u64), vec![0x84, 0x01, 0x00, 0x00, 0x00]), DTestPair(U256::from(0xffffffffu64), vec![0x84, 0xff, 0xff, 0xff, 0xff]), - DTestPair(U256::from_str("8090a0b0c0d0e0f00910203040506077000000000000\ - 000100000000000012f0") - .unwrap(), + DTestPair(("8090a0b0c0d0e0f00910203040506077000000000000\ + 000100000000000012f0").into(), vec![0xa0, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0, 0x09, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, @@ -335,7 +343,7 @@ fn decode_untrusted_vector_of_vectors_str() { #[test] fn test_decoding_array() { let v = vec![5u16, 2u16]; - let res = super::encode(&v); + let res = super::encode_list(&v); let arr: [u16; 2] = super::decode(&res); assert_eq!(arr[0], 5); assert_eq!(arr[1], 2); @@ -396,7 +404,7 @@ fn test_rlp_2bytes_data_length_check() #[test] fn test_rlp_nested_empty_list_encode() { let mut stream = RlpStream::new_list(2); - stream.append(&(Vec::new() as Vec)); + stream.append_list(&(Vec::new() as Vec)); stream.append(&40u32); assert_eq!(stream.drain()[..], [0xc2u8, 0xc0u8, 40u8][..]); } diff --git a/util/rlp/src/rlptraits.rs b/util/rlp/src/traits.rs similarity index 64% rename from util/rlp/src/rlptraits.rs rename to util/rlp/src/traits.rs index ca7da2ec7..3f79e9cab 100644 --- a/util/rlp/src/rlptraits.rs +++ b/util/rlp/src/traits.rs @@ -15,11 +15,9 @@ // along with Parity. If not, see . //! Common RLP traits -use ::{DecoderError, UntrustedRlp}; -use bytes::VecLike; -use rlpstream::RlpStream; - use elastic_array::ElasticArray1024; +use stream::RlpStream; +use {DecoderError, UntrustedRlp}; /// Type is able to decode RLP. pub trait Decoder: Sized { @@ -226,23 +224,7 @@ pub trait View<'a, 'view>: Sized { fn val_at(&self, index: usize) -> Result where T: RlpDecodable; } -/// Raw RLP encoder -pub trait Encoder { - /// Write a value represented as bytes - fn emit_value(&mut self, value: &E); - /// Write raw preencoded data to the output - fn emit_raw(&mut self, bytes: &[u8]) -> (); -} - -/// Primitive data type encodable to RLP -pub trait ByteEncodable { - /// Serialize this object to given byte container - fn to_bytes>(&self, out: &mut V); - /// Get size of serialised data in bytes - fn bytes_len(&self) -> usize; -} - -/// Structure encodable to RLP. Implement this trait for +/// Structure encodable to RLP pub trait Encodable { /// Append a value to the stream fn rlp_append(&self, s: &mut RlpStream); @@ -255,112 +237,6 @@ pub trait Encodable { } } -/// Encodable wrapper trait required to handle special case of encoding a &[u8] as string and not as list -pub trait RlpEncodable { - /// Append a value to the stream - fn rlp_append(&self, s: &mut RlpStream); -} - -/// RLP encoding stream -pub trait Stream: Sized { - - /// Initializes instance of empty `Stream`. - fn new() -> Self; - - /// Initializes the `Stream` as a list. - fn new_list(len: usize) -> Self; - - /// Apends value to the end of stream, chainable. - /// - /// ```rust - /// extern crate rlp; - /// use rlp::*; - /// - /// fn main () { - /// let mut stream = RlpStream::new_list(2); - /// stream.append(&"cat").append(&"dog"); - /// let out = stream.out(); - /// assert_eq!(out, vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']); - /// } - /// ``` - fn append<'a, E>(&'a mut self, value: &E) -> &'a mut Self where E: RlpEncodable; - - /// Declare appending the list of given size, chainable. - /// - /// ```rust - /// extern crate rlp; - /// use rlp::*; - /// - /// fn main () { - /// let mut stream = RlpStream::new_list(2); - /// stream.begin_list(2).append(&"cat").append(&"dog"); - /// stream.append(&""); - /// let out = stream.out(); - /// assert_eq!(out, vec![0xca, 0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g', 0x80]); - /// } - /// ``` - fn begin_list(&mut self, len: usize) -> &mut Self; - - /// Apends null to the end of stream, chainable. - /// - /// ```rust - /// extern crate rlp; - /// use rlp::*; - /// - /// fn main () { - /// let mut stream = RlpStream::new_list(2); - /// stream.append_empty_data().append_empty_data(); - /// let out = stream.out(); - /// assert_eq!(out, vec![0xc2, 0x80, 0x80]); - /// } - /// ``` - fn append_empty_data(&mut self) -> &mut Self; - - /// Appends raw (pre-serialised) RLP data. Use with caution. Chainable. - fn append_raw<'a>(&'a mut self, bytes: &[u8], item_count: usize) -> &'a mut Self; - - /// Clear the output stream so far. - /// - /// ```rust - /// extern crate rlp; - /// use rlp::*; - /// - /// fn main () { - /// let mut stream = RlpStream::new_list(3); - /// stream.append(&"cat"); - /// stream.clear(); - /// stream.append(&"dog"); - /// let out = stream.out(); - /// assert_eq!(out, vec![0x83, b'd', b'o', b'g']); - /// } - fn clear(&mut self); - - /// Returns true if stream doesnt expect any more items. - /// - /// ```rust - /// extern crate rlp; - /// use rlp::*; - /// - /// fn main () { - /// let mut stream = RlpStream::new_list(2); - /// stream.append(&"cat"); - /// assert_eq!(stream.is_finished(), false); - /// stream.append(&"dog"); - /// assert_eq!(stream.is_finished(), true); - /// let out = stream.out(); - /// assert_eq!(out, vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']); - /// } - fn is_finished(&self) -> bool; - - /// Get raw encoded bytes - fn as_raw(&self) -> &[u8]; - - /// Streams out encoded bytes. - /// - /// panic! if stream is not finished. - fn out(self) -> Vec; -} - /// Trait for compressing and decompressing RLP by replacement of common terms. pub trait Compressible: Sized { /// Indicates the origin of RLP to be compressed. diff --git a/util/src/journaldb/earlymergedb.rs b/util/src/journaldb/earlymergedb.rs index 9644a60ac..f484a623a 100644 --- a/util/src/journaldb/earlymergedb.rs +++ b/util/src/journaldb/earlymergedb.rs @@ -427,7 +427,7 @@ impl JournalDB for EarlyMergeDB { r.begin_list(inserts.len()); inserts.iter().foreach(|&(k, _)| {r.append(&k);}); - r.append(&removes); + r.append_list(&removes); Self::insert_keys(&inserts, &*self.backing, self.column, &mut refs, batch, trace); let ins = inserts.iter().map(|&(k, _)| k).collect::>(); diff --git a/util/src/journaldb/overlayrecentdb.rs b/util/src/journaldb/overlayrecentdb.rs index ed39905a2..90f7acfcf 100644 --- a/util/src/journaldb/overlayrecentdb.rs +++ b/util/src/journaldb/overlayrecentdb.rs @@ -278,7 +278,7 @@ impl JournalDB for OverlayRecentDB { journal_overlay.backing_overlay.emplace(short_key, v); } - r.append(&removed_keys); + r.append_list(&removed_keys); let mut k = RlpStream::new_list(3); let index = journal_overlay.journal.get(&now).map_or(0, |j| j.len()); diff --git a/util/src/journaldb/refcounteddb.rs b/util/src/journaldb/refcounteddb.rs index 57d7aa7c0..b18954eb3 100644 --- a/util/src/journaldb/refcounteddb.rs +++ b/util/src/journaldb/refcounteddb.rs @@ -136,8 +136,8 @@ impl JournalDB for RefCountedDB { let mut r = RlpStream::new_list(3); r.append(id); - r.append(&self.inserts); - r.append(&self.removes); + r.append_list(&self.inserts); + r.append_list(&self.removes); batch.put(self.column, &last, r.as_raw()); let ops = self.inserts.len() + self.removes.len(); diff --git a/util/src/misc.rs b/util/src/misc.rs index 489628a30..6dc2fba12 100644 --- a/util/src/misc.rs +++ b/util/src/misc.rs @@ -17,7 +17,7 @@ //! Diff misc. use common::*; -use rlp::{Stream, RlpStream}; +use rlp::RlpStream; use target_info::Target; include!(concat!(env!("OUT_DIR"), "/version.rs")); diff --git a/util/src/trie/triedbmut.rs b/util/src/trie/triedbmut.rs index 0df752756..10d7f3aa6 100644 --- a/util/src/trie/triedbmut.rs +++ b/util/src/trie/triedbmut.rs @@ -24,7 +24,7 @@ use super::node::NodeKey; use ::{HashDB, H256}; use ::bytes::ToPretty; use ::nibbleslice::NibbleSlice; -use ::rlp::{Rlp, RlpStream, View, Stream}; +use ::rlp::{Rlp, RlpStream, View}; use ::sha3::SHA3_NULL_RLP; use hashdb::DBValue; @@ -931,7 +931,6 @@ impl<'a> Drop for TrieDBMut<'a> { #[cfg(test)] mod tests { use triehash::trie_root; - use hash::*; use hashdb::*; use memorydb::*; use super::*; diff --git a/util/src/triehash.rs b/util/src/triehash.rs index 9884794ca..772f3f475 100644 --- a/util/src/triehash.rs +++ b/util/src/triehash.rs @@ -23,7 +23,7 @@ use std::cmp; use hash::*; use sha3::*; use rlp; -use rlp::{RlpStream, Stream}; +use rlp::RlpStream; use vector::SharedPrefix; /// Generates a trie root hash for a vector of values