merge master into jr-use-badge-reg
This commit is contained in:
commit
d67a9388ff
@ -108,9 +108,9 @@ linux-centos:
|
|||||||
paths:
|
paths:
|
||||||
- target/release/parity
|
- target/release/parity
|
||||||
name: "x86_64-unknown-centos-gnu_parity"
|
name: "x86_64-unknown-centos-gnu_parity"
|
||||||
linux-i686:
|
linux-i686:
|
||||||
stage: build
|
stage: build
|
||||||
image: ethcore/rust-i686:latest
|
image: ethcore/rust-i686:latest
|
||||||
only:
|
only:
|
||||||
- beta
|
- beta
|
||||||
- tags
|
- tags
|
||||||
@ -348,7 +348,7 @@ windows:
|
|||||||
- set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\vs2015\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
|
- set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\vs2015\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
|
||||||
- set LIB=C:\vs2015\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64
|
- set LIB=C:\vs2015\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64
|
||||||
- set RUST_BACKTRACE=1
|
- set RUST_BACKTRACE=1
|
||||||
- set RUSTFLAGS=%RUSTFLAGS%
|
- set RUSTFLAGS=%RUSTFLAGS%
|
||||||
- rustup default stable-x86_64-pc-windows-msvc
|
- rustup default stable-x86_64-pc-windows-msvc
|
||||||
- cargo build -j 8 --release #%CARGOFLAGS%
|
- cargo build -j 8 --release #%CARGOFLAGS%
|
||||||
- curl -sL --url "https://github.com/ethcore/win-build/raw/master/SimpleFC.dll" -o nsis\SimpleFC.dll
|
- curl -sL --url "https://github.com/ethcore/win-build/raw/master/SimpleFC.dll" -o nsis\SimpleFC.dll
|
||||||
@ -422,13 +422,10 @@ test-rust-stable:
|
|||||||
image: ethcore/rust:stable
|
image: ethcore/rust:stable
|
||||||
before_script:
|
before_script:
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l)
|
- export RUST_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep -v -e ^js -e ^\\. -e ^LICENSE -e ^README.md -e ^appveyor.yml -e ^test.sh -e ^windows/ -e ^scripts/ -e^mac/ -e ^nsis/ | wc -l)
|
||||||
- echo $JS_FILES_MODIFIED
|
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi
|
|
||||||
script:
|
script:
|
||||||
- export RUST_BACKTRACE=1
|
- export RUST_BACKTRACE=1
|
||||||
- echo $JS_FILES_MODIFIED
|
- if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"&./test.sh $CARGOFLAGS; else echo "skip rust test"&./js/scripts/lint.sh&./js/scripts/test.sh&./js/scripts/build.sh; fi
|
|
||||||
tags:
|
tags:
|
||||||
- rust
|
- rust
|
||||||
- rust-stable
|
- rust-stable
|
||||||
@ -437,13 +434,10 @@ js-test:
|
|||||||
image: ethcore/rust:stable
|
image: ethcore/rust:stable
|
||||||
before_script:
|
before_script:
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l)
|
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep ^js/ | wc -l)
|
||||||
- echo $JS_FILES_MODIFIED
|
- if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS deps install since no JS files modified."; else ./js/scripts/install-deps.sh;fi
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi
|
|
||||||
script:
|
script:
|
||||||
- export RUST_BACKTRACE=1
|
- if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS lint since no JS files modified."; else ./js/scripts/lint.sh && ./js/scripts/test.sh && ./js/scripts/build.sh; fi
|
||||||
- echo $JS_FILES_MODIFIED
|
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else echo "skip rust test"&./js/scripts/lint.sh&./js/scripts/test.sh&./js/scripts/build.sh; fi
|
|
||||||
tags:
|
tags:
|
||||||
- rust
|
- rust
|
||||||
- rust-stable
|
- rust-stable
|
||||||
@ -484,11 +478,11 @@ js-release:
|
|||||||
- stable
|
- stable
|
||||||
image: ethcore/rust:stable
|
image: ethcore/rust:stable
|
||||||
before_script:
|
before_script:
|
||||||
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep \.js | wc -l)
|
- export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep ^js/ | wc -l)
|
||||||
- echo $JS_FILES_MODIFIED
|
- echo $JS_FILES_MODIFIED
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js build"; else ./js/scripts/install-deps.sh;fi
|
- if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS deps install since no JS files modified."; else ./js/scripts/install-deps.sh;fi
|
||||||
script:
|
script:
|
||||||
- echo $JS_FILES_MODIFIED
|
- echo $JS_FILES_MODIFIED
|
||||||
- if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js build"; else ./js/scripts/build.sh&&./js/scripts/release.sh; fi
|
- if [ $JS_FILES_MODIFIED -eq 0 ]; then echo "Skipping JS rebuild since no JS files modified."; else ./js/scripts/build.sh && ./js/scripts/release.sh; fi
|
||||||
tags:
|
tags:
|
||||||
- javascript
|
- javascript
|
||||||
|
21
Cargo.lock
generated
21
Cargo.lock
generated
@ -18,6 +18,7 @@ dependencies = [
|
|||||||
"ethcore-ipc-hypervisor 1.2.0",
|
"ethcore-ipc-hypervisor 1.2.0",
|
||||||
"ethcore-ipc-nano 1.5.0",
|
"ethcore-ipc-nano 1.5.0",
|
||||||
"ethcore-ipc-tests 0.1.0",
|
"ethcore-ipc-tests 0.1.0",
|
||||||
|
"ethcore-light 1.5.0",
|
||||||
"ethcore-logger 1.5.0",
|
"ethcore-logger 1.5.0",
|
||||||
"ethcore-rpc 1.5.0",
|
"ethcore-rpc 1.5.0",
|
||||||
"ethcore-signer 1.5.0",
|
"ethcore-signer 1.5.0",
|
||||||
@ -456,6 +457,21 @@ dependencies = [
|
|||||||
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ethcore-light"
|
||||||
|
version = "1.5.0"
|
||||||
|
dependencies = [
|
||||||
|
"ethcore 1.5.0",
|
||||||
|
"ethcore-io 1.5.0",
|
||||||
|
"ethcore-ipc 1.5.0",
|
||||||
|
"ethcore-ipc-codegen 1.5.0",
|
||||||
|
"ethcore-network 1.5.0",
|
||||||
|
"ethcore-util 1.5.0",
|
||||||
|
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rlp 0.1.0",
|
||||||
|
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ethcore-logger"
|
name = "ethcore-logger"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
@ -660,12 +676,15 @@ dependencies = [
|
|||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore 1.5.0",
|
"ethcore 1.5.0",
|
||||||
|
"ethcore-devtools 1.5.0",
|
||||||
"ethcore-io 1.5.0",
|
"ethcore-io 1.5.0",
|
||||||
"ethcore-ipc 1.5.0",
|
"ethcore-ipc 1.5.0",
|
||||||
"ethcore-ipc-codegen 1.5.0",
|
"ethcore-ipc-codegen 1.5.0",
|
||||||
"ethcore-ipc-nano 1.5.0",
|
"ethcore-ipc-nano 1.5.0",
|
||||||
|
"ethcore-light 1.5.0",
|
||||||
"ethcore-network 1.5.0",
|
"ethcore-network 1.5.0",
|
||||||
"ethcore-util 1.5.0",
|
"ethcore-util 1.5.0",
|
||||||
|
"ethkey 0.2.0",
|
||||||
"heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.6 (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.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -1271,7 +1290,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "parity-ui-precompiled"
|
name = "parity-ui-precompiled"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
source = "git+https://github.com/ethcore/js-precompiled.git#8e8e515f958d2d4a5abec07253a51a052f2b744d"
|
source = "git+https://github.com/ethcore/js-precompiled.git#eb9d978ed5ad1c514b37e89c716f80b3c8d613b5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
@ -3,7 +3,7 @@ description = "Ethcore client."
|
|||||||
name = "parity"
|
name = "parity"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
@ -47,6 +47,7 @@ rlp = { path = "util/rlp" }
|
|||||||
ethcore-stratum = { path = "stratum" }
|
ethcore-stratum = { path = "stratum" }
|
||||||
ethcore-dapps = { path = "dapps", optional = true }
|
ethcore-dapps = { path = "dapps", optional = true }
|
||||||
clippy = { version = "0.0.103", optional = true}
|
clippy = { version = "0.0.103", optional = true}
|
||||||
|
ethcore-light = { path = "ethcore/light" }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
winapi = "0.2"
|
winapi = "0.2"
|
||||||
|
2
build.rs
2
build.rs
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -3,7 +3,7 @@ description = "Parity Dapps crate"
|
|||||||
name = "ethcore-dapps"
|
name = "ethcore-dapps"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -3,7 +3,7 @@ description = "Base Package for all Parity built-in dapps"
|
|||||||
name = "parity-dapps-glue"
|
name = "parity-dapps-glue"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Ethcore Parity UI"
|
description = "Ethcore Parity UI"
|
||||||
homepage = "http://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "parity-ui"
|
name = "parity-ui"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
rustc_version = "0.1"
|
rustc_version = "0.1"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Ethcore Database"
|
description = "Ethcore Database"
|
||||||
homepage = "http://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "ethcore-db"
|
name = "ethcore-db"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Ethcore development/test/build tools"
|
description = "Ethcore development/test/build tools"
|
||||||
homepage = "http://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "ethcore-devtools"
|
name = "ethcore-devtools"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.3"
|
rand = "0.3"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ethash"
|
name = "ethash"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["arkpar <arkadiy@ethcore.io"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Ethcore library"
|
description = "Ethcore library"
|
||||||
homepage = "http://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "ethcore"
|
name = "ethcore"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Fetching hash-addressed content."
|
description = "Fetching hash-addressed content."
|
||||||
homepage = "https://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "ethcore-hash-fetch"
|
name = "ethcore-hash-fetch"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,21 +1,25 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Parity LES primitives"
|
description = "Parity LES primitives"
|
||||||
homepage = "https://ethcore.io"
|
homepage = "http://parity.io"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
name = "ethcore-light"
|
name = "ethcore-light"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
authors = ["Ethcore <admin@ethcore.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
"ethcore-ipc-codegen" = { path = "../../ipc/codegen" }
|
"ethcore-ipc-codegen" = { path = "../../ipc/codegen", optional = true }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
ethcore = { path = ".." }
|
ethcore = { path = ".."}
|
||||||
ethcore-util = { path = "../../util" }
|
ethcore-util = { path = "../../util" }
|
||||||
ethcore-network = { path = "../../util/network" }
|
ethcore-network = { path = "../../util/network" }
|
||||||
ethcore-io = { path = "../../util/io" }
|
ethcore-io = { path = "../../util/io" }
|
||||||
ethcore-ipc = { path = "../../ipc/rpc" }
|
ethcore-ipc = { path = "../../ipc/rpc", optional = true }
|
||||||
rlp = { path = "../../util/rlp" }
|
rlp = { path = "../../util/rlp" }
|
||||||
time = "0.1"
|
time = "0.1"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
ipc = ["ethcore-ipc", "ethcore-ipc-codegen"]
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -14,8 +14,14 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
extern crate ethcore_ipc_codegen;
|
extern crate ethcore_ipc_codegen;
|
||||||
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
fn main() {
|
fn main() {
|
||||||
ethcore_ipc_codegen::derive_binary("src/types/mod.rs.in").unwrap();
|
ethcore_ipc_codegen::derive_binary("src/types/mod.rs.in").unwrap();
|
||||||
|
ethcore_ipc_codegen::derive_ipc_cond("src/provider.rs", true).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ipc"))]
|
||||||
|
fn main() { }
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -14,13 +14,12 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//! Light client implementation. Used for raw data queries as well as the header
|
//! Light client implementation. Stores data from light sync
|
||||||
//! sync.
|
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ethcore::engines::Engine;
|
use ethcore::engines::Engine;
|
||||||
use ethcore::ids::BlockID;
|
use ethcore::ids::BlockId;
|
||||||
use ethcore::service::ClientIoMessage;
|
use ethcore::service::ClientIoMessage;
|
||||||
use ethcore::block_import_error::BlockImportError;
|
use ethcore::block_import_error::BlockImportError;
|
||||||
use ethcore::block_status::BlockStatus;
|
use ethcore::block_status::BlockStatus;
|
||||||
@ -29,7 +28,7 @@ use ethcore::transaction::SignedTransaction;
|
|||||||
use ethcore::blockchain_info::BlockChainInfo;
|
use ethcore::blockchain_info::BlockChainInfo;
|
||||||
|
|
||||||
use io::IoChannel;
|
use io::IoChannel;
|
||||||
use util::hash::H256;
|
use util::hash::{H256, H256FastMap};
|
||||||
use util::{Bytes, Mutex};
|
use util::{Bytes, Mutex};
|
||||||
|
|
||||||
use provider::Provider;
|
use provider::Provider;
|
||||||
@ -37,9 +36,10 @@ use request;
|
|||||||
|
|
||||||
/// Light client implementation.
|
/// Light client implementation.
|
||||||
pub struct Client {
|
pub struct Client {
|
||||||
engine: Arc<Engine>,
|
_engine: Arc<Engine>,
|
||||||
header_queue: HeaderQueue,
|
header_queue: HeaderQueue,
|
||||||
message_channel: Mutex<IoChannel<ClientIoMessage>>,
|
_message_channel: Mutex<IoChannel<ClientIoMessage>>,
|
||||||
|
tx_pool: Mutex<H256FastMap<SignedTransaction>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
@ -51,17 +51,22 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Whether the block is already known (but not necessarily part of the canonical chain)
|
/// Whether the block is already known (but not necessarily part of the canonical chain)
|
||||||
pub fn is_known(&self, _id: BlockID) -> bool {
|
pub fn is_known(&self, _id: BlockId) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Import a local transaction.
|
||||||
|
pub fn import_own_transaction(&self, tx: SignedTransaction) {
|
||||||
|
self.tx_pool.lock().insert(tx.hash(), tx);
|
||||||
|
}
|
||||||
|
|
||||||
/// Fetch a vector of all pending transactions.
|
/// Fetch a vector of all pending transactions.
|
||||||
pub fn pending_transactions(&self) -> Vec<SignedTransaction> {
|
pub fn pending_transactions(&self) -> Vec<SignedTransaction> {
|
||||||
vec![]
|
self.tx_pool.lock().values().cloned().collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inquire about the status of a given block.
|
/// Inquire about the status of a given block (or header).
|
||||||
pub fn status(&self, _id: BlockID) -> BlockStatus {
|
pub fn status(&self, _id: BlockId) -> BlockStatus {
|
||||||
BlockStatus::Unknown
|
BlockStatus::Unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -28,13 +28,25 @@
|
|||||||
//! It starts by performing a header-only sync, verifying random samples
|
//! It starts by performing a header-only sync, verifying random samples
|
||||||
//! of members of the chain to varying degrees.
|
//! of members of the chain to varying degrees.
|
||||||
|
|
||||||
// TODO: remove when integrating with the rest of parity.
|
#![deny(missing_docs)]
|
||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
pub mod net;
|
pub mod net;
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ipc"))]
|
||||||
pub mod provider;
|
pub mod provider;
|
||||||
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
|
pub mod provider {
|
||||||
|
#![allow(dead_code, unused_assignments, unused_variables, missing_docs)] // codegen issues
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/provider.rs"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
|
pub mod remote {
|
||||||
|
pub use provider::LightProviderClient;
|
||||||
|
}
|
||||||
|
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
pub use self::provider::Provider;
|
pub use self::provider::Provider;
|
||||||
@ -47,6 +59,8 @@ extern crate ethcore;
|
|||||||
extern crate ethcore_util as util;
|
extern crate ethcore_util as util;
|
||||||
extern crate ethcore_network as network;
|
extern crate ethcore_network as network;
|
||||||
extern crate ethcore_io as io;
|
extern crate ethcore_io as io;
|
||||||
extern crate ethcore_ipc as ipc;
|
|
||||||
extern crate rlp;
|
extern crate rlp;
|
||||||
extern crate time;
|
extern crate time;
|
||||||
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
|
extern crate ethcore_ipc as ipc;
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -22,6 +22,9 @@
|
|||||||
//!
|
//!
|
||||||
//! This module provides an interface for configuration of buffer
|
//! This module provides an interface for configuration of buffer
|
||||||
//! flow costs and recharge rates.
|
//! flow costs and recharge rates.
|
||||||
|
//!
|
||||||
|
//! Current default costs are picked completely arbitrarily, not based
|
||||||
|
//! on any empirical timings or mathematical models.
|
||||||
|
|
||||||
use request;
|
use request;
|
||||||
use super::packet;
|
use super::packet;
|
||||||
@ -273,6 +276,16 @@ impl FlowParams {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for FlowParams {
|
||||||
|
fn default() -> Self {
|
||||||
|
FlowParams {
|
||||||
|
limit: 50_000_000.into(),
|
||||||
|
costs: CostTable::default(),
|
||||||
|
recharge: 100_000.into(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
138
ethcore/light/src/net/context.rs
Normal file
138
ethcore/light/src/net/context.rs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
// Copyright 2015, 2016 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! I/O and event context generalizations.
|
||||||
|
|
||||||
|
use network::{NetworkContext, PeerId, NodeId};
|
||||||
|
|
||||||
|
use super::{Announcement, LightProtocol, ReqId};
|
||||||
|
use super::error::Error;
|
||||||
|
use request::Request;
|
||||||
|
|
||||||
|
/// An I/O context which allows sending and receiving packets as well as
|
||||||
|
/// disconnecting peers. This is used as a generalization of the portions
|
||||||
|
/// of a p2p network which the light protocol structure makes use of.
|
||||||
|
pub trait IoContext {
|
||||||
|
/// Send a packet to a specific peer.
|
||||||
|
fn send(&self, peer: PeerId, packet_id: u8, packet_body: Vec<u8>);
|
||||||
|
|
||||||
|
/// Respond to a peer's message. Only works if this context is a byproduct
|
||||||
|
/// of a packet handler.
|
||||||
|
fn respond(&self, packet_id: u8, packet_body: Vec<u8>);
|
||||||
|
|
||||||
|
/// Disconnect a peer.
|
||||||
|
fn disconnect_peer(&self, peer: PeerId);
|
||||||
|
|
||||||
|
/// Disable a peer -- this is a disconnect + a time-out.
|
||||||
|
fn disable_peer(&self, peer: PeerId);
|
||||||
|
|
||||||
|
/// Get a peer's protocol version.
|
||||||
|
fn protocol_version(&self, peer: PeerId) -> Option<u8>;
|
||||||
|
|
||||||
|
/// Persistent peer id
|
||||||
|
fn persistent_peer_id(&self, peer: PeerId) -> Option<NodeId>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<'a> IoContext for NetworkContext<'a> {
|
||||||
|
fn send(&self, peer: PeerId, packet_id: u8, packet_body: Vec<u8>) {
|
||||||
|
if let Err(e) = self.send(peer, packet_id, packet_body) {
|
||||||
|
debug!(target: "les", "Error sending packet to peer {}: {}", peer, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn respond(&self, packet_id: u8, packet_body: Vec<u8>) {
|
||||||
|
if let Err(e) = self.respond(packet_id, packet_body) {
|
||||||
|
debug!(target: "les", "Error responding to peer message: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disconnect_peer(&self, peer: PeerId) {
|
||||||
|
NetworkContext::disconnect_peer(self, peer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disable_peer(&self, peer: PeerId) {
|
||||||
|
NetworkContext::disable_peer(self, peer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn protocol_version(&self, peer: PeerId) -> Option<u8> {
|
||||||
|
self.protocol_version(self.subprotocol_name(), peer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn persistent_peer_id(&self, peer: PeerId) -> Option<NodeId> {
|
||||||
|
self.session_info(peer).and_then(|info| info.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Context for a protocol event.
|
||||||
|
pub trait EventContext {
|
||||||
|
/// Get the peer relevant to the event e.g. message sender,
|
||||||
|
/// disconnected/connected peer.
|
||||||
|
fn peer(&self) -> PeerId;
|
||||||
|
|
||||||
|
/// Returns the relevant's peer persistent Id (aka NodeId).
|
||||||
|
fn persistent_peer_id(&self, peer: PeerId) -> Option<NodeId>;
|
||||||
|
|
||||||
|
/// Make a request from a peer.
|
||||||
|
fn request_from(&self, peer: PeerId, request: Request) -> Result<ReqId, Error>;
|
||||||
|
|
||||||
|
/// Make an announcement of new capabilities to the rest of the peers.
|
||||||
|
// TODO: maybe just put this on a timer in LightProtocol?
|
||||||
|
fn make_announcement(&self, announcement: Announcement);
|
||||||
|
|
||||||
|
/// Disconnect a peer.
|
||||||
|
fn disconnect_peer(&self, peer: PeerId);
|
||||||
|
|
||||||
|
/// Disable a peer.
|
||||||
|
fn disable_peer(&self, peer: PeerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Concrete implementation of `EventContext` over the light protocol struct and
|
||||||
|
/// an io context.
|
||||||
|
pub struct Ctx<'a> {
|
||||||
|
/// Io context to enable immediate response to events.
|
||||||
|
pub io: &'a IoContext,
|
||||||
|
/// Protocol implementation.
|
||||||
|
pub proto: &'a LightProtocol,
|
||||||
|
/// Relevant peer for event.
|
||||||
|
pub peer: PeerId,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> EventContext for Ctx<'a> {
|
||||||
|
fn peer(&self) -> PeerId {
|
||||||
|
self.peer
|
||||||
|
}
|
||||||
|
|
||||||
|
fn persistent_peer_id(&self, id: PeerId) -> Option<NodeId> {
|
||||||
|
self.io.persistent_peer_id(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn request_from(&self, peer: PeerId, request: Request) -> Result<ReqId, Error> {
|
||||||
|
self.proto.request_from(self.io, &peer, request)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_announcement(&self, announcement: Announcement) {
|
||||||
|
self.proto.make_announcement(self.io, announcement);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disconnect_peer(&self, peer: PeerId) {
|
||||||
|
self.io.disconnect_peer(peer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disable_peer(&self, peer: PeerId) {
|
||||||
|
self.io.disable_peer(peer);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -54,6 +54,14 @@ pub enum Error {
|
|||||||
WrongNetwork,
|
WrongNetwork,
|
||||||
/// Unknown peer.
|
/// Unknown peer.
|
||||||
UnknownPeer,
|
UnknownPeer,
|
||||||
|
/// Unsolicited response.
|
||||||
|
UnsolicitedResponse,
|
||||||
|
/// Not a server.
|
||||||
|
NotServer,
|
||||||
|
/// Unsupported protocol version.
|
||||||
|
UnsupportedProtocolVersion(u8),
|
||||||
|
/// Bad protocol version.
|
||||||
|
BadProtocolVersion,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Error {
|
impl Error {
|
||||||
@ -67,6 +75,10 @@ impl Error {
|
|||||||
Error::UnexpectedHandshake => Punishment::Disconnect,
|
Error::UnexpectedHandshake => Punishment::Disconnect,
|
||||||
Error::WrongNetwork => Punishment::Disable,
|
Error::WrongNetwork => Punishment::Disable,
|
||||||
Error::UnknownPeer => Punishment::Disconnect,
|
Error::UnknownPeer => Punishment::Disconnect,
|
||||||
|
Error::UnsolicitedResponse => Punishment::Disable,
|
||||||
|
Error::NotServer => Punishment::Disable,
|
||||||
|
Error::UnsupportedProtocolVersion(_) => Punishment::Disable,
|
||||||
|
Error::BadProtocolVersion => Punishment::Disable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,7 +104,11 @@ impl fmt::Display for Error {
|
|||||||
Error::UnrecognizedPacket(code) => write!(f, "Unrecognized packet: 0x{:x}", code),
|
Error::UnrecognizedPacket(code) => write!(f, "Unrecognized packet: 0x{:x}", code),
|
||||||
Error::UnexpectedHandshake => write!(f, "Unexpected handshake"),
|
Error::UnexpectedHandshake => write!(f, "Unexpected handshake"),
|
||||||
Error::WrongNetwork => write!(f, "Wrong network"),
|
Error::WrongNetwork => write!(f, "Wrong network"),
|
||||||
Error::UnknownPeer => write!(f, "unknown peer"),
|
Error::UnknownPeer => write!(f, "Unknown peer"),
|
||||||
|
Error::UnsolicitedResponse => write!(f, "Peer provided unsolicited data"),
|
||||||
|
Error::NotServer => write!(f, "Peer not a server."),
|
||||||
|
Error::UnsupportedProtocolVersion(pv) => write!(f, "Unsupported protocol version: {}", pv),
|
||||||
|
Error::BadProtocolVersion => write!(f, "Bad protocol version in handshake"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -82,26 +82,6 @@ impl Key {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Network ID structure.
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
||||||
#[repr(u32)]
|
|
||||||
pub enum NetworkId {
|
|
||||||
/// ID for the mainnet
|
|
||||||
Mainnet = 1,
|
|
||||||
/// ID for the testnet
|
|
||||||
Testnet = 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl NetworkId {
|
|
||||||
fn from_raw(raw: u32) -> Option<Self> {
|
|
||||||
match raw {
|
|
||||||
0 => Some(NetworkId::Testnet),
|
|
||||||
1 => Some(NetworkId::Mainnet),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper for decoding key-value pairs in the handshake or an announcement.
|
// helper for decoding key-value pairs in the handshake or an announcement.
|
||||||
struct Parser<'a> {
|
struct Parser<'a> {
|
||||||
pos: usize,
|
pos: usize,
|
||||||
@ -118,6 +98,7 @@ impl<'a> Parser<'a> {
|
|||||||
// expect a specific next key, and get the value's RLP.
|
// expect a specific next key, and get the value's RLP.
|
||||||
// if the key isn't found, the position isn't advanced.
|
// if the key isn't found, the position isn't advanced.
|
||||||
fn expect_raw(&mut self, key: Key) -> Result<UntrustedRlp<'a>, DecoderError> {
|
fn expect_raw(&mut self, key: Key) -> Result<UntrustedRlp<'a>, DecoderError> {
|
||||||
|
trace!(target: "les", "Expecting key {}", key.as_str());
|
||||||
let pre_pos = self.pos;
|
let pre_pos = self.pos;
|
||||||
if let Some((k, val)) = try!(self.get_next()) {
|
if let Some((k, val)) = try!(self.get_next()) {
|
||||||
if k == key { return Ok(val) }
|
if k == key { return Ok(val) }
|
||||||
@ -164,7 +145,7 @@ pub struct Status {
|
|||||||
/// Protocol version.
|
/// Protocol version.
|
||||||
pub protocol_version: u32,
|
pub protocol_version: u32,
|
||||||
/// Network id of this peer.
|
/// Network id of this peer.
|
||||||
pub network_id: NetworkId,
|
pub network_id: u64,
|
||||||
/// Total difficulty of the head of the chain.
|
/// Total difficulty of the head of the chain.
|
||||||
pub head_td: U256,
|
pub head_td: U256,
|
||||||
/// Hash of the best block.
|
/// Hash of the best block.
|
||||||
@ -217,7 +198,7 @@ impl Capabilities {
|
|||||||
/// - chain status
|
/// - chain status
|
||||||
/// - serving capabilities
|
/// - serving capabilities
|
||||||
/// - buffer flow parameters
|
/// - buffer flow parameters
|
||||||
pub fn parse_handshake(rlp: UntrustedRlp) -> Result<(Status, Capabilities, FlowParams), DecoderError> {
|
pub fn parse_handshake(rlp: UntrustedRlp) -> Result<(Status, Capabilities, Option<FlowParams>), DecoderError> {
|
||||||
let mut parser = Parser {
|
let mut parser = Parser {
|
||||||
pos: 0,
|
pos: 0,
|
||||||
rlp: rlp,
|
rlp: rlp,
|
||||||
@ -225,8 +206,7 @@ pub fn parse_handshake(rlp: UntrustedRlp) -> Result<(Status, Capabilities, FlowP
|
|||||||
|
|
||||||
let status = Status {
|
let status = Status {
|
||||||
protocol_version: try!(parser.expect(Key::ProtocolVersion)),
|
protocol_version: try!(parser.expect(Key::ProtocolVersion)),
|
||||||
network_id: try!(parser.expect(Key::NetworkId)
|
network_id: try!(parser.expect(Key::NetworkId)),
|
||||||
.and_then(|id: u32| NetworkId::from_raw(id).ok_or(DecoderError::Custom("Invalid network ID")))),
|
|
||||||
head_td: try!(parser.expect(Key::HeadTD)),
|
head_td: try!(parser.expect(Key::HeadTD)),
|
||||||
head_hash: try!(parser.expect(Key::HeadHash)),
|
head_hash: try!(parser.expect(Key::HeadHash)),
|
||||||
head_num: try!(parser.expect(Key::HeadNum)),
|
head_num: try!(parser.expect(Key::HeadNum)),
|
||||||
@ -241,20 +221,23 @@ pub fn parse_handshake(rlp: UntrustedRlp) -> Result<(Status, Capabilities, FlowP
|
|||||||
tx_relay: parser.expect_raw(Key::TxRelay).is_ok(),
|
tx_relay: parser.expect_raw(Key::TxRelay).is_ok(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let flow_params = FlowParams::new(
|
let flow_params = match (
|
||||||
try!(parser.expect(Key::BufferLimit)),
|
parser.expect(Key::BufferLimit),
|
||||||
try!(parser.expect(Key::BufferCostTable)),
|
parser.expect(Key::BufferCostTable),
|
||||||
try!(parser.expect(Key::BufferRechargeRate)),
|
parser.expect(Key::BufferRechargeRate)
|
||||||
);
|
) {
|
||||||
|
(Ok(bl), Ok(bct), Ok(brr)) => Some(FlowParams::new(bl, bct, brr)),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
Ok((status, capabilities, flow_params))
|
Ok((status, capabilities, flow_params))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write a handshake, given status, capabilities, and flow parameters.
|
/// Write a handshake, given status, capabilities, and flow parameters.
|
||||||
pub fn write_handshake(status: &Status, capabilities: &Capabilities, flow_params: &FlowParams) -> Vec<u8> {
|
pub fn write_handshake(status: &Status, capabilities: &Capabilities, flow_params: Option<&FlowParams>) -> Vec<u8> {
|
||||||
let mut pairs = Vec::new();
|
let mut pairs = Vec::new();
|
||||||
pairs.push(encode_pair(Key::ProtocolVersion, &status.protocol_version));
|
pairs.push(encode_pair(Key::ProtocolVersion, &status.protocol_version));
|
||||||
pairs.push(encode_pair(Key::NetworkId, &(status.network_id as u32)));
|
pairs.push(encode_pair(Key::NetworkId, &(status.network_id as u64)));
|
||||||
pairs.push(encode_pair(Key::HeadTD, &status.head_td));
|
pairs.push(encode_pair(Key::HeadTD, &status.head_td));
|
||||||
pairs.push(encode_pair(Key::HeadHash, &status.head_hash));
|
pairs.push(encode_pair(Key::HeadHash, &status.head_hash));
|
||||||
pairs.push(encode_pair(Key::HeadNum, &status.head_num));
|
pairs.push(encode_pair(Key::HeadNum, &status.head_num));
|
||||||
@ -273,9 +256,11 @@ pub fn write_handshake(status: &Status, capabilities: &Capabilities, flow_params
|
|||||||
pairs.push(encode_flag(Key::TxRelay));
|
pairs.push(encode_flag(Key::TxRelay));
|
||||||
}
|
}
|
||||||
|
|
||||||
pairs.push(encode_pair(Key::BufferLimit, flow_params.limit()));
|
if let Some(flow_params) = flow_params {
|
||||||
pairs.push(encode_pair(Key::BufferCostTable, flow_params.cost_table()));
|
pairs.push(encode_pair(Key::BufferLimit, flow_params.limit()));
|
||||||
pairs.push(encode_pair(Key::BufferRechargeRate, flow_params.recharge_rate()));
|
pairs.push(encode_pair(Key::BufferCostTable, flow_params.cost_table()));
|
||||||
|
pairs.push(encode_pair(Key::BufferRechargeRate, flow_params.recharge_rate()));
|
||||||
|
}
|
||||||
|
|
||||||
let mut stream = RlpStream::new_list(pairs.len());
|
let mut stream = RlpStream::new_list(pairs.len());
|
||||||
|
|
||||||
@ -385,7 +370,7 @@ mod tests {
|
|||||||
fn full_handshake() {
|
fn full_handshake() {
|
||||||
let status = Status {
|
let status = Status {
|
||||||
protocol_version: 1,
|
protocol_version: 1,
|
||||||
network_id: NetworkId::Mainnet,
|
network_id: 1,
|
||||||
head_td: U256::default(),
|
head_td: U256::default(),
|
||||||
head_hash: H256::default(),
|
head_hash: H256::default(),
|
||||||
head_num: 10,
|
head_num: 10,
|
||||||
@ -406,21 +391,21 @@ mod tests {
|
|||||||
1000.into(),
|
1000.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let handshake = write_handshake(&status, &capabilities, &flow_params);
|
let handshake = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
let (read_status, read_capabilities, read_flow)
|
let (read_status, read_capabilities, read_flow)
|
||||||
= parse_handshake(UntrustedRlp::new(&handshake)).unwrap();
|
= parse_handshake(UntrustedRlp::new(&handshake)).unwrap();
|
||||||
|
|
||||||
assert_eq!(read_status, status);
|
assert_eq!(read_status, status);
|
||||||
assert_eq!(read_capabilities, capabilities);
|
assert_eq!(read_capabilities, capabilities);
|
||||||
assert_eq!(read_flow, flow_params);
|
assert_eq!(read_flow.unwrap(), flow_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn partial_handshake() {
|
fn partial_handshake() {
|
||||||
let status = Status {
|
let status = Status {
|
||||||
protocol_version: 1,
|
protocol_version: 1,
|
||||||
network_id: NetworkId::Mainnet,
|
network_id: 1,
|
||||||
head_td: U256::default(),
|
head_td: U256::default(),
|
||||||
head_hash: H256::default(),
|
head_hash: H256::default(),
|
||||||
head_num: 10,
|
head_num: 10,
|
||||||
@ -441,21 +426,21 @@ mod tests {
|
|||||||
1000.into(),
|
1000.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let handshake = write_handshake(&status, &capabilities, &flow_params);
|
let handshake = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
let (read_status, read_capabilities, read_flow)
|
let (read_status, read_capabilities, read_flow)
|
||||||
= parse_handshake(UntrustedRlp::new(&handshake)).unwrap();
|
= parse_handshake(UntrustedRlp::new(&handshake)).unwrap();
|
||||||
|
|
||||||
assert_eq!(read_status, status);
|
assert_eq!(read_status, status);
|
||||||
assert_eq!(read_capabilities, capabilities);
|
assert_eq!(read_capabilities, capabilities);
|
||||||
assert_eq!(read_flow, flow_params);
|
assert_eq!(read_flow.unwrap(), flow_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn skip_unknown_keys() {
|
fn skip_unknown_keys() {
|
||||||
let status = Status {
|
let status = Status {
|
||||||
protocol_version: 1,
|
protocol_version: 1,
|
||||||
network_id: NetworkId::Mainnet,
|
network_id: 1,
|
||||||
head_td: U256::default(),
|
head_td: U256::default(),
|
||||||
head_hash: H256::default(),
|
head_hash: H256::default(),
|
||||||
head_num: 10,
|
head_num: 10,
|
||||||
@ -476,7 +461,7 @@ mod tests {
|
|||||||
1000.into(),
|
1000.into(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let handshake = write_handshake(&status, &capabilities, &flow_params);
|
let handshake = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
let interleaved = {
|
let interleaved = {
|
||||||
let handshake = UntrustedRlp::new(&handshake);
|
let handshake = UntrustedRlp::new(&handshake);
|
||||||
let mut stream = RlpStream::new_list(handshake.item_count() * 3);
|
let mut stream = RlpStream::new_list(handshake.item_count() * 3);
|
||||||
@ -498,7 +483,7 @@ mod tests {
|
|||||||
|
|
||||||
assert_eq!(read_status, status);
|
assert_eq!(read_status, status);
|
||||||
assert_eq!(read_capabilities, capabilities);
|
assert_eq!(read_capabilities, capabilities);
|
||||||
assert_eq!(read_flow, flow_params);
|
assert_eq!(read_flow.unwrap(), flow_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -548,4 +533,33 @@ mod tests {
|
|||||||
let out = stream.drain();
|
let out = stream.drain();
|
||||||
assert!(parse_announcement(UntrustedRlp::new(&out)).is_ok());
|
assert!(parse_announcement(UntrustedRlp::new(&out)).is_ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn optional_flow() {
|
||||||
|
let status = Status {
|
||||||
|
protocol_version: 1,
|
||||||
|
network_id: 1,
|
||||||
|
head_td: U256::default(),
|
||||||
|
head_hash: H256::default(),
|
||||||
|
head_num: 10,
|
||||||
|
genesis_hash: H256::zero(),
|
||||||
|
last_head: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let capabilities = Capabilities {
|
||||||
|
serve_headers: true,
|
||||||
|
serve_chain_since: Some(5),
|
||||||
|
serve_state_since: Some(8),
|
||||||
|
tx_relay: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
let handshake = write_handshake(&status, &capabilities, None);
|
||||||
|
|
||||||
|
let (read_status, read_capabilities, read_flow)
|
||||||
|
= parse_handshake(UntrustedRlp::new(&handshake)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(read_status, status);
|
||||||
|
assert_eq!(read_capabilities, capabilities);
|
||||||
|
assert!(read_flow.is_none());
|
||||||
|
}
|
||||||
}
|
}
|
525
ethcore/light/src/net/tests/mod.rs
Normal file
525
ethcore/light/src/net/tests/mod.rs
Normal file
@ -0,0 +1,525 @@
|
|||||||
|
// Copyright 2015, 2016 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Tests for the `LightProtocol` implementation.
|
||||||
|
//! These don't test of the higher level logic on top of
|
||||||
|
|
||||||
|
use ethcore::blockchain_info::BlockChainInfo;
|
||||||
|
use ethcore::client::{BlockChainClient, EachBlockWith, TestBlockChainClient};
|
||||||
|
use ethcore::ids::BlockId;
|
||||||
|
use ethcore::transaction::SignedTransaction;
|
||||||
|
use network::{PeerId, NodeId};
|
||||||
|
|
||||||
|
use net::buffer_flow::FlowParams;
|
||||||
|
use net::context::IoContext;
|
||||||
|
use net::status::{Capabilities, Status, write_handshake};
|
||||||
|
use net::{encode_request, LightProtocol, Params, packet};
|
||||||
|
use provider::Provider;
|
||||||
|
use request::{self, Request, Headers};
|
||||||
|
|
||||||
|
use rlp::*;
|
||||||
|
use util::{Bytes, H256, U256};
|
||||||
|
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
// expected result from a call.
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
enum Expect {
|
||||||
|
/// Expect to have message sent to peer.
|
||||||
|
Send(PeerId, u8, Vec<u8>),
|
||||||
|
/// Expect this response.
|
||||||
|
Respond(u8, Vec<u8>),
|
||||||
|
/// Expect a punishment (disconnect/disable)
|
||||||
|
Punish(PeerId),
|
||||||
|
/// Expect nothing.
|
||||||
|
Nothing,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IoContext for Expect {
|
||||||
|
fn send(&self, peer: PeerId, packet_id: u8, packet_body: Vec<u8>) {
|
||||||
|
assert_eq!(self, &Expect::Send(peer, packet_id, packet_body));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn respond(&self, packet_id: u8, packet_body: Vec<u8>) {
|
||||||
|
assert_eq!(self, &Expect::Respond(packet_id, packet_body));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disconnect_peer(&self, peer: PeerId) {
|
||||||
|
assert_eq!(self, &Expect::Punish(peer));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn disable_peer(&self, peer: PeerId) {
|
||||||
|
assert_eq!(self, &Expect::Punish(peer));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn protocol_version(&self, _peer: PeerId) -> Option<u8> {
|
||||||
|
Some(super::MAX_PROTOCOL_VERSION)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn persistent_peer_id(&self, _peer: PeerId) -> Option<NodeId> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// can't implement directly for Arc due to cross-crate orphan rules.
|
||||||
|
struct TestProvider(Arc<TestProviderInner>);
|
||||||
|
|
||||||
|
struct TestProviderInner {
|
||||||
|
client: TestBlockChainClient,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Provider for TestProvider {
|
||||||
|
fn chain_info(&self) -> BlockChainInfo {
|
||||||
|
self.0.client.chain_info()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reorg_depth(&self, a: &H256, b: &H256) -> Option<u64> {
|
||||||
|
self.0.client.tree_route(a, b).map(|route| route.index as u64)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn earliest_state(&self) -> Option<u64> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn block_headers(&self, req: request::Headers) -> Vec<Bytes> {
|
||||||
|
use request::HashOrNumber;
|
||||||
|
use ethcore::views::HeaderView;
|
||||||
|
|
||||||
|
let best_num = self.chain_info().best_block_number;
|
||||||
|
let start_num = match req.start {
|
||||||
|
HashOrNumber::Number(start_num) => start_num,
|
||||||
|
HashOrNumber::Hash(hash) => match self.0.client.block_header(BlockId::Hash(hash)) {
|
||||||
|
None => {
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
Some(header) => {
|
||||||
|
let num = HeaderView::new(&header).number();
|
||||||
|
if req.max == 1 || self.0.client.block_hash(BlockId::Number(num)) != Some(hash) {
|
||||||
|
// Non-canonical header or single header requested.
|
||||||
|
return vec![header];
|
||||||
|
}
|
||||||
|
|
||||||
|
num
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
(0u64..req.max as u64)
|
||||||
|
.map(|x: u64| x.saturating_mul(req.skip + 1))
|
||||||
|
.take_while(|x| if req.reverse { x < &start_num } else { best_num - start_num >= *x })
|
||||||
|
.map(|x| if req.reverse { start_num - x } else { start_num + x })
|
||||||
|
.map(|x| self.0.client.block_header(BlockId::Number(x)))
|
||||||
|
.take_while(|x| x.is_some())
|
||||||
|
.flat_map(|x| x)
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes> {
|
||||||
|
req.block_hashes.into_iter()
|
||||||
|
.map(|hash| self.0.client.block_body(BlockId::Hash(hash)))
|
||||||
|
.map(|body| body.unwrap_or_else(|| ::rlp::EMPTY_LIST_RLP.to_vec()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn receipts(&self, req: request::Receipts) -> Vec<Bytes> {
|
||||||
|
req.block_hashes.into_iter()
|
||||||
|
.map(|hash| self.0.client.block_receipts(&hash))
|
||||||
|
.map(|receipts| receipts.unwrap_or_else(|| ::rlp::EMPTY_LIST_RLP.to_vec()))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn proofs(&self, req: request::StateProofs) -> Vec<Bytes> {
|
||||||
|
req.requests.into_iter()
|
||||||
|
.map(|req| {
|
||||||
|
match req.key2 {
|
||||||
|
Some(_) => ::util::sha3::SHA3_NULL_RLP.to_vec(),
|
||||||
|
None => {
|
||||||
|
// sort of a leaf node
|
||||||
|
let mut stream = RlpStream::new_list(2);
|
||||||
|
stream.append(&req.key1).append_empty_data();
|
||||||
|
stream.out()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes> {
|
||||||
|
req.code_requests.into_iter()
|
||||||
|
.map(|req| {
|
||||||
|
req.account_key.iter().chain(req.account_key.iter()).cloned().collect()
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes> {
|
||||||
|
req.requests.into_iter().map(|_| ::rlp::EMPTY_LIST_RLP.to_vec()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn pending_transactions(&self) -> Vec<SignedTransaction> {
|
||||||
|
self.0.client.pending_transactions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_flow_params() -> FlowParams {
|
||||||
|
FlowParams::new(5_000_000.into(), Default::default(), 100_000.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn capabilities() -> Capabilities {
|
||||||
|
Capabilities {
|
||||||
|
serve_headers: true,
|
||||||
|
serve_chain_since: Some(1),
|
||||||
|
serve_state_since: Some(1),
|
||||||
|
tx_relay: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// helper for setting up the protocol handler and provider.
|
||||||
|
fn setup(flow_params: FlowParams, capabilities: Capabilities) -> (Arc<TestProviderInner>, LightProtocol) {
|
||||||
|
let provider = Arc::new(TestProviderInner {
|
||||||
|
client: TestBlockChainClient::new(),
|
||||||
|
});
|
||||||
|
|
||||||
|
let proto = LightProtocol::new(Arc::new(TestProvider(provider.clone())), Params {
|
||||||
|
network_id: 2,
|
||||||
|
flow_params: flow_params,
|
||||||
|
capabilities: capabilities,
|
||||||
|
});
|
||||||
|
|
||||||
|
(provider, proto)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn status(chain_info: BlockChainInfo) -> Status {
|
||||||
|
Status {
|
||||||
|
protocol_version: 1,
|
||||||
|
network_id: 2,
|
||||||
|
head_td: chain_info.total_difficulty,
|
||||||
|
head_hash: chain_info.best_block_hash,
|
||||||
|
head_num: chain_info.best_block_number,
|
||||||
|
genesis_hash: chain_info.genesis_hash,
|
||||||
|
last_head: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn handshake_expected() {
|
||||||
|
let flow_params = make_flow_params();
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
let packet_body = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn genesis_mismatch() {
|
||||||
|
let flow_params = make_flow_params();
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let mut status = status(provider.client.chain_info());
|
||||||
|
status.genesis_hash = H256::default();
|
||||||
|
|
||||||
|
let packet_body = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn buffer_overflow() {
|
||||||
|
let flow_params = make_flow_params();
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
let my_status = write_handshake(&status, &capabilities, Some(&flow_params));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1000 requests is far too many for the default flow params.
|
||||||
|
let request = encode_request(&Request::Headers(Headers {
|
||||||
|
start: 1.into(),
|
||||||
|
max: 1000,
|
||||||
|
skip: 0,
|
||||||
|
reverse: false,
|
||||||
|
}), 111);
|
||||||
|
|
||||||
|
proto.handle_packet(&Expect::Punish(1), &1, packet::GET_BLOCK_HEADERS, &request);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test the basic request types -- these just make sure that requests are parsed
|
||||||
|
// and sent to the provider correctly as well as testing response formatting.
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_block_headers() {
|
||||||
|
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
let my_status = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
|
provider.client.add_blocks(100, EachBlockWith::Nothing);
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
let request = Headers {
|
||||||
|
start: 1.into(),
|
||||||
|
max: 10,
|
||||||
|
skip: 0,
|
||||||
|
reverse: false,
|
||||||
|
};
|
||||||
|
let req_id = 111;
|
||||||
|
|
||||||
|
let request_body = encode_request(&Request::Headers(request.clone()), req_id);
|
||||||
|
let response = {
|
||||||
|
let headers: Vec<_> = (0..10).map(|i| provider.client.block_header(BlockId::Number(i + 1)).unwrap()).collect();
|
||||||
|
assert_eq!(headers.len(), 10);
|
||||||
|
|
||||||
|
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Headers, 10);
|
||||||
|
|
||||||
|
let mut response_stream = RlpStream::new_list(3);
|
||||||
|
|
||||||
|
response_stream.append(&req_id).append(&new_buf).begin_list(10);
|
||||||
|
for header in headers {
|
||||||
|
response_stream.append_raw(&header, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_stream.out()
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected = Expect::Respond(packet::BLOCK_HEADERS, response);
|
||||||
|
proto.handle_packet(&expected, &1, packet::GET_BLOCK_HEADERS, &request_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_block_bodies() {
|
||||||
|
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
let my_status = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
|
provider.client.add_blocks(100, EachBlockWith::Nothing);
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
let request = request::Bodies {
|
||||||
|
block_hashes: (0..10).map(|i| provider.client.block_hash(BlockId::Number(i)).unwrap()).collect(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let req_id = 111;
|
||||||
|
|
||||||
|
let request_body = encode_request(&Request::Bodies(request.clone()), req_id);
|
||||||
|
let response = {
|
||||||
|
let bodies: Vec<_> = (0..10).map(|i| provider.client.block_body(BlockId::Number(i + 1)).unwrap()).collect();
|
||||||
|
assert_eq!(bodies.len(), 10);
|
||||||
|
|
||||||
|
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Bodies, 10);
|
||||||
|
|
||||||
|
let mut response_stream = RlpStream::new_list(3);
|
||||||
|
|
||||||
|
response_stream.append(&req_id).append(&new_buf).begin_list(10);
|
||||||
|
for body in bodies {
|
||||||
|
response_stream.append_raw(&body, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_stream.out()
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected = Expect::Respond(packet::BLOCK_BODIES, response);
|
||||||
|
proto.handle_packet(&expected, &1, packet::GET_BLOCK_BODIES, &request_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_block_receipts() {
|
||||||
|
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
let my_status = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
|
||||||
|
provider.client.add_blocks(1000, EachBlockWith::Nothing);
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &my_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the first 10 block hashes starting with `f` because receipts are only provided
|
||||||
|
// by the test client in that case.
|
||||||
|
let block_hashes: Vec<_> = (0..1000).map(|i| provider.client.block_hash(BlockId::Number(i)).unwrap())
|
||||||
|
.filter(|hash| format!("{}", hash).starts_with("f")).take(10).collect();
|
||||||
|
|
||||||
|
let request = request::Receipts {
|
||||||
|
block_hashes: block_hashes.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let req_id = 111;
|
||||||
|
|
||||||
|
let request_body = encode_request(&Request::Receipts(request.clone()), req_id);
|
||||||
|
let response = {
|
||||||
|
let receipts: Vec<_> = block_hashes.iter()
|
||||||
|
.map(|hash| provider.client.block_receipts(hash).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Receipts, receipts.len());
|
||||||
|
|
||||||
|
let mut response_stream = RlpStream::new_list(3);
|
||||||
|
|
||||||
|
response_stream.append(&req_id).append(&new_buf).begin_list(receipts.len());
|
||||||
|
for block_receipts in receipts {
|
||||||
|
response_stream.append_raw(&block_receipts, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_stream.out()
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected = Expect::Respond(packet::RECEIPTS, response);
|
||||||
|
proto.handle_packet(&expected, &1, packet::GET_RECEIPTS, &request_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_state_proofs() {
|
||||||
|
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body.clone()));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &packet_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
let req_id = 112;
|
||||||
|
let key1 = U256::from(11223344).into();
|
||||||
|
let key2 = U256::from(99988887).into();
|
||||||
|
|
||||||
|
let request = Request::StateProofs (request::StateProofs {
|
||||||
|
requests: vec![
|
||||||
|
request::StateProof { block: H256::default(), key1: key1, key2: None, from_level: 0 },
|
||||||
|
request::StateProof { block: H256::default(), key1: key1, key2: Some(key2), from_level: 0},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
let request_body = encode_request(&request, req_id);
|
||||||
|
let response = {
|
||||||
|
let proofs = vec![
|
||||||
|
{ let mut stream = RlpStream::new_list(2); stream.append(&key1).append_empty_data(); stream.out() },
|
||||||
|
::util::sha3::SHA3_NULL_RLP.to_vec(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::StateProofs, 2);
|
||||||
|
|
||||||
|
let mut response_stream = RlpStream::new_list(3);
|
||||||
|
|
||||||
|
response_stream.append(&req_id).append(&new_buf).begin_list(2);
|
||||||
|
for proof in proofs {
|
||||||
|
response_stream.append_raw(&proof, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_stream.out()
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected = Expect::Respond(packet::PROOFS, response);
|
||||||
|
proto.handle_packet(&expected, &1, packet::GET_PROOFS, &request_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_contract_code() {
|
||||||
|
let flow_params = FlowParams::new(5_000_000.into(), Default::default(), 0.into());
|
||||||
|
let capabilities = capabilities();
|
||||||
|
|
||||||
|
let (provider, proto) = setup(flow_params.clone(), capabilities.clone());
|
||||||
|
|
||||||
|
let cur_status = status(provider.client.chain_info());
|
||||||
|
|
||||||
|
{
|
||||||
|
let packet_body = write_handshake(&cur_status, &capabilities, Some(&flow_params));
|
||||||
|
proto.on_connect(&1, &Expect::Send(1, packet::STATUS, packet_body.clone()));
|
||||||
|
proto.handle_packet(&Expect::Nothing, &1, packet::STATUS, &packet_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
let req_id = 112;
|
||||||
|
let key1 = U256::from(11223344).into();
|
||||||
|
let key2 = U256::from(99988887).into();
|
||||||
|
|
||||||
|
let request = Request::Codes (request::ContractCodes {
|
||||||
|
code_requests: vec![
|
||||||
|
request::ContractCode { block_hash: H256::default(), account_key: key1 },
|
||||||
|
request::ContractCode { block_hash: H256::default(), account_key: key2 },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
let request_body = encode_request(&request, req_id);
|
||||||
|
let response = {
|
||||||
|
let codes: Vec<Vec<_>> = vec![
|
||||||
|
key1.iter().chain(key1.iter()).cloned().collect(),
|
||||||
|
key2.iter().chain(key2.iter()).cloned().collect(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let new_buf = *flow_params.limit() - flow_params.compute_cost(request::Kind::Codes, 2);
|
||||||
|
|
||||||
|
let mut response_stream = RlpStream::new_list(3);
|
||||||
|
|
||||||
|
response_stream.append(&req_id).append(&new_buf).begin_list(2);
|
||||||
|
for code in codes {
|
||||||
|
response_stream.append(&code);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_stream.out()
|
||||||
|
};
|
||||||
|
|
||||||
|
let expected = Expect::Respond(packet::CONTRACT_CODES, response);
|
||||||
|
proto.handle_packet(&expected, &1, packet::GET_CONTRACT_CODES, &request_body);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -20,7 +20,7 @@
|
|||||||
use ethcore::blockchain_info::BlockChainInfo;
|
use ethcore::blockchain_info::BlockChainInfo;
|
||||||
use ethcore::client::{BlockChainClient, ProvingBlockChainClient};
|
use ethcore::client::{BlockChainClient, ProvingBlockChainClient};
|
||||||
use ethcore::transaction::SignedTransaction;
|
use ethcore::transaction::SignedTransaction;
|
||||||
use ethcore::ids::BlockID;
|
use ethcore::ids::BlockId;
|
||||||
|
|
||||||
use util::{Bytes, H256};
|
use util::{Bytes, H256};
|
||||||
|
|
||||||
@ -33,6 +33,7 @@ use request;
|
|||||||
/// or empty vector where appropriate.
|
/// or empty vector where appropriate.
|
||||||
///
|
///
|
||||||
/// [1]: https://github.com/ethcore/parity/wiki/Light-Ethereum-Subprotocol-(LES)
|
/// [1]: https://github.com/ethcore/parity/wiki/Light-Ethereum-Subprotocol-(LES)
|
||||||
|
#[cfg_attr(feature = "ipc", ipc(client_ident="LightProviderClient"))]
|
||||||
pub trait Provider: Send + Sync {
|
pub trait Provider: Send + Sync {
|
||||||
/// Provide current blockchain info.
|
/// Provide current blockchain info.
|
||||||
fn chain_info(&self) -> BlockChainInfo;
|
fn chain_info(&self) -> BlockChainInfo;
|
||||||
@ -71,7 +72,10 @@ pub trait Provider: Send + Sync {
|
|||||||
/// Each item in the resulting vector is either the raw bytecode or empty.
|
/// Each item in the resulting vector is either the raw bytecode or empty.
|
||||||
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes>;
|
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes>;
|
||||||
|
|
||||||
/// Provide header proofs from the Canonical Hash Tries.
|
/// Provide header proofs from the Canonical Hash Tries as well as the headers
|
||||||
|
/// they correspond to -- each element in the returned vector is a 2-tuple.
|
||||||
|
/// The first element is a block header and the second a merkle proof of
|
||||||
|
/// the header in a requested CHT.
|
||||||
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes>;
|
fn header_proofs(&self, req: request::HeaderProofs) -> Vec<Bytes>;
|
||||||
|
|
||||||
/// Provide pending transactions.
|
/// Provide pending transactions.
|
||||||
@ -93,22 +97,34 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn block_headers(&self, req: request::Headers) -> Vec<Bytes> {
|
fn block_headers(&self, req: request::Headers) -> Vec<Bytes> {
|
||||||
|
use request::HashOrNumber;
|
||||||
|
use ethcore::views::HeaderView;
|
||||||
|
|
||||||
let best_num = self.chain_info().best_block_number;
|
let best_num = self.chain_info().best_block_number;
|
||||||
let start_num = req.block_num;
|
let start_num = match req.start {
|
||||||
|
HashOrNumber::Number(start_num) => start_num,
|
||||||
|
HashOrNumber::Hash(hash) => match self.block_header(BlockId::Hash(hash)) {
|
||||||
|
None => {
|
||||||
|
trace!(target: "les_provider", "Unknown block hash {} requested", hash);
|
||||||
|
return Vec::new();
|
||||||
|
}
|
||||||
|
Some(header) => {
|
||||||
|
let num = HeaderView::new(&header).number();
|
||||||
|
if req.max == 1 || self.block_hash(BlockId::Number(num)) != Some(hash) {
|
||||||
|
// Non-canonical header or single header requested.
|
||||||
|
return vec![header];
|
||||||
|
}
|
||||||
|
|
||||||
match self.block_hash(BlockID::Number(req.block_num)) {
|
num
|
||||||
Some(hash) if hash == req.block_hash => {}
|
}
|
||||||
_=> {
|
|
||||||
trace!(target: "les_provider", "unknown/non-canonical start block in header request: {:?}", (req.block_num, req.block_hash));
|
|
||||||
return vec![]
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
(0u64..req.max as u64)
|
(0u64..req.max as u64)
|
||||||
.map(|x: u64| x.saturating_mul(req.skip))
|
.map(|x: u64| x.saturating_mul(req.skip + 1))
|
||||||
.take_while(|x| if req.reverse { x < &start_num } else { best_num - start_num < *x })
|
.take_while(|x| if req.reverse { x < &start_num } else { best_num - start_num >= *x })
|
||||||
.map(|x| if req.reverse { start_num - x } else { start_num + x })
|
.map(|x| if req.reverse { start_num - x } else { start_num + x })
|
||||||
.map(|x| self.block_header(BlockID::Number(x)))
|
.map(|x| self.block_header(BlockId::Number(x)))
|
||||||
.take_while(|x| x.is_some())
|
.take_while(|x| x.is_some())
|
||||||
.flat_map(|x| x)
|
.flat_map(|x| x)
|
||||||
.collect()
|
.collect()
|
||||||
@ -116,7 +132,7 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T {
|
|||||||
|
|
||||||
fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes> {
|
fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes> {
|
||||||
req.block_hashes.into_iter()
|
req.block_hashes.into_iter()
|
||||||
.map(|hash| self.block_body(BlockID::Hash(hash)))
|
.map(|hash| self.block_body(BlockId::Hash(hash)))
|
||||||
.map(|body| body.unwrap_or_else(|| ::rlp::EMPTY_LIST_RLP.to_vec()))
|
.map(|body| body.unwrap_or_else(|| ::rlp::EMPTY_LIST_RLP.to_vec()))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@ -135,8 +151,8 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T {
|
|||||||
|
|
||||||
for request in req.requests {
|
for request in req.requests {
|
||||||
let proof = match request.key2 {
|
let proof = match request.key2 {
|
||||||
Some(key2) => self.prove_storage(request.key1, key2, request.from_level, BlockID::Hash(request.block)),
|
Some(key2) => self.prove_storage(request.key1, key2, request.from_level, BlockId::Hash(request.block)),
|
||||||
None => self.prove_account(request.key1, request.from_level, BlockID::Hash(request.block)),
|
None => self.prove_account(request.key1, request.from_level, BlockId::Hash(request.block)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut stream = RlpStream::new_list(proof.len());
|
let mut stream = RlpStream::new_list(proof.len());
|
||||||
@ -153,7 +169,7 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T {
|
|||||||
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes> {
|
fn contract_code(&self, req: request::ContractCodes) -> Vec<Bytes> {
|
||||||
req.code_requests.into_iter()
|
req.code_requests.into_iter()
|
||||||
.map(|req| {
|
.map(|req| {
|
||||||
self.code_by_hash(req.account_key, BlockID::Hash(req.block_hash))
|
self.code_by_hash(req.account_key, BlockId::Hash(req.block_hash))
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -18,14 +18,34 @@
|
|||||||
|
|
||||||
use util::H256;
|
use util::H256;
|
||||||
|
|
||||||
|
/// Either a hash or a number.
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
|
pub enum HashOrNumber {
|
||||||
|
/// Block hash variant.
|
||||||
|
Hash(H256),
|
||||||
|
/// Block number variant.
|
||||||
|
Number(u64),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<H256> for HashOrNumber {
|
||||||
|
fn from(hash: H256) -> Self {
|
||||||
|
HashOrNumber::Hash(hash)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u64> for HashOrNumber {
|
||||||
|
fn from(num: u64) -> Self {
|
||||||
|
HashOrNumber::Number(num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A request for block headers.
|
/// A request for block headers.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct Headers {
|
pub struct Headers {
|
||||||
/// Starting block number
|
/// Starting block number or hash.
|
||||||
pub block_num: u64,
|
pub start: HashOrNumber,
|
||||||
/// Starting block hash. This and number could be combined but IPC codegen is
|
|
||||||
/// not robust enough to support it.
|
|
||||||
pub block_hash: H256,
|
|
||||||
/// The maximum amount of headers which can be returned.
|
/// The maximum amount of headers which can be returned.
|
||||||
pub max: usize,
|
pub max: usize,
|
||||||
/// The amount of headers to skip between each response entry.
|
/// The amount of headers to skip between each response entry.
|
||||||
@ -35,7 +55,8 @@ pub struct Headers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A request for specific block bodies.
|
/// A request for specific block bodies.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct Bodies {
|
pub struct Bodies {
|
||||||
/// Hashes which bodies are being requested for.
|
/// Hashes which bodies are being requested for.
|
||||||
pub block_hashes: Vec<H256>
|
pub block_hashes: Vec<H256>
|
||||||
@ -45,14 +66,16 @@ pub struct Bodies {
|
|||||||
///
|
///
|
||||||
/// This request is answered with a list of transaction receipts for each block
|
/// This request is answered with a list of transaction receipts for each block
|
||||||
/// requested.
|
/// requested.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct Receipts {
|
pub struct Receipts {
|
||||||
/// Block hashes to return receipts for.
|
/// Block hashes to return receipts for.
|
||||||
pub block_hashes: Vec<H256>,
|
pub block_hashes: Vec<H256>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A request for a state proof
|
/// A request for a state proof
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct StateProof {
|
pub struct StateProof {
|
||||||
/// Block hash to query state from.
|
/// Block hash to query state from.
|
||||||
pub block: H256,
|
pub block: H256,
|
||||||
@ -66,14 +89,16 @@ pub struct StateProof {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A request for state proofs.
|
/// A request for state proofs.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct StateProofs {
|
pub struct StateProofs {
|
||||||
/// All the proof requests.
|
/// All the proof requests.
|
||||||
pub requests: Vec<StateProof>,
|
pub requests: Vec<StateProof>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A request for contract code.
|
/// A request for contract code.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct ContractCode {
|
pub struct ContractCode {
|
||||||
/// Block hash
|
/// Block hash
|
||||||
pub block_hash: H256,
|
pub block_hash: H256,
|
||||||
@ -82,14 +107,16 @@ pub struct ContractCode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A request for contract code.
|
/// A request for contract code.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct ContractCodes {
|
pub struct ContractCodes {
|
||||||
/// Block hash and account key (== sha3(address)) pairs to fetch code for.
|
/// Block hash and account key (== sha3(address)) pairs to fetch code for.
|
||||||
pub code_requests: Vec<ContractCode>,
|
pub code_requests: Vec<ContractCode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A request for a header proof from the Canonical Hash Trie.
|
/// A request for a header proof from the Canonical Hash Trie.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct HeaderProof {
|
pub struct HeaderProof {
|
||||||
/// Number of the CHT.
|
/// Number of the CHT.
|
||||||
pub cht_number: u64,
|
pub cht_number: u64,
|
||||||
@ -100,14 +127,16 @@ pub struct HeaderProof {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A request for header proofs from the CHT.
|
/// A request for header proofs from the CHT.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub struct HeaderProofs {
|
pub struct HeaderProofs {
|
||||||
/// All the proof requests.
|
/// All the proof requests.
|
||||||
pub requests: Vec<HeaderProof>,
|
pub requests: Vec<HeaderProof>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Kinds of requests.
|
/// Kinds of requests.
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub enum Kind {
|
pub enum Kind {
|
||||||
/// Requesting headers.
|
/// Requesting headers.
|
||||||
Headers,
|
Headers,
|
||||||
@ -124,7 +153,8 @@ pub enum Kind {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Encompasses all possible types of requests in a single structure.
|
/// Encompasses all possible types of requests in a single structure.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Binary)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "ipc", derive(Binary))]
|
||||||
pub enum Request {
|
pub enum Request {
|
||||||
/// Requesting headers.
|
/// Requesting headers.
|
||||||
Headers(Headers),
|
Headers(Headers),
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -15,6 +15,11 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//! Types used in the public (IPC) api which require custom code generation.
|
//! Types used in the public (IPC) api which require custom code generation.
|
||||||
|
#![cfg_attr(feature = "ipc", allow(dead_code, unused_assignments, unused_variables))] // codegen issues
|
||||||
|
|
||||||
#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues
|
|
||||||
|
#[cfg(feature = "ipc")]
|
||||||
include!(concat!(env!("OUT_DIR"), "/mod.rs.in"));
|
include!(concat!(env!("OUT_DIR"), "/mod.rs.in"));
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ipc"))]
|
||||||
|
include!("mod.rs.in");
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
"AuthorityRound": {
|
"AuthorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"stepDuration": "1",
|
"stepDuration": 1,
|
||||||
|
"startStep": 2,
|
||||||
"authorities" : [
|
"authorities" : [
|
||||||
"0x7d577a597b2742b498cb5cf0c26cdcd726d39e6e",
|
"0x7d577a597b2742b498cb5cf0c26cdcd726d39e6e",
|
||||||
"0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1"
|
"0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1"
|
||||||
|
@ -170,9 +170,6 @@
|
|||||||
"enode://cadc6e573b6bc2a9128f2f635ac0db3353e360b56deef239e9be7e7fce039502e0ec670b595f6288c0d2116812516ad6b6ff8d5728ff45eba176989e40dead1e@37.128.191.230:30303",
|
"enode://cadc6e573b6bc2a9128f2f635ac0db3353e360b56deef239e9be7e7fce039502e0ec670b595f6288c0d2116812516ad6b6ff8d5728ff45eba176989e40dead1e@37.128.191.230:30303",
|
||||||
"enode://595a9a06f8b9bc9835c8723b6a82105aea5d55c66b029b6d44f229d6d135ac3ecdd3e9309360a961ea39d7bee7bac5d03564077a4e08823acc723370aace65ec@46.20.235.22:30303",
|
"enode://595a9a06f8b9bc9835c8723b6a82105aea5d55c66b029b6d44f229d6d135ac3ecdd3e9309360a961ea39d7bee7bac5d03564077a4e08823acc723370aace65ec@46.20.235.22:30303",
|
||||||
"enode://029178d6d6f9f8026fc0bc17d5d1401aac76ec9d86633bba2320b5eed7b312980c0a210b74b20c4f9a8b0b2bf884b111fa9ea5c5f916bb9bbc0e0c8640a0f56c@216.158.85.185:30303",
|
"enode://029178d6d6f9f8026fc0bc17d5d1401aac76ec9d86633bba2320b5eed7b312980c0a210b74b20c4f9a8b0b2bf884b111fa9ea5c5f916bb9bbc0e0c8640a0f56c@216.158.85.185:30303",
|
||||||
"enode://84f5d5957b4880a8b0545e32e05472318898ad9fc8ebe1d56c90c12334a98e12351eccfdf3a2bf72432ac38b57e9d348400d17caa083879ade3822390f89773f@10.1.52.78:30303",
|
|
||||||
"enode://f90dc9b9bf7b8db97726b7849e175f1eb2707f3d8f281c929336e398dd89b0409fc6aeceb89e846278e9d3ecc3857cebfbe6758ff352ece6fe5d42921ee761db@10.1.173.87:30303",
|
|
||||||
"enode://6a868ced2dec399c53f730261173638a93a40214cf299ccf4d42a76e3fa54701db410669e8006347a4b3a74fa090bb35af0320e4bc8d04cf5b7f582b1db285f5@10.3.149.199:30303",
|
|
||||||
"enode://fdd1b9bb613cfbc200bba17ce199a9490edc752a833f88d4134bf52bb0d858aa5524cb3ec9366c7a4ef4637754b8b15b5dc913e4ed9fdb6022f7512d7b63f181@212.47.247.103:30303",
|
"enode://fdd1b9bb613cfbc200bba17ce199a9490edc752a833f88d4134bf52bb0d858aa5524cb3ec9366c7a4ef4637754b8b15b5dc913e4ed9fdb6022f7512d7b63f181@212.47.247.103:30303",
|
||||||
"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303",
|
"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303",
|
||||||
"enode://de471bccee3d042261d52e9bff31458daecc406142b401d4cd848f677479f73104b9fdeb090af9583d3391b7f10cb2ba9e26865dd5fca4fcdc0fb1e3b723c786@54.94.239.50:30303",
|
"enode://de471bccee3d042261d52e9bff31458daecc406142b401d4cd848f677479f73104b9fdeb090af9583d3391b7f10cb2ba9e26865dd5fca4fcdc0fb1e3b723c786@54.94.239.50:30303",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -213,7 +213,7 @@ impl AccountProvider {
|
|||||||
Ok(AccountMeta {
|
Ok(AccountMeta {
|
||||||
name: try!(self.sstore.name(&account)),
|
name: try!(self.sstore.name(&account)),
|
||||||
meta: try!(self.sstore.meta(&account)),
|
meta: try!(self.sstore.meta(&account)),
|
||||||
uuid: self.sstore.uuid(&account).ok().map(Into::into), // allowed to not have a UUID
|
uuid: self.sstore.uuid(&account).ok().map(Into::into), // allowed to not have a Uuid
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -266,7 +266,8 @@ impl<'x> OpenBlock<'x> {
|
|||||||
r.block.base.header.set_extra_data(extra_data);
|
r.block.base.header.set_extra_data(extra_data);
|
||||||
r.block.base.header.note_dirty();
|
r.block.base.header.note_dirty();
|
||||||
|
|
||||||
engine.populate_from_parent(&mut r.block.base.header, parent, gas_range_target.0, gas_range_target.1);
|
let gas_floor_target = ::std::cmp::max(gas_range_target.0, engine.params().min_gas_limit);
|
||||||
|
engine.populate_from_parent(&mut r.block.base.header, parent, gas_floor_target, gas_range_target.1);
|
||||||
engine.on_new_block(&mut r.block);
|
engine.on_new_block(&mut r.block);
|
||||||
Ok(r)
|
Ok(r)
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@ -146,7 +146,7 @@ pub trait BlockProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
|
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
|
||||||
enum CacheID {
|
enum CacheId {
|
||||||
BlockHeader(H256),
|
BlockHeader(H256),
|
||||||
BlockBody(H256),
|
BlockBody(H256),
|
||||||
BlockDetails(H256),
|
BlockDetails(H256),
|
||||||
@ -160,7 +160,7 @@ impl bc::group::BloomGroupDatabase for BlockChain {
|
|||||||
fn blooms_at(&self, position: &bc::group::GroupPosition) -> Option<bc::group::BloomGroup> {
|
fn blooms_at(&self, position: &bc::group::GroupPosition) -> Option<bc::group::BloomGroup> {
|
||||||
let position = LogGroupPosition::from(position.clone());
|
let position = LogGroupPosition::from(position.clone());
|
||||||
let result = self.db.read_with_cache(db::COL_EXTRA, &self.blocks_blooms, &position).map(Into::into);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.blocks_blooms, &position).map(Into::into);
|
||||||
self.cache_man.lock().note_used(CacheID::BlocksBlooms(position));
|
self.cache_man.lock().note_used(CacheId::BlocksBlooms(position));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,7 +193,7 @@ pub struct BlockChain {
|
|||||||
|
|
||||||
db: Arc<Database>,
|
db: Arc<Database>,
|
||||||
|
|
||||||
cache_man: Mutex<CacheManager<CacheID>>,
|
cache_man: Mutex<CacheManager<CacheId>>,
|
||||||
|
|
||||||
pending_best_block: RwLock<Option<BestBlock>>,
|
pending_best_block: RwLock<Option<BestBlock>>,
|
||||||
pending_block_hashes: RwLock<HashMap<BlockNumber, H256>>,
|
pending_block_hashes: RwLock<HashMap<BlockNumber, H256>>,
|
||||||
@ -270,7 +270,7 @@ impl BlockProvider for BlockChain {
|
|||||||
None => None
|
None => None
|
||||||
};
|
};
|
||||||
|
|
||||||
self.cache_man.lock().note_used(CacheID::BlockHeader(hash.clone()));
|
self.cache_man.lock().note_used(CacheId::BlockHeader(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +306,7 @@ impl BlockProvider for BlockChain {
|
|||||||
None => None
|
None => None
|
||||||
};
|
};
|
||||||
|
|
||||||
self.cache_man.lock().note_used(CacheID::BlockBody(hash.clone()));
|
self.cache_man.lock().note_used(CacheId::BlockBody(hash.clone()));
|
||||||
|
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@ -314,28 +314,28 @@ impl BlockProvider for BlockChain {
|
|||||||
/// Get the familial details concerning a block.
|
/// Get the familial details concerning a block.
|
||||||
fn block_details(&self, hash: &H256) -> Option<BlockDetails> {
|
fn block_details(&self, hash: &H256) -> Option<BlockDetails> {
|
||||||
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_details, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_details, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockDetails(hash.clone()));
|
self.cache_man.lock().note_used(CacheId::BlockDetails(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the hash of given block's number.
|
/// Get the hash of given block's number.
|
||||||
fn block_hash(&self, index: BlockNumber) -> Option<H256> {
|
fn block_hash(&self, index: BlockNumber) -> Option<H256> {
|
||||||
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_hashes, &index);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_hashes, &index);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockHashes(index));
|
self.cache_man.lock().note_used(CacheId::BlockHashes(index));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the address of transaction with given hash.
|
/// Get the address of transaction with given hash.
|
||||||
fn transaction_address(&self, hash: &H256) -> Option<TransactionAddress> {
|
fn transaction_address(&self, hash: &H256) -> Option<TransactionAddress> {
|
||||||
let result = self.db.read_with_cache(db::COL_EXTRA, &self.transaction_addresses, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.transaction_addresses, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::TransactionAddresses(hash.clone()));
|
self.cache_man.lock().note_used(CacheId::TransactionAddresses(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get receipts of block with given hash.
|
/// Get receipts of block with given hash.
|
||||||
fn block_receipts(&self, hash: &H256) -> Option<BlockReceipts> {
|
fn block_receipts(&self, hash: &H256) -> Option<BlockReceipts> {
|
||||||
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_receipts, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_receipts, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockReceipts(hash.clone()));
|
self.cache_man.lock().note_used(CacheId::BlockReceipts(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -809,7 +809,7 @@ impl BlockChain {
|
|||||||
let mut write_details = self.block_details.write();
|
let mut write_details = self.block_details.write();
|
||||||
batch.extend_with_cache(db::COL_EXTRA, &mut *write_details, update, CacheUpdatePolicy::Overwrite);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_details, update, CacheUpdatePolicy::Overwrite);
|
||||||
|
|
||||||
self.cache_man.lock().note_used(CacheID::BlockDetails(block_hash));
|
self.cache_man.lock().note_used(CacheId::BlockDetails(block_hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature="dev", allow(similar_names))]
|
#[cfg_attr(feature="dev", allow(similar_names))]
|
||||||
@ -968,15 +968,15 @@ impl BlockChain {
|
|||||||
|
|
||||||
let mut cache_man = self.cache_man.lock();
|
let mut cache_man = self.cache_man.lock();
|
||||||
for n in pending_hashes_keys {
|
for n in pending_hashes_keys {
|
||||||
cache_man.note_used(CacheID::BlockHashes(n));
|
cache_man.note_used(CacheId::BlockHashes(n));
|
||||||
}
|
}
|
||||||
|
|
||||||
for hash in enacted_txs_keys {
|
for hash in enacted_txs_keys {
|
||||||
cache_man.note_used(CacheID::TransactionAddresses(hash));
|
cache_man.note_used(CacheId::TransactionAddresses(hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
for hash in pending_block_hashes {
|
for hash in pending_block_hashes {
|
||||||
cache_man.note_used(CacheID::BlockDetails(hash));
|
cache_man.note_used(CacheId::BlockDetails(hash));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1244,13 +1244,13 @@ impl BlockChain {
|
|||||||
cache_man.collect_garbage(current_size, | ids | {
|
cache_man.collect_garbage(current_size, | ids | {
|
||||||
for id in &ids {
|
for id in &ids {
|
||||||
match *id {
|
match *id {
|
||||||
CacheID::BlockHeader(ref h) => { block_headers.remove(h); },
|
CacheId::BlockHeader(ref h) => { block_headers.remove(h); },
|
||||||
CacheID::BlockBody(ref h) => { block_bodies.remove(h); },
|
CacheId::BlockBody(ref h) => { block_bodies.remove(h); },
|
||||||
CacheID::BlockDetails(ref h) => { block_details.remove(h); }
|
CacheId::BlockDetails(ref h) => { block_details.remove(h); }
|
||||||
CacheID::BlockHashes(ref h) => { block_hashes.remove(h); }
|
CacheId::BlockHashes(ref h) => { block_hashes.remove(h); }
|
||||||
CacheID::TransactionAddresses(ref h) => { transaction_addresses.remove(h); }
|
CacheId::TransactionAddresses(ref h) => { transaction_addresses.remove(h); }
|
||||||
CacheID::BlocksBlooms(ref h) => { blocks_blooms.remove(h); }
|
CacheId::BlocksBlooms(ref h) => { blocks_blooms.remove(h); }
|
||||||
CacheID::BlockReceipts(ref h) => { block_receipts.remove(h); }
|
CacheId::BlockReceipts(ref h) => { block_receipts.remove(h); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user