merge master into jr-use-badge-reg
This commit is contained in:
		
						commit
						d67a9388ff
					
				| @ -422,13 +422,10 @@ test-rust-stable: | ||||
|   image: ethcore/rust:stable | ||||
|   before_script: | ||||
|     - 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) | ||||
|     - echo $JS_FILES_MODIFIED | ||||
|     - if [ "$JS_FILES_MODIFIED" = 0  ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi | ||||
|     - 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) | ||||
|   script: | ||||
|     - export RUST_BACKTRACE=1 | ||||
|     - echo $JS_FILES_MODIFIED | ||||
|     - 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 | ||||
|     - if [ $RUST_FILES_MODIFIED -eq 0 ]; then echo "Skipping Rust tests since no Rust files modified."; else ./test.sh $CARGOFLAGS; fi | ||||
|   tags: | ||||
|     - rust | ||||
|     - rust-stable | ||||
| @ -437,13 +434,10 @@ js-test: | ||||
|   image: ethcore/rust:stable | ||||
|   before_script: | ||||
|     - 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) | ||||
|     - echo $JS_FILES_MODIFIED | ||||
|     - if [ "$JS_FILES_MODIFIED" = 0 ]; then echo "skip js test"; else ./js/scripts/install-deps.sh;fi | ||||
|     - export JS_FILES_MODIFIED=$(git --no-pager diff --name-only $CI_BUILD_REF^ $CI_BUILD_REF | grep ^js/ | wc -l) | ||||
|     - 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: | ||||
|     - export RUST_BACKTRACE=1 | ||||
|     - 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 | ||||
|     - 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 | ||||
|   tags: | ||||
|     - rust | ||||
|     - rust-stable | ||||
| @ -484,11 +478,11 @@ js-release: | ||||
|     - stable | ||||
|   image: ethcore/rust:stable | ||||
|   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 | ||||
|     - 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: | ||||
|     - 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: | ||||
|     - javascript | ||||
|  | ||||
							
								
								
									
										21
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										21
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -18,6 +18,7 @@ dependencies = [ | ||||
|  "ethcore-ipc-hypervisor 1.2.0", | ||||
|  "ethcore-ipc-nano 1.5.0", | ||||
|  "ethcore-ipc-tests 0.1.0", | ||||
|  "ethcore-light 1.5.0", | ||||
|  "ethcore-logger 1.5.0", | ||||
|  "ethcore-rpc 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)", | ||||
| ] | ||||
| 
 | ||||
