Compare commits
240 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2662d1925e | ||
|
|
d961010f63 | ||
|
|
6885be06a4 | ||
|
|
aa0a703e7c | ||
|
|
748eda2aac | ||
|
|
fabec3e3f1 | ||
|
|
d688869035 | ||
|
|
90fccf9651 | ||
|
|
1b3787040b | ||
|
|
c253e1f33e | ||
|
|
5923146210 | ||
|
|
9e28241b29 | ||
|
|
f22326ef81 | ||
|
|
46f995ceb2 | ||
|
|
713fc9ff94 | ||
|
|
a9214081c0 | ||
|
|
d8a0d38229 | ||
|
|
ea8e7fcf73 | ||
|
|
73354d8d93 | ||
|
|
87e1080581 | ||
|
|
e95bbe36cb | ||
|
|
b6afc81d69 | ||
|
|
b8d9b6f826 | ||
|
|
424b38a8d7 | ||
|
|
5bd6b208af | ||
|
|
23a23e7a18 | ||
|
|
9d8e6ee4c9 | ||
|
|
280894691e | ||
|
|
b9f9d11929 | ||
|
|
860ef19e95 | ||
|
|
f8f22245ec | ||
|
|
e14d68e559 | ||
|
|
2b1d148ceb | ||
|
|
f6909d8243 | ||
|
|
fd29926a21 | ||
|
|
63535860bc | ||
|
|
6e76be7fad | ||
|
|
ae74e8df78 | ||
|
|
4fa78e0537 | ||
|
|
f1f64930cf | ||
|
|
4c6b282bee | ||
|
|
07e3a7f3d4 | ||
|
|
64295fde62 | ||
|
|
a6350c65aa | ||
|
|
36c917eb7a | ||
|
|
cfe57633fa | ||
|
|
80a83c95d3 | ||
|
|
f6c3d4c695 | ||
|
|
2895e3b2ab | ||
|
|
f2f4217e3c | ||
|
|
4c3be46f93 | ||
|
|
71f4f61146 | ||
|
|
a016dc5c6c | ||
|
|
cf2cb58e1d | ||
|
|
dcb69ba353 | ||
|
|
1b0948d9d1 | ||
|
|
6e34ee6837 | ||
|
|
1986c4ee79 | ||
|
|
df1c5ac616 | ||
|
|
c7219aae30 | ||
|
|
ee01612768 | ||
|
|
e0091c672a | ||
|
|
82c3265858 | ||
|
|
93f700d961 | ||
|
|
eb565a7e2b | ||
|
|
e194a2c6e3 | ||
|
|
db1ea1dcd8 | ||
|
|
9d55f0b4ab | ||
|
|
887aa62fdb | ||
|
|
8adde605e9 | ||
|
|
5fdf6be798 | ||
|
|
1b4d23fd20 | ||
|
|
43dc9af03b | ||
|
|
13729a0f7f | ||
|
|
80754c3426 | ||
|
|
8c2199dd2a | ||
|
|
6b17e321df | ||
|
|
f743829759 | ||
|
|
29c364be43 | ||
|
|
6993ec9531 | ||
|
|
0d3423cbe0 | ||
|
|
293e06e0f4 | ||
|
|
e0e79fdee0 | ||
|
|
2c97bcc1a4 | ||
|
|
c4ca84cdf3 | ||
|
|
ffeaee778c | ||
|
|
acf7c48d7e | ||
|
|
834585d61b | ||
|
|
81ca599f2a | ||
|
|
20bd1fa789 | ||
|
|
6960d35abb | ||
|
|
c8b4373e13 | ||
|
|
2d2513b35a | ||
|
|
3696f68626 | ||
|
|
ff697b64b3 | ||
|
|
9c8b7c23d1 | ||
|
|
f99819d326 | ||
|
|
6b57429d72 | ||
|
|
f59ed47b1b | ||
|
|
aefa8d5f59 | ||
|
|
f3015ce0c6 | ||
|
|
4f25d43516 | ||
|
|
9d313e31e6 | ||
|
|
330cdc1a4d | ||
|
|
93fbbb9aaf | ||
|
|
a404dd5415 | ||
|
|
11c447dfbe | ||
|
|
f48780c29b | ||
|
|
35513b14de | ||
|
|
63c7ae9a89 | ||
|
|
b31bff5ce2 | ||
|
|
4fd1ec643f | ||
|
|
79aeb95272 | ||
|
|
ca329078f5 | ||
|
|
acc5bdfc35 | ||
|
|
79a17dedd0 | ||
|
|
0c0f965354 | ||
|
|
0bd2979c04 | ||
|
|
f24bff5998 | ||
|
|
ad633de6d9 | ||
|
|
d243b15ae0 | ||
|
|
fcd042a487 | ||
|
|
1b1b44bb20 | ||
|
|
8471b91002 | ||
|
|
4979c62bb5 | ||
|
|
2b8b8851ab | ||
|
|
7c5fd042f3 | ||
|
|
d9201aa6f2 | ||
|
|
7f5ac8ba7a | ||
|
|
fc22c58408 | ||
|
|
2627288311 | ||
|
|
19184e8529 | ||
|
|
b6415c6196 | ||
|
|
acad59b300 | ||
|
|
0051c26acf | ||
|
|
bceb1d5691 | ||
|
|
61a7c30ed5 | ||
|
|
0659cb8592 | ||
|
|
a665116eb1 | ||
|
|
0bd2348ca1 | ||
|
|
eb81168674 | ||
|
|
ad9a53f486 | ||
|
|
5e2def1b23 | ||
|
|
240ef46c72 | ||
|
|
f4d14e271f | ||
|
|
48629c2bd4 | ||
|
|
d311bebaee | ||
|
|
fc9a2933af | ||
|
|
feb87c901e | ||
|
|
d8d7abc848 | ||
|
|
80f0e4b58f | ||
|
|
53e590f54b | ||
|
|
a4969ca498 | ||
|
|
680807e601 | ||
|
|
a89bbfe366 | ||
|
|
44c00b1f74 | ||
|
|
11d3cb3f08 | ||
|
|
8c286125e6 | ||
|
|
d193ddde19 | ||
|
|
396ccdbcc1 | ||
|
|
a9cb572238 | ||
|
|
05f9606bf2 | ||
|
|
00124b5a4b | ||
|
|
dabfa2c663 | ||
|
|
3420c2bac0 | ||
|
|
4f12d7ad12 | ||
|
|
5ce249ac64 | ||
|
|
cd26526868 | ||
|
|
974b24549b | ||
|
|
dab2a6bd4b | ||
|
|
505e284932 | ||
|
|
b1e3acaf0c | ||
|
|
fbf425c4e2 | ||
|
|
79b671f6c7 | ||
|
|
2af3140a26 | ||
|
|
efb390eb60 | ||
|
|
175051bac7 | ||
|
|
0a654afecc | ||
|
|
66e4410be7 | ||
|
|
bd1a578f93 | ||
|
|
6a9de9b11e | ||
|
|
1ba4df08f9 | ||
|
|
abb2a8c5a2 | ||
|
|
fd75491103 | ||
|
|
ef47426a93 | ||
|
|
5807402a0b | ||
|
|
e50eafe6e1 | ||
|
|
a23f5b8fd9 | ||
|
|
bd2e4f9c13 | ||
|
|
e551122ab9 | ||
|
|
73f4564b66 | ||
|
|
509fda727b | ||
|
|
ffc066e5a4 | ||
|
|
cafdfa8107 | ||
|
|
49f219451b | ||
|
|
45978bc2bd | ||
|
|
c689495826 | ||
|
|
46954527e7 | ||
|
|
72279856cd | ||
|
|
13ccb9f827 | ||
|
|
1503348782 | ||
|
|
5de32a70da | ||
|
|
8e0c522931 | ||
|
|
6c7d0fef4e | ||
|
|
12256a1e97 | ||
|
|
ec90fc47bc | ||
|
|
ee9bfac625 | ||
|
|
27786f014c | ||
|
|
8099efe215 | ||
|
|
cc796a232a | ||
|
|
d1b28bf57e | ||
|
|
acb1243214 | ||
|
|
fa1f81b5a3 | ||
|
|
1ef9d5b52f | ||
|
|
7f707fa524 | ||
|
|
c62e97d3c4 | ||
|
|
27d1c2d7d1 | ||
|
|
e3665ed9e3 | ||
|
|
14e7641835 | ||
|
|
5baa7e8fb5 | ||
|
|
cfe826fae9 | ||
|
|
5a131175e8 | ||
|
|
d850eb0dd5 | ||
|
|
34cdeac2a6 | ||
|
|
f53c3e582c | ||
|
|
fdc7b0fdaa | ||
|
|
0f337171bf | ||
|
|
073d242d1e | ||
|
|
44cc442d12 | ||
|
|
d5c19bae1c | ||
|
|
88e0cfe5ca | ||
|
|
141f6a047e | ||
|
|
fe7bc545bf | ||
|
|
c4c5d79a0f | ||
|
|
0a9095626d | ||
|
|
a6e96b052e | ||
|
|
86ef490a94 | ||
|
|
b97bf81adf | ||
|
|
d5584a01c7 | ||
|
|
d83798db62 |
@@ -4,20 +4,21 @@ stages:
|
|||||||
- publish
|
- publish
|
||||||
- optional
|
- optional
|
||||||
|
|
||||||
image: parity/parity-ci-linux:latest
|
image: ${REGISTRY}/parity-ci-linux:latest
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
GIT_STRATEGY: fetch
|
GIT_STRATEGY: fetch
|
||||||
GIT_SUBMODULE_STRATEGY: recursive
|
GIT_SUBMODULE_STRATEGY: recursive
|
||||||
|
GIT_DEPTH: 3
|
||||||
CI_SERVER_NAME: "GitLab CI"
|
CI_SERVER_NAME: "GitLab CI"
|
||||||
CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}"
|
CARGO_HOME: "/ci-cache/${CI_PROJECT_NAME}/cargo/${CI_JOB_NAME}"
|
||||||
SCCACHE_DIR: "/ci-cache/${CI_PROJECT_NAME}/sccache"
|
|
||||||
CARGO_TARGET: x86_64-unknown-linux-gnu
|
CARGO_TARGET: x86_64-unknown-linux-gnu
|
||||||
|
CARGO_INCREMENTAL: 0
|
||||||
|
REGISTRY: registry.parity.io/parity/infrastructure/scripts
|
||||||
|
|
||||||
.releaseable_branches: # list of git refs for building GitLab artifacts (think "pre-release binaries")
|
.releaseable_branches: # list of git refs for building GitLab artifacts (think "pre-release binaries")
|
||||||
only: &releaseable_branches
|
only: &releaseable_branches
|
||||||
- stable
|
- stable
|
||||||
- beta
|
|
||||||
- tags
|
- tags
|
||||||
- schedules
|
- schedules
|
||||||
|
|
||||||
@@ -31,28 +32,17 @@ variables:
|
|||||||
- tools/
|
- tools/
|
||||||
|
|
||||||
.docker-cache-status: &docker-cache-status
|
.docker-cache-status: &docker-cache-status
|
||||||
variables:
|
|
||||||
CARGO_HOME: "/ci-cache/parity-ethereum/cargo/${CI_JOB_NAME}"
|
|
||||||
dependencies: []
|
dependencies: []
|
||||||
|
interruptible: true
|
||||||
before_script:
|
before_script:
|
||||||
- rustup show
|
- rustup show
|
||||||
- cargo --version
|
- cargo --version
|
||||||
- SCCACHE_ERROR_LOG=/builds/parity/parity-ethereum/sccache_debug.log
|
retry:
|
||||||
RUST_LOG=sccache=debug
|
max: 2
|
||||||
sccache --start-server
|
when:
|
||||||
- sccache -s
|
- runner_system_failure
|
||||||
after_script:
|
- unknown_failure
|
||||||
# sccache debug info
|
- api_failure
|
||||||
- if test -e sccache_debug.log;
|
|
||||||
then
|
|
||||||
echo "_____All crate-types:_____";
|
|
||||||
grep 'parse_arguments.*--crate-type' sccache_debug.log | sed -re 's/.*"--crate-type", "([^"]+)".*/\1/' | sort | uniq -c;
|
|
||||||
echo "_____Non-cacheable reasons:_____";
|
|
||||||
grep CannotCache sccache_debug.log | sed -re 's/.*CannotCache\((.+)\).*/\1/' | sort | uniq -c;
|
|
||||||
else
|
|
||||||
echo "_____No logs from sccache_____";
|
|
||||||
exit 0;
|
|
||||||
fi
|
|
||||||
tags:
|
tags:
|
||||||
- linux-docker
|
- linux-docker
|
||||||
|
|
||||||
@@ -62,7 +52,6 @@ variables:
|
|||||||
<<: *collect_artifacts
|
<<: *collect_artifacts
|
||||||
script:
|
script:
|
||||||
- scripts/gitlab/build-linux.sh
|
- scripts/gitlab/build-linux.sh
|
||||||
- sccache -s
|
|
||||||
after_script:
|
after_script:
|
||||||
- mkdir -p tools
|
- mkdir -p tools
|
||||||
- cp -r scripts/docker/hub/* ./tools
|
- cp -r scripts/docker/hub/* ./tools
|
||||||
@@ -80,21 +69,35 @@ cargo-check 0 3:
|
|||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- time cargo check --target $CARGO_TARGET --locked --no-default-features --verbose --color=always
|
- time cargo check --target $CARGO_TARGET --locked --no-default-features --verbose --color=always
|
||||||
- sccache -s
|
- sccache --show-stats
|
||||||
|
|
||||||
cargo-check 1 3:
|
cargo-check 1 3:
|
||||||
stage: test
|
stage: test
|
||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --no-default-features --verbose --color=always
|
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --no-default-features --verbose --color=always
|
||||||
- sccache -s
|
- sccache --show-stats
|
||||||
|
|
||||||
cargo-check 2 3:
|
cargo-check 2 3:
|
||||||
stage: test
|
stage: test
|
||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --features "mio" --verbose --color=always
|
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --features "mio" --verbose --color=always
|
||||||
- sccache -s
|
- sccache --show-stats
|
||||||
|
|
||||||
|
cargo-check-evmbin:
|
||||||
|
stage: test
|
||||||
|
<<: *docker-cache-status
|
||||||
|
script:
|
||||||
|
- time cargo check -p evmbin --target $CARGO_TARGET --locked --verbose --color=always
|
||||||
|
- sccache --show-stats
|
||||||
|
|
||||||
|
cargo-check-benches:
|
||||||
|
stage: test
|
||||||
|
<<: *docker-cache-status
|
||||||
|
script:
|
||||||
|
- time cargo check --all --benches --target $CARGO_TARGET --locked --verbose --color=always
|
||||||
|
- sccache --show-stats
|
||||||
|
|
||||||
cargo-audit:
|
cargo-audit:
|
||||||
stage: test
|
stage: test
|
||||||
@@ -108,21 +111,12 @@ validate-chainspecs:
|
|||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/validate-chainspecs.sh
|
- ./scripts/gitlab/validate-chainspecs.sh
|
||||||
- sccache -s
|
|
||||||
|
|
||||||
test-cpp:
|
|
||||||
stage: build
|
|
||||||
<<: *docker-cache-status
|
|
||||||
script:
|
|
||||||
- ./scripts/gitlab/test-cpp.sh
|
|
||||||
- sccache -s
|
|
||||||
|
|
||||||
test-linux:
|
test-linux:
|
||||||
stage: build
|
stage: build
|
||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/test-linux.sh stable
|
- ./scripts/gitlab/test-linux.sh stable
|
||||||
- sccache -s
|
|
||||||
|
|
||||||
test-linux-beta:
|
test-linux-beta:
|
||||||
stage: build
|
stage: build
|
||||||
@@ -130,7 +124,6 @@ test-linux-beta:
|
|||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/test-linux.sh beta
|
- ./scripts/gitlab/test-linux.sh beta
|
||||||
- sccache -s
|
|
||||||
|
|
||||||
test-linux-nightly:
|
test-linux-nightly:
|
||||||
stage: build
|
stage: build
|
||||||
@@ -138,15 +131,8 @@ test-linux-nightly:
|
|||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/test-linux.sh nightly
|
- ./scripts/gitlab/test-linux.sh nightly
|
||||||
- sccache -s
|
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
build-android:
|
|
||||||
<<: *build-on-linux
|
|
||||||
image: parity/parity-ci-android:stretch
|
|
||||||
variables:
|
|
||||||
CARGO_TARGET: armv7-linux-androideabi
|
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
@@ -154,21 +140,21 @@ build-linux:
|
|||||||
build-linux-i386:
|
build-linux-i386:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
image: parity/parity-ci-i386:latest
|
image: ${REGISTRY}/parity-ci-i386:latest
|
||||||
variables:
|
variables:
|
||||||
CARGO_TARGET: i686-unknown-linux-gnu
|
CARGO_TARGET: i686-unknown-linux-gnu
|
||||||
|
|
||||||
build-linux-arm64:
|
build-linux-arm64:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
image: parity/parity-ci-arm64:latest
|
image: ${REGISTRY}/parity-ci-arm64:latest
|
||||||
variables:
|
variables:
|
||||||
CARGO_TARGET: aarch64-unknown-linux-gnu
|
CARGO_TARGET: aarch64-unknown-linux-gnu
|
||||||
|
|
||||||
build-linux-armhf:
|
build-linux-armhf:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
image: parity/parity-ci-armhf:latest
|
image: ${REGISTRY}/parity-ci-armhf:latest
|
||||||
variables:
|
variables:
|
||||||
CARGO_TARGET: armv7-unknown-linux-gnueabihf
|
CARGO_TARGET: armv7-unknown-linux-gnueabihf
|
||||||
|
|
||||||
@@ -179,8 +165,6 @@ build-darwin:
|
|||||||
variables:
|
variables:
|
||||||
CARGO_TARGET: x86_64-apple-darwin
|
CARGO_TARGET: x86_64-apple-darwin
|
||||||
CARGO_HOME: "${CI_PROJECT_DIR}/.cargo"
|
CARGO_HOME: "${CI_PROJECT_DIR}/.cargo"
|
||||||
CC: gcc
|
|
||||||
CXX: g++
|
|
||||||
script:
|
script:
|
||||||
- scripts/gitlab/build-linux.sh
|
- scripts/gitlab/build-linux.sh
|
||||||
tags:
|
tags:
|
||||||
@@ -219,7 +203,7 @@ publish-docker:
|
|||||||
DOCKER_DRIVER: overlay2
|
DOCKER_DRIVER: overlay2
|
||||||
GIT_STRATEGY: none
|
GIT_STRATEGY: none
|
||||||
# DOCKERFILE: tools/Dockerfile
|
# DOCKERFILE: tools/Dockerfile
|
||||||
# CONTAINER_IMAGE: parity/parity
|
# CONTAINER_IMAGE: parity/parity
|
||||||
script:
|
script:
|
||||||
- ./tools/publish-docker.sh
|
- ./tools/publish-docker.sh
|
||||||
tags:
|
tags:
|
||||||
@@ -307,7 +291,7 @@ publish-onchain-manually:
|
|||||||
when: manual
|
when: manual
|
||||||
|
|
||||||
publish-release-awss3-nightly: &publish-release-awss3
|
publish-release-awss3-nightly: &publish-release-awss3
|
||||||
image: parity/awscli:latest
|
image: ${REGISTRY}/awscli:latest
|
||||||
stage: publish
|
stage: publish
|
||||||
only:
|
only:
|
||||||
- nightly
|
- nightly
|
||||||
@@ -321,7 +305,7 @@ publish-release-awss3-nightly: &publish-release-awss3
|
|||||||
script:
|
script:
|
||||||
- echo "__________Push binaries to AWS S3____________"
|
- echo "__________Push binaries to AWS S3____________"
|
||||||
- case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in
|
- case "${SCHEDULE_TAG:-${CI_COMMIT_REF_NAME}}" in
|
||||||
(beta|stable|nightly)
|
(stable|nightly)
|
||||||
export BUCKET=releases.parity.io/ethereum;
|
export BUCKET=releases.parity.io/ethereum;
|
||||||
;;
|
;;
|
||||||
(*)
|
(*)
|
||||||
@@ -335,13 +319,13 @@ publish-release-awss3-nightly: &publish-release-awss3
|
|||||||
- linux-docker
|
- linux-docker
|
||||||
|
|
||||||
publish-release-awss3-manually:
|
publish-release-awss3-manually:
|
||||||
<<: *publish-release-awss3
|
<<: *publish-release-awss3
|
||||||
only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
when: manual
|
when: manual
|
||||||
|
|
||||||
publish-docs:
|
publish-docs:
|
||||||
stage: publish
|
stage: publish
|
||||||
image: parity/parity-ci-docs:latest
|
image: ${REGISTRY}/parity-ci-docs:latest
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
except:
|
except:
|
||||||
|
|||||||
591
CHANGELOG.md
591
CHANGELOG.md
@@ -1,218 +1,397 @@
|
|||||||
## Parity-Ethereum [v2.6.3](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.3)
|
## Parity-Ethereum [v2.7.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.7.1)
|
||||||
|
Parity Ethereum v2.7.2-stable is a patch version release of parity-ethereum.
|
||||||
Parity Ethereum v2.6.3-stable is a patch release that improves security, stability and performance.
|
Starting in the 2.7.x series of releases, parity-ethereum is switching to a single `stable` release
|
||||||
|
track. As a result, any clients that currently receive updates from the `beta`
|
||||||
* The most noteworthy improvement in this release is incorporating all the EIPs required for the Istanbul hard fork.
|
track should switch to the `stable` track.
|
||||||
* This release also fixes certain security and performance issues, one of which was suspected to be consensus-threatening but turned out to be benign. Thanks to Martin Holst Swende and Felix Lange from the Ethereum Foundation for bringing the suspicious issue to our attention.
|
Due to database format changes, upgrading from 2.5.x or 2.6.x is one-way only.
|
||||||
|
|
||||||
The full list of included changes:
|
The full list of included changes:
|
||||||
|
|
||||||
|
* backwards compatible call_type creation_method (#11450 + #11455)
|
||||||
|
* chore: remove unused dependencies (#11432)
|
||||||
|
* Cargo.lock: new lockfile format (#11448)
|
||||||
|
* rlp_derive: cleanup (#11446)
|
||||||
|
* Avoid long state queries when serving GetNodeData requests (#11444)
|
||||||
|
* update kvdb-rocksdb to 0.4 (#11442)
|
||||||
|
* Remove dead bootnodes, add new geth bootnodes (#11441)
|
||||||
|
* goerli: replace foundation bootnode (#11433)
|
||||||
|
* fix: export hardcoded sync format (#11416)
|
||||||
|
* verification: fix race same block + misc (#11400)
|
||||||
|
* update classic testnet bootnodes (#11398)
|
||||||
|
* gcc to clang (#11453)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.7.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.7.1)
|
||||||
|
Parity Ethereum v2.7.1-stable is a patch version release of parity-ethereum.
|
||||||
|
Starting in the 2.7.x series of releases, parity-ethereum is switching to a single `stable` release
|
||||||
|
track. As a result, any clients that currently receive updates from the `beta`
|
||||||
|
track should switch to the `stable` track.
|
||||||
|
Due to database format changes, upgrading from 2.5.x or 2.6.x is one-way only.
|
||||||
|
|
||||||
|
The full list of included changes from `v2.7.0` to `v2.7.1`:
|
||||||
|
|
||||||
|
* Revert "Distinguish between `create` and `create2` (#11311)" (#11427)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.7.0](https://github.com/paritytech/parity-ethereum/releases/tag/v2.7.0)
|
||||||
|
|
||||||
|
Parity Ethereum v2.7.0-stable is a minor version release of parity-ethereum. As
|
||||||
|
of this release, parity-ethereum is switching to a single `stable` release
|
||||||
|
track. As a result, any clients that currently receive updates from the `beta`
|
||||||
|
track should switch to the `stable` track.
|
||||||
|
|
||||||
|
The full list of included changes from `v2.5-stable` to `v2.7-stable` (the
|
||||||
|
`v2.6-beta` branch will already include some of these changes):
|
||||||
|
|
||||||
|
* Update POA bootnodes (#11411)
|
||||||
|
* Update ProgPoW to 0.9.3 (#11407)
|
||||||
|
* Add EtherCore support (#11402)
|
||||||
|
* json-tests: Fix compile error (#11384)
|
||||||
|
* ethcore/res: fix ethereum classic chainspec blake2_f activation block num (#11391)
|
||||||
|
* Switching to stable-track (#11377)
|
||||||
|
* Update copyright notice 2020 (#11386)
|
||||||
|
* miner: fix deprecation warning Error::description (#11380)
|
||||||
|
* Fix Aztlan hard fork issues (#11347)
|
||||||
|
* authority_round: Fix next_step_time_duration. (#11379)
|
||||||
|
* Set the block gas limit to the value returned by a contract call (#10928)
|
||||||
|
* [Trace] Distinguish between `create` and `create2` (#11311)
|
||||||
|
* fix cargo audit (#11378)
|
||||||
|
* Fix esoteric test config variable (#11292)
|
||||||
|
* Rip out the C and Java bindings (#11346)
|
||||||
|
* Encapsulate access to the client for secret store (#11232)
|
||||||
|
* Forward-port #11356 (#11359)
|
||||||
|
* Fix error message typo (#11363)
|
||||||
|
* [util/migration]: remove needless `static` bounds (#11348)
|
||||||
|
* Replace stale boot nodes with latest list (#11351)
|
||||||
|
* Update to latest `kvdb-*`: no default column, DBValue is Vec (#11312)
|
||||||
|
* we do not profit from incremental now (#11302)
|
||||||
|
* update autoupdate fork blocks for nightly (#11308)
|
||||||
|
* Add Nat PMP method to P2P module (#11210)
|
||||||
|
* Add randomness contract support to AuthorityRound. (#10946)
|
||||||
|
* ethcore/res: activate ecip-1061 on kotti and mordor (#11338)
|
||||||
|
* tx-q: enable basic verification of local transactions (#11332)
|
||||||
|
* remove null signatures (#11335)
|
||||||
|
* ethcore/res: activate agharta on classic 9573000 (#11331)
|
||||||
|
* [secretstore] migrate to version 4 (#11322)
|
||||||
|
* Enable EIP-2384 for ice age hard fork (#11281)
|
||||||
|
* Fix atomicity violation in network-devp2p (#11277)
|
||||||
|
* Istanbul activation on xDai (#11299)
|
||||||
|
* Istanbul activation on POA Core (#11298)
|
||||||
|
* Adds support for ipc socket permissions (#11273)
|
||||||
|
* Add check for deserialising hex values over U256 limit (#11309)
|
||||||
|
* validate-chainspecs: check istanbul eips are in the foundation spec (#11305)
|
||||||
|
* [chainspec]: add `eip1344_transition` for istanbul (#11301)
|
||||||
|
* only add transactions to signing-queue if it is enabled (#11272)
|
||||||
|
* Use upstream rocksdb (#11248)
|
||||||
|
* Treat only blocks in queue as synced (#11264)
|
||||||
|
* add support for evan.network chains (#11289)
|
||||||
|
* Add benchmarks and tests for RlpNodeCodec decoding (#11287)
|
||||||
|
* upgrade vergen to 3.0 (#11293)
|
||||||
|
* interruptible test and build jobs (#11294)
|
||||||
|
* Istanbul HF on POA Sokol (#11282)
|
||||||
|
* [ethcore]: apply filter when `PendingSet::AlwaysQueue` in `ready_transactions_filtered` (#11227)
|
||||||
|
* Update lib.rs (#11286)
|
||||||
|
* Don't prune ancient state when instantiating a Client (#11270)
|
||||||
|
* fixed verify_uncles error type (#11276)
|
||||||
|
* ethcore: fix rlp deprecation warnings (#11280)
|
||||||
|
* Upgrade trie-db to 0.16.0. (#11274)
|
||||||
|
* Clarify what first_block `None` means (#11269)
|
||||||
|
* removed redundant VMType enum with one variant (#11266)
|
||||||
|
* Ensure jsonrpc threading settings are sane (#11267)
|
||||||
|
* Return Ok(None) when the registrar contract returns empty slice (#11257)
|
||||||
|
* Add a benchmark for snapshot::account::to_fat_rlps() (#11185)
|
||||||
|
* Fix misc compile warnings (#11258)
|
||||||
|
* simplify verification (#11249)
|
||||||
|
* update ropsten forkCanonHash, forkBlock (#11247)
|
||||||
|
* Make InstantSeal Instant again (#11186)
|
||||||
|
* ropsten #6631425 foundation #8798209 (#11201)
|
||||||
|
* Update list of bootnodes for xDai chain (#11236)
|
||||||
|
* ethcore/res: add mordor testnet configuration (#11200)
|
||||||
|
* [chain specs]: activate `Istanbul` on mainnet (#11228)
|
||||||
|
* [builtin]: support `multiple prices and activations` in chain spec (#11039)
|
||||||
|
* Insert explicit warning into the panic hook (#11225)
|
||||||
|
* Snapshot restoration overhaul (#11219)
|
||||||
|
* Fix docker centos build (#11226)
|
||||||
|
* retry on gitlab system failures (#11222)
|
||||||
|
* Update bootnodes. (#11203)
|
||||||
|
* Use provided usd-per-eth value if an endpoint is specified (#11209)
|
||||||
|
* Use a lock instead of atomics for snapshot Progress (#11197)
|
||||||
|
* [informant]: `MillisecondDuration` -> `as_millis()` (#11211)
|
||||||
|
* Step duration map configuration parameter ported from the POA Network fork (#10902)
|
||||||
|
* Upgrade jsonrpc to latest (#11206)
|
||||||
|
* [export hardcoded sync]: use debug for `H256` (#11204)
|
||||||
|
* Pause pruning while snapshotting (#11178)
|
||||||
|
* Type annotation for next_key() matching of json filter options (#11192)
|
||||||
|
* Crypto primitives removed from ethkey (#11174)
|
||||||
|
* Made ecrecover implementation trait public (#11188)
|
||||||
|
* Remove unused macro_use. (#11191)
|
||||||
|
* [dependencies]: jsonrpc `14.0.1` (#11183)
|
||||||
|
* [receipt]: add `sender` & `receiver` to `RichReceipts` (#11179)
|
||||||
|
* [dependencies] bump rand 0.7 (#11022)
|
||||||
|
* [ethcore/builtin]: do not panic in blake2pricer on short input (#11180)
|
||||||
|
* TxPermissions ver 3: gas price & data (#11170)
|
||||||
|
* [ethash] chainspec validate `ecip1017EraRounds` non-zero (#11123)
|
||||||
|
* util Host: fix a double Read Lock bug in fn Host::session_readable() (#11175)
|
||||||
|
* ethcore client: fix a double Read Lock bug in fn Client::logs() (#11172)
|
||||||
|
* Aura: Report malice on sibling blocks from the same validator (#11160)
|
||||||
|
* Change how RPCs eth_call and eth_estimateGas handle "Pending" (#11127)
|
||||||
|
* Cleanup stratum a bit (#11161)
|
||||||
|
* [keccak-hasher]: rust2018 (#11163)
|
||||||
|
* Upgrade to jsonrpc v14 (#11151)
|
||||||
|
* Secret store: fix Instant::now() related race in net_keep_alive (#11155)
|
||||||
|
* RPC method for clearing the engine signer (#10920)
|
||||||
|
* Use TryFrom instead of From+panic for Builtin (#11140)
|
||||||
|
* Fix sccache statistics (#11145)
|
||||||
|
* Update ethereum types to 0.8.0 version (#11139)
|
||||||
|
* [json]: add docs to `hardfork specification` (#11138)
|
||||||
|
* ServiceTransactionChecker::refresh_cache: allow registrar unavailable (#11126)
|
||||||
|
* Fix some random typos, formatting/whitespace (#11128)
|
||||||
|
* Refactor parity_listStorageKeys with count parameter optional (#11124)
|
||||||
|
* Make EIP712Domain Fields Optional (#11103)
|
||||||
|
* EIP-712: bump version in prep for publishing (#11106)
|
||||||
|
* move StateResult to `common-types` (#11121)
|
||||||
|
* Deduplicate registrar contract & calling logic (#11110)
|
||||||
|
* Refactor return type of `BlockChainClient::code` #7098 (#11102)
|
||||||
|
* Switching sccache from local to Redis (#10971)
|
||||||
|
* SIMD Implementation for EIP-152 (#11056)
|
||||||
|
* Fix deprecated trait objects without an explicit `dyn` (#11112)
|
||||||
|
* [spec] fix rinkeby spec (#11108)
|
||||||
|
* Update to latest jsonrpc (#11111)
|
||||||
|
* use images from our registry (#11105)
|
||||||
|
* Correct EIP-712 encoding (#11092)
|
||||||
|
* [CI] check evmbin build (#11096)
|
||||||
|
* Update `kvdb`, `kvdb-rocksdb` and `h2` (#11091)
|
||||||
|
* [client]: Fix for incorrectly dropped consensus messages (#11082) (#11086)
|
||||||
|
* Update JSON tests to d4f86ecf4aa7c (#11054)
|
||||||
|
* fix(network): typo (#11088)
|
||||||
|
* [ethash] remove manual unrolling (#11069)
|
||||||
|
* ethcore/res: activate Istanbul on Ropsten, Görli, Rinkeby, Kovan (#11068)
|
||||||
|
* [sync]: rust 2018 (#11067)
|
||||||
|
* [ethcore]: move client test types to test-helpers (#11062)
|
||||||
|
* [sync]: remove unused dependencies or make dev (#11061)
|
||||||
|
* [ethcore]: reduce re-exports (#11059)
|
||||||
|
* [evmbin] fix time formatting (#11060)
|
||||||
|
* Update hardcoded headers (foundation, classic, kovan, xdai, ewc, ...) (#11053)
|
||||||
|
* cargo update -p eth-secp256k1 (#11052)
|
||||||
|
* ethcore: remove `test-helper feat` from build (#11047)
|
||||||
|
* Include test-helpers from ethjson (#11045)
|
||||||
|
* [ethcore]: cleanup dependencies (#11043)
|
||||||
* add more tx tests (#11038)
|
* add more tx tests (#11038)
|
||||||
* Fix parallel transactions race-condition (#10995)
|
* Fix parallel transactions race-condition (#10995)
|
||||||
|
* [ethcore]: make it compile without `test-helpers` feature (#11036)
|
||||||
|
* Benchmarks for block verification (#11035)
|
||||||
|
* Move snapshot related traits to their proper place (#11012)
|
||||||
|
* cleanup json crate (#11027)
|
||||||
|
* [spec] add istanbul test spec (#11033)
|
||||||
|
* [json-spec] make blake2 pricing spec more readable (#11034)
|
||||||
* Add blake2_f precompile (#11017)
|
* Add blake2_f precompile (#11017)
|
||||||
|
* Add new line after writing block to hex file. (#10984)
|
||||||
|
* fix: remove unused error-chain (#11028)
|
||||||
|
* fix: remove needless use of itertools (#11029)
|
||||||
|
* Convert `std::test` benchmarks to use Criterion (#10999)
|
||||||
|
* Fix block detail updating (#11015)
|
||||||
* [trace] introduce trace failed to Ext (#11019)
|
* [trace] introduce trace failed to Ext (#11019)
|
||||||
|
* cli: update usage and version headers (#10924)
|
||||||
|
* [private-tx] remove unused rand (#11024)
|
||||||
|
* Extract snapshot to own crate (#11010)
|
||||||
* Edit publish-onchain.sh to use https (#11016)
|
* Edit publish-onchain.sh to use https (#11016)
|
||||||
* Fix deadlock in network-devp2p (#11013)
|
|
||||||
* EIP 1108: Reduce alt_bn128 precompile gas costs (#11008)
|
* EIP 1108: Reduce alt_bn128 precompile gas costs (#11008)
|
||||||
|
* Fix deadlock in `network-devp2p` (#11013)
|
||||||
|
* Implement EIP-1283 reenable transition, EIP-1706 and EIP-2200 (#10191)
|
||||||
|
* EIP 1884 Re-pricing of trie-size dependent operations (#10992)
|
||||||
* xDai chain support and nodes list update (#10989)
|
* xDai chain support and nodes list update (#10989)
|
||||||
* EIP 2028: transaction gas lowered from 68 to 16 (#10987)
|
* [trace] check mem diff within range (#11002)
|
||||||
* EIP-1344 Add CHAINID op-code (#10983)
|
* EIP-1344 Add CHAINID op-code (#10983)
|
||||||
* manual publish jobs for releases, no changes for nightlies (#10977)
|
* Make ClientIoMessage generic over the Client (#10981)
|
||||||
* [blooms-db] Fix benchmarks (#10974)
|
* bump spin to 0.5.2 (#10996)
|
||||||
* Verify transaction against its block during import (#10954)
|
* fix compile warnings (#10993)
|
||||||
* Better error message for rpc gas price errors (#10931)
|
|
||||||
* Fix fork choice (#10837)
|
|
||||||
* Fix compilation on recent nightlies (#10991)
|
* Fix compilation on recent nightlies (#10991)
|
||||||
* Don't build rpc with ethcore test-helpers (#11048)
|
* [ipfs] Convert to edition 2018 (#10979)
|
||||||
* EIP 1884 Re-pricing of trie-size dependent operations (#10992)
|
* Extract spec to own crate (#10978)
|
||||||
* Implement EIP-1283 reenable transition, EIP-1706 and EIP-2200 (#10191)
|
* EIP 2028: transaction gas lowered from 68 to 16 (#10987)
|
||||||
|
* Extract engines to own crates (#10966)
|
||||||
## Parity-Ethereum [v2.6.2](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.2)
|
* Configuration map of block reward contract addresses (#10875)
|
||||||
|
* Add a 2/3 quorum option to Authority Round. (#10909)
|
||||||
Parity Ethereum v2.6.2-stable is a bugfix release that fixes a potential DoS attack in the trace_call RPC method. This is a critical upgrade for anyone running Parity nodes with RPC exposed to the public internet (and highly recommended for anyone else). For details see this blog post.
|
* Fix rlp decode for inline trie nodes. (#10980)
|
||||||
|
* Private contract migration and offchain state sync (#10748)
|
||||||
## Parity-Ethereum [v2.6.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.1)
|
* manual publish jobs for releases, no changes for nightlies (#10977)
|
||||||
|
* Extract the Engine trait (#10958)
|
||||||
Parity-Ethereum 2.6.1-beta is a patch release that improves stability.
|
* Better error message for rpc gas price errors (#10931)
|
||||||
|
* [.gitlab.yml] cargo check ethcore benches (#10965)
|
||||||
This release includes:
|
* Verify transaction against its block during import (#10954)
|
||||||
* Allow specifying hostnames for node URLs
|
* [evmbin] fix compilation (#10976)
|
||||||
* Fix a bug where archive nodes were losing peers
|
* Update to latest trie version. (#10972)
|
||||||
* Add support for Energy Web Foundations new chains 'Volta' and 'EWC', and remove their deprecated 'Tobalaba' chain.
|
* [blooms-db] Fix benchmarks (#10974)
|
||||||
|
* Fix ethcore/benches build. (#10964)
|
||||||
The full list of included changes:
|
* tx-pool: accept local tx with higher gas price when pool full (#10901)
|
||||||
* Add support for Energy Web Foundation's new chains (#10957)
|
* Disable unsyncable expanse chain (#10926)
|
||||||
* Kaspersky AV whitelisting (#10919)
|
* Extract Machine from ethcore (#10949)
|
||||||
* Avast whitelist script (#10900)
|
* removed redundant state_root function from spec, improve spec error types (#10955)
|
||||||
* Docker images renaming (#10863)
|
* Add support for Energy Web Foundation's new chains (#10957)
|
||||||
* Remove excessive warning (#10831)
|
* [evmbin] add more tests to main.rs (#10956)
|
||||||
* Allow --nat extip:your.host.here.org (#10830)
|
* Fix compiler warnings in util/io and upgrade to edition 2018 Upgrade mio to latest (#10953)
|
||||||
* When updating the client or when called from RPC, sleep should mean sleep (#10814)
|
* unify loading spec && further spec cleanups (#10948)
|
||||||
* added new ropsten-bootnode and removed old one (#10794)
|
* refactor: Refactor evmbin CLI (#10742)
|
||||||
* ethkey no longer uses byteorder (#10786)
|
* journaldb changes (#10929)
|
||||||
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions (#10652)
|
* Allow default block parameter to be blockHash (#10932)
|
||||||
|
* Enable sealing when engine is ready (#10938)
|
||||||
## Parity-Ethereum [v2.6.0](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.0)
|
* Fix some warnings and typos. (#10941)
|
||||||
|
* Updated security@parity.io key (#10939)
|
||||||
Parity-Ethereum 2.6.0-beta is a minor release that stabilizes the 2.6 branch by
|
* Change the return type of step_inner function. (#10940)
|
||||||
marking it as a beta release.
|
* get rid of hidden mutability of Spec (#10904)
|
||||||
|
* simplify BlockReward::reward implementation (#10906)
|
||||||
This release includes:
|
* Kaspersky AV whitelisting (#10919)
|
||||||
* Major refactoring of the codebase
|
* additional arithmetic EVM opcode benchmarks (#10916)
|
||||||
* Many bugfixes
|
* [Cargo.lock] cargo update -p crossbeam-epoch (#10921)
|
||||||
* Significant improvements to logging, error and warning message clarity.
|
* Fixes incorrect comment. (#10913)
|
||||||
* SecretStore: remove support of old database formats (#10757)
|
* Add file path to disk map write/read warnings (#10911)
|
||||||
* This is a potentially breaking change if you have not upgraded for
|
* remove verify_transaction_unordered from engine (#10891)
|
||||||
quite some time.
|
* Avast whitelist script (#10900)
|
||||||
|
* cleanup ethcore ethereum module (#10899)
|
||||||
As of today, Parity-Ethereum 2.4 reaches end of life, and everyone is
|
* Move more types out of ethcore (#10880)
|
||||||
encouraged to upgrade.
|
* return block nonce when engine is clique (#10892)
|
||||||
|
* TransactionQueue::import accepts iterator (#10889)
|
||||||
The full list of included changes:
|
* rename is_pruned to is_prunable (#10888)
|
||||||
* update jsonrpc to 12.0 ([#10841](https://github.com/paritytech/parity-ethereum/pull/10841))
|
* simplify create_address_scheme (#10890)
|
||||||
* Move more code into state-account ([#10840](https://github.com/paritytech/parity-ethereum/pull/10840))
|
* Move DatabaseExtras back to trace (#10868)
|
||||||
* Extract AccountDB to account-db ([#10839](https://github.com/paritytech/parity-ethereum/pull/10839))
|
* Update README.md and Changelogs (#10866)
|
||||||
* Extricate PodAccount and state Account to own crates ([#10838](https://github.com/paritytech/parity-ethereum/pull/10838))
|
* whisper is no longer a part of parity-ethereum repo (#10855)
|
||||||
* Fix fork choice ([#10837](https://github.com/paritytech/parity-ethereum/pull/10837))
|
* [ethash] remove mem::uninitialized (#10861)
|
||||||
* tests: Relates to #10655: Test instructions for Readme ([#10835](https://github.com/paritytech/parity-ethereum/pull/10835))
|
* Docker images renaming (#10863)
|
||||||
* idiomatic changes to PodState ([#10834](https://github.com/paritytech/parity-ethereum/pull/10834))
|
* Move the substate module into ethcore/executive (#10867)
|
||||||
* Break circular dependency between Client and Engine (part 1) ([#10833](https://github.com/paritytech/parity-ethereum/pull/10833))
|
* Run cargo fix on a few of the worst offenders (#10854)
|
||||||
* Remove excessive warning ([#10831](https://github.com/paritytech/parity-ethereum/pull/10831))
|
* removed redundant fork choice abstraction (#10849)
|
||||||
* Allow --nat extip:your.host.here.org ([#10830](https://github.com/paritytech/parity-ethereum/pull/10830))
|
* Extract state-db from ethcore (#10858)
|
||||||
* ethcore does not use byteorder ([#10829](https://github.com/paritytech/parity-ethereum/pull/10829))
|
* Fix fork choice (#10837)
|
||||||
* Fix typo in README.md ([#10828](https://github.com/paritytech/parity-ethereum/pull/10828))
|
* Move more code into state-account (#10840)
|
||||||
* Update wordlist to v1.3 ([#10823](https://github.com/paritytech/parity-ethereum/pull/10823))
|
* Remove compiler warning (#10865)
|
||||||
* bump `smallvec 0.6.10` to fix vulnerability ([#10822](https://github.com/paritytech/parity-ethereum/pull/10822))
|
* [ethash] use static_assertions crate (#10860)
|
||||||
* removed additional_params method ([#10818](https://github.com/paritytech/parity-ethereum/pull/10818))
|
* EIP-1702: Generalized Account Versioning Scheme (#10771)
|
||||||
* Improve logging when remote peer is unknown ([#10817](https://github.com/paritytech/parity-ethereum/pull/10817))
|
* ethcore-builtin (#10850)
|
||||||
* replace memzero with zeroize crate ([#10816](https://github.com/paritytech/parity-ethereum/pull/10816))
|
* removed QueueError type (#10852)
|
||||||
* When updating the client or when called from RPC, sleep should mean sleep ([#10814](https://github.com/paritytech/parity-ethereum/pull/10814))
|
* removed unused macros (#10851)
|
||||||
* Don't reimplement the logic from the Default impl ([#10813](https://github.com/paritytech/parity-ethereum/pull/10813))
|
* bump crossbeam (#10848)
|
||||||
* refactor: whisper: Add type aliases and update rustdocs in message.rs ([#10812](https://github.com/paritytech/parity-ethereum/pull/10812))
|
* removed unused trait PrivateNotify and unused Error types (#10847)
|
||||||
* test: whisper/cli `add invalid pool size test depending on processor` ([#10811](https://github.com/paritytech/parity-ethereum/pull/10811))
|
* make fn submit_seal more idiomatic (#10843)
|
||||||
* Add Constantinople EIPs to the dev (instant_seal) config ([#10809](https://github.com/paritytech/parity-ethereum/pull/10809))
|
* update parking-lot to 0.8 (#10845)
|
||||||
* fix spurious test failure ([#10808](https://github.com/paritytech/parity-ethereum/pull/10808))
|
* Update version to 2.7.0 (#10846)
|
||||||
* revert temp changes to .gitlab-ci.yml ([#10807](https://github.com/paritytech/parity-ethereum/pull/10807))
|
* update jsonrpc to 12.0 (#10841)
|
||||||
* removed redundant fmt::Display implementations ([#10806](https://github.com/paritytech/parity-ethereum/pull/10806))
|
* Improve logging and cleanup in miner around block sealing (#10745)
|
||||||
* removed EthEngine alias ([#10805](https://github.com/paritytech/parity-ethereum/pull/10805))
|
* Extract AccountDB to account-db (#10839)
|
||||||
* ethcore-bloom-journal updated to 2018 ([#10804](https://github.com/paritytech/parity-ethereum/pull/10804))
|
* test: Update Whisper test for invalid pool size (#10811)
|
||||||
* Fix a few typos and unused warnings. ([#10803](https://github.com/paritytech/parity-ethereum/pull/10803))
|
* Extricate PodAccount and state Account to own crates (#10838)
|
||||||
* updated price-info to edition 2018 ([#10801](https://github.com/paritytech/parity-ethereum/pull/10801))
|
* logs (#10817)
|
||||||
* updated parity-local-store to edition 2018 ([#10800](https://github.com/paritytech/parity-ethereum/pull/10800))
|
* refactor: whisper: Add type aliases and update rustdocs in message.rs (#10812)
|
||||||
* updated project to ansi_term 0.11 ([#10799](https://github.com/paritytech/parity-ethereum/pull/10799))
|
* Break circular dependency between Client and Engine (part 1) (#10833)
|
||||||
* ethcore-light uses bincode 1.1 ([#10798](https://github.com/paritytech/parity-ethereum/pull/10798))
|
* tests: Relates to #10655: Test instructions for Readme (#10835)
|
||||||
* ethcore-network-devp2p uses igd 0.9 ([#10797](https://github.com/paritytech/parity-ethereum/pull/10797))
|
* refactor: Related #9459 - evmbin: replace untyped json! macro with fully typed serde serialization using Rust structs (#10657)
|
||||||
* Better logging when backfilling ancient blocks fail ([#10796](https://github.com/paritytech/parity-ethereum/pull/10796))
|
* idiomatic changes to PodState (#10834)
|
||||||
* added new ropsten-bootnode and removed old one ([#10794](https://github.com/paritytech/parity-ethereum/pull/10794))
|
* Allow --nat extip:your.host.here.org (#10830)
|
||||||
* Removed machine abstraction from ethcore ([#10791](https://github.com/paritytech/parity-ethereum/pull/10791))
|
* When updating the client or when called from RPC, sleep should mean sleep (#10814)
|
||||||
* Removed redundant ethcore-service error type ([#10788](https://github.com/paritytech/parity-ethereum/pull/10788))
|
* Remove excessive warning (#10831)
|
||||||
* Cleanup unused vm dependencies ([#10787](https://github.com/paritytech/parity-ethereum/pull/10787))
|
* Fix typo in README.md (#10828)
|
||||||
* ethkey no longer uses byteorder ([#10786](https://github.com/paritytech/parity-ethereum/pull/10786))
|
* ethcore does not use byteorder (#10829)
|
||||||
* Updated blooms-db to rust 2018 and removed redundant deps ([#10785](https://github.com/paritytech/parity-ethereum/pull/10785))
|
* Better logging when backfilling ancient blocks fail (#10796)
|
||||||
* Treat empty account the same as non-exist accounts in EIP-1052 ([#10775](https://github.com/paritytech/parity-ethereum/pull/10775))
|
* depends: Update wordlist to v1.3 (#10823)
|
||||||
* Do not drop the peer with None difficulty ([#10772](https://github.com/paritytech/parity-ethereum/pull/10772))
|
* cargo update -p smallvec (#10822)
|
||||||
* EIP-1702: Generalized Account Versioning Scheme ([#10771](https://github.com/paritytech/parity-ethereum/pull/10771))
|
* replace memzero with zeroize crate (#10816)
|
||||||
* Move Engine::register_client to be before other I/O handler registration ([#10767](https://github.com/paritytech/parity-ethereum/pull/10767))
|
* Don't repeat the logic from Default impl (#10813)
|
||||||
* ethcore/res: activate atlantis classic hf on block 8772000 ([#10766](https://github.com/paritytech/parity-ethereum/pull/10766))
|
* removed additional_params method (#10818)
|
||||||
* Updated Bn128PairingImpl to use optimized batch pairing ([#10765](https://github.com/paritytech/parity-ethereum/pull/10765))
|
* Add Constantinople eips to the dev (instant_seal) config (#10809)
|
||||||
* Remove unused code ([#10762](https://github.com/paritytech/parity-ethereum/pull/10762))
|
* removed redundant fmt::Display implementations (#10806)
|
||||||
* Initialize private tx logger only if private tx functionality is enabled ([#10758](https://github.com/paritytech/parity-ethereum/pull/10758))
|
* revert changes to .gitlab-ci.yml (#10807)
|
||||||
* SecretStore: remove support of old database formats ([#10757](https://github.com/paritytech/parity-ethereum/pull/10757))
|
* Add filtering capability to `parity_pendingTransactions` (issue 8269) (#10506)
|
||||||
* Enable aesni ([#10756](https://github.com/paritytech/parity-ethereum/pull/10756))
|
* removed EthEngine alias (#10805)
|
||||||
* updater: fix static id hashes initialization ([#10755](https://github.com/paritytech/parity-ethereum/pull/10755))
|
* wait a bit longer in should_check_status_of_request_when_its_resolved (#10808)
|
||||||
* Use fewer threads for snapshotting ([#10752](https://github.com/paritytech/parity-ethereum/pull/10752))
|
* Do not drop the peer with None difficulty (#10772)
|
||||||
* Die error_chain, die ([#10747](https://github.com/paritytech/parity-ethereum/pull/10747))
|
* ethcore-bloom-journal updated to 2018 (#10804)
|
||||||
* Fix deprectation warnings on nightly ([#10746](https://github.com/paritytech/parity-ethereum/pull/10746))
|
* ethcore-light uses bincode 1.1 (#10798)
|
||||||
* Improve logging and cleanup in miner around block sealing ([#10745](https://github.com/paritytech/parity-ethereum/pull/10745))
|
* Fix a few typos and unused warnings. (#10803)
|
||||||
* Add a way to signal shutdown to snapshotting threads ([#10744](https://github.com/paritytech/parity-ethereum/pull/10744))
|
* updated project to ansi_term 0.11 (#10799)
|
||||||
* fix docker tags for publishing ([#10741](https://github.com/paritytech/parity-ethereum/pull/10741))
|
* added new ropsten-bootnode and removed old one (#10794)
|
||||||
* refactor: Fix indentation in ethjson ([#10740](https://github.com/paritytech/parity-ethereum/pull/10740))
|
* updated price-info to edition 2018 (#10801)
|
||||||
* Log validator set changes in EpochManager ([#10734](https://github.com/paritytech/parity-ethereum/pull/10734))
|
* ethcore-network-devp2p uses igd 0.9 (#10797)
|
||||||
* Print warnings when using dangerous settings for ValidatorSet ([#10733](https://github.com/paritytech/parity-ethereum/pull/10733))
|
* updated parity-local-store to edition 2018 and removed redundant Error type (#10800)
|
||||||
* ethcore: enable ECIP-1054 for classic ([#10731](https://github.com/paritytech/parity-ethereum/pull/10731))
|
* Cleanup unused vm dependencies (#10787)
|
||||||
* Stop breaking out of loop if a non-canonical hash is found ([#10729](https://github.com/paritytech/parity-ethereum/pull/10729))
|
* Removed redundant ethcore-service error type (#10788)
|
||||||
* Removed secret_store folder ([#10722](https://github.com/paritytech/parity-ethereum/pull/10722))
|
* Removed machine abstraction from ethcore (#10791)
|
||||||
* Revert "enable lto for release builds (#10717)" ([#10721](https://github.com/paritytech/parity-ethereum/pull/10721))
|
* Updated blooms-db to rust 2018 and removed redundant deps (#10785)
|
||||||
* fix: aura don't add `SystemTime::now()` ([#10720](https://github.com/paritytech/parity-ethereum/pull/10720))
|
* ethkey no longer uses byteorder (#10786)
|
||||||
* Use RUSTFLAGS to set the optimization level ([#10719](https://github.com/paritytech/parity-ethereum/pull/10719))
|
* Log validator set changes in EpochManager (#10734)
|
||||||
* enable lto for release builds ([#10717](https://github.com/paritytech/parity-ethereum/pull/10717))
|
* Treat empty account the same as non-exist accounts in EIP-1052 (#10775)
|
||||||
* [devp2p] Update to 2018 edition ([#10716](https://github.com/paritytech/parity-ethereum/pull/10716))
|
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions (#10652)
|
||||||
* [devp2p] Don't use `rust-crypto` ([#10714](https://github.com/paritytech/parity-ethereum/pull/10714))
|
* Move Engine::register_client to be before other I/O handler registration (#10767)
|
||||||
* [devp2p] Fix warnings and re-org imports ([#10710](https://github.com/paritytech/parity-ethereum/pull/10710))
|
* Print warnings when using dangerous settings for ValidatorSet (#10733)
|
||||||
* DevP2p: Get node IP address and udp port from Socket, if not included in PING packet ([#10705](https://github.com/paritytech/parity-ethereum/pull/10705))
|
* ethcore/res: activate atlantis classic hf on block 8772000 (#10766)
|
||||||
* introduce MissingParent Error, fixes #10699 ([#10700](https://github.com/paritytech/parity-ethereum/pull/10700))
|
* refactor: Fix indentation (#10740)
|
||||||
* Refactor Clique stepping ([#10691](https://github.com/paritytech/parity-ethereum/pull/10691))
|
* Updated Bn128PairingImpl to use optimized batch pairing (#10765)
|
||||||
* add_sync_notifier in EthPubSubClient holds on to a Client for too long ([#10689](https://github.com/paritytech/parity-ethereum/pull/10689))
|
* fix: aura don't add `SystemTime::now()` (#10720)
|
||||||
* Fix compiler warning (that will become an error) ([#10683](https://github.com/paritytech/parity-ethereum/pull/10683))
|
* Initialize private tx logger only if private tx functionality is enabled (#10758)
|
||||||
* Don't panic if extra_data is longer than VANITY_LENGTH ([#10682](https://github.com/paritytech/parity-ethereum/pull/10682))
|
* Remove unused code (#10762)
|
||||||
* Remove annoying compiler warnings ([#10679](https://github.com/paritytech/parity-ethereum/pull/10679))
|
* Remove calls to heapsize (#10432)
|
||||||
* Remove support for hardware wallets ([#10678](https://github.com/paritytech/parity-ethereum/pull/10678))
|
* [devp2p] Update to 2018 edition (#10716)
|
||||||
* [CI] allow cargo audit to fail ([#10676](https://github.com/paritytech/parity-ethereum/pull/10676))
|
* Add a way to signal shutdown to snapshotting threads (#10744)
|
||||||
* new image ([#10673](https://github.com/paritytech/parity-ethereum/pull/10673))
|
* Enable aesni (#10756)
|
||||||
* Upgrade ethereum types ([#10670](https://github.com/paritytech/parity-ethereum/pull/10670))
|
* remove support of old SS db formats (#10757)
|
||||||
* Reset blockchain properly ([#10669](https://github.com/paritytech/parity-ethereum/pull/10669))
|
* [devp2p] Don't use `rust-crypto` (#10714)
|
||||||
* fix: Move PR template into .github/ folder ([#10663](https://github.com/paritytech/parity-ethereum/pull/10663))
|
* updater: fix static id hashes initialization (#10755)
|
||||||
* docs: evmbin - Update Rust docs ([#10658](https://github.com/paritytech/parity-ethereum/pull/10658))
|
* Use fewer threads for snapshotting (#10752)
|
||||||
* refactor: Related #9459 - evmbin: replace untyped json! macro with fully typed serde serialization using Rust structs ([#10657](https://github.com/paritytech/parity-ethereum/pull/10657))
|
* Die error_chain, die (#10747)
|
||||||
* docs: Add PR template ([#10654](https://github.com/paritytech/parity-ethereum/pull/10654))
|
* Fix deprectation warnings on nightly (#10746)
|
||||||
* docs: Add ProgPoW Rust docs to ethash module ([#10653](https://github.com/paritytech/parity-ethereum/pull/10653))
|
* fix docker tags for publishing (#10741)
|
||||||
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions ([#10652](https://github.com/paritytech/parity-ethereum/pull/10652))
|
* DevP2p: Get node IP address and udp port from Socket, if not included in PING packet (#10705)
|
||||||
* Upgrade to parity-crypto 0.4 ([#10650](https://github.com/paritytech/parity-ethereum/pull/10650))
|
* ethcore: enable ECIP-1054 for classic (#10731)
|
||||||
* fix(compilation warnings) ([#10649](https://github.com/paritytech/parity-ethereum/pull/10649))
|
* Stop breaking out of loop if a non-canonical hash is found (#10729)
|
||||||
* [whisper] Move needed aes_gcm crypto in-crate ([#10647](https://github.com/paritytech/parity-ethereum/pull/10647))
|
* Refactor Clique stepping (#10691)
|
||||||
* Update publishing ([#10644](https://github.com/paritytech/parity-ethereum/pull/10644))
|
* Use RUSTFLAGS to set the optimization level (#10719)
|
||||||
* ci: publish docs debug ([#10638](https://github.com/paritytech/parity-ethereum/pull/10638))
|
* SecretStore: non-blocking wait of session completion (#10303)
|
||||||
* Fix publish docs ([#10635](https://github.com/paritytech/parity-ethereum/pull/10635))
|
* removed secret_store folder (#10722)
|
||||||
* Fix rinkeby petersburg fork ([#10632](https://github.com/paritytech/parity-ethereum/pull/10632))
|
* SecretStore: expose restore_key_public in HTTP API (#10241)
|
||||||
* Update kovan.json to switch Kovan validator set to POA Consensus Contracts ([#10628](https://github.com/paritytech/parity-ethereum/pull/10628))
|
* Revert "enable lto for release builds (#10717)" (#10721)
|
||||||
* [ethcore] remove error_chain ([#10616](https://github.com/paritytech/parity-ethereum/pull/10616))
|
* enable lto for release builds (#10717)
|
||||||
* Remove unused import ([#10615](https://github.com/paritytech/parity-ethereum/pull/10615))
|
* Merge `Notifier` and `TransactionsPoolNotifier` (#10591)
|
||||||
* Adds parity_getRawBlockByNumber, parity_submitRawBlock ([#10609](https://github.com/paritytech/parity-ethereum/pull/10609))
|
* [devp2p] Fix warnings and re-org imports (#10710)
|
||||||
* adds rpc error message for --no-ancient-blocks ([#10608](https://github.com/paritytech/parity-ethereum/pull/10608))
|
* Upgrade ethereum types (#10670)
|
||||||
* Constantinople HF on POA Core ([#10606](https://github.com/paritytech/parity-ethereum/pull/10606))
|
* introduce MissingParent Error, fixes #10699 (#10700)
|
||||||
* Clique: zero-fill extradata when the supplied value is less than 32 bytes in length ([#10605](https://github.com/paritytech/parity-ethereum/pull/10605))
|
* Update publishing (#10644)
|
||||||
* evm: add some mulmod benches ([#10600](https://github.com/paritytech/parity-ethereum/pull/10600))
|
* Upgrade to parity-crypto 0.4 (#10650)
|
||||||
* sccache logs to stdout ([#10596](https://github.com/paritytech/parity-ethereum/pull/10596))
|
* new image (#10673)
|
||||||
* update bootnodes ([#10595](https://github.com/paritytech/parity-ethereum/pull/10595))
|
* Add SealingState; don't prepare block when not ready. (#10529)
|
||||||
* Merge `Notifier` and `TransactionsPoolNotifier` ([#10591](https://github.com/paritytech/parity-ethereum/pull/10591))
|
* Fix compiler warning (that will become an error) (#10683)
|
||||||
* fix(whisper): change expiry `unix_time + ttl + work` ([#10587](https://github.com/paritytech/parity-ethereum/pull/10587))
|
* add_sync_notifier in EthPubSubClient holds on to a Client for too long (#10689)
|
||||||
* fix(evmbin): make benches compile again ([#10586](https://github.com/paritytech/parity-ethereum/pull/10586))
|
* Don't panic if extra_data is longer than VANITY_LENGTH (#10682)
|
||||||
* fix issue with compilation when 'slow-blocks' feature enabled ([#10585](https://github.com/paritytech/parity-ethereum/pull/10585))
|
* docs: evmbin - Update Rust docs (#10658)
|
||||||
* Allow CORS requests in Secret Store API ([#10584](https://github.com/paritytech/parity-ethereum/pull/10584))
|
* Remove annoying compiler warnings (#10679)
|
||||||
* CI improvements ([#10579](https://github.com/paritytech/parity-ethereum/pull/10579))
|
* Reset blockchain properly (#10669)
|
||||||
* ethcore: improve timestamp handling ([#10574](https://github.com/paritytech/parity-ethereum/pull/10574))
|
* Remove support for hardware wallets (#10678)
|
||||||
* Update Issue Template to direct security issue to email ([#10562](https://github.com/paritytech/parity-ethereum/pull/10562))
|
* [CI] allow cargo audit to fail (#10676)
|
||||||
* version: bump master to 2.6 ([#10560](https://github.com/paritytech/parity-ethereum/pull/10560))
|
* docs: Add ProgPoW Rust docs to ethash module (#10653)
|
||||||
* fix(light cull): poll light cull instead of timer ([#10559](https://github.com/paritytech/parity-ethereum/pull/10559))
|
* fix: Move PR template into .github/ folder (#10663)
|
||||||
* Watch transactions pool ([#10558](https://github.com/paritytech/parity-ethereum/pull/10558))
|
* docs: Add PR template (#10654)
|
||||||
* Add SealingState; don't prepare block when not ready. ([#10529](https://github.com/paritytech/parity-ethereum/pull/10529))
|
* Trivial journal for private transactions (#10056)
|
||||||
* Explicitly enable or disable Stratum in config file (Issue 9785) ([#10521](https://github.com/paritytech/parity-ethereum/pull/10521))
|
* fix(compilation warnings) (#10649)
|
||||||
* Add filtering capability to `parity_pendingTransactions` (issue 8269) ([#10506](https://github.com/paritytech/parity-ethereum/pull/10506))
|
* [whisper] Move needed aes_gcm crypto in-crate (#10647)
|
||||||
* Remove calls to heapsize ([#10432](https://github.com/paritytech/parity-ethereum/pull/10432))
|
* Adds parity_getRawBlockByNumber, parity_submitRawBlock (#10609)
|
||||||
* RPC: Implements eth_subscribe("syncing") ([#10311](https://github.com/paritytech/parity-ethereum/pull/10311))
|
* Fix rinkeby petersburg fork (#10632)
|
||||||
* SecretStore: non-blocking wait of session completion ([#10303](https://github.com/paritytech/parity-ethereum/pull/10303))
|
* ci: publish docs debug (#10638)
|
||||||
* Node table limiting and cache for node filter ([#10288](https://github.com/paritytech/parity-ethereum/pull/10288))
|
* Fix publish docs (#10635)
|
||||||
* SecretStore: expose restore_key_public in HTTP API ([#10241](https://github.com/paritytech/parity-ethereum/pull/10241))
|
* Update kovan.json to switch validator set to POA Consensus Contracts (#10628)
|
||||||
* Trivial journal for private transactions ([#10056](https://github.com/paritytech/parity-ethereum/pull/10056))
|
* [ethcore] remove error_chain (#10616)
|
||||||
|
* Remove unused import (#10615)
|
||||||
## Previous releases
|
* evm: add some mulmod benches (#10600)
|
||||||
|
* Clique: zero-fill extradata when the supplied value is less than 32 bytes in length (#10605)
|
||||||
- [CHANGELOG-2.5](docs/CHANGELOG-2.5.md) (_stable_)
|
* Constantinople HF on POA Core (#10606)
|
||||||
- [CHANGELOG-2.4](docs/CHANGELOG-2.4.md) (EOL: 2019-07-08)
|
* adds rpc error message for --no-ancient-blocks (#10608)
|
||||||
- [CHANGELOG-2.3](docs/CHANGELOG-2.3.md) (EOL: 2019-04-09)
|
* Allow CORS requests in Secret Store API (#10584)
|
||||||
- [CHANGELOG-2.2](docs/CHANGELOG-2.2.md) (EOL: 2019-02-25)
|
* update bootnodes (#10595)
|
||||||
- [CHANGELOG-2.1](docs/CHANGELOG-2.1.md) (EOL: 2019-01-16)
|
* sccache logs to stdout (#10596)
|
||||||
- [CHANGELOG-2.0](docs/CHANGELOG-2.0.md) (EOL: 2018-11-15)
|
* fix(whisper expiry): current time + work + ttl (#10587)
|
||||||
- [CHANGELOG-1.11](docs/CHANGELOG-1.11.md) (EOL: 2018-09-19)
|
* CI improvements (#10579)
|
||||||
- [CHANGELOG-1.10](docs/CHANGELOG-1.10.md) (EOL: 2018-07-18)
|
* Watch transactions pool (#10558)
|
||||||
- [CHANGELOG-1.9](docs/CHANGELOG-1.9.md) (EOL: 2018-05-09)
|
* fix(evmbin): make benches compile again (#10586)
|
||||||
- [CHANGELOG-1.8](docs/CHANGELOG-1.8.md) (EOL: 2018-03-22)
|
* fix issue with compilation when 'slow-blocks' feature enabled (#10585)
|
||||||
- [CHANGELOG-1.7](docs/CHANGELOG-1.7.md) (EOL: 2018-01-25)
|
* Reject crazy timestamps instead of truncating. (#10574)
|
||||||
- [CHANGELOG-1.6](docs/CHANGELOG-1.6.md) (EOL: 2017-10-15)
|
* Node table limiting and cache for node filter (#10288)
|
||||||
- [CHANGELOG-1.5](docs/CHANGELOG-1.5.md) (EOL: 2017-07-28)
|
* fix(light cull): poll light cull instead of timer (#10559)
|
||||||
- [CHANGELOG-1.4](docs/CHANGELOG-1.4.md) (EOL: 2017-03-13)
|
* Update Issue Template to direct security issue to email (#10562)
|
||||||
- [CHANGELOG-1.3](docs/CHANGELOG-1.3.md) (EOL: 2017-01-19)
|
* RPC: Implements eth_subscribe("syncing") (#10311)
|
||||||
- [CHANGELOG-1.2](docs/CHANGELOG-1.2.md) (EOL: 2016-11-07)
|
* Explicitly enable or disable Stratum in config file (Issue 9785) (#10521)
|
||||||
- [CHANGELOG-1.1](docs/CHANGELOG-1.1.md) (EOL: 2016-08-12)
|
* version: bump master to 2.6 (#10560)
|
||||||
- [CHANGELOG-1.0](docs/CHANGELOG-1.0.md) (EOL: 2016-06-24)
|
|
||||||
- [CHANGELOG-0.9](docs/CHANGELOG-0.9.md) (EOL: 2016-05-02)
|
|
||||||
|
|||||||
5964
Cargo.lock
generated
5964
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
101
Cargo.toml
101
Cargo.toml
@@ -2,40 +2,27 @@
|
|||||||
description = "Parity Ethereum client"
|
description = "Parity Ethereum client"
|
||||||
name = "parity-ethereum"
|
name = "parity-ethereum"
|
||||||
# NOTE Make sure to update util/version/Cargo.toml as well
|
# NOTE Make sure to update util/version/Cargo.toml as well
|
||||||
version = "2.6.3"
|
version = "2.7.2"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
blooms-db = { path = "util/blooms-db" }
|
|
||||||
log = "0.4"
|
|
||||||
rustc-hex = "1.0"
|
|
||||||
docopt = "1.0"
|
|
||||||
clap = "2"
|
|
||||||
term_size = "0.3"
|
|
||||||
textwrap = "0.9"
|
|
||||||
num_cpus = "1.2"
|
|
||||||
number_prefix = "0.2"
|
|
||||||
rpassword = "1.0"
|
|
||||||
semver = "0.9"
|
|
||||||
ansi_term = "0.11"
|
ansi_term = "0.11"
|
||||||
parking_lot = "0.7"
|
|
||||||
regex = "1.0"
|
|
||||||
atty = "0.2.8"
|
atty = "0.2.8"
|
||||||
toml = "0.4"
|
blooms-db = { path = "util/blooms-db" }
|
||||||
serde = "1.0"
|
clap = "2"
|
||||||
serde_json = "1.0"
|
cli-signer= { path = "cli-signer" }
|
||||||
serde_derive = "1.0"
|
client-traits = { path = "ethcore/client-traits" }
|
||||||
futures = "0.1"
|
|
||||||
fdlimit = "0.1"
|
|
||||||
ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" }
|
|
||||||
jsonrpc-core = "12.0.0"
|
|
||||||
parity-bytes = "0.1"
|
|
||||||
common-types = { path = "ethcore/types" }
|
common-types = { path = "ethcore/types" }
|
||||||
|
ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" }
|
||||||
|
dir = { path = "util/dir" }
|
||||||
|
docopt = "1.0"
|
||||||
|
engine = { path = "ethcore/engine" }
|
||||||
|
ethabi = { version = "9.0.1", optional = true }
|
||||||
ethcore = { path = "ethcore", features = ["parity"] }
|
ethcore = { path = "ethcore", features = ["parity"] }
|
||||||
ethcore-accounts = { path = "accounts", optional = true }
|
ethcore-accounts = { path = "accounts", optional = true }
|
||||||
ethcore-blockchain = { path = "ethcore/blockchain" }
|
ethcore-blockchain = { path = "ethcore/blockchain" }
|
||||||
ethcore-call-contract = { path = "ethcore/call-contract"}
|
ethcore-call-contract = { path = "ethcore/call-contract", optional = true }
|
||||||
ethcore-db = { path = "ethcore/db" }
|
ethcore-db = { path = "ethcore/db" }
|
||||||
ethcore-io = { path = "util/io" }
|
ethcore-io = { path = "util/io" }
|
||||||
ethcore-light = { path = "ethcore/light" }
|
ethcore-light = { path = "ethcore/light" }
|
||||||
@@ -43,37 +30,53 @@ ethcore-logger = { path = "parity/logger" }
|
|||||||
ethcore-miner = { path = "miner" }
|
ethcore-miner = { path = "miner" }
|
||||||
ethcore-network = { path = "util/network" }
|
ethcore-network = { path = "util/network" }
|
||||||
ethcore-private-tx = { path = "ethcore/private-tx" }
|
ethcore-private-tx = { path = "ethcore/private-tx" }
|
||||||
|
ethcore-secretstore = { path = "secret-store", optional = true }
|
||||||
ethcore-service = { path = "ethcore/service" }
|
ethcore-service = { path = "ethcore/service" }
|
||||||
ethcore-sync = { path = "ethcore/sync" }
|
ethcore-sync = { path = "ethcore/sync" }
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
ethkey = { path = "accounts/ethkey" }
|
ethkey = { path = "accounts/ethkey" }
|
||||||
ethstore = { path = "accounts/ethstore" }
|
ethstore = { path = "accounts/ethstore" }
|
||||||
|
fdlimit = "0.1"
|
||||||
|
futures = "0.1"
|
||||||
|
journaldb = { path = "util/journaldb" }
|
||||||
|
jsonrpc-core = "14.0.3"
|
||||||
|
keccak-hash = "0.4.0"
|
||||||
|
kvdb = "0.3.1"
|
||||||
|
kvdb-rocksdb = "0.4.1"
|
||||||
|
log = "0.4"
|
||||||
|
migration-rocksdb = { path = "util/migration-rocksdb" }
|
||||||
node-filter = { path = "ethcore/node-filter" }
|
node-filter = { path = "ethcore/node-filter" }
|
||||||
rlp = "0.4.0"
|
num_cpus = "1.2"
|
||||||
cli-signer= { path = "cli-signer" }
|
number_prefix = "0.2"
|
||||||
|
panic_hook = { path = "util/panic-hook" }
|
||||||
|
parity-bytes = "0.1"
|
||||||
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
parity-daemonize = "0.3"
|
parity-daemonize = "0.3"
|
||||||
parity-hash-fetch = { path = "updater/hash-fetch" }
|
parity-hash-fetch = { path = "updater/hash-fetch" }
|
||||||
parity-ipfs-api = { path = "ipfs" }
|
parity-ipfs-api = { path = "ipfs" }
|
||||||
parity-local-store = { path = "miner/local-store" }
|
parity-local-store = { path = "miner/local-store" }
|
||||||
parity-runtime = { path = "util/runtime" }
|
|
||||||
parity-rpc = { path = "rpc" }
|
|
||||||
parity-updater = { path = "updater" }
|
|
||||||
parity-version = { path = "util/version" }
|
|
||||||
parity-whisper = { path = "whisper" }
|
|
||||||
parity-path = "0.1"
|
parity-path = "0.1"
|
||||||
dir = { path = "util/dir" }
|
parity-rpc = { path = "rpc" }
|
||||||
panic_hook = { path = "util/panic-hook" }
|
parity-runtime = { path = "util/runtime" }
|
||||||
keccak-hash = "0.2.0"
|
parity-updater = { path = "updater" }
|
||||||
migration-rocksdb = { path = "util/migration-rocksdb" }
|
parity-util-mem = { version = "0.3.0", features = ["jemalloc-global"] }
|
||||||
kvdb = "0.1"
|
parity-version = { path = "util/version" }
|
||||||
kvdb-rocksdb = "0.1.3"
|
parking_lot = "0.9"
|
||||||
journaldb = { path = "util/journaldb" }
|
regex = "1.0"
|
||||||
|
|
||||||
ethcore-secretstore = { path = "secret-store", optional = true }
|
|
||||||
|
|
||||||
registrar = { path = "util/registrar" }
|
registrar = { path = "util/registrar" }
|
||||||
|
rlp = "0.4.0"
|
||||||
parity-util-mem = { version = "0.1", features = ["jemalloc-global"] }
|
rpassword = "1.0"
|
||||||
|
rustc-hex = "1.0"
|
||||||
|
semver = "0.9"
|
||||||
|
serde = "1.0"
|
||||||
|
serde_derive = "1.0"
|
||||||
|
serde_json = "1.0"
|
||||||
|
snapshot = { path = "ethcore/snapshot" }
|
||||||
|
spec = { path = "ethcore/spec" }
|
||||||
|
term_size = "0.3"
|
||||||
|
textwrap = "0.9"
|
||||||
|
toml = "0.4"
|
||||||
|
verification = { path = "ethcore/verification" }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
rustc_version = "0.2"
|
rustc_version = "0.2"
|
||||||
@@ -92,12 +95,11 @@ default = ["accounts"]
|
|||||||
accounts = ["ethcore-accounts", "parity-rpc/accounts"]
|
accounts = ["ethcore-accounts", "parity-rpc/accounts"]
|
||||||
miner-debug = ["ethcore/miner-debug"]
|
miner-debug = ["ethcore/miner-debug"]
|
||||||
json-tests = ["ethcore/json-tests"]
|
json-tests = ["ethcore/json-tests"]
|
||||||
ci-skip-tests = ["ethcore/ci-skip-tests"]
|
|
||||||
test-heavy = ["ethcore/test-heavy"]
|
test-heavy = ["ethcore/test-heavy"]
|
||||||
evm-debug = ["ethcore/evm-debug"]
|
evm-debug = ["ethcore/evm-debug"]
|
||||||
evm-debug-tests = ["ethcore/evm-debug-tests"]
|
evm-debug-tests = ["ethcore/evm-debug-tests"]
|
||||||
slow-blocks = ["ethcore/slow-blocks"]
|
slow-blocks = ["ethcore/slow-blocks"]
|
||||||
secretstore = ["ethcore-secretstore", "ethcore-secretstore/accounts"]
|
secretstore = ["ethcore-secretstore", "accounts", "ethabi", "ethcore-call-contract"]
|
||||||
final = ["parity-version/final"]
|
final = ["parity-version/final"]
|
||||||
deadlock_detection = ["parking_lot/deadlock_detection"]
|
deadlock_detection = ["parking_lot/deadlock_detection"]
|
||||||
# to create a memory profile (requires nightly rust), use e.g.
|
# to create a memory profile (requires nightly rust), use e.g.
|
||||||
@@ -133,11 +135,4 @@ members = [
|
|||||||
"chainspec",
|
"chainspec",
|
||||||
"ethcore/wasm/run",
|
"ethcore/wasm/run",
|
||||||
"evmbin",
|
"evmbin",
|
||||||
"parity-clib",
|
|
||||||
"whisper/cli",
|
|
||||||
"util/triehash-ethereum",
|
|
||||||
"util/keccak-hasher",
|
|
||||||
"util/patricia-trie-ethereum",
|
|
||||||
"util/fastmap",
|
|
||||||
"util/time-utils",
|
|
||||||
]
|
]
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -42,7 +42,7 @@ By default, Parity Ethereum runs a JSON-RPC HTTP server on port `:8545` and a We
|
|||||||
|
|
||||||
If you run into problems while using Parity Ethereum, check out the [wiki for documentation](https://wiki.parity.io/), feel free to [file an issue in this repository](https://github.com/paritytech/parity-ethereum/issues/new), or hop on our [Gitter](https://gitter.im/paritytech/parity) or [Riot](https://riot.im/app/#/group/+parity:matrix.parity.io) chat room to ask a question. We are glad to help! **For security-critical issues**, please refer to the security policy outlined in [SECURITY.md](SECURITY.md).
|
If you run into problems while using Parity Ethereum, check out the [wiki for documentation](https://wiki.parity.io/), feel free to [file an issue in this repository](https://github.com/paritytech/parity-ethereum/issues/new), or hop on our [Gitter](https://gitter.im/paritytech/parity) or [Riot](https://riot.im/app/#/group/+parity:matrix.parity.io) chat room to ask a question. We are glad to help! **For security-critical issues**, please refer to the security policy outlined in [SECURITY.md](SECURITY.md).
|
||||||
|
|
||||||
Parity Ethereum's current beta-release is 2.1. You can download it at [the releases page](https://github.com/paritytech/parity-ethereum/releases) or follow the instructions below to build from source. Please, mind the [CHANGELOG.md](CHANGELOG.md) for a list of all changes between different versions.
|
Parity Ethereum's current beta-release is 2.6. You can download it at [the releases page](https://github.com/paritytech/parity-ethereum/releases) or follow the instructions below to build from source. Please, mind the [CHANGELOG.md](CHANGELOG.md) for a list of all changes between different versions.
|
||||||
|
|
||||||
## 3. Building <a id="chapter-003"></a>
|
## 3. Building <a id="chapter-003"></a>
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ We recommend installing Rust through [rustup](https://www.rustup.rs/). If you do
|
|||||||
|
|
||||||
`clang` is required. It comes with Xcode command line tools or can be installed with homebrew.
|
`clang` is required. It comes with Xcode command line tools or can be installed with homebrew.
|
||||||
|
|
||||||
- Windows:
|
- Windows:
|
||||||
Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the `rustup` installer from
|
Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the `rustup` installer from
|
||||||
https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe, start "VS2015 x64 Native Tools Command Prompt", and use the following command to install and set up the `msvc` toolchain:
|
https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe, start "VS2015 x64 Native Tools Command Prompt", and use the following command to install and set up the `msvc` toolchain:
|
||||||
```bash
|
```bash
|
||||||
@@ -151,7 +151,7 @@ To start Parity Ethereum as a regular user using `systemd` init:
|
|||||||
|
|
||||||
## 4. Testing <a id="chapter-004"></a>
|
## 4. Testing <a id="chapter-004"></a>
|
||||||
|
|
||||||
You can run tests with the following commands:
|
Download the required test files: `git submodule update --init --recursive`. You can run tests with the following commands:
|
||||||
|
|
||||||
* **All** packages
|
* **All** packages
|
||||||
```
|
```
|
||||||
@@ -320,10 +320,6 @@ Caching, Importing Blocks, and Block Information
|
|||||||
patricia-trie-ethereum registrar rlp_compress rlp_derive parity-runtime stats
|
patricia-trie-ethereum registrar rlp_compress rlp_derive parity-runtime stats
|
||||||
time-utils triehash-ethereum unexpected parity-version
|
time-utils triehash-ethereum unexpected parity-version
|
||||||
```
|
```
|
||||||
* Parity Whisper Protocol Implementation
|
|
||||||
```bash
|
|
||||||
parity-whisper whisper-cli
|
|
||||||
```
|
|
||||||
|
|
||||||
</p></details>
|
</p></details>
|
||||||
|
|
||||||
@@ -360,10 +356,10 @@ In addition to the Parity Ethereum client, there are additional tools in this re
|
|||||||
- [evmbin](./evmbin) - Parity Ethereum EVM Implementation.
|
- [evmbin](./evmbin) - Parity Ethereum EVM Implementation.
|
||||||
- [ethstore](./accounts/ethstore) - Parity Ethereum Key Management.
|
- [ethstore](./accounts/ethstore) - Parity Ethereum Key Management.
|
||||||
- [ethkey](./accounts/ethkey) - Parity Ethereum Keys Generator.
|
- [ethkey](./accounts/ethkey) - Parity Ethereum Keys Generator.
|
||||||
- [whisper](./whisper) - Parity Ethereum Whisper-v2 PoC Implementation.
|
|
||||||
|
|
||||||
The following tool is available in a separate repository:
|
The following tool is available in a separate repository:
|
||||||
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum Encoding of Function Calls. [Docs here](https://crates.io/crates/ethabi)
|
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum Encoding of Function Calls. [Docs here](https://crates.io/crates/ethabi)
|
||||||
|
- [whisper](https://github.com/paritytech/whisper) - Parity Ethereum Whisper-v2 PoC Implementation.
|
||||||
|
|
||||||
## 7. Community <a id="chapter-007"></a>
|
## 7. Community <a id="chapter-007"></a>
|
||||||
|
|
||||||
|
|||||||
77
SECURITY.md
77
SECURITY.md
@@ -48,33 +48,54 @@ Our Bug Bounty Program allows us to recognise and reward members of the Parity c
|
|||||||
```
|
```
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
mQENBFlyIAwBCACe0keNPjgYzZ1Oy/8t3zj/Qw9bHHqrzx7FWy8NbXnYBM19NqOZ
|
mQINBF0vHwQBEADKui4qAo4bzdzRhMm+uhUpYGf8jjjmET3zJ8kKQIpp6JTsV+HJ
|
||||||
DIP7Oe0DvCaf/uruBskCS0iVstHlEFQ2AYe0Ei0REt9lQdy61GylU/DEB3879IG+
|
6m1We0QYeMRXoOYH1xVHBf2zNCuHS0nSQdUCQA7SHWsPB05STa2hvlR7fSdQnCCp
|
||||||
6FO0SnFeYeerv1/hFI2K6uv8v7PyyVDiiJSW0I1KIs2OBwJicTKmWxLAeQsRgx9G
|
gnLOJWXvvedlRDIAhvqI6cwLdUlXgVSKEwrwmrpiBhh4NxI3qX+LyIa+Ovkchu2S
|
||||||
yRGalrVk4KP+6pWTA7k3DxmDZKZyfYV/Ej10NtuzmsemwDbv98HKeomp/kgFOfSy
|
d/YCnE4GqojSGRfJYiGwe2N+sF7OfaoKhQuTrtdDExHrMU4cWnTXW2wyxTr4xkj9
|
||||||
3AZjeCpctlsNqpjUuXa0/HudmH2WLxZ0fz8XeoRh8XM9UudNIecjrDqmAFrt/btQ
|
jS2WeLVZWflvkDHT8JD9N6jNxBVEF/Qvjk83zI0kCOzkhek8x+YUgfLq3/rHOYbX
|
||||||
/3guvlzhFCdhYPVGsUusKMECk/JG+Xx1/1ZjABEBAAG0LFBhcml0eSBTZWN1cml0
|
3pW21ccHYPacHjHWvKE+xRebjeEhJ4KxKHfCVjQcxybwDBqDka1AniZt4CQ7UORf
|
||||||
eSBDb250YWN0IDxzZWN1cml0eUBwYXJpdHkuaW8+iQFUBBMBCAA+FiEE2uUVYCjP
|
MU/ue2oSZ9nNg0uMdb/0AbQPZ04OlMcYPAPWzFL08nVPox9wT9uqlL6JtcOeC90h
|
||||||
N6B8aTiDXQ8DAY0H3nMFAllyIAwCGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwEC
|
oOeDmfgwmjMmdwWTRgt9qQjcbgXzVvuAzIGbzj1X3MdLspWdHs/d2+US4nji1TkN
|
||||||
HgECF4AACgkQXQ8DAY0H3nM60wgAkS3A36Zc+upiaxU7tumcGv+an17j7gin0sif
|
oYIW7vE+xkd3aB+NZunIlm9Rwd/0mSgDg+DaNa5KceOLhq0/qKgcXC/RRU29I8II
|
||||||
+0ELSjVfrXInM6ovai+NhUdcLkJ7tCrKS90fvlaELK5Sg9CXBWCTFccKN4A/B7ey
|
tusRoR/oesGJGYTjh4k6PJkG+nvDPsoQrwYT44bhnniS1xYkxWYXF99JFI7LgMdD
|
||||||
rOg2NPXUecnyBB/XqQgKYH7ujYlOlqBDXMfz6z8Hj6WToxg9PPMGGomyMGh8AWxM
|
e1SgKeIDVpvm873k82E6arp5655Wod1XOjaXBggCwFp84eKcEZEN+1qEWwARAQAB
|
||||||
3yRPFs5RKt0VKgN++5N00oly5Y8ri5pgCidDvCLYMGTVDHFKwkuc9w6BlWlu1R1e
|
tClQYXJpdHkgU2VjdXJpdHkgVGVhbSA8c2VjdXJpdHlAcGFyaXR5LmlvPokCVAQT
|
||||||
/hXFWUFAP1ffTAul3QwyKhjPn2iotCdxXjvt48KaU8DN4iL7aMBN/ZBKqGS7yRdF
|
AQoAPhYhBJ1LK264+XFW0ZZpqf8IEtSRuWeYBQJdLx8EAhsDBQkDwmcABQsJCAcC
|
||||||
D/JbJyaaJ0ZRvFSTSXy/sWY3z1B5mtCPBxco8hqqNfRkCwuZ6LkBDQRZciAMAQgA
|
BhUKCQgLAgQWAgMBAh4BAheAAAoJEP8IEtSRuWeYL84QAI6NwnwS561DWYYRAd4y
|
||||||
8BP8xrwe12TOUTqL/Vrbxv/FLdhKh53J6TrPKvC2TEEKOrTNo5ahRq+XOS5E7G2N
|
ocGPr3CnwFSt1GjkSkRy3B+tMhzexBg1y7EbLRUefIrO4LwOlywtRk8tTRGgEI4i
|
||||||
x3b+fq8gR9BzFcldAx0XWUtGs/Wv++ulaSNqTBxj13J3G3WGsUfMKxRgj//piCUD
|
5xRLHbOkeolfgCFSpOj5d8cMKCt5HEIv18hsv6dkrzlSYA5NLX/GRBEh3F/0sGny
|
||||||
bCFLQfGZdKk0M1o9QkPVARwwmvCNiNB/l++xGqPtfc44H5jWj3GoGvL2MkShPzrN
|
vCXapfxa1cx72sU7631JBK7t2Tf+MfwxdfyFZ9TI9WdtP5AfVjgTkIVkEDFcZPTc
|
||||||
yN/bJ+m+R5gtFGdInqa5KXBuxxuW25eDKJ+LzjbgUgeC76wNcfOiQHTdMkcupjdO
|
n3CYXqTYFIBCNUD8LP4iTi3xUt7pTGJQQoFT8l15nJCgzRYQ+tXpoTRlf+/LtXmw
|
||||||
bbGFwo10hcbRAOcZEv6//Zrlmk/6nPxEd2hN20St2bSN0+FqfZ267mWEu3ejsgF8
|
6iidPV87E06jHdK9666rBouIabAtx7i0/4kwo+bSZ8DiSKRUaehiHGd212HSEmdF
|
||||||
ArdCpv5h4fBvJyNwiTZwIQARAQABiQE8BBgBCAAmFiEE2uUVYCjPN6B8aTiDXQ8D
|
jxquWE4pEzoUowYznhSIfR+WWIqRBHxEYarP4m98Hi+VXZ7Fw1ytzO8+BAKnLXnj
|
||||||
AY0H3nMFAllyIAwCGwwFCQPCZwAACgkQXQ8DAY0H3nNisggAl4fqhRlA34wIb190
|
2W2+T9qJks5gqVEoaWNnqpvya6JA11QZvZ0w7Om2carDc2ILNm2Xx9J0mRUye8P0
|
||||||
sqXHVxiCuzPaqS6krE9xAa1+gncX485OtcJNqnjugHm2rFE48lv7oasviuPXuInE
|
KxcgqJuKNGFtugebQAsXagkxOKsdKna1PlDlxEfTf6AgI3ST8qSiMAwaaIMB/REF
|
||||||
/OgVFnXYv9d/Xx2JUeDs+bFTLouCDRY2Unh7KJZasfqnMcCHWcxHx5FvRNZRssaB
|
VKUapGoslQX4tOCjibI2pzEgE//D8NAaSVu2A9+BUcFERdZRxsI7fydIXNeZ2R46
|
||||||
WTZVo6sizPurGUtbpYe4/OLFhadBqAE0EUmVRFEUMc1YTnu4eLaRBzoWN4d2UWwi
|
N2qfW+DP3YR/14QgdRxDItEavUoE1vByRXwIufKAkVemOZzIoFXKFsDeXwqTVW5i
|
||||||
LN25RSrVSke7LTSFbgn9ntQrQ2smXSR+cdNkkfRCjFcpUaecvFl9HwIqoyVbT4Ym
|
6CXu6OddZ3QHDiT9TEbRny4QuQINBF0vKCwBEACnP5J7LEGbpxNBrPvGdxZUo0YA
|
||||||
0hbpbbX/cJdc91tKa+psa29uMeGL/cgL9fAu19yNFRyOTMxjZnvql1X/WE1pLmoP
|
U8RgeKDRPxJTvMo27V1IPZGaKRCRq8LBfg/eHhqZhQ7SLJBjBljd8kuT5dHDBTRe
|
||||||
ETBD1Q==
|
jE1UIOhmnlSlrEJjAmpVO08irlGpq1o+8mGcvkBsR0poCVjeNeSnwYfRnR+c3GK5
|
||||||
=K9Qw
|
Er6/JRqfN4mJvnEC9/Pbm6C7ql6YLKxC3yqzF97JL5brbbuozrW7nixY/yAI8619
|
||||||
|
VlBIMP7PAUbGcnSQyuV5b/Wr2Sgr6NJclnNSLjh2U9/Du6w/0tDGlMBts8HjRnWJ
|
||||||
|
BXbkTdQKCTaqgK68kTKSiN1/x+lynxHC2AavMpH/08Kopg2ZCzJowMKIgcB+4Z/I
|
||||||
|
DJKZWHWKumhaZMGXcWgzgcByog9IpamuROEZFJNEUAFf7YIncEckPSif4looiOdS
|
||||||
|
VurKZGvYXXaGSsZbGgHxI5CWu7ZxMdLBLvtOcCYmRQrG+g/h+PGU5BT0bNAfNTkm
|
||||||
|
V3/n1B/TWbpWRmB3AwT2emQivXHkaubGI0VivhaO43AuI9JWoqiMqFtxbuTeoxwD
|
||||||
|
xlu2Dzcp0v+AR4T5cIG9D5/+yiPc25aIY7cIKxuNFHIDL4td5fwSGC7vU6998PIG
|
||||||
|
2Y48TGBnw7zpEfDfMayqAeBjX0YU6PTNsvS5O6bP3j4ojTOUYD7Z8QdCvgISDID3
|
||||||
|
WMGAdmSwmCRvsQ/OJwARAQABiQI8BBgBCgAmFiEEnUsrbrj5cVbRlmmp/wgS1JG5
|
||||||
|
Z5gFAl0vKCwCGwwFCQB2pwAACgkQ/wgS1JG5Z5hdbw//ZqR+JcWm59NUIHjauETJ
|
||||||
|
sYDYhcAfa3txTacRn5uPz/TQiTd7wZ82+G8Et0ZnpEHy6eWyBqHpG0hiPhFBzxjY
|
||||||
|
nhjHl8jJeyo2mQIVJhzkL58BHBZk8WM2TlaU7VxZ6TYOmP2y3qf6FD6mCcrQ4Fml
|
||||||
|
E9f0lyVUoI/5Zs9oF0izRk8vkwaY3UvLM7XEY6nM8GnFG8kaiZMYmx26Zo7Uz31G
|
||||||
|
7EGGZFsrVDXfNhSJyz79Gyn+Lx9jOTdoR0sH/THYIIosE83awMGE6jKeuDYTbVWu
|
||||||
|
+ZtHQef+pRteki3wvNLJK+kC1y3BtHqDJS9Lqx0s8SCiVozlC+fZfC9hCtU7bXJK
|
||||||
|
0UJZ4qjSvj6whzfaNgOZAqJpmwgOnd8W/3YJk1DwUeX98FcU38MR23SOkx2EDdDE
|
||||||
|
77Kdu62vTs/tLmOTuyKBvYPaHaYulYjQTxurG+o8vhHtaL87ARvuq+83dj+nO5z3
|
||||||
|
5O9vkcVJYWjOEnJe7ZvCTxeLJehpCmHIbyUuDx5P24MWVbyXOxIlxNxTqlub5GlW
|
||||||
|
rQF6Qsa/0k9TRk7Htbct6fAA0/VahJS0g096MrTH8AxBXDNE8lIoNeGikVlaxK9Z
|
||||||
|
S+aannlWYIJymZ4FygIPPaRlzhAoXBuJd8OaR5giC7dS1xquxKOiQEXTGsLeGFaI
|
||||||
|
BZYiIhW7GG4ozvKDqyNm4eg=
|
||||||
|
=yKcB
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -11,11 +11,12 @@ edition = "2018"
|
|||||||
ethkey = { path = "ethkey" }
|
ethkey = { path = "ethkey" }
|
||||||
ethstore = { path = "ethstore" }
|
ethstore = { path = "ethstore" }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
parking_lot = "0.7"
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
|
parking_lot = "0.9"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
tempdir = "0.3"
|
tempdir = "0.3"
|
||||||
|
|||||||
@@ -1,21 +1,13 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Parity Ethereum Keys Generator"
|
description = "Parity Ethereum Keys Generator"
|
||||||
name = "ethkey"
|
name = "ethkey"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
edit-distance = "2.0"
|
edit-distance = "2.0"
|
||||||
parity-crypto = "0.4.0"
|
|
||||||
eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1" }
|
|
||||||
ethereum-types = "0.6.0"
|
|
||||||
lazy_static = "1.0"
|
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
parity-wordlist = "1.3"
|
|
||||||
quick-error = "1.2.2"
|
|
||||||
rand = "0.6"
|
|
||||||
rustc-hex = "1.0"
|
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
tiny-keccak = "1.4"
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
zeroize = "0.9.1"
|
parity-wordlist = "1.3"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Parity Ethereum keys generator.
|
|||||||
|
|
||||||
```
|
```
|
||||||
Parity Ethereum Keys Generator.
|
Parity Ethereum Keys Generator.
|
||||||
Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
ethkey info <secret-or-phrase> [options]
|
ethkey info <secret-or-phrase> [options]
|
||||||
@@ -218,4 +218,4 @@ _This project is a part of the Parity Ethereum toolchain._
|
|||||||
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding.
|
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding.
|
||||||
- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management.
|
- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management.
|
||||||
- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator.
|
- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator.
|
||||||
- [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC.
|
- [whisper](https://github.com/paritytech/whisper) - Implementation of Whisper-v2 PoC.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ docopt = "1.0"
|
|||||||
env_logger = "0.5"
|
env_logger = "0.5"
|
||||||
ethkey = { path = "../" }
|
ethkey = { path = "../" }
|
||||||
panic_hook = { path = "../../../util/panic-hook" }
|
panic_hook = { path = "../../../util/panic-hook" }
|
||||||
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
parity-wordlist="1.2"
|
parity-wordlist="1.2"
|
||||||
rustc-hex = "1.0"
|
rustc-hex = "1.0"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -19,6 +19,7 @@ extern crate env_logger;
|
|||||||
extern crate ethkey;
|
extern crate ethkey;
|
||||||
extern crate panic_hook;
|
extern crate panic_hook;
|
||||||
extern crate parity_wordlist;
|
extern crate parity_wordlist;
|
||||||
|
extern crate parity_crypto;
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
extern crate threadpool;
|
extern crate threadpool;
|
||||||
@@ -30,12 +31,13 @@ use std::num::ParseIntError;
|
|||||||
use std::{env, fmt, process, io, sync};
|
use std::{env, fmt, process, io, sync};
|
||||||
|
|
||||||
use docopt::Docopt;
|
use docopt::Docopt;
|
||||||
use ethkey::{KeyPair, Random, Brain, BrainPrefix, Prefix, Error as EthkeyError, Generator, sign, verify_public, verify_address, brain_recover};
|
use ethkey::{Brain, BrainPrefix, Prefix, brain_recover};
|
||||||
|
use parity_crypto::publickey::{KeyPair, Random, Error as EthkeyError, Generator, sign, verify_public, verify_address};
|
||||||
use rustc_hex::{FromHex, FromHexError};
|
use rustc_hex::{FromHex, FromHexError};
|
||||||
|
|
||||||
const USAGE: &'static str = r#"
|
const USAGE: &'static str = r#"
|
||||||
Parity Ethereum keys generator.
|
Parity Ethereum keys generator.
|
||||||
Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
ethkey info <secret-or-phrase> [options]
|
ethkey info <secret-or-phrase> [options]
|
||||||
@@ -200,7 +202,7 @@ fn execute<S, I>(command: I) -> Result<String, Error> where I: IntoIterator<Item
|
|||||||
let keypair = Brain::new(phrase).generate().expect("Brain wallet generator is infallible; qed");
|
let keypair = Brain::new(phrase).generate().expect("Brain wallet generator is infallible; qed");
|
||||||
(keypair, Some(phrase_info))
|
(keypair, Some(phrase_info))
|
||||||
} else {
|
} else {
|
||||||
let secret = args.arg_secret_or_phrase.parse().map_err(|_| EthkeyError::InvalidSecret)?;
|
let secret = args.arg_secret_or_phrase.parse().map_err(|_| EthkeyError::InvalidSecretKey)?;
|
||||||
(KeyPair::from_secret(secret)?, None)
|
(KeyPair::from_secret(secret)?, None)
|
||||||
};
|
};
|
||||||
Ok(display(result, display_mode))
|
Ok(display(result, display_mode))
|
||||||
@@ -241,7 +243,7 @@ fn execute<S, I>(command: I) -> Result<String, Error> where I: IntoIterator<Item
|
|||||||
};
|
};
|
||||||
Ok(display(result, display_mode))
|
Ok(display(result, display_mode))
|
||||||
} else if args.cmd_sign {
|
} else if args.cmd_sign {
|
||||||
let secret = args.arg_secret.parse().map_err(|_| EthkeyError::InvalidSecret)?;
|
let secret = args.arg_secret.parse().map_err(|_| EthkeyError::InvalidSecretKey)?;
|
||||||
let message = args.arg_message.parse().map_err(|_| EthkeyError::InvalidMessage)?;
|
let message = args.arg_message.parse().map_err(|_| EthkeyError::InvalidMessage)?;
|
||||||
let signature = sign(&secret, &message)?;
|
let signature = sign(&secret, &message)?;
|
||||||
Ok(format!("{}", signature))
|
Ok(format!("{}", signature))
|
||||||
@@ -249,7 +251,7 @@ fn execute<S, I>(command: I) -> Result<String, Error> where I: IntoIterator<Item
|
|||||||
let signature = args.arg_signature.parse().map_err(|_| EthkeyError::InvalidSignature)?;
|
let signature = args.arg_signature.parse().map_err(|_| EthkeyError::InvalidSignature)?;
|
||||||
let message = args.arg_message.parse().map_err(|_| EthkeyError::InvalidMessage)?;
|
let message = args.arg_message.parse().map_err(|_| EthkeyError::InvalidMessage)?;
|
||||||
let ok = if args.cmd_public {
|
let ok = if args.cmd_public {
|
||||||
let public = args.arg_public.parse().map_err(|_| EthkeyError::InvalidPublic)?;
|
let public = args.arg_public.parse().map_err(|_| EthkeyError::InvalidPublicKey)?;
|
||||||
verify_public(&public, &signature, &message)?
|
verify_public(&public, &signature, &message)?
|
||||||
} else if args.cmd_address {
|
} else if args.cmd_address {
|
||||||
let address = args.arg_address.parse().map_err(|_| EthkeyError::InvalidAddress)?;
|
let address = args.arg_address.parse().map_err(|_| EthkeyError::InvalidAddress)?;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,8 +14,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use keccak::Keccak256;
|
use std::convert::Infallible;
|
||||||
use super::{KeyPair, Generator, Secret};
|
use parity_crypto::publickey::{KeyPair, Generator, Secret};
|
||||||
|
use parity_crypto::Keccak256;
|
||||||
use parity_wordlist;
|
use parity_wordlist;
|
||||||
|
|
||||||
/// Simple brainwallet.
|
/// Simple brainwallet.
|
||||||
@@ -32,7 +33,7 @@ impl Brain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Generator for Brain {
|
impl Generator for Brain {
|
||||||
type Error = ::Void;
|
type Error = Infallible;
|
||||||
|
|
||||||
fn generate(&mut self) -> Result<KeyPair, Self::Error> {
|
fn generate(&mut self) -> Result<KeyPair, Self::Error> {
|
||||||
let seed = self.0.clone();
|
let seed = self.0.clone();
|
||||||
@@ -45,7 +46,7 @@ impl Generator for Brain {
|
|||||||
match i > 16384 {
|
match i > 16384 {
|
||||||
false => i += 1,
|
false => i += 1,
|
||||||
true => {
|
true => {
|
||||||
if let Ok(pair) = Secret::from_unsafe_slice(&secret)
|
if let Ok(pair) = Secret::import_key(&secret)
|
||||||
.and_then(KeyPair::from_secret)
|
.and_then(KeyPair::from_secret)
|
||||||
{
|
{
|
||||||
if pair.address()[0] == 0 {
|
if pair.address()[0] == 0 {
|
||||||
@@ -61,7 +62,8 @@ impl Generator for Brain {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use {Brain, Generator};
|
use Brain;
|
||||||
|
use parity_crypto::publickey::Generator;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_brain() {
|
fn test_brain() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use super::{Generator, KeyPair, Error, Brain};
|
use super::Brain;
|
||||||
|
use parity_crypto::publickey::{Generator, KeyPair, Error};
|
||||||
use parity_wordlist as wordlist;
|
use parity_wordlist as wordlist;
|
||||||
|
|
||||||
/// Tries to find brain-seed keypair with address starting with given prefix.
|
/// Tries to find brain-seed keypair with address starting with given prefix.
|
||||||
@@ -59,7 +60,8 @@ impl Generator for BrainPrefix {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use {Generator, BrainPrefix};
|
use BrainPrefix;
|
||||||
|
use parity_crypto::publickey::Generator;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn prefix_generator() {
|
fn prefix_generator() {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -19,7 +19,8 @@ use std::collections::HashSet;
|
|||||||
use edit_distance::edit_distance;
|
use edit_distance::edit_distance;
|
||||||
use parity_wordlist;
|
use parity_wordlist;
|
||||||
|
|
||||||
use super::{Address, Brain, Generator};
|
use super::Brain;
|
||||||
|
use parity_crypto::publickey::{Address, Generator};
|
||||||
|
|
||||||
/// Tries to find a phrase for address, given the number
|
/// Tries to find a phrase for address, given the number
|
||||||
/// of expected words and a partial phrase.
|
/// of expected words and a partial phrase.
|
||||||
|
|||||||
@@ -1,189 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use secp256k1;
|
|
||||||
use std::io;
|
|
||||||
use parity_crypto::error::SymmError;
|
|
||||||
|
|
||||||
quick_error! {
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Error {
|
|
||||||
Secp(e: secp256k1::Error) {
|
|
||||||
display("secp256k1 error: {}", e)
|
|
||||||
cause(e)
|
|
||||||
from()
|
|
||||||
}
|
|
||||||
Io(e: io::Error) {
|
|
||||||
display("i/o error: {}", e)
|
|
||||||
cause(e)
|
|
||||||
from()
|
|
||||||
}
|
|
||||||
InvalidMessage {
|
|
||||||
display("invalid message")
|
|
||||||
}
|
|
||||||
Symm(e: SymmError) {
|
|
||||||
cause(e)
|
|
||||||
from()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ECDH functions
|
|
||||||
pub mod ecdh {
|
|
||||||
use secp256k1::{self, ecdh, key};
|
|
||||||
use super::Error;
|
|
||||||
use {Secret, Public, SECP256K1};
|
|
||||||
|
|
||||||
/// Agree on a shared secret
|
|
||||||
pub fn agree(secret: &Secret, public: &Public) -> Result<Secret, Error> {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let pdata = {
|
|
||||||
let mut temp = [4u8; 65];
|
|
||||||
(&mut temp[1..65]).copy_from_slice(&public[0..64]);
|
|
||||||
temp
|
|
||||||
};
|
|
||||||
|
|
||||||
let publ = key::PublicKey::from_slice(context, &pdata)?;
|
|
||||||
let sec = key::SecretKey::from_slice(context, secret.as_bytes())?;
|
|
||||||
let shared = ecdh::SharedSecret::new_raw(context, &publ, &sec);
|
|
||||||
|
|
||||||
Secret::from_unsafe_slice(&shared[0..32])
|
|
||||||
.map_err(|_| Error::Secp(secp256k1::Error::InvalidSecretKey))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ECIES function
|
|
||||||
pub mod ecies {
|
|
||||||
use parity_crypto::{aes, digest, hmac, is_equal};
|
|
||||||
use ethereum_types::H128;
|
|
||||||
use super::{ecdh, Error};
|
|
||||||
use {Random, Generator, Public, Secret};
|
|
||||||
|
|
||||||
/// Encrypt a message with a public key, writing an HMAC covering both
|
|
||||||
/// the plaintext and authenticated data.
|
|
||||||
///
|
|
||||||
/// Authenticated data may be empty.
|
|
||||||
pub fn encrypt(public: &Public, auth_data: &[u8], plain: &[u8]) -> Result<Vec<u8>, Error> {
|
|
||||||
let r = Random.generate()?;
|
|
||||||
let z = ecdh::agree(r.secret(), public)?;
|
|
||||||
let mut key = [0u8; 32];
|
|
||||||
kdf(&z, &[0u8; 0], &mut key);
|
|
||||||
|
|
||||||
let ekey = &key[0..16];
|
|
||||||
let mkey = hmac::SigKey::sha256(&digest::sha256(&key[16..32]));
|
|
||||||
|
|
||||||
let mut msg = vec![0u8; 1 + 64 + 16 + plain.len() + 32];
|
|
||||||
msg[0] = 0x04u8;
|
|
||||||
{
|
|
||||||
let msgd = &mut msg[1..];
|
|
||||||
msgd[0..64].copy_from_slice(r.public().as_bytes());
|
|
||||||
let iv = H128::random();
|
|
||||||
msgd[64..80].copy_from_slice(iv.as_bytes());
|
|
||||||
{
|
|
||||||
let cipher = &mut msgd[(64 + 16)..(64 + 16 + plain.len())];
|
|
||||||
aes::encrypt_128_ctr(ekey, iv.as_bytes(), plain, cipher)?;
|
|
||||||
}
|
|
||||||
let mut hmac = hmac::Signer::with(&mkey);
|
|
||||||
{
|
|
||||||
let cipher_iv = &msgd[64..(64 + 16 + plain.len())];
|
|
||||||
hmac.update(cipher_iv);
|
|
||||||
}
|
|
||||||
hmac.update(auth_data);
|
|
||||||
let sig = hmac.sign();
|
|
||||||
msgd[(64 + 16 + plain.len())..].copy_from_slice(&sig);
|
|
||||||
}
|
|
||||||
Ok(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Decrypt a message with a secret key, checking HMAC for ciphertext
|
|
||||||
/// and authenticated data validity.
|
|
||||||
pub fn decrypt(secret: &Secret, auth_data: &[u8], encrypted: &[u8]) -> Result<Vec<u8>, Error> {
|
|
||||||
let meta_len = 1 + 64 + 16 + 32;
|
|
||||||
if encrypted.len() < meta_len || encrypted[0] < 2 || encrypted[0] > 4 {
|
|
||||||
return Err(Error::InvalidMessage); //invalid message: publickey
|
|
||||||
}
|
|
||||||
|
|
||||||
let e = &encrypted[1..];
|
|
||||||
let p = Public::from_slice(&e[0..64]);
|
|
||||||
let z = ecdh::agree(secret, &p)?;
|
|
||||||
let mut key = [0u8; 32];
|
|
||||||
kdf(&z, &[0u8; 0], &mut key);
|
|
||||||
|
|
||||||
let ekey = &key[0..16];
|
|
||||||
let mkey = hmac::SigKey::sha256(&digest::sha256(&key[16..32]));
|
|
||||||
|
|
||||||
let clen = encrypted.len() - meta_len;
|
|
||||||
let cipher_with_iv = &e[64..(64+16+clen)];
|
|
||||||
let cipher_iv = &cipher_with_iv[0..16];
|
|
||||||
let cipher_no_iv = &cipher_with_iv[16..];
|
|
||||||
let msg_mac = &e[(64+16+clen)..];
|
|
||||||
|
|
||||||
// Verify tag
|
|
||||||
let mut hmac = hmac::Signer::with(&mkey);
|
|
||||||
hmac.update(cipher_with_iv);
|
|
||||||
hmac.update(auth_data);
|
|
||||||
let mac = hmac.sign();
|
|
||||||
|
|
||||||
if !is_equal(&mac.as_ref()[..], msg_mac) {
|
|
||||||
return Err(Error::InvalidMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut msg = vec![0u8; clen];
|
|
||||||
aes::decrypt_128_ctr(ekey, cipher_iv, cipher_no_iv, &mut msg[..])?;
|
|
||||||
Ok(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn kdf(secret: &Secret, s1: &[u8], dest: &mut [u8]) {
|
|
||||||
// SEC/ISO/Shoup specify counter size SHOULD be equivalent
|
|
||||||
// to size of hash output, however, it also notes that
|
|
||||||
// the 4 bytes is okay. NIST specifies 4 bytes.
|
|
||||||
let mut ctr = 1u32;
|
|
||||||
let mut written = 0usize;
|
|
||||||
while written < dest.len() {
|
|
||||||
let mut hasher = digest::Hasher::sha256();
|
|
||||||
let ctrs = [(ctr >> 24) as u8, (ctr >> 16) as u8, (ctr >> 8) as u8, ctr as u8];
|
|
||||||
hasher.update(&ctrs);
|
|
||||||
hasher.update(secret.as_bytes());
|
|
||||||
hasher.update(s1);
|
|
||||||
let d = hasher.finish();
|
|
||||||
&mut dest[written..(written + 32)].copy_from_slice(&d);
|
|
||||||
written += 32;
|
|
||||||
ctr += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::ecies;
|
|
||||||
use {Random, Generator};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ecies_shared() {
|
|
||||||
let kp = Random.generate().unwrap();
|
|
||||||
let message = b"So many books, so little time";
|
|
||||||
|
|
||||||
let shared = b"shared";
|
|
||||||
let wrong_shared = b"incorrect";
|
|
||||||
let encrypted = ecies::encrypt(kp.public(), shared, message).unwrap();
|
|
||||||
assert!(encrypted[..] != message[..]);
|
|
||||||
assert_eq!(encrypted[0], 0x04);
|
|
||||||
|
|
||||||
assert!(ecies::decrypt(kp.secret(), wrong_shared, &encrypted).is_err());
|
|
||||||
let decrypted = ecies::decrypt(kp.secret(), shared, &encrypted).unwrap();
|
|
||||||
assert_eq!(decrypted[..message.len()], message[..]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use std::{fmt, error};
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
/// Crypto error
|
|
||||||
pub enum Error {
|
|
||||||
/// Invalid secret key
|
|
||||||
InvalidSecret,
|
|
||||||
/// Invalid public key
|
|
||||||
InvalidPublic,
|
|
||||||
/// Invalid address
|
|
||||||
InvalidAddress,
|
|
||||||
/// Invalid EC signature
|
|
||||||
InvalidSignature,
|
|
||||||
/// Invalid AES message
|
|
||||||
InvalidMessage,
|
|
||||||
/// IO Error
|
|
||||||
Io(::std::io::Error),
|
|
||||||
/// Custom
|
|
||||||
Custom(String),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Error {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
let msg = match *self {
|
|
||||||
Error::InvalidSecret => "Invalid secret".into(),
|
|
||||||
Error::InvalidPublic => "Invalid public".into(),
|
|
||||||
Error::InvalidAddress => "Invalid address".into(),
|
|
||||||
Error::InvalidSignature => "Invalid EC signature".into(),
|
|
||||||
Error::InvalidMessage => "Invalid AES message".into(),
|
|
||||||
Error::Io(ref err) => format!("I/O error: {}", err),
|
|
||||||
Error::Custom(ref s) => s.clone(),
|
|
||||||
};
|
|
||||||
|
|
||||||
f.write_fmt(format_args!("Crypto error ({})", msg))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl error::Error for Error {
|
|
||||||
fn description(&self) -> &str {
|
|
||||||
"Crypto error"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Into<String> for Error {
|
|
||||||
fn into(self) -> String {
|
|
||||||
format!("{}", self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<::secp256k1::Error> for Error {
|
|
||||||
fn from(e: ::secp256k1::Error) -> Error {
|
|
||||||
match e {
|
|
||||||
::secp256k1::Error::InvalidMessage => Error::InvalidMessage,
|
|
||||||
::secp256k1::Error::InvalidPublicKey => Error::InvalidPublic,
|
|
||||||
::secp256k1::Error::InvalidSecretKey => Error::InvalidSecret,
|
|
||||||
_ => Error::InvalidSignature,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<::std::io::Error> for Error {
|
|
||||||
fn from(err: ::std::io::Error) -> Error {
|
|
||||||
Error::Io(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,517 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//! Extended keys
|
|
||||||
|
|
||||||
use secret::Secret;
|
|
||||||
use Public;
|
|
||||||
use ethereum_types::H256;
|
|
||||||
pub use self::derivation::Error as DerivationError;
|
|
||||||
|
|
||||||
/// Represents label that can be stored as a part of key derivation
|
|
||||||
pub trait Label {
|
|
||||||
/// Length of the data that label occupies
|
|
||||||
fn len() -> usize;
|
|
||||||
|
|
||||||
/// Store label data to the key derivation sequence
|
|
||||||
/// Must not use more than `len()` bytes from slice
|
|
||||||
fn store(&self, target: &mut [u8]);
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Label for u32 {
|
|
||||||
fn len() -> usize { 4 }
|
|
||||||
|
|
||||||
fn store(&self, target: &mut [u8]) {
|
|
||||||
let bytes = self.to_be_bytes();
|
|
||||||
target[0..4].copy_from_slice(&bytes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Key derivation over generic label `T`
|
|
||||||
pub enum Derivation<T: Label> {
|
|
||||||
/// Soft key derivation (allow proof of parent)
|
|
||||||
Soft(T),
|
|
||||||
/// Hard key derivation (does not allow proof of parent)
|
|
||||||
Hard(T),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<u32> for Derivation<u32> {
|
|
||||||
fn from(index: u32) -> Self {
|
|
||||||
if index < (2 << 30) {
|
|
||||||
Derivation::Soft(index)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Derivation::Hard(index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Label for H256 {
|
|
||||||
fn len() -> usize { 32 }
|
|
||||||
|
|
||||||
fn store(&self, target: &mut [u8]) {
|
|
||||||
(&mut target[0..32]).copy_from_slice(self.as_bytes());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Extended secret key, allows deterministic derivation of subsequent keys.
|
|
||||||
pub struct ExtendedSecret {
|
|
||||||
secret: Secret,
|
|
||||||
chain_code: H256,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ExtendedSecret {
|
|
||||||
/// New extended key from given secret and chain code.
|
|
||||||
pub fn with_code(secret: Secret, chain_code: H256) -> ExtendedSecret {
|
|
||||||
ExtendedSecret {
|
|
||||||
secret: secret,
|
|
||||||
chain_code: chain_code,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New extended key from given secret with the random chain code.
|
|
||||||
pub fn new_random(secret: Secret) -> ExtendedSecret {
|
|
||||||
ExtendedSecret::with_code(secret, H256::random())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// New extended key from given secret.
|
|
||||||
/// Chain code will be derived from the secret itself (in a deterministic way).
|
|
||||||
pub fn new(secret: Secret) -> ExtendedSecret {
|
|
||||||
let chain_code = derivation::chain_code(*secret);
|
|
||||||
ExtendedSecret::with_code(secret, chain_code)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Derive new private key
|
|
||||||
pub fn derive<T>(&self, index: Derivation<T>) -> ExtendedSecret where T: Label {
|
|
||||||
let (derived_key, next_chain_code) = derivation::private(*self.secret, self.chain_code, index);
|
|
||||||
|
|
||||||
let derived_secret = Secret::from(derived_key.0);
|
|
||||||
|
|
||||||
ExtendedSecret::with_code(derived_secret, next_chain_code)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Private key component of the extended key.
|
|
||||||
pub fn as_raw(&self) -> &Secret {
|
|
||||||
&self.secret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Extended public key, allows deterministic derivation of subsequent keys.
|
|
||||||
pub struct ExtendedPublic {
|
|
||||||
public: Public,
|
|
||||||
chain_code: H256,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ExtendedPublic {
|
|
||||||
/// New extended public key from known parent and chain code
|
|
||||||
pub fn new(public: Public, chain_code: H256) -> Self {
|
|
||||||
ExtendedPublic { public: public, chain_code: chain_code }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create new extended public key from known secret
|
|
||||||
pub fn from_secret(secret: &ExtendedSecret) -> Result<Self, DerivationError> {
|
|
||||||
Ok(
|
|
||||||
ExtendedPublic::new(
|
|
||||||
derivation::point(**secret.as_raw())?,
|
|
||||||
secret.chain_code.clone(),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Derive new public key
|
|
||||||
/// Operation is defined only for index belongs [0..2^31)
|
|
||||||
pub fn derive<T>(&self, index: Derivation<T>) -> Result<Self, DerivationError> where T: Label {
|
|
||||||
let (derived_key, next_chain_code) = derivation::public(self.public, self.chain_code, index)?;
|
|
||||||
Ok(ExtendedPublic::new(derived_key, next_chain_code))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn public(&self) -> &Public {
|
|
||||||
&self.public
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ExtendedKeyPair {
|
|
||||||
secret: ExtendedSecret,
|
|
||||||
public: ExtendedPublic,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ExtendedKeyPair {
|
|
||||||
pub fn new(secret: Secret) -> Self {
|
|
||||||
let extended_secret = ExtendedSecret::new(secret);
|
|
||||||
let extended_public = ExtendedPublic::from_secret(&extended_secret)
|
|
||||||
.expect("Valid `Secret` always produces valid public; qed");
|
|
||||||
ExtendedKeyPair {
|
|
||||||
secret: extended_secret,
|
|
||||||
public: extended_public,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn with_code(secret: Secret, public: Public, chain_code: H256) -> Self {
|
|
||||||
ExtendedKeyPair {
|
|
||||||
secret: ExtendedSecret::with_code(secret, chain_code.clone()),
|
|
||||||
public: ExtendedPublic::new(public, chain_code),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn with_secret(secret: Secret, chain_code: H256) -> Self {
|
|
||||||
let extended_secret = ExtendedSecret::with_code(secret, chain_code);
|
|
||||||
let extended_public = ExtendedPublic::from_secret(&extended_secret)
|
|
||||||
.expect("Valid `Secret` always produces valid public; qed");
|
|
||||||
ExtendedKeyPair {
|
|
||||||
secret: extended_secret,
|
|
||||||
public: extended_public,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn with_seed(seed: &[u8]) -> Result<ExtendedKeyPair, DerivationError> {
|
|
||||||
let (master_key, chain_code) = derivation::seed_pair(seed);
|
|
||||||
Ok(ExtendedKeyPair::with_secret(
|
|
||||||
Secret::from_unsafe_slice(master_key.as_bytes()).map_err(|_| DerivationError::InvalidSeed)?,
|
|
||||||
chain_code,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn secret(&self) -> &ExtendedSecret {
|
|
||||||
&self.secret
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn public(&self) -> &ExtendedPublic {
|
|
||||||
&self.public
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn derive<T>(&self, index: Derivation<T>) -> Result<Self, DerivationError> where T: Label {
|
|
||||||
let derived = self.secret.derive(index);
|
|
||||||
|
|
||||||
Ok(ExtendedKeyPair {
|
|
||||||
public: ExtendedPublic::from_secret(&derived)?,
|
|
||||||
secret: derived,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Derivation functions for private and public keys
|
|
||||||
// Work is based on BIP0032
|
|
||||||
// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
|
|
||||||
mod derivation {
|
|
||||||
use parity_crypto::hmac;
|
|
||||||
use ethereum_types::{BigEndianHash, U256, U512, H512, H256};
|
|
||||||
use secp256k1::key::{SecretKey, PublicKey};
|
|
||||||
use SECP256K1;
|
|
||||||
use keccak;
|
|
||||||
use math::curve_order;
|
|
||||||
use super::{Label, Derivation};
|
|
||||||
use std::convert::TryInto;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Error {
|
|
||||||
InvalidHardenedUse,
|
|
||||||
InvalidPoint,
|
|
||||||
MissingIndex,
|
|
||||||
InvalidSeed,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deterministic derivation of the key using secp256k1 elliptic curve.
|
|
||||||
// Derivation can be either hardened or not.
|
|
||||||
// For hardened derivation, pass u32 index at least 2^31 or custom Derivation::Hard(T) enum
|
|
||||||
//
|
|
||||||
// Can panic if passed `private_key` is not a valid secp256k1 private key
|
|
||||||
// (outside of (0..curve_order()]) field
|
|
||||||
pub fn private<T>(private_key: H256, chain_code: H256, index: Derivation<T>) -> (H256, H256) where T: Label {
|
|
||||||
match index {
|
|
||||||
Derivation::Soft(index) => private_soft(private_key, chain_code, index),
|
|
||||||
Derivation::Hard(index) => private_hard(private_key, chain_code, index),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn hmac_pair(data: &[u8], private_key: H256, chain_code: H256) -> (H256, H256) {
|
|
||||||
let private: U256 = private_key.into_uint();
|
|
||||||
|
|
||||||
// produces 512-bit derived hmac (I)
|
|
||||||
let skey = hmac::SigKey::sha512(chain_code.as_bytes());
|
|
||||||
let i_512 = hmac::sign(&skey, &data[..]);
|
|
||||||
|
|
||||||
// left most 256 bits are later added to original private key
|
|
||||||
let hmac_key: U256 = H256::from_slice(&i_512[0..32]).into_uint();
|
|
||||||
// right most 256 bits are new chain code for later derivations
|
|
||||||
let next_chain_code = H256::from_slice(&i_512[32..64]);
|
|
||||||
|
|
||||||
let child_key = BigEndianHash::from_uint(&private_add(hmac_key, private));
|
|
||||||
(child_key, next_chain_code)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can panic if passed `private_key` is not a valid secp256k1 private key
|
|
||||||
// (outside of (0..curve_order()]) field
|
|
||||||
fn private_soft<T>(private_key: H256, chain_code: H256, index: T) -> (H256, H256) where T: Label {
|
|
||||||
let mut data = vec![0u8; 33 + T::len()];
|
|
||||||
|
|
||||||
let sec_private = SecretKey::from_slice(&SECP256K1, private_key.as_bytes())
|
|
||||||
.expect("Caller should provide valid private key");
|
|
||||||
let sec_public = PublicKey::from_secret_key(&SECP256K1, &sec_private)
|
|
||||||
.expect("Caller should provide valid private key");
|
|
||||||
let public_serialized = sec_public.serialize_vec(&SECP256K1, true);
|
|
||||||
|
|
||||||
// curve point (compressed public key) -- index
|
|
||||||
// 0.33 -- 33..end
|
|
||||||
data[0..33].copy_from_slice(&public_serialized);
|
|
||||||
index.store(&mut data[33..]);
|
|
||||||
|
|
||||||
hmac_pair(&data, private_key, chain_code)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deterministic derivation of the key using secp256k1 elliptic curve
|
|
||||||
// This is hardened derivation and does not allow to associate
|
|
||||||
// corresponding public keys of the original and derived private keys
|
|
||||||
fn private_hard<T>(private_key: H256, chain_code: H256, index: T) -> (H256, H256) where T: Label {
|
|
||||||
let mut data: Vec<u8> = vec![0u8; 33 + T::len()];
|
|
||||||
let private: U256 = private_key.into_uint();
|
|
||||||
|
|
||||||
// 0x00 (padding) -- private_key -- index
|
|
||||||
// 0 -- 1..33 -- 33..end
|
|
||||||
private.to_big_endian(&mut data[1..33]);
|
|
||||||
index.store(&mut data[33..(33 + T::len())]);
|
|
||||||
|
|
||||||
hmac_pair(&data, private_key, chain_code)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_add(k1: U256, k2: U256) -> U256 {
|
|
||||||
let sum = U512::from(k1) + U512::from(k2);
|
|
||||||
modulo(sum, curve_order())
|
|
||||||
}
|
|
||||||
|
|
||||||
// todo: surely can be optimized
|
|
||||||
fn modulo(u1: U512, u2: U256) -> U256 {
|
|
||||||
let m = u1 % U512::from(u2);
|
|
||||||
m.try_into().expect("U512 modulo U256 should fit into U256; qed")
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn public<T>(public_key: H512, chain_code: H256, derivation: Derivation<T>) -> Result<(H512, H256), Error> where T: Label {
|
|
||||||
let index = match derivation {
|
|
||||||
Derivation::Soft(index) => index,
|
|
||||||
Derivation::Hard(_) => { return Err(Error::InvalidHardenedUse); }
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut public_sec_raw = [0u8; 65];
|
|
||||||
public_sec_raw[0] = 4;
|
|
||||||
public_sec_raw[1..65].copy_from_slice(public_key.as_bytes());
|
|
||||||
let public_sec = PublicKey::from_slice(&SECP256K1, &public_sec_raw).map_err(|_| Error::InvalidPoint)?;
|
|
||||||
let public_serialized = public_sec.serialize_vec(&SECP256K1, true);
|
|
||||||
|
|
||||||
let mut data = vec![0u8; 33 + T::len()];
|
|
||||||
// curve point (compressed public key) -- index
|
|
||||||
// 0.33 -- 33..end
|
|
||||||
data[0..33].copy_from_slice(&public_serialized);
|
|
||||||
index.store(&mut data[33..(33 + T::len())]);
|
|
||||||
|
|
||||||
// HMAC512SHA produces [derived private(256); new chain code(256)]
|
|
||||||
let skey = hmac::SigKey::sha512(chain_code.as_bytes());
|
|
||||||
let i_512 = hmac::sign(&skey, &data[..]);
|
|
||||||
|
|
||||||
let new_private = H256::from_slice(&i_512[0..32]);
|
|
||||||
let new_chain_code = H256::from_slice(&i_512[32..64]);
|
|
||||||
|
|
||||||
// Generated private key can (extremely rarely) be out of secp256k1 key field
|
|
||||||
if curve_order() <= new_private.into_uint() { return Err(Error::MissingIndex); }
|
|
||||||
let new_private_sec = SecretKey::from_slice(&SECP256K1, new_private.as_bytes())
|
|
||||||
.expect("Private key belongs to the field [0..CURVE_ORDER) (checked above); So initializing can never fail; qed");
|
|
||||||
let mut new_public = PublicKey::from_secret_key(&SECP256K1, &new_private_sec)
|
|
||||||
.expect("Valid private key produces valid public key");
|
|
||||||
|
|
||||||
// Adding two points on the elliptic curves (combining two public keys)
|
|
||||||
new_public.add_assign(&SECP256K1, &public_sec)
|
|
||||||
.expect("Addition of two valid points produce valid point");
|
|
||||||
|
|
||||||
let serialized = new_public.serialize_vec(&SECP256K1, false);
|
|
||||||
|
|
||||||
Ok((
|
|
||||||
H512::from_slice(&serialized[1..65]),
|
|
||||||
new_chain_code,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn sha3(slc: &[u8]) -> H256 {
|
|
||||||
keccak::Keccak256::keccak256(slc).into()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn chain_code(secret: H256) -> H256 {
|
|
||||||
// 10,000 rounds of sha3
|
|
||||||
let mut running_sha3 = sha3(secret.as_bytes());
|
|
||||||
for _ in 0..99999 { running_sha3 = sha3(running_sha3.as_bytes()); }
|
|
||||||
running_sha3
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn point(secret: H256) -> Result<H512, Error> {
|
|
||||||
let sec = SecretKey::from_slice(&SECP256K1, secret.as_bytes())
|
|
||||||
.map_err(|_| Error::InvalidPoint)?;
|
|
||||||
let public_sec = PublicKey::from_secret_key(&SECP256K1, &sec)
|
|
||||||
.map_err(|_| Error::InvalidPoint)?;
|
|
||||||
let serialized = public_sec.serialize_vec(&SECP256K1, false);
|
|
||||||
Ok(H512::from_slice(&serialized[1..65]))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn seed_pair(seed: &[u8]) -> (H256, H256) {
|
|
||||||
let skey = hmac::SigKey::sha512(b"Bitcoin seed");
|
|
||||||
let i_512 = hmac::sign(&skey, seed);
|
|
||||||
|
|
||||||
let master_key = H256::from_slice(&i_512[0..32]);
|
|
||||||
let chain_code = H256::from_slice(&i_512[32..64]);
|
|
||||||
|
|
||||||
(master_key, chain_code)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::{ExtendedSecret, ExtendedPublic, ExtendedKeyPair};
|
|
||||||
use secret::Secret;
|
|
||||||
use std::str::FromStr;
|
|
||||||
use ethereum_types::{H128, H256, H512};
|
|
||||||
use super::{derivation, Derivation};
|
|
||||||
|
|
||||||
fn master_chain_basic() -> (H256, H256) {
|
|
||||||
let seed = H128::from_str("000102030405060708090a0b0c0d0e0f")
|
|
||||||
.expect("Seed should be valid H128")
|
|
||||||
.as_bytes()
|
|
||||||
.to_vec();
|
|
||||||
|
|
||||||
derivation::seed_pair(&*seed)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn test_extended<F>(f: F, test_private: H256) where F: Fn(ExtendedSecret) -> ExtendedSecret {
|
|
||||||
let (private_seed, chain_code) = master_chain_basic();
|
|
||||||
let extended_secret = ExtendedSecret::with_code(Secret::from(private_seed.0), chain_code);
|
|
||||||
let derived = f(extended_secret);
|
|
||||||
assert_eq!(**derived.as_raw(), test_private);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn smoky() {
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let extended_secret = ExtendedSecret::with_code(secret.clone(), H256::zero());
|
|
||||||
|
|
||||||
// hardened
|
|
||||||
assert_eq!(&**extended_secret.as_raw(), &*secret);
|
|
||||||
assert_eq!(
|
|
||||||
**extended_secret.derive(2147483648.into()).as_raw(),
|
|
||||||
H256::from_str("0927453daed47839608e414a3738dfad10aed17c459bbd9ab53f89b026c834b6").unwrap(),
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
**extended_secret.derive(2147483649.into()).as_raw(),
|
|
||||||
H256::from_str("44238b6a29c6dcbe9b401364141ba11e2198c289a5fed243a1c11af35c19dc0f").unwrap(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// normal
|
|
||||||
assert_eq!(**extended_secret.derive(0.into()).as_raw(), H256::from_str("bf6a74e3f7b36fc4c96a1e12f31abc817f9f5904f5a8fc27713163d1f0b713f6").unwrap());
|
|
||||||
assert_eq!(**extended_secret.derive(1.into()).as_raw(), H256::from_str("bd4fca9eb1f9c201e9448c1eecd66e302d68d4d313ce895b8c134f512205c1bc").unwrap());
|
|
||||||
assert_eq!(**extended_secret.derive(2.into()).as_raw(), H256::from_str("86932b542d6cab4d9c65490c7ef502d89ecc0e2a5f4852157649e3251e2a3268").unwrap());
|
|
||||||
|
|
||||||
let extended_public = ExtendedPublic::from_secret(&extended_secret).expect("Extended public should be created");
|
|
||||||
let derived_public = extended_public.derive(0.into()).expect("First derivation of public should succeed");
|
|
||||||
assert_eq!(
|
|
||||||
*derived_public.public(),
|
|
||||||
H512::from_str("f7b3244c96688f92372bfd4def26dc4151529747bab9f188a4ad34e141d47bd66522ff048bc6f19a0a4429b04318b1a8796c000265b4fa200dae5f6dda92dd94").unwrap(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let keypair = ExtendedKeyPair::with_secret(
|
|
||||||
Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap(),
|
|
||||||
H256::from_low_u64_be(64),
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
**keypair.derive(2147483648u32.into()).expect("Derivation of keypair should succeed").secret().as_raw(),
|
|
||||||
H256::from_str("edef54414c03196557cf73774bc97a645c9a1df2164ed34f0c2a78d1375a930c").unwrap(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn h256_soft_match() {
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let derivation_secret = H256::from_str("51eaf04f9dbbc1417dc97e789edd0c37ecda88bac490434e367ea81b71b7b015").unwrap();
|
|
||||||
|
|
||||||
let extended_secret = ExtendedSecret::with_code(secret.clone(), H256::zero());
|
|
||||||
let extended_public = ExtendedPublic::from_secret(&extended_secret).expect("Extended public should be created");
|
|
||||||
|
|
||||||
let derived_secret0 = extended_secret.derive(Derivation::Soft(derivation_secret));
|
|
||||||
let derived_public0 = extended_public.derive(Derivation::Soft(derivation_secret)).expect("First derivation of public should succeed");
|
|
||||||
|
|
||||||
let public_from_secret0 = ExtendedPublic::from_secret(&derived_secret0).expect("Extended public should be created");
|
|
||||||
|
|
||||||
assert_eq!(public_from_secret0.public(), derived_public0.public());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn h256_hard() {
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let derivation_secret = H256::from_str("51eaf04f9dbbc1417dc97e789edd0c37ecda88bac490434e367ea81b71b7b015").unwrap();
|
|
||||||
let extended_secret = ExtendedSecret::with_code(secret.clone(), H256::from_low_u64_be(1));
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
**extended_secret.derive(Derivation::Hard(derivation_secret)).as_raw(),
|
|
||||||
H256::from_str("2bc2d696fb744d77ff813b4a1ef0ad64e1e5188b622c54ba917acc5ebc7c5486").unwrap(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn match_() {
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let extended_secret = ExtendedSecret::with_code(secret.clone(), H256::from_low_u64_be(1));
|
|
||||||
let extended_public = ExtendedPublic::from_secret(&extended_secret).expect("Extended public should be created");
|
|
||||||
|
|
||||||
let derived_secret0 = extended_secret.derive(0.into());
|
|
||||||
let derived_public0 = extended_public.derive(0.into()).expect("First derivation of public should succeed");
|
|
||||||
|
|
||||||
let public_from_secret0 = ExtendedPublic::from_secret(&derived_secret0).expect("Extended public should be created");
|
|
||||||
|
|
||||||
assert_eq!(public_from_secret0.public(), derived_public0.public());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_seeds() {
|
|
||||||
let seed = H128::from_str("000102030405060708090a0b0c0d0e0f")
|
|
||||||
.expect("Seed should be valid H128")
|
|
||||||
.as_bytes()
|
|
||||||
.to_vec();
|
|
||||||
|
|
||||||
// private key from bitcoin test vector
|
|
||||||
// xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs
|
|
||||||
let test_private = H256::from_str("e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35")
|
|
||||||
.expect("Private should be decoded ok");
|
|
||||||
|
|
||||||
let (private_seed, _) = derivation::seed_pair(&*seed);
|
|
||||||
|
|
||||||
assert_eq!(private_seed, test_private);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_vector_1() {
|
|
||||||
// xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7
|
|
||||||
// H(0)
|
|
||||||
test_extended(
|
|
||||||
|secret| secret.derive(2147483648.into()),
|
|
||||||
H256::from_str("edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea")
|
|
||||||
.expect("Private should be decoded ok")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_vector_2() {
|
|
||||||
// xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs
|
|
||||||
// H(0)/1
|
|
||||||
test_extended(
|
|
||||||
|secret| secret.derive(2147483648.into()).derive(1.into()),
|
|
||||||
H256::from_str("3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368")
|
|
||||||
.expect("Private should be decoded ok")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use std::fmt;
|
|
||||||
use secp256k1::key;
|
|
||||||
use super::{Secret, Public, Address, SECP256K1, Error};
|
|
||||||
use parity_crypto::Keccak256 as _;
|
|
||||||
|
|
||||||
pub fn public_to_address(public: &Public) -> Address {
|
|
||||||
let hash = public.keccak256();
|
|
||||||
let mut result = Address::zero();
|
|
||||||
result.as_bytes_mut().copy_from_slice(&hash[12..]);
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
|
||||||
/// secp256k1 key pair
|
|
||||||
pub struct KeyPair {
|
|
||||||
secret: Secret,
|
|
||||||
public: Public,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for KeyPair {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
|
||||||
writeln!(f, "secret: {:x}", self.secret)?;
|
|
||||||
writeln!(f, "public: {:x}", self.public)?;
|
|
||||||
write!(f, "address: {:x}", self.address())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl KeyPair {
|
|
||||||
/// Create a pair from secret key
|
|
||||||
pub fn from_secret(secret: Secret) -> Result<KeyPair, Error> {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let s: key::SecretKey = key::SecretKey::from_slice(context, &secret[..])?;
|
|
||||||
let pub_key = key::PublicKey::from_secret_key(context, &s)?;
|
|
||||||
let serialized = pub_key.serialize_vec(context, false);
|
|
||||||
|
|
||||||
let mut public = Public::default();
|
|
||||||
public.as_bytes_mut().copy_from_slice(&serialized[1..65]);
|
|
||||||
|
|
||||||
let keypair = KeyPair {
|
|
||||||
secret: secret,
|
|
||||||
public: public,
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(keypair)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_secret_slice(slice: &[u8]) -> Result<KeyPair, Error> {
|
|
||||||
Self::from_secret(Secret::from_unsafe_slice(slice)?)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn from_keypair(sec: key::SecretKey, publ: key::PublicKey) -> Self {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let serialized = publ.serialize_vec(context, false);
|
|
||||||
let secret = Secret::from(sec);
|
|
||||||
let mut public = Public::default();
|
|
||||||
public.as_bytes_mut().copy_from_slice(&serialized[1..65]);
|
|
||||||
|
|
||||||
KeyPair {
|
|
||||||
secret: secret,
|
|
||||||
public: public,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn secret(&self) -> &Secret {
|
|
||||||
&self.secret
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn public(&self) -> &Public {
|
|
||||||
&self.public
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn address(&self) -> Address {
|
|
||||||
public_to_address(&self.public)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::str::FromStr;
|
|
||||||
use {KeyPair, Secret};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn from_secret() {
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let _ = KeyPair::from_secret(secret).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn keypair_display() {
|
|
||||||
let expected =
|
|
||||||
"secret: a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65
|
|
||||||
public: 8ce0db0b0359ffc5866ba61903cc2518c3675ef2cf380a7e54bde7ea20e6fa1ab45b7617346cd11b7610001ee6ae5b0155c41cad9527cbcdff44ec67848943a4
|
|
||||||
address: 5b073e9233944b5e729e46d618f0d8edf3d9c34a".to_owned();
|
|
||||||
let secret = Secret::from_str("a100df7a048e50ed308ea696dc600215098141cb391e9527329df289f9383f65").unwrap();
|
|
||||||
let kp = KeyPair::from_secret(secret).unwrap();
|
|
||||||
assert_eq!(format!("{}", kp), expected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -18,19 +18,9 @@
|
|||||||
|
|
||||||
extern crate edit_distance;
|
extern crate edit_distance;
|
||||||
extern crate parity_crypto;
|
extern crate parity_crypto;
|
||||||
extern crate ethereum_types;
|
|
||||||
extern crate parity_wordlist;
|
extern crate parity_wordlist;
|
||||||
#[macro_use]
|
|
||||||
extern crate quick_error;
|
|
||||||
extern crate rand;
|
|
||||||
extern crate rustc_hex;
|
|
||||||
extern crate secp256k1;
|
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
extern crate tiny_keccak;
|
|
||||||
extern crate zeroize;
|
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
extern crate lazy_static;
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
@@ -38,50 +28,13 @@ extern crate serde_derive;
|
|||||||
|
|
||||||
mod brain;
|
mod brain;
|
||||||
mod brain_prefix;
|
mod brain_prefix;
|
||||||
mod error;
|
|
||||||
mod keypair;
|
|
||||||
mod keccak;
|
|
||||||
mod password;
|
mod password;
|
||||||
mod prefix;
|
mod prefix;
|
||||||
mod random;
|
|
||||||
mod signature;
|
|
||||||
mod secret;
|
|
||||||
mod extended;
|
|
||||||
|
|
||||||
pub mod brain_recover;
|
pub mod brain_recover;
|
||||||
pub mod crypto;
|
|
||||||
pub mod math;
|
|
||||||
|
|
||||||
pub use self::parity_wordlist::Error as WordlistError;
|
pub use self::parity_wordlist::Error as WordlistError;
|
||||||
pub use self::brain::Brain;
|
pub use self::brain::Brain;
|
||||||
pub use self::brain_prefix::BrainPrefix;
|
pub use self::brain_prefix::BrainPrefix;
|
||||||
pub use self::error::Error;
|
|
||||||
pub use self::keypair::{KeyPair, public_to_address};
|
|
||||||
pub use self::math::public_is_valid;
|
|
||||||
pub use self::password::Password;
|
pub use self::password::Password;
|
||||||
pub use self::prefix::Prefix;
|
pub use self::prefix::Prefix;
|
||||||
pub use self::random::Random;
|
|
||||||
pub use self::signature::{sign, verify_public, verify_address, recover, Signature};
|
|
||||||
pub use self::secret::Secret;
|
|
||||||
pub use self::extended::{ExtendedPublic, ExtendedSecret, ExtendedKeyPair, DerivationError, Derivation};
|
|
||||||
|
|
||||||
use ethereum_types::H256;
|
|
||||||
|
|
||||||
pub use ethereum_types::{Address, Public};
|
|
||||||
pub type Message = H256;
|
|
||||||
|
|
||||||
lazy_static! {
|
|
||||||
pub static ref SECP256K1: secp256k1::Secp256k1 = secp256k1::Secp256k1::new();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Uninstantiatable error type for infallible generators.
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Void {}
|
|
||||||
|
|
||||||
/// Generates new keypair.
|
|
||||||
pub trait Generator {
|
|
||||||
type Error;
|
|
||||||
|
|
||||||
/// Should be called to generate new keypair.
|
|
||||||
fn generate(&mut self) -> Result<KeyPair, Self::Error>;
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use super::{SECP256K1, Public, Secret, Error};
|
|
||||||
use secp256k1::key;
|
|
||||||
use secp256k1::constants::{GENERATOR_X, GENERATOR_Y, CURVE_ORDER};
|
|
||||||
use ethereum_types::{BigEndianHash as _, U256, H256};
|
|
||||||
|
|
||||||
/// Whether the public key is valid.
|
|
||||||
pub fn public_is_valid(public: &Public) -> bool {
|
|
||||||
to_secp256k1_public(public).ok()
|
|
||||||
.map_or(false, |p| p.is_valid())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace multiply public key by secret key (EC point * scalar)
|
|
||||||
pub fn public_mul_secret(public: &mut Public, secret: &Secret) -> Result<(), Error> {
|
|
||||||
let key_secret = secret.to_secp256k1_secret()?;
|
|
||||||
let mut key_public = to_secp256k1_public(public)?;
|
|
||||||
key_public.mul_assign(&SECP256K1, &key_secret)?;
|
|
||||||
set_public(public, &key_public);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace add one public key to another (EC point + EC point)
|
|
||||||
pub fn public_add(public: &mut Public, other: &Public) -> Result<(), Error> {
|
|
||||||
let mut key_public = to_secp256k1_public(public)?;
|
|
||||||
let other_public = to_secp256k1_public(other)?;
|
|
||||||
key_public.add_assign(&SECP256K1, &other_public)?;
|
|
||||||
set_public(public, &key_public);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace sub one public key from another (EC point - EC point)
|
|
||||||
pub fn public_sub(public: &mut Public, other: &Public) -> Result<(), Error> {
|
|
||||||
let mut key_neg_other = to_secp256k1_public(other)?;
|
|
||||||
key_neg_other.mul_assign(&SECP256K1, &key::MINUS_ONE_KEY)?;
|
|
||||||
|
|
||||||
let mut key_public = to_secp256k1_public(public)?;
|
|
||||||
key_public.add_assign(&SECP256K1, &key_neg_other)?;
|
|
||||||
set_public(public, &key_public);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replace public key with its negation (EC point = - EC point)
|
|
||||||
pub fn public_negate(public: &mut Public) -> Result<(), Error> {
|
|
||||||
let mut key_public = to_secp256k1_public(public)?;
|
|
||||||
key_public.mul_assign(&SECP256K1, &key::MINUS_ONE_KEY)?;
|
|
||||||
set_public(public, &key_public);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return base point of secp256k1
|
|
||||||
pub fn generation_point() -> Public {
|
|
||||||
let mut public_sec_raw = [0u8; 65];
|
|
||||||
public_sec_raw[0] = 4;
|
|
||||||
public_sec_raw[1..33].copy_from_slice(&GENERATOR_X);
|
|
||||||
public_sec_raw[33..65].copy_from_slice(&GENERATOR_Y);
|
|
||||||
|
|
||||||
let public_key = key::PublicKey::from_slice(&SECP256K1, &public_sec_raw)
|
|
||||||
.expect("constructing using predefined constants; qed");
|
|
||||||
let mut public = Public::default();
|
|
||||||
set_public(&mut public, &public_key);
|
|
||||||
public
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return secp256k1 elliptic curve order
|
|
||||||
pub fn curve_order() -> U256 {
|
|
||||||
H256::from_slice(&CURVE_ORDER).into_uint()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn to_secp256k1_public(public: &Public) -> Result<key::PublicKey, Error> {
|
|
||||||
let public_data = {
|
|
||||||
let mut temp = [4u8; 65];
|
|
||||||
(&mut temp[1..65]).copy_from_slice(&public[0..64]);
|
|
||||||
temp
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(key::PublicKey::from_slice(&SECP256K1, &public_data)?)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_public(public: &mut Public, key_public: &key::PublicKey) {
|
|
||||||
let key_public_serialized = key_public.serialize_vec(&SECP256K1, false);
|
|
||||||
public.as_bytes_mut().copy_from_slice(&key_public_serialized[1..65]);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::super::{Random, Generator};
|
|
||||||
use super::{public_add, public_sub};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn public_addition_is_commutative() {
|
|
||||||
let public1 = Random.generate().unwrap().public().clone();
|
|
||||||
let public2 = Random.generate().unwrap().public().clone();
|
|
||||||
|
|
||||||
let mut left = public1.clone();
|
|
||||||
public_add(&mut left, &public2).unwrap();
|
|
||||||
|
|
||||||
let mut right = public2.clone();
|
|
||||||
public_add(&mut right, &public1).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(left, right);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn public_addition_is_reversible_with_subtraction() {
|
|
||||||
let public1 = Random.generate().unwrap().public().clone();
|
|
||||||
let public2 = Random.generate().unwrap().public().clone();
|
|
||||||
|
|
||||||
let mut sum = public1.clone();
|
|
||||||
public_add(&mut sum, &public2).unwrap();
|
|
||||||
public_sub(&mut sum, &public2).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(sum, public1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use super::{Random, Generator, KeyPair, Error};
|
use parity_crypto::publickey::{Random, Generator, KeyPair, Error};
|
||||||
|
|
||||||
/// Tries to find keypair with address starting with given prefix.
|
/// Tries to find keypair with address starting with given prefix.
|
||||||
pub struct Prefix {
|
pub struct Prefix {
|
||||||
@@ -48,7 +48,8 @@ impl Generator for Prefix {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use {Generator, Prefix};
|
use Prefix;
|
||||||
|
use parity_crypto::publickey::Generator;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn prefix_generator() {
|
fn prefix_generator() {
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use rand::rngs::OsRng;
|
|
||||||
use super::{Generator, KeyPair, SECP256K1};
|
|
||||||
|
|
||||||
/// Randomly generates new keypair, instantiating the RNG each time.
|
|
||||||
pub struct Random;
|
|
||||||
|
|
||||||
impl Generator for Random {
|
|
||||||
type Error = ::std::io::Error;
|
|
||||||
|
|
||||||
fn generate(&mut self) -> Result<KeyPair, Self::Error> {
|
|
||||||
let mut rng = OsRng::new()?;
|
|
||||||
match rng.generate() {
|
|
||||||
Ok(pair) => Ok(pair),
|
|
||||||
Err(void) => match void {}, // LLVM unreachable
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Generator for OsRng {
|
|
||||||
type Error = ::Void;
|
|
||||||
|
|
||||||
fn generate(&mut self) -> Result<KeyPair, Self::Error> {
|
|
||||||
let (sec, publ) = SECP256K1.generate_keypair(self)
|
|
||||||
.expect("context always created with full capabilities; qed");
|
|
||||||
|
|
||||||
Ok(KeyPair::from_keypair(sec, publ))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,304 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use std::fmt;
|
|
||||||
use std::ops::Deref;
|
|
||||||
use std::str::FromStr;
|
|
||||||
use rustc_hex::ToHex;
|
|
||||||
use secp256k1::constants::{SECRET_KEY_SIZE as SECP256K1_SECRET_KEY_SIZE};
|
|
||||||
use secp256k1::key;
|
|
||||||
use ethereum_types::H256;
|
|
||||||
use zeroize::Zeroize;
|
|
||||||
use {Error, SECP256K1};
|
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq)]
|
|
||||||
pub struct Secret {
|
|
||||||
inner: H256,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for Secret {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
self.inner.0.zeroize()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToHex for Secret {
|
|
||||||
fn to_hex(&self) -> String {
|
|
||||||
format!("{:x}", self.inner)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::LowerHex for Secret {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
self.inner.fmt(fmt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Debug for Secret {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
self.inner.fmt(fmt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Secret {
|
|
||||||
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
write!(fmt, "Secret: 0x{:x}{:x}..{:x}{:x}", self.inner[0], self.inner[1], self.inner[30], self.inner[31])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Secret {
|
|
||||||
/// Creates a `Secret` from the given slice, returning `None` if the slice length != 32.
|
|
||||||
pub fn from_slice(key: &[u8]) -> Option<Self> {
|
|
||||||
if key.len() != 32 {
|
|
||||||
return None
|
|
||||||
}
|
|
||||||
let mut h = H256::zero();
|
|
||||||
h.as_bytes_mut().copy_from_slice(&key[0..32]);
|
|
||||||
Some(Secret { inner: h })
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates zero key, which is invalid for crypto operations, but valid for math operation.
|
|
||||||
pub fn zero() -> Self {
|
|
||||||
Secret { inner: H256::zero() }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Imports and validates the key.
|
|
||||||
pub fn from_unsafe_slice(key: &[u8]) -> Result<Self, Error> {
|
|
||||||
let secret = key::SecretKey::from_slice(&super::SECP256K1, key)?;
|
|
||||||
Ok(secret.into())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Checks validity of this key.
|
|
||||||
pub fn check_validity(&self) -> Result<(), Error> {
|
|
||||||
self.to_secp256k1_secret().map(|_| ())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace add one secret key to another (scalar + scalar)
|
|
||||||
pub fn add(&mut self, other: &Secret) -> Result<(), Error> {
|
|
||||||
match (self.is_zero(), other.is_zero()) {
|
|
||||||
(true, true) | (false, true) => Ok(()),
|
|
||||||
(true, false) => {
|
|
||||||
*self = other.clone();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
(false, false) => {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
let other_secret = other.to_secp256k1_secret()?;
|
|
||||||
key_secret.add_assign(&SECP256K1, &other_secret)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace subtract one secret key from another (scalar - scalar)
|
|
||||||
pub fn sub(&mut self, other: &Secret) -> Result<(), Error> {
|
|
||||||
match (self.is_zero(), other.is_zero()) {
|
|
||||||
(true, true) | (false, true) => Ok(()),
|
|
||||||
(true, false) => {
|
|
||||||
*self = other.clone();
|
|
||||||
self.neg()
|
|
||||||
},
|
|
||||||
(false, false) => {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
let mut other_secret = other.to_secp256k1_secret()?;
|
|
||||||
other_secret.mul_assign(&SECP256K1, &key::MINUS_ONE_KEY)?;
|
|
||||||
key_secret.add_assign(&SECP256K1, &other_secret)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace decrease secret key (scalar - 1)
|
|
||||||
pub fn dec(&mut self) -> Result<(), Error> {
|
|
||||||
match self.is_zero() {
|
|
||||||
true => {
|
|
||||||
*self = key::MINUS_ONE_KEY.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
false => {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
key_secret.add_assign(&SECP256K1, &key::MINUS_ONE_KEY)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace multiply one secret key to another (scalar * scalar)
|
|
||||||
pub fn mul(&mut self, other: &Secret) -> Result<(), Error> {
|
|
||||||
match (self.is_zero(), other.is_zero()) {
|
|
||||||
(true, true) | (true, false) => Ok(()),
|
|
||||||
(false, true) => {
|
|
||||||
*self = Self::zero();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
(false, false) => {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
let other_secret = other.to_secp256k1_secret()?;
|
|
||||||
key_secret.mul_assign(&SECP256K1, &other_secret)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace negate secret key (-scalar)
|
|
||||||
pub fn neg(&mut self) -> Result<(), Error> {
|
|
||||||
match self.is_zero() {
|
|
||||||
true => Ok(()),
|
|
||||||
false => {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
key_secret.mul_assign(&SECP256K1, &key::MINUS_ONE_KEY)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inplace inverse secret key (1 / scalar)
|
|
||||||
pub fn inv(&mut self) -> Result<(), Error> {
|
|
||||||
let mut key_secret = self.to_secp256k1_secret()?;
|
|
||||||
key_secret.inv_assign(&SECP256K1)?;
|
|
||||||
|
|
||||||
*self = key_secret.into();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compute power of secret key inplace (secret ^ pow).
|
|
||||||
/// This function is not intended to be used with large powers.
|
|
||||||
pub fn pow(&mut self, pow: usize) -> Result<(), Error> {
|
|
||||||
if self.is_zero() {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
match pow {
|
|
||||||
0 => *self = key::ONE_KEY.into(),
|
|
||||||
1 => (),
|
|
||||||
_ => {
|
|
||||||
let c = self.clone();
|
|
||||||
for _ in 1..pow {
|
|
||||||
self.mul(&c)?;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create `secp256k1::key::SecretKey` based on this secret
|
|
||||||
pub fn to_secp256k1_secret(&self) -> Result<key::SecretKey, Error> {
|
|
||||||
Ok(key::SecretKey::from_slice(&SECP256K1, &self[..])?)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for Secret {
|
|
||||||
type Err = Error;
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
Ok(H256::from_str(s).map_err(|e| Error::Custom(format!("{:?}", e)))?.into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<[u8; 32]> for Secret {
|
|
||||||
fn from(k: [u8; 32]) -> Self {
|
|
||||||
Secret { inner: H256(k) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<H256> for Secret {
|
|
||||||
fn from(s: H256) -> Self {
|
|
||||||
s.0.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<&'static str> for Secret {
|
|
||||||
fn from(s: &'static str) -> Self {
|
|
||||||
s.parse().expect(&format!("invalid string literal for {}: '{}'", stringify!(Self), s))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<key::SecretKey> for Secret {
|
|
||||||
fn from(key: key::SecretKey) -> Self {
|
|
||||||
let mut a = [0; SECP256K1_SECRET_KEY_SIZE];
|
|
||||||
a.copy_from_slice(&key[0 .. SECP256K1_SECRET_KEY_SIZE]);
|
|
||||||
a.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Deref for Secret {
|
|
||||||
type Target = H256;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::str::FromStr;
|
|
||||||
use super::super::{Random, Generator};
|
|
||||||
use super::Secret;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn multiplicating_secret_inversion_with_secret_gives_one() {
|
|
||||||
let secret = Random.generate().unwrap().secret().clone();
|
|
||||||
let mut inversion = secret.clone();
|
|
||||||
inversion.inv().unwrap();
|
|
||||||
inversion.mul(&secret).unwrap();
|
|
||||||
assert_eq!(inversion, Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001").unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn secret_inversion_is_reversible_with_inversion() {
|
|
||||||
let secret = Random.generate().unwrap().secret().clone();
|
|
||||||
let mut inversion = secret.clone();
|
|
||||||
inversion.inv().unwrap();
|
|
||||||
inversion.inv().unwrap();
|
|
||||||
assert_eq!(inversion, secret);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn secret_pow() {
|
|
||||||
let secret = Random.generate().unwrap().secret().clone();
|
|
||||||
|
|
||||||
let mut pow0 = secret.clone();
|
|
||||||
pow0.pow(0).unwrap();
|
|
||||||
assert_eq!(pow0, Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001").unwrap());
|
|
||||||
|
|
||||||
let mut pow1 = secret.clone();
|
|
||||||
pow1.pow(1).unwrap();
|
|
||||||
assert_eq!(pow1, secret);
|
|
||||||
|
|
||||||
let mut pow2 = secret.clone();
|
|
||||||
pow2.pow(2).unwrap();
|
|
||||||
let mut pow2_expected = secret.clone();
|
|
||||||
pow2_expected.mul(&secret).unwrap();
|
|
||||||
assert_eq!(pow2, pow2_expected);
|
|
||||||
|
|
||||||
let mut pow3 = secret.clone();
|
|
||||||
pow3.pow(3).unwrap();
|
|
||||||
let mut pow3_expected = secret.clone();
|
|
||||||
pow3_expected.mul(&secret).unwrap();
|
|
||||||
pow3_expected.mul(&secret).unwrap();
|
|
||||||
assert_eq!(pow3, pow3_expected);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,314 +0,0 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity Ethereum.
|
|
||||||
|
|
||||||
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
use std::ops::{Deref, DerefMut};
|
|
||||||
use std::cmp::PartialEq;
|
|
||||||
use std::fmt;
|
|
||||||
use std::str::FromStr;
|
|
||||||
use std::hash::{Hash, Hasher};
|
|
||||||
use secp256k1::{Message as SecpMessage, RecoverableSignature, RecoveryId, Error as SecpError};
|
|
||||||
use secp256k1::key::{SecretKey, PublicKey};
|
|
||||||
use rustc_hex::{ToHex, FromHex};
|
|
||||||
use ethereum_types::{H520, H256};
|
|
||||||
use {Secret, Public, SECP256K1, Error, Message, public_to_address, Address};
|
|
||||||
|
|
||||||
/// Signature encoded as RSV components
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct Signature([u8; 65]);
|
|
||||||
|
|
||||||
impl Signature {
|
|
||||||
/// Get a slice into the 'r' portion of the data.
|
|
||||||
pub fn r(&self) -> &[u8] {
|
|
||||||
&self.0[0..32]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get a slice into the 's' portion of the data.
|
|
||||||
pub fn s(&self) -> &[u8] {
|
|
||||||
&self.0[32..64]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the recovery byte.
|
|
||||||
pub fn v(&self) -> u8 {
|
|
||||||
self.0[64]
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Encode the signature into RSV array (V altered to be in "Electrum" notation).
|
|
||||||
pub fn into_electrum(mut self) -> [u8; 65] {
|
|
||||||
self.0[64] += 27;
|
|
||||||
self.0
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parse bytes as a signature encoded as RSV (V in "Electrum" notation).
|
|
||||||
/// May return empty (invalid) signature if given data has invalid length.
|
|
||||||
pub fn from_electrum(data: &[u8]) -> Self {
|
|
||||||
if data.len() != 65 || data[64] < 27 {
|
|
||||||
// fallback to empty (invalid) signature
|
|
||||||
return Signature::default();
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut sig = [0u8; 65];
|
|
||||||
sig.copy_from_slice(data);
|
|
||||||
sig[64] -= 27;
|
|
||||||
Signature(sig)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a signature object from the sig.
|
|
||||||
pub fn from_rsv(r: &H256, s: &H256, v: u8) -> Self {
|
|
||||||
let mut sig = [0u8; 65];
|
|
||||||
sig[0..32].copy_from_slice(r.as_ref());
|
|
||||||
sig[32..64].copy_from_slice(s.as_ref());
|
|
||||||
sig[64] = v;
|
|
||||||
Signature(sig)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check if this is a "low" signature.
|
|
||||||
pub fn is_low_s(&self) -> bool {
|
|
||||||
// "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"
|
|
||||||
const MASK: H256 = H256([
|
|
||||||
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
||||||
0x5D, 0x57, 0x6E, 0x73, 0x57, 0xA4, 0x50, 0x1D,
|
|
||||||
0xDF, 0xE9, 0x2F, 0x46, 0x68, 0x1B, 0x20, 0xA0,
|
|
||||||
]);
|
|
||||||
H256::from_slice(self.s()) <= MASK
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check if each component of the signature is in range.
|
|
||||||
pub fn is_valid(&self) -> bool {
|
|
||||||
// "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"
|
|
||||||
const MASK: H256 = H256([
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
|
|
||||||
0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,
|
|
||||||
0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
|
|
||||||
]);
|
|
||||||
const ONE: H256 = H256([
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
|
||||||
]);
|
|
||||||
let r = H256::from_slice(self.r());
|
|
||||||
let s = H256::from_slice(self.s());
|
|
||||||
self.v() <= 1 &&
|
|
||||||
r < MASK && r >= ONE &&
|
|
||||||
s < MASK && s >= ONE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// manual implementation large arrays don't have trait impls by default.
|
|
||||||
// remove when integer generics exist
|
|
||||||
impl PartialEq for Signature {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
&self.0[..] == &other.0[..]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// manual implementation required in Rust 1.13+, see `std::cmp::AssertParamIsEq`.
|
|
||||||
impl Eq for Signature { }
|
|
||||||
|
|
||||||
// also manual for the same reason, but the pretty printing might be useful.
|
|
||||||
impl fmt::Debug for Signature {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
|
||||||
f.debug_struct("Signature")
|
|
||||||
.field("r", &self.0[0..32].to_hex())
|
|
||||||
.field("s", &self.0[32..64].to_hex())
|
|
||||||
.field("v", &self.0[64..65].to_hex())
|
|
||||||
.finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Signature {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
|
||||||
write!(f, "{}", self.to_hex())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for Signature {
|
|
||||||
type Err = Error;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
match s.from_hex() {
|
|
||||||
Ok(ref hex) if hex.len() == 65 => {
|
|
||||||
let mut data = [0; 65];
|
|
||||||
data.copy_from_slice(&hex[0..65]);
|
|
||||||
Ok(Signature(data))
|
|
||||||
},
|
|
||||||
_ => Err(Error::InvalidSignature)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for Signature {
|
|
||||||
fn default() -> Self {
|
|
||||||
Signature([0; 65])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Hash for Signature {
|
|
||||||
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
||||||
H520::from(self.0).hash(state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Clone for Signature {
|
|
||||||
fn clone(&self) -> Self {
|
|
||||||
Signature(self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<[u8; 65]> for Signature {
|
|
||||||
fn from(s: [u8; 65]) -> Self {
|
|
||||||
Signature(s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Into<[u8; 65]> for Signature {
|
|
||||||
fn into(self) -> [u8; 65] {
|
|
||||||
self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Signature> for H520 {
|
|
||||||
fn from(s: Signature) -> Self {
|
|
||||||
H520::from(s.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<H520> for Signature {
|
|
||||||
fn from(bytes: H520) -> Self {
|
|
||||||
Signature(bytes.into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Deref for Signature {
|
|
||||||
type Target = [u8; 65];
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl DerefMut for Signature {
|
|
||||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
|
||||||
&mut self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn sign(secret: &Secret, message: &Message) -> Result<Signature, Error> {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let sec = SecretKey::from_slice(context, secret.as_ref())?;
|
|
||||||
let s = context.sign_recoverable(&SecpMessage::from_slice(&message[..])?, &sec)?;
|
|
||||||
let (rec_id, data) = s.serialize_compact(context);
|
|
||||||
let mut data_arr = [0; 65];
|
|
||||||
|
|
||||||
// no need to check if s is low, it always is
|
|
||||||
data_arr[0..64].copy_from_slice(&data[0..64]);
|
|
||||||
data_arr[64] = rec_id.to_i32() as u8;
|
|
||||||
Ok(Signature(data_arr))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn verify_public(public: &Public, signature: &Signature, message: &Message) -> Result<bool, Error> {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let rsig = RecoverableSignature::from_compact(context, &signature[0..64], RecoveryId::from_i32(signature[64] as i32)?)?;
|
|
||||||
let sig = rsig.to_standard(context);
|
|
||||||
|
|
||||||
let pdata: [u8; 65] = {
|
|
||||||
let mut temp = [4u8; 65];
|
|
||||||
temp[1..65].copy_from_slice(public.as_bytes());
|
|
||||||
temp
|
|
||||||
};
|
|
||||||
|
|
||||||
let publ = PublicKey::from_slice(context, &pdata)?;
|
|
||||||
match context.verify(&SecpMessage::from_slice(&message[..])?, &sig, &publ) {
|
|
||||||
Ok(_) => Ok(true),
|
|
||||||
Err(SecpError::IncorrectSignature) => Ok(false),
|
|
||||||
Err(x) => Err(Error::from(x))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn verify_address(address: &Address, signature: &Signature, message: &Message) -> Result<bool, Error> {
|
|
||||||
let public = recover(signature, message)?;
|
|
||||||
let recovered_address = public_to_address(&public);
|
|
||||||
Ok(address == &recovered_address)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn recover(signature: &Signature, message: &Message) -> Result<Public, Error> {
|
|
||||||
let context = &SECP256K1;
|
|
||||||
let rsig = RecoverableSignature::from_compact(context, &signature[0..64], RecoveryId::from_i32(signature[64] as i32)?)?;
|
|
||||||
let pubkey = context.recover(&SecpMessage::from_slice(&message[..])?, &rsig)?;
|
|
||||||
let serialized = pubkey.serialize_vec(context, false);
|
|
||||||
|
|
||||||
let mut public = Public::default();
|
|
||||||
public.as_bytes_mut().copy_from_slice(&serialized[1..65]);
|
|
||||||
Ok(public)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::str::FromStr;
|
|
||||||
use {Generator, Random, Message};
|
|
||||||
use super::{sign, verify_public, verify_address, recover, Signature};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn vrs_conversion() {
|
|
||||||
// given
|
|
||||||
let keypair = Random.generate().unwrap();
|
|
||||||
let message = Message::default();
|
|
||||||
let signature = sign(keypair.secret(), &message).unwrap();
|
|
||||||
|
|
||||||
// when
|
|
||||||
let vrs = signature.clone().into_electrum();
|
|
||||||
let from_vrs = Signature::from_electrum(&vrs);
|
|
||||||
|
|
||||||
// then
|
|
||||||
assert_eq!(signature, from_vrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn signature_to_and_from_str() {
|
|
||||||
let keypair = Random.generate().unwrap();
|
|
||||||
let message = Message::default();
|
|
||||||
let signature = sign(keypair.secret(), &message).unwrap();
|
|
||||||
let string = format!("{}", signature);
|
|
||||||
let deserialized = Signature::from_str(&string).unwrap();
|
|
||||||
assert_eq!(signature, deserialized);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn sign_and_recover_public() {
|
|
||||||
let keypair = Random.generate().unwrap();
|
|
||||||
let message = Message::default();
|
|
||||||
let signature = sign(keypair.secret(), &message).unwrap();
|
|
||||||
assert_eq!(keypair.public(), &recover(&signature, &message).unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn sign_and_verify_public() {
|
|
||||||
let keypair = Random.generate().unwrap();
|
|
||||||
let message = Message::default();
|
|
||||||
let signature = sign(keypair.secret(), &message).unwrap();
|
|
||||||
assert!(verify_public(keypair.public(), &signature, &message).unwrap());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn sign_and_verify_address() {
|
|
||||||
let keypair = Random.generate().unwrap();
|
|
||||||
let message = Message::default();
|
|
||||||
let signature = sign(keypair.secret(), &message).unwrap();
|
|
||||||
assert!(verify_address(&keypair.address(), &signature, &message).unwrap());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,7 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
rand = "0.6"
|
rand = "0.7"
|
||||||
ethkey = { path = "../ethkey" }
|
ethkey = { path = "../ethkey" }
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
@@ -16,9 +16,9 @@ rustc-hex = "1.0"
|
|||||||
tiny-keccak = "1.4"
|
tiny-keccak = "1.4"
|
||||||
time = "0.1.34"
|
time = "0.1.34"
|
||||||
itertools = "0.5"
|
itertools = "0.5"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.9"
|
||||||
parity-crypto = "0.4.0"
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
dir = { path = "../../util/dir" }
|
dir = { path = "../../util/dir" }
|
||||||
smallvec = "0.6"
|
smallvec = "0.6"
|
||||||
parity-wordlist = "1.0"
|
parity-wordlist = "1.0"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Parity Ethereum key management.
|
|||||||
|
|
||||||
```
|
```
|
||||||
Parity Ethereum key management tool.
|
Parity Ethereum key management tool.
|
||||||
Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
ethstore insert <secret> <password> [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD]
|
ethstore insert <secret> <password> [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD]
|
||||||
@@ -337,4 +337,4 @@ _This project is a part of the Parity Ethereum toolchain._
|
|||||||
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding.
|
- [ethabi](https://github.com/paritytech/ethabi) - Parity Ethereum function calls encoding.
|
||||||
- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management.
|
- [ethstore](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethstore) - Parity Ethereum key management.
|
||||||
- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator.
|
- [ethkey](https://github.com/paritytech/parity-ethereum/blob/master/accounts/ethkey) - Parity Ethereum keys generator.
|
||||||
- [whisper](https://github.com/paritytech/parity-ethereum/blob/master/whisper/) - Implementation of Whisper-v2 PoC.
|
- [whisper](https://github.com/paritytech/whisper) - Implementation of Whisper-v2 PoC.
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ num_cpus = "1.6"
|
|||||||
rustc-hex = "1.0"
|
rustc-hex = "1.0"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.9"
|
||||||
ethstore = { path = "../" }
|
ethstore = { path = "../" }
|
||||||
|
ethkey = { path = "../../ethkey" }
|
||||||
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
dir = { path = '../../../util/dir' }
|
dir = { path = '../../../util/dir' }
|
||||||
panic_hook = { path = "../../../util/panic-hook" }
|
panic_hook = { path = "../../../util/panic-hook" }
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -19,7 +19,8 @@ use std::sync::Arc;
|
|||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
|
|
||||||
use ethstore::{ethkey::Password, PresaleWallet, Error};
|
use ethstore::{PresaleWallet, Error};
|
||||||
|
use ethkey::Password;
|
||||||
use num_cpus;
|
use num_cpus;
|
||||||
|
|
||||||
pub fn run(passwords: VecDeque<Password>, wallet_path: &str) -> Result<(), Error> {
|
pub fn run(passwords: VecDeque<Password>, wallet_path: &str) -> Result<(), Error> {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,9 +17,11 @@
|
|||||||
extern crate dir;
|
extern crate dir;
|
||||||
extern crate docopt;
|
extern crate docopt;
|
||||||
extern crate ethstore;
|
extern crate ethstore;
|
||||||
|
extern crate ethkey;
|
||||||
extern crate num_cpus;
|
extern crate num_cpus;
|
||||||
extern crate panic_hook;
|
extern crate panic_hook;
|
||||||
extern crate parking_lot;
|
extern crate parking_lot;
|
||||||
|
extern crate parity_crypto;
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
|
|
||||||
@@ -34,14 +36,15 @@ use std::{env, process, fs, fmt};
|
|||||||
|
|
||||||
use docopt::Docopt;
|
use docopt::Docopt;
|
||||||
use ethstore::accounts_dir::{KeyDirectory, RootDiskDirectory};
|
use ethstore::accounts_dir::{KeyDirectory, RootDiskDirectory};
|
||||||
use ethstore::ethkey::{Address, Password};
|
use ethkey::Password;
|
||||||
|
use parity_crypto::publickey::Address;
|
||||||
use ethstore::{EthStore, SimpleSecretStore, SecretStore, import_accounts, PresaleWallet, SecretVaultRef, StoreAccountRef};
|
use ethstore::{EthStore, SimpleSecretStore, SecretStore, import_accounts, PresaleWallet, SecretVaultRef, StoreAccountRef};
|
||||||
|
|
||||||
mod crack;
|
mod crack;
|
||||||
|
|
||||||
pub const USAGE: &'static str = r#"
|
pub const USAGE: &'static str = r#"
|
||||||
Parity Ethereum key management tool.
|
Parity Ethereum key management tool.
|
||||||
Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
ethstore insert <secret> <password> [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD]
|
ethstore insert <secret> <password> [--dir DIR] [--vault VAULT] [--vault-pwd VAULTPWD]
|
||||||
@@ -163,7 +166,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn key_dir(location: &str, password: Option<Password>) -> Result<Box<KeyDirectory>, Error> {
|
fn key_dir(location: &str, password: Option<Password>) -> Result<Box<dyn KeyDirectory>, Error> {
|
||||||
let dir: RootDiskDirectory = match location {
|
let dir: RootDiskDirectory = match location {
|
||||||
"geth" => RootDiskDirectory::create(dir::geth(false))?,
|
"geth" => RootDiskDirectory::create(dir::geth(false))?,
|
||||||
"geth-test" => RootDiskDirectory::create(dir::geth(true))?,
|
"geth-test" => RootDiskDirectory::create(dir::geth(true))?,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use std::str;
|
use std::str;
|
||||||
use ethkey::{Password, Secret};
|
use crypto::publickey::Secret;
|
||||||
|
use ethkey::Password;
|
||||||
use {json, Error, crypto};
|
use {json, Error, crypto};
|
||||||
use crypto::Keccak256;
|
use crypto::Keccak256;
|
||||||
use random::Random;
|
use random::Random;
|
||||||
@@ -120,7 +121,7 @@ impl Crypto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let secret = self.do_decrypt(password, 32)?;
|
let secret = self.do_decrypt(password, 32)?;
|
||||||
Ok(Secret::from_unsafe_slice(&secret)?)
|
Ok(Secret::import_key(&secret)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Try to decrypt and return result as is
|
/// Try to decrypt and return result as is
|
||||||
@@ -158,7 +159,7 @@ impl Crypto {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use ethkey::{Generator, Random};
|
use crypto::publickey::{Generator, Random};
|
||||||
use super::{Crypto, Error};
|
use super::{Crypto, Error};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,8 +14,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use ethkey::{self, KeyPair, sign, Address, Password, Signature, Message, Public, Secret};
|
use crypto::publickey::{KeyPair, sign, Address, Signature, Message, Public, Secret};
|
||||||
use ethkey::crypto::ecdh::agree;
|
use ethkey::Password;
|
||||||
|
use crypto::publickey::ecdh::agree;
|
||||||
use {json, Error};
|
use {json, Error};
|
||||||
use account::Version;
|
use account::Version;
|
||||||
use crypto;
|
use crypto;
|
||||||
@@ -161,7 +162,7 @@ impl SafeAccount {
|
|||||||
/// Decrypt a message.
|
/// Decrypt a message.
|
||||||
pub fn decrypt(&self, password: &Password, shared_mac: &[u8], message: &[u8]) -> Result<Vec<u8>, Error> {
|
pub fn decrypt(&self, password: &Password, shared_mac: &[u8], message: &[u8]) -> Result<Vec<u8>, Error> {
|
||||||
let secret = self.crypto.secret(password)?;
|
let secret = self.crypto.secret(password)?;
|
||||||
ethkey::crypto::ecies::decrypt(&secret, shared_mac, message).map_err(From::from)
|
crypto::publickey::ecies::decrypt(&secret, shared_mac, message).map_err(From::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Agree on shared key.
|
/// Agree on shared key.
|
||||||
@@ -199,7 +200,7 @@ impl SafeAccount {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use ethkey::{Generator, Random, verify_public, Message};
|
use crypto::publickey::{Generator, Random, verify_public, Message};
|
||||||
use super::SafeAccount;
|
use super::SafeAccount;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -284,7 +284,7 @@ impl<T> KeyDirectory for DiskDirectory<T> where T: KeyFileManager {
|
|||||||
|
|
||||||
fn path(&self) -> Option<&PathBuf> { Some(&self.path) }
|
fn path(&self) -> Option<&PathBuf> { Some(&self.path) }
|
||||||
|
|
||||||
fn as_vault_provider(&self) -> Option<&VaultKeyDirectoryProvider> {
|
fn as_vault_provider(&self) -> Option<&dyn VaultKeyDirectoryProvider> {
|
||||||
Some(self)
|
Some(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,12 +294,12 @@ impl<T> KeyDirectory for DiskDirectory<T> where T: KeyFileManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T> VaultKeyDirectoryProvider for DiskDirectory<T> where T: KeyFileManager {
|
impl<T> VaultKeyDirectoryProvider for DiskDirectory<T> where T: KeyFileManager {
|
||||||
fn create(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error> {
|
fn create(&self, name: &str, key: VaultKey) -> Result<Box<dyn VaultKeyDirectory>, Error> {
|
||||||
let vault_dir = VaultDiskDirectory::create(&self.path, name, key)?;
|
let vault_dir = VaultDiskDirectory::create(&self.path, name, key)?;
|
||||||
Ok(Box::new(vault_dir))
|
Ok(Box::new(vault_dir))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn open(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error> {
|
fn open(&self, name: &str, key: VaultKey) -> Result<Box<dyn VaultKeyDirectory>, Error> {
|
||||||
let vault_dir = VaultDiskDirectory::at(&self.path, name, key)?;
|
let vault_dir = VaultDiskDirectory::at(&self.path, name, key)?;
|
||||||
Ok(Box::new(vault_dir))
|
Ok(Box::new(vault_dir))
|
||||||
}
|
}
|
||||||
@@ -356,7 +356,7 @@ mod test {
|
|||||||
use std::{env, fs};
|
use std::{env, fs};
|
||||||
use super::{KeyDirectory, RootDiskDirectory, VaultKey};
|
use super::{KeyDirectory, RootDiskDirectory, VaultKey};
|
||||||
use account::SafeAccount;
|
use account::SafeAccount;
|
||||||
use ethkey::{Random, Generator};
|
use crypto::publickey::{Random, Generator};
|
||||||
use self::tempdir::TempDir;
|
use self::tempdir::TempDir;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use itertools;
|
use itertools;
|
||||||
use ethkey::Address;
|
use crypto::publickey::Address;
|
||||||
|
|
||||||
use {SafeAccount, Error};
|
use {SafeAccount, Error};
|
||||||
use super::KeyDirectory;
|
use super::KeyDirectory;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -57,7 +57,7 @@ pub trait KeyDirectory: Send + Sync {
|
|||||||
/// Get directory filesystem path, if available
|
/// Get directory filesystem path, if available
|
||||||
fn path(&self) -> Option<&PathBuf> { None }
|
fn path(&self) -> Option<&PathBuf> { None }
|
||||||
/// Return vault provider, if available
|
/// Return vault provider, if available
|
||||||
fn as_vault_provider(&self) -> Option<&VaultKeyDirectoryProvider> { None }
|
fn as_vault_provider(&self) -> Option<&dyn VaultKeyDirectoryProvider> { None }
|
||||||
/// Unique representation of directory account collection
|
/// Unique representation of directory account collection
|
||||||
fn unique_repr(&self) -> Result<u64, Error>;
|
fn unique_repr(&self) -> Result<u64, Error>;
|
||||||
}
|
}
|
||||||
@@ -65,9 +65,9 @@ pub trait KeyDirectory: Send + Sync {
|
|||||||
/// Vaults provider
|
/// Vaults provider
|
||||||
pub trait VaultKeyDirectoryProvider {
|
pub trait VaultKeyDirectoryProvider {
|
||||||
/// Create new vault with given key
|
/// Create new vault with given key
|
||||||
fn create(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error>;
|
fn create(&self, name: &str, key: VaultKey) -> Result<Box<dyn VaultKeyDirectory>, Error>;
|
||||||
/// Open existing vault with given key
|
/// Open existing vault with given key
|
||||||
fn open(&self, name: &str, key: VaultKey) -> Result<Box<VaultKeyDirectory>, Error>;
|
fn open(&self, name: &str, key: VaultKey) -> Result<Box<dyn VaultKeyDirectory>, Error>;
|
||||||
/// List all vaults
|
/// List all vaults
|
||||||
fn list_vaults(&self) -> Result<Vec<String>, Error>;
|
fn list_vaults(&self) -> Result<Vec<String>, Error>;
|
||||||
/// Get vault meta
|
/// Get vault meta
|
||||||
@@ -77,7 +77,7 @@ pub trait VaultKeyDirectoryProvider {
|
|||||||
/// Vault directory
|
/// Vault directory
|
||||||
pub trait VaultKeyDirectory: KeyDirectory {
|
pub trait VaultKeyDirectory: KeyDirectory {
|
||||||
/// Cast to `KeyDirectory`
|
/// Cast to `KeyDirectory`
|
||||||
fn as_key_directory(&self) -> &KeyDirectory;
|
fn as_key_directory(&self) -> &dyn KeyDirectory;
|
||||||
/// Vault name
|
/// Vault name
|
||||||
fn name(&self) -> &str;
|
fn name(&self) -> &str;
|
||||||
/// Get vault key
|
/// Get vault key
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -119,7 +119,7 @@ impl VaultDiskDirectory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl VaultKeyDirectory for VaultDiskDirectory {
|
impl VaultKeyDirectory for VaultDiskDirectory {
|
||||||
fn as_key_directory(&self) -> &KeyDirectory {
|
fn as_key_directory(&self) -> &dyn KeyDirectory {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -16,9 +16,8 @@
|
|||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::io::Error as IoError;
|
use std::io::Error as IoError;
|
||||||
use ethkey::{self, Error as EthKeyError};
|
|
||||||
use crypto::{self, Error as EthCryptoError};
|
use crypto::{self, Error as EthCryptoError};
|
||||||
use ethkey::DerivationError;
|
use crypto::publickey::{Error as EthPublicKeyCryptoError, DerivationError};
|
||||||
|
|
||||||
/// Account-related errors.
|
/// Account-related errors.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -47,12 +46,10 @@ pub enum Error {
|
|||||||
VaultNotFound,
|
VaultNotFound,
|
||||||
/// Account creation failed.
|
/// Account creation failed.
|
||||||
CreationFailed,
|
CreationFailed,
|
||||||
/// `EthKey` error
|
|
||||||
EthKey(EthKeyError),
|
|
||||||
/// `ethkey::crypto::Error`
|
|
||||||
EthKeyCrypto(ethkey::crypto::Error),
|
|
||||||
/// `EthCrypto` error
|
/// `EthCrypto` error
|
||||||
EthCrypto(EthCryptoError),
|
EthCrypto(EthCryptoError),
|
||||||
|
/// `EthPublicKeyCryptoError` error
|
||||||
|
EthPublicKeyCrypto(EthPublicKeyCryptoError),
|
||||||
/// Derivation error
|
/// Derivation error
|
||||||
Derivation(DerivationError),
|
Derivation(DerivationError),
|
||||||
/// Custom error
|
/// Custom error
|
||||||
@@ -74,9 +71,8 @@ impl fmt::Display for Error {
|
|||||||
Error::InvalidVaultName => "Invalid vault name".into(),
|
Error::InvalidVaultName => "Invalid vault name".into(),
|
||||||
Error::VaultNotFound => "Vault not found".into(),
|
Error::VaultNotFound => "Vault not found".into(),
|
||||||
Error::CreationFailed => "Account creation failed".into(),
|
Error::CreationFailed => "Account creation failed".into(),
|
||||||
Error::EthKey(ref err) => err.to_string(),
|
|
||||||
Error::EthKeyCrypto(ref err) => err.to_string(),
|
|
||||||
Error::EthCrypto(ref err) => err.to_string(),
|
Error::EthCrypto(ref err) => err.to_string(),
|
||||||
|
Error::EthPublicKeyCrypto(ref err) => err.to_string(),
|
||||||
Error::Derivation(ref err) => format!("Derivation error: {:?}", err),
|
Error::Derivation(ref err) => format!("Derivation error: {:?}", err),
|
||||||
Error::Custom(ref s) => s.clone(),
|
Error::Custom(ref s) => s.clone(),
|
||||||
};
|
};
|
||||||
@@ -91,15 +87,9 @@ impl From<IoError> for Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<EthKeyError> for Error {
|
impl From<EthPublicKeyCryptoError> for Error {
|
||||||
fn from(err: EthKeyError) -> Self {
|
fn from(err: EthPublicKeyCryptoError) -> Self {
|
||||||
Error::EthKey(err)
|
Error::EthPublicKeyCrypto(err)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<ethkey::crypto::Error> for Error {
|
|
||||||
fn from(err: ethkey::crypto::Error) -> Self {
|
|
||||||
Error::EthKeyCrypto(err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -22,7 +22,8 @@ use std::time::{Instant, Duration};
|
|||||||
|
|
||||||
use crypto::KEY_ITERATIONS;
|
use crypto::KEY_ITERATIONS;
|
||||||
use random::Random;
|
use random::Random;
|
||||||
use ethkey::{self, Signature, Password, Address, Message, Secret, Public, KeyPair, ExtendedKeyPair};
|
use crypto::publickey::{Signature, Address, Message, Secret, Public, KeyPair, ExtendedKeyPair};
|
||||||
|
use ethkey::Password;
|
||||||
use accounts_dir::{KeyDirectory, VaultKeyDirectory, VaultKey, SetKeyError};
|
use accounts_dir::{KeyDirectory, VaultKeyDirectory, VaultKey, SetKeyError};
|
||||||
use account::SafeAccount;
|
use account::SafeAccount;
|
||||||
use presale::PresaleWallet;
|
use presale::PresaleWallet;
|
||||||
@@ -36,12 +37,12 @@ pub struct EthStore {
|
|||||||
|
|
||||||
impl EthStore {
|
impl EthStore {
|
||||||
/// Open a new accounts store with given key directory backend.
|
/// Open a new accounts store with given key directory backend.
|
||||||
pub fn open(directory: Box<KeyDirectory>) -> Result<Self, Error> {
|
pub fn open(directory: Box<dyn KeyDirectory>) -> Result<Self, Error> {
|
||||||
Self::open_with_iterations(directory, KEY_ITERATIONS as u32)
|
Self::open_with_iterations(directory, KEY_ITERATIONS as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Open a new account store with given key directory backend and custom number of iterations.
|
/// Open a new account store with given key directory backend and custom number of iterations.
|
||||||
pub fn open_with_iterations(directory: Box<KeyDirectory>, iterations: u32) -> Result<Self, Error> {
|
pub fn open_with_iterations(directory: Box<dyn KeyDirectory>, iterations: u32) -> Result<Self, Error> {
|
||||||
Ok(EthStore {
|
Ok(EthStore {
|
||||||
store: EthMultiStore::open_with_iterations(directory, iterations)?,
|
store: EthMultiStore::open_with_iterations(directory, iterations)?,
|
||||||
})
|
})
|
||||||
@@ -184,7 +185,7 @@ impl SecretStore for EthStore {
|
|||||||
Ok(account.check_password(password))
|
Ok(account.check_password(password))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn copy_account(&self, new_store: &SimpleSecretStore, new_vault: SecretVaultRef, account: &StoreAccountRef, password: &Password, new_password: &Password) -> Result<(), Error> {
|
fn copy_account(&self, new_store: &dyn SimpleSecretStore, new_vault: SecretVaultRef, account: &StoreAccountRef, password: &Password, new_password: &Password) -> Result<(), Error> {
|
||||||
let account = self.get(account)?;
|
let account = self.get(account)?;
|
||||||
let secret = account.crypto.secret(password)?;
|
let secret = account.crypto.secret(password)?;
|
||||||
new_store.insert_account(new_vault, secret, new_password)?;
|
new_store.insert_account(new_vault, secret, new_password)?;
|
||||||
@@ -256,11 +257,11 @@ impl SecretStore for EthStore {
|
|||||||
|
|
||||||
/// Similar to `EthStore` but may store many accounts (with different passwords) for the same `Address`
|
/// Similar to `EthStore` but may store many accounts (with different passwords) for the same `Address`
|
||||||
pub struct EthMultiStore {
|
pub struct EthMultiStore {
|
||||||
dir: Box<KeyDirectory>,
|
dir: Box<dyn KeyDirectory>,
|
||||||
iterations: u32,
|
iterations: u32,
|
||||||
// order lock: cache, then vaults
|
// order lock: cache, then vaults
|
||||||
cache: RwLock<BTreeMap<StoreAccountRef, Vec<SafeAccount>>>,
|
cache: RwLock<BTreeMap<StoreAccountRef, Vec<SafeAccount>>>,
|
||||||
vaults: Mutex<HashMap<String, Box<VaultKeyDirectory>>>,
|
vaults: Mutex<HashMap<String, Box<dyn VaultKeyDirectory>>>,
|
||||||
timestamp: Mutex<Timestamp>,
|
timestamp: Mutex<Timestamp>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,12 +273,12 @@ struct Timestamp {
|
|||||||
|
|
||||||
impl EthMultiStore {
|
impl EthMultiStore {
|
||||||
/// Open new multi-accounts store with given key directory backend.
|
/// Open new multi-accounts store with given key directory backend.
|
||||||
pub fn open(directory: Box<KeyDirectory>) -> Result<Self, Error> {
|
pub fn open(directory: Box<dyn KeyDirectory>) -> Result<Self, Error> {
|
||||||
Self::open_with_iterations(directory, KEY_ITERATIONS as u32)
|
Self::open_with_iterations(directory, KEY_ITERATIONS as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Open new multi-accounts store with given key directory backend and custom number of iterations for new keys.
|
/// Open new multi-accounts store with given key directory backend and custom number of iterations for new keys.
|
||||||
pub fn open_with_iterations(directory: Box<KeyDirectory>, iterations: u32) -> Result<Self, Error> {
|
pub fn open_with_iterations(directory: Box<dyn KeyDirectory>, iterations: u32) -> Result<Self, Error> {
|
||||||
let store = EthMultiStore {
|
let store = EthMultiStore {
|
||||||
dir: directory,
|
dir: directory,
|
||||||
vaults: Mutex::new(HashMap::new()),
|
vaults: Mutex::new(HashMap::new()),
|
||||||
@@ -442,13 +443,13 @@ impl EthMultiStore {
|
|||||||
Derivation::Hierarchical(path) => {
|
Derivation::Hierarchical(path) => {
|
||||||
for path_item in path {
|
for path_item in path {
|
||||||
extended = extended.derive(
|
extended = extended.derive(
|
||||||
if path_item.soft { ethkey::Derivation::Soft(path_item.index) }
|
if path_item.soft { crypto::publickey::Derivation::Soft(path_item.index) }
|
||||||
else { ethkey::Derivation::Hard(path_item.index) }
|
else { crypto::publickey::Derivation::Hard(path_item.index) }
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Derivation::SoftHash(h256) => { extended = extended.derive(ethkey::Derivation::Soft(h256))?; }
|
Derivation::SoftHash(h256) => { extended = extended.derive(crypto::publickey::Derivation::Soft(h256))?; }
|
||||||
Derivation::HardHash(h256) => { extended = extended.derive(ethkey::Derivation::Hard(h256))?; }
|
Derivation::HardHash(h256) => { extended = extended.derive(crypto::publickey::Derivation::Hard(h256))?; }
|
||||||
}
|
}
|
||||||
Ok(extended)
|
Ok(extended)
|
||||||
}
|
}
|
||||||
@@ -479,7 +480,7 @@ impl SimpleSecretStore for EthMultiStore {
|
|||||||
let accounts = self.get_matching(&account_ref, password)?;
|
let accounts = self.get_matching(&account_ref, password)?;
|
||||||
for account in accounts {
|
for account in accounts {
|
||||||
let extended = self.generate(account.crypto.secret(password)?, derivation)?;
|
let extended = self.generate(account.crypto.secret(password)?, derivation)?;
|
||||||
return Ok(ethkey::public_to_address(extended.public().public()));
|
return Ok(crypto::publickey::public_to_address(extended.public().public()));
|
||||||
}
|
}
|
||||||
Err(Error::InvalidPassword)
|
Err(Error::InvalidPassword)
|
||||||
}
|
}
|
||||||
@@ -491,7 +492,7 @@ impl SimpleSecretStore for EthMultiStore {
|
|||||||
for account in accounts {
|
for account in accounts {
|
||||||
let extended = self.generate(account.crypto.secret(password)?, derivation)?;
|
let extended = self.generate(account.crypto.secret(password)?, derivation)?;
|
||||||
let secret = extended.secret().as_raw();
|
let secret = extended.secret().as_raw();
|
||||||
return Ok(ethkey::sign(&secret, message)?)
|
return Ok(crypto::publickey::sign(&secret, message)?)
|
||||||
}
|
}
|
||||||
Err(Error::InvalidPassword)
|
Err(Error::InvalidPassword)
|
||||||
}
|
}
|
||||||
@@ -690,7 +691,7 @@ mod tests {
|
|||||||
extern crate tempdir;
|
extern crate tempdir;
|
||||||
|
|
||||||
use accounts_dir::{KeyDirectory, MemoryDirectory, RootDiskDirectory};
|
use accounts_dir::{KeyDirectory, MemoryDirectory, RootDiskDirectory};
|
||||||
use ethkey::{Random, Generator, KeyPair};
|
use crypto::publickey::{Random, Generator, KeyPair};
|
||||||
use secret_store::{SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation};
|
use secret_store::{SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation};
|
||||||
use super::{EthStore, EthMultiStore};
|
use super::{EthStore, EthMultiStore};
|
||||||
use self::tempdir::TempDir;
|
use self::tempdir::TempDir;
|
||||||
@@ -709,7 +710,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct RootDiskDirectoryGuard {
|
struct RootDiskDirectoryGuard {
|
||||||
pub key_dir: Option<Box<KeyDirectory>>,
|
pub key_dir: Option<Box<dyn KeyDirectory>>,
|
||||||
_path: TempDir,
|
_path: TempDir,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -18,13 +18,13 @@ use std::collections::HashSet;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
use ethkey::Address;
|
use crypto::publickey::Address;
|
||||||
use accounts_dir::{KeyDirectory, RootDiskDirectory, DiskKeyFileManager, KeyFileManager};
|
use accounts_dir::{KeyDirectory, RootDiskDirectory, DiskKeyFileManager, KeyFileManager};
|
||||||
use dir;
|
use dir;
|
||||||
use Error;
|
use Error;
|
||||||
|
|
||||||
/// Import an account from a file.
|
/// Import an account from a file.
|
||||||
pub fn import_account(path: &Path, dst: &KeyDirectory) -> Result<Address, Error> {
|
pub fn import_account(path: &Path, dst: &dyn KeyDirectory) -> Result<Address, Error> {
|
||||||
let key_manager = DiskKeyFileManager::default();
|
let key_manager = DiskKeyFileManager::default();
|
||||||
let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::<HashSet<_>>();
|
let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::<HashSet<_>>();
|
||||||
let filename = path.file_name().and_then(|n| n.to_str()).map(|f| f.to_owned());
|
let filename = path.file_name().and_then(|n| n.to_str()).map(|f| f.to_owned());
|
||||||
@@ -40,7 +40,7 @@ pub fn import_account(path: &Path, dst: &KeyDirectory) -> Result<Address, Error>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Import all accounts from one directory to the other.
|
/// Import all accounts from one directory to the other.
|
||||||
pub fn import_accounts(src: &KeyDirectory, dst: &KeyDirectory) -> Result<Vec<Address>, Error> {
|
pub fn import_accounts(src: &dyn KeyDirectory, dst: &dyn KeyDirectory) -> Result<Vec<Address>, Error> {
|
||||||
let accounts = src.load()?;
|
let accounts = src.load()?;
|
||||||
let existing_accounts = dst.load()?.into_iter()
|
let existing_accounts = dst.load()?.into_iter()
|
||||||
.map(|a| a.address)
|
.map(|a| a.address)
|
||||||
@@ -64,7 +64,7 @@ pub fn read_geth_accounts(testnet: bool) -> Vec<Address> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Import specific `desired` accounts from the Geth keystore into `dst`.
|
/// Import specific `desired` accounts from the Geth keystore into `dst`.
|
||||||
pub fn import_geth_accounts(dst: &KeyDirectory, desired: HashSet<Address>, testnet: bool) -> Result<Vec<Address>, Error> {
|
pub fn import_geth_accounts(dst: &dyn KeyDirectory, desired: HashSet<Address>, testnet: bool) -> Result<Vec<Address>, Error> {
|
||||||
let src = RootDiskDirectory::at(dir::geth(testnet));
|
let src = RootDiskDirectory::at(dir::geth(testnet));
|
||||||
let accounts = src.load()?;
|
let accounts = src.load()?;
|
||||||
let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::<HashSet<_>>();
|
let existing_accounts = dst.load()?.into_iter().map(|a| a.address).collect::<HashSet<_>>();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -38,7 +38,7 @@ impl<'a> Into<String> for &'a Uuid {
|
|||||||
let d3 = &self.0[6..8];
|
let d3 = &self.0[6..8];
|
||||||
let d4 = &self.0[8..10];
|
let d4 = &self.0[8..10];
|
||||||
let d5 = &self.0[10..16];
|
let d5 = &self.0[10..16];
|
||||||
[d1, d2, d3, d4, d5].into_iter().map(|d| d.to_hex()).collect::<Vec<String>>().join("-")
|
[d1, d2, d3, d4, d5].iter().map(|d| d.to_hex()).collect::<Vec<String>>().join("-")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -33,7 +33,7 @@ extern crate tempdir;
|
|||||||
|
|
||||||
extern crate parity_crypto as crypto;
|
extern crate parity_crypto as crypto;
|
||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
extern crate ethkey as _ethkey;
|
extern crate ethkey as ethkey;
|
||||||
extern crate parity_wordlist;
|
extern crate parity_wordlist;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
@@ -46,7 +46,6 @@ extern crate serde_derive;
|
|||||||
extern crate matches;
|
extern crate matches;
|
||||||
|
|
||||||
pub mod accounts_dir;
|
pub mod accounts_dir;
|
||||||
pub mod ethkey;
|
|
||||||
|
|
||||||
mod account;
|
mod account;
|
||||||
mod json;
|
mod json;
|
||||||
@@ -72,4 +71,30 @@ pub use self::random::random_string;
|
|||||||
pub use self::parity_wordlist::random_phrase;
|
pub use self::parity_wordlist::random_phrase;
|
||||||
|
|
||||||
/// An opaque wrapper for secret.
|
/// An opaque wrapper for secret.
|
||||||
pub struct OpaqueSecret(::ethkey::Secret);
|
pub struct OpaqueSecret(crypto::publickey::Secret);
|
||||||
|
|
||||||
|
// Additional converters for Address
|
||||||
|
use crypto::publickey::Address;
|
||||||
|
|
||||||
|
impl Into<json::H160> for Address {
|
||||||
|
fn into(self) -> json::H160 {
|
||||||
|
let a: [u8; 20] = self.into();
|
||||||
|
From::from(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<json::H160> for Address {
|
||||||
|
fn from(json: json::H160) -> Self {
|
||||||
|
let a: [u8; 20] = json.into();
|
||||||
|
From::from(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a json::H160> for Address {
|
||||||
|
fn from(json: &'a json::H160) -> Self {
|
||||||
|
let mut a = [0u8; 20];
|
||||||
|
a.copy_from_slice(json);
|
||||||
|
From::from(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,7 +17,8 @@
|
|||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use json;
|
use json;
|
||||||
use ethkey::{Address, Secret, KeyPair, Password};
|
use crypto::publickey::{Address, Secret, KeyPair};
|
||||||
|
use ethkey::Password;
|
||||||
use crypto::{Keccak256, pbkdf2};
|
use crypto::{Keccak256, pbkdf2};
|
||||||
use {crypto, Error};
|
use {crypto, Error};
|
||||||
|
|
||||||
@@ -65,7 +66,7 @@ impl PresaleWallet {
|
|||||||
.map_err(|_| Error::InvalidPassword)?;
|
.map_err(|_| Error::InvalidPassword)?;
|
||||||
let unpadded = &key[..len];
|
let unpadded = &key[..len];
|
||||||
|
|
||||||
let secret = Secret::from_unsafe_slice(&unpadded.keccak256())?;
|
let secret = Secret::import_key(&unpadded.keccak256())?;
|
||||||
if let Ok(kp) = KeyPair::from_secret(secret) {
|
if let Ok(kp) = KeyPair::from_secret(secret) {
|
||||||
if kp.address() == self.address {
|
if kp.address() == self.address {
|
||||||
return Ok(kp)
|
return Ok(kp)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -23,7 +23,7 @@ pub trait Random {
|
|||||||
impl Random for [u8; 16] {
|
impl Random for [u8; 16] {
|
||||||
fn random() -> Self {
|
fn random() -> Self {
|
||||||
let mut result = [0u8; 16];
|
let mut result = [0u8; 16];
|
||||||
let mut rng = OsRng::new().unwrap();
|
let mut rng = OsRng;
|
||||||
rng.fill_bytes(&mut result);
|
rng.fill_bytes(&mut result);
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ impl Random for [u8; 16] {
|
|||||||
impl Random for [u8; 32] {
|
impl Random for [u8; 32] {
|
||||||
fn random() -> Self {
|
fn random() -> Self {
|
||||||
let mut result = [0u8; 32];
|
let mut result = [0u8; 32];
|
||||||
let mut rng = OsRng::new().unwrap();
|
let mut rng = OsRng;
|
||||||
rng.fill_bytes(&mut result);
|
rng.fill_bytes(&mut result);
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@@ -40,6 +40,6 @@ impl Random for [u8; 32] {
|
|||||||
|
|
||||||
/// Generate a random string of given length.
|
/// Generate a random string of given length.
|
||||||
pub fn random_string(length: usize) -> String {
|
pub fn random_string(length: usize) -> String {
|
||||||
let mut rng = OsRng::new().expect("Not able to operate without random source.");
|
let rng = OsRng;
|
||||||
rng.sample_iter(&Alphanumeric).take(length).collect()
|
rng.sample_iter(&Alphanumeric).take(length).collect()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,7 +17,8 @@
|
|||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use ethkey::{Address, Message, Signature, Secret, Password, Public};
|
use crypto::publickey::{Address, Message, Signature, Secret, Public};
|
||||||
|
use ethkey::Password;
|
||||||
use Error;
|
use Error;
|
||||||
use json::{Uuid, OpaqueKeyFile};
|
use json::{Uuid, OpaqueKeyFile};
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
@@ -110,7 +111,7 @@ pub trait SecretStore: SimpleSecretStore {
|
|||||||
|
|
||||||
/// Signs a message with raw secret.
|
/// Signs a message with raw secret.
|
||||||
fn sign_with_secret(&self, secret: &OpaqueSecret, message: &Message) -> Result<Signature, Error> {
|
fn sign_with_secret(&self, secret: &OpaqueSecret, message: &Message) -> Result<Signature, Error> {
|
||||||
Ok(::ethkey::sign(&secret.0, message)?)
|
Ok(crypto::publickey::sign(&secret.0, message)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Imports presale wallet
|
/// Imports presale wallet
|
||||||
@@ -118,7 +119,7 @@ pub trait SecretStore: SimpleSecretStore {
|
|||||||
/// Imports existing JSON wallet
|
/// Imports existing JSON wallet
|
||||||
fn import_wallet(&self, vault: SecretVaultRef, json: &[u8], password: &Password, gen_id: bool) -> Result<StoreAccountRef, Error>;
|
fn import_wallet(&self, vault: SecretVaultRef, json: &[u8], password: &Password, gen_id: bool) -> Result<StoreAccountRef, Error>;
|
||||||
/// Copies account between stores and vaults.
|
/// Copies account between stores and vaults.
|
||||||
fn copy_account(&self, new_store: &SimpleSecretStore, new_vault: SecretVaultRef, account: &StoreAccountRef, password: &Password, new_password: &Password) -> Result<(), Error>;
|
fn copy_account(&self, new_store: &dyn SimpleSecretStore, new_vault: SecretVaultRef, account: &StoreAccountRef, password: &Password, new_password: &Password) -> Result<(), Error>;
|
||||||
/// Checks if password matches given account.
|
/// Checks if password matches given account.
|
||||||
fn test_password(&self, account: &StoreAccountRef, password: &Password) -> Result<bool, Error>;
|
fn test_password(&self, account: &StoreAccountRef, password: &Password) -> Result<bool, Error>;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,11 +17,12 @@
|
|||||||
extern crate rand;
|
extern crate rand;
|
||||||
extern crate ethstore;
|
extern crate ethstore;
|
||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
|
extern crate parity_crypto;
|
||||||
|
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
use ethstore::{EthStore, SimpleSecretStore, SecretVaultRef, StoreAccountRef};
|
use ethstore::{EthStore, SimpleSecretStore, SecretVaultRef, StoreAccountRef};
|
||||||
use ethstore::ethkey::{Random, Generator, Secret, KeyPair, verify_address};
|
use parity_crypto::publickey::{Random, Generator, Secret, KeyPair, verify_address};
|
||||||
use ethstore::accounts_dir::RootDiskDirectory;
|
use ethstore::accounts_dir::RootDiskDirectory;
|
||||||
use util::TransientDir;
|
use util::TransientDir;
|
||||||
use ethereum_types::Address;
|
use ethereum_types::Address;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -21,7 +21,7 @@ use ethstore::accounts_dir::{KeyDirectory, RootDiskDirectory};
|
|||||||
use ethstore::{Error, SafeAccount};
|
use ethstore::{Error, SafeAccount};
|
||||||
|
|
||||||
pub fn random_dir() -> PathBuf {
|
pub fn random_dir() -> PathBuf {
|
||||||
let mut rng = OsRng::new().unwrap();
|
let mut rng = OsRng;
|
||||||
let mut dir = env::temp_dir();
|
let mut dir = env::temp_dir();
|
||||||
dir.push(format!("{:x}-{:x}", rng.next_u64(), rng.next_u64()));
|
dir.push(format!("{:x}-{:x}", rng.next_u64(), rng.next_u64()));
|
||||||
dir
|
dir
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -21,7 +21,8 @@ use std::{
|
|||||||
time::Instant,
|
time::Instant,
|
||||||
};
|
};
|
||||||
|
|
||||||
use ethkey::{Address, Password};
|
use parity_crypto::publickey::Address;
|
||||||
|
use ethkey::Password;
|
||||||
use serde_derive::{Serialize, Deserialize};
|
use serde_derive::{Serialize, Deserialize};
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -28,7 +28,8 @@ use self::stores::AddressBook;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::time::{Instant, Duration};
|
use std::time::{Instant, Duration};
|
||||||
|
|
||||||
use ethkey::{Address, Message, Public, Secret, Password, Random, Generator};
|
use ethkey::Password;
|
||||||
|
use parity_crypto::publickey::{Address, Message, Public, Secret, Random, Generator, Signature};
|
||||||
use ethstore::accounts_dir::MemoryDirectory;
|
use ethstore::accounts_dir::MemoryDirectory;
|
||||||
use ethstore::{
|
use ethstore::{
|
||||||
SimpleSecretStore, SecretStore, EthStore, EthMultiStore,
|
SimpleSecretStore, SecretStore, EthStore, EthMultiStore,
|
||||||
@@ -37,7 +38,6 @@ use ethstore::{
|
|||||||
use log::warn;
|
use log::warn;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
|
|
||||||
pub use ethkey::Signature;
|
|
||||||
pub use ethstore::{Derivation, IndexDerivation, KeyFile, Error};
|
pub use ethstore::{Derivation, IndexDerivation, KeyFile, Error};
|
||||||
|
|
||||||
pub use self::account_data::AccountMeta;
|
pub use self::account_data::AccountMeta;
|
||||||
@@ -64,7 +64,7 @@ pub struct AccountProvider {
|
|||||||
/// Address book.
|
/// Address book.
|
||||||
address_book: RwLock<AddressBook>,
|
address_book: RwLock<AddressBook>,
|
||||||
/// Accounts on disk
|
/// Accounts on disk
|
||||||
sstore: Box<SecretStore>,
|
sstore: Box<dyn SecretStore>,
|
||||||
/// Accounts unlocked with rolling tokens
|
/// Accounts unlocked with rolling tokens
|
||||||
transient_sstore: EthMultiStore,
|
transient_sstore: EthMultiStore,
|
||||||
/// When unlocking account permanently we additionally keep a raw secret in memory
|
/// When unlocking account permanently we additionally keep a raw secret in memory
|
||||||
@@ -80,7 +80,7 @@ fn transient_sstore() -> EthMultiStore {
|
|||||||
|
|
||||||
impl AccountProvider {
|
impl AccountProvider {
|
||||||
/// Creates new account provider.
|
/// Creates new account provider.
|
||||||
pub fn new(sstore: Box<SecretStore>, settings: AccountProviderSettings) -> Self {
|
pub fn new(sstore: Box<dyn SecretStore>, settings: AccountProviderSettings) -> Self {
|
||||||
if let Ok(accounts) = sstore.accounts() {
|
if let Ok(accounts) = sstore.accounts() {
|
||||||
for account in accounts.into_iter().filter(|a| settings.blacklisted_accounts.contains(&a.address)) {
|
for account in accounts.into_iter().filter(|a| settings.blacklisted_accounts.contains(&a.address)) {
|
||||||
warn!("Local Account {} has a blacklisted (known to be weak) address and will be ignored",
|
warn!("Local Account {} has a blacklisted (known to be weak) address and will be ignored",
|
||||||
@@ -503,7 +503,7 @@ impl AccountProvider {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::{AccountProvider, Unlock};
|
use super::{AccountProvider, Unlock};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use ethkey::{Generator, Random, Address};
|
use parity_crypto::publickey::{Generator, Random, Address};
|
||||||
use ethstore::{StoreAccountRef, Derivation};
|
use ethstore::{StoreAccountRef, Derivation};
|
||||||
use ethereum_types::H256;
|
use ethereum_types::H256;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -20,7 +20,7 @@ use std::{fs, fmt, hash, ops};
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use ethkey::Address;
|
use parity_crypto::publickey::Address;
|
||||||
use log::{trace, warn};
|
use log::{trace, warn};
|
||||||
|
|
||||||
use crate::AccountMeta;
|
use crate::AccountMeta;
|
||||||
@@ -130,7 +130,7 @@ impl<K: hash::Hash + Eq, V> DiskMap<K, V> {
|
|||||||
trace!(target: "diskmap", "revert {:?}", self.path);
|
trace!(target: "diskmap", "revert {:?}", self.path);
|
||||||
let _ = fs::File::open(self.path.clone())
|
let _ = fs::File::open(self.path.clone())
|
||||||
.map_err(|e| trace!(target: "diskmap", "Couldn't open disk map: {}", e))
|
.map_err(|e| trace!(target: "diskmap", "Couldn't open disk map: {}", e))
|
||||||
.and_then(|f| read(f).map_err(|e| warn!(target: "diskmap", "Couldn't read disk map: {}", e)))
|
.and_then(|f| read(f).map_err(|e| warn!(target: "diskmap", "Couldn't read disk map at: {:?} {}", self.path, e)))
|
||||||
.and_then(|m| {
|
.and_then(|m| {
|
||||||
self.cache = m;
|
self.cache = m;
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -144,9 +144,9 @@ impl<K: hash::Hash + Eq, V> DiskMap<K, V> {
|
|||||||
if self.transient { return; }
|
if self.transient { return; }
|
||||||
trace!(target: "diskmap", "save {:?}", self.path);
|
trace!(target: "diskmap", "save {:?}", self.path);
|
||||||
let _ = fs::File::create(self.path.clone())
|
let _ = fs::File::create(self.path.clone())
|
||||||
.map_err(|e| warn!(target: "diskmap", "Couldn't open disk map for writing: {}", e))
|
.map_err(|e| warn!(target: "diskmap", "Couldn't open disk map for writing at: {:?} {}", self.path, e))
|
||||||
.and_then(|mut f| {
|
.and_then(|mut f| {
|
||||||
write(&self.cache, &mut f).map_err(|e| warn!(target: "diskmap", "Couldn't write to disk map: {}", e))
|
write(&self.cache, &mut f).map_err(|e| warn!(target: "diskmap", "Couldn't write to disk map at: {:?} {}", self.path, e))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ version = "1.4.0"
|
|||||||
authors = ["Parity <admin@parity.io>"]
|
authors = ["Parity <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
futures = "0.1"
|
futures = "0.1"
|
||||||
rpassword = "1.0"
|
rpassword = "1.0"
|
||||||
parity-rpc = { path = "../rpc" }
|
parity-rpc = { path = "../rpc" }
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ version = "1.4.0"
|
|||||||
authors = ["Parity <admin@parity.io>"]
|
authors = ["Parity <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
futures = "0.1"
|
futures = "0.1"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
url = "1.2.0"
|
url = "2.1.0"
|
||||||
matches = "0.1"
|
matches = "0.1"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.9"
|
||||||
jsonrpc-core = "12.0.0"
|
jsonrpc-core = "14.0.3"
|
||||||
jsonrpc-ws-server = "12.0.0"
|
jsonrpc-ws-server = "14.0.3"
|
||||||
parity-rpc = { path = "../../rpc" }
|
parity-rpc = { path = "../../rpc" }
|
||||||
keccak-hash = "0.2.0"
|
keccak-hash = "0.4.0"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -36,7 +36,7 @@ extern crate log;
|
|||||||
extern crate matches;
|
extern crate matches;
|
||||||
|
|
||||||
/// Boxed future response.
|
/// Boxed future response.
|
||||||
pub type BoxFuture<T, E> = Box<futures::Future<Item=T, Error=E> + Send>;
|
pub type BoxFuture<T, E> = Box<dyn futures::Future<Item=T, Error=E> + Send>;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
220
docs/CHANGELOG-2.5.md
Normal file
220
docs/CHANGELOG-2.5.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
## Parity-Ethereum [v2.5.13](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.13)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.13-stable is a security release. Valid blocks with manipulated transactions (added/replaced) cause the client to stall.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* Make sure to not mark block header hash as invalid if only the body is wrong (#11356)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.12](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.12)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.12-stable is a patch release that adds Istanbul hardfork
|
||||||
|
block numbers for POA and xDai networks, implements ECIP-1056 and implements
|
||||||
|
EIP-2384/2387 - Muir Glacier.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* Enable EIP-2384 for ice age hard fork (#11281)
|
||||||
|
* ethcore/res: activate agharta on classic 9573000 (#11331)
|
||||||
|
* Istanbul HF in xDai (2019-12-12) (#11299)
|
||||||
|
* Istanbul HF in POA Core (2019-12-19) (#11298)
|
||||||
|
* Istanbul HF in POA Sokol (2019-12-05) (#11282)
|
||||||
|
* Activate ecip-1061 on kotti and mordor (#11338)
|
||||||
|
* Enable basic verification of local transactions (#11332)
|
||||||
|
* Disallow EIP-86 style null signatures for transactions outside tests (#11335)
|
||||||
|
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.11](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.11)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.11-stable is an emergency patch release that adds the missing
|
||||||
|
eip1344_transition for mainnet - Users are advised to update as soon as possible
|
||||||
|
to prevent any issues with the imminent Istanbul hardfork
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
- [chainspec]: add `eip1344_transition` for istanbul (#11301)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.10](https://github.com/paritytech/parity-ethereum/releases/tag/2.5.10)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.10-stable is a patch release that adds block numbers for
|
||||||
|
activating the Istanbul hardfork on mainnet, as well as a large number of
|
||||||
|
various bugfixes, QoL changes, some code cleanup/refactoring and other
|
||||||
|
miscellaneous changes.
|
||||||
|
|
||||||
|
This release removes legacy aliases for the mainnet. If you specify `--chain homestead`, `--chain frontier` or `--chain byzantium`, this will need to be changed to one of: `--chain eth`, `--chain ethereum`, `--chain foundation` or `--chain mainnet`.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* ropsten #6631425 foundation #8798209 (#11201)
|
||||||
|
* [stable] builtin, istanbul and mordor testnet backports (#11234)
|
||||||
|
* ethcore-builtin (#10850)
|
||||||
|
* [builtin]: support `multiple prices and activations` in chain spec (#11039)
|
||||||
|
* [chain specs]: activate `Istanbul` on mainnet (#11228)
|
||||||
|
* ethcore/res: add mordor testnet configuration (#11200)
|
||||||
|
* Update list of bootnodes for xDai chain (#11236)
|
||||||
|
* ethcore: remove `test-helper feat` from build (#11047)
|
||||||
|
* Secret store: fix Instant::now() related race in net_keep_alive (#11155) (#11159)
|
||||||
|
* [stable]: backport #10691 and #10683 (#11143)
|
||||||
|
* Fix compiler warning (that will become an error) (#10683)
|
||||||
|
* Refactor Clique stepping (#10691)
|
||||||
|
* Add Constantinople eips to the dev (instant_seal) config (#10809)
|
||||||
|
* Add cargo-remote dir to .gitignore (?)
|
||||||
|
* Insert explicit warning into the panic hook (#11225)
|
||||||
|
* Fix docker centos build (#11226)
|
||||||
|
* Update MIX bootnodes. (#11203)
|
||||||
|
* Use provided usd-per-eth value if an endpoint is specified (#11209)
|
||||||
|
* Add new line after writing block to hex file. (#10984)
|
||||||
|
* Type annotation for next_key() matching of json filter options (#11192) (but no `FilterOption` in 2.5 so…)
|
||||||
|
* Upgrade jsonrpc to latest (#11206)
|
||||||
|
* [CI] check evmbin build (#11096)
|
||||||
|
* Correct EIP-712 encoding (#11092)
|
||||||
|
* [client]: Fix for incorrectly dropped consensus messages (#11086)
|
||||||
|
* Fix block detail updating (#11015)
|
||||||
|
* Switching sccache from local to Redis (#10971)
|
||||||
|
* Made ecrecover implementation trait public (#11188)
|
||||||
|
* [dependencies]: jsonrpc `14.0.1` (#11183)
|
||||||
|
* [receipt]: add `sender` & `receiver` to `RichReceipts` (#11179)
|
||||||
|
* [ethcore/builtin]: do not panic in blake2pricer on short input (#11180)
|
||||||
|
* util Host: fix a double Read Lock bug in fn Host::session_readable() (#11175)
|
||||||
|
* ethcore client: fix a double Read Lock bug in fn Client::logs() (#11172)
|
||||||
|
* Change how RPCs eth_call and eth_estimateGas handle "Pending" (#11127)
|
||||||
|
* Cleanup stratum a bit (#11161)
|
||||||
|
* Upgrade to jsonrpc v14 (#11151)
|
||||||
|
* SecretStore: expose restore_key_public in HTTP API (#10241)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.9](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.9)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.9-stable is a patch release that adds the block numbers for activating the Istanbul hardfork on test networks: Ropsten, Görli, Rinkeby and Kovan.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* ethcore/res: activate Istanbul on Ropsten, Görli, Rinkeby, Kovan (#11068)
|
||||||
|
* [json-spec] make blake2 pricing spec more readable (#11034)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.8](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.8)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.8-stable is a patch release that improves security, stability and performance.
|
||||||
|
|
||||||
|
* The most noteworthy improvement in this release is incorporating all the EIPs required for the Istanbul hard fork.
|
||||||
|
* This release also fixes certain security and performance issues, one of which was suspected to be consensus-threatening but turned out to be benign. Thanks to Martin Holst Swende and Felix Lange from the Ethereum Foundation for bringing the suspicious issue to our attention.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* add more tx tests (#11038)
|
||||||
|
* Fix parallel transactions race-condition (#10995)
|
||||||
|
* Add blake2_f precompile (#11017)
|
||||||
|
* [trace] introduce trace failed to Ext (#11019)
|
||||||
|
* Edit publish-onchain.sh to use https (#11016)
|
||||||
|
* Fix deadlock in network-devp2p (#11013)
|
||||||
|
* EIP 1108: Reduce alt_bn128 precompile gas costs (#11008)
|
||||||
|
* xDai chain support and nodes list update (#10989)
|
||||||
|
* EIP 2028: transaction gas lowered from 68 to 16 (#10987)
|
||||||
|
* EIP-1344 Add CHAINID op-code (#10983)
|
||||||
|
* manual publish jobs for releases, no changes for nightlies (#10977)
|
||||||
|
* [blooms-db] Fix benchmarks (#10974)
|
||||||
|
* Verify transaction against its block during import (#10954)
|
||||||
|
* Better error message for rpc gas price errors (#10931)
|
||||||
|
* tx-pool: accept local tx with higher gas price when pool full (#10901)
|
||||||
|
* Fix fork choice (#10837)
|
||||||
|
* Cleanup unused vm dependencies (#10787)
|
||||||
|
* Fix compilation on recent nightlies (#10991)
|
||||||
|
* Don't build rpc with ethcore test-helpers (#11048)
|
||||||
|
* EIP 1884 Re-pricing of trie-size dependent operations (#10992)
|
||||||
|
* Implement EIP-1283 reenable transition, EIP-1706 and EIP-2200 (#10191)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.7](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.7)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.7-stable is a bugfix release that fixes a potential DoS attack in the trace_call RPC method. This is a critical upgrade for anyone running Parity nodes with RPC exposed to the public internet (and highly recommended for anyone else). For details see this blog post.
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.6](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.6)
|
||||||
|
|
||||||
|
Parity-Ethereum v2.5.6-stable is a bugfix release that improves stability.
|
||||||
|
|
||||||
|
* Allow specifying hostnames for node URLs
|
||||||
|
* Fix a bug where archive nodes were losing peers
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* Kaspersky AV whitelisting (#10919)
|
||||||
|
* Avast whitelist script (#10900)
|
||||||
|
* Docker images renaming (#10863)
|
||||||
|
* Remove excessive warning (#10831)
|
||||||
|
* Allow --nat extip:your.host.here.org (#10830)
|
||||||
|
* When updating the client or when called from RPC, sleep should mean sleep (#10814)
|
||||||
|
* added new ropsten-bootnode and removed old one (#10794)
|
||||||
|
* ethkey no longer uses byteorder (#10786)
|
||||||
|
* Do not drop the peer with None difficulty (#10772)
|
||||||
|
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions (#10652)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.5](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.5)
|
||||||
|
|
||||||
|
Parity-Ethereum v2.5.5-stable is a minor release that improves performance and stability.
|
||||||
|
This release stabilises the 2.5 branch.
|
||||||
|
|
||||||
|
As of today, Parity-Ethereum 2.4 reaches end of life and everyone is
|
||||||
|
encouraged to upgrade.
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.4](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.4)
|
||||||
|
|
||||||
|
Parity Ethereum v2.5.4-beta is a security update that addresses servo/rust-smallvec#148
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* cargo update -p smallvec ([#10822](https://github.com/paritytech/parity-ethereum/pull/10822))
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.3](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.3)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.5.3-beta is a bugfix release that improves performance and stability.
|
||||||
|
|
||||||
|
* EthereumClassic: activate the Atlantis Hardfork
|
||||||
|
* Clique: fix time overflow
|
||||||
|
* State tests: treat empty accounts the same as non-existant accounts (EIP 1052)
|
||||||
|
* Networking: support discovery-only peers (geth bootnodes)
|
||||||
|
* Snapshotting: fix unclean shutdown while snappshotting is under way
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* ethcore/res: activate atlantis classic hf on block 8772000 ([#10766](https://github.com/paritytech/parity-ethereum/pull/10766))
|
||||||
|
* fix docker tags for publishing ([#10741](https://github.com/paritytech/parity-ethereum/pull/10741))
|
||||||
|
* fix: aura don't add `SystemTime::now()` ([#10720](https://github.com/paritytech/parity-ethereum/pull/10720))
|
||||||
|
* Treat empty account the same as non-exist accounts in EIP-1052 ([#10775](https://github.com/paritytech/parity-ethereum/pull/10775))
|
||||||
|
* DevP2p: Get node IP address and udp port from Socket, if not included in PING packet ([#10705](https://github.com/paritytech/parity-ethereum/pull/10705))
|
||||||
|
* Add a way to signal shutdown to snapshotting threads ([#10744](https://github.com/paritytech/parity-ethereum/pull/10744))
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.2](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.2)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.5.2-beta is a bugfix release that improves performance and stability.
|
||||||
|
|
||||||
|
Among others, it enables the _Atlantis_ hardfork on **Morden** and **Kotti** Classic networks.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* [CI] allow cargo audit to fail ([#10676](https://github.com/paritytech/parity-ethereum/pull/10676))
|
||||||
|
* Reset blockchain properly ([#10669](https://github.com/paritytech/parity-ethereum/pull/10669))
|
||||||
|
* new image ([#10673](https://github.com/paritytech/parity-ethereum/pull/10673))
|
||||||
|
* Update publishing ([#10644](https://github.com/paritytech/parity-ethereum/pull/10644))
|
||||||
|
* enable lto for release builds ([#10717](https://github.com/paritytech/parity-ethereum/pull/10717))
|
||||||
|
* Use RUSTFLAGS to set the optimization level ([#10719](https://github.com/paritytech/parity-ethereum/pull/10719))
|
||||||
|
* ethcore: enable ECIP-1054 for classic ([#10731](https://github.com/paritytech/parity-ethereum/pull/10731))
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.1)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.5.1-beta is a bugfix release that improves performance and stability.
|
||||||
|
|
||||||
|
Among others, it enables the Petersburg hardfork on **Rinkeby** and **POA-Core** Network, as well as the **Kovan** Network community hardfork.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* ci: publish docs debug ([#10638](https://github.com/paritytech/parity-ethereum/pull/10638))
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.5.0](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.0)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.5.0-beta is a minor release that improves performance and stabilizes the 2.5 branch by marking it as beta release.
|
||||||
|
|
||||||
|
- This release adds support for the Clique consensus engine ([#9981](https://github.com/paritytech/parity-ethereum/pull/9981))
|
||||||
|
- This enables Parity-Ethereum users to use the Görli, the Kotti Classic, and the legacy Rinkeby testnet. To get started try `parity --chain goerli`; note that light client support is currently not yet fully functional.
|
||||||
|
- This release removes the dead chain configs for Easthub and Ethereum Social ([#10531](https://github.com/paritytech/parity-ethereum/pull/10531))
|
||||||
|
|
||||||
|
As of today, Parity-Ethereum 2.3 reaches end of life and everyone is encouraged to upgrade.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* fix(light cull): poll light cull instead of timer ([#10559](https://github.com/paritytech/parity-ethereum/pull/10559))
|
||||||
|
|
||||||
307
docs/CHANGELOG-2.6.md
Normal file
307
docs/CHANGELOG-2.6.md
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
## Parity-Ethereum [v2.6.8](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.8)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.8-beta is a security release. Valid blocks with manipulated transactions (added/replaced) cause the client to stall.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* Make sure to not mark block header hash as invalid if only the body is wrong (#11356)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.7](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.7)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.7-beta is a patch release that adds Istanbul hardfork
|
||||||
|
block numbers for POA and xDai networks, implements ECIP-1056 and implements
|
||||||
|
EIP-2384/2387 - Muir Glacier.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* Enable EIP-2384 for ice age hard fork (#11281)
|
||||||
|
* ethcore/res: activate agharta on classic 9573000 (#11331)
|
||||||
|
* Istanbul HF in xDai (2019-12-12) (#11299)
|
||||||
|
* Istanbul HF in POA Core (2019-12-19) (#11298)
|
||||||
|
* Istanbul HF in POA Sokol (2019-12-05) (#11282)
|
||||||
|
* Activate ecip-1061 on kotti and mordor (#11338)
|
||||||
|
* Enable basic verification of local transactions (#11332)
|
||||||
|
* Disallow EIP-86 style null signatures for transactions outside tests (#11335)
|
||||||
|
* SecretStore database migration to v4 (#11322)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.6](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.6)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.6-beta is an emergency patch release that adds the missing
|
||||||
|
eip1344_transition for mainnet - Users are advised to update as soon as possible
|
||||||
|
to prevent any issues with the imminent Istanbul hardfork
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* [chainspec]: add `eip1344_transition` for istanbul (#11301)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.5](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.5)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.5-beta is a patch release that adds block numbers for activating the Istanbul hardfork on mainnet, as well as a large number of various bugfixes, QoL changes, some code cleanup/refactoring and other miscellaneous changes.
|
||||||
|
|
||||||
|
This release removes legacy aliases for the mainnet. If you specify `--chain homestead`, `--chain frontier` or `--chain byzantium`, this will need to be changed to one of: `--chain eth`, `--chain ethereum`, `--chain foundation` or `--chain mainnet`.
|
||||||
|
|
||||||
|
This release includes important changes to how snapshots are produced. The size of the Ethereum account state means that producing a snapshot takes a long while; most nodes today are not able to finish before the relevant state is pruned. Starting with v2.6.5, pruning is paused while a snapshot is underway, hopefully fixing the current dearth of recent snapshots. The downside to this is that memory usage goes up while a snapshot is produced.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* [CI] check evmbin build (#11096)
|
||||||
|
* Correct EIP-712 encoding (#11092)
|
||||||
|
* [client]: Fix for incorrectly dropped consensus messages (#11082) (#11086)
|
||||||
|
* Update hardcoded headers (foundation, classic, kovan, xdai, ewc, ...) (#11053)
|
||||||
|
* Add cargo-remote dir to .gitignore (?)
|
||||||
|
* Update light client headers: ropsten 6631425 foundation 8798209 (#11201)
|
||||||
|
* Update list of bootnodes for xDai chain (#11236)
|
||||||
|
* ethcore/res: add mordor testnet configuration (#11200)
|
||||||
|
* [chain specs]: activate Istanbul on mainnet (#11228)
|
||||||
|
* [builtin]: support multiple prices and activations in chain spec (#11039)
|
||||||
|
* [receipt]: add sender & receiver to RichReceipts (#11179)
|
||||||
|
* [ethcore/builtin]: do not panic in blake2pricer on short input (#11180)
|
||||||
|
* Made ecrecover implementation trait public (#11188)
|
||||||
|
* Fix docker centos build (#11226)
|
||||||
|
* Update MIX bootnodes. (#11203)
|
||||||
|
* Insert explicit warning into the panic hook (#11225)
|
||||||
|
* Use provided usd-per-eth value if an endpoint is specified (#11209)
|
||||||
|
* Cleanup stratum a bit (#11161)
|
||||||
|
* Add Constantinople EIPs to the dev (instant_seal) config (#10809) (already backported)
|
||||||
|
* util Host: fix a double Read Lock bug in fn Host::session_readable() (#11175)
|
||||||
|
* ethcore client: fix a double Read Lock bug in fn Client::logs() (#11172)
|
||||||
|
* Type annotation for next_key() matching of json filter options (#11192)
|
||||||
|
* Upgrade jsonrpc to latest (#11206)
|
||||||
|
* [dependencies]: jsonrpc 14.0.1 (#11183)
|
||||||
|
* Upgrade to jsonrpc v14 (#11151)
|
||||||
|
* Switching sccache from local to Redis (#10971)
|
||||||
|
* Snapshot restoration overhaul (#11219)
|
||||||
|
* Add new line after writing block to hex file. (#10984)
|
||||||
|
* Pause pruning while snapshotting (#11178)
|
||||||
|
* Change how RPCs eth_call and eth_estimateGas handle "Pending" (#11127)
|
||||||
|
* Fix block detail updating (#11015)
|
||||||
|
* Make InstantSeal Instant again #11186
|
||||||
|
* Filter out some bad ropsten warp snapshots (#11247)
|
||||||
|
* Allow default block parameter to be blockHash (#10932)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.4](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.4)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.4-stable is a patch release that adds the block numbers for activating the Istanbul hardfork on test networks: Ropsten, Görli, Rinkeby and Kovan.
|
||||||
|
|
||||||
|
A full list of included changes:
|
||||||
|
|
||||||
|
* ethcore/res: activate Istanbul on Ropsten, Görli, Rinkeby, Kovan (#11068)
|
||||||
|
* cleanup json crate (#11027)
|
||||||
|
* [json-spec] make blake2 pricing spec more readable (#11034)
|
||||||
|
* Update JSON tests to d4f86ecf4aa7c (#11054)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.3](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.3)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.3-stable is a patch release that improves security, stability and performance.
|
||||||
|
|
||||||
|
* The most noteworthy improvement in this release is incorporating all the EIPs required for the Istanbul hard fork.
|
||||||
|
* This release also fixes certain security and performance issues, one of which was suspected to be consensus-threatening but turned out to be benign. Thanks to Martin Holst Swende and Felix Lange from the Ethereum Foundation for bringing the suspicious issue to our attention.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
|
||||||
|
* add more tx tests (#11038)
|
||||||
|
* Fix parallel transactions race-condition (#10995)
|
||||||
|
* Add blake2_f precompile (#11017)
|
||||||
|
* [trace] introduce trace failed to Ext (#11019)
|
||||||
|
* Edit publish-onchain.sh to use https (#11016)
|
||||||
|
* Fix deadlock in network-devp2p (#11013)
|
||||||
|
* EIP 1108: Reduce alt_bn128 precompile gas costs (#11008)
|
||||||
|
* xDai chain support and nodes list update (#10989)
|
||||||
|
* EIP 2028: transaction gas lowered from 68 to 16 (#10987)
|
||||||
|
* EIP-1344 Add CHAINID op-code (#10983)
|
||||||
|
* manual publish jobs for releases, no changes for nightlies (#10977)
|
||||||
|
* [blooms-db] Fix benchmarks (#10974)
|
||||||
|
* Verify transaction against its block during import (#10954)
|
||||||
|
* Better error message for rpc gas price errors (#10931)
|
||||||
|
* Fix fork choice (#10837)
|
||||||
|
* Fix compilation on recent nightlies (#10991)
|
||||||
|
* Don't build rpc with ethcore test-helpers (#11048)
|
||||||
|
* EIP 1884 Re-pricing of trie-size dependent operations (#10992)
|
||||||
|
* Implement EIP-1283 reenable transition, EIP-1706 and EIP-2200 (#10191)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.2](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.2)
|
||||||
|
|
||||||
|
Parity Ethereum v2.6.2-stable is a bugfix release that fixes a potential DoS attack in the trace_call RPC method. This is a critical upgrade for anyone running Parity nodes with RPC exposed to the public internet (and highly recommended for anyone else). For details see this blog post.
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.1](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.1)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.6.1-beta is a patch release that improves stability.
|
||||||
|
|
||||||
|
This release includes:
|
||||||
|
* Allow specifying hostnames for node URLs
|
||||||
|
* Fix a bug where archive nodes were losing peers
|
||||||
|
* Add support for Energy Web Foundations new chains 'Volta' and 'EWC', and remove their deprecated 'Tobalaba' chain.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* Add support for Energy Web Foundation's new chains (#10957)
|
||||||
|
* Kaspersky AV whitelisting (#10919)
|
||||||
|
* Avast whitelist script (#10900)
|
||||||
|
* Docker images renaming (#10863)
|
||||||
|
* Remove excessive warning (#10831)
|
||||||
|
* Allow --nat extip:your.host.here.org (#10830)
|
||||||
|
* When updating the client or when called from RPC, sleep should mean sleep (#10814)
|
||||||
|
* added new ropsten-bootnode and removed old one (#10794)
|
||||||
|
* ethkey no longer uses byteorder (#10786)
|
||||||
|
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions (#10652)
|
||||||
|
|
||||||
|
## Parity-Ethereum [v2.6.0](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.0)
|
||||||
|
|
||||||
|
Parity-Ethereum 2.6.0-beta is a minor release that stabilizes the 2.6 branch by
|
||||||
|
marking it as a beta release.
|
||||||
|
|
||||||
|
This release includes:
|
||||||
|
* Major refactoring of the codebase
|
||||||
|
* Many bugfixes
|
||||||
|
* Significant improvements to logging, error and warning message clarity.
|
||||||
|
* SecretStore: remove support of old database formats (#10757)
|
||||||
|
* This is a potentially breaking change if you have not upgraded for
|
||||||
|
quite some time.
|
||||||
|
|
||||||
|
As of today, Parity-Ethereum 2.4 reaches end of life, and everyone is
|
||||||
|
encouraged to upgrade.
|
||||||
|
|
||||||
|
The full list of included changes:
|
||||||
|
* update jsonrpc to 12.0 ([#10841](https://github.com/paritytech/parity-ethereum/pull/10841))
|
||||||
|
* Move more code into state-account ([#10840](https://github.com/paritytech/parity-ethereum/pull/10840))
|
||||||
|
* Extract AccountDB to account-db ([#10839](https://github.com/paritytech/parity-ethereum/pull/10839))
|
||||||
|
* Extricate PodAccount and state Account to own crates ([#10838](https://github.com/paritytech/parity-ethereum/pull/10838))
|
||||||
|
* Fix fork choice ([#10837](https://github.com/paritytech/parity-ethereum/pull/10837))
|
||||||
|
* tests: Relates to #10655: Test instructions for Readme ([#10835](https://github.com/paritytech/parity-ethereum/pull/10835))
|
||||||
|
* idiomatic changes to PodState ([#10834](https://github.com/paritytech/parity-ethereum/pull/10834))
|
||||||
|
* Break circular dependency between Client and Engine (part 1) ([#10833](https://github.com/paritytech/parity-ethereum/pull/10833))
|
||||||
|
* Remove excessive warning ([#10831](https://github.com/paritytech/parity-ethereum/pull/10831))
|
||||||
|
* Allow --nat extip:your.host.here.org ([#10830](https://github.com/paritytech/parity-ethereum/pull/10830))
|
||||||
|
* ethcore does not use byteorder ([#10829](https://github.com/paritytech/parity-ethereum/pull/10829))
|
||||||
|
* Fix typo in README.md ([#10828](https://github.com/paritytech/parity-ethereum/pull/10828))
|
||||||
|
* Update wordlist to v1.3 ([#10823](https://github.com/paritytech/parity-ethereum/pull/10823))
|
||||||
|
* bump `smallvec 0.6.10` to fix vulnerability ([#10822](https://github.com/paritytech/parity-ethereum/pull/10822))
|
||||||
|
* removed additional_params method ([#10818](https://github.com/paritytech/parity-ethereum/pull/10818))
|
||||||
|
* Improve logging when remote peer is unknown ([#10817](https://github.com/paritytech/parity-ethereum/pull/10817))
|
||||||
|
* replace memzero with zeroize crate ([#10816](https://github.com/paritytech/parity-ethereum/pull/10816))
|
||||||
|
* When updating the client or when called from RPC, sleep should mean sleep ([#10814](https://github.com/paritytech/parity-ethereum/pull/10814))
|
||||||
|
* Don't reimplement the logic from the Default impl ([#10813](https://github.com/paritytech/parity-ethereum/pull/10813))
|
||||||
|
* refactor: whisper: Add type aliases and update rustdocs in message.rs ([#10812](https://github.com/paritytech/parity-ethereum/pull/10812))
|
||||||
|
* test: whisper/cli `add invalid pool size test depending on processor` ([#10811](https://github.com/paritytech/parity-ethereum/pull/10811))
|
||||||
|
* Add Constantinople EIPs to the dev (instant_seal) config ([#10809](https://github.com/paritytech/parity-ethereum/pull/10809))
|
||||||
|
* fix spurious test failure ([#10808](https://github.com/paritytech/parity-ethereum/pull/10808))
|
||||||
|
* revert temp changes to .gitlab-ci.yml ([#10807](https://github.com/paritytech/parity-ethereum/pull/10807))
|
||||||
|
* removed redundant fmt::Display implementations ([#10806](https://github.com/paritytech/parity-ethereum/pull/10806))
|
||||||
|
* removed EthEngine alias ([#10805](https://github.com/paritytech/parity-ethereum/pull/10805))
|
||||||
|
* ethcore-bloom-journal updated to 2018 ([#10804](https://github.com/paritytech/parity-ethereum/pull/10804))
|
||||||
|
* Fix a few typos and unused warnings. ([#10803](https://github.com/paritytech/parity-ethereum/pull/10803))
|
||||||
|
* updated price-info to edition 2018 ([#10801](https://github.com/paritytech/parity-ethereum/pull/10801))
|
||||||
|
* updated parity-local-store to edition 2018 ([#10800](https://github.com/paritytech/parity-ethereum/pull/10800))
|
||||||
|
* updated project to ansi_term 0.11 ([#10799](https://github.com/paritytech/parity-ethereum/pull/10799))
|
||||||
|
* ethcore-light uses bincode 1.1 ([#10798](https://github.com/paritytech/parity-ethereum/pull/10798))
|
||||||
|
* ethcore-network-devp2p uses igd 0.9 ([#10797](https://github.com/paritytech/parity-ethereum/pull/10797))
|
||||||
|
* Better logging when backfilling ancient blocks fail ([#10796](https://github.com/paritytech/parity-ethereum/pull/10796))
|
||||||
|
* added new ropsten-bootnode and removed old one ([#10794](https://github.com/paritytech/parity-ethereum/pull/10794))
|
||||||
|
* Removed machine abstraction from ethcore ([#10791](https://github.com/paritytech/parity-ethereum/pull/10791))
|
||||||
|
* Removed redundant ethcore-service error type ([#10788](https://github.com/paritytech/parity-ethereum/pull/10788))
|
||||||
|
* Cleanup unused vm dependencies ([#10787](https://github.com/paritytech/parity-ethereum/pull/10787))
|
||||||
|
* ethkey no longer uses byteorder ([#10786](https://github.com/paritytech/parity-ethereum/pull/10786))
|
||||||
|
* Updated blooms-db to rust 2018 and removed redundant deps ([#10785](https://github.com/paritytech/parity-ethereum/pull/10785))
|
||||||
|
* Treat empty account the same as non-exist accounts in EIP-1052 ([#10775](https://github.com/paritytech/parity-ethereum/pull/10775))
|
||||||
|
* Do not drop the peer with None difficulty ([#10772](https://github.com/paritytech/parity-ethereum/pull/10772))
|
||||||
|
* EIP-1702: Generalized Account Versioning Scheme ([#10771](https://github.com/paritytech/parity-ethereum/pull/10771))
|
||||||
|
* Move Engine::register_client to be before other I/O handler registration ([#10767](https://github.com/paritytech/parity-ethereum/pull/10767))
|
||||||
|
* ethcore/res: activate atlantis classic hf on block 8772000 ([#10766](https://github.com/paritytech/parity-ethereum/pull/10766))
|
||||||
|
* Updated Bn128PairingImpl to use optimized batch pairing ([#10765](https://github.com/paritytech/parity-ethereum/pull/10765))
|
||||||
|
* Remove unused code ([#10762](https://github.com/paritytech/parity-ethereum/pull/10762))
|
||||||
|
* Initialize private tx logger only if private tx functionality is enabled ([#10758](https://github.com/paritytech/parity-ethereum/pull/10758))
|
||||||
|
* SecretStore: remove support of old database formats ([#10757](https://github.com/paritytech/parity-ethereum/pull/10757))
|
||||||
|
* Enable aesni ([#10756](https://github.com/paritytech/parity-ethereum/pull/10756))
|
||||||
|
* updater: fix static id hashes initialization ([#10755](https://github.com/paritytech/parity-ethereum/pull/10755))
|
||||||
|
* Use fewer threads for snapshotting ([#10752](https://github.com/paritytech/parity-ethereum/pull/10752))
|
||||||
|
* Die error_chain, die ([#10747](https://github.com/paritytech/parity-ethereum/pull/10747))
|
||||||
|
* Fix deprectation warnings on nightly ([#10746](https://github.com/paritytech/parity-ethereum/pull/10746))
|
||||||
|
* Improve logging and cleanup in miner around block sealing ([#10745](https://github.com/paritytech/parity-ethereum/pull/10745))
|
||||||
|
* Add a way to signal shutdown to snapshotting threads ([#10744](https://github.com/paritytech/parity-ethereum/pull/10744))
|
||||||
|
* fix docker tags for publishing ([#10741](https://github.com/paritytech/parity-ethereum/pull/10741))
|
||||||
|
* refactor: Fix indentation in ethjson ([#10740](https://github.com/paritytech/parity-ethereum/pull/10740))
|
||||||
|
* Log validator set changes in EpochManager ([#10734](https://github.com/paritytech/parity-ethereum/pull/10734))
|
||||||
|
* Print warnings when using dangerous settings for ValidatorSet ([#10733](https://github.com/paritytech/parity-ethereum/pull/10733))
|
||||||
|
* ethcore: enable ECIP-1054 for classic ([#10731](https://github.com/paritytech/parity-ethereum/pull/10731))
|
||||||
|
* Stop breaking out of loop if a non-canonical hash is found ([#10729](https://github.com/paritytech/parity-ethereum/pull/10729))
|
||||||
|
* Removed secret_store folder ([#10722](https://github.com/paritytech/parity-ethereum/pull/10722))
|
||||||
|
* Revert "enable lto for release builds (#10717)" ([#10721](https://github.com/paritytech/parity-ethereum/pull/10721))
|
||||||
|
* fix: aura don't add `SystemTime::now()` ([#10720](https://github.com/paritytech/parity-ethereum/pull/10720))
|
||||||
|
* Use RUSTFLAGS to set the optimization level ([#10719](https://github.com/paritytech/parity-ethereum/pull/10719))
|
||||||
|
* enable lto for release builds ([#10717](https://github.com/paritytech/parity-ethereum/pull/10717))
|
||||||
|
* [devp2p] Update to 2018 edition ([#10716](https://github.com/paritytech/parity-ethereum/pull/10716))
|
||||||
|
* [devp2p] Don't use `rust-crypto` ([#10714](https://github.com/paritytech/parity-ethereum/pull/10714))
|
||||||
|
* [devp2p] Fix warnings and re-org imports ([#10710](https://github.com/paritytech/parity-ethereum/pull/10710))
|
||||||
|
* DevP2p: Get node IP address and udp port from Socket, if not included in PING packet ([#10705](https://github.com/paritytech/parity-ethereum/pull/10705))
|
||||||
|
* introduce MissingParent Error, fixes #10699 ([#10700](https://github.com/paritytech/parity-ethereum/pull/10700))
|
||||||
|
* Refactor Clique stepping ([#10691](https://github.com/paritytech/parity-ethereum/pull/10691))
|
||||||
|
* add_sync_notifier in EthPubSubClient holds on to a Client for too long ([#10689](https://github.com/paritytech/parity-ethereum/pull/10689))
|
||||||
|
* Fix compiler warning (that will become an error) ([#10683](https://github.com/paritytech/parity-ethereum/pull/10683))
|
||||||
|
* Don't panic if extra_data is longer than VANITY_LENGTH ([#10682](https://github.com/paritytech/parity-ethereum/pull/10682))
|
||||||
|
* Remove annoying compiler warnings ([#10679](https://github.com/paritytech/parity-ethereum/pull/10679))
|
||||||
|
* Remove support for hardware wallets ([#10678](https://github.com/paritytech/parity-ethereum/pull/10678))
|
||||||
|
* [CI] allow cargo audit to fail ([#10676](https://github.com/paritytech/parity-ethereum/pull/10676))
|
||||||
|
* new image ([#10673](https://github.com/paritytech/parity-ethereum/pull/10673))
|
||||||
|
* Upgrade ethereum types ([#10670](https://github.com/paritytech/parity-ethereum/pull/10670))
|
||||||
|
* Reset blockchain properly ([#10669](https://github.com/paritytech/parity-ethereum/pull/10669))
|
||||||
|
* fix: Move PR template into .github/ folder ([#10663](https://github.com/paritytech/parity-ethereum/pull/10663))
|
||||||
|
* docs: evmbin - Update Rust docs ([#10658](https://github.com/paritytech/parity-ethereum/pull/10658))
|
||||||
|
* refactor: Related #9459 - evmbin: replace untyped json! macro with fully typed serde serialization using Rust structs ([#10657](https://github.com/paritytech/parity-ethereum/pull/10657))
|
||||||
|
* docs: Add PR template ([#10654](https://github.com/paritytech/parity-ethereum/pull/10654))
|
||||||
|
* docs: Add ProgPoW Rust docs to ethash module ([#10653](https://github.com/paritytech/parity-ethereum/pull/10653))
|
||||||
|
* docs: Update Readme with TOC, Contributor Guideline. Update Cargo package descriptions ([#10652](https://github.com/paritytech/parity-ethereum/pull/10652))
|
||||||
|
* Upgrade to parity-crypto 0.4 ([#10650](https://github.com/paritytech/parity-ethereum/pull/10650))
|
||||||
|
* fix(compilation warnings) ([#10649](https://github.com/paritytech/parity-ethereum/pull/10649))
|
||||||
|
* [whisper] Move needed aes_gcm crypto in-crate ([#10647](https://github.com/paritytech/parity-ethereum/pull/10647))
|
||||||
|
* Update publishing ([#10644](https://github.com/paritytech/parity-ethereum/pull/10644))
|
||||||
|
* ci: publish docs debug ([#10638](https://github.com/paritytech/parity-ethereum/pull/10638))
|
||||||
|
* Fix publish docs ([#10635](https://github.com/paritytech/parity-ethereum/pull/10635))
|
||||||
|
* Fix rinkeby petersburg fork ([#10632](https://github.com/paritytech/parity-ethereum/pull/10632))
|
||||||
|
* Update kovan.json to switch Kovan validator set to POA Consensus Contracts ([#10628](https://github.com/paritytech/parity-ethereum/pull/10628))
|
||||||
|
* [ethcore] remove error_chain ([#10616](https://github.com/paritytech/parity-ethereum/pull/10616))
|
||||||
|
* Remove unused import ([#10615](https://github.com/paritytech/parity-ethereum/pull/10615))
|
||||||
|
* Adds parity_getRawBlockByNumber, parity_submitRawBlock ([#10609](https://github.com/paritytech/parity-ethereum/pull/10609))
|
||||||
|
* adds rpc error message for --no-ancient-blocks ([#10608](https://github.com/paritytech/parity-ethereum/pull/10608))
|
||||||
|
* Constantinople HF on POA Core ([#10606](https://github.com/paritytech/parity-ethereum/pull/10606))
|
||||||
|
* Clique: zero-fill extradata when the supplied value is less than 32 bytes in length ([#10605](https://github.com/paritytech/parity-ethereum/pull/10605))
|
||||||
|
* evm: add some mulmod benches ([#10600](https://github.com/paritytech/parity-ethereum/pull/10600))
|
||||||
|
* sccache logs to stdout ([#10596](https://github.com/paritytech/parity-ethereum/pull/10596))
|
||||||
|
* update bootnodes ([#10595](https://github.com/paritytech/parity-ethereum/pull/10595))
|
||||||
|
* Merge `Notifier` and `TransactionsPoolNotifier` ([#10591](https://github.com/paritytech/parity-ethereum/pull/10591))
|
||||||
|
* fix(whisper): change expiry `unix_time + ttl + work` ([#10587](https://github.com/paritytech/parity-ethereum/pull/10587))
|
||||||
|
* fix(evmbin): make benches compile again ([#10586](https://github.com/paritytech/parity-ethereum/pull/10586))
|
||||||
|
* fix issue with compilation when 'slow-blocks' feature enabled ([#10585](https://github.com/paritytech/parity-ethereum/pull/10585))
|
||||||
|
* Allow CORS requests in Secret Store API ([#10584](https://github.com/paritytech/parity-ethereum/pull/10584))
|
||||||
|
* CI improvements ([#10579](https://github.com/paritytech/parity-ethereum/pull/10579))
|
||||||
|
* ethcore: improve timestamp handling ([#10574](https://github.com/paritytech/parity-ethereum/pull/10574))
|
||||||
|
* Update Issue Template to direct security issue to email ([#10562](https://github.com/paritytech/parity-ethereum/pull/10562))
|
||||||
|
* version: bump master to 2.6 ([#10560](https://github.com/paritytech/parity-ethereum/pull/10560))
|
||||||
|
* fix(light cull): poll light cull instead of timer ([#10559](https://github.com/paritytech/parity-ethereum/pull/10559))
|
||||||
|
* Watch transactions pool ([#10558](https://github.com/paritytech/parity-ethereum/pull/10558))
|
||||||
|
* Add SealingState; don't prepare block when not ready. ([#10529](https://github.com/paritytech/parity-ethereum/pull/10529))
|
||||||
|
* Explicitly enable or disable Stratum in config file (Issue 9785) ([#10521](https://github.com/paritytech/parity-ethereum/pull/10521))
|
||||||
|
* Add filtering capability to `parity_pendingTransactions` (issue 8269) ([#10506](https://github.com/paritytech/parity-ethereum/pull/10506))
|
||||||
|
* Remove calls to heapsize ([#10432](https://github.com/paritytech/parity-ethereum/pull/10432))
|
||||||
|
* RPC: Implements eth_subscribe("syncing") ([#10311](https://github.com/paritytech/parity-ethereum/pull/10311))
|
||||||
|
* SecretStore: non-blocking wait of session completion ([#10303](https://github.com/paritytech/parity-ethereum/pull/10303))
|
||||||
|
* Node table limiting and cache for node filter ([#10288](https://github.com/paritytech/parity-ethereum/pull/10288))
|
||||||
|
* SecretStore: expose restore_key_public in HTTP API ([#10241](https://github.com/paritytech/parity-ethereum/pull/10241))
|
||||||
|
* Trivial journal for private transactions ([#10056](https://github.com/paritytech/parity-ethereum/pull/10056))
|
||||||
|
|
||||||
|
## Previous releases
|
||||||
|
|
||||||
|
- [CHANGELOG-2.5](docs/CHANGELOG-2.5.md) (_stable_)
|
||||||
|
- [CHANGELOG-2.4](docs/CHANGELOG-2.4.md) (EOL: 2019-07-08)
|
||||||
|
- [CHANGELOG-2.3](docs/CHANGELOG-2.3.md) (EOL: 2019-04-09)
|
||||||
|
- [CHANGELOG-2.2](docs/CHANGELOG-2.2.md) (EOL: 2019-02-25)
|
||||||
|
- [CHANGELOG-2.1](docs/CHANGELOG-2.1.md) (EOL: 2019-01-16)
|
||||||
|
- [CHANGELOG-2.0](docs/CHANGELOG-2.0.md) (EOL: 2018-11-15)
|
||||||
|
- [CHANGELOG-1.11](docs/CHANGELOG-1.11.md) (EOL: 2018-09-19)
|
||||||
|
- [CHANGELOG-1.10](docs/CHANGELOG-1.10.md) (EOL: 2018-07-18)
|
||||||
|
- [CHANGELOG-1.9](docs/CHANGELOG-1.9.md) (EOL: 2018-05-09)
|
||||||
|
- [CHANGELOG-1.8](docs/CHANGELOG-1.8.md) (EOL: 2018-03-22)
|
||||||
|
- [CHANGELOG-1.7](docs/CHANGELOG-1.7.md) (EOL: 2018-01-25)
|
||||||
|
- [CHANGELOG-1.6](docs/CHANGELOG-1.6.md) (EOL: 2017-10-15)
|
||||||
|
- [CHANGELOG-1.5](docs/CHANGELOG-1.5.md) (EOL: 2017-07-28)
|
||||||
|
- [CHANGELOG-1.4](docs/CHANGELOG-1.4.md) (EOL: 2017-03-13)
|
||||||
|
- [CHANGELOG-1.3](docs/CHANGELOG-1.3.md) (EOL: 2017-01-19)
|
||||||
|
- [CHANGELOG-1.2](docs/CHANGELOG-1.2.md) (EOL: 2016-11-07)
|
||||||
|
- [CHANGELOG-1.1](docs/CHANGELOG-1.1.md) (EOL: 2016-08-12)
|
||||||
|
- [CHANGELOG-1.0](docs/CHANGELOG-1.0.md) (EOL: 2016-06-24)
|
||||||
|
- [CHANGELOG-0.9](docs/CHANGELOG-0.9.md) (EOL: 2016-05-02)
|
||||||
@@ -5,17 +5,18 @@ version = "1.12.0"
|
|||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
crunchy = "0.1.0"
|
common-types = { path = "../ethcore/types" }
|
||||||
either = "1.0.0"
|
either = "1.0.0"
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
keccak-hash = "0.2.0"
|
keccak-hash = "0.4.0"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
memmap = "0.6"
|
memmap = "0.6"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.9"
|
||||||
primal = "0.2.3"
|
primal = "0.2.3"
|
||||||
|
static_assertions = "0.3.3"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
criterion = "0.2"
|
criterion = "0.3"
|
||||||
rustc-hex = "1.0"
|
rustc-hex = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
tempdir = "0.3"
|
tempdir = "0.3"
|
||||||
@@ -27,7 +28,9 @@ bench = []
|
|||||||
[[bench]]
|
[[bench]]
|
||||||
name = "basic"
|
name = "basic"
|
||||||
harness = false
|
harness = false
|
||||||
|
required-features = ['bench']
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "progpow"
|
name = "progpow"
|
||||||
harness = false
|
harness = false
|
||||||
|
required-features = ['bench']
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -17,26 +17,53 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate criterion;
|
extern crate criterion;
|
||||||
extern crate ethash;
|
extern crate ethash;
|
||||||
|
extern crate common_types;
|
||||||
|
|
||||||
use criterion::Criterion;
|
use criterion::Criterion;
|
||||||
use ethash::{NodeCacheBuilder, OptimizeFor};
|
use ethash::{NodeCacheBuilder, keccak};
|
||||||
|
use common_types::engines::OptimizeFor;
|
||||||
|
|
||||||
const HASH: [u8; 32] = [0xf5, 0x7e, 0x6f, 0x3a, 0xcf, 0xc0, 0xdd, 0x4b, 0x5b, 0xf2, 0xbe,
|
const HASH: [u8; 32] = [
|
||||||
0xe4, 0x0a, 0xb3, 0x35, 0x8a, 0xa6, 0x87, 0x73, 0xa8, 0xd0, 0x9f,
|
0xf5, 0x7e, 0x6f, 0x3a, 0xcf, 0xc0, 0xdd, 0x4b,
|
||||||
0x5e, 0x59, 0x5e, 0xab, 0x55, 0x94, 0x05, 0x52, 0x7d, 0x72];
|
0x5b, 0xf2, 0xbe, 0xe4, 0x0a, 0xb3, 0x35, 0x8a,
|
||||||
|
0xa6, 0x87, 0x73, 0xa8, 0xd0, 0x9f, 0x5e, 0x59,
|
||||||
|
0x5e, 0xab, 0x55, 0x94, 0x05, 0x52, 0x7d, 0x72,
|
||||||
|
];
|
||||||
|
const MIX_HASH: [u8; 32] = [
|
||||||
|
0x1f, 0xff, 0x04, 0xce, 0xc9, 0x41, 0x73, 0xfd,
|
||||||
|
0x59, 0x1e, 0x3d, 0x89, 0x60, 0xce, 0x6b, 0xdf,
|
||||||
|
0x8b, 0x19, 0x71, 0x04, 0x8c, 0x71, 0xff, 0x93,
|
||||||
|
0x7b, 0xb2, 0xd3, 0x2a, 0x64, 0x31, 0xab, 0x6d,
|
||||||
|
];
|
||||||
const NONCE: u64 = 0xd7b3ac70a301a249;
|
const NONCE: u64 = 0xd7b3ac70a301a249;
|
||||||
|
|
||||||
criterion_group!(
|
criterion_group! {
|
||||||
basic,
|
name = basic;
|
||||||
bench_light_compute_memmap,
|
config = dont_take_an_eternity_to_run();
|
||||||
bench_light_compute_memory,
|
targets = bench_keccak_512_inplace,
|
||||||
bench_light_new_round_trip_memmap,
|
bench_light_compute_memmap,
|
||||||
bench_light_new_round_trip_memory,
|
bench_light_compute_memory,
|
||||||
bench_light_from_file_round_trip_memory,
|
bench_light_new_round_trip_memmap,
|
||||||
bench_light_from_file_round_trip_memmap
|
bench_light_new_round_trip_memory,
|
||||||
);
|
bench_light_from_file_round_trip_memory,
|
||||||
|
bench_light_from_file_round_trip_memmap,
|
||||||
|
bench_quick_get_difficulty,
|
||||||
|
}
|
||||||
criterion_main!(basic);
|
criterion_main!(basic);
|
||||||
|
|
||||||
|
fn dont_take_an_eternity_to_run() -> Criterion {
|
||||||
|
Criterion::default().nresamples(1_000)
|
||||||
|
.without_plots()
|
||||||
|
.sample_size(10)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bench_keccak_512_inplace(b: &mut Criterion) {
|
||||||
|
b.bench_function("bench_keccak_512_inplace", move |b| b.iter(|| {
|
||||||
|
let mut data = [4u8; 64];
|
||||||
|
keccak::keccak_512::inplace(&mut data);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
fn bench_light_compute_memmap(b: &mut Criterion) {
|
fn bench_light_compute_memmap(b: &mut Criterion) {
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
@@ -52,13 +79,13 @@ fn bench_light_compute_memory(b: &mut Criterion) {
|
|||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
||||||
let light = builder.light(&env::temp_dir(), 486382);
|
let light = builder.light(&env::temp_dir(), 486382);
|
||||||
|
|
||||||
b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| light.compute(&HASH, NONCE, u64::max_value())));
|
b.bench_function("bench_light_compute_memory", move |b| b.iter(|| light.compute(&HASH, NONCE, u64::max_value())));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bench_light_new_round_trip_memmap(b: &mut Criterion) {
|
fn bench_light_new_round_trip_memmap(b: &mut Criterion) {
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| {
|
b.bench_function("bench_light_new_round_trip_memmap", move |b| b.iter(|| {
|
||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
||||||
let light = builder.light(&env::temp_dir(), 486382);
|
let light = builder.light(&env::temp_dir(), 486382);
|
||||||
light.compute(&HASH, NONCE, u64::max_value());
|
light.compute(&HASH, NONCE, u64::max_value());
|
||||||
@@ -68,7 +95,7 @@ fn bench_light_new_round_trip_memmap(b: &mut Criterion) {
|
|||||||
fn bench_light_new_round_trip_memory(b: &mut Criterion) {
|
fn bench_light_new_round_trip_memory(b: &mut Criterion) {
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| {
|
b.bench_function("bench_light_new_round_trip_memory", move |b| b.iter(|| {
|
||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
||||||
let light = builder.light(&env::temp_dir(), 486382);
|
let light = builder.light(&env::temp_dir(), 486382);
|
||||||
light.compute(&HASH, NONCE, u64::max_value());
|
light.compute(&HASH, NONCE, u64::max_value());
|
||||||
@@ -86,7 +113,7 @@ fn bench_light_from_file_round_trip_memory(b: &mut Criterion) {
|
|||||||
dummy.to_file().unwrap();
|
dummy.to_file().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| {
|
b.bench_function("bench_light_from_file_round_trip_memory", move |b| b.iter(|| {
|
||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Cpu, u64::max_value());
|
||||||
let light = builder.light_from_file(&dir, 486382).unwrap();
|
let light = builder.light_from_file(&dir, 486382).unwrap();
|
||||||
light.compute(&HASH, NONCE, u64::max_value());
|
light.compute(&HASH, NONCE, u64::max_value());
|
||||||
@@ -105,9 +132,21 @@ fn bench_light_from_file_round_trip_memmap(b: &mut Criterion) {
|
|||||||
dummy.to_file().unwrap();
|
dummy.to_file().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
b.bench_function("bench_light_compute_memmap", move |b| b.iter(|| {
|
b.bench_function("bench_light_from_file_round_trip_memmap", move |b| b.iter(|| {
|
||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
||||||
let light = builder.light_from_file(&dir, 486382).unwrap();
|
let light = builder.light_from_file(&dir, 486382).unwrap();
|
||||||
light.compute(&HASH, NONCE, u64::max_value());
|
light.compute(&HASH, NONCE, u64::max_value());
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn bench_quick_get_difficulty(b: &mut Criterion) {
|
||||||
|
b.bench_function("bench_quick_get_difficulty", move |b| b.iter(|| {
|
||||||
|
let d = ethash::quick_get_difficulty(&HASH, NONCE, &MIX_HASH, false);
|
||||||
|
let boundary_good = [
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3e, 0x9b, 0x6c, 0x69, 0xbc, 0x2c, 0xe2, 0xa2,
|
||||||
|
0x4a, 0x8e, 0x95, 0x69, 0xef, 0xc7, 0xd7, 0x1b, 0x33, 0x35, 0xdf, 0x36, 0x8c, 0x9a,
|
||||||
|
0xe9, 0x7e, 0x53, 0x84,
|
||||||
|
];
|
||||||
|
assert_eq!(d[..], boundary_good[..]);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,14 +3,16 @@ extern crate criterion;
|
|||||||
extern crate ethash;
|
extern crate ethash;
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
extern crate tempdir;
|
extern crate tempdir;
|
||||||
|
extern crate common_types;
|
||||||
|
|
||||||
use criterion::Criterion;
|
use criterion::Criterion;
|
||||||
use ethash::progpow;
|
use ethash::progpow;
|
||||||
|
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
use ethash::{NodeCacheBuilder, OptimizeFor};
|
use ethash::NodeCacheBuilder;
|
||||||
use ethash::compute::light_compute;
|
use ethash::compute::light_compute;
|
||||||
|
use common_types::engines::OptimizeFor;
|
||||||
|
|
||||||
fn bench_hashimoto_light(c: &mut Criterion) {
|
fn bench_hashimoto_light(c: &mut Criterion) {
|
||||||
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
let builder = NodeCacheBuilder::new(OptimizeFor::Memory, u64::max_value());
|
||||||
|
|||||||
@@ -3,84 +3,84 @@
|
|||||||
0,
|
0,
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000",
|
"0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"0000000000000000",
|
"0000000000000000",
|
||||||
"faeb1be51075b03a4ff44b335067951ead07a3b078539ace76fd56fc410557a3",
|
"f4ac202715ded4136e72887c39e63a4738331c57fd9eb79f6ec421c281aa8743",
|
||||||
"63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b"
|
"b3bad9ca6f7c566cf0377d1f8cce29d6516a96562c122d924626281ec948ef02"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
49,
|
49,
|
||||||
"63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b",
|
"b3bad9ca6f7c566cf0377d1f8cce29d6516a96562c122d924626281ec948ef02",
|
||||||
"0000000006ff2c47",
|
"0000000006ff2c47",
|
||||||
"c789c1180f890ec555ff42042913465481e8e6bc512cb981e1c1108dc3f2227d",
|
"7730596f128f675ef9a6bb7281f268e4077d302f2b9078da1ece4349248561dd",
|
||||||
"9e7248f20914913a73d80a70174c331b1d34f260535ac3631d770e656b5dd922"
|
"0b9ed0c11157f1365143e329a6e1cea4248d9d6cb44b9c6daf492c7a076654a4"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
50,
|
50,
|
||||||
"9e7248f20914913a73d80a70174c331b1d34f260535ac3631d770e656b5dd922",
|
"0b9ed0c11157f1365143e329a6e1cea4248d9d6cb44b9c6daf492c7a076654a4",
|
||||||
"00000000076e482e",
|
"00000000076e482e",
|
||||||
"c7340542c2a06b3a7dc7222635f7cd402abf8b528ae971ddac6bbe2b0c7cb518",
|
"829136d4a704eb8d06da773f1a90466e7b5ed12119c44526f045bbff4475d891",
|
||||||
"de37e1824c86d35d154cf65a88de6d9286aec4f7f10c3fc9f0fa1bcc2687188d"
|
"e2e881c5b893c2f1ef06b96a10cfcbcf7255b307f0818e7d30eb12b2edfc237b"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
99,
|
99,
|
||||||
"de37e1824c86d35d154cf65a88de6d9286aec4f7f10c3fc9f0fa1bcc2687188d",
|
"e2e881c5b893c2f1ef06b96a10cfcbcf7255b307f0818e7d30eb12b2edfc237b",
|
||||||
"000000003917afab",
|
"000000003917afab",
|
||||||
"f5e60b2c5bfddd136167a30cbc3c8dbdbd15a512257dee7964e0bc6daa9f8ba7",
|
"deb3d8b45bdc596c56aa37a5eba456f478c82e60e5c028ce95f2e654e4bb7b57",
|
||||||
"ac7b55e801511b77e11d52e9599206101550144525b5679f2dab19386f23dcce"
|
"9bdc2ad2286eaa051d6ca1f5196d2dd1c9a039f1d7ce3e1c856b793deed01778"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
29950,
|
29950,
|
||||||
"ac7b55e801511b77e11d52e9599206101550144525b5679f2dab19386f23dcce",
|
"9bdc2ad2286eaa051d6ca1f5196d2dd1c9a039f1d7ce3e1c856b793deed01778",
|
||||||
"005d409dbc23a62a",
|
"005d409dbc23a62a",
|
||||||
"07393d15805eb08ee6fc6cb3ad4ad1010533bd0ff92d6006850246829f18fd6e",
|
"c01e6d339cc687c77f653b81c74cb9de8b595554f2c5db671a7dde3846d2fa01",
|
||||||
"e43d7e0bdc8a4a3f6e291a5ed790b9fa1a0948a2b9e33c844888690847de19f5"
|
"de0d693e597cf2fd70a4cfaa73f6baafc29e1eee695a81295b278c1116580b72"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
29999,
|
29999,
|
||||||
"e43d7e0bdc8a4a3f6e291a5ed790b9fa1a0948a2b9e33c844888690847de19f5",
|
"de0d693e597cf2fd70a4cfaa73f6baafc29e1eee695a81295b278c1116580b72",
|
||||||
"005db5fa4c2a3d03",
|
"005db5fa4c2a3d03",
|
||||||
"7551bddf977491da2f6cfc1679299544b23483e8f8ee0931c4c16a796558a0b8",
|
"8b664cdbf396a7a185446c93dddd6611f5a736b11097381ae6bea45e802cec16",
|
||||||
"d34519f72c97cae8892c277776259db3320820cb5279a299d0ef1e155e5c6454"
|
"21ec5d1984a4fd4394b042aa96365085225d964727a45def245ceab326e28128"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
30000,
|
30000,
|
||||||
"d34519f72c97cae8892c277776259db3320820cb5279a299d0ef1e155e5c6454",
|
"21ec5d1984a4fd4394b042aa96365085225d964727a45def245ceab326e28128",
|
||||||
"005db8607994ff30",
|
"005db8607994ff30",
|
||||||
"f1c2c7c32266af9635462e6ce1c98ebe4e7e3ecab7a38aaabfbf2e731e0fbff4",
|
"276951d89c1ed262bcac00df4fb9bf7af36991532744a2e287b0b758a56e15aa",
|
||||||
"8b6ce5da0b06d18db7bd8492d9e5717f8b53e7e098d9fef7886d58a6e913ef64"
|
"dc070b76cc311cd82267f98936acbbbd3ec1c1ab25b55e2c885af6474e1e6841"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
30049,
|
30049,
|
||||||
"8b6ce5da0b06d18db7bd8492d9e5717f8b53e7e098d9fef7886d58a6e913ef64",
|
"dc070b76cc311cd82267f98936acbbbd3ec1c1ab25b55e2c885af6474e1e6841",
|
||||||
"005e2e215a8ca2e7",
|
"005e2e215a8ca2e7",
|
||||||
"57fe6a9fbf920b4e91deeb66cb0efa971e08229d1a160330e08da54af0689add",
|
"6248ba0157d0f0592dacfe2963337948fffb37f67e7451a6862c1321d894cebe",
|
||||||
"c2c46173481b9ced61123d2e293b42ede5a1b323210eb2a684df0874ffe09047"
|
"6fdecf719e2547f585a6ee807d8237db8e9489f63d3f259ab5236451eaded433"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
30050,
|
30050,
|
||||||
"c2c46173481b9ced61123d2e293b42ede5a1b323210eb2a684df0874ffe09047",
|
"6fdecf719e2547f585a6ee807d8237db8e9489f63d3f259ab5236451eaded433",
|
||||||
"005e30899481055e",
|
"005e30899481055e",
|
||||||
"ba30c61cc5a2c74a5ecaf505965140a08f24a296d687e78720f0b48baf712f2d",
|
"512d8f2bb0441fcfa1764c67e8dbed2afcbe9141de4bbebc5b51e0661dede550",
|
||||||
"ea42197eb2ba79c63cb5e655b8b1f612c5f08aae1a49ff236795a3516d87bc71"
|
"cb1587a1c372642cbd9ce4c1ba2f433985d44c571a676a032bc1e8c1ad066e24"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
30099,
|
30099,
|
||||||
"ea42197eb2ba79c63cb5e655b8b1f612c5f08aae1a49ff236795a3516d87bc71",
|
"cb1587a1c372642cbd9ce4c1ba2f433985d44c571a676a032bc1e8c1ad066e24",
|
||||||
"005ea6aef136f88b",
|
"005ea6aef136f88b",
|
||||||
"cfd5e46048cd133d40f261fe8704e51d3f497fc14203ac6a9ef6a0841780b1cd",
|
"be0e7d6afa6edd483ccc304afa9bf0abaca5e0f037a4f05bf5550b9309d1d12c",
|
||||||
"49e15ba4bf501ce8fe8876101c808e24c69a859be15de554bf85dbc095491bd6"
|
"78be18f20569a834d839dad48e0e51d6df6b6537575f0ad29898c7cf357f12cb"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
59950,
|
59950,
|
||||||
"49e15ba4bf501ce8fe8876101c808e24c69a859be15de554bf85dbc095491bd6",
|
"78be18f20569a834d839dad48e0e51d6df6b6537575f0ad29898c7cf357f12cb",
|
||||||
"02ebe0503bd7b1da",
|
"02ebe0503bd7b1da",
|
||||||
"21511fbaa31fb9f5fc4998a754e97b3083a866f4de86fa7500a633346f56d773",
|
"b85be51fce670aa437f28c02ea4fd7995fa8b6ac224e959b8dbfb5bdbc6f77ce",
|
||||||
"f5c50ba5c0d6210ddb16250ec3efda178de857b2b1703d8d5403bd0f848e19cf"
|
"a68a620ba17e0cf2817bc4397cf4b85f5770983aa7b7931319a7f61bd6f905b1"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
59999,
|
59999,
|
||||||
"f5c50ba5c0d6210ddb16250ec3efda178de857b2b1703d8d5403bd0f848e19cf",
|
"a68a620ba17e0cf2817bc4397cf4b85f5770983aa7b7931319a7f61bd6f905b1",
|
||||||
"02edb6275bd221e3",
|
"02edb6275bd221e3",
|
||||||
"653eda37d337e39d311d22be9bbd3458d3abee4e643bee4a7280a6d08106ef98",
|
"ffe745a932c21c0704291bb416fe8bffec76621cd3434861885beab42cec1734",
|
||||||
"341562d10d4afb706ec2c8d5537cb0c810de02b4ebb0a0eea5ae335af6fb2e88"
|
"9e6667a151ac6f5186a05cb20877a2b3df02317046256a762cb8ec2d96aa34f0"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -21,7 +21,7 @@ use memmap::MmapMut;
|
|||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
use seed_compute::SeedHashCompute;
|
use seed_compute::SeedHashCompute;
|
||||||
|
|
||||||
use shared::{ETHASH_CACHE_ROUNDS, NODE_BYTES, NODE_DWORDS, Node, epoch, get_cache_size, to_hex};
|
use shared::{ETHASH_CACHE_ROUNDS, NODE_BYTES, Node, epoch, get_cache_size, to_hex};
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@@ -30,20 +30,10 @@ use std::path::{Path, PathBuf};
|
|||||||
use std::slice;
|
use std::slice;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use common_types::engines::OptimizeFor;
|
||||||
|
|
||||||
type Cache = Either<Vec<Node>, MmapMut>;
|
type Cache = Either<Vec<Node>, MmapMut>;
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
|
||||||
pub enum OptimizeFor {
|
|
||||||
Cpu,
|
|
||||||
Memory,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for OptimizeFor {
|
|
||||||
fn default() -> Self {
|
|
||||||
OptimizeFor::Cpu
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn byte_size(cache: &Cache) -> usize {
|
fn byte_size(cache: &Cache) -> usize {
|
||||||
use self::Either::{Left, Right};
|
use self::Either::{Left, Right};
|
||||||
|
|
||||||
@@ -327,11 +317,6 @@ unsafe fn initialize_memory(memory: *mut Node, num_nodes: usize, ident: &H256) {
|
|||||||
// Now this is initialized, we can treat it as a slice.
|
// Now this is initialized, we can treat it as a slice.
|
||||||
let nodes: &mut [Node] = slice::from_raw_parts_mut(memory, num_nodes);
|
let nodes: &mut [Node] = slice::from_raw_parts_mut(memory, num_nodes);
|
||||||
|
|
||||||
// For `unroll!`, see below. If the literal in `unroll!` is not the same as the RHS here then
|
|
||||||
// these have got out of sync! Don't let this happen!
|
|
||||||
debug_assert_eq!(NODE_DWORDS, 8);
|
|
||||||
|
|
||||||
// This _should_ get unrolled by the compiler, since it's not using the loop variable.
|
|
||||||
for _ in 0..ETHASH_CACHE_ROUNDS {
|
for _ in 0..ETHASH_CACHE_ROUNDS {
|
||||||
for i in 0..num_nodes {
|
for i in 0..num_nodes {
|
||||||
let data_idx = (num_nodes - 1 + i) % num_nodes;
|
let data_idx = (num_nodes - 1 + i) % num_nodes;
|
||||||
@@ -341,11 +326,8 @@ unsafe fn initialize_memory(memory: *mut Node, num_nodes: usize, ident: &H256) {
|
|||||||
let mut data: Node = nodes.get_unchecked(data_idx).clone();
|
let mut data: Node = nodes.get_unchecked(data_idx).clone();
|
||||||
let rhs: &Node = nodes.get_unchecked(idx);
|
let rhs: &Node = nodes.get_unchecked(idx);
|
||||||
|
|
||||||
unroll! {
|
for (a, b) in data.as_dwords_mut().iter_mut().zip(rhs.as_dwords()) {
|
||||||
for w in 0..8 {
|
*a ^= *b;
|
||||||
*data.as_dwords_mut().get_unchecked_mut(w) ^=
|
|
||||||
*rhs.as_dwords().get_unchecked(w);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data
|
data
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -26,7 +26,7 @@ use seed_compute::SeedHashCompute;
|
|||||||
use shared::*;
|
use shared::*;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
use std::{mem, ptr};
|
use std::mem;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
const MIX_WORDS: usize = ETHASH_MIX_BYTES / 4;
|
const MIX_WORDS: usize = ETHASH_MIX_BYTES / 4;
|
||||||
@@ -135,22 +135,16 @@ pub fn quick_get_difficulty(header_hash: &H256, nonce: u64, mix_hash: &H256, pro
|
|||||||
let seed = keccak_f800_short(*header_hash, nonce, [0u32; 8]);
|
let seed = keccak_f800_short(*header_hash, nonce, [0u32; 8]);
|
||||||
keccak_f800_long(*header_hash, seed, mem::transmute(*mix_hash))
|
keccak_f800_long(*header_hash, seed, mem::transmute(*mix_hash))
|
||||||
} else {
|
} else {
|
||||||
// This is safe - the `keccak_512` call below reads the first 40 bytes (which we explicitly set
|
let mut buf = [0u8; 64 + 32];
|
||||||
// with two `copy_nonoverlapping` calls) but writes the first 64, and then we explicitly write
|
|
||||||
// the next 32 bytes before we read the whole thing with `keccak_256`.
|
|
||||||
//
|
|
||||||
// This cannot be elided by the compiler as it doesn't know the implementation of
|
|
||||||
// `keccak_512`.
|
|
||||||
let mut buf: [u8; 64 + 32] = mem::uninitialized();
|
|
||||||
|
|
||||||
ptr::copy_nonoverlapping(header_hash.as_ptr(), buf.as_mut_ptr(), 32);
|
let hash_len = header_hash.len();
|
||||||
ptr::copy_nonoverlapping(&nonce as *const u64 as *const u8, buf[32..].as_mut_ptr(), 8);
|
buf[..hash_len].copy_from_slice(header_hash);
|
||||||
|
buf[hash_len..hash_len + mem::size_of::<u64>()].copy_from_slice(&nonce.to_ne_bytes());
|
||||||
|
|
||||||
keccak_512::unchecked(buf.as_mut_ptr(), 64, buf.as_ptr(), 40);
|
keccak_512::unchecked(buf.as_mut_ptr(), 64, buf.as_ptr(), 40);
|
||||||
ptr::copy_nonoverlapping(mix_hash.as_ptr(), buf[64..].as_mut_ptr(), 32);
|
buf[64..].copy_from_slice(mix_hash);
|
||||||
|
|
||||||
// This is initialized in `keccak_256`
|
let mut hash = [0u8; 32];
|
||||||
let mut hash: [u8; 32] = mem::uninitialized();
|
|
||||||
keccak_256::unchecked(hash.as_mut_ptr(), hash.len(), buf.as_ptr(), buf.len());
|
keccak_256::unchecked(hash.as_mut_ptr(), hash.len(), buf.as_ptr(), buf.len());
|
||||||
|
|
||||||
hash
|
hash
|
||||||
@@ -205,17 +199,11 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64)
|
|||||||
let mut buf: MixBuf = MixBuf {
|
let mut buf: MixBuf = MixBuf {
|
||||||
half_mix: unsafe {
|
half_mix: unsafe {
|
||||||
// Pack `header_hash` and `nonce` together
|
// Pack `header_hash` and `nonce` together
|
||||||
// We explicitly write the first 40 bytes, leaving the last 24 as uninitialized. Then
|
let mut out = [0u8; NODE_BYTES];
|
||||||
// `keccak_512` reads the first 40 bytes (4th parameter) and overwrites the entire array,
|
|
||||||
// leaving it fully initialized.
|
|
||||||
let mut out: [u8; NODE_BYTES] = mem::uninitialized();
|
|
||||||
|
|
||||||
ptr::copy_nonoverlapping(header_hash.as_ptr(), out.as_mut_ptr(), header_hash.len());
|
let hash_len = header_hash.len();
|
||||||
ptr::copy_nonoverlapping(
|
out[..hash_len].copy_from_slice(header_hash);
|
||||||
&nonce as *const u64 as *const u8,
|
out[hash_len..hash_len + mem::size_of::<u64>()].copy_from_slice(&nonce.to_ne_bytes());
|
||||||
out[header_hash.len()..].as_mut_ptr(),
|
|
||||||
mem::size_of::<u64>(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// compute keccak-512 hash and replicate across mix
|
// compute keccak-512 hash and replicate across mix
|
||||||
keccak_512::unchecked(
|
keccak_512::unchecked(
|
||||||
@@ -227,8 +215,7 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64)
|
|||||||
|
|
||||||
Node { bytes: out }
|
Node { bytes: out }
|
||||||
},
|
},
|
||||||
// This is fully initialized before being read, see `let mut compress = ...` below
|
compress_bytes: [0u8; MIX_WORDS],
|
||||||
compress_bytes: unsafe { mem::uninitialized() },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut mix: [_; MIX_NODES] = [buf.half_mix.clone(), buf.half_mix.clone()];
|
let mut mix: [_; MIX_NODES] = [buf.half_mix.clone(), buf.half_mix.clone()];
|
||||||
@@ -252,24 +239,16 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64)
|
|||||||
fnv_hash(first_val ^ i, mix_words[i as usize % MIX_WORDS]) % num_full_pages
|
fnv_hash(first_val ^ i, mix_words[i as usize % MIX_WORDS]) % num_full_pages
|
||||||
};
|
};
|
||||||
|
|
||||||
unroll! {
|
// MIX_NODES
|
||||||
// MIX_NODES
|
for n in 0..2 {
|
||||||
for n in 0..2 {
|
let tmp_node = calculate_dag_item(
|
||||||
let tmp_node = calculate_dag_item(
|
index * MIX_NODES as u32 + n as u32,
|
||||||
index * MIX_NODES as u32 + n as u32,
|
cache,
|
||||||
cache,
|
);
|
||||||
);
|
|
||||||
|
|
||||||
unroll! {
|
// NODE_WORDS
|
||||||
// NODE_WORDS
|
for (a, b) in mix[n].as_words_mut().iter_mut().zip(tmp_node.as_words()) {
|
||||||
for w in 0..16 {
|
*a = fnv_hash(*a, *b);
|
||||||
mix[n].as_words_mut()[w] =
|
|
||||||
fnv_hash(
|
|
||||||
mix[n].as_words()[w],
|
|
||||||
tmp_node.as_words()[w],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -277,25 +256,27 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64)
|
|||||||
let mix_words: [u32; MIX_WORDS] = unsafe { mem::transmute(mix) };
|
let mix_words: [u32; MIX_WORDS] = unsafe { mem::transmute(mix) };
|
||||||
|
|
||||||
{
|
{
|
||||||
// This is an uninitialized buffer to begin with, but we iterate precisely `compress.len()`
|
// We iterate precisely `compress.len()` times and set each index,
|
||||||
// times and set each index, leaving the array fully initialized. THIS ONLY WORKS ON LITTLE-
|
// leaving the array fully initialized. THIS ONLY WORKS ON LITTLE-ENDIAN MACHINES.
|
||||||
// ENDIAN MACHINES. See a future PR to make this and the rest of the code work correctly on
|
// See a future PR to make this and the rest of the code work correctly on
|
||||||
// big-endian arches like mips.
|
// big-endian arches like mips.
|
||||||
let compress: &mut [u32; MIX_WORDS / 4] =
|
let compress: &mut [u32; MIX_WORDS / 4] =
|
||||||
unsafe { make_const_array!(MIX_WORDS / 4, &mut buf.compress_bytes) };
|
unsafe { make_const_array!(MIX_WORDS / 4, &mut buf.compress_bytes) };
|
||||||
|
#[cfg(target_endian = "big")]
|
||||||
|
{
|
||||||
|
compile_error!("parity-ethereum currently only supports little-endian targets");
|
||||||
|
}
|
||||||
|
|
||||||
// Compress mix
|
// Compress mix
|
||||||
debug_assert_eq!(MIX_WORDS / 4, 8);
|
debug_assert_eq!(MIX_WORDS / 4, 8);
|
||||||
unroll! {
|
for i in 0..8 {
|
||||||
for i in 0..8 {
|
let w = i * 4;
|
||||||
let w = i * 4;
|
|
||||||
|
|
||||||
let mut reduction = mix_words[w + 0];
|
let mut reduction = mix_words[w + 0];
|
||||||
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 1];
|
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 1];
|
||||||
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 2];
|
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 2];
|
||||||
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 3];
|
reduction = reduction.wrapping_mul(FNV_PRIME) ^ mix_words[w + 3];
|
||||||
compress[i] = reduction;
|
compress[i] = reduction;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +302,6 @@ fn hash_compute(light: &Light, full_size: usize, header_hash: &H256, nonce: u64)
|
|||||||
ProofOfWork { mix_hash: mix_hash, value: value }
|
ProofOfWork { mix_hash: mix_hash, value: value }
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Use the `simd` crate
|
|
||||||
pub fn calculate_dag_item(node_index: u32, cache: &[Node]) -> Node {
|
pub fn calculate_dag_item(node_index: u32, cache: &[Node]) -> Node {
|
||||||
let num_parent_nodes = cache.len();
|
let num_parent_nodes = cache.len();
|
||||||
let mut ret = cache[node_index as usize % num_parent_nodes].clone();
|
let mut ret = cache[node_index as usize % num_parent_nodes].clone();
|
||||||
@@ -335,10 +315,8 @@ pub fn calculate_dag_item(node_index: u32, cache: &[Node]) -> Node {
|
|||||||
num_parent_nodes as u32;
|
num_parent_nodes as u32;
|
||||||
let parent = &cache[parent_index as usize];
|
let parent = &cache[parent_index as usize];
|
||||||
|
|
||||||
unroll! {
|
for (a, b) in ret.as_words_mut().iter_mut().zip(parent.as_words()) {
|
||||||
for w in 0..16 {
|
*a = fnv_hash(*a, *b);
|
||||||
ret.as_words_mut()[w] = fnv_hash(ret.as_words()[w], parent.as_words()[w]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,16 +14,17 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
extern crate common_types;
|
||||||
extern crate either;
|
extern crate either;
|
||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
extern crate memmap;
|
extern crate memmap;
|
||||||
extern crate parking_lot;
|
extern crate parking_lot;
|
||||||
extern crate primal;
|
extern crate primal;
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
extern crate crunchy;
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate static_assertions;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
@@ -41,6 +42,9 @@ mod compute;
|
|||||||
|
|
||||||
mod seed_compute;
|
mod seed_compute;
|
||||||
mod cache;
|
mod cache;
|
||||||
|
#[cfg(feature = "bench")]
|
||||||
|
pub mod keccak;
|
||||||
|
#[cfg(not(feature = "bench"))]
|
||||||
mod keccak;
|
mod keccak;
|
||||||
mod shared;
|
mod shared;
|
||||||
|
|
||||||
@@ -49,14 +53,17 @@ pub mod progpow;
|
|||||||
#[cfg(not(feature = "bench"))]
|
#[cfg(not(feature = "bench"))]
|
||||||
mod progpow;
|
mod progpow;
|
||||||
|
|
||||||
pub use cache::{NodeCacheBuilder, OptimizeFor};
|
pub use cache::NodeCacheBuilder;
|
||||||
pub use compute::{ProofOfWork, quick_get_difficulty, slow_hash_block_number};
|
pub use compute::{ProofOfWork, quick_get_difficulty, slow_hash_block_number};
|
||||||
|
pub use seed_compute::SeedHashCompute;
|
||||||
|
pub use shared::ETHASH_EPOCH_LENGTH;
|
||||||
|
|
||||||
|
use common_types::engines::OptimizeFor;
|
||||||
use compute::Light;
|
use compute::Light;
|
||||||
use ethereum_types::{BigEndianHash, U256, U512};
|
use ethereum_types::{BigEndianHash, U256, U512};
|
||||||
use keccak::H256;
|
use keccak::H256;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
pub use seed_compute::SeedHashCompute;
|
|
||||||
pub use shared::ETHASH_EPOCH_LENGTH;
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
@@ -83,7 +90,7 @@ impl EthashManager {
|
|||||||
EthashManager {
|
EthashManager {
|
||||||
cache_dir: cache_dir.to_path_buf(),
|
cache_dir: cache_dir.to_path_buf(),
|
||||||
nodecache_builder: NodeCacheBuilder::new(optimize_for.into().unwrap_or_default(), progpow_transition),
|
nodecache_builder: NodeCacheBuilder::new(optimize_for.into().unwrap_or_default(), progpow_transition),
|
||||||
progpow_transition: progpow_transition,
|
progpow_transition,
|
||||||
cache: Mutex::new(LightCache {
|
cache: Mutex::new(LightCache {
|
||||||
recent_epoch: None,
|
recent_epoch: None,
|
||||||
recent: None,
|
recent: None,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity.
|
// This file is part of Parity.
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
@@ -29,6 +29,9 @@
|
|||||||
//!
|
//!
|
||||||
//! ProgPoW audits have been proposed to analyse the efficiency of a ProgPoW ASICs over
|
//! ProgPoW audits have been proposed to analyse the efficiency of a ProgPoW ASICs over
|
||||||
//! GPUs and analysis of the economic impact on the Ethereum protocol.
|
//! GPUs and analysis of the economic impact on the Ethereum protocol.
|
||||||
|
//!
|
||||||
|
//! We use ProgPoW 0.9.3 version as suggested on Specification
|
||||||
|
//! https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1057.md#specification
|
||||||
|
|
||||||
use compute::{FNV_PRIME, calculate_dag_item};
|
use compute::{FNV_PRIME, calculate_dag_item};
|
||||||
use keccak::H256;
|
use keccak::H256;
|
||||||
@@ -36,12 +39,12 @@ use shared::{ETHASH_ACCESSES, ETHASH_MIX_BYTES, Node, get_data_size};
|
|||||||
|
|
||||||
const PROGPOW_CACHE_BYTES: usize = 16 * 1024;
|
const PROGPOW_CACHE_BYTES: usize = 16 * 1024;
|
||||||
const PROGPOW_CACHE_WORDS: usize = PROGPOW_CACHE_BYTES / 4;
|
const PROGPOW_CACHE_WORDS: usize = PROGPOW_CACHE_BYTES / 4;
|
||||||
const PROGPOW_CNT_CACHE: usize = 12;
|
const PROGPOW_CNT_CACHE: usize = 11;
|
||||||
const PROGPOW_CNT_MATH: usize = 20;
|
const PROGPOW_CNT_MATH: usize = 18;
|
||||||
const PROGPOW_CNT_DAG: usize = ETHASH_ACCESSES;
|
const PROGPOW_CNT_DAG: usize = ETHASH_ACCESSES;
|
||||||
const PROGPOW_DAG_LOADS: usize = 4;
|
const PROGPOW_DAG_LOADS: usize = 4;
|
||||||
const PROGPOW_MIX_BYTES: usize = 2 * ETHASH_MIX_BYTES;
|
const PROGPOW_MIX_BYTES: usize = 2 * ETHASH_MIX_BYTES;
|
||||||
const PROGPOW_PERIOD_LENGTH: usize = 50; // blocks per progpow epoch (N)
|
const PROGPOW_PERIOD_LENGTH: usize = 10; // blocks per progpow epoch (N)
|
||||||
const PROGPOW_LANES: usize = 16;
|
const PROGPOW_LANES: usize = 16;
|
||||||
const PROGPOW_REGS: usize = 32;
|
const PROGPOW_REGS: usize = 32;
|
||||||
|
|
||||||
@@ -419,7 +422,8 @@ pub fn generate_cdag(cache: &[Node]) -> CDag {
|
|||||||
mod test {
|
mod test {
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
|
|
||||||
use cache::{NodeCacheBuilder, OptimizeFor};
|
use common_types::engines::OptimizeFor;
|
||||||
|
use cache::NodeCacheBuilder;
|
||||||
use keccak::H256;
|
use keccak::H256;
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
use serde_json::{self, Value};
|
use serde_json::{self, Value};
|
||||||
@@ -545,8 +549,8 @@ mod test {
|
|||||||
&c_dag,
|
&c_dag,
|
||||||
);
|
);
|
||||||
|
|
||||||
let expected_digest = FromHex::from_hex("63155f732f2bf556967f906155b510c917e48e99685ead76ea83f4eca03ab12b").unwrap();
|
let expected_digest = FromHex::from_hex("b3bad9ca6f7c566cf0377d1f8cce29d6516a96562c122d924626281ec948ef02").unwrap();
|
||||||
let expected_result = FromHex::from_hex("faeb1be51075b03a4ff44b335067951ead07a3b078539ace76fd56fc410557a3").unwrap();
|
let expected_result = FromHex::from_hex("f4ac202715ded4136e72887c39e63a4738331c57fd9eb79f6ec421c281aa8743").unwrap();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
digest.to_vec(),
|
digest.to_vec(),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -69,34 +69,7 @@ pub type NodeBytes = [u8; NODE_BYTES];
|
|||||||
pub type NodeWords = [u32; NODE_WORDS];
|
pub type NodeWords = [u32; NODE_WORDS];
|
||||||
pub type NodeDwords = [u64; NODE_DWORDS];
|
pub type NodeDwords = [u64; NODE_DWORDS];
|
||||||
|
|
||||||
macro_rules! static_assert_size_eq {
|
assert_eq_size!(node; Node, NodeBytes, NodeWords, NodeDwords);
|
||||||
(@inner $a:ty, $b:ty, $($rest:ty),*) => {
|
|
||||||
fn first() {
|
|
||||||
static_assert_size_eq!($a, $b);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn second() {
|
|
||||||
static_assert_size_eq!($b, $($rest),*);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
(@inner $a:ty, $b:ty) => {
|
|
||||||
unsafe {
|
|
||||||
let val: $b = ::std::mem::uninitialized();
|
|
||||||
let _: $a = ::std::mem::transmute(val);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
($($rest:ty),*) => {
|
|
||||||
static_assert_size_eq!(size_eq: $($rest),*);
|
|
||||||
};
|
|
||||||
($name:ident : $($rest:ty),*) => {
|
|
||||||
#[allow(dead_code)]
|
|
||||||
fn $name() {
|
|
||||||
static_assert_size_eq!(@inner $($rest),*);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static_assert_size_eq!(Node, NodeBytes, NodeWords, NodeDwords);
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub union Node {
|
pub union Node {
|
||||||
|
|||||||
@@ -7,92 +7,100 @@ version = "1.12.0"
|
|||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
account-db = { path = "account-db" }
|
account-state = { path = "account-state" }
|
||||||
ansi_term = "0.11"
|
ansi_term = "0.11"
|
||||||
|
basic-authority = { path = "./engines/basic-authority", optional = true} # used by test-helpers feature
|
||||||
blooms-db = { path = "../util/blooms-db", optional = true }
|
blooms-db = { path = "../util/blooms-db", optional = true }
|
||||||
common-types = { path = "types" }
|
client-traits = { path = "./client-traits" }
|
||||||
crossbeam-utils = "0.6"
|
common-types = { path = "./types" }
|
||||||
derive_more = "0.14.0"
|
engine = { path = "./engine" }
|
||||||
env_logger = { version = "0.5", optional = true }
|
env_logger = { version = "0.5", optional = true }
|
||||||
ethabi = "8.0"
|
ethash = { path = "../ethash", optional = true }
|
||||||
ethabi-contract = "8.0"
|
ethjson = { path = "../json", optional = true }
|
||||||
ethabi-derive = "8.0"
|
|
||||||
ethash = { path = "../ethash" }
|
|
||||||
ethcore-blockchain = { path = "./blockchain" }
|
ethcore-blockchain = { path = "./blockchain" }
|
||||||
ethcore-bloom-journal = { path = "../util/bloom" }
|
|
||||||
ethcore-builtin = { path = "./builtin" }
|
|
||||||
ethcore-call-contract = { path = "./call-contract" }
|
ethcore-call-contract = { path = "./call-contract" }
|
||||||
ethcore-db = { path = "./db" }
|
ethcore-db = { path = "./db" }
|
||||||
ethcore-io = { path = "../util/io" }
|
ethcore-io = { path = "../util/io" }
|
||||||
ethcore-miner = { path = "../miner" }
|
ethcore-miner = { path = "../miner" }
|
||||||
ethcore-stratum = { path = "../miner/stratum", optional = true }
|
ethcore-stratum = { path = "../miner/stratum", optional = true }
|
||||||
ethereum-types = "0.6.0"
|
ethereum-types = "0.8.0"
|
||||||
ethjson = { path = "../json" }
|
|
||||||
ethkey = { path = "../accounts/ethkey" }
|
|
||||||
evm = { path = "evm" }
|
evm = { path = "evm" }
|
||||||
|
executive-state = { path = "executive-state" }
|
||||||
futures = "0.1"
|
futures = "0.1"
|
||||||
hash-db = "0.12.4"
|
hash-db = "0.15.0"
|
||||||
parity-util-mem = "0.1"
|
|
||||||
itertools = "0.5"
|
itertools = "0.5"
|
||||||
journaldb = { path = "../util/journaldb" }
|
journaldb = { path = "../util/journaldb" }
|
||||||
keccak-hash = "0.2.0"
|
keccak-hash = "0.4.0"
|
||||||
keccak-hasher = { path = "../util/keccak-hasher" }
|
kvdb = "0.3.1"
|
||||||
kvdb = "0.1"
|
kvdb-memorydb = { version = "0.3.1", optional = true }
|
||||||
kvdb-memorydb = "0.1"
|
kvdb-rocksdb = { version = "0.4.1", optional = true }
|
||||||
kvdb-rocksdb = { version = "0.1.3", optional = true }
|
lazy_static = { version = "1.3", optional = true }
|
||||||
lazy_static = "1.2.0"
|
|
||||||
len-caching-lock = { path = "../util/len-caching-lock" }
|
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
lru-cache = "0.1"
|
macros = { path = "../util/macros", optional = true }
|
||||||
macros = { path = "../util/macros" }
|
machine = { path = "./machine" }
|
||||||
memory-cache = { path = "../util/memory-cache" }
|
memory-cache = { path = "../util/memory-cache" }
|
||||||
memory-db = "0.12.4"
|
|
||||||
num_cpus = "1.2"
|
|
||||||
parity-bytes = "0.1"
|
parity-bytes = "0.1"
|
||||||
parity-snappy = "0.1"
|
parking_lot = "0.9"
|
||||||
parking_lot = "0.7"
|
pod = { path = "pod", optional = true }
|
||||||
pod-account = { path = "pod-account" }
|
trie-db = "0.18.0"
|
||||||
trie-db = "0.12.4"
|
parity-crypto = { version = "0.4.2", features = ["publickey"], optional = true }
|
||||||
patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" }
|
patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" }
|
||||||
rand = "0.6"
|
rand = "0.7"
|
||||||
|
rand_xorshift = "0.2"
|
||||||
rayon = "1.1"
|
rayon = "1.1"
|
||||||
|
registrar = { path = "../util/registrar" }
|
||||||
rlp = "0.4.0"
|
rlp = "0.4.0"
|
||||||
rlp_derive = { path = "../util/rlp-derive" }
|
rustc-hex = "2"
|
||||||
rustc-hex = "1.0"
|
scopeguard = "1.0.0"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
state-account = { path = "state-account" }
|
snapshot = { path = "snapshot" }
|
||||||
stats = { path = "../util/stats" }
|
spec = { path = "spec" }
|
||||||
|
state-db = { path = "state-db" }
|
||||||
tempdir = { version = "0.3", optional = true }
|
tempdir = { version = "0.3", optional = true }
|
||||||
time-utils = { path = "../util/time-utils" }
|
trace = { path = "trace" }
|
||||||
trace-time = "0.1"
|
trace-time = "0.1"
|
||||||
|
trie-vm-factories = { path = "trie-vm-factories" }
|
||||||
triehash-ethereum = { version = "0.2", path = "../util/triehash-ethereum" }
|
triehash-ethereum = { version = "0.2", path = "../util/triehash-ethereum" }
|
||||||
unexpected = { path = "../util/unexpected" }
|
unexpected = { path = "../util/unexpected" }
|
||||||
using_queue = { path = "../miner/using-queue" }
|
using_queue = { path = "../miner/using-queue" }
|
||||||
|
verification = { path = "./verification" }
|
||||||
vm = { path = "vm" }
|
vm = { path = "vm" }
|
||||||
wasm = { path = "wasm" }
|
|
||||||
rand_xorshift = "0.1.1"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
account-db = { path = "account-db" }
|
||||||
blooms-db = { path = "../util/blooms-db" }
|
blooms-db = { path = "../util/blooms-db" }
|
||||||
criterion = "0.2"
|
criterion = "0.3"
|
||||||
|
engine = { path = "./engine", features = ["test-helpers"] }
|
||||||
env_logger = "0.5"
|
env_logger = "0.5"
|
||||||
ethcore-accounts = { path = "../accounts" }
|
ethcore-accounts = { path = "../accounts" }
|
||||||
|
ethcore-builtin = { path = "./builtin" }
|
||||||
|
ethjson = { path = "../json", features = ["test-helpers"] }
|
||||||
|
parity-crypto = { version = "0.4.2", features = ["publickey"] }
|
||||||
fetch = { path = "../util/fetch" }
|
fetch = { path = "../util/fetch" }
|
||||||
kvdb-rocksdb = "0.1.3"
|
kvdb-memorydb = "0.3.1"
|
||||||
|
kvdb-rocksdb = "0.4.1"
|
||||||
|
lazy_static = "1.3"
|
||||||
|
machine = { path = "./machine", features = ["test-helpers"] }
|
||||||
|
macros = { path = "../util/macros" }
|
||||||
parity-runtime = { path = "../util/runtime" }
|
parity-runtime = { path = "../util/runtime" }
|
||||||
rlp_compress = { path = "../util/rlp-compress" }
|
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
stats = { path = "../util/stats" }
|
||||||
|
pod = { path = "pod" }
|
||||||
tempdir = "0.3"
|
tempdir = "0.3"
|
||||||
trie-standardmap = "0.12.4"
|
trie-standardmap = "0.15.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
parity = ["work-notify", "price-info", "stratum"]
|
parity = ["work-notify", "price-info", "stratum", "macros"]
|
||||||
# Large optional features that are enabled by default for Parity,
|
# Large optional features that are enabled by default for Parity,
|
||||||
# but might be omitted for other dependent crates.
|
# but might be omitted for other dependent crates.
|
||||||
work-notify = ["ethcore-miner/work-notify"]
|
work-notify = ["ethcore-miner/work-notify"]
|
||||||
price-info = ["ethcore-miner/price-info"]
|
price-info = ["ethcore-miner/price-info"]
|
||||||
stratum = ["ethcore-stratum"]
|
stratum = [
|
||||||
|
"ethash",
|
||||||
|
"ethcore-stratum"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
# Disables seal verification for mined blocks.
|
# Disables seal verification for mined blocks.
|
||||||
# This allows you to submit any seal via RPC to test and benchmark
|
# This allows you to submit any seal via RPC to test and benchmark
|
||||||
@@ -108,15 +116,22 @@ evm-debug-tests = ["evm-debug", "evm/evm-debug-tests"]
|
|||||||
# EVM debug traces are printed.
|
# EVM debug traces are printed.
|
||||||
slow-blocks = []
|
slow-blocks = []
|
||||||
# Run JSON consensus tests.
|
# Run JSON consensus tests.
|
||||||
json-tests = ["env_logger", "test-helpers", "to-pod-full"]
|
json-tests = ["env_logger", "test-helpers", "lazy_static", "machine/test-helpers", "common-types/test-helpers"]
|
||||||
# Skip JSON consensus tests with pending issues.
|
|
||||||
ci-skip-tests = []
|
|
||||||
# Run memory/cpu heavy tests.
|
# Run memory/cpu heavy tests.
|
||||||
test-heavy = []
|
test-heavy = []
|
||||||
# Compile test helpers
|
# Compile test helpers
|
||||||
test-helpers = ["tempdir", "kvdb-rocksdb", "blooms-db"]
|
# note[dvdplm]: "basic-authority/test-helpers" is needed so that `generate_dummy_client_with_spec` works
|
||||||
# Enables slow 'to-pod-full' method for use in tests and evmbin.
|
test-helpers = [
|
||||||
to-pod-full = []
|
"blooms-db",
|
||||||
|
"ethjson/test-helpers",
|
||||||
|
"parity-crypto",
|
||||||
|
"kvdb-memorydb",
|
||||||
|
"kvdb-rocksdb",
|
||||||
|
"macros",
|
||||||
|
"pod",
|
||||||
|
"tempdir",
|
||||||
|
"basic-authority/test-helpers"
|
||||||
|
]
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "builtin"
|
name = "builtin"
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "DB backend wrapper for Account trie"
|
|
||||||
name = "account-db"
|
name = "account-db"
|
||||||
version = "0.1.0"
|
description = "DB backend wrapper for Account trie"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
license = "GPL-3.0"
|
||||||
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ethereum-types = "0.6"
|
ethereum-types = "0.8.0"
|
||||||
hash-db = "0.12.4"
|
hash-db = "0.15.0"
|
||||||
keccak-hash = "0.2.0"
|
keccak-hash = "0.4.0"
|
||||||
keccak-hasher = { path = "../../util/keccak-hasher" }
|
keccak-hasher = { path = "../../util/keccak-hasher" }
|
||||||
kvdb = "0.1"
|
kvdb = "0.3.1"
|
||||||
rlp = "0.4"
|
rlp = "0.4"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -93,7 +93,7 @@ impl<'db> AsHashDB<KeccakHasher, DBValue> for AccountDB<'db> {
|
|||||||
impl<'db> HashDB<KeccakHasher, DBValue> for AccountDB<'db> {
|
impl<'db> HashDB<KeccakHasher, DBValue> for AccountDB<'db> {
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
if key == &KECCAK_NULL_RLP {
|
if key == &KECCAK_NULL_RLP {
|
||||||
return Some(DBValue::from_slice(&NULL_RLP));
|
return Some(NULL_RLP.to_vec());
|
||||||
}
|
}
|
||||||
self.db.get(&combine_key(&self.address_hash, key), prefix)
|
self.db.get(&combine_key(&self.address_hash, key), prefix)
|
||||||
}
|
}
|
||||||
@@ -139,7 +139,7 @@ impl<'db> AccountDBMut<'db> {
|
|||||||
impl<'db> HashDB<KeccakHasher, DBValue> for AccountDBMut<'db>{
|
impl<'db> HashDB<KeccakHasher, DBValue> for AccountDBMut<'db>{
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
if key == &KECCAK_NULL_RLP {
|
if key == &KECCAK_NULL_RLP {
|
||||||
return Some(DBValue::from_slice(&NULL_RLP));
|
return Some(NULL_RLP.to_vec());
|
||||||
}
|
}
|
||||||
self.db.get(&combine_key(&self.address_hash, key), prefix)
|
self.db.get(&combine_key(&self.address_hash, key), prefix)
|
||||||
}
|
}
|
||||||
@@ -157,7 +157,7 @@ impl<'db> HashDB<KeccakHasher, DBValue> for AccountDBMut<'db>{
|
|||||||
}
|
}
|
||||||
let k = keccak(value);
|
let k = keccak(value);
|
||||||
let ak = combine_key(&self.address_hash, &k);
|
let ak = combine_key(&self.address_hash, &k);
|
||||||
self.db.emplace(ak, prefix, DBValue::from_slice(value));
|
self.db.emplace(ak, prefix, value.to_vec());
|
||||||
k
|
k
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ impl<'db> AsHashDB<KeccakHasher, DBValue> for Wrapping<'db> {
|
|||||||
impl<'db> HashDB<KeccakHasher, DBValue> for Wrapping<'db> {
|
impl<'db> HashDB<KeccakHasher, DBValue> for Wrapping<'db> {
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
if key == &KECCAK_NULL_RLP {
|
if key == &KECCAK_NULL_RLP {
|
||||||
return Some(DBValue::from_slice(&NULL_RLP));
|
return Some(NULL_RLP.to_vec());
|
||||||
}
|
}
|
||||||
self.0.get(key, prefix)
|
self.0.get(key, prefix)
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ impl<'db> AsHashDB<KeccakHasher, DBValue> for WrappingMut<'db> {
|
|||||||
impl<'db> HashDB<KeccakHasher, DBValue> for WrappingMut<'db>{
|
impl<'db> HashDB<KeccakHasher, DBValue> for WrappingMut<'db>{
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
if key == &KECCAK_NULL_RLP {
|
if key == &KECCAK_NULL_RLP {
|
||||||
return Some(DBValue::from_slice(&NULL_RLP));
|
return Some(NULL_RLP.to_vec());
|
||||||
}
|
}
|
||||||
self.0.get(key, prefix)
|
self.0.get(key, prefix)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,35 @@
|
|||||||
[package]
|
[package]
|
||||||
description = "Ethereum accounts, keeps track of changes to the code and storage."
|
name = "account-state"
|
||||||
name = "state-account"
|
description = "Ethereum accounts, keeps track of changes to the code and storage"
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
license = "GPL-3.0"
|
||||||
|
version = "0.1.0"
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
common-types = { path = "../types"}
|
common-types = { path = "../types"}
|
||||||
ethereum-types = "0.6.0"
|
derive_more = "0.15.0"
|
||||||
|
ethereum-types = "0.8.0"
|
||||||
ethtrie = { package = "patricia-trie-ethereum", path = "../../util/patricia-trie-ethereum" }
|
ethtrie = { package = "patricia-trie-ethereum", path = "../../util/patricia-trie-ethereum" }
|
||||||
hash-db = "0.12.4"
|
trie-vm-factories = { path = "../trie-vm-factories" }
|
||||||
keccak-hash = "0.2.0"
|
hash-db = "0.15.0"
|
||||||
|
journaldb = { path = "../../util/journaldb" }
|
||||||
|
keccak-hash = "0.4.0"
|
||||||
keccak-hasher = { path = "../../util/keccak-hasher" }
|
keccak-hasher = { path = "../../util/keccak-hasher" }
|
||||||
kvdb = "0.1.0"
|
kvdb = "0.3.1"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
lru-cache = "0.1.2"
|
lru-cache = "0.1.2"
|
||||||
|
memory-db = "0.18.0"
|
||||||
parity-bytes = "0.1.0"
|
parity-bytes = "0.1.0"
|
||||||
pod-account = { path = "../pod-account" }
|
parity-util-mem = "0.3.0"
|
||||||
|
parking_lot = "0.9"
|
||||||
|
pod = { path = "../pod" }
|
||||||
rlp = "0.4.0"
|
rlp = "0.4.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
trie-db = "0.12.4"
|
trie-db = "0.18.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
account-db = { path = "../account-db" }
|
account-db = { path = "../account-db" }
|
||||||
rlp_compress = { path = "../../util/rlp-compress" }
|
|
||||||
journaldb = { path = "../../util/journaldb" }
|
journaldb = { path = "../../util/journaldb" }
|
||||||
parity-bytes = "0.1.0"
|
parity-bytes = "0.1.0"
|
||||||
|
rlp_compress = { path = "../../util/rlp-compress" }
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -15,24 +15,24 @@
|
|||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//! Single account in the system.
|
//! Single account in the system.
|
||||||
use log::{warn, trace};
|
use std::cell::{Cell, RefCell};
|
||||||
|
use std::collections::{BTreeMap, HashMap};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::collections::{HashMap, BTreeMap};
|
|
||||||
use keccak_hash::{KECCAK_EMPTY, KECCAK_NULL_RLP, keccak};
|
|
||||||
use ethereum_types::{H256, U256, Address, BigEndianHash};
|
|
||||||
use hash_db::HashDB;
|
|
||||||
use keccak_hasher::KeccakHasher;
|
|
||||||
use kvdb::DBValue;
|
|
||||||
use parity_bytes::{Bytes, ToPretty};
|
|
||||||
use trie_db::{Trie, Recorder};
|
|
||||||
use ethtrie::{TrieFactory, TrieDB, SecTrieDB, Result as TrieResult};
|
|
||||||
use pod_account::PodAccount;
|
|
||||||
use rlp::{RlpStream, DecoderError, encode};
|
|
||||||
use lru_cache::LruCache;
|
|
||||||
use common_types::basic_account::BasicAccount;
|
|
||||||
|
|
||||||
use std::cell::{RefCell, Cell};
|
use ethereum_types::{Address, BigEndianHash, H256, U256};
|
||||||
|
use hash_db::HashDB;
|
||||||
|
use keccak_hash::{keccak, KECCAK_EMPTY, KECCAK_NULL_RLP};
|
||||||
|
use kvdb::DBValue;
|
||||||
|
use log::{trace, warn};
|
||||||
|
use lru_cache::LruCache;
|
||||||
|
use parity_bytes::{Bytes, ToPretty};
|
||||||
|
use rlp::{DecoderError, encode};
|
||||||
|
use trie_db::{Recorder, Trie};
|
||||||
|
use common_types::basic_account::BasicAccount;
|
||||||
|
use ethtrie::{Result as TrieResult, SecTrieDB, TrieDB, TrieFactory};
|
||||||
|
use keccak_hasher::KeccakHasher;
|
||||||
|
use pod::PodAccount;
|
||||||
|
|
||||||
const STORAGE_CACHE_ITEMS: usize = 8192;
|
const STORAGE_CACHE_ITEMS: usize = 8192;
|
||||||
|
|
||||||
@@ -71,6 +71,8 @@ pub struct Account {
|
|||||||
code_size: Option<usize>,
|
code_size: Option<usize>,
|
||||||
// Code cache of the account.
|
// Code cache of the account.
|
||||||
code_cache: Arc<Bytes>,
|
code_cache: Arc<Bytes>,
|
||||||
|
// Version of the account.
|
||||||
|
code_version: U256,
|
||||||
// Account code new or has been modified.
|
// Account code new or has been modified.
|
||||||
code_filth: Filth,
|
code_filth: Filth,
|
||||||
// Cached address hash.
|
// Cached address hash.
|
||||||
@@ -89,6 +91,7 @@ impl From<BasicAccount> for Account {
|
|||||||
code_hash: basic.code_hash,
|
code_hash: basic.code_hash,
|
||||||
code_size: None,
|
code_size: None,
|
||||||
code_cache: Arc::new(vec![]),
|
code_cache: Arc::new(vec![]),
|
||||||
|
code_version: basic.code_version,
|
||||||
code_filth: Filth::Clean,
|
code_filth: Filth::Clean,
|
||||||
address_hash: Cell::new(None),
|
address_hash: Cell::new(None),
|
||||||
}
|
}
|
||||||
@@ -98,7 +101,7 @@ impl From<BasicAccount> for Account {
|
|||||||
impl Account {
|
impl Account {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
/// General constructor.
|
/// General constructor.
|
||||||
pub fn new(balance: U256, nonce: U256, storage: HashMap<H256, H256>, code: Bytes) -> Account {
|
pub fn new(balance: U256, nonce: U256, storage: HashMap<H256, H256>, code: Bytes, version: U256) -> Account {
|
||||||
Account {
|
Account {
|
||||||
balance: balance,
|
balance: balance,
|
||||||
nonce: nonce,
|
nonce: nonce,
|
||||||
@@ -109,6 +112,7 @@ impl Account {
|
|||||||
code_hash: keccak(&code),
|
code_hash: keccak(&code),
|
||||||
code_size: Some(code.len()),
|
code_size: Some(code.len()),
|
||||||
code_cache: Arc::new(code),
|
code_cache: Arc::new(code),
|
||||||
|
code_version: version,
|
||||||
code_filth: Filth::Dirty,
|
code_filth: Filth::Dirty,
|
||||||
address_hash: Cell::new(None),
|
address_hash: Cell::new(None),
|
||||||
}
|
}
|
||||||
@@ -131,6 +135,7 @@ impl Account {
|
|||||||
code_filth: Filth::Dirty,
|
code_filth: Filth::Dirty,
|
||||||
code_size: Some(pod.code.as_ref().map_or(0, |c| c.len())),
|
code_size: Some(pod.code.as_ref().map_or(0, |c| c.len())),
|
||||||
code_cache: Arc::new(pod.code.map_or_else(|| { warn!("POD account with unknown code is being created! Assuming no code."); vec![] }, |c| c)),
|
code_cache: Arc::new(pod.code.map_or_else(|| { warn!("POD account with unknown code is being created! Assuming no code."); vec![] }, |c| c)),
|
||||||
|
code_version: pod.version,
|
||||||
address_hash: Cell::new(None),
|
address_hash: Cell::new(None),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,6 +151,7 @@ impl Account {
|
|||||||
m
|
m
|
||||||
}),
|
}),
|
||||||
code: self.code().map(|x| x.to_vec()),
|
code: self.code().map(|x| x.to_vec()),
|
||||||
|
version: self.code_version,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +167,7 @@ impl Account {
|
|||||||
code_hash: KECCAK_EMPTY,
|
code_hash: KECCAK_EMPTY,
|
||||||
code_cache: Arc::new(vec![]),
|
code_cache: Arc::new(vec![]),
|
||||||
code_size: Some(0),
|
code_size: Some(0),
|
||||||
|
code_version: U256::zero(),
|
||||||
code_filth: Filth::Clean,
|
code_filth: Filth::Clean,
|
||||||
address_hash: Cell::new(None),
|
address_hash: Cell::new(None),
|
||||||
}
|
}
|
||||||
@@ -174,10 +181,10 @@ impl Account {
|
|||||||
|
|
||||||
/// Create a new contract account.
|
/// Create a new contract account.
|
||||||
/// NOTE: make sure you use `init_code` on this before `commit`ing.
|
/// NOTE: make sure you use `init_code` on this before `commit`ing.
|
||||||
pub fn new_contract(balance: U256, nonce: U256, original_storage_root: H256) -> Account {
|
pub fn new_contract(balance: U256, nonce: U256, version: U256, original_storage_root: H256) -> Account {
|
||||||
Account {
|
Account {
|
||||||
balance: balance,
|
balance,
|
||||||
nonce: nonce,
|
nonce,
|
||||||
storage_root: KECCAK_NULL_RLP,
|
storage_root: KECCAK_NULL_RLP,
|
||||||
storage_cache: Self::empty_storage_cache(),
|
storage_cache: Self::empty_storage_cache(),
|
||||||
original_storage_cache: if original_storage_root == KECCAK_NULL_RLP {
|
original_storage_cache: if original_storage_root == KECCAK_NULL_RLP {
|
||||||
@@ -189,6 +196,7 @@ impl Account {
|
|||||||
code_hash: KECCAK_EMPTY,
|
code_hash: KECCAK_EMPTY,
|
||||||
code_cache: Arc::new(vec![]),
|
code_cache: Arc::new(vec![]),
|
||||||
code_size: None,
|
code_size: None,
|
||||||
|
code_version: version,
|
||||||
code_filth: Filth::Clean,
|
code_filth: Filth::Clean,
|
||||||
address_hash: Cell::new(None),
|
address_hash: Cell::new(None),
|
||||||
}
|
}
|
||||||
@@ -319,6 +327,9 @@ impl Account {
|
|||||||
/// return the nonce associated with this account.
|
/// return the nonce associated with this account.
|
||||||
pub fn nonce(&self) -> &U256 { &self.nonce }
|
pub fn nonce(&self) -> &U256 { &self.nonce }
|
||||||
|
|
||||||
|
/// return the code version associated with this account.
|
||||||
|
pub fn code_version(&self) -> &U256 { &self.code_version }
|
||||||
|
|
||||||
/// return the code hash associated with this account.
|
/// return the code hash associated with this account.
|
||||||
pub fn code_hash(&self) -> H256 {
|
pub fn code_hash(&self) -> H256 {
|
||||||
self.code_hash.clone()
|
self.code_hash.clone()
|
||||||
@@ -379,7 +390,7 @@ impl Account {
|
|||||||
match db.get(&self.code_hash, hash_db::EMPTY_PREFIX) {
|
match db.get(&self.code_hash, hash_db::EMPTY_PREFIX) {
|
||||||
Some(x) => {
|
Some(x) => {
|
||||||
self.code_size = Some(x.len());
|
self.code_size = Some(x.len());
|
||||||
self.code_cache = Arc::new(x.into_vec());
|
self.code_cache = Arc::new(x);
|
||||||
Some(self.code_cache.clone())
|
Some(self.code_cache.clone())
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
@@ -519,7 +530,7 @@ impl Account {
|
|||||||
self.code_filth = Filth::Clean;
|
self.code_filth = Filth::Clean;
|
||||||
},
|
},
|
||||||
(true, false) => {
|
(true, false) => {
|
||||||
db.emplace(self.code_hash.clone(), hash_db::EMPTY_PREFIX, DBValue::from_slice(&*self.code_cache));
|
db.emplace(self.code_hash.clone(), hash_db::EMPTY_PREFIX, self.code_cache.to_vec());
|
||||||
self.code_size = Some(self.code_cache.len());
|
self.code_size = Some(self.code_cache.len());
|
||||||
self.code_filth = Filth::Clean;
|
self.code_filth = Filth::Clean;
|
||||||
},
|
},
|
||||||
@@ -529,12 +540,15 @@ impl Account {
|
|||||||
|
|
||||||
/// Export to RLP.
|
/// Export to RLP.
|
||||||
pub fn rlp(&self) -> Bytes {
|
pub fn rlp(&self) -> Bytes {
|
||||||
let mut stream = RlpStream::new_list(4);
|
let basic = BasicAccount {
|
||||||
stream.append(&self.nonce);
|
nonce: self.nonce,
|
||||||
stream.append(&self.balance);
|
balance: self.balance,
|
||||||
stream.append(&self.storage_root);
|
storage_root: self.storage_root,
|
||||||
stream.append(&self.code_hash);
|
code_hash: self.code_hash,
|
||||||
stream.out()
|
code_version: self.code_version,
|
||||||
|
};
|
||||||
|
|
||||||
|
rlp::encode(&basic)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Clone basic account data
|
/// Clone basic account data
|
||||||
@@ -549,6 +563,7 @@ impl Account {
|
|||||||
code_hash: self.code_hash.clone(),
|
code_hash: self.code_hash.clone(),
|
||||||
code_size: self.code_size.clone(),
|
code_size: self.code_size.clone(),
|
||||||
code_cache: self.code_cache.clone(),
|
code_cache: self.code_cache.clone(),
|
||||||
|
code_version: self.code_version,
|
||||||
code_filth: self.code_filth,
|
code_filth: self.code_filth,
|
||||||
address_hash: self.address_hash.clone(),
|
address_hash: self.address_hash.clone(),
|
||||||
}
|
}
|
||||||
@@ -579,6 +594,7 @@ impl Account {
|
|||||||
self.code_filth = other.code_filth;
|
self.code_filth = other.code_filth;
|
||||||
self.code_cache = other.code_cache;
|
self.code_cache = other.code_cache;
|
||||||
self.code_size = other.code_size;
|
self.code_size = other.code_size;
|
||||||
|
self.code_version = other.code_version;
|
||||||
self.address_hash = other.address_hash;
|
self.address_hash = other.address_hash;
|
||||||
if self.storage_root == other.storage_root {
|
if self.storage_root == other.storage_root {
|
||||||
let mut cache = self.storage_cache.borrow_mut();
|
let mut cache = self.storage_cache.borrow_mut();
|
||||||
@@ -627,14 +643,17 @@ impl fmt::Debug for Account {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use rlp_compress::{compress, decompress, snapshot_swapper};
|
|
||||||
use ethereum_types::{H256, Address};
|
|
||||||
use journaldb::new_memory_db;
|
|
||||||
use parity_bytes::Bytes;
|
|
||||||
use super::*;
|
|
||||||
use account_db::*;
|
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use ethereum_types::{Address, H256};
|
||||||
|
use parity_bytes::Bytes;
|
||||||
|
|
||||||
|
use account_db::*;
|
||||||
|
use journaldb::new_memory_db;
|
||||||
|
use rlp_compress::{compress, decompress, snapshot_swapper};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn account_compress() {
|
fn account_compress() {
|
||||||
let raw = Account::new_basic(2.into(), 4.into()).rlp();
|
let raw = Account::new_basic(2.into(), 4.into()).rlp();
|
||||||
@@ -649,7 +668,7 @@ mod tests {
|
|||||||
let mut db = new_memory_db();
|
let mut db = new_memory_db();
|
||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
let rlp = {
|
let rlp = {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
a.set_storage(H256::zero(), H256::from_low_u64_be(0x1234));
|
a.set_storage(H256::zero(), H256::from_low_u64_be(0x1234));
|
||||||
a.commit_storage(&Default::default(), &mut db).unwrap();
|
a.commit_storage(&Default::default(), &mut db).unwrap();
|
||||||
a.init_code(vec![]);
|
a.init_code(vec![]);
|
||||||
@@ -669,7 +688,7 @@ mod tests {
|
|||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
|
|
||||||
let rlp = {
|
let rlp = {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
||||||
a.commit_code(&mut db);
|
a.commit_code(&mut db);
|
||||||
a.rlp()
|
a.rlp()
|
||||||
@@ -684,7 +703,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn commit_storage() {
|
fn commit_storage() {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
let mut db = new_memory_db();
|
let mut db = new_memory_db();
|
||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
a.set_storage(H256::from_low_u64_be(0), H256::from_low_u64_be(0x1234));
|
a.set_storage(H256::from_low_u64_be(0), H256::from_low_u64_be(0x1234));
|
||||||
@@ -695,7 +714,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn commit_remove_commit_storage() {
|
fn commit_remove_commit_storage() {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
let mut db = new_memory_db();
|
let mut db = new_memory_db();
|
||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
a.set_storage(H256::from_low_u64_be(0), H256::from_low_u64_be(0x1234));
|
a.set_storage(H256::from_low_u64_be(0), H256::from_low_u64_be(0x1234));
|
||||||
@@ -709,7 +728,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn commit_code() {
|
fn commit_code() {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
let mut db = new_memory_db();
|
let mut db = new_memory_db();
|
||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
||||||
@@ -721,7 +740,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reset_code() {
|
fn reset_code() {
|
||||||
let mut a = Account::new_contract(69.into(), 0.into(), KECCAK_NULL_RLP);
|
let mut a = Account::new_contract(69.into(), 0.into(), 0.into(), KECCAK_NULL_RLP);
|
||||||
let mut db = new_memory_db();
|
let mut db = new_memory_db();
|
||||||
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
let mut db = AccountDBMut::from_hash(&mut db, keccak(&Address::zero()));
|
||||||
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
a.init_code(vec![0x55, 0x44, 0xffu8]);
|
||||||
@@ -737,7 +756,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn rlpio() {
|
fn rlpio() {
|
||||||
let a = Account::new(69u8.into(), 0u8.into(), HashMap::new(), Bytes::new());
|
let a = Account::new(69u8.into(), 0u8.into(), HashMap::new(), Bytes::new(), 0.into());
|
||||||
let b = Account::from_rlp(&a.rlp()).unwrap();
|
let b = Account::from_rlp(&a.rlp()).unwrap();
|
||||||
assert_eq!(a.balance(), b.balance());
|
assert_eq!(a.balance(), b.balance());
|
||||||
assert_eq!(a.nonce(), b.nonce());
|
assert_eq!(a.nonce(), b.nonce());
|
||||||
@@ -747,7 +766,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn new_account() {
|
fn new_account() {
|
||||||
let a = Account::new(69u8.into(), 0u8.into(), HashMap::new(), Bytes::new());
|
let a = Account::new(69u8.into(), 0u8.into(), HashMap::new(), Bytes::new(), 0.into());
|
||||||
assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
|
assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470");
|
||||||
assert_eq!(*a.balance(), 69u8.into());
|
assert_eq!(*a.balance(), 69u8.into());
|
||||||
assert_eq!(*a.nonce(), 0u8.into());
|
assert_eq!(*a.nonce(), 0u8.into());
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -21,17 +21,17 @@
|
|||||||
//! should become general over time to the point where not even a
|
//! should become general over time to the point where not even a
|
||||||
//! merkle trie is strictly necessary.
|
//! merkle trie is strictly necessary.
|
||||||
|
|
||||||
use std::collections::{HashSet, HashMap};
|
use std::collections::HashSet;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use state::Account;
|
|
||||||
use parking_lot::Mutex;
|
|
||||||
use ethereum_types::{Address, H256};
|
use ethereum_types::{Address, H256};
|
||||||
use memory_db::{MemoryDB, HashKey};
|
use hash_db::{AsHashDB, EMPTY_PREFIX, HashDB, Prefix};
|
||||||
use hash_db::{AsHashDB, HashDB, Prefix, EMPTY_PREFIX};
|
|
||||||
use kvdb::DBValue;
|
use kvdb::DBValue;
|
||||||
|
use memory_db::{HashKey, MemoryDB};
|
||||||
|
use parking_lot::Mutex;
|
||||||
use keccak_hasher::KeccakHasher;
|
use keccak_hasher::KeccakHasher;
|
||||||
use journaldb::AsKeyedHashDB;
|
|
||||||
|
use crate::account::Account;
|
||||||
|
|
||||||
/// State backend. See module docs for more details.
|
/// State backend. See module docs for more details.
|
||||||
pub trait Backend: Send {
|
pub trait Backend: Send {
|
||||||
@@ -89,10 +89,6 @@ impl ProofCheck {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl journaldb::KeyedHashDB for ProofCheck {
|
|
||||||
fn keys(&self) -> HashMap<H256, i32> { self.0.keys() }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl HashDB<KeccakHasher, DBValue> for ProofCheck {
|
impl HashDB<KeccakHasher, DBValue> for ProofCheck {
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
self.0.get(key, prefix)
|
self.0.get(key, prefix)
|
||||||
@@ -145,23 +141,11 @@ pub struct Proving<H> {
|
|||||||
proof: Mutex<HashSet<DBValue>>,
|
proof: Mutex<HashSet<DBValue>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<AH: AsKeyedHashDB + Send + Sync> AsKeyedHashDB for Proving<AH> {
|
|
||||||
fn as_keyed_hash_db(&self) -> &dyn journaldb::KeyedHashDB { self }
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<AH: AsHashDB<KeccakHasher, DBValue> + Send + Sync> AsHashDB<KeccakHasher, DBValue> for Proving<AH> {
|
impl<AH: AsHashDB<KeccakHasher, DBValue> + Send + Sync> AsHashDB<KeccakHasher, DBValue> for Proving<AH> {
|
||||||
fn as_hash_db(&self) -> &dyn HashDB<KeccakHasher, DBValue> { self }
|
fn as_hash_db(&self) -> &dyn HashDB<KeccakHasher, DBValue> { self }
|
||||||
fn as_hash_db_mut(&mut self) -> &mut dyn HashDB<KeccakHasher, DBValue> { self }
|
fn as_hash_db_mut(&mut self) -> &mut dyn HashDB<KeccakHasher, DBValue> { self }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<H: AsKeyedHashDB + Send + Sync> journaldb::KeyedHashDB for Proving<H> {
|
|
||||||
fn keys(&self) -> HashMap<H256, i32> {
|
|
||||||
let mut keys = self.base.as_keyed_hash_db().keys();
|
|
||||||
keys.extend(self.changed.keys());
|
|
||||||
keys
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<H: AsHashDB<KeccakHasher, DBValue> + Send + Sync> HashDB<KeccakHasher, DBValue> for Proving<H> {
|
impl<H: AsHashDB<KeccakHasher, DBValue> + Send + Sync> HashDB<KeccakHasher, DBValue> for Proving<H> {
|
||||||
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
fn get(&self, key: &H256, prefix: Prefix) -> Option<DBValue> {
|
||||||
match self.base.as_hash_db().get(key, prefix) {
|
match self.base.as_hash_db().get(key, prefix) {
|
||||||
@@ -220,7 +204,7 @@ impl<H: AsHashDB<KeccakHasher, DBValue>> Proving<H> {
|
|||||||
/// This will store all values ever fetched from that base.
|
/// This will store all values ever fetched from that base.
|
||||||
pub fn new(base: H) -> Self {
|
pub fn new(base: H) -> Self {
|
||||||
Proving {
|
Proving {
|
||||||
base: base,
|
base,
|
||||||
changed: journaldb::new_memory_db(),
|
changed: journaldb::new_memory_db(),
|
||||||
proof: Mutex::new(HashSet::new()),
|
proof: Mutex::new(HashSet::new()),
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -14,18 +14,20 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use tiny_keccak::Keccak;
|
//! Account state
|
||||||
|
//! This crate contains code used to create, convert, and update Accounts and the code and storage
|
||||||
|
//! associated with it. It also defines the trait used to construct a backend to build a complete
|
||||||
|
//! caching state database.
|
||||||
|
//! Note: the code that needs access to `ethcore` types such as `Machine` and `Executive` is found in
|
||||||
|
//! the `executive_state` module in `ethcore`. Most tests for the `State` module in this crate are
|
||||||
|
//! also found in `executive_state` (for the same reason).
|
||||||
|
|
||||||
pub trait Keccak256<T> {
|
pub mod account;
|
||||||
fn keccak256(&self) -> T where T: Sized;
|
pub mod backend;
|
||||||
}
|
pub mod state;
|
||||||
|
|
||||||
impl Keccak256<[u8; 32]> for [u8] {
|
pub use {
|
||||||
fn keccak256(&self) -> [u8; 32] {
|
account::Account,
|
||||||
let mut keccak = Keccak::new_keccak256();
|
backend::Backend,
|
||||||
let mut result = [0u8; 32];
|
state::{State, CleanupMode},
|
||||||
keccak.update(self);
|
};
|
||||||
keccak.finalize(&mut result);
|
|
||||||
result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1163
ethcore/account-state/src/state.rs
Normal file
1163
ethcore/account-state/src/state.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
// This file is part of Parity Ethereum.
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
// Parity Ethereum is free software: you can redistribute it and/or modify
|
// Parity Ethereum is free software: you can redistribute it and/or modify
|
||||||
@@ -20,17 +20,19 @@ extern crate criterion;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
|
|
||||||
|
extern crate machine;
|
||||||
extern crate ethcore;
|
extern crate ethcore;
|
||||||
|
extern crate ethcore_builtin;
|
||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
extern crate parity_bytes as bytes;
|
extern crate parity_bytes as bytes;
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
|
|
||||||
use criterion::{Criterion, Bencher};
|
use criterion::{Criterion, Bencher};
|
||||||
use bytes::BytesRef;
|
use bytes::BytesRef;
|
||||||
use ethcore::builtin::Builtin;
|
use ethcore_builtin::Builtin;
|
||||||
use ethcore::machine::Machine;
|
|
||||||
use ethereum_types::H160;
|
use ethereum_types::H160;
|
||||||
use ethcore::ethereum::new_byzantium_test_machine;
|
use machine::Machine;
|
||||||
|
use machine::test_helpers::new_byzantium_test_machine;
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
|||||||
20
ethcore/block-gas-limit/Cargo.toml
Normal file
20
ethcore/block-gas-limit/Cargo.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
description = "A crate to interact with the block gas limit contract"
|
||||||
|
name = "block-gas-limit"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
edition = "2018"
|
||||||
|
license = "GPL-3.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
client-traits = { path = "../client-traits" }
|
||||||
|
common-types = { path = "../types" }
|
||||||
|
ethabi = "9.0.1"
|
||||||
|
ethabi-derive = "9.0.1"
|
||||||
|
ethabi-contract = "9.0.0"
|
||||||
|
ethereum-types = "0.8.0"
|
||||||
|
log = "0.4"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
ethcore = { path = "..", features = ["test-helpers"] }
|
||||||
|
spec = { path = "../spec" }
|
||||||
16
ethcore/block-gas-limit/res/block_gas_limit.json
Normal file
16
ethcore/block-gas-limit/res/block_gas_limit.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": true,
|
||||||
|
"inputs": [],
|
||||||
|
"name": "blockGasLimit",
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "",
|
||||||
|
"type": "uint256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"payable": false,
|
||||||
|
"stateMutability": "view",
|
||||||
|
"type": "function"
|
||||||
|
}
|
||||||
|
]
|
||||||
39
ethcore/block-gas-limit/src/lib.rs
Normal file
39
ethcore/block-gas-limit/src/lib.rs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
// Copyright 2015-2020 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Parity Ethereum.
|
||||||
|
|
||||||
|
// Parity Ethereum 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 Ethereum 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 Ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! A client interface for interacting with the block gas limit contract.
|
||||||
|
|
||||||
|
use client_traits::BlockChainClient;
|
||||||
|
use common_types::{header::Header, ids::BlockId};
|
||||||
|
use ethabi::FunctionOutputDecoder;
|
||||||
|
use ethabi_contract::use_contract;
|
||||||
|
use ethereum_types::{Address, U256};
|
||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
|
use_contract!(contract, "res/block_gas_limit.json");
|
||||||
|
|
||||||
|
pub fn block_gas_limit(full_client: &dyn BlockChainClient, header: &Header, address: Address) -> Option<U256> {
|
||||||
|
let (data, decoder) = contract::functions::block_gas_limit::call();
|
||||||
|
let value = full_client.call_contract(BlockId::Hash(*header.parent_hash()), address, data).map_err(|err| {
|
||||||
|
error!(target: "block_gas_limit", "Contract call failed. Not changing the block gas limit. {:?}", err);
|
||||||
|
}).ok()?;
|
||||||
|
if value.is_empty() {
|
||||||
|
debug!(target: "block_gas_limit", "Contract call returned nothing. Not changing the block gas limit.");
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
decoder.decode(&value).ok()
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user