| [[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]] | ||||
| name = "ethcore-logger" | ||||
| version = "1.5.0" | ||||
| @ -660,12 +676,15 @@ dependencies = [ | ||||
|  "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)", | ||||
|  "ethcore 1.5.0", | ||||
|  "ethcore-devtools 1.5.0", | ||||
|  "ethcore-io 1.5.0", | ||||
|  "ethcore-ipc 1.5.0", | ||||
|  "ethcore-ipc-codegen 1.5.0", | ||||
|  "ethcore-ipc-nano 1.5.0", | ||||
|  "ethcore-light 1.5.0", | ||||
|  "ethcore-network 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)", | ||||
|  "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)", | ||||
| @ -1271,7 +1290,7 @@ dependencies = [ | ||||
| [[package]] | ||||
| name = "parity-ui-precompiled" | ||||
| 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 = [ | ||||
|  "parity-dapps-glue 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||||
| ] | ||||
|  | ||||
| @ -3,7 +3,7 @@ description = "Ethcore client." | ||||
| name = "parity" | ||||
| version = "1.5.0" | ||||
| license = "GPL-3.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [build-dependencies] | ||||
| @ -47,6 +47,7 @@ rlp = { path = "util/rlp" } | ||||
| ethcore-stratum = { path = "stratum" } | ||||
| ethcore-dapps = { path = "dapps", optional = true } | ||||
| clippy = { version = "0.0.103", optional = true} | ||||
| ethcore-light = { path = "ethcore/light" } | ||||
| 
 | ||||
| [target.'cfg(windows)'.dependencies] | ||||
| 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -3,7 +3,7 @@ description = "Parity Dapps crate" | ||||
| name = "ethcore-dapps" | ||||
| version = "1.5.0" | ||||
| license = "GPL-3.0" | ||||
| authors = ["Ethcore <admin@ethcore.io"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [lib] | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| // Copyright 2015, 2016 Ethcore (UK) Ltd.
 | ||||
| // Copyright 2015, 2016 Parity Technologies (UK) Ltd.
 | ||||
| // This file is part of Parity.
 | ||||
| 
 | ||||
| // 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" | ||||
| version = "1.5.0" | ||||
| license = "GPL-3.0" | ||||
| authors = ["Ethcore <admin@ethcore.io"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [package] | ||||
| description = "Ethcore Parity UI" | ||||
| homepage = "http://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "parity-ui" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| 
 | ||||
| [build-dependencies] | ||||
| 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [package] | ||||
| description = "Ethcore Database" | ||||
| homepage = "http://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "ethcore-db" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [package] | ||||
| description = "Ethcore development/test/build tools" | ||||
| homepage = "http://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "ethcore-devtools" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| 
 | ||||
| [dependencies] | ||||
| 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| [package] | ||||
| name = "ethash" | ||||
| version = "1.5.0" | ||||
| authors = ["arkpar <arkadiy@ethcore.io"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| 
 | ||||
| [lib] | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| // Copyright 2015, 2016 Ethcore (UK) Ltd.
 | ||||
| // Copyright 2015, 2016 Parity Technologies (UK) Ltd.
 | ||||
| // This file is part of Parity.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [package] | ||||
| description = "Ethcore library" | ||||
| homepage = "http://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "ethcore" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| [package] | ||||
| description = "Fetching hash-addressed content." | ||||
| homepage = "https://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "ethcore-hash-fetch" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| 
 | ||||
| [dependencies] | ||||
| 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -1,21 +1,25 @@ | ||||
| [package] | ||||
| description = "Parity LES primitives" | ||||
| homepage = "https://ethcore.io" | ||||
| homepage = "http://parity.io" | ||||
| license = "GPL-3.0" | ||||
| name = "ethcore-light" | ||||
| version = "1.5.0" | ||||
| authors = ["Ethcore <admin@ethcore.io>"] | ||||
| authors = ["Parity Technologies <admin@parity.io>"] | ||||
| build = "build.rs" | ||||
| 
 | ||||
| [build-dependencies] | ||||
| "ethcore-ipc-codegen" = { path = "../../ipc/codegen" } | ||||
| "ethcore-ipc-codegen" = { path = "../../ipc/codegen", optional = true } | ||||
| 
 | ||||
| [dependencies] | ||||
| log = "0.3" | ||||
| ethcore = { path = ".." } | ||||
| ethcore = { path = ".."} | ||||
| ethcore-util = { path = "../../util" } | ||||
| ethcore-network = { path = "../../util/network" } | ||||
| ethcore-io = { path = "../../util/io" } | ||||
| ethcore-ipc = { path = "../../ipc/rpc" } | ||||
| ethcore-ipc = { path = "../../ipc/rpc", optional = true } | ||||
| rlp = { path = "../../util/rlp" } | ||||
| 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.
 | ||||
| 
 | ||||
| // 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
 | ||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| #[cfg(feature = "ipc")] | ||||
| extern crate ethcore_ipc_codegen; | ||||
| 
 | ||||
| #[cfg(feature = "ipc")] | ||||
| fn main() { | ||||
| 	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.
 | ||||
| 
 | ||||
| // 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
 | ||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| //! Light client implementation. Used for raw data queries as well as the header
 | ||||
| //! sync.
 | ||||
| //! Light client implementation. Stores data from light sync
 | ||||
| 
 | ||||
| use std::sync::Arc; | ||||
| 
 | ||||
| use ethcore::engines::Engine; | ||||
| use ethcore::ids::BlockID; | ||||
| use ethcore::ids::BlockId; | ||||
| use ethcore::service::ClientIoMessage; | ||||
| use ethcore::block_import_error::BlockImportError; | ||||
| use ethcore::block_status::BlockStatus; | ||||
| @ -29,7 +28,7 @@ use ethcore::transaction::SignedTransaction; | ||||
| use ethcore::blockchain_info::BlockChainInfo; | ||||
| 
 | ||||
| use io::IoChannel; | ||||
| use util::hash::H256; | ||||
| use util::hash::{H256, H256FastMap}; | ||||
| use util::{Bytes, Mutex}; | ||||
| 
 | ||||
| use provider::Provider; | ||||
| @ -37,9 +36,10 @@ use request; | ||||
| 
 | ||||
| /// Light client implementation.
 | ||||
| pub struct Client { | ||||
| 	engine: Arc<Engine>, | ||||
| 	_engine: Arc<Engine>, | ||||
| 	header_queue: HeaderQueue, | ||||
| 	message_channel: Mutex<IoChannel<ClientIoMessage>>, | ||||
| 	_message_channel: Mutex<IoChannel<ClientIoMessage>>, | ||||
| 	tx_pool: Mutex<H256FastMap<SignedTransaction>>, | ||||
| } | ||||
| 
 | ||||
| impl Client { | ||||
| @ -51,17 +51,22 @@ impl Client { | ||||
| 	} | ||||
| 
 | ||||
| 	/// 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 | ||||
| 	} | ||||
| 
 | ||||
| 	/// 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.
 | ||||
| 	pub fn pending_transactions(&self) -> Vec<SignedTransaction> { | ||||
| 		vec![] | ||||
| 		self.tx_pool.lock().values().cloned().collect() | ||||
| 	} | ||||
| 
 | ||||
| 	/// Inquire about the status of a given block.
 | ||||
| 	pub fn status(&self, _id: BlockID) -> BlockStatus { | ||||
| 	/// Inquire about the status of a given block (or header).
 | ||||
| 	pub fn status(&self, _id: BlockId) -> BlockStatus { | ||||
| 		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.
 | ||||
| 
 | ||||
| // 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
 | ||||
| //! of members of the chain to varying degrees.
 | ||||
| 
 | ||||
| // TODO: remove when integrating with the rest of parity.
 | ||||
| #![allow(dead_code)] | ||||
| #![deny(missing_docs)] | ||||
| 
 | ||||
| pub mod client; | ||||
| pub mod net; | ||||
| 
 | ||||
| #[cfg(not(feature = "ipc"))] | ||||
| 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; | ||||
| 
 | ||||
| pub use self::provider::Provider; | ||||
| @ -47,6 +59,8 @@ extern crate ethcore; | ||||
| extern crate ethcore_util as util; | ||||
| extern crate ethcore_network as network; | ||||
| extern crate ethcore_io as io; | ||||
| extern crate ethcore_ipc as ipc; | ||||
| extern crate rlp; | ||||
| 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -22,6 +22,9 @@ | ||||
| //!
 | ||||
| //! This module provides an interface for configuration of buffer
 | ||||
| //! flow costs and recharge rates.
 | ||||
| //!
 | ||||
| //! Current default costs are picked completely arbitrarily, not based 
 | ||||
| //! on any empirical timings or mathematical models.
 | ||||
| 
 | ||||
| use request; | ||||
| 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)] | ||||
| mod tests { | ||||
| 	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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -54,6 +54,14 @@ pub enum Error { | ||||
| 	WrongNetwork, | ||||
| 	/// Unknown peer.
 | ||||
| 	UnknownPeer, | ||||
| 	/// Unsolicited response.
 | ||||
| 	UnsolicitedResponse, | ||||
| 	/// Not a server.
 | ||||
| 	NotServer, | ||||
| 	/// Unsupported protocol version.
 | ||||
| 	UnsupportedProtocolVersion(u8), | ||||
| 	/// Bad protocol version.
 | ||||
| 	BadProtocolVersion, | ||||
| } | ||||
| 
 | ||||
| impl Error { | ||||
| @ -67,6 +75,10 @@ impl Error { | ||||
| 			Error::UnexpectedHandshake => Punishment::Disconnect, | ||||
| 			Error::WrongNetwork => Punishment::Disable, | ||||
| 			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::UnexpectedHandshake => write!(f, "Unexpected handshake"), | ||||
| 			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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| struct Parser<'a> { | ||||
| 	pos: usize, | ||||
| @ -118,6 +98,7 @@ impl<'a> Parser<'a> { | ||||
| 	// expect a specific next key, and get the value's RLP.
 | ||||
| 	// if the key isn't found, the position isn't advanced.
 | ||||
| 	fn expect_raw(&mut self, key: Key) -> Result<UntrustedRlp<'a>, DecoderError> { | ||||
| 		trace!(target: "les", "Expecting key {}", key.as_str()); | ||||
| 		let pre_pos = self.pos; | ||||
| 		if let Some((k, val)) = try!(self.get_next()) { | ||||
| 			if k == key { return Ok(val) } | ||||
| @ -164,7 +145,7 @@ pub struct Status { | ||||
| 	/// Protocol version.
 | ||||
| 	pub protocol_version: u32, | ||||
| 	/// Network id of this peer.
 | ||||
| 	pub network_id: NetworkId, | ||||
| 	pub network_id: u64, | ||||
| 	/// Total difficulty of the head of the chain.
 | ||||
| 	pub head_td: U256, | ||||
| 	/// Hash of the best block.
 | ||||
| @ -217,7 +198,7 @@ impl Capabilities { | ||||
| ///   - chain status
 | ||||
| ///   - serving capabilities
 | ||||
| ///   - 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 { | ||||
| 		pos: 0, | ||||
| 		rlp: rlp, | ||||
| @ -225,8 +206,7 @@ pub fn parse_handshake(rlp: UntrustedRlp) -> Result<(Status, Capabilities, FlowP | ||||
| 
 | ||||
| 	let status = Status { | ||||
| 		protocol_version: try!(parser.expect(Key::ProtocolVersion)), | ||||
| 		network_id: try!(parser.expect(Key::NetworkId) | ||||
| 			.and_then(|id: u32| NetworkId::from_raw(id).ok_or(DecoderError::Custom("Invalid network ID")))), | ||||
| 		network_id: try!(parser.expect(Key::NetworkId)), | ||||
| 		head_td: try!(parser.expect(Key::HeadTD)), | ||||
| 		head_hash: try!(parser.expect(Key::HeadHash)), | ||||
| 		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(), | ||||
| 	}; | ||||
| 
 | ||||
| 	let flow_params = FlowParams::new( | ||||
| 		try!(parser.expect(Key::BufferLimit)), | ||||
| 		try!(parser.expect(Key::BufferCostTable)), | ||||
| 		try!(parser.expect(Key::BufferRechargeRate)), | ||||
| 	); | ||||
| 	let flow_params = match ( | ||||
| 		parser.expect(Key::BufferLimit), | ||||
| 		parser.expect(Key::BufferCostTable), | ||||
| 		parser.expect(Key::BufferRechargeRate) | ||||
| 	) { | ||||
| 		(Ok(bl), Ok(bct), Ok(brr)) => Some(FlowParams::new(bl, bct, brr)), | ||||
| 		_ => None, | ||||
| 	}; | ||||
| 
 | ||||
| 	Ok((status, capabilities, flow_params)) | ||||
| } | ||||
| 
 | ||||
| /// 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(); | ||||
| 	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::HeadHash, &status.head_hash)); | ||||
| 	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)); | ||||
| 	} | ||||
| 
 | ||||
| 	if let Some(flow_params) = flow_params { | ||||
| 		pairs.push(encode_pair(Key::BufferLimit, flow_params.limit())); | ||||
| 		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()); | ||||
| 
 | ||||
| @ -385,7 +370,7 @@ mod tests { | ||||
| 	fn full_handshake() { | ||||
| 		let status = Status { | ||||
| 			protocol_version: 1, | ||||
| 			network_id: NetworkId::Mainnet, | ||||
| 			network_id: 1, | ||||
| 			head_td: U256::default(), | ||||
| 			head_hash: H256::default(), | ||||
| 			head_num: 10, | ||||
| @ -406,21 +391,21 @@ mod tests { | ||||
| 			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) | ||||
| 			= parse_handshake(UntrustedRlp::new(&handshake)).unwrap(); | ||||
| 
 | ||||
| 		assert_eq!(read_status, status); | ||||
| 		assert_eq!(read_capabilities, capabilities); | ||||
| 		assert_eq!(read_flow, flow_params); | ||||
| 		assert_eq!(read_flow.unwrap(), flow_params); | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn partial_handshake() { | ||||
| 		let status = Status { | ||||
| 			protocol_version: 1, | ||||
| 			network_id: NetworkId::Mainnet, | ||||
| 			network_id: 1, | ||||
| 			head_td: U256::default(), | ||||
| 			head_hash: H256::default(), | ||||
| 			head_num: 10, | ||||
| @ -441,21 +426,21 @@ mod tests { | ||||
| 			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) | ||||
| 			= parse_handshake(UntrustedRlp::new(&handshake)).unwrap(); | ||||
| 
 | ||||
| 		assert_eq!(read_status, status); | ||||
| 		assert_eq!(read_capabilities, capabilities); | ||||
| 		assert_eq!(read_flow, flow_params); | ||||
| 		assert_eq!(read_flow.unwrap(), flow_params); | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn skip_unknown_keys() { | ||||
| 		let status = Status { | ||||
| 			protocol_version: 1, | ||||
| 			network_id: NetworkId::Mainnet, | ||||
| 			network_id: 1, | ||||
| 			head_td: U256::default(), | ||||
| 			head_hash: H256::default(), | ||||
| 			head_num: 10, | ||||
| @ -476,7 +461,7 @@ mod tests { | ||||
| 			1000.into(), | ||||
| 		); | ||||
| 
 | ||||
| 		let handshake = write_handshake(&status, &capabilities, &flow_params); | ||||
| 		let handshake = write_handshake(&status, &capabilities, Some(&flow_params)); | ||||
| 		let interleaved = { | ||||
| 			let handshake = UntrustedRlp::new(&handshake); | ||||
| 			let mut stream = RlpStream::new_list(handshake.item_count() * 3); | ||||
| @ -498,7 +483,7 @@ mod tests { | ||||
| 
 | ||||
| 		assert_eq!(read_status, status); | ||||
| 		assert_eq!(read_capabilities, capabilities); | ||||
| 		assert_eq!(read_flow, flow_params); | ||||
| 		assert_eq!(read_flow.unwrap(), flow_params); | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| @ -548,4 +533,33 @@ mod tests { | ||||
| 		let out = stream.drain(); | ||||
| 		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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -20,7 +20,7 @@ | ||||
| use ethcore::blockchain_info::BlockChainInfo; | ||||
| use ethcore::client::{BlockChainClient, ProvingBlockChainClient}; | ||||
| use ethcore::transaction::SignedTransaction; | ||||
| use ethcore::ids::BlockID; | ||||
| use ethcore::ids::BlockId; | ||||
| 
 | ||||
| use util::{Bytes, H256}; | ||||
| 
 | ||||
| @ -33,6 +33,7 @@ use request; | ||||
| /// or empty vector where appropriate.
 | ||||
| ///
 | ||||
| /// [1]: https://github.com/ethcore/parity/wiki/Light-Ethereum-Subprotocol-(LES)
 | ||||
| #[cfg_attr(feature = "ipc", ipc(client_ident="LightProviderClient"))] | ||||
| pub trait Provider: Send + Sync { | ||||
| 	/// Provide current blockchain info.
 | ||||
| 	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.
 | ||||
| 	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>; | ||||
| 
 | ||||
| 	/// Provide pending transactions.
 | ||||
| @ -93,22 +97,34 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T { | ||||
| 	} | ||||
| 
 | ||||
| 	fn block_headers(&self, req: request::Headers) -> Vec<Bytes> { | ||||
| 		let best_num = self.chain_info().best_block_number; | ||||
| 		let start_num = req.block_num; | ||||
| 		use request::HashOrNumber; | ||||
| 		use ethcore::views::HeaderView; | ||||
| 
 | ||||
| 		match self.block_hash(BlockID::Number(req.block_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![] | ||||
| 		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.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]; | ||||
| 					} | ||||
| 
 | ||||
| 					num | ||||
| 				} | ||||
| 			} | ||||
| 		}; | ||||
| 		
 | ||||
| 		(0u64..req.max as u64) | ||||
| 			.map(|x: u64| x.saturating_mul(req.skip)) | ||||
| 			.take_while(|x| if req.reverse { x < &start_num } else { best_num - start_num < *x }) | ||||
| 			.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.block_header(BlockID::Number(x))) | ||||
| 			.map(|x| self.block_header(BlockId::Number(x))) | ||||
| 			.take_while(|x| x.is_some()) | ||||
| 			.flat_map(|x| x) | ||||
| 			.collect() | ||||
| @ -116,7 +132,7 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T { | ||||
| 
 | ||||
| 	fn block_bodies(&self, req: request::Bodies) -> Vec<Bytes> { | ||||
| 		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())) | ||||
| 			.collect() | ||||
| 	} | ||||
| @ -135,8 +151,8 @@ impl<T: ProvingBlockChainClient + ?Sized> Provider for T { | ||||
| 
 | ||||
| 		for request in req.requests { | ||||
| 			let proof = match request.key2 { | ||||
| 				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)), | ||||
| 				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)), | ||||
| 			}; | ||||
| 
 | ||||
| 			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> { | ||||
| 		req.code_requests.into_iter() | ||||
| 			.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() | ||||
| 	} | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| // Copyright 2015, 2016 Ethcore (UK) Ltd.
 | ||||
| // Copyright 2015, 2016 Parity Technologies (UK) Ltd.
 | ||||
| // This file is part of Parity.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -18,14 +18,34 @@ | ||||
| 
 | ||||
| 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.
 | ||||
| #[derive(Debug, Clone, PartialEq, Eq, Binary)] | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| #[cfg_attr(feature = "ipc", derive(Binary))] | ||||
| pub struct Headers { | ||||
| 	/// Starting block number
 | ||||
| 	pub block_num: u64, | ||||
| 	/// Starting block hash. This and number could be combined but IPC codegen is
 | ||||
| 	/// not robust enough to support it.
 | ||||
| 	pub block_hash: H256, | ||||
| 	/// Starting block number or hash.
 | ||||
| 	pub start: HashOrNumber, | ||||
| 	/// The maximum amount of headers which can be returned.
 | ||||
| 	pub max: usize, | ||||
| 	/// The amount of headers to skip between each response entry.
 | ||||
| @ -35,7 +55,8 @@ pub struct Headers { | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Hashes which bodies are being requested for.
 | ||||
| 	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
 | ||||
| /// requested.
 | ||||
| #[derive(Debug, Clone, PartialEq, Eq, Binary)] | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| #[cfg_attr(feature = "ipc", derive(Binary))] | ||||
| pub struct Receipts { | ||||
| 	/// Block hashes to return receipts for.
 | ||||
| 	pub block_hashes: Vec<H256>, | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Block hash to query state from.
 | ||||
| 	pub block: H256, | ||||
| @ -66,14 +89,16 @@ pub struct StateProof { | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// All the proof requests.
 | ||||
| 	pub requests: Vec<StateProof>, | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Block hash
 | ||||
| 	pub block_hash: H256, | ||||
| @ -82,14 +107,16 @@ pub struct ContractCode { | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Block hash and account key (== sha3(address)) pairs to fetch code for.
 | ||||
| 	pub code_requests: Vec<ContractCode>, | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Number of the CHT.
 | ||||
| 	pub cht_number: u64, | ||||
| @ -100,14 +127,16 @@ pub struct HeaderProof { | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// All the proof requests.
 | ||||
| 	pub requests: Vec<HeaderProof>, | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Requesting headers.
 | ||||
| 	Headers, | ||||
| @ -124,7 +153,8 @@ pub enum Kind { | ||||
| } | ||||
| 
 | ||||
| /// 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 { | ||||
| 	/// Requesting 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.
 | ||||
| 
 | ||||
| // 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/>.
 | ||||
| 
 | ||||
| //! 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")); | ||||
| 
 | ||||
| #[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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
|  | ||||
| @ -4,7 +4,8 @@ | ||||
| 		"AuthorityRound": { | ||||
| 			"params": { | ||||
| 				"gasLimitBoundDivisor": "0x0400", | ||||
| 				"stepDuration": "1", | ||||
| 				"stepDuration": 1, | ||||
| 				"startStep": 2, | ||||
| 				"authorities" : [ | ||||
| 					"0x7d577a597b2742b498cb5cf0c26cdcd726d39e6e", | ||||
| 					"0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1" | ||||
|  | ||||
| @ -170,9 +170,6 @@ | ||||
| 		"enode://cadc6e573b6bc2a9128f2f635ac0db3353e360b56deef239e9be7e7fce039502e0ec670b595f6288c0d2116812516ad6b6ff8d5728ff45eba176989e40dead1e@37.128.191.230:30303", | ||||
| 		"enode://595a9a06f8b9bc9835c8723b6a82105aea5d55c66b029b6d44f229d6d135ac3ecdd3e9309360a961ea39d7bee7bac5d03564077a4e08823acc723370aace65ec@46.20.235.22: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://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185: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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -213,7 +213,7 @@ impl AccountProvider { | ||||
| 		Ok(AccountMeta { | ||||
| 			name: try!(self.sstore.name(&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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.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); | ||||
| 		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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // Parity is free software: you can redistribute it and/or modify
 | ||||
| @ -146,7 +146,7 @@ pub trait BlockProvider { | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Hash, Eq, PartialEq, Clone)] | ||||
| enum CacheID { | ||||
| enum CacheId { | ||||
| 	BlockHeader(H256), | ||||
| 	BlockBody(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> { | ||||
| 		let position = LogGroupPosition::from(position.clone()); | ||||
| 		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 | ||||
| 	} | ||||
| } | ||||
| @ -193,7 +193,7 @@ pub struct BlockChain { | ||||
| 
 | ||||
| 	db: Arc<Database>, | ||||
| 
 | ||||
| 	cache_man: Mutex<CacheManager<CacheID>>, | ||||
| 	cache_man: Mutex<CacheManager<CacheId>>, | ||||
| 
 | ||||
| 	pending_best_block: RwLock<Option<BestBlock>>, | ||||
| 	pending_block_hashes: RwLock<HashMap<BlockNumber, H256>>, | ||||
| @ -270,7 +270,7 @@ impl BlockProvider for BlockChain { | ||||
| 			None => None | ||||
| 		}; | ||||
| 
 | ||||
| 		self.cache_man.lock().note_used(CacheID::BlockHeader(hash.clone())); | ||||
| 		self.cache_man.lock().note_used(CacheId::BlockHeader(hash.clone())); | ||||
| 		result | ||||
| 	} | ||||
| 
 | ||||
| @ -306,7 +306,7 @@ impl BlockProvider for BlockChain { | ||||
| 			None => None | ||||
| 		}; | ||||
| 
 | ||||
| 		self.cache_man.lock().note_used(CacheID::BlockBody(hash.clone())); | ||||
| 		self.cache_man.lock().note_used(CacheId::BlockBody(hash.clone())); | ||||
| 
 | ||||
| 		result | ||||
| 	} | ||||
| @ -314,28 +314,28 @@ impl BlockProvider for BlockChain { | ||||
| 	/// Get the familial details concerning a block.
 | ||||
| 	fn block_details(&self, hash: &H256) -> Option<BlockDetails> { | ||||
| 		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 | ||||
| 	} | ||||
| 
 | ||||
| 	/// Get the hash of given block's number.
 | ||||
| 	fn block_hash(&self, index: BlockNumber) -> Option<H256> { | ||||
| 		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 | ||||
| 	} | ||||
| 
 | ||||
| 	/// Get the address of transaction with given hash.
 | ||||
| 	fn transaction_address(&self, hash: &H256) -> Option<TransactionAddress> { | ||||
| 		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 | ||||
| 	} | ||||
| 
 | ||||
| 	/// Get receipts of block with given hash.
 | ||||
| 	fn block_receipts(&self, hash: &H256) -> Option<BlockReceipts> { | ||||
| 		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 | ||||
| 	} | ||||
| 
 | ||||
| @ -809,7 +809,7 @@ impl BlockChain { | ||||
| 		let mut write_details = self.block_details.write(); | ||||
| 		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))] | ||||
| @ -968,15 +968,15 @@ impl BlockChain { | ||||
| 
 | ||||
| 		let mut cache_man = self.cache_man.lock(); | ||||
| 		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 { | ||||
| 			cache_man.note_used(CacheID::TransactionAddresses(hash)); | ||||
| 			cache_man.note_used(CacheId::TransactionAddresses(hash)); | ||||
| 		} | ||||
| 
 | ||||
| 		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 | { | ||||
| 			for id in &ids { | ||||
| 				match *id { | ||||
| 					CacheID::BlockHeader(ref h) => { block_headers.remove(h); }, | ||||
| 					CacheID::BlockBody(ref h) => { block_bodies.remove(h); }, | ||||
| 					CacheID::BlockDetails(ref h) => { block_details.remove(h); } | ||||
| 					CacheID::BlockHashes(ref h) => { block_hashes.remove(h); } | ||||
| 					CacheID::TransactionAddresses(ref h) => { transaction_addresses.remove(h); } | ||||
| 					CacheID::BlocksBlooms(ref h) => { blocks_blooms.remove(h); } | ||||
| 					CacheID::BlockReceipts(ref h) => { block_receipts.remove(h); } | ||||
| 					CacheId::BlockHeader(ref h) => { block_headers.remove(h); }, | ||||
| 					CacheId::BlockBody(ref h) => { block_bodies.remove(h); }, | ||||
| 					CacheId::BlockDetails(ref h) => { block_details.remove(h); } | ||||
| 					CacheId::BlockHashes(ref h) => { block_hashes.remove(h); } | ||||
| 					CacheId::TransactionAddresses(ref h) => { transaction_addresses.remove(h); } | ||||
| 					CacheId::BlocksBlooms(ref h) => { blocks_blooms.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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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.
 | ||||
| 
 | ||||
| // 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