v2.5.10 stable (#11239)
* 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)
This commit is contained in:
parent
5ee54b7298
commit
f3cdd7bf21
3
.gitignore
vendored
3
.gitignore
vendored
@ -43,3 +43,6 @@ parity-clib-examples/cpp/build/
|
|||||||
.vscode
|
.vscode
|
||||||
rls/
|
rls/
|
||||||
/parity.*
|
/parity.*
|
||||||
|
|
||||||
|
# cargo remote artifacts
|
||||||
|
remote-target
|
||||||
|
@ -5,16 +5,15 @@ stages:
|
|||||||
- optional
|
- optional
|
||||||
|
|
||||||
image: ${REGISTRY}/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
|
||||||
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
|
||||||
REGISTRY: registry.parity.io/parity/infrastructure/scripts
|
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
|
||||||
@ -38,22 +37,6 @@ variables:
|
|||||||
before_script:
|
before_script:
|
||||||
- rustup show
|
- rustup show
|
||||||
- cargo --version
|
- cargo --version
|
||||||
- SCCACHE_ERROR_LOG=/builds/parity/parity-ethereum/sccache_debug.log
|
|
||||||
RUST_LOG=sccache=debug
|
|
||||||
sccache --start-server
|
|
||||||
- sccache -s
|
|
||||||
after_script:
|
|
||||||
# sccache debug info
|
|
||||||
- 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
|
||||||
|
|
||||||
@ -63,7 +46,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
|
||||||
@ -81,20 +63,41 @@ 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 --stop-server
|
||||||
|
|
||||||
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 --stop-server
|
||||||
|
|
||||||
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 --stop-server
|
||||||
|
|
||||||
|
cargo-check-evmbin:
|
||||||
|
stage: test
|
||||||
|
<<: *docker-cache-status
|
||||||
|
script:
|
||||||
|
- time cargo check -p evmbin --target $CARGO_TARGET --locked --verbose --color=always
|
||||||
|
- sccache -s
|
||||||
|
|
||||||
|
cargo-check-evmbin:
|
||||||
|
stage: test
|
||||||
|
<<: *docker-cache-status
|
||||||
|
script:
|
||||||
|
- time cargo check -p evmbin --target $CARGO_TARGET --locked --verbose --color=always
|
||||||
|
- sccache -s
|
||||||
|
|
||||||
|
cargo-check-benches:
|
||||||
|
stage: test
|
||||||
|
<<: *docker-cache-status
|
||||||
|
script:
|
||||||
|
- time cargo check --all --benches --target $CARGO_TARGET --locked --verbose --color=always
|
||||||
- sccache -s
|
- sccache -s
|
||||||
|
|
||||||
cargo-audit:
|
cargo-audit:
|
||||||
@ -109,21 +112,18 @@ validate-chainspecs:
|
|||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/validate-chainspecs.sh
|
- ./scripts/gitlab/validate-chainspecs.sh
|
||||||
- sccache -s
|
|
||||||
|
|
||||||
test-cpp:
|
test-cpp:
|
||||||
stage: build
|
stage: build
|
||||||
<<: *docker-cache-status
|
<<: *docker-cache-status
|
||||||
script:
|
script:
|
||||||
- ./scripts/gitlab/test-cpp.sh
|
- ./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
|
||||||
@ -131,7 +131,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
|
||||||
@ -139,7 +138,6 @@ 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-android:
|
||||||
@ -150,7 +148,7 @@ build-android:
|
|||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
# only: *releaseable_branches
|
only: *releaseable_branches
|
||||||
|
|
||||||
build-linux-i386:
|
build-linux-i386:
|
||||||
<<: *build-on-linux
|
<<: *build-on-linux
|
||||||
@ -220,7 +218,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:
|
||||||
@ -336,7 +334,7 @@ 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
|
||||||
|
|
||||||
|
48
CHANGELOG.md
48
CHANGELOG.md
@ -1,4 +1,50 @@
|
|||||||
## Parity-Ethereum [v2.5.9](https://github.com/paritytech/parity-ethereum/releases/tag/v2.5.8)
|
## 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
|
||||||
|
miscellaenous changes.
|
||||||
|
|
||||||
|
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.
|
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.
|
||||||
|
|
||||||
|
3377
Cargo.lock
generated
3377
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
|||||||
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.5.9"
|
version = "2.5.10"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ serde_derive = "1.0"
|
|||||||
futures = "0.1"
|
futures = "0.1"
|
||||||
fdlimit = "0.1"
|
fdlimit = "0.1"
|
||||||
ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" }
|
ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" }
|
||||||
jsonrpc-core = "10.0.1"
|
jsonrpc-core = "14.0.0"
|
||||||
parity-bytes = "0.1"
|
parity-bytes = "0.1"
|
||||||
common-types = { path = "ethcore/types" }
|
common-types = { path = "ethcore/types" }
|
||||||
ethcore = { path = "ethcore", features = ["parity"] }
|
ethcore = { path = "ethcore", features = ["parity"] }
|
||||||
|
51
README.md
51
README.md
@ -16,11 +16,12 @@
|
|||||||
3.2 [Building from Source Code](#chapter-0032)<br>
|
3.2 [Building from Source Code](#chapter-0032)<br>
|
||||||
3.3 [Simple One-Line Installer for Mac and Linux](#chapter-0033)<br>
|
3.3 [Simple One-Line Installer for Mac and Linux](#chapter-0033)<br>
|
||||||
3.4 [Starting Parity Ethereum](#chapter-0034)
|
3.4 [Starting Parity Ethereum](#chapter-0034)
|
||||||
4. [Documentation](#chapter-004)
|
4. [Testing](#chapter-004)
|
||||||
5. [Toolchain](#chapter-005)
|
5. [Documentation](#chapter-005)
|
||||||
6. [Community](#chapter-006)
|
6. [Toolchain](#chapter-006)
|
||||||
7. [Contributing](#chapter-007)
|
7. [Community](#chapter-007)
|
||||||
8. [License](#chapter-008)
|
8. [Contributing](#chapter-008)
|
||||||
|
9. [License](#chapter-009)
|
||||||
|
|
||||||
|
|
||||||
## 1. Description <a id="chapter-001"></a>
|
## 1. Description <a id="chapter-001"></a>
|
||||||
@ -41,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>
|
||||||
|
|
||||||
@ -65,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
|
||||||
@ -148,7 +149,25 @@ To start Parity Ethereum as a regular user using `systemd` init:
|
|||||||
2. Copy release to bin folder, write `sudo install ./target/release/parity /usr/bin/parity`
|
2. Copy release to bin folder, write `sudo install ./target/release/parity /usr/bin/parity`
|
||||||
3. To configure Parity Ethereum, write a `/etc/parity/config.toml` config file, see [Configuring Parity Ethereum](https://paritytech.github.io/wiki/Configuring-Parity) for details.
|
3. To configure Parity Ethereum, write a `/etc/parity/config.toml` config file, see [Configuring Parity Ethereum](https://paritytech.github.io/wiki/Configuring-Parity) for details.
|
||||||
|
|
||||||
## 4. Documentation <a id="chapter-004"></a>
|
## 4. Testing <a id="chapter-004"></a>
|
||||||
|
|
||||||
|
Download the required test files: `git submodule update --init --recursive`. You can run tests with the following commands:
|
||||||
|
|
||||||
|
* **All** packages
|
||||||
|
```
|
||||||
|
cargo test --all
|
||||||
|
```
|
||||||
|
|
||||||
|
* Specific package
|
||||||
|
```
|
||||||
|
cargo test --package <spec>
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `<spec>` with one of the packages from the [package list](#package-list) (e.g. `cargo test --package evmbin`).
|
||||||
|
|
||||||
|
You can show your logs in the test output by passing `--nocapture` (i.e. `cargo test --package evmbin -- --nocapture`)
|
||||||
|
|
||||||
|
## 5. Documentation <a id="chapter-005"></a>
|
||||||
|
|
||||||
Official website: https://parity.io
|
Official website: https://parity.io
|
||||||
|
|
||||||
@ -160,16 +179,20 @@ You can generate documentation for Parity Ethereum Rust packages that automatica
|
|||||||
|
|
||||||
* **All** packages
|
* **All** packages
|
||||||
```
|
```
|
||||||
cargo doc --open
|
cargo doc --document-private-items --open
|
||||||
```
|
```
|
||||||
|
|
||||||
* Specific package
|
* Specific package
|
||||||
```
|
```
|
||||||
cargo doc --package <spec> --open
|
cargo doc --package <spec> -- --document-private-items --open
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Use`--document-private-items` to also view private documentation and `--no-deps` to exclude building documentation for dependencies.
|
||||||
|
|
||||||
Replacing `<spec>` with one of the following from the details section below (i.e. `cargo doc --package parity-ethereum --open`):
|
Replacing `<spec>` with one of the following from the details section below (i.e. `cargo doc --package parity-ethereum --open`):
|
||||||
|
|
||||||
|
<a id="package-list"></a>
|
||||||
|
**Package List**
|
||||||
<details><p>
|
<details><p>
|
||||||
|
|
||||||
* Parity Ethereum (EthCore) Client Application
|
* Parity Ethereum (EthCore) Client Application
|
||||||
@ -330,7 +353,7 @@ Example (generic documentation comment):
|
|||||||
///
|
///
|
||||||
```
|
```
|
||||||
|
|
||||||
## 5. Toolchain <a id="chapter-005"></a>
|
## 6. Toolchain <a id="chapter-006"></a>
|
||||||
|
|
||||||
In addition to the Parity Ethereum client, there are additional tools in this repository available:
|
In addition to the Parity Ethereum client, there are additional tools in this repository available:
|
||||||
|
|
||||||
@ -342,7 +365,7 @@ In addition to the Parity Ethereum client, there are additional tools in this re
|
|||||||
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)
|
||||||
|
|
||||||
## 6. Community <a id="chapter-006"></a>
|
## 7. Community <a id="chapter-007"></a>
|
||||||
|
|
||||||
### Join the chat!
|
### Join the chat!
|
||||||
|
|
||||||
@ -355,7 +378,7 @@ Questions? Get in touch with us on Gitter:
|
|||||||
Alternatively, join our community on Matrix:
|
Alternatively, join our community on Matrix:
|
||||||
[![Riot: +Parity](https://img.shields.io/badge/riot-%2Bparity%3Amatrix.parity.io-orange.svg)](https://riot.im/app/#/group/+parity:matrix.parity.io)
|
[![Riot: +Parity](https://img.shields.io/badge/riot-%2Bparity%3Amatrix.parity.io-orange.svg)](https://riot.im/app/#/group/+parity:matrix.parity.io)
|
||||||
|
|
||||||
## 7. Contributing <a id="chapter-007"></a>
|
## 8. Contributing <a id="chapter-008"></a>
|
||||||
|
|
||||||
An introduction has been provided in the ["So You Want to be a Core Developer" presentation slides by Hernando Castano](http://tiny.cc/contrib-to-parity-eth). Additional guidelines are provided in [CONTRIBUTING](./.github/CONTRIBUTING.md).
|
An introduction has been provided in the ["So You Want to be a Core Developer" presentation slides by Hernando Castano](http://tiny.cc/contrib-to-parity-eth). Additional guidelines are provided in [CONTRIBUTING](./.github/CONTRIBUTING.md).
|
||||||
|
|
||||||
@ -363,6 +386,6 @@ An introduction has been provided in the ["So You Want to be a Core Developer" p
|
|||||||
|
|
||||||
[CODE_OF_CONDUCT](./.github/CODE_OF_CONDUCT.md)
|
[CODE_OF_CONDUCT](./.github/CODE_OF_CONDUCT.md)
|
||||||
|
|
||||||
## 8. License <a id="chapter-008"></a>
|
## 9. License <a id="chapter-009"></a>
|
||||||
|
|
||||||
[LICENSE](./LICENSE)
|
[LICENSE](./LICENSE)
|
||||||
|
@ -7,7 +7,7 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
edit-distance = "2.0"
|
edit-distance = "2.0"
|
||||||
parity-crypto = "0.3.0"
|
parity-crypto = "0.3.0"
|
||||||
eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1" }
|
eth-secp256k1 = { git = "https://github.com/paritytech/rust-secp256k1", rev = "ccc06e7480148b723eb44ac56cf4d20eec380b6f" }
|
||||||
ethereum-types = "0.4"
|
ethereum-types = "0.4"
|
||||||
lazy_static = "1.0"
|
lazy_static = "1.0"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
@ -12,10 +12,10 @@ 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"
|
||||||
matches = "0.1"
|
matches = "0.1"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.9"
|
||||||
jsonrpc-core = "10.0.1"
|
jsonrpc-core = "14.0.3"
|
||||||
jsonrpc-ws-server = "10.0.1"
|
jsonrpc-ws-server = "14.0.3"
|
||||||
parity-rpc = { path = "../../rpc" }
|
parity-rpc = { path = "../../rpc" }
|
||||||
keccak-hash = "0.1"
|
keccak-hash = "0.1"
|
||||||
|
@ -27,7 +27,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']
|
||||||
|
@ -9,7 +9,6 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
ansi_term = "0.10"
|
ansi_term = "0.10"
|
||||||
blooms-db = { path = "../util/blooms-db", optional = true }
|
blooms-db = { path = "../util/blooms-db", optional = true }
|
||||||
bn = { git = "https://github.com/paritytech/bn", default-features = false }
|
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
common-types = { path = "types" }
|
common-types = { path = "types" }
|
||||||
crossbeam-utils = "0.6"
|
crossbeam-utils = "0.6"
|
||||||
@ -22,6 +21,7 @@ ethabi-derive = "6.0"
|
|||||||
ethash = { path = "../ethash" }
|
ethash = { path = "../ethash" }
|
||||||
ethcore-blockchain = { path = "./blockchain" }
|
ethcore-blockchain = { path = "./blockchain" }
|
||||||
ethcore-bloom-journal = { path = "../util/bloom" }
|
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" }
|
||||||
@ -46,11 +46,9 @@ log = "0.4"
|
|||||||
lru-cache = "0.1"
|
lru-cache = "0.1"
|
||||||
macros = { path = "../util/macros" }
|
macros = { path = "../util/macros" }
|
||||||
memory-cache = { path = "../util/memory-cache" }
|
memory-cache = { path = "../util/memory-cache" }
|
||||||
memory-db = "0.11.0"
|
memory-db = "0.11"
|
||||||
num = { version = "0.1", default-features = false, features = ["bigint"] }
|
|
||||||
num_cpus = "1.2"
|
num_cpus = "1.2"
|
||||||
parity-bytes = "0.1"
|
parity-bytes = "0.1"
|
||||||
parity-crypto = "0.3.0"
|
|
||||||
parity-snappy = "0.1"
|
parity-snappy = "0.1"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.7"
|
||||||
trie-db = "0.11.0"
|
trie-db = "0.11.0"
|
||||||
@ -91,7 +89,8 @@ parity = ["work-notify", "price-info", "stratum"]
|
|||||||
# 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 = [ "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
|
||||||
|
@ -19,7 +19,7 @@ extern crate criterion;
|
|||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
|
extern crate ethcore_builtin;
|
||||||
extern crate ethcore;
|
extern crate ethcore;
|
||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
extern crate parity_bytes as bytes;
|
extern crate parity_bytes as bytes;
|
||||||
@ -27,7 +27,7 @@ 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::EthereumMachine;
|
use ethcore::machine::EthereumMachine;
|
||||||
use ethereum_types::U256;
|
use ethereum_types::U256;
|
||||||
use ethcore::ethereum::new_byzantium_test_machine;
|
use ethcore::ethereum::new_byzantium_test_machine;
|
||||||
@ -56,10 +56,6 @@ impl<'a> BuiltinBenchmark<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn gas_cost(&self) -> U256 {
|
|
||||||
self.builtin.cost(&self.input)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn run(&self, b: &mut Bencher) {
|
fn run(&self, b: &mut Bencher) {
|
||||||
let mut output = vec![0; self.expected.len()];
|
let mut output = vec![0; self.expected.len()];
|
||||||
|
|
||||||
|
@ -195,6 +195,12 @@ pub trait BlockProvider {
|
|||||||
where F: Fn(&LogEntry) -> bool + Send + Sync, Self: Sized;
|
where F: Fn(&LogEntry) -> bool + Send + Sync, Self: Sized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Interface for querying blocks with pending db transaction by hash and by number.
|
||||||
|
trait InTransactionBlockProvider {
|
||||||
|
/// Get the familial details concerning a block.
|
||||||
|
fn uncommitted_block_details(&self, hash: &H256) -> Option<BlockDetails>;
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
|
#[derive(Debug, Hash, Eq, PartialEq, Clone)]
|
||||||
enum CacheId {
|
enum CacheId {
|
||||||
BlockHeader(H256),
|
BlockHeader(H256),
|
||||||
@ -424,6 +430,19 @@ impl BlockProvider for BlockChain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl InTransactionBlockProvider for BlockChain {
|
||||||
|
fn uncommitted_block_details(&self, hash: &H256) -> Option<BlockDetails> {
|
||||||
|
let result = self.db.key_value().read_with_two_layer_cache(
|
||||||
|
db::COL_EXTRA,
|
||||||
|
&self.pending_block_details,
|
||||||
|
&self.block_details,
|
||||||
|
hash
|
||||||
|
)?;
|
||||||
|
self.cache_man.lock().note_used(CacheId::BlockDetails(*hash));
|
||||||
|
Some(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An iterator which walks the blockchain towards the genesis.
|
/// An iterator which walks the blockchain towards the genesis.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct AncestryIter<'a> {
|
pub struct AncestryIter<'a> {
|
||||||
@ -592,7 +611,7 @@ impl BlockChain {
|
|||||||
let best_block_rlp = bc.block(&best_block_hash)
|
let best_block_rlp = bc.block(&best_block_hash)
|
||||||
.expect("Best block is from a known block hash; qed");
|
.expect("Best block is from a known block hash; qed");
|
||||||
|
|
||||||
// and write them
|
// and write them to the cache.
|
||||||
let mut best_block = bc.best_block.write();
|
let mut best_block = bc.best_block.write();
|
||||||
*best_block = BestBlock {
|
*best_block = BestBlock {
|
||||||
total_difficulty: best_block_total_difficulty,
|
total_difficulty: best_block_total_difficulty,
|
||||||
@ -795,7 +814,7 @@ impl BlockChain {
|
|||||||
batch.put(db::COL_HEADERS, &hash, &compressed_header);
|
batch.put(db::COL_HEADERS, &hash, &compressed_header);
|
||||||
batch.put(db::COL_BODIES, &hash, &compressed_body);
|
batch.put(db::COL_BODIES, &hash, &compressed_body);
|
||||||
|
|
||||||
let maybe_parent = self.block_details(&block_parent_hash);
|
let maybe_parent = self.uncommitted_block_details(&block_parent_hash);
|
||||||
|
|
||||||
if let Some(parent_details) = maybe_parent {
|
if let Some(parent_details) = maybe_parent {
|
||||||
// parent known to be in chain.
|
// parent known to be in chain.
|
||||||
@ -858,12 +877,31 @@ impl BlockChain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// clears all caches for testing purposes
|
/// clears all caches, re-loads best block from disk for testing purposes
|
||||||
pub fn clear_cache(&self) {
|
pub fn clear_cache(&self) {
|
||||||
self.block_bodies.write().clear();
|
self.block_bodies.write().clear();
|
||||||
self.block_details.write().clear();
|
self.block_details.write().clear();
|
||||||
self.block_hashes.write().clear();
|
self.block_hashes.write().clear();
|
||||||
self.block_headers.write().clear();
|
self.block_headers.write().clear();
|
||||||
|
// Fetch best block details from disk
|
||||||
|
let best_block_hash = self.db.key_value().get(db::COL_EXTRA, b"best")
|
||||||
|
.expect("Low-level database error when fetching 'best' block. Some issue with disk?")
|
||||||
|
.as_ref()
|
||||||
|
.map(|r| H256::from_slice(r))
|
||||||
|
.unwrap();
|
||||||
|
let best_block_total_difficulty = self.block_details(&best_block_hash)
|
||||||
|
.expect("Best block is from a known block hash; a known block hash always comes with a known block detail; qed")
|
||||||
|
.total_difficulty;
|
||||||
|
let best_block_rlp = self.block(&best_block_hash)
|
||||||
|
.expect("Best block is from a known block hash; qed");
|
||||||
|
|
||||||
|
// and write them to the cache
|
||||||
|
let mut best_block = self.best_block.write();
|
||||||
|
*best_block = BestBlock {
|
||||||
|
total_difficulty: best_block_total_difficulty,
|
||||||
|
header: best_block_rlp.decode_header(),
|
||||||
|
block: best_block_rlp,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update the best ancient block to the given hash, after checking that
|
/// Update the best ancient block to the given hash, after checking that
|
||||||
@ -1033,7 +1071,7 @@ impl BlockChain {
|
|||||||
///
|
///
|
||||||
/// Used in snapshots to glue the chunks together at the end.
|
/// Used in snapshots to glue the chunks together at the end.
|
||||||
pub fn add_child(&self, batch: &mut DBTransaction, block_hash: H256, child_hash: H256) {
|
pub fn add_child(&self, batch: &mut DBTransaction, block_hash: H256, child_hash: H256) {
|
||||||
let mut parent_details = self.block_details(&block_hash)
|
let mut parent_details = self.uncommitted_block_details(&block_hash)
|
||||||
.unwrap_or_else(|| panic!("Invalid block hash: {:?}", block_hash));
|
.unwrap_or_else(|| panic!("Invalid block hash: {:?}", block_hash));
|
||||||
|
|
||||||
parent_details.children.push(child_hash);
|
parent_details.children.push(child_hash);
|
||||||
@ -1140,7 +1178,7 @@ impl BlockChain {
|
|||||||
/// Mark a block to be considered finalized. Returns `Some(())` if the operation succeeds, and `None` if the block
|
/// Mark a block to be considered finalized. Returns `Some(())` if the operation succeeds, and `None` if the block
|
||||||
/// hash is not found.
|
/// hash is not found.
|
||||||
pub fn mark_finalized(&self, batch: &mut DBTransaction, block_hash: H256) -> Option<()> {
|
pub fn mark_finalized(&self, batch: &mut DBTransaction, block_hash: H256) -> Option<()> {
|
||||||
let mut block_details = self.block_details(&block_hash)?;
|
let mut block_details = self.uncommitted_block_details(&block_hash)?;
|
||||||
block_details.is_finalized = true;
|
block_details.is_finalized = true;
|
||||||
|
|
||||||
self.update_block_details(batch, block_hash, block_details);
|
self.update_block_details(batch, block_hash, block_details);
|
||||||
@ -1333,7 +1371,7 @@ impl BlockChain {
|
|||||||
/// Uses the given parent details or attempts to load them from the database.
|
/// Uses the given parent details or attempts to load them from the database.
|
||||||
fn prepare_block_details_update(&self, parent_hash: H256, info: &BlockInfo, is_finalized: bool) -> HashMap<H256, BlockDetails> {
|
fn prepare_block_details_update(&self, parent_hash: H256, info: &BlockInfo, is_finalized: bool) -> HashMap<H256, BlockDetails> {
|
||||||
// update parent
|
// update parent
|
||||||
let mut parent_details = self.block_details(&parent_hash).unwrap_or_else(|| panic!("Invalid parent hash: {:?}", parent_hash));
|
let mut parent_details = self.uncommitted_block_details(&parent_hash).unwrap_or_else(|| panic!("Invalid parent hash: {:?}", parent_hash));
|
||||||
parent_details.children.push(info.hash);
|
parent_details.children.push(info.hash);
|
||||||
|
|
||||||
// create current block details.
|
// create current block details.
|
||||||
@ -1638,7 +1676,7 @@ mod tests {
|
|||||||
let fork_choice = {
|
let fork_choice = {
|
||||||
let header = block.header_view();
|
let header = block.header_view();
|
||||||
let parent_hash = header.parent_hash();
|
let parent_hash = header.parent_hash();
|
||||||
let parent_details = bc.block_details(&parent_hash).unwrap_or_else(|| panic!("Invalid parent hash: {:?}", parent_hash));
|
let parent_details = bc.uncommitted_block_details(&parent_hash).unwrap_or_else(|| panic!("Invalid parent hash: {:?}", parent_hash));
|
||||||
let block_total_difficulty = parent_details.total_difficulty + header.difficulty();
|
let block_total_difficulty = parent_details.total_difficulty + header.difficulty();
|
||||||
if block_total_difficulty > bc.best_block_total_difficulty() {
|
if block_total_difficulty > bc.best_block_total_difficulty() {
|
||||||
common_types::engines::ForkChoice::New
|
common_types::engines::ForkChoice::New
|
||||||
|
23
ethcore/builtin/Cargo.toml
Normal file
23
ethcore/builtin/Cargo.toml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[package]
|
||||||
|
description = "ethereum vm builtin"
|
||||||
|
name = "ethcore-builtin"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bn = { git = "https://github.com/paritytech/bn", default-features = false }
|
||||||
|
byteorder = "1.3.2"
|
||||||
|
eip-152 = { path = "../../util/EIP-152" }
|
||||||
|
ethereum-types = "0.4"
|
||||||
|
ethjson = { path = "../../json" }
|
||||||
|
ethkey = { path = "../../accounts/ethkey" }
|
||||||
|
keccak-hash = "0.1.0"
|
||||||
|
log = "0.4"
|
||||||
|
macros = { path = "../../util/macros" }
|
||||||
|
num = { version = "0.1", default-features = false, features = ["bigint"] }
|
||||||
|
parity-bytes = "0.1"
|
||||||
|
parity-crypto = "0.4.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
hex-literal = "0.2.1"
|
File diff suppressed because it is too large
Load Diff
@ -188,6 +188,21 @@ pub trait Readable {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns value for given key either in two-layered cache or in database.
|
||||||
|
fn read_with_two_layer_cache<K, T, C>(&self, col: Option<u32>, l1_cache: &RwLock<C>, l2_cache: &RwLock<C>, key: &K) -> Option<T> where
|
||||||
|
K: Key<T> + Eq + Hash + Clone,
|
||||||
|
T: Clone + rlp::Decodable,
|
||||||
|
C: Cache<K, T> {
|
||||||
|
{
|
||||||
|
let read = l1_cache.read();
|
||||||
|
if let Some(v) = read.get(key) {
|
||||||
|
return Some(v.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.read_with_cache(col, l2_cache, key)
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if given value exists.
|
/// Returns true if given value exists.
|
||||||
fn exists<T, R>(&self, col: Option<u32>, key: &Key<T, Target = R>) -> bool where R: Deref<Target= [u8]>;
|
fn exists<T, R>(&self, col: Option<u32>, key: &Key<T, Target = R>) -> bool where R: Deref<Target= [u8]>;
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
use std::sync::{Weak, Arc};
|
use std::sync::{Weak, Arc};
|
||||||
|
|
||||||
use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage};
|
use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage, traits::ForceUpdateSealing};
|
||||||
use ethcore::engines::{epoch, EthEngine, EpochChange, EpochTransition, Proof};
|
use ethcore::engines::{epoch, EthEngine, EpochChange, EpochTransition, Proof};
|
||||||
use ethcore::machine::EthereumMachine;
|
use ethcore::machine::EthereumMachine;
|
||||||
use ethcore::error::{Error, EthcoreResult};
|
use ethcore::error::{Error, EthcoreResult};
|
||||||
@ -620,7 +620,7 @@ impl<T: ChainDataFetcher> ::ethcore::client::ChainInfo for Client<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ChainDataFetcher> ::ethcore::client::EngineClient for Client<T> {
|
impl<T: ChainDataFetcher> ::ethcore::client::EngineClient for Client<T> {
|
||||||
fn update_sealing(&self) { }
|
fn update_sealing(&self, _force: ForceUpdateSealing) {}
|
||||||
fn submit_seal(&self, _block_hash: H256, _seal: Vec<Vec<u8>>) { }
|
fn submit_seal(&self, _block_hash: H256, _seal: Vec<Vec<u8>>) { }
|
||||||
fn broadcast_consensus_message(&self, _message: Vec<u8>) { }
|
fn broadcast_consensus_message(&self, _message: Vec<u8>) { }
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ serde_derive = "1.0"
|
|||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
tiny-keccak = "1.4"
|
tiny-keccak = "1.4"
|
||||||
transaction-pool = "2.0.1"
|
transaction-pool = "2.0.1"
|
||||||
url = "1"
|
url = "2"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
env_logger = "0.5"
|
env_logger = "0.5"
|
||||||
|
@ -272,7 +272,7 @@ impl Provider {
|
|||||||
let mut state_buf = [0u8; 64];
|
let mut state_buf = [0u8; 64];
|
||||||
state_buf[..32].clone_from_slice(&state_hash);
|
state_buf[..32].clone_from_slice(&state_hash);
|
||||||
state_buf[32..].clone_from_slice(&H256::from(nonce));
|
state_buf[32..].clone_from_slice(&H256::from(nonce));
|
||||||
keccak(&state_buf.as_ref())
|
keccak(AsRef::<[u8]>::as_ref(&state_buf[..]))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pool_client<'a>(&'a self, nonce_cache: &'a NonceCache, local_accounts: &'a HashSet<Address>) -> miner::pool_client::PoolClient<'a, Client> {
|
fn pool_client<'a>(&'a self, nonce_cache: &'a NonceCache, local_accounts: &'a HashSet<Address>) -> miner::pool_client::PoolClient<'a, Client> {
|
||||||
|
@ -50,12 +50,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,12 +65,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,14 +80,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,12 +53,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,12 +68,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -81,14 +83,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,12 +42,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x0": {
|
||||||
"price": 500,
|
"price": { "linear": { "base": 500, "word": 0 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "linear": { "base": 150, "word": 0 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,12 +56,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x0": {
|
||||||
"price": 40000,
|
"price": { "linear": { "base": 40000, "word": 0 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "linear": { "base": 6000, "word": 0 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,14 +70,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,12 +38,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "linear": { "base": 500, "word": 0 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP1108 transition",
|
||||||
|
"price": { "linear": { "base": 150, "word": 0 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -52,12 +53,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "linear": {"base": 40000, "word": 0 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP1108 transition",
|
||||||
|
"price": { "linear": { "base": 6000, "word": 0 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -66,14 +68,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
112
ethcore/res/ethereum/builtin_multi_bench.json
Normal file
112
ethcore/res/ethereum/builtin_multi_bench.json
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
{
|
||||||
|
"name": "ecrecover legacy",
|
||||||
|
"engine": {
|
||||||
|
"Ethash": {
|
||||||
|
"params": {
|
||||||
|
"minimumDifficulty": "0x020000",
|
||||||
|
"difficultyBoundDivisor": "0x0800",
|
||||||
|
"durationLimit": "0x0d",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"homesteadTransition": "0x0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
|
"accountStartNonce": "0x00",
|
||||||
|
"maximumExtraDataSize": "0x20",
|
||||||
|
"minGasLimit": "0x1388",
|
||||||
|
"networkID" : "0x1",
|
||||||
|
"eip150Transition": "0x0",
|
||||||
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
|
"eip161dTransition": "0x7fffffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff",
|
||||||
|
"maxCodeSize": 24576,
|
||||||
|
"maxCodeSizeTransition": "0x7fffffffffffffff"
|
||||||
|
},
|
||||||
|
"genesis": {
|
||||||
|
"seal": {
|
||||||
|
"ethereum": {
|
||||||
|
"nonce": "0x0000000000000042",
|
||||||
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"difficulty": "0x400000000",
|
||||||
|
"author": "0x0000000000000000000000000000000000000000",
|
||||||
|
"timestamp": "0x00",
|
||||||
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
||||||
|
"gasLimit": "0x1388"
|
||||||
|
},
|
||||||
|
"accounts": {
|
||||||
|
"0000000000000000000000000000000000000001": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"0": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"1": {"price": {"linear": { "base": 2, "word": 0 }}},
|
||||||
|
"2": {"price": {"linear": { "base": 3, "word": 0 }}},
|
||||||
|
"3": {"price": {"linear": { "base": 4, "word": 0 }}},
|
||||||
|
"4": {"price": {"linear": { "base": 5, "word": 0 }}},
|
||||||
|
"5": {"price": {"linear": { "base": 6, "word": 0 }}},
|
||||||
|
"6": {"price": {"linear": { "base": 7, "word": 0 }}},
|
||||||
|
"7": {"price": {"linear": { "base": 8, "word": 0 }}},
|
||||||
|
"8": {"price": {"linear": { "base": 9, "word": 0 }}},
|
||||||
|
"9": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"10": {"price": {"linear": { "base": 2, "word": 0 }}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0000000000000000000000000000000000000002": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "sha256",
|
||||||
|
"pricing": {
|
||||||
|
"0": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"1": {"price": {"linear": { "base": 2, "word": 0 }}},
|
||||||
|
"2": {"price": {"linear": { "base": 3, "word": 0 }}},
|
||||||
|
"3": {"price": {"linear": { "base": 4, "word": 0 }}},
|
||||||
|
"4": {"price": {"linear": { "base": 5, "word": 0 }}},
|
||||||
|
"5": {"price": {"linear": { "base": 6, "word": 0 }}},
|
||||||
|
"6": {"price": {"linear": { "base": 7, "word": 0 }}},
|
||||||
|
"7": {"price": {"linear": { "base": 8, "word": 0 }}},
|
||||||
|
"8": {"price": {"linear": { "base": 9, "word": 0 }}},
|
||||||
|
"9": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"10": {"price": {"linear": { "base": 2, "word": 0 }}},
|
||||||
|
"11": {"price": {"linear": { "base": 3, "word": 0 }}},
|
||||||
|
"12": {"price": {"linear": { "base": 4, "word": 0 }}},
|
||||||
|
"13": {"price": {"linear": { "base": 5, "word": 0 }}},
|
||||||
|
"14": {"price": {"linear": { "base": 6, "word": 0 }}},
|
||||||
|
"15": {"price": {"linear": { "base": 7, "word": 0 }}},
|
||||||
|
"16": {"price": {"linear": { "base": 8, "word": 0 }}},
|
||||||
|
"17": {"price": {"linear": { "base": 9, "word": 0 }}},
|
||||||
|
"18": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"19": {"price": {"linear": { "base": 2, "word": 0 }}},
|
||||||
|
"20": {"price": {"linear": { "base": 3, "word": 0 }}},
|
||||||
|
"21": {"price": {"linear": { "base": 4, "word": 0 }}},
|
||||||
|
"22": {"price": {"linear": { "base": 5, "word": 0 }}},
|
||||||
|
"23": {"price": {"linear": { "base": 6, "word": 0 }}},
|
||||||
|
"24": {"price": {"linear": { "base": 7, "word": 0 }}},
|
||||||
|
"25": {"price": {"linear": { "base": 8, "word": 0 }}},
|
||||||
|
"26": {"price": {"linear": { "base": 9, "word": 0 }}},
|
||||||
|
"27": {"price": {"linear": { "base": 1, "word": 0 }}},
|
||||||
|
"28": {"price": {"linear": { "base": 2, "word": 0 }}},
|
||||||
|
"29": {"price": {"linear": { "base": 3, "word": 0 }}},
|
||||||
|
"30": {"price": {"linear": { "base": 4, "word": 0 }}},
|
||||||
|
"31": {"price": {"linear": { "base": 5, "word": 0 }}},
|
||||||
|
"32": {"price": {"linear": { "base": 6, "word": 0 }}},
|
||||||
|
"33": {"price": {"linear": { "base": 7, "word": 0 }}},
|
||||||
|
"34": {"price": {"linear": { "base": 8, "word": 0 }}},
|
||||||
|
"35": {"price": {"linear": { "base": 9, "word": 0 }}},
|
||||||
|
"36": {"price": {"linear": { "base": 10, "word": 0 }}},
|
||||||
|
"37": {"price": {"linear": { "base": 10, "word": 0 }}},
|
||||||
|
"38": {"price": {"linear": { "base": 10, "word": 0 }}},
|
||||||
|
"39": {"price": {"linear": { "base": 10, "word": 0 }}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
54
ethcore/res/ethereum/builtin_one_activation_bench.json
Normal file
54
ethcore/res/ethereum/builtin_one_activation_bench.json
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"name": "ecrecover legacy chain spec for benchmarking",
|
||||||
|
"engine": {
|
||||||
|
"Ethash": {
|
||||||
|
"params": {
|
||||||
|
"minimumDifficulty": "0x020000",
|
||||||
|
"difficultyBoundDivisor": "0x0800",
|
||||||
|
"durationLimit": "0x0d",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"homesteadTransition": "0x0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
|
"accountStartNonce": "0x00",
|
||||||
|
"maximumExtraDataSize": "0x20",
|
||||||
|
"minGasLimit": "0x1388",
|
||||||
|
"networkID" : "0x1",
|
||||||
|
"eip150Transition": "0x0",
|
||||||
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
|
"eip161dTransition": "0x7fffffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff",
|
||||||
|
"maxCodeSize": 24576,
|
||||||
|
"maxCodeSizeTransition": "0x7fffffffffffffff"
|
||||||
|
},
|
||||||
|
"genesis": {
|
||||||
|
"seal": {
|
||||||
|
"ethereum": {
|
||||||
|
"nonce": "0x0000000000000042",
|
||||||
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"difficulty": "0x400000000",
|
||||||
|
"author": "0x0000000000000000000000000000000000000000",
|
||||||
|
"timestamp": "0x00",
|
||||||
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
||||||
|
"gasLimit": "0x1388"
|
||||||
|
},
|
||||||
|
"accounts": {
|
||||||
|
"0000000000000000000000000000000000000001": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"linear": { "base": 3000, "word": 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -57,12 +57,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,12 +71,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -83,14 +85,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,12 +76,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 20,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"20": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,12 +90,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 20,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"20": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,14 +104,12 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 20,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"20": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3916,12 +3916,12 @@
|
|||||||
"0x0000000000000000000000000000000000000006": {
|
"0x0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x85d9a0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x85d9a0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3929,12 +3929,12 @@
|
|||||||
"0x0000000000000000000000000000000000000007": {
|
"0x0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x85d9a0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x85d9a0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3942,14 +3942,12 @@
|
|||||||
"0x0000000000000000000000000000000000000008": {
|
"0x0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x85d9a0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x85d9a0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,12 +61,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,12 +75,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,14 +89,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,12 +49,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -62,12 +63,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,14 +77,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,12 +69,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 2000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"2000000": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,12 +83,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 2000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"2000000": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,14 +97,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 2000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"2000000": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -79,12 +79,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0xC3500",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xC3500": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,12 +93,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0xC3500",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xC3500": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -105,14 +107,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0xC3500",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0xC3500": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -163,7 +163,11 @@
|
|||||||
"eip658Transition": "0x42ae50",
|
"eip658Transition": "0x42ae50",
|
||||||
"eip145Transition": "0x6f1580",
|
"eip145Transition": "0x6f1580",
|
||||||
"eip1014Transition": "0x6f1580",
|
"eip1014Transition": "0x6f1580",
|
||||||
"eip1052Transition": "0x6f1580"
|
"eip1052Transition": "0x6f1580",
|
||||||
|
"eip1283Transition": "0x8a61c8",
|
||||||
|
"eip1706Transition": "0x8a61c8",
|
||||||
|
"eip1884Transition": "0x8a61c8",
|
||||||
|
"eip2028Transition": "0x8a61c8"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
@ -181,9 +185,9 @@
|
|||||||
"stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
"stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
||||||
},
|
},
|
||||||
"hardcodedSync": {
|
"hardcodedSync": {
|
||||||
"header": "f90212a0113ba3b1153987fc483b01ccfe9ecadbdc36a7b264be75d6486cb6b694cc38a1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479452bc44d5378309ee2abf1539bf71de1b7d7be3b5a0d91db5900e312a1ba8d39505406a95dc0ea20393b723c4bf488ade4e3c4ee4c3a05e63ab076852043b1c2fe010e2f14ab13dcc8e1c546ac497a24ce88c4abf3056a0b72e4a776f895459b6bf0937040990d868b1f45889aeaa26684e07472263fc31b90100b00200000063664554889124822ce2001022840543085d5810042382888542ca3816801780384384cd6851081cdc4d4b2b205a814b049198110a6869d60f4009a79c3854c9000581044889080000611c09142200106552000044027024004038092102814ed6c48040a8715851088a20108e80165f8c0c514019037a0000121304b2343416800b029000024404248238a06818414cb8690244879491855405026bc8250220520992c2380099d10024411c6048424083d1307822442d8444700405147883c4c041300aaa2408bb61084012983825a22830040a180106b5e27182088060b111515832902903a8f1d432a48004d0250437106a503491000048a91587067a897789f4d78371d801837a309c8379ffd7845c9d879e9150505945206e616e6f706f6f6c2e6f7267a0db22736cb3f06f9c86804902731fa6841eaaa1cd6326ea2a30e9c304d48bdd04880323b06837344cb8",
|
"header": "f90215a0ec6330e9082f796d1d40cd146f1c504efc5823b486633f81a9f8ee31e799d41aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ea674fdde714fd979de3edf0f56aa9716b898ec8a0d815854242c0f817a92beff41d66fc19dbfb2e4769762da7a2d4e49a9cf831c2a0e7e0ffc7d9a8ab82a7713cbf850628bf9a5227d80b0fe75d10b682be74bd90b9a0933423cb40b87bbcc53383c7d0a24d2ce5e8de99f2ba9213e51b4bb86b2fbb27b901008a0200250d21200aa00806e32495058b8880962440b0005dc4900000fc63451012c084c8c6224a0234ded20e96099533b08856aa0288a3bd00666137612c5680400000c4ec3ec5118ca2fa5c40804026c782e0188e4602502500c34460101adb47400d1b52c6884995204ac402d0bc10df7c1929827a9880b4a4051190406049368a1387c24c840a90b6c2b4e48e003e28459dc479c00042184824b2b8780308f3a660d05438a115a68804a16b209101020c0d9046812b61bc8004871b04402b1d904406114120beb0ea108a1cafe6983d9010c984882d2424301200000a78e0b03074ead02004044702412122423cbd2c5a4020ca9ca041998158050838033d8708cce2eaf2fd8b838640018397cc4d83979c13845db0992894505059452d65746865726d696e652d6575312d32a033a7c1a79360234b45773d79bb2d017ccf33414e59502691c87fea0a3ec26163880e5c7838013df6da",
|
||||||
"totalDifficulty": "9633968582330911261986",
|
"totalDifficulty": "12517645144159165893352",
|
||||||
"CHTs": [
|
"CHTs": [
|
||||||
"0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc",
|
"0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc",
|
||||||
"0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11",
|
"0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11",
|
||||||
"0x816e7463af7b5d2fcb804ba55f09e8452182b0ba6c995a34e144245d76333d55",
|
"0x816e7463af7b5d2fcb804ba55f09e8452182b0ba6c995a34e144245d76333d55",
|
||||||
@ -3826,7 +3830,660 @@
|
|||||||
"0x64b862e2d5a6c24d569f3352b8524ebfecfd5a3205a3200ec78df72d79a66838",
|
"0x64b862e2d5a6c24d569f3352b8524ebfecfd5a3205a3200ec78df72d79a66838",
|
||||||
"0x6da8edf169a9c78307258a723c1ac1d96db20a7131018efad16f0606683c0f07",
|
"0x6da8edf169a9c78307258a723c1ac1d96db20a7131018efad16f0606683c0f07",
|
||||||
"0xbae1427beab8c3e71cea57e5f9cdd55bc278c6d6073ae2628f0d3efbf9894a42",
|
"0xbae1427beab8c3e71cea57e5f9cdd55bc278c6d6073ae2628f0d3efbf9894a42",
|
||||||
"0x389bbd1b3fa390e8d3339cf5b018ec64d9cfc02bbcb801acad0857fe377ed83b"
|
"0x389bbd1b3fa390e8d3339cf5b018ec64d9cfc02bbcb801acad0857fe377ed83b",
|
||||||
|
"0x819c3a7f682db122c56c004c1128a9e219f13052c9b78e59e838ca850e7ff191",
|
||||||
|
"0xaa860c92d60059cc76b9c07d9b942e132b72940f09952a6ea84e03e0d481a409",
|
||||||
|
"0x3a1ed0df289c45f80aca59d16f9a8fc2363faa591ff2259767965138155057f7",
|
||||||
|
"0xebd67ae495f5d5f4b2d36676bd9e4619043dc83e00766b92eb0ac9ecc46cb9ba",
|
||||||
|
"0x2ff9b30bfee54deed34ac25e2c7e1d7825ce27d270b27ac8350f33e0021a894b",
|
||||||
|
"0x5344883f5098af546dfeed7e76dae5597b6a2eade7eba066c1f3fd2ca37b5a9c",
|
||||||
|
"0xd8220eed4c1e6c3fc9edf342c7691e0b7a09b1bc93ca8ee101f549d1c416dd13",
|
||||||
|
"0x89122f929f806e2f345539d74a3b67a59976a996427a301f608f67e9067d337a",
|
||||||
|
"0xbb288743f3da50ba5ba8c3493e267c30b83c67b77a22df96fb194fbe3d6fbdcf",
|
||||||
|
"0x1f4d12a9c756fd7a8e6a35df39a35888a47fea0f4191ffb303503c1c007f0959",
|
||||||
|
"0xf4a47acf8c2ecdf67bfbb0fa49b02a372e16ea554d7911eba4527647564b773a",
|
||||||
|
"0xc4ea1bb4b007889b8a81b306367ef03d2213a17e44ca13dd0d30f98e0327644a",
|
||||||
|
"0x1da665d430e25a551e5a2cc6b09942c906559337df136af4b81934a14b44f2fb",
|
||||||
|
"0x429c1fac7e8ae535baf1024b797708ab758420bdf6dc73331f2c48bb27edc2e2",
|
||||||
|
"0x3cb6d3d2836e4132b090dc084df9347f6cea34d23b3252301b65d2ae125c057a",
|
||||||
|
"0x82aa375fa96569741873b0fbe883f5901dfc2bb80dc9cf8c77622fe57ae7922c",
|
||||||
|
"0x44ecf8444c6f4cf718a9d785b74ee71d483c02b8a4499065d4822d4c4b7dd098",
|
||||||
|
"0x35879d2288d42165f3329be77fc7125ef63947d99647022cf85d9d78bf5c3376",
|
||||||
|
"0x5119fb54e3eec69ddb94091f3f446e3dccb7bb91d11345f4895734765ce74740",
|
||||||
|
"0xcac39a05efa882556d8f2afc987563d61e1728dc00365c2b19182bfea7e9e1f4",
|
||||||
|
"0x3a5bac1d3d0751d1101245c4fc5594ddf6b2b87e1ca2afe97e3b94659f2d6a6c",
|
||||||
|
"0x433bfa0e7110d38ac86b893e892f3ba7f5acedccc5482a34b6045fcabeb27a75",
|
||||||
|
"0x4f25ccd53e8bd308c7aac31f47ca3b0efc803ec7787904d41e4f40ff1a7c9936",
|
||||||
|
"0xe290ba09a6f6b5a975f2a0b87717d83c64128af3d84ee5a8e3e6b73dc963bfdc",
|
||||||
|
"0x7a4d734fe57c4ae23fc10f17863eaf0fd35b71f7bd1f03196c4466028b143d0d",
|
||||||
|
"0x191c097cb3f00ed9f5f8b8e6cee02f8e8a11c4500f92ec2f99fa2140173f6e07",
|
||||||
|
"0x7f21cd1e87804e63c0973dd9f66e792181aedc5d8cd931eaa1d80d14880f8dce",
|
||||||
|
"0x4ae1193f849d7833b9efb7c615dc7e88026a3f3d01a72aecaa040b4754eb6c5d",
|
||||||
|
"0x84e7bd0b8f59390667f6e211ea89a17a13279190de24a33b744f71149eff9165",
|
||||||
|
"0x5765adf9a49a7594f0e9ed443858f3a822b293cf8bfdae93f36739e1989b1961",
|
||||||
|
"0x80abd196d81322281597ed14ed996987e15bafcb372c5b386a28e5df8cee57fa",
|
||||||
|
"0x24e9ac57c579c3edb8b3d40231436c8a5a4316fa73810855f5cf4a89b858c563",
|
||||||
|
"0x3378c60cb4879b9d4205db9b4cafdba13e9923993dc5e8b155d909ba2bd0b270",
|
||||||
|
"0x0e4e9289f83c3a8bcc6d6a6d7645ca919bee8c278e3776e2085b4fc347627934",
|
||||||
|
"0x2879e00c5e77faef512162ec3b28c132cda5377f72fdec476d0f09be9d002e42",
|
||||||
|
"0x8e0de62a93882ddab17038a7250734c354340e976dd643f609fd497381a3562b",
|
||||||
|
"0x8730ceb5206279126dbebf0676f922f12b5ecd13be08bf301d7d652473f79001",
|
||||||
|
"0x0df58042003ef56cd28013d9794180ad11cfb28485970bfd79f62e1893f39dfd",
|
||||||
|
"0xbf555dc1708cbeb96069194d2d2cb75208ef2cc73fcac3b4f35abae97dfc26ad",
|
||||||
|
"0xa38a19e71f0b7176b3428cd3e635405fb1df56ce3ab60f711521b1c6dd5921ef",
|
||||||
|
"0x7748a206bb39f27841e3fd6caec4c00a68ed50ca1e474cf8a943e99a21013742",
|
||||||
|
"0xb1e82160b63784d3e9b434033c8b79c2f9f8bd713e392581fa7db2290512a437",
|
||||||
|
"0x0569198adc593a471ea4fba27d0aa659361395b18185de08442aba1128b321b3",
|
||||||
|
"0x4821034a9f0e2d3badf586be65a04fdbd035c960265d0f2bd07cc5403e1ec002",
|
||||||
|
"0xfc3b5dfbb770fba26e68a2cf15ab6d9fd0cbc841c8b7e4cb67f975f0d1e9a456",
|
||||||
|
"0xa85944d5b68b690c8eae612b09e71e422f96234bfc55860159e99371b17db96a",
|
||||||
|
"0x704ddeb5089de9f58c7677150ca4dc64b9f8eaeb8d1e24dcafaad48ec910dc7e",
|
||||||
|
"0x223938a7097dddac139a909c0c33880b8da9dc45c86e1493d21909f809531132",
|
||||||
|
"0xa07403c373e4edbdc13e207241577de01d2cc9baec6529ca28afcdef27ac04d4",
|
||||||
|
"0x385fcf679306dad9d1d2323caca5d17aa3197316bc4ae3dbe126a7f687280e13",
|
||||||
|
"0x81c27cce7a06b71cfe276b0440865cf2c0f444bbd6904bc30f2e2380074d1020",
|
||||||
|
"0x2fbae35e1c82c0d8afda61f1a0e95dd5ca47fd603450a7f2fa4fa5bcd73ac5db",
|
||||||
|
"0xea14be904f027e364092837e583dc19500addf6e5ecb59af1dab4cd0a132a04b",
|
||||||
|
"0x409f1a6a99ff08ac262addb8ffaf3fb3d08db086716c92bbccbc2b8c738b8866",
|
||||||
|
"0xfcd3cf7e04c6eabe6c648368cff1ef62ffff8fd5f3279176781d2238db715f04",
|
||||||
|
"0x5f38c3238f5b52cfa9f45249651e468a53a2b62f1b62a5c543bd663dbae07204",
|
||||||
|
"0x265a6954be72496fec70afabb4224f7ce4258caeeebfc4c6d27550e17cce58b9",
|
||||||
|
"0x58b2fae8d925846b08310b557ca5b7262a9ee1f3b729863e699fbfa91ccb9ef0",
|
||||||
|
"0xbbb46cd133cbbeea781699fe620831b93db03bc3f7d77da64c0367fe5d8170a2",
|
||||||
|
"0x9b57cf784efd6d4d484486ed7ac6a7093fe0fe087931eca10e9f7a0084c4fbbb",
|
||||||
|
"0x1ef9d5604fbb21e365d259c10b0b24070a5d5ba4dda6ab44f37337d62c4a84e4",
|
||||||
|
"0x2502589834ad081fd22d5df57be4047001ac7df36ebc5733bca560ac5e463b02",
|
||||||
|
"0x425cac90caa07eed1eaa6c020bd2d7141601b5d007fbd5905d455fa6e00cf804",
|
||||||
|
"0x65d3376222597121fbf6fa541998a61605f8c344bb68b646c32a5d10a215f955",
|
||||||
|
"0x087c94ab1aebbf52e158c0caf0ffb1ccdc179b3d3b9ce136653d6e72a918e96a",
|
||||||
|
"0x5524392fb09e03a0bd8440d8e9f038a82954f95332bf4beb8f8e4d5be6deb904",
|
||||||
|
"0x134ac78af0626fa56dd62f27ea658570652e5fc3c627c57d737d178a31688f7d",
|
||||||
|
"0xf2e565457b1d938a18a8fe1c3732d70386f9344be91380d8cae740ffccdac58a",
|
||||||
|
"0xc203bc327d1085ba09cafbe5645657d73e64450ed314dac5c84e7f356cae01de",
|
||||||
|
"0x9c847099e82e8b2c1be8a7cf440ecb85c8cc20111931c0bedbb7ce778c7404e0",
|
||||||
|
"0xc22206c94e653a7439faf69cba997d9feb1c5b34829bf00a4c85d0adfe79d911",
|
||||||
|
"0xce0d9b43dce7b340e847e7340aa7d58c03b778a57e493a8f8dc9d63ccb06b6a9",
|
||||||
|
"0x20f416746af1522273b7119f31000c4848ee66597d5945492053cbcce359c6ff",
|
||||||
|
"0x9f789bec24566fc2ee6179b336be2b08e67fa39a367787063f07b7424f8f77f5",
|
||||||
|
"0xdaff9cecfb864d02ea03a7fc76d24760303c1d28a93613bfd659dea6997d8cdc",
|
||||||
|
"0x522c6b0c2334ddeb39a0fa8092851535e6980e3bfb1ceaccf86247ca4209c392",
|
||||||
|
"0x35e1440e9e6851ec26dd112b07761023637bdeb54c9a4045475b8616eac8f2c7",
|
||||||
|
"0x160df7b24ed8a0d4e2d6556add5318aed08656dc2f218b75badfa7dcd2d6085d",
|
||||||
|
"0x1219ccc41d673e6e1d8eb1e2a1edf6360318a611bf5917f40394216c3398af30",
|
||||||
|
"0x5237d29b94e6427a41e552dfa0db1281381a6f7f5eca72134e1638a8a7acb790",
|
||||||
|
"0x596d64fb8478cf32fd3d72d70c4ddc8a348b4d2aaefabeffc906a8ce656884a5",
|
||||||
|
"0x6cd01fc463582e85e433263128bbcb75d8cea197d650034bdf0ca0fba50abf92",
|
||||||
|
"0xe879011882783b1f085cb14abe05fa2fb008f3f25d303c96532c7b63091fcd50",
|
||||||
|
"0xad0e0237bfc7ca75073ab1328770fe3fa2099c7aad98d659747446efc271860a",
|
||||||
|
"0x1ef22d01e144466d68c09600e54425756024d95f323064a7bace055678533223",
|
||||||
|
"0xeb4f046e6c9eafb07c8615513b096dac0c30a7a9983a9b9d282ced0502baefac",
|
||||||
|
"0xa5ec8188ed11607e0c166d809bf6f4a624b63a04cdde6c9b38ca991cc363f07d",
|
||||||
|
"0x757cbd504e40ed1fb80967cbfbf0d73d649f381e07d3d774f6fb6a958872e13c",
|
||||||
|
"0xa9d67e8749177c72fef84684a3ddf25f280e624fce571e202eac7f4713675f07",
|
||||||
|
"0x05fffd3d981ec6411342264732be62a03ced7c7fbd2ccaae53fee75c81017316",
|
||||||
|
"0x673bf4e2016572077879057f6d122ad7e29da0a17c62a97679dfc6913820d42b",
|
||||||
|
"0x3f3e2d80251eb582daf8057af384c4e4a419873e1fa8b9ec32a6ed7054de1efa",
|
||||||
|
"0x860291469fec3ecb7c78b2a3c291722f43aaf747fbf3bd88cc4061083516b64a",
|
||||||
|
"0x3c30c64ffb77b39132c64e8856024abf0736cd2603da0091f52f1e81983e67ba",
|
||||||
|
"0xae8e21ce50f85fc0ea64696b973f53ae1cd877d64e30f13904d15b34d4bac6c5",
|
||||||
|
"0xb4ca3d97e33e9526ad1c7796a7f9efa5858ebec2605d1367862c880f78c86272",
|
||||||
|
"0x6c20893dcf39f711700bf6be5e360ef38102a7f7129ed83e24c5fc24f42584c9",
|
||||||
|
"0xd520870cbe314b46c1b7edc21399986870303d38cde9cbce3f4e25807124b1fe",
|
||||||
|
"0x9a24dc78fdfaa16af729b4b27c324a95068b7fd09eaecfa6564c7a815b8e9084",
|
||||||
|
"0x9b8c6c28860af11376931e082ad7bf12b0cb75f2582c8284c6e587ef2cdb8842",
|
||||||
|
"0x656f2096414bd7ad74c7abc1cd8222c61697b15ad68d7a5e76c1dc41086129c4",
|
||||||
|
"0x95bc4027611b90d1fb1ca0eed5bd326464cd1e4de67ff8640683496785c38c04",
|
||||||
|
"0x20e3c8545a8c05022d3b83a1bcc94db7239a6f509f13053d19b8ff7db126d093",
|
||||||
|
"0x767a60be20b494d792b1d4ea6fbc35f4affa633841f7f07f6c95b8b14ddad8c9",
|
||||||
|
"0x521dbc01a89820776a38d4989b6ba794d7c0251ad939dd0caff9a7b99579d0ee",
|
||||||
|
"0x814c1693d5e763b3e91b49ab8c192dfac0848993839e2cafab76e5cab13c6f7b",
|
||||||
|
"0x6626910d3525d978e25f14a92e3e2795dcd2f7844dcaae556127716ecbdbf747",
|
||||||
|
"0x685257b9002ba7808aed5b69dced6fcf1eb9b75e1e3646541aafe90caf3ce1b5",
|
||||||
|
"0xaa3d255fbf57445aca9fb45babd6fb58c89a95c6625f6b80601bb656a5eab344",
|
||||||
|
"0x2795d9516f8f2f15da8904741d24cc0675803c9a7ddb342fc66caa7d5050bca9",
|
||||||
|
"0x283f89476887c625c534bd277fcf5523df8ded877479517728358b71efaacdf2",
|
||||||
|
"0xc2044a35800edb0b6848341004928307ed023660fd22d7eaad2422146cef294f",
|
||||||
|
"0x01d35757346541a85a4b86f41d1b5b21701c1efce3f287a034497942483f52db",
|
||||||
|
"0x43d7f8c173717cfdbb3cbf38cc8cdda9c6ea8f05bfd435efe1f74144c9c84f24",
|
||||||
|
"0x6463d12f4bd83d544a14948fdce6c7e9e0da0e9812bedfb314b6e91157c0c682",
|
||||||
|
"0xa7cc32d879feab7508b84fa364fadc0af5a7cb1164b61d7d6cc5d7d1a76c32eb",
|
||||||
|
"0x37cd4953d262b095fa8a5a0708224d006ed9ef93d1ee5edeb285d410c5d86a8a",
|
||||||
|
"0xe896567b6be24f3ff1d962e05015f574443ac86c58b07bb943d12255cd94ed11",
|
||||||
|
"0x51d07ecc06ee4be7bc9700631ae07818756aca34d1eb2ac6eae7112ea9e9df41",
|
||||||
|
"0x72ba4e79031a1f2616b8e788fa578b9ea830e08823467fc875dd603badf6b79b",
|
||||||
|
"0xe06f71635f9df9bcecbd6553ab32f1af94275d8ccd59d1969c248822e3b6feb2",
|
||||||
|
"0x0484a049e43ac9f424ee9b2dfbd4c5932cafca539c1bec00d32d90561746e12e",
|
||||||
|
"0xe03a17de161d63503962f3d5cfaf28cba22ed622cb88547c8224509e77e2bfea",
|
||||||
|
"0x203acc2c14b68b80292f381fd440da199c9f8f0e043c42e0b0adc67be71bb807",
|
||||||
|
"0xba3d7f8a15b76afa8a834b44a922332713014a5d5ec3e52f729007c6717d5324",
|
||||||
|
"0x01e4a4e25bbfad7dbb0a23adf6fc873c40561319ba7bfbffa3c7a379606433cc",
|
||||||
|
"0x6252660ed44dc18d448fc1cf49bbae98c4c31817b6e372c71d45832556261a1c",
|
||||||
|
"0x1442a2a2eb665994c951d8134726c91989f7fd13145ca146de4e87a203ed1c31",
|
||||||
|
"0x017e10ab064887aaf7354bf1108d6946d31b435838a56d5c43bd70d3b5fe7c6e",
|
||||||
|
"0xc9f0213c74e6f3ee3bf7505c66620b61b147597ae8a4c3f0324463cb57d07f78",
|
||||||
|
"0x321a1e72fb858b8df990639bb7b05e10b7c094772af92fea9a8882b84a91d33e",
|
||||||
|
"0xcd57ed7635c2c59e8d2fa2ff04afc2c851d1a792fcf2e0192769404dd96b3be5",
|
||||||
|
"0xaf89e85dabaa1fd91efc15f0a60e2fb10be92c6ab2d726d6f7afc8ab94d5639f",
|
||||||
|
"0xf8425ba5813b811a587ad8b9fffa64adc22ad5660ff77a94ecaf479dadc7deff",
|
||||||
|
"0x9d602387122f2c064924d32fa3a62ed2e39dbdeb570b55af7a6b138534ace4d1",
|
||||||
|
"0x2569b3f2c09c18ec14468c4615355afd9fcadf2bb6c9d527e4a3457a068bb808",
|
||||||
|
"0x96a695ce507be20ae2636449116850e8cf86485eb756bca499aca80790c3dd3a",
|
||||||
|
"0xbb91a27d4a244d199c1b9dd22d0a6e687fdd340731c13c7016b7009ac49771fb",
|
||||||
|
"0x468a1b2fd3c8835f1f1b7e16f35a5a401cd4e7e0e50920198cfd3f27b5971f7e",
|
||||||
|
"0xce2aea8f42295d49480f6ccdb2f0c2d33af2b44f1f3b0b4eb45e3975397ee264",
|
||||||
|
"0x786c6d63ef22e083b0aa3c1cd2de64c238efa8963532e84471ca40a1fb210f4c",
|
||||||
|
"0x86f90dae63767ef7819d0c779ac362b2a23e8c457bb7f5c901e89dcab8a5ea14",
|
||||||
|
"0xf689fdf55a5d1e1474b9dcb1b591f14448cd017d2d708bc522157688a728cc8b",
|
||||||
|
"0xc4be4c521cc105651c4a2a0449d206c2d7052123d06bb02ba3afc1b22d802177",
|
||||||
|
"0x64debdb7293aaac3e610bececfcd7b53e103c27b03173f0cfa401db4d385023f",
|
||||||
|
"0x3d4b4017e6ffe74f2a96cf8cba7b21edd627ba5105bb87e79cb1ea88b3657366",
|
||||||
|
"0x74161c9fd283d80490b55731ddec4ebf2a1e328e518ac17b2526bb93d069ecdd",
|
||||||
|
"0x89f522f48230fcbe9fe87ffff8201ce5fd853bf7ff6536d3299368151b833871",
|
||||||
|
"0x090d72bee8471c51275662ac2fbe285e5a52552348af1eca33e657fac448db8c",
|
||||||
|
"0x2d76427152f13ec917a6e28430ad5f0f0e69b5abba49ef432a90c4fc2a875894",
|
||||||
|
"0xd490618c0aa63e1e963e457c6be096bb5242b10765b4797df232def9d0269aba",
|
||||||
|
"0x980445545153a80c8aa343a8874a80fe7fbb7beac68e58d5d90c4c5fa73d7e9d",
|
||||||
|
"0x0eeb2df77b486bf20203c9e80981787ae439fc38f39c583ffef93ea0aad82358",
|
||||||
|
"0xd0897e799d1152432c2d9cbfdbf72d2e522af23766e7ff93d51acd52ed869683",
|
||||||
|
"0xe740acfe918c168daf28f9e491cf94b3b168de4e807a80b5f1b097beff45f206",
|
||||||
|
"0x125580c9d014b8cb50a56f8a14f10ba4360fe448f18aa86829bc7f7e1cccbb77",
|
||||||
|
"0x7c9af1244e12d298778b3320718f096faabed0006acabdb0289bcb7b5c2bf8c1",
|
||||||
|
"0x76ac2ad7e52c2a1e7b23f03f21d607bb634a4290b800fe479c6c134c87d41703",
|
||||||
|
"0xdfb4b41974d53773300949ee46ce3edd2b5ea0f8be55d87bf9b2d1ba21dc30e7",
|
||||||
|
"0xde87fe285a4fb2dfe40dd79462488808c6efc4ca3cf26de46f3ac56c4fcfc0ec",
|
||||||
|
"0x72ddcbe95df0949ae31eb4ee5d532587ec1d30a358a3fa9588dc6749f3b0b673",
|
||||||
|
"0x4da323bf0509116d1dedd6ef0c486838a9c8fc7bf0d6f2899fa1c43c89791a5c",
|
||||||
|
"0x6ab3c6c40001407ecc8b5926692e6bda176b5d9685cbebf72a69a8bd01c8764c",
|
||||||
|
"0x85e1cd7421da9343f156f573c89d477f166cea452287d9cb8f19e71feb570cdf",
|
||||||
|
"0xa8f06a7f39e85e9e3c1abf454940c9d4a658f1d5df827935376f556b90670c53",
|
||||||
|
"0xa6ef83d45fe75050512a767f8d69b74a59a43b2d12a03204bea075839e9401c0",
|
||||||
|
"0x92d440c5683f941accc4b575e884bc402fedf6499b1a9f74e0500885eaf211e3",
|
||||||
|
"0xac5536524cc38b40c8f0b421af9eeaf9ed78be65bd1b180a469008d5b807cc1c",
|
||||||
|
"0x00bf19f0ca582188040b38756dc88388d1aca7cba42aa89e513628a433156b0c",
|
||||||
|
"0x220b5f691ad4fecf71e471a845862097fd754bd0ffaebc204c048aa48acb2bea",
|
||||||
|
"0xba7174d367fd0f9487aa9d1f2444a4fdf38f39d3686d7d41d18b0671653cfe6a",
|
||||||
|
"0x04e281d09ab1ff8fadd252a22c4682beafc436916ac90f81ef85d3c92fefe628",
|
||||||
|
"0x4aeb3ab7be3dd495dcdc78631a3cfece68ae9797bfbc4b5ac6ab13002d9fe6e0",
|
||||||
|
"0x0fd273deb137dcc98c8bc54f13098e355568bf56077a58f656e4c22e51ab0360",
|
||||||
|
"0x55438d435628bef382426565cad284695ebffa4ff7485e10c91c0988ba20ec25",
|
||||||
|
"0x049e4a80ef77096719ed90d324174d50a0f84cdc3da0c45d0b122a813028d2d5",
|
||||||
|
"0x200e2da004718c48d4850a0c5ea3fc9821f820af0cc24b733d80dab98d756ec0",
|
||||||
|
"0x9da660709c2b4ab2807df73bc4d11cd75a102ff5d47ded6781ad5a293ce22415",
|
||||||
|
"0xf29ee2bc658cac2d28a1e5809becab789b329938c3ce314bec172c6ae3861f4f",
|
||||||
|
"0xeca0f045b3777c894d3cc2be518cbb06b2f54c4c9d02374e6d27de0721c471f4",
|
||||||
|
"0x804b27ccfd7440ae1dd05edc6acc4194a288918958541de596530ca2b89b3b54",
|
||||||
|
"0xe0805890aed8a60e2e60d2bbf29a2d130c64ff69a82e3a78f63c9e483fee94d9",
|
||||||
|
"0xcdfde2f6274594a0a67a6d7b02dfa0fc735842c28b144a6859ef6eda842d6669",
|
||||||
|
"0x5e80068e6aa44fe7d9c810607d90e13bc364bdbf91255fa4675a7264bdc38998",
|
||||||
|
"0x622e0765bef88f51dd013b616f40fb80c6bbf6623fb226d3d811af52e4de7740",
|
||||||
|
"0x0ee735a5e83a5191c4e531c603179e90381eb43de0abb03e12e5f8d7b821031f",
|
||||||
|
"0x55eacedd69481b311baac1d17343a78a1587454e6acba2edbc560fc1c95ebc6d",
|
||||||
|
"0x2eda26ac17139e750560a6b705f60a4408487668df17fdfa29fd1f3d3fd76aac",
|
||||||
|
"0x18a465896c7cda9912dc2c7ba459224a924d0feca1d49825423277902b7a0094",
|
||||||
|
"0xf764b9bbab0bde6ce1cfbf84a8c280f1524f396aed6fb4569f59e2791afcf27f",
|
||||||
|
"0x7d7fbe746c72958cf2dc3d5b6a7f2b680c0e47247e9697a1135384486640a736",
|
||||||
|
"0xcc595d1e98d13809ed5a22277ec10f25f36f05ff7ef1aa91de45bdd471ce76ca",
|
||||||
|
"0xd9579a9c16117e08e441401696fe4b3687b40179cda267be384d044d27fea705",
|
||||||
|
"0x39c73747189563c6ee22de333270178803b17b5d1e300732143a3e553ddac6e0",
|
||||||
|
"0x52049d4f26ff9bcb9b4444e0a3d4551d2e68ba31787f1c69722754004e6c10c7",
|
||||||
|
"0xe15d9b70b804cac3efaf1eee6f980b146f2753cca6f60a338800fe67cbf47db6",
|
||||||
|
"0x150feb1be780bb1e166b4f7b54bd01434820fcb8e63244d259a56bed67eb1fb4",
|
||||||
|
"0x48441f61086ff68e3d7ea203193df77565ff8c846a5ef3aea5cdf52ead82c6b5",
|
||||||
|
"0x8fd3355dbe04679233da0c0aebf896128245349e8e3925e2f4b4e044ece35654",
|
||||||
|
"0x22395d1a8af82cc86af2697b45b86df13d5af07eb790a96624383d2d2cf35fbf",
|
||||||
|
"0x32c13c2498ca202482c0b2e7e5ed096bde4c36cdf15dbc0076042caea180d6ba",
|
||||||
|
"0xfb3fa42d8cca9e62d1226bce9a8a3d8e75cc461d2b34979751107ac656130a4f",
|
||||||
|
"0x2860141a7eb70cb951b3f45f13dd81c95ac8d86c97ee354e65c2ff31ad24f149",
|
||||||
|
"0x7c02d5bb3b990ac7d5c6a7f183fb4c4e3d2249605f6d963e12b6587e665bbad0",
|
||||||
|
"0x22a79a905b70c40eebf4aff3f9a595458e9e5a585ae7a18a32d99cb369cdda90",
|
||||||
|
"0x8e10f60b08c81d0ae43a1932f798e85bf0bac6d22ab3d399c22d1e3744134de7",
|
||||||
|
"0x03d6dda99b12d94960eeae1f67dd6ff8f41102ab00aa7b48055515262bcbcf01",
|
||||||
|
"0x2864090dfb4a667388f3c51dea1daac94245f2de71e804bd7e9f8c4a6206a827",
|
||||||
|
"0xf64e0a38264b190f611d8afe030e948064af722c1d85a16e3e20a5c4d6c9153a",
|
||||||
|
"0xb7706df2d787d33c13f2f100cdbbeab68dae726cd5a08a046d7fa8b34b029a23",
|
||||||
|
"0xf91f33d36525beb213fe0761808dc89921ed0d52c5214d704acbca639098622b",
|
||||||
|
"0xe1825f2cc40a1fefb24edbb3ee31c5118448abdd237a6e27f364623689a70a92",
|
||||||
|
"0x051450e257cd9e5d03081ab11de949a52b4391f7f7179fabe0e7f43e0cceded4",
|
||||||
|
"0xd09a4642c0fbbb0f29af7bf0ac06c080e468e2e287d1ef74e388163d5c0057dd",
|
||||||
|
"0xd7ff8cf1b7744f7c2d79255e5288e8a2c6b58ea7aac62894716149f42f3e020c",
|
||||||
|
"0xb108bbd52148c62ad106a9cd35aec9d8b111e094bbfcbb4d447745f8a54ae8fc",
|
||||||
|
"0xa4794deee36a670394a5ec4d908728a1796cea8c8564f61e41201a7ae985b0ab",
|
||||||
|
"0x4fa697253bab92379a876446a3af734dacb965722d568203a1194e078777c364",
|
||||||
|
"0x4222754bd0a480cd4e1bf0c9faa267d17a941496e557c0856d2ef9818f96bcfa",
|
||||||
|
"0x8ee7c73f3d4ba9c2764cc6e980f3b9a53fe7a1306c415c8fd8264a33dd5622f1",
|
||||||
|
"0x17f40c4b7109e2aec6c8c4eea793e196bc96c73f20c963a923fd311b23814590",
|
||||||
|
"0xc32018615cf1253161ea102dce96379f6fb9791e8008d75d86642f21bc555b3d",
|
||||||
|
"0xd38fa39699ea67d3c4892094309335ec3bfd0185790ad117d197866331a294cf",
|
||||||
|
"0xa770de6526cd0a07d0337cb18e371fa33a6ec0803203e54f1c93b276d1bd24ee",
|
||||||
|
"0x7377908db9acdbc040fd248b8ab85eefdf7edac2efa6ca90535d4241c2286d46",
|
||||||
|
"0xcb74aabcd157c732935f0d8b926ecedb3b643ca97ead5077301d2b4768324908",
|
||||||
|
"0x3885f8b2a341c91cf42d459a0f9e81bc11bea8da8e0080c884e357d79f0143a5",
|
||||||
|
"0x1c56ed46627a1c6b2495cd4d94473920b8a249c951b227e24b9bafaa00a3575c",
|
||||||
|
"0xc2e5a1d6afe982eaef9f35cfe30b4f80e224950c094d9ae39430476988199c98",
|
||||||
|
"0xd5c27345331cde1052278637de22a243e9c5022d4edc254cffb7c574615e661d",
|
||||||
|
"0xe89ad382c17daf957f02a2472fd509eefeed4a10317ca97085539839a80bc5f3",
|
||||||
|
"0x2bef80881328dbe76f8f87a6f7285209a1355e9400c31fe1e915d5a0323efec9",
|
||||||
|
"0x0a79f2fc887da96d5ea26722726d83506c1d5fcbcb50044ba6f74336d9ae8609",
|
||||||
|
"0x2d79e9b35b5bd7beb0bb392a4db71331c4bf41210c26e2a0f5e64c4de8d659f8",
|
||||||
|
"0x3a82b6fea11f99de12f1e39202c2fd69a21ea2fe5f4d1d62500ceee7de29c88f",
|
||||||
|
"0xeb1139baf2c45e867787be6df45acc8d21686cb21adb1f10866ebb1605741ade",
|
||||||
|
"0x691505332d0a4c6af51e0c49f11d578f834e961898279a21b680438b3dffd917",
|
||||||
|
"0x8cb46c9273d3ccecf1ddcd4cc86b9ae5f1e1bec57c15cd624853c2333aa7184a",
|
||||||
|
"0x06f1cb0b68758ada524d604ce8b6d5c273eaba7304d8650687869eb575799362",
|
||||||
|
"0xce7464c87dda228032c88dd3ed29b41524e847e31ebaa76b2248eee64ca41e70",
|
||||||
|
"0x64b6e5039609367f5c524c0d5266150515cad29a8a262c76614c5086c83f1bb8",
|
||||||
|
"0x76cbd65dfe8dd8eb21996529bfa0663bbcd851b675314ed4855689ed9f120939",
|
||||||
|
"0xea80a1c269e36cc9ef3aa3daa051a08e03deb23add31dd32cff7bbb86f53c8f3",
|
||||||
|
"0x575ed304982a8b6c44b3f6dbfad271ef13c13986776abfca33a9da2727f587c2",
|
||||||
|
"0x5a969beca5363e60be1c6ba433f6cc037806e1c617c78b9a3115d47d2e87865e",
|
||||||
|
"0x2b010bbdd97fbf30ff7b48263c8ef58690a2de5b4cf170829fd458d2309c7c09",
|
||||||
|
"0x7bbc16e0933d41a60d2fa96563ffe099fcbcb4427cfe884150f645f25af752b3",
|
||||||
|
"0xba7fabd6d879f55a747a3427b3b2c5e04917b0734d693f759c2ee5fe235c8e6b",
|
||||||
|
"0xa890505d5778b78e3dc6c9749e8c9c80e490aa84bf91a76f4fde2d39a8e68ad3",
|
||||||
|
"0x36e27f687d02db5cf074ec89896e557ccf240d6c0271b5858a6af8b2661104e6",
|
||||||
|
"0x6a18097d71c66f0564a0fd27b05346d2dc74ccbb1ae123ba575a2bde54f1e810",
|
||||||
|
"0xdf4b61a51fa7f576c212aa0ec1a93118668f8c5fae5e7a55a27d2d0033634734",
|
||||||
|
"0xb572f4dde7b9282f92de5efa836b9d8ba82476c229bc669eb1956e05a1a02923",
|
||||||
|
"0x616b7d8a8c29a6dea339ceb8241b86fead820cdbcee279f87680b9973c1ccf85",
|
||||||
|
"0x3c59231ae02993318e8244435bf7f51ad352ce971a2f174725f2c2456bf62812",
|
||||||
|
"0x66e778c1de1503722d7a610003596c092360261e4eff24c54f218baf5106a8b6",
|
||||||
|
"0x5b372b99a39105ab048a83fa36f2ee79de9c920addaaae0cfb5b569ed92d0fc7",
|
||||||
|
"0x1389b29e130b37d8aae7dd19b46f216c2ca8d8562c7e04be9113ace816b772eb",
|
||||||
|
"0xe947c173f63c2a4b5bc1d14617dff02d6221915debca30ce90af9c63123dccd7",
|
||||||
|
"0x18926071dedc42086bc9c90e9f3e80ea1ac09981677b7c8d75159a8b11043501",
|
||||||
|
"0xd196e45da07cd27ef03abb235166e4937b6027c0fd6de42ed71b5d9ec748767c",
|
||||||
|
"0x81440dee93f1b7ca2d634549e1f21b834e417df97338c7de56e2d630f15e662c",
|
||||||
|
"0x228a10cf2a02f134998dab3ac59a71a05681640f115cfea4dccc67baedf4f746",
|
||||||
|
"0x5ab8b611cb2eef244571059e61540fd338bdb1ee90e7ed7e5769e67f5eb2c793",
|
||||||
|
"0x3f044afb403947868f4d2deb1dce168dc9332451c1dd1bab4e94e4ff6de5bba7",
|
||||||
|
"0x6212ebee274a505464940ca808dc61d1f1a2df76820ce3a8cb9c26bfd49b67e2",
|
||||||
|
"0x6a89fdde963cc5b696beb902d174b99c0cf8ee2e2208cd8f1f25965fc2d7368c",
|
||||||
|
"0xbc5d4f775e4925e2201214b1e64c7f5080899125a01961b1e5a3d29aa6158d26",
|
||||||
|
"0x844b1f9e0da0aa6dea81cada5255248b14cc4655d739377feab11d99b77f48ca",
|
||||||
|
"0x8a972d2e563d3baa95cac6c73b23bb04e57e7db2eb27b2c6bd78f0f2b2285a17",
|
||||||
|
"0xd25370dc166a5a4ec801c652b9eb3b7f17c9c76f898c6da338dc686ea65fc108",
|
||||||
|
"0xb1d6e05e234624e144fd8db5189ed47da5befc84581fcee92176951aa7a6adc7",
|
||||||
|
"0xbae505f675148669eb640bb1183d5235260780e57f62398b244a289f6e920593",
|
||||||
|
"0xfb0cdb77ad3ad6dc5feab63979743a18d72aa7715f9e3518618be5de6c724d5c",
|
||||||
|
"0x78964f3f2e28bdc1d9f6bdd9c424cc8b211820f23bc59d61a00a4f5089eb8553",
|
||||||
|
"0x81985ebb740817d81784174ae06e160d3d37c1a1fd4b79b665fba428e6adf199",
|
||||||
|
"0xdfe038aa48f96bd190c570b92bb9771b49556a8e618bd17a3183d594cb303297",
|
||||||
|
"0x4c2866dccd714ca6e233da2349b91e7fea7dfd0055675235788e1bcc012fd297",
|
||||||
|
"0x4d9e866bf6bf2545608734b914a55f247b9acd17455d1262f6a352cc46499ef7",
|
||||||
|
"0x53be82bf17d1dc0d3d5e50be3a04fcf2f5191cd3547ca432a7814c038f709a82",
|
||||||
|
"0x1d5cda51a57e81d33e3caae568b083bb26f71fdb23fb68e1f7ceb4444514c13c",
|
||||||
|
"0x35633bad7488a5c222d4fcc3111768fb7c126065ad9b32c49dac3a44353539ae",
|
||||||
|
"0x857564f5cc2b7385db6cfb22e41a30047dfbbb333f5e2984bc5826805653e364",
|
||||||
|
"0x3346a3292d6d1f716a13fad02af61b18f6993d277cd891a162fb6df932333906",
|
||||||
|
"0x267114f270cb5c8d7be4016d4ac1e6950cfef777e36e746829963c9c08fa604d",
|
||||||
|
"0x9b133dba17f550b709ec7891bec8ddaa99a909482ff50dd1ab0f473a64ccbec0",
|
||||||
|
"0xbb9d1242e6dca8ac62b9cf77f5fea02bf6ca33cd8fc60b75370eca5050e7e3a8",
|
||||||
|
"0x4b03fff35d5eb647982f79cc8c6fdd3514a8b2d95d45af83a06352a9f857b770",
|
||||||
|
"0x1251e1e7d8ba37f5ed242c045d14bcee63d044bcbeb300d2036cb746675777c4",
|
||||||
|
"0x3ea4f140b4dc19071603745962ab84c2751c9fa7add74f165cc4955bd0a23384",
|
||||||
|
"0xdce6b80eb188a9e240c73c86c13554c89176a0a3a322538480683a9f1187e518",
|
||||||
|
"0xf67d61c218998a24048c4dd68f903190a0072c80066b53e34df7e3a837e18339",
|
||||||
|
"0x9f886a4835f3f8fc010ad96e3e2a3004647c0f3c744d98d527980383975dc6f3",
|
||||||
|
"0x8a7920678b5f2687620340ac774f00239e48bfe1cf443c795d6cf25fd885c98e",
|
||||||
|
"0x16dfb4a0448f4b05c18115f6e2c128be6d6596b338723c912f22cd80448de1d8",
|
||||||
|
"0x497588ed59d0e9b9733bb7caa08fc36deeaae3396bd3922272d69f4861f06420",
|
||||||
|
"0xd96c89c40ba3daeb23f18a83471be008dbf8cc75668a72bcf8d02cefa1efee7e",
|
||||||
|
"0xee4e9ee2ea8a057649b9105c68792f2479b7eca57276211d70da3097a9fe4904",
|
||||||
|
"0xfd789aa5a980fee8a509079acc5ad340c98faeaeb31a1774683b93b1753289fb",
|
||||||
|
"0xf9e19259a14a532c93e935d252145d41988c16faffa4a185df11ed5f23715d20",
|
||||||
|
"0xbb0b8e1c03cac49cf3b45bc031a229334f9f25aeb59d410a12fc17c7e78f759a",
|
||||||
|
"0x5993b045dcbc40baf27d780c48b881c864f9aa21a9d59b0d4ff0377aa64e7c7a",
|
||||||
|
"0x726dd11a76be09acae4dbe103f0ba092d654206dee07511d6ac97c673437d26f",
|
||||||
|
"0xb43c5f0bbd52398157dd6233a5d8a03c931166150df21e8643f02b6c767239c4",
|
||||||
|
"0xcad3878512998b146cb2c6eb61efe07206c09677687df4198d9174c66e3ef3c7",
|
||||||
|
"0xf8a7872ede6770b0f48c924888c3b4d1b410639ddf98944561f837acee7c21fa",
|
||||||
|
"0xb31f007ab3deec8e37f7b70d4c5102a06eb9b37abf384ba3da0d7f32d29d320e",
|
||||||
|
"0xde77b2e81f239a80caeb44731b1f272a10528909f7ef6e342e36dc29edf7373e",
|
||||||
|
"0xa9818a101b730940a6b7698f76d6c08ef7720b12fd267825202355c3edeccc72",
|
||||||
|
"0x962cdb425d23201004d3f39a045e10aa39994fb8425aca3a2298b4ef1c9cd6ae",
|
||||||
|
"0x3c2a14b29d91c93978fd5a178adf3cb1aa5d60c8eb0b60d4c05f3f32b79ea42d",
|
||||||
|
"0x86d861026e8918c570c3190e57244aa89be34d57aa0c0d4f65f98abbb547b255",
|
||||||
|
"0x91e3b5fdda9b9087f6d267741a383c6c9a566851e03501d9090228046d793a32",
|
||||||
|
"0xb8e4f9fa0c7ddaec74a87492af4679aec824a08fc3fb267dc6f41b764145040e",
|
||||||
|
"0x7da2db73f48b0ec869db149bdb9ee85f50587720cb0fd6a765a23586f47e61d0",
|
||||||
|
"0x04b81ae4616337f5a09700eafec29ec84af8b0babd528913c8155ae3a47545e2",
|
||||||
|
"0xd2ca213e6a01e43f2eaab755003f25512fde5c1fc9d809c0b6ec437b194d5899",
|
||||||
|
"0xaced62e93320daedde74a5aa1f72739698c286f9ef4848b7be0682d99fcdd385",
|
||||||
|
"0x4e2f1707f429a5be0f52b39936d90bd3faa1693a4c18f0926cc300e2c2fdf8f4",
|
||||||
|
"0xc840e1e29894fb3ff6fe5572075b0a1e98e33b251fd8dd5996cbccf041a48b4e",
|
||||||
|
"0xe3d69480c26d810001a144e37f251e3ac4bbbc7558a0550a4ed8f8d5a06f09f7",
|
||||||
|
"0x7bf69d3d3bc804cc504ef7d37fde00fd3649dcc2853541507585e40b67bead0b",
|
||||||
|
"0xafe6cfb04d00956f24e4ebc3e9e0a23e55b044bde113654a5787a8c05add0a4b",
|
||||||
|
"0x3d050577e4169f4205e19f28f309142665acfd296c2ab5c234b6b5acabab07be",
|
||||||
|
"0x2c74c7ab90ae5058daed0c9551f0c9a52a9a5b10871fb0f71733fa6c39969882",
|
||||||
|
"0xf3d37db16c16218aa47b1ece8b7d178c42f1d06ec0141cfa0e5ffca27b21969c",
|
||||||
|
"0x5894c5aea4a461941788104ba38e9d8d39718ec8e4948c2675d83195584d1df5",
|
||||||
|
"0x564b9061ef80ed588a658fb138240e5c6356a5e1bd557ea06f85b4507dc4b73a",
|
||||||
|
"0x6a802d7836b1db57aa5b6c68b43fc072941e2c8090e73e26de86a0956eda3876",
|
||||||
|
"0x05fd4b6d5633a83e48fc91638d3f39cc6df164dc4187c78c19f4bbe78dcd12ee",
|
||||||
|
"0x481d0df4eef16c19e38d8a08889da1c2279d56ad2b6c6961737585686ff42280",
|
||||||
|
"0x0faa8363d77063a3ec76a6ec5786e9d64e0d028912c3ba5272c06cbf7c1d7c52",
|
||||||
|
"0x2177ca5c3420989d7493b28534489f2269f28e97ba167772bf5d17e9f9efd274",
|
||||||
|
"0x0694512d03ba47a5f36d024abed8ce1d15741f56c32baf7deb5b9a5e3afe66c5",
|
||||||
|
"0x38364d47d110cc930dd32fdc5cb7aa4e96b88e783b7060d2302c8235da7b4e8b",
|
||||||
|
"0x7f63e39e98887db4dfdda2cdb29ef716425f30480371beea60f2f70a8df7263b",
|
||||||
|
"0x4069d32514b8216a07b21c23b75cb63f12967dabec053304c990ebc8de9cdb99",
|
||||||
|
"0x954da7bca7ec16e62189cc6ae2878dc347d1677895cd978f2dfaf31593cd6bce",
|
||||||
|
"0xe9eeb5d86aec47d3f43f2b899fdad816b0c30e3040cfad14fd3e821cc6962ecd",
|
||||||
|
"0xae81c8ca19bf6b92752fcfdce9441f7c5b540d911a5e4315e561e9eb22746a4a",
|
||||||
|
"0xc84bf9c8ea619e0658ff70101fe588dc385e1e997349dbe112d66968ed672113",
|
||||||
|
"0xb113ba865fbc89fd495934f9139731222940ef72804eaea010f12ee167406fa6",
|
||||||
|
"0xf70a9e70e90a08c8fd629ab4fe0d1497896ab2d5e00852d18fe672346e337155",
|
||||||
|
"0xc1e671394b86e70459a39449e8ae9cd0b3e05602639e256a9da4cc3c047f6cf7",
|
||||||
|
"0x577bbcb4066d1aad7cbb75b5ce0f8f1bd7885511b1a7652b8f8600492656d673",
|
||||||
|
"0xa836b6615e1a4b6e306399e9da4d2c661985446822c8c05939da1a35414cd328",
|
||||||
|
"0x7042af635abf9efb3d9f5d6a2d25e638b6e9b8c6ad61591a7f88cedd4b0667aa",
|
||||||
|
"0xffa0e1f57683d082733344e57ef4aa267dac50dc6d72e8f36125e7ba892d19bb",
|
||||||
|
"0x2ac6846383bb7ca0ec56883b797c379336d64d9753a16ce48ad14d4086da2388",
|
||||||
|
"0x21499ae4629bccd17845c58f7fd13a8a72ece3557f4c11cc68af46426d3c3057",
|
||||||
|
"0x7bbb60b32ca0ec25a830e77790f73d11ac92929d2c9dc8eb70b8be026c7a7489",
|
||||||
|
"0xbfbd58d0c7f635ecbef3eb27d114068f953c2ef4ba9407a33c5516156d622e77",
|
||||||
|
"0x08643068ca01cdad8fc46e5190a9c90423e1f95cb4960684977c6c7980e6c0ea",
|
||||||
|
"0xea194e1527fb2202da5fbac43239179f2cfca95206c34c56042f69ba76ef3cca",
|
||||||
|
"0xe7e1206b62032646bb310e8b11338d0c94fef89151731fa701767d22105570c4",
|
||||||
|
"0x222084eaaff69aa8c1addb139d566e71d95dabe7fbf1cfcfb7d604eb3ab133a9",
|
||||||
|
"0x615c903ae923f5f8769befa3d9850d53b36ee3b47f2f136545efdace34e72de8",
|
||||||
|
"0x20f73e2ac4f18b1664a1028184367aa3d7b4b6d16492e199991cb0cc334908ff",
|
||||||
|
"0xe6fba0dd6fca5aca6cdc8b64f1509e6bb2b7819906cae07649bc311cec2829b4",
|
||||||
|
"0x4d73a9c7d379fd300f03be9e842ceec41a4c00ff35610756e5754f33929e8719",
|
||||||
|
"0x875ce56746e3303d28b7b6345d21dcc26412625d5972944a9a6039cde722260c",
|
||||||
|
"0x8fbf9148420b9c2eebc075d757ffbcaf0ee18373f1827b6b7c1051abe1b47bc7",
|
||||||
|
"0x44f7288451825d7b7bd4e4c8f82d9e017844ab9c08b77b4cbcd01fa39a755420",
|
||||||
|
"0xc150ccccd85a88fbe1795603c84193173c6de5814952763be4915061bf9490ea",
|
||||||
|
"0x936a08521d40e87784ccfe3bd50bf5f0ce28e8ddba7e29b4ed4139ae5030ace1",
|
||||||
|
"0x023d64dab9457ad253e42455b83a48217bf31b6779365694ced4640b640327e6",
|
||||||
|
"0x89a921ab2c309f0b86689c3d8f1eb6e9daa745c83b0d1a04cbc5331f9f96238a",
|
||||||
|
"0xb6f2020f682f34cd41dd273f19e6449c6b2b0b35d3bd7bee96363f97f028c27f",
|
||||||
|
"0xe61f2638f6cdc94607c9e978d6cfdc936a126cbbec0a97e27ed6733683b0794d",
|
||||||
|
"0xb136303b946b359cdd76c1a588046757221bcbdef6b7c4c070d9603bbe575b29",
|
||||||
|
"0xabe07f82dab2b17a4990f425a0daa1b78fd22ad33e68c499a7fd418c5f09d6f0",
|
||||||
|
"0xaeacb7ce46ffc86a5e08d6a71b7304f8f7f5fd794ceb0710888bf1825e7b0620",
|
||||||
|
"0x5879c7fe56421aa2a41731a4c6aeffdfe690b27c1468f5467ca03f69e7c74149",
|
||||||
|
"0x8a962ce351c06748908f8565ce0aca5b874c2ff18e99611cf12843a1bf93dbc0",
|
||||||
|
"0xa7557ac54d37f207d069407ebc80c1bb84a85744763e585c15199ea0ca906b47",
|
||||||
|
"0x26b637ab94949a1e7243736fff67435d28513b978a9e2173d184a64659f3b225",
|
||||||
|
"0xb80d141f221fe90d9aa80875c1c7d4f82d16a8b170073c08248878aee057c78d",
|
||||||
|
"0x1e4e58da25f9c1feddecbb771f6089dabe79079c9c8c98d78f8854b004f0b5c6",
|
||||||
|
"0xdffa5016e82a215af34cb2d7b54535e32c8e0797dafd1ad0b829ca434ddb7596",
|
||||||
|
"0xb74197a700d2ac5ac4105291ffe1567d146b3eec5447af86701b1599e42637af",
|
||||||
|
"0x4104494199a7fae34759bca78e8490f41dfc1eec726f33555a2bf87b3f923a12",
|
||||||
|
"0x0100ddc8b90291faf2af0a2b36975b7c7e247dc65414ad429f4b1d68a2f2ab75",
|
||||||
|
"0xe4740fc1ca3cbd20871da439f3af9e7a0aa94ab9e1eed2fb04931272f5546c3b",
|
||||||
|
"0x69eb680f378798e9dd194e3b985078b71d18ed637199cf854cb8116c5d2ebf56",
|
||||||
|
"0x8828999c917e550baaa229b3157a7914d4eca4903d96f2778702a7ac578bf897",
|
||||||
|
"0x3db2bba067a16d29a3ee7c68c9b5ac825f2814fb9b8490a5db3c1bedaafa33a4",
|
||||||
|
"0x079ebcfdae5f5457bc5cd686d65af96d8c15806ef4152eea5f4681ee472cc303",
|
||||||
|
"0xd2609a6ffbadd712bca9ea357311b30f79334667973c024e03670e26d2420862",
|
||||||
|
"0x3168229643f898f3297d3af867e03e1360d99d265c1e83d1440f045b0739767b",
|
||||||
|
"0xd62aee5a8f14ad052619317a81852cf563bd716a0ec621bfb25a15f9736deb53",
|
||||||
|
"0x144bb80a52cca2b9813f7f1ac547e96a57485c345f7eb4fbef7a0c6772292848",
|
||||||
|
"0xd8f21d1aae77e7a8610aef8ebc35f28c9f8dcc07463f4852a5a17db1eccbe795",
|
||||||
|
"0x8d08043b6144cd3d22c23675390363dd517fe2e8b71e29a7d1107f18d98f7607",
|
||||||
|
"0xc5f997af5b8c39a7992a3d64ae05d10791c18507c93977477954c4e89b28da42",
|
||||||
|
"0xcdb5b0e653ff308a24fc98b6cc28f1bdb4739673f2d96ea567edf9ffddf50c05",
|
||||||
|
"0xecba2883399e952a885fa626663de0c922e98ea1eb57b8b286121f5bc0a6b147",
|
||||||
|
"0xf32c9760a0ca7966dbd017d7326f50f15daf020daf31a5258819d2d55fb224ee",
|
||||||
|
"0x8e5cae1773d0aa309991d024ee02ab1ffcd0ffe895503e2f94ae30551de3d7a1",
|
||||||
|
"0x49d378c0158bfeb25b7ac2914bc1b45ddee970e58001ece549f60033781a39cd",
|
||||||
|
"0xd19e11ff8d23a64ffae4c886669d7e52d48ac281ad1283885ebafaab53e8ff70",
|
||||||
|
"0x6c91b89d95efff6ce209d96bf5c1dbeb5d6c01710ba03379be0f0a845d3ac936",
|
||||||
|
"0x4e514d655f12589e3c57a6f9ca2879658ea9c6ab0a523f5f107ac1a543e2ce67",
|
||||||
|
"0x44e9876929bdbf0e6ca42c42ae2222812f6bfe6fd957ccbc5f70a9eac80f0892",
|
||||||
|
"0x545859fe34e436e0d4183b630cd69b103816d883a0648e67ad955328022d5aeb",
|
||||||
|
"0x121b2a96f0bbb59565fadcbf50a02de161d57a8dd5871ebf72e039832104ab20",
|
||||||
|
"0xa96f4ab77346235358b680a23cae7f1cacbe21cd0e1fe775c4b0721bbee46bf3",
|
||||||
|
"0x80b235a11a3114ef45cc9c563b4646c338eda7e7ba2b077b0acf640197fe48eb",
|
||||||
|
"0x1a11074a30d0cdd88a26e648e673d0c3b6376dd8e5c8bf23012684102a3af830",
|
||||||
|
"0x51b806c229bc0755a73f256da981ba450d32a008306e6bf59ba4c893e1cc5795",
|
||||||
|
"0xaa74491a1e7d0edb6bf4e979ebafa5af05dae7d5d0f067303627f00e8fa56afd",
|
||||||
|
"0xcbf802903c9d29e00b22fef9f2875944f3d0e36a87ce6e49beb230979fb4e838",
|
||||||
|
"0xb92c3755d629be2c446a19a4a0bba3212f60c1fa5b342d60930379a74d41169b",
|
||||||
|
"0x07ec15dd0bd56f2acb56a5db6a530a23cdc33b7a7a1c4a8464572e6fd9b8626e",
|
||||||
|
"0x7f9c7a9b5abe417243e3c74adcd571aa45783a9dece0187a1466760270ba3b6b",
|
||||||
|
"0xaf9740a3960868f6e759d8f18221f3c5f6a6138afd40672e9c8e37e437be9bbb",
|
||||||
|
"0x7ec7bbcb17bc86e276a13dcd41513d7effaf08b67e71aa618528087f34efc208",
|
||||||
|
"0xf2903fcde2aef9045af6f83a3677ab98bb23adc5bda60de7d46509bba777d5ff",
|
||||||
|
"0xcf83625f4d891af2a93114908f3be5319b89372c31bd23960ad20f8031b20ce6",
|
||||||
|
"0x18aa4145b728ef0427165710bd0437dd5551a69c5056dfb171b546e35753860a",
|
||||||
|
"0xe139097ab29aa83f4aac8765e9125b109ddf2984ea325e7a1b4d881495f29dd8",
|
||||||
|
"0xceaf62b97e71d8326d5f66e81b26ea2b0519fe38c6a4b1b38d693d90d3ebf1dc",
|
||||||
|
"0xd23c423fe5fa5ca547a84e7e34f401ddc846af42956c6b052eea15950a0fe79b",
|
||||||
|
"0x947bb7c1e8c90826f78c4139def8e188af907cdb04feddb80360b4d712e51103",
|
||||||
|
"0xb8c65dbc12478ee24def67d15e845c4a52d9c4ce4467674faa81df72120061e5",
|
||||||
|
"0x85a642a8743d2d4aba389ae7a7ffa9b0687d28d4702cf45130e2d66eb43a31d1",
|
||||||
|
"0xe913e63914798d9b3518f204a989328f97520460d0e5925e73c0596d62cfd9c7",
|
||||||
|
"0x7c7065599f3f5cdf0314cb9ff575feaf604507859c20ff3a63e86c3dfdd2a5b5",
|
||||||
|
"0xaa2d5c80b189f37cfa00285362abeaaf430b9dc198a042024f1e148b0e888585",
|
||||||
|
"0xd5c0cb01fcee8af87b0842ad630ea13ea0892c97acd8b1443f6a6c7bcf7bd5b4",
|
||||||
|
"0x7c41cef1c4af5d15900fb535f0b1f3ae78de50cab2046dd65785feb768ea9437",
|
||||||
|
"0xf125c0cf53777bf2c49f9b99b804b0df68155c1c3dc554db66bf0327ecd62a70",
|
||||||
|
"0x18441cdcbc196bc6a4e4a5d9216132d3e075e60d2efbafecfd352621e6b2175b",
|
||||||
|
"0x0c4b7a2df6e6f1c4a724a8f4cfac0297f3c1f4248ec298a98d4c871820219e40",
|
||||||
|
"0x43bb93b6bc4c61df7ce7547405fc95a0bcb3ad7874562413dedb1744826fc4cb",
|
||||||
|
"0xf5f736e014cc04ab828edabde6a104caffe3ec3b286f84d4f6ecc2f7e699974f",
|
||||||
|
"0x8a912ec8dfa51053430d2e1fcfb67e7961fb7c9eb34006d08848d2d3b21c742d",
|
||||||
|
"0xd2567779967cfde9018c42f059490cc0c3518b9a32ee5fb1306cd54ca0ced771",
|
||||||
|
"0x3098a48f2fdf02ac43531168734d661673f82ac0d2e120f10ef0a00460db134e",
|
||||||
|
"0x9777d31e299aa8fe591612462b85ebb3c1fa27d60248cae8e90e4ec8ff00a811",
|
||||||
|
"0x880ea730ca93d9639ef1c2ab33136b16eb447b52b89cfe5b74b7327e4d12e4eb",
|
||||||
|
"0x1ea9f641d8a740ed394d34d7d1648f837667ed622867dd05fcd5f1387efb32f3",
|
||||||
|
"0xda9f20e5b4a61f72291e1a0438095af7fba8a55196a448c88cf3d1e1ea9bfcd3",
|
||||||
|
"0x949bd03ef394076512b6cb8f41c09a8d41304e045642c4670585a4e4b54c539b",
|
||||||
|
"0xafc89365b92724884bce8e10ec1c5c9c9f3f4a7a38effe56392642a73df487c8",
|
||||||
|
"0x447f42123c8ee209e4940605aa753cba0590bb4cecf366d07ee7e15e11ba7447",
|
||||||
|
"0x9a99f57a47d31a95f015347d38a3e39f66aa942747dcd65fdfc5355f61ea31cf",
|
||||||
|
"0xc131af20ca03905d63e74dde7d44d9138d59ec6e95b8a283fea9de870b79ad84",
|
||||||
|
"0xebfd03f29b2251499f04227ddcff308d5367bf534cd59f42a090a5a6c64458af",
|
||||||
|
"0x071ee5f0da2f97fca59606b25edfc0642371251d9c07aaf0e8010e5afaad7bf9",
|
||||||
|
"0x5040af11773c0c1b13fdcf6f2a92dff924d7733ee7d1caa83cfaa84dd204ce3b",
|
||||||
|
"0xc25afdcda4dff3a3b6a15e6fa90dc54a05a5cf33dea503b9e152a7fde6ceb9d5",
|
||||||
|
"0x9604f964d6de2c263139cf011baaf97aed1ed08dfbca158ecb495986d461261b",
|
||||||
|
"0x177e263de95e9c29f3ad31f286117d30ef069e981d825e767bce8031e634d84c",
|
||||||
|
"0x72f10f3393dea1a41bbe4834d728e8429aa5651c043fdf5b881650328eb62118",
|
||||||
|
"0x3969a0524ce2ed0d59f839f4abefae7ad9b2750b698716aac552e92079fae19c",
|
||||||
|
"0x99876fc077b178d584e9c29160ed320fe62c908ed406a2fca7ddf47de487f3d1",
|
||||||
|
"0xbd211392c93f76c541ddcbd83702db71a90a2ded78d530ae61c00c7ba72d9509",
|
||||||
|
"0x5e75d857ede2f1af61f846b5f7072225bdec659543c33b24fdd1bddf04de2f93",
|
||||||
|
"0xdb4c0c2519e081e1a6ed40a3a397b9f093f8dd4b24613d3f18a1e4f7ef94af9d",
|
||||||
|
"0xb2dfec129fe8cd0f7ed568b0a984fc37dae704c497770110b944d003e53b3807",
|
||||||
|
"0x6ba3b9ecafc2a469338c398c7588806d499b98720d3bd9c9bb2aa07a0fbf63bf",
|
||||||
|
"0x69a711d99e3e061cffbc1f6b10f4036de181a9bdb3824ee1a7c83fe15fb2ad41",
|
||||||
|
"0x2340c3402304d06a71998d35a2431774cd2198a170a3cf62989205545c6f0dd0",
|
||||||
|
"0xf7b9a019517ef3f4fd6bc5c4a98dc4b97e742e2f0f088d94d8b6442447118c76",
|
||||||
|
"0xf556a0b838ac7dc6dcd57b0e52f53df4a9f171221d620bbe7958ca3d71671787",
|
||||||
|
"0x68ebf1d4a6009f64a8a2f1b53611d43404a539e8d51c46dae9873ac1fd9548a3",
|
||||||
|
"0xb37c2344e14dd698bf0988608ee56a8f6b31fd2d18629c9a7dc1f027955b39a5",
|
||||||
|
"0x066df722de25d7455976b6be2ec850d97a6afe7f934fc83dde99aa5d49cc912f",
|
||||||
|
"0xdcaa64c29d2e447d85fe9a0329b269a283e27885ac75d874793bc4989d726f3c",
|
||||||
|
"0x6ac4870c173b2404d30357e40bb14db4ec0b87f35437da89c07af88d7c265420",
|
||||||
|
"0xaff8d57640e559db7dbbacbffbe7436d2708f5c3be26370b1b54a8e771eb4141",
|
||||||
|
"0xec0a42a3464caf7ba5b95d185aed8ce0b9e0696a03e2638f71382a92106b3957",
|
||||||
|
"0x7b77e84bcd0b0602128148fc8c94dee2e4f28ff1a748ada7ca7f5d0855e1708d",
|
||||||
|
"0xe0a572dde38708200a814e0120522528bd0ad3be8862293a21c69151fd72659b",
|
||||||
|
"0x2580506cdacfa687e1dc7344aaeacf2cb2a2eb8a4830c7ad83ec8cc0ef70a1f5",
|
||||||
|
"0xf5379cfc470fd6989c140d3d3bc51f9ca7a18761928783424c1947ad33e07e4c",
|
||||||
|
"0x582097b699a9ce614e823fd7e95235e8e6f002d2eea67e87f56ef86735599f24",
|
||||||
|
"0xab1a683bb247b5f0f3efb6a91f1938e0938326e81e6cdde2278827e25aed99ea",
|
||||||
|
"0xf21eb6fa7877e3275690765bdc7f0186e5ba0a94b0bbf9ebf1b4b1bf7aad3add",
|
||||||
|
"0x3168d818b07b7cc71912d7d92f2ec15d10ecf22c9ec20da610068c972c933c4a",
|
||||||
|
"0xd3d49fa35320e95473a7197c2a9c98bcd13b4b491ee96ac0199f3fde94123706",
|
||||||
|
"0x193d71d673a1e1de8267df397c41b8e3d9fb5b189b96da91c31be63456afaada",
|
||||||
|
"0x6579fe55af7c0d58f00f241e257db748566b750a59b7c05372b0b14fb03282ca",
|
||||||
|
"0xf6195d1b7de28d81a3f7d50f34f2a60f7ba6cf48d4ea9593404e48e6b33b8857",
|
||||||
|
"0x3bf3d52ff3c498761bbc2598c449d64a0cebbbb28201dec3633c73d5493b048a",
|
||||||
|
"0x57c4f9be1b0fc5d7c6f86a9297aa4d1375e9f5848bb2f3c1f08851f2c77a614a",
|
||||||
|
"0xa6ca06afd1b9fae9533d53a9188aa8497a7c92e363ade6ac094023bcb0e5f46b",
|
||||||
|
"0x09c669b50d1b26685f20817d0a096168b7d2a4949a20e50a2d665be4c3d4086e",
|
||||||
|
"0x8aa7d92376364e98c4549669e798af1c2e654a776f0561c89c7f7b2540725539",
|
||||||
|
"0x935240267eb3e1a1a6a34966084681ca4d8792142c4fc45574fa669c518b2e8e",
|
||||||
|
"0x7e339371cb38e9babe203905f4026cb90f25c8b10def4781ab5330dd0a63af63",
|
||||||
|
"0xfb588a940601e578fc7c3286fb4ad68f76dc1fa3dd88251193d9655fea77e056",
|
||||||
|
"0x90a702a71779ee4176ed8eab503deb43c63628535d78f9742ac95ffa5f699464",
|
||||||
|
"0x122c0341b0838cdcbf934769322e8fb8df77d8f8a666fe106cf87373bb719eeb",
|
||||||
|
"0x53e7ace007789e4c3513b16eef872dff5b6353bea42d8a3e3912fd62e14b8f83",
|
||||||
|
"0x3bdad07ec3a785d36f8c41ac9c0716a2cad6004bcf1e7e899b06c640e1aa1d9a",
|
||||||
|
"0x6d95da2724a3609af3466474e44455a787b9286f0bc016f13690a867f2f89756",
|
||||||
|
"0x98cd50a72a2fe944b00613dec757270f61e8590002d2e1b35bdb6bd4290dcb31",
|
||||||
|
"0x3b995783e2812c5d7fdf10f83170c8fd142caf1526698a9d094a24314ebb1a09",
|
||||||
|
"0x81cf7500dd9e75fd872b00378005a1bd180fe07be7e7cc3dcdb06ee006c8721c",
|
||||||
|
"0x8e7f5b4940da9de2b59fde73201351d01e5ebdd3ee863cc7653a919c64c35e84",
|
||||||
|
"0x6bd0c1bae338f0922d5c0fc951d089f9c290a42a3744f0a5b4b0b61a5248a4b1",
|
||||||
|
"0xca6c19228395454d07246773fe87ea86891a0fdeee12e8bd261625a62a426c05",
|
||||||
|
"0x83d0b617af7fe6f23019ff4e04bc71b8267a4dd9b79ae4ac29470e99cbe7466b",
|
||||||
|
"0x901c51cf6fa4726b8217b807f7b0d2e0b4ebb71b6a28e8168d2493016919b267",
|
||||||
|
"0x6d101782b820ab580dbe1cf9aacbc065279c18407e70e965ba3315bb77537c77",
|
||||||
|
"0x831996d9ece576f424f0c11abe5f3847229500ca651c452fd6ac234cc48cda4e",
|
||||||
|
"0x5d8fe79678589811621ff19ebfd3d6c4e2d0035ace9a197368b58deadc8b6fc1",
|
||||||
|
"0x8eda2c20216008d1c04f5bc93b5c2d9f8c3635e2ee440cee379f0470cd1a3c9a",
|
||||||
|
"0xef3608f4b6e9e835f3360e78b097af504df75f96796b4e30c9b4e643caf9d07e",
|
||||||
|
"0xee7fd312bae21e15346a412bd82265cd4231449f5a11824938de30fbc6400b19",
|
||||||
|
"0xd659949d718dc3522af4a4794d0c46b346109b5de4a8b87247d1f1a4c414b766",
|
||||||
|
"0x7567bedd64cd79119167944a7e623997ddf134c308a546724e432c36ee2a2d39",
|
||||||
|
"0xf0adf777a52828b31e70712776b4e56215a1038e0c14f2a5ab5bbf035623067a",
|
||||||
|
"0x92daf2c7cef9eee82db16820db7c60a3113950448ae4b149a7b32eb6956326fb",
|
||||||
|
"0x83825ec2c5c8a323cb5ced10e99fa0d7e9df73b9a158c522267ab0fb05ee7030",
|
||||||
|
"0xbb9e1680cb85ae48da3322345b06055fe4b668ae7b31402fc4d13faf439b199c",
|
||||||
|
"0xb040722e777fe01ac533eafcc93b869cfab5bc67f9e2e1044ff505c011f55f1f",
|
||||||
|
"0x0c488f1776428ffdd8eb03083fcc9dde010d7a3d4c08c8f8df2fa93fb206b2bd",
|
||||||
|
"0x54a0b71a8cba973d26bb89e5e07421b8c73dc59bf95f6190bb3b86e7962788ea",
|
||||||
|
"0xadf110bccb6d34276e3fe4701119b2527a86431d6f057a02e30118a6c6cfed54",
|
||||||
|
"0xe01ab7f11ec408b5a17ffbf6cabc3268e16f6be0cd0b15d73ee8b8e2aaaeed54",
|
||||||
|
"0x7280b73efa14f10d39306f2d2dc7832c0e47fadbc14f990a821c76d60be529f9",
|
||||||
|
"0x3cd2b491fa5228b4cae420d5c2a2da9a5e07a32f2147f45f3fa35dbde38224f8",
|
||||||
|
"0xdcc642f2123fc607d991e9794210770453e1befdf52582df0bbaacf85a148048",
|
||||||
|
"0x79a1710d32bfb57c607c5bd23fbd2b8fe3356f586172e507d2688185be8993ca",
|
||||||
|
"0x9ed1335deff01eda0b660081d44718b7cfa0fc69c3e9946c9733dd7ea64d6f8f",
|
||||||
|
"0x37f70e002a78cb3e8266d5ce7959a45649359b6b6ada51482d097b9f32e93179",
|
||||||
|
"0x814f9b9e4af3c84c31f40af0028086d16900f9c63f519f7bc3c18c0eb5c407dc",
|
||||||
|
"0x9957e067f5e79fa6f40bef2036c6d19734146ef231ffc22263bda5c36a7a12ec",
|
||||||
|
"0xa1a240b8ce8973e91dec89bd147a3b7af274fa1e233cc56b9dd83bcc9311a029",
|
||||||
|
"0xac083bbbb8455d3e145f59424d19a8fd7c6162d32a193c67405291ff64113bab",
|
||||||
|
"0xf2182db4682212298b31bd8bd086171a719bd68424da98dc133c83ad043ae903",
|
||||||
|
"0xb3015688c0e0f55c6e97034615de00173151c4334c72aabe048c47c244ea5082",
|
||||||
|
"0x15ebd9c48235918e2d8b2260acda2610b71fe3c4ba7f853238df940d021cd60c",
|
||||||
|
"0x847729223cc8abde709cd283dcc4356375ff89651f39c9adab865fea75e10708",
|
||||||
|
"0x39c9a1bd9e21caf13132b33a272b429c68cb7af1b8db3df08280860dcce141b0",
|
||||||
|
"0x31f21eb219700c01c3d910b2a922788d790acf6ad91c8de739795f1a740c220e",
|
||||||
|
"0x7fee191fd2c31b723a1d4a57af9366662e62eec889d886b0325f0c1e2e4f9d57",
|
||||||
|
"0xc682c555d050a03b8164ca927920ac6f97be4f96eeb8efe8e4fe3d7b48cc8424",
|
||||||
|
"0x1b887661820a95c845fa5c8e0bf10028b81073bbfa072a2f81f82b4aaf3c68e2",
|
||||||
|
"0x4e86af7e8a0aaea28c67e2658b97540e84ebd4cd1a9dff33c99a45cdbd0de661",
|
||||||
|
"0xa93100e0dcab1d0799a13d40ddb459e32f6e95d2c661094d7e8d09e008ed2486",
|
||||||
|
"0x2d15cbd72ffe23920d63d6916f68c5a75d2400b0417283b54ade9dab8ba3af5c",
|
||||||
|
"0x72f199719868bb4b4546407f7dc690180b2e8359ab6e747fe3ca4861c59bcfdb",
|
||||||
|
"0xc3a9a2ad727ee7623ec35671a330ff150e504bd20365a7dfec0295909e9973a7",
|
||||||
|
"0xe4dec421f674d4917299076c9885c49c51e7cffdc5253696b552b9c3ab307cdc",
|
||||||
|
"0x426f724354ff7fb3114bc2e66360c996dfdb1e8585d3967738285a2030a89b07",
|
||||||
|
"0xf39f6051d26d8b21aa5592dffc3be99480a768a0be6afb8b8eb5bbcd4058d4e4",
|
||||||
|
"0x061bbe83ae46285c935b9bfd646cc54f4da034b33dfa8b3b8c902995a77b7d1e",
|
||||||
|
"0x37b7086aa13372623ea527ad0dbf08bb2162b274420972c55030c4001e86a1eb",
|
||||||
|
"0x2de6121506702ddf0eb5ec8e2eae6110ad41b3982c73cf8382bea329e77a8cfa",
|
||||||
|
"0x4e941c3da784368dc838b7b8a77ee51868160a79362aef6caf0981fed3ba3d36",
|
||||||
|
"0xad2e32669978cdc836e32d3dae7a7a89b1d0e28e5f938247d1a6233eb055b481",
|
||||||
|
"0x8d0d13cfe3e40eca8c6ec865aef23fee9f5af445131bf0aeffdc87e4640a1212",
|
||||||
|
"0x8bf162d69c4565050dd4496e244ebfffa69bf13abaa9e7770b8173999340009e",
|
||||||
|
"0x21a33a33d92a99de5af52ae238a799e3307258b8b91a959a485238bad31f913a",
|
||||||
|
"0x21a95996aa2f4abe48a35617de16894f14292afca769679a63a03d68350cc362",
|
||||||
|
"0x57bfa7d2037da6aaa07f44594cef60a598ed2bc1218b9f6af48dad1b42759e95",
|
||||||
|
"0x7324fefadaab09a26c065bd98d3e9a56eaa7ef78df1269c1152bbbaaa6693256",
|
||||||
|
"0x41722de103de41c72010d1f19166ae0ccee2bb72314c719945f4162ffa165ac1",
|
||||||
|
"0x19b2f1f42353f935f46f8f9421bcf06e2ee573304d0efa13071d676ea174e18d",
|
||||||
|
"0xd7fc39efd2a392efb8de6d7d1c7807ed7daee0c8b82115acc60beaa7f6d9b86f",
|
||||||
|
"0x5ae63df9ecf9aee8cac4d0ce1edd37a95069d61c8d8ef886a150eda4bad4c87b",
|
||||||
|
"0x6e7aba83a3654cae6b12a6f87a9739735dfeb43ff67e309fe4701b8b17937915",
|
||||||
|
"0xd624f46d01a186da11d15eef4d79250191605e51ce19b9e02b62e65d84dd1c38",
|
||||||
|
"0xbc134d2f8acb6a60d424d4c8c6087fbacbb5202251c89ef720dded9947e3c4d7",
|
||||||
|
"0x6e8e39dca2960de07134fc043f73c9757c42c6827ef22d063c44a5573ce6c8f1",
|
||||||
|
"0xe53089dd7ccb7e0e78f3cd7d7ea342ce5a2316b50d6bd033ae621f6ec4329a46",
|
||||||
|
"0xca3eca5da2a9ded537dcd471390b7d97716deb0c5cd9e0d6a7e2addbadd97cac",
|
||||||
|
"0xaa5799394d99d90642d013e8359a40f2cc72e6b49c91233ed930ea1d32b360f6",
|
||||||
|
"0x8ae22559b0296959ef540aec5702dcc03d2b2bd9411b69af756d7d9e12e6cb90",
|
||||||
|
"0x5067bf825ad66e89ae1c46f1ebbbee8a77c2d285fb66c01b732b6c3f629b2ca2",
|
||||||
|
"0xf2f1c4304b5ec8b314fc6a4f9a9df69472cf0a132577217eff1c0a80443885ae",
|
||||||
|
"0x4c888be868c74ae86a9c0648429bdb207d18794e3ad6b9ff79d9291dfb0d0b46",
|
||||||
|
"0x3083508ec1669fa69d5fa4ab1d84501868c7a054a24b0a432b74be1f3bd0ed1c",
|
||||||
|
"0x443f7e4cc89e3c798c788fd40185525d8402c2160e5f3434986922c6f8179ab1",
|
||||||
|
"0x16d395ee5e915ea950dfc7639f90a29fe04ccbb47a2b0cd303ea719acd48ed58",
|
||||||
|
"0x901df34bd40035ee95569ea61c8a9874fd9151fef5701e91f02578c896704f20",
|
||||||
|
"0x4ce474419d801fad788b158bbf40dc7d7bc2ba43e1c2424f91b858055a7b61ea",
|
||||||
|
"0x10b2d6126ce1183cb227e291b184d7541b3380e100a70d876587a0aef2fe588a",
|
||||||
|
"0xac68a6a550c4a40c723ae37abd07d9e2d8486a30cd4f2cf7285f6d74882368f7",
|
||||||
|
"0xa0800069211efb656d0df4a81f1febfb48f251c712ee973afdff37a2baf83b99",
|
||||||
|
"0x53293ec8346c1a44e3cf78017dd033dd90be4737045e1c55d27130d7f6f36dbf",
|
||||||
|
"0x0a92d75455eb5c2167e2c07e1575a9580c135debe7bafc8d15d1fc2a25b984ea",
|
||||||
|
"0x32e6f505ec66fa987746c67a470df78a7a0fd136ef814ed24f3b5e0988cb53b0",
|
||||||
|
"0x20e6f99aa4b002e35f97900a34322af373397dc98ec28ee668e9921bc41d7219",
|
||||||
|
"0xc309a8620421c52fdae475d4a29530a2e56dc0051a28f8c4205c09cba5443666",
|
||||||
|
"0x0fb5bbd851d3860876e1dd038fd3f8d9e5b8e8b4e0d3b83ba0bc3d06222ac9ed",
|
||||||
|
"0xd71830cb6f3ad0776795865aedf50ceee94ba9ec89533190d3dfe2107a9e0e9a",
|
||||||
|
"0x768040f6401331b029bb0222b7494ddd21525091d936641f4ef89f00cb5b20e8",
|
||||||
|
"0xc52b410050774495fb2e22e0a94bc97dc72aa86cba7b20e8ce6c8a20ff03c5e1",
|
||||||
|
"0x026072e68a13a5ae0721d9e47ace688b75e16ba76ef67ff01d0a11f10e80ddc3",
|
||||||
|
"0xcfb1040048b9312c0d274a6b2576c7907176a983f0c0e02b120c10bee28f438b",
|
||||||
|
"0xd3036d04273279c5fa5ec4a096b8fd8a68a46c0536c24519b0ee5368c5103d84",
|
||||||
|
"0xdb9bdc3edecf7280dabcc104885942eced615311e93c2fa06dea812adc626baf",
|
||||||
|
"0xa25ca25f83c418bbfcba8a16cf661902499d3651b497e75161aa0d0bc4c3717c",
|
||||||
|
"0x96221feae35068b02e1540f06be277c27e938459af8718a2c883406b2582ba31",
|
||||||
|
"0x5584e36296dc2cc61e21c1e6539f66d918b800025fd6460da31f869cbc357289",
|
||||||
|
"0x7a0de103b391af8b2a9af3e6e5c2c6bf309d61cebe805db82d3addfde5395b4d",
|
||||||
|
"0xc5b000944c368f67c77e6c6564c5be5bb1fb84eaac76ca2bb3c7ddfde64e5635",
|
||||||
|
"0x544ea39b4d37a698bcb0c2dbd689ef90590e160db52deefe446d65aa7b60b20b",
|
||||||
|
"0x32160ce8e604c62c09814f8e13e795b654cfda57fdfef4b01c38ae3d078aaab6",
|
||||||
|
"0x5def86fc59562b477277bd6a2c1f1bd5a9192cd969c4ac578b16ea73031d5aa5",
|
||||||
|
"0xc0fc111d2c0eea81e7d6e0221c0465cf950772fe8dad94476c0e33d528928f9a",
|
||||||
|
"0x1b803a048d3ab8e5b4a49b3550c6586d71dd6f5409da6df0bc6df76de94e64bd",
|
||||||
|
"0x549d98175538c94e098c93f77ccca9ca0cbd11ab7c270ffcf1d3a908adb4d8e4",
|
||||||
|
"0x17d331df92fe4d8b57acde9bff8eced101f461e3470691ba7b46df9ceeb8129f",
|
||||||
|
"0x7a496054ef706cf89c0c55d848cac64779091799d2d64d6cb43907d2222c000b",
|
||||||
|
"0xe86b6819e9a482600ce2c9b42d248dfa3262547eb7ed42a6c1ebdb138e62206e",
|
||||||
|
"0xfd49fc9e5f4eeabb74a7d9ab4ae8a0e583ca153ef4c09e697f5c0207e6505ff7",
|
||||||
|
"0x9a297101369d0cba7b6f7edfe1a4a432d91f74f88ed3473ce14dc91cf616e903",
|
||||||
|
"0xd66a19a2834cbd910f2278b2bd5cae2ab9b58fe1a9e583cce4e2d22903d767db",
|
||||||
|
"0xd9cf8987c12672ec0e2bb97b25567f3f914fa8fb89b1186c6b665967834025a2",
|
||||||
|
"0x54e18efcf10895d51cf8f8dd6541ca097899fbb1880abd3b68aefd6e657a0af2",
|
||||||
|
"0x759486342c0162d26a8d2a0881affeca579a7cad80c32c6885d910f9e966ed94",
|
||||||
|
"0x02b2d8cbcb7244efb913aac80895e6cfbc81b60cf831b0a19b2354e0c7e00b72",
|
||||||
|
"0x414736aea69a7be69bed90c56eea05e5df9db9667f3b0b07ee6622442628fd88",
|
||||||
|
"0x75db93f08ee2236e4cc9222f8167c15c5bb31b4b9cfa1fe62f5175bac9c4c6de",
|
||||||
|
"0x07c460d27a5df943f09d114d99cc39c05135953c416591a7dc9bad3e2c064796",
|
||||||
|
"0x42c32a832d8a9911eeafbf0ed6550cce1be3832304f22a63d6edf1b72d92053d",
|
||||||
|
"0x2f8226acee0e5cb949592c1e77ac3da86f43f3834df940349cd6a55626ec7d3c",
|
||||||
|
"0x3f3e88302fffecb9751ee31a36de3abc6fb7963e264988904daf8fe6aec18fc8",
|
||||||
|
"0x0ea47b2cb04403773d9420ccfde549fe763bcdfe350c7546e3293b4612e096bc",
|
||||||
|
"0xf03a38c16a3ee05197b7c77985c2640af18479ebfb7db342416bd0baf2645eab",
|
||||||
|
"0x32c9844dcd2794e987ab14af8aab52d9925d77279377185697bfa362907f4bf3",
|
||||||
|
"0x72985d640d5ee8da6a1e0aa3ab71a19168802c29e3ab915d61910523d2d8a550",
|
||||||
|
"0x4453f4c055057ac3fb2780fa8fe131b6e08ef90a5b30930a83d4cfa5120ff6ce",
|
||||||
|
"0xb13ff4f56efd0f41bdcbc06c8a917f81614ca363f8c06bb3bd748467e146f959",
|
||||||
|
"0x172419af274d54de1a3ec6b10e5e8f98d0941d07571f9a5eae977597f0ea6e2e",
|
||||||
|
"0xa70469fc4070b5a675838352457cb6b4566a7a95ef843b0cf49fc0e02a342b0a",
|
||||||
|
"0x15072136cb1235007413c137115f4246ff22dd33bce99dec813042d6638ee502",
|
||||||
|
"0xa883cb9646a12a6f13eb4e1fde9422767be38279eef669068db6572d449da45f",
|
||||||
|
"0xe752e1e6ddc10633853a0c997727644b92aff7e46710c2c3850f6994edf83072",
|
||||||
|
"0x880e73586a7d6d79b4a7bd30f551d04e928747962ec263867f53dc33709353c4",
|
||||||
|
"0xcca01d7edd840727db14e657c9edb63a5518b41115abbcd848a60c9800e8b244",
|
||||||
|
"0xdf231e025e5c85b82fac8c836df78f5ee23509bb7b363b018ab27cf83680ea52",
|
||||||
|
"0xb42b4d31d1838886a6cb91123748078b5d07384afb1e574146a0174b6e3609fb",
|
||||||
|
"0x243c0ef11b9cedb39146fc35149291ea31906f60f56642ec3af28753936c7b08",
|
||||||
|
"0xac496eba34056ac76fd2c20c300bbcb66bc9d5257859aa8b8480fb1ea44cc60f",
|
||||||
|
"0x1631a82a3927c93bcb93d055ef94963bd00c264816768d7a12b1e6844b65a226",
|
||||||
|
"0xee630ea7011dc95ef7c9dab11e2c89a8065a85b7ee3ffe35bacf38efc61706e6",
|
||||||
|
"0x8bcb73df8715723d55d5635d5b1d5332af85b2945871172d22e10a2f19cbc9f9",
|
||||||
|
"0xa498dea3b8eb89b40f963d9266a2d4e71e3492c614e597e08dcf565e54d2d8cb",
|
||||||
|
"0xe798586f9f5bd8def445e5b66e1cd1037df1fc1e043b7c4a804d1cf368aaff70",
|
||||||
|
"0xc7e9da2ee64ed53fa9306e35e019c7fd74030f3065b5514189c50931d70372dc",
|
||||||
|
"0x557acd95f593728a732f1ef04b94acfd5475da37a18dafda2cac957db46b24a2",
|
||||||
|
"0x303f4929efdd5f54365d8927aae229df99e222e76e42b494e216d5365a4330c2",
|
||||||
|
"0x6252147a7a16f988726467394919d25e24a28756726bdefbdec768cc84d125b5",
|
||||||
|
"0xd9bd80354f25a846ccf3a47dc928b1d47958598474749795d4f1885f172fc996",
|
||||||
|
"0x356cc71f2169917a76e87355c358eca62bb5c79fc4f38c4992ad57cb35ce493c",
|
||||||
|
"0xadf1135a2511fd2cdbd33006738725459f33edcc593b1aa936b55889fe9e9687",
|
||||||
|
"0x8359e90f401234e4a85695c7e369ef5c107b246088baf3355046934197705c89"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"nodes": [
|
"nodes": [
|
||||||
@ -3920,12 +4577,13 @@
|
|||||||
"0x0000000000000000000000000000000000000006": {
|
"0x0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x42ae50",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x42ae50": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x8a61c8": {
|
||||||
|
"info": "EIP 1108 transition at block 9_069_000 (0x8a61c8)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3933,12 +4591,13 @@
|
|||||||
"0x0000000000000000000000000000000000000007": {
|
"0x0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x42ae50",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x42ae50": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x8a61c8": {
|
||||||
|
"info": "EIP 1108 transition at block 9_069_000 (0x8a61c8)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3946,14 +4605,24 @@
|
|||||||
"0x0000000000000000000000000000000000000008": {
|
"0x0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x42ae50",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x42ae50": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x8a61c8": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition at block 9_069_000 (0x8a61c8)",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000009": {
|
||||||
|
"builtin": {
|
||||||
|
"name": "blake2_f",
|
||||||
|
"activate_at": "0x8a61c8",
|
||||||
|
"pricing": {
|
||||||
|
"blake2_f": {
|
||||||
|
"gas_per_round": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -30639,3 +31308,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,12 +130,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x17d433",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x17d433": {
|
||||||
|
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -144,12 +145,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x17d433",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x17d433": {
|
||||||
|
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,14 +160,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x17d433",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x17d433": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,12 +67,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x0",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,12 +81,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x0",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,14 +95,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x00",
|
|
||||||
"eip1108_transition": "0x0",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"chainID": "0x6",
|
"chainID": "0x6",
|
||||||
"eip140Transition": "0xaef49",
|
"eip140Transition": "0xaef49",
|
||||||
|
"eip145Transition": "0x1a064d",
|
||||||
"eip150Transition": "0x0",
|
"eip150Transition": "0x0",
|
||||||
"eip155Transition": "0x0",
|
"eip155Transition": "0x0",
|
||||||
"eip160Transition": "0x0",
|
"eip160Transition": "0x0",
|
||||||
@ -21,6 +22,8 @@
|
|||||||
"eip211Transition": "0xaef49",
|
"eip211Transition": "0xaef49",
|
||||||
"eip214Transition": "0xaef49",
|
"eip214Transition": "0xaef49",
|
||||||
"eip658Transition": "0xaef49",
|
"eip658Transition": "0xaef49",
|
||||||
|
"eip1014Transition": "0x1a064d",
|
||||||
|
"eip1052Transition": "0x1a064d",
|
||||||
"gasLimitBoundDivisor": "0x400",
|
"gasLimitBoundDivisor": "0x400",
|
||||||
"maxCodeSize": "0x6000",
|
"maxCodeSize": "0x6000",
|
||||||
"maxCodeSizeTransition": "0xaef49",
|
"maxCodeSizeTransition": "0xaef49",
|
||||||
@ -116,12 +119,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0xaef49",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xaef49": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,12 +134,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0xaef49",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xaef49": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -144,14 +149,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0xaef49",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0xaef49": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5348,12 +5348,13 @@
|
|||||||
"0x0000000000000000000000000000000000000006": {
|
"0x0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x4d50f8",
|
|
||||||
"eip1108_transition": "0xd751a5",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x4d50f8": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0xd751a5": {
|
||||||
|
"info": "EIP 1108 transition at block 14_111_141 (0xd751a5)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5361,12 +5362,13 @@
|
|||||||
"0x0000000000000000000000000000000000000007": {
|
"0x0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x4d50f8",
|
|
||||||
"eip1108_transition": "0xd751a5",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x4d50f8": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0xd751a5": {
|
||||||
|
"info": "EIP 1108 transition at block 14_111_141 (0xd751a5)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5374,14 +5376,13 @@
|
|||||||
"0x0000000000000000000000000000000000000008": {
|
"0x0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x4d50f8",
|
|
||||||
"eip1108_transition": "0xd751a5",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x4d50f8": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0xd751a5": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition at block 14_111_141 (0xd751a5)",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,12 +63,13 @@
|
|||||||
"0x0000000000000000000000000000000000000006": {
|
"0x0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 5067000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"5067000": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,12 +77,13 @@
|
|||||||
"0x0000000000000000000000000000000000000007": {
|
"0x0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 5067000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"5067000": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,14 +91,13 @@
|
|||||||
"0x0000000000000000000000000000000000000008": {
|
"0x0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 5067000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"5067000": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,12 +123,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at":"0x7fffffffffffff",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x7fffffffffffff": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -136,12 +137,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at":"0x7fffffffffffff",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x7fffffffffffff": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -149,14 +151,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at":"0x7fffffffffffff",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x7fffffffffffff": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,13 +48,23 @@
|
|||||||
},
|
},
|
||||||
"nodes": [
|
"nodes": [
|
||||||
"enode://aeb6070deb50efeb41c5e4283a6a3b08ff701fef90e3522161c145f30df2852af3dfc51ba74591f7c9d96b11ca4c3c2b354bf58dd243f2d877f6eecc2373fd1d@139.162.15.124:30313",
|
"enode://aeb6070deb50efeb41c5e4283a6a3b08ff701fef90e3522161c145f30df2852af3dfc51ba74591f7c9d96b11ca4c3c2b354bf58dd243f2d877f6eecc2373fd1d@139.162.15.124:30313",
|
||||||
|
"enode://cb4b0568607c97a3af4857700152fad9c79908a89319310268c7f49184e3f7e0c88c8d3504696f521c8aafcd00644f9325f76cba9427181b1493ff7ce230df00@139.162.15.124:30303",
|
||||||
"enode://e0c926dcdc5c1cf58b2ecba371c577c28c28c91f9b210093178a812389b65e5b53f0e478753b94fceb0b36645b779a915ca57c0c48507fe4d7f786508653656c@74.207.240.177:30313",
|
"enode://e0c926dcdc5c1cf58b2ecba371c577c28c28c91f9b210093178a812389b65e5b53f0e478753b94fceb0b36645b779a915ca57c0c48507fe4d7f786508653656c@74.207.240.177:30313",
|
||||||
|
"enode://37fe8c0f8d667f110316de3109dcc2e9c9247219998e9ac395db39511bef697f9646f73d86a43da491efce35458f53ac3ac0994b85f7086bbf244809d4e7eb7f@74.207.240.177:30303",
|
||||||
"enode://a2a2adb8c12b9b189306050013a44f28db30f92fb3670db9675a049b98b96eb18901d6ff7b961b6e96cfa3923ac29e8f647ef452f0a23ddfef3903ac1cf826af@173.255.195.214:30313",
|
"enode://a2a2adb8c12b9b189306050013a44f28db30f92fb3670db9675a049b98b96eb18901d6ff7b961b6e96cfa3923ac29e8f647ef452f0a23ddfef3903ac1cf826af@173.255.195.214:30313",
|
||||||
|
"enode://ed6fea8e7389bb75ff34846e4aaefa9157c9c79828c6404f4a0ab6b997a613f777aecaed5092c3f51abdf918926c925f7ee4f4cffdb0ac37775d03070a3d6b55@173.255.195.214:30303",
|
||||||
"enode://5460fd1ad217941befd0f8d060e6729a0535a0738770aba56827d1313c09aeb68e3098d458aace59faba2c6780b8c9c30cb140b80cd8e30ca3a074ce6d3344d3@50.116.38.52:30313",
|
"enode://5460fd1ad217941befd0f8d060e6729a0535a0738770aba56827d1313c09aeb68e3098d458aace59faba2c6780b8c9c30cb140b80cd8e30ca3a074ce6d3344d3@50.116.38.52:30313",
|
||||||
|
"enode://9109e01dec60b67afa5aea77da17e0cb9a716a547469be378eb122c545a3fda9082e553624ff9e673195a715d5628ebf046a6c4ff315e566420e3bdde003bd9a@50.116.38.52:30303",
|
||||||
"enode://99fff4ed887d6a6a7b6e03a657c35c06d0eede1909ec289a362bad9d37dd4085886461bbce83aa484ce1327badb3c5958365caa851d71de49dc4530e075b64bc@45.79.128.151:30313",
|
"enode://99fff4ed887d6a6a7b6e03a657c35c06d0eede1909ec289a362bad9d37dd4085886461bbce83aa484ce1327badb3c5958365caa851d71de49dc4530e075b64bc@45.79.128.151:30313",
|
||||||
|
"enode://4b4c06445175b77ac07eba03ac624f72e4e86065ee8bbdbca5f882a2a333e2608e6ef2ae5b5779816abd8d07ae6ec08f75888edeab3bc06f2b75871feb14afef@45.79.128.151:30303",
|
||||||
"enode://fd80e04c75559cfdd9ed8c08ef2c39c5bc95021f7cbaf31acb601914bc7dac7c34b470b90a05e519bc8a8435a46e1ce51053ae07fac31a83567285c34a79c6bf@139.162.224.203:30313",
|
"enode://fd80e04c75559cfdd9ed8c08ef2c39c5bc95021f7cbaf31acb601914bc7dac7c34b470b90a05e519bc8a8435a46e1ce51053ae07fac31a83567285c34a79c6bf@139.162.224.203:30313",
|
||||||
|
"enode://d2e678247450c0a7aefdcf03787d4905deda2a6889f02071b241a1309a6bec6ea1c8b1160f69635dee0b4e00cc83656a601b4528cccbd85744b811654ab24b13@139.162.224.203:30303",
|
||||||
"enode://4742134a153c108855eb16563424887ed3aa5b6b74e4b713c8e93a10c376d954ff3041442716bdf9ee28fab2ea09f04d07e3366f834ea472c19820b7337eb27a@172.104.130.233:30313",
|
"enode://4742134a153c108855eb16563424887ed3aa5b6b74e4b713c8e93a10c376d954ff3041442716bdf9ee28fab2ea09f04d07e3366f834ea472c19820b7337eb27a@172.104.130.233:30313",
|
||||||
"enode://799d0a8836e17ef7fcc58b3d5ced5bb1fe474b31a09851f938d381f4556fa8954ca308f6a178d22ed56769a8b878ac8f9cc62c889f9cafab45a3bd4f6024bb29@172.104.68.7:30313"
|
"enode://9aaeae0129af1bbb2e3590a71cd1ad0c320aa1c03e15c9eb3563cee2d8a7ca43473f43197b6dc0befe5bcef6185196360fa8b4b0d82d8ef11e2ff65553a1efa5@172.104.130.233:30303",
|
||||||
|
"enode://799d0a8836e17ef7fcc58b3d5ced5bb1fe474b31a09851f938d381f4556fa8954ca308f6a178d22ed56769a8b878ac8f9cc62c889f9cafab45a3bd4f6024bb29@172.104.68.7:30313",
|
||||||
|
"enode://ab7b1aab2439aafadcb52f8353e60fc1eea55ee5a01b4ddf46ecdeaa2e869c4bf305249757dc74baa78cf05c5d98ffe5c2a008851f08cab6096c78a08dee7c17@172.104.68.7:30303",
|
||||||
|
"enode://ab4a7fb0963e4951bebbefd2ec09ddac018bb27600a6063d755dfc10be118cbfe3954ada561afbce4cbda6f62364c12902b9e6bdef258aff36b8a73db3c0f161@172.105.16.240:30313",
|
||||||
|
"enode://30ff1bd89f58a1adae1f2b2ed1e36fa95caf5c2c7e085cf3a49f14705427ca7d7b2508060d058ceda57c708e8aa4661304f3c17eaae4da2e9cea6b64b3893c2f@172.105.16.240:30303"
|
||||||
],
|
],
|
||||||
"accounts": {
|
"accounts": {
|
||||||
"0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
"0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
||||||
@ -65,12 +75,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 3000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"3000000": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,12 +89,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 3000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"3000000": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,14 +103,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 3000000,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"3000000": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,10 @@
|
|||||||
"eip140Transition": "0x4829ba",
|
"eip140Transition": "0x4829ba",
|
||||||
"eip211Transition": "0x4829ba",
|
"eip211Transition": "0x4829ba",
|
||||||
"eip214Transition": "0x4829ba",
|
"eip214Transition": "0x4829ba",
|
||||||
"eip658Transition": "0x4829ba"
|
"eip658Transition": "0x4829ba",
|
||||||
|
"eip145Transition": "0x4c4cbd",
|
||||||
|
"eip1014Transition": "0x4c4cbd",
|
||||||
|
"eip1052Transition": "0x4c4cbd"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
@ -75,7 +78,7 @@
|
|||||||
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
||||||
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
||||||
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
||||||
"0x0000000000000000000000000000000000000005": {
|
"0000000000000000000000000000000000000005": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "modexp",
|
"name": "modexp",
|
||||||
"activate_at": "0x4829ba",
|
"activate_at": "0x4829ba",
|
||||||
@ -86,43 +89,44 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0x0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x4829ba",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x4829ba": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0x0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x4829ba",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x4829ba": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"0x0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x4829ba",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x4829ba": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
189
ethcore/res/ethereum/mordor.json
Normal file
189
ethcore/res/ethereum/mordor.json
Normal file
@ -0,0 +1,189 @@
|
|||||||
|
{
|
||||||
|
"name":"Mordor Classic Testnet",
|
||||||
|
"dataDir":"mordor",
|
||||||
|
"engine":{
|
||||||
|
"Ethash":{
|
||||||
|
"params":{
|
||||||
|
"minimumDifficulty":"0x20000",
|
||||||
|
"difficultyBoundDivisor":"0x800",
|
||||||
|
"durationLimit":"0xd",
|
||||||
|
"blockReward":"0x4563918244F40000",
|
||||||
|
"homesteadTransition":"0x0",
|
||||||
|
"ecip1010PauseTransition":"0x0",
|
||||||
|
"ecip1010ContinueTransition":"0x0",
|
||||||
|
"ecip1017EraRounds":"0x1e8480",
|
||||||
|
"bombDefuseTransition":"0x0",
|
||||||
|
"eip100bTransition":"0x0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"gasLimitBoundDivisor":"0x400",
|
||||||
|
"accountStartNonce":"0x0",
|
||||||
|
"maximumExtraDataSize":"0x20",
|
||||||
|
"minGasLimit":"0x1388",
|
||||||
|
"networkID":"0x7",
|
||||||
|
"chainID":"0x3f",
|
||||||
|
"eip150Transition":"0x0",
|
||||||
|
"eip160Transition":"0x0",
|
||||||
|
"eip161abcTransition":"0x0",
|
||||||
|
"eip161dTransition":"0x0",
|
||||||
|
"eip155Transition":"0x0",
|
||||||
|
"maxCodeSize":"0x6000",
|
||||||
|
"maxCodeSizeTransition":"0x0",
|
||||||
|
"eip140Transition":"0x0",
|
||||||
|
"eip211Transition":"0x0",
|
||||||
|
"eip214Transition":"0x0",
|
||||||
|
"eip658Transition":"0x0",
|
||||||
|
"eip145Transition":"0x498bb",
|
||||||
|
"eip1014Transition":"0x498bb",
|
||||||
|
"eip1052Transition":"0x498bb"
|
||||||
|
},
|
||||||
|
"genesis":{
|
||||||
|
"seal":{
|
||||||
|
"ethereum":{
|
||||||
|
"nonce":"0x0000000000000000",
|
||||||
|
"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"difficulty":"0x20000",
|
||||||
|
"author":"0x0000000000000000000000000000000000000000",
|
||||||
|
"timestamp":"0x5d9676db",
|
||||||
|
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"extraData":"0x70686f656e697820636869636b656e206162737572642062616e616e61",
|
||||||
|
"gasLimit":"0x2fefd8"
|
||||||
|
},
|
||||||
|
"nodes":[
|
||||||
|
"enode://03b133f731049e3f7be827339c3759be92778c05e54a1847d178c0fdb56fa168aa1e7e61fc77791a7afdd0328a00318f73c01212eb3f3bbe919f5ce8f5b4a314@192.227.105.4:32000",
|
||||||
|
"enode://06fdbeb591d26f53b2e7250025fe955ca013431ded930920cf1e3cd1f0c920e9a5e727949d209bc25a07288327b525279b11c5551315c50ff0db483e69fc159b@34.218.225.178:32000",
|
||||||
|
"enode://1813e90a0afdd7c1e4892c5376960e3577a9e6c5a4f86fa405a405c7421a4a1608248d77cc90333842f13d8954d82113dec480cfb76b4fef8cb475157cf4d5f2@10.28.224.3:30000",
|
||||||
|
"enode://2b69a3926f36a7748c9021c34050be5e0b64346225e477fe7377070f6289bd363b2be73a06010fd516e6ea3ee90778dd0399bc007bb1281923a79374f842675a@51.15.116.226:30303",
|
||||||
|
"enode://621e28e529146fd501709194885f50540c494f1a2985d1fb4ec8769226b5cb0b0d1a11545926077821474c2767cdd87888ead8a2509a2c9069dd5584e4b1c3b8@10.28.223.8:30000",
|
||||||
|
"enode://a59e33ccd2b3e52d578f1fbd70c6f9babda2650f0760d6ff3b37742fdcdfdb3defba5d56d315b40c46b70198c7621e63ffa3f987389c7118634b0fefbbdfa7fd@51.15.116.226:30303"
|
||||||
|
],
|
||||||
|
"accounts":{
|
||||||
|
"0x0000000000000000000000000000000000000001":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"ecrecover",
|
||||||
|
"pricing":{
|
||||||
|
"linear":{
|
||||||
|
"base":3000,
|
||||||
|
"word":0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000002":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"sha256",
|
||||||
|
"pricing":{
|
||||||
|
"linear":{
|
||||||
|
"base":60,
|
||||||
|
"word":12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000003":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"ripemd160",
|
||||||
|
"pricing":{
|
||||||
|
"linear":{
|
||||||
|
"base":600,
|
||||||
|
"word":120
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000004":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"identity",
|
||||||
|
"pricing":{
|
||||||
|
"linear":{
|
||||||
|
"base":15,
|
||||||
|
"word":3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000005":{
|
||||||
|
"builtin":{
|
||||||
|
"activate_at":"0x0",
|
||||||
|
"name":"modexp",
|
||||||
|
"pricing":{
|
||||||
|
"modexp":{
|
||||||
|
"divisor":20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000006":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"alt_bn128_add",
|
||||||
|
"pricing":{
|
||||||
|
"0x0":{
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_const_operations":{
|
||||||
|
"price":500
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x7fffffffffffff":{
|
||||||
|
"info":"EIP 1108 transition",
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_const_operations":{
|
||||||
|
"price":150
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000007":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"alt_bn128_mul",
|
||||||
|
"pricing":{
|
||||||
|
"0x0":{
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_const_operations":{
|
||||||
|
"price":40000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x7fffffffffffff":{
|
||||||
|
"info":"EIP 1108 transition",
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_const_operations":{
|
||||||
|
"price":6000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000008":{
|
||||||
|
"builtin":{
|
||||||
|
"name":"alt_bn128_pairing",
|
||||||
|
"pricing":{
|
||||||
|
"0x0":{
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_pairing":{
|
||||||
|
"base":100000,
|
||||||
|
"pair":80000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x7fffffffffffff":{
|
||||||
|
"info":"EIP 1108 transition",
|
||||||
|
"price":{
|
||||||
|
"alt_bn128_pairing":{
|
||||||
|
"base":45000,
|
||||||
|
"pair":34000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -131,12 +131,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at":"0x21e88e",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x21e88e": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -144,12 +145,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at":"0x21e88e",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x21e88e": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -157,14 +159,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at":"0x21e88e",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x21e88e": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,12 +62,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,12 +76,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,14 +90,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,12 +68,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -81,12 +82,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -94,19 +96,17 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"0x0000000000000000000000000000000000000001": {
|
"0x0000000000000000000000000000000000000001": {
|
||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
|
@ -125,12 +125,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0xfcc25",
|
|
||||||
"eip1108_transition": "0x52efd1",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xfcc25": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x52efd1": {
|
||||||
|
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,12 +140,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0xfcc25",
|
|
||||||
"eip1108_transition": "0x52efd1",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0xfcc25": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x52efd1": {
|
||||||
|
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -153,14 +155,13 @@
|
|||||||
"balance": "0x1",
|
"balance": "0x1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0xfcc25",
|
|
||||||
"eip1108_transition": "0x52efd1",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0xfcc25": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x52efd1": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,8 @@
|
|||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID": "0x3",
|
"networkID": "0x3",
|
||||||
"forkBlock": "0x40E80F",
|
"forkBlock": "0x62f757",
|
||||||
"forkCanonHash": "0x3e12d5c0f8d63fbc5831cc7f7273bd824fa4d0a9a4102d65d99a7ea5604abc00",
|
"forkCanonHash": "0x3a024a13310ec9b4805f681b17c3ae6c94167d1c6494e83d70a887ebc27df5ea",
|
||||||
"maxCodeSize": "0x6000",
|
"maxCodeSize": "0x6000",
|
||||||
"maxCodeSizeTransition": "0xa",
|
"maxCodeSizeTransition": "0xa",
|
||||||
"eip150Transition": "0x0",
|
"eip150Transition": "0x0",
|
||||||
@ -67,8 +67,8 @@
|
|||||||
"gasLimit": "0x1000000"
|
"gasLimit": "0x1000000"
|
||||||
},
|
},
|
||||||
"hardcodedSync": {
|
"hardcodedSync": {
|
||||||
"header": "f9021aa0a8da98b6ef1e12b6c49e85b0e965f1ed1688f5e3605f06bb3c6ce4f857aa0bc6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794635b4764d1939dfacd3a8014726159abc277becca0d03c319fe68a91e22fb3b945a8dfc73b817976e29cf57e6c8425e6a02e9bf034a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849fe1546f8350d001837a121d80845c9d55f29fde8302020b8f5061726974792d457468657265756d86312e33322e30826c69a04bf72e97bcf64717bfd655e2bca9ed1a5253cce5373268729161b1786ca4710488db3c50627f9321c4",
|
"header": "f90219a081352ab3cd380f66493aa270deeb239af085e68a83579dd8871a0b0a7c7fd4e2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794295856bcf02b2017607e4f61cfc1573fd05d511fa0a886a42f9a2733e392a5f9459f70bb133e5012f059d6cb6aeb360a7bb766571ea01ffc81fa17e357d368e82f1a658c8b129877818e34fdad26e32fa60ac4b12fc7a0946e845a5b468d8c679890632ab9fdff3349b307ce864c7b13195e4f80af4777b90100000000000000008c00021100000000000000000000010000400000000280000000000000000000000000008201000000010000010408010002010000000000002000010102080000008000080000000400000020100010000000200000200000000000000000000010080000000000008000000000080800000080100210000000080201006008210002000002004000000004a0000010800000000820c00010100000000000880000000800080000000020000000000000000100020000002000008002000200100000000000880840000000000242000000020100408800000202000000200000000000000000000200000008000001000000520080000000850340be271083653001837a12008344ded9845db0acc49ad983010906846765746889676f312e31312e3133856c696e7578a0a23e3a33f308378c4cb1eb9b34b40c224844aae072c0eba928a840f6d6ca69a28892892d000574e452",
|
||||||
"totalDifficulty": "18787961645682286",
|
"totalDifficulty": "26251713144679901",
|
||||||
"CHTs": [
|
"CHTs": [
|
||||||
"0x614648fc0a459451850bdfe353a932b5ff824e1b568478394f78b3ed5427e37a",
|
"0x614648fc0a459451850bdfe353a932b5ff824e1b568478394f78b3ed5427e37a",
|
||||||
"0x1eae561c582dbb7f4e041998e084e165d0332c915d3a6da367638a8d24f3fafc",
|
"0x1eae561c582dbb7f4e041998e084e165d0332c915d3a6da367638a8d24f3fafc",
|
||||||
@ -2655,7 +2655,659 @@
|
|||||||
"0xebb3e8f76f3b6a95285154dc11d4bd94ac4c3a150383ed69f5373499b1983dc3",
|
"0xebb3e8f76f3b6a95285154dc11d4bd94ac4c3a150383ed69f5373499b1983dc3",
|
||||||
"0xb0919ed300acac5f912f01611a428861db27ffb8129a80495f735f0ac608ab35",
|
"0xb0919ed300acac5f912f01611a428861db27ffb8129a80495f735f0ac608ab35",
|
||||||
"0x2ee321d9d805b78a97210df2977ab62b352705e308773b90e0f4e923adec377c",
|
"0x2ee321d9d805b78a97210df2977ab62b352705e308773b90e0f4e923adec377c",
|
||||||
"0xee00cb02e9b86978ae10b119924bbe6c38f730c1d1b621d32c9d697e11105871"
|
"0xee00cb02e9b86978ae10b119924bbe6c38f730c1d1b621d32c9d697e11105871",
|
||||||
|
"0x3138c1f196e8b3de9369c3c8ee1d556de1bae00896cac87b4083bdd7a691e738",
|
||||||
|
"0x0a777c53b3be3f3b136b24585dca1b7c85f7b0edd72f2173ddc70b0a1bc8bd93",
|
||||||
|
"0xbcb300ee517ac8356c36c002da6f2ad562c31c81a3353d63925e044b10d0412a",
|
||||||
|
"0x503c3b1da233bf2f9f9fa13b0488aa5384a3cc95dc21e6f2e73577dd3ddc1974",
|
||||||
|
"0x0d07a00e18f3db6896d0879fe87cf7aec13f30a957806f74cdb0c47ccac035db",
|
||||||
|
"0xb6e92e6a32c5434a79448503a269e6e5ccbf70bc59dc58957915621eb5951e26",
|
||||||
|
"0xc2381981c2a38689e6ca1121fd33eac2881b1aac64a850b7f5751d587a5a79f4",
|
||||||
|
"0x83c0f655616e7565d63333d8a5f99baf2f4e0a7dc1520d6c4142b1be6931cdf4",
|
||||||
|
"0xb17c34ad30548ca1889d7aa11aa12748f7c02431d64d7f53013a10b979ec7aa1",
|
||||||
|
"0x34ab63d2aea17cf800fc2aa3c8589fcded1a732bbfa2102315adfa03596a4221",
|
||||||
|
"0x6a7bae77e28fe9ea18b59e4bd4b81780daf520309808560d533604c0bdf76f84",
|
||||||
|
"0x64df132fc5319adc69249961df9830e5d63945564d912fe901d80e7859a87057",
|
||||||
|
"0x2323352a8e2f13d442fcebc760ece470dfe5542188f6fc2d38f4db6af48bc959",
|
||||||
|
"0xe9944f4b2d9e3fd7aad0446281d4971463c2e53029d7e7f40f8b0daad1a29d67",
|
||||||
|
"0xe012a3af1ddc10881cbc1c62c1e0e7205db5edebe74bd0c8d1c12bb9a3f47e2f",
|
||||||
|
"0x26672ff6f0f02089b7a67837aedea5e54acc3120ad4f2b936948d7053d74ccfe",
|
||||||
|
"0x70b1eb24d9c2544e26af43212c0cf70e3e2ba58316f5372db5daed02c45907bf",
|
||||||
|
"0x7156e65df46bc1d62e8f8ab4c6c2115a5129d28ae9e96ba779b4615fde08f267",
|
||||||
|
"0x15212b5fcc31d204cee80a4ba392e731a2fbe40e1a23d8fdcbc6ecdd665ac9ff",
|
||||||
|
"0x1508823c086bb5269f60b452fcaf3d58b6dece236704ad479205e1b6b870b7a2",
|
||||||
|
"0x73a9ba93b3a5444294b466acb8c560c0a62a16dcdb5c90eddeb19f9eb75dfd31",
|
||||||
|
"0x9658cab50473a5fdc06f3bf07b34981212f215bdd773439cda3a5a37dd96b7ed",
|
||||||
|
"0x1b76828d177851a98f2a4e4a5a28e2e50dc876878b4a44b7654c409ad6a58a4c",
|
||||||
|
"0x7345477276953426e16dc819818ba09988d1e2b552adfa47c5f7cf6c1bfdb3da",
|
||||||
|
"0x2419a94e778ed5aeff0552a884b87b12e3b4f9b87c2e5df66ebe9260f38f19fa",
|
||||||
|
"0x4c14ee271bcb543d5395324a6fae046e133bd3e34f6a3d1328c9d3c77593756f",
|
||||||
|
"0xcbd9935f32d758ec070e06c393f5bfb925515058237471ccc89a6c7126df2fbc",
|
||||||
|
"0xf945621e7c926f2739488d96c4e5fd42fa91a5be31e9a45876fe982166bd4cfd",
|
||||||
|
"0x427ae8d29c63525078a803c1e40554f77685866a46f2ad9d0f772ad0c10b43ea",
|
||||||
|
"0xe4a6753800fc0d20c0ddedd6c716f8fafbbe636256548170a871d2913c885c9a",
|
||||||
|
"0x4da6c6246e60c496e059dd80bcae5ff30dc285e2a2db142eb4da3f15b00c0df3",
|
||||||
|
"0x4d1ff252edc762f25066a466e26154162942ef71ad13c159c102d94e427cc926",
|
||||||
|
"0x663a98199d967f55acdb313e901cfa23768ae21e7b5efa6b6de88b93e96b08b2",
|
||||||
|
"0xf025c69018317e95880e27a96910c6a4fac0b5d7a52abaab7c616af08eab1090",
|
||||||
|
"0xa5dc8339e0b823dc3821867cc84bebff11fb0bb8fe2f54ca5748cd2d8066f68b",
|
||||||
|
"0x9b3835afa0d0f1aac1a603d1f322940f4b84da6c6352654fb10aea202b3b84b1",
|
||||||
|
"0x41cea6f1e1de2697e58cefefbd4ea1118acb43aaf9ec7a9c116d14a5310e925f",
|
||||||
|
"0x5f1e42931b16c26642f351b24bb063f6ae7dbceca760961fe4d07dee0286082a",
|
||||||
|
"0x9ab19e309d5a4fd3596f0979b268473eeccd04af6674968e1e340a47c6652d9f",
|
||||||
|
"0xd6dfe22679bc3590594bfa1ead582bd4639f1b3869915e802e8973666d29588d",
|
||||||
|
"0x92f5589f356fbf8e4c5b12bf11d5f148d94f0e9f9297bbb32a73ed8fc409ad8d",
|
||||||
|
"0xecdeb77e2b35647c59aeb935e6fa4404ddecf9287ffd84d02c090d6772f1a68b",
|
||||||
|
"0x18abbe4adfb8d2365a14201ceb3966e561817ae497754b65cb5441f64bfec184",
|
||||||
|
"0x4d57180d082ec586a97573b383a12a59664d9877d86140281af0eef88f8dc8fc",
|
||||||
|
"0xfd52e379ec75f3645ccd83653370e107970c5c61573ec688986895d5e825303d",
|
||||||
|
"0x9327212a8ca5d0139e6728f8b39caa571a7821782b49a2edb96371daf6320571",
|
||||||
|
"0x9d9b1cbc011a31b99943d9dc7a2a8ff2da0992a5e3d22bf24685723b85545452",
|
||||||
|
"0x8661975f8565dd506ee26d265ed78a06d0c60dc150df594b6a1cd09c5c383e5c",
|
||||||
|
"0x98574ee8064f0b276433b8d98f7db55b7387775c03d543f2a8d1f77cc9d9bd20",
|
||||||
|
"0x6fd37be595359e52e5482f53ab66c9e76ef393085485a4bcb344272607cf2c0d",
|
||||||
|
"0x1d2a15c07ac3b45c024b4c14c976ed18d0f2e4ddfc84fa153414e301115b70fb",
|
||||||
|
"0x1ebb4adc19ea75acf90cd66ded504674367b70506f4813e22cc856f10c36973a",
|
||||||
|
"0xcb0198d5b6883b582c6b389e6f98ed77494f3f6ed232056dff48a368bbc2b9c2",
|
||||||
|
"0x2bb53b3a72fd65a4a090b49301c448fe44fbe0c7773e938af9c511070b442957",
|
||||||
|
"0xbf8289e45461485d9ae0df36052adcc1c43089e173a54663330a4f1ccd6ff7ea",
|
||||||
|
"0x059c82830dd4ffb040cc75a4b354483d81bc6f16ffd0545029112845f8db7cbd",
|
||||||
|
"0x68fa73438a9093f1e2e5a88a244287cd1d068bc28ac0c7c88cecc70f2b7cfe74",
|
||||||
|
"0xf935992c7eea357445e47fceb2894d4c04c618fb238f6a84251c919cd2e5b97c",
|
||||||
|
"0xc2b6a5bf4ab7f6f43fa9f59269116929116e5f136faf8acc7a565eaf4f6f5a0e",
|
||||||
|
"0x0f06da2edc35f959f8f3c9f9b16b13df3d1ebc5de146d7467f342116648bcbb7",
|
||||||
|
"0x4cccb59e57aedae4c1aa83a19126e846b14701be2971f95868c9055b77461db0",
|
||||||
|
"0xb2a64c59c4a3878472f5fdc4365e61f6cb5a67a1b453dba34c2d257f97ac44cd",
|
||||||
|
"0x21d74f1e667bce1163c8da46d522bb39a6ce777b618c6d2551c01427a68a2316",
|
||||||
|
"0xe1d84da4146c25e3d89bece4bcfd19ebaf684086604c53e702c07b938057d88d",
|
||||||
|
"0x6ff86b85371f732a285b19e9372a2567529bae071a439e80be782c5e3c462c4b",
|
||||||
|
"0x86fce707891c52a94cb30d50c4bd08fdd5567b88f6676f35228523847c966032",
|
||||||
|
"0x59aeb5682b2a3443e6c8bcc4d425e3a59872090bc71dfbc6cacda9f02d9fb7c8",
|
||||||
|
"0x7bf9a30fae3402b8d0aa4f7b18842bbe082c1e11469f635792225c8e8e536f9a",
|
||||||
|
"0x3f13e2ce31229a9079f04f77131a170212bc64c1701c2ddd54713c0e59f03991",
|
||||||
|
"0x2daaafebbc63db1ea0a8fa6e5037c4da16a92fceda2dbcb9576fc2fa28b0ee74",
|
||||||
|
"0xb14610c614c0c0c59e295fde6c4ab0e4b4c174385fa734cc8a2095dd6a95358c",
|
||||||
|
"0x14ab25c7f34bb626f581d38faef3beee599300a51bb62d3e1e1dded92ddc95d3",
|
||||||
|
"0x409ca4196a8db10326ca032cd14b7295981f0a779a42c7f0233d71ebfec3b19f",
|
||||||
|
"0xa283859dca46f41b5ca2f403aaa9e2356bf41e06697b5722b245c68ea3f81b2c",
|
||||||
|
"0x1c917355509fab582d5556e340b71c6962577da9e189b703456dbb7fb55784c7",
|
||||||
|
"0xb928315f7ce4508f4014962fc95a5942a5c0ee66af2e125101ab02d04b6cccab",
|
||||||
|
"0x00c6a46b1b4eaf7f62e2133d454f850ef1dae798d5aff512f607dd8037e53bbc",
|
||||||
|
"0xc042c1ce9cc355d4e054e5880f7c09fa3bcd58047159fe6b08a02c80059acaea",
|
||||||
|
"0xbf7b1e204a760ae2782e926e202428312955404786b85ab00688da616682b085",
|
||||||
|
"0x36d29378eacf4d587bc5a569e8ed572cbcb71be0a016d69909a05457915962b0",
|
||||||
|
"0x27674967b0e43a5f70ec168cb00df61a1227da4ac61660769ac2a7a2cdcb2598",
|
||||||
|
"0x9bea8f7596f72268a51be1b993cde5adbbe175ad48334276295687a76f801fc1",
|
||||||
|
"0xd9e17222c824c8293b05702e3170a059543bfa3e4bdd19828203c7072f013eb4",
|
||||||
|
"0x170685db98bae956224b3a57e4cf50ae4a8874ddc988f70d5ea31357c2a83ed8",
|
||||||
|
"0xb8e7344df221731d25fc88dfd31f938005328202dffd0be8d28e9d0392a75c81",
|
||||||
|
"0x47abee9a0802d59dec86fbe5d9a13a7332d326b900cae4e3841c69e9b25ac788",
|
||||||
|
"0xc09452238c2890433e14e0fcf826051c752580f147750ca745d1b779f303ef9b",
|
||||||
|
"0x05bbb06eb270618437a1300c02964c8f854d4a6daaab2d59ff6cc69f46c7234b",
|
||||||
|
"0x89d752b94f59ad98d59ee317c3ebcd840dcc997efa7fb88797c35477831c695a",
|
||||||
|
"0x2dc622984dd44a2cbb4313c7efccba85b497e33214eb314dfd7f2be40fee6cd3",
|
||||||
|
"0xe23e51675985c6a4f887c843048487721da6ae6a6676adc87a805fdd46149f9c",
|
||||||
|
"0xa452ef2f6e358a534dfc4914a2c7ad3ff9faf2d16fc0b7cab96659cef5e4eea0",
|
||||||
|
"0xec9f04f090f443596129248d8675aab78e5275c56691444604751a0bb5da443e",
|
||||||
|
"0x52d8fe33aab98f680b3b7d56f501621a5516d3999bf4b1804b4ec0e845f87ee4",
|
||||||
|
"0x22dce4da35077c2efdb94c41c6ec7e17c1a3604c3c7b70041728a96c3d533851",
|
||||||
|
"0x706284df96499696a8c20c7a685493663b149af04afb5635fb831bdb20de256c",
|
||||||
|
"0xcfd7fa6c9a27e3b9c1f124522c87841a22105c561224de3c1d7a5e441f980c94",
|
||||||
|
"0x562458d2c5b55b9fe6116ef5cf165aebcc40d86863efb5036d42f1f86a804e73",
|
||||||
|
"0x05fffdd643f1eefb8083d7c2acdbbd13e076134e05c0ca6bed8049bc747403ec",
|
||||||
|
"0x1f1d7cb9e496d998ea6f8bdeb31e977dffc942987157f571cfb38037b8585bba",
|
||||||
|
"0xaac332309b32eb92fd347871dc513987c06b984ac00feecbc686029cd548ed56",
|
||||||
|
"0x64c449079ba124feb488948f3b17f6e68207992d71cc4a383563510503414932",
|
||||||
|
"0x0aa5215822bdc1f3151756079fb5435df2abbeeecaae1050d33af6fa1ab37a87",
|
||||||
|
"0xceddb86f1882bd3e196856e9a43d95a37ef115a4a2d2a86166ae827c7b0e8f0e",
|
||||||
|
"0x3f368b92f5217f872d9a38c14e5791b72b3b25730962514677e2c069bc04de94",
|
||||||
|
"0x9ef75df3e9b2e97208b2c4d0917ba6de03b437ccba8e580b9f4023a1c753a354",
|
||||||
|
"0xaa662f12ed9e399bdfa0e81b7f52c217029166b483a1ee492328d596d95e55c8",
|
||||||
|
"0xbaee3ebcc9a9de22b3d4067d905beb6c75ec7715d06a426dfba366da9d9b12dc",
|
||||||
|
"0x4fd3b9baa9f53e6edaa14c9d69f0cf2f0010d9ead83963d96b87b7505b97e83b",
|
||||||
|
"0x808d62434ef0cbd193a3ec3cdc60f79ffb797ea07d53b98ba1afaa8497cdf7e6",
|
||||||
|
"0x1da441a4ef8e75eab531c5fadee15bd1a60e93043e6f5b5264912d760ccfd79f",
|
||||||
|
"0xea233791cf501a1b6d172ecea7ed1e2fcc39555b597fa3ef86f8b63ceffef6cc",
|
||||||
|
"0x57e04235e51c579d0a7fbf74d469c6a74403cbd09ee56f168a74a3c1fc5940f5",
|
||||||
|
"0x46d051393b825130670a2d56872467b02033a8eb479d466c6522fc466020e76b",
|
||||||
|
"0xd9c313e7ac54bf497a315c8af6dc1f3751e10a97dab570b04f80811208f0c2d0",
|
||||||
|
"0x7219321803c2a129ef429886035bfbc27dd64fd50515c38a7c43bcd184a68380",
|
||||||
|
"0x140c4deb5543c31c49296e68bbca9d7c10799ff293e05ee130982a6d9f3d4638",
|
||||||
|
"0x2cb5aac917f6c1519a7cb3094953d9851d5498b954b62b05045ef0fb93924419",
|
||||||
|
"0x1aaaf2699d5ac7bd2124f3509fb2148dc1c93b940c517eb9d4417b6a6a911a21",
|
||||||
|
"0xb454286ea98d62faba2a2e531f6e2a42a61e23ea3274605f8e2c776697085dea",
|
||||||
|
"0x100a6c25a0221361db912b4a491a001032a3cac6909f8d805ef82251f635aaf3",
|
||||||
|
"0x08a834de8f3ca2dc5f7075f0ef5246f6d824ea4577a3d238b2458676896a846c",
|
||||||
|
"0x6c0878c40a466520a5b86a06670ff0e1ce97512205ae8c22995d0bc48d9ad222",
|
||||||
|
"0x6835b4bb12bae675af54580a1fc57f266c050748a583f8b6145306fd3bf86cb9",
|
||||||
|
"0xa66940592c705e99bccb61c82e6112cc75aad73b605aa09280edeb065718a043",
|
||||||
|
"0xc565e42a728c1a0211ebce7b5ce9b8088e74ba9b254ff339611806c239dc72f6",
|
||||||
|
"0xc691d8ad39fab8e168266f1d502f02f269c7f44ddd055dcee529136cce2b835e",
|
||||||
|
"0x34bd34e5e476acfdef9f3c260a8d6f9d4236e58a9fe60aae99c38f8fbd465b38",
|
||||||
|
"0x9bf9269591e17668d01181d6a0d71ac17b494340e47034ec5f40f91f0bde9f58",
|
||||||
|
"0x3f3b051eea4259b90aa1063772ebf6e05563c7de791707bc8e35cc5ae561d110",
|
||||||
|
"0x7021c2db5c4df7a546d99750bc905b1a9f846afc688b7a033653feb8a9afc12c",
|
||||||
|
"0xfc7b212e599b58ff35eaa80b49ead63215ea826dcb3edc4df7500334cb929935",
|
||||||
|
"0x6cf11be5e7c9b94e24ab241b7552fb5bb089ef9b3dcd62bdba020b0332d4cc05",
|
||||||
|
"0x9353b5f84c414f0274732975cd3449a7ba55aba6665b5cdca14650e6387ffb3c",
|
||||||
|
"0xa4717f0fecb6a35c60e9669c8a754c1c2d41f6144cefac52531f9870fe0351ef",
|
||||||
|
"0xae685fc22226cfb05373350506f1f2072406b3d391a4b57ea5c467a9286ddc3c",
|
||||||
|
"0xd91482bd0e080649387aa580e255d77c197c1734a692296b27470d8f20d971cc",
|
||||||
|
"0xbe97061686e83466182be54cfdc721637ef26e99b247ea68b814aeef0123f076",
|
||||||
|
"0x8bc0768fa4670eb28beaea6ebe20a7acc0f23832154b61515bdebc9e6e5aae61",
|
||||||
|
"0x9570703dace2ff11a3e8d61552baaf3e5e812eca124f42210f1300ccb2116158",
|
||||||
|
"0x21a68948d1014f8e541adead6c9d0e73f003dbb3cdc145cbfcdaadb1ab0449c9",
|
||||||
|
"0xad51740caef4a8c01223fe11d7346852ed0873b38a65fe3ab1948e5946e6a8c4",
|
||||||
|
"0xf5b3e50890db272ac29b8fed050b89a3c1260563466cbde8aa6d50ab66c28a54",
|
||||||
|
"0x635e873d51779460b6b4dc2683ca229826e5a40ba0f5963a0a27d02eb0370cb9",
|
||||||
|
"0x13302c3e93380ebbf6b54be15f792f0878396dfd9e8da75689e4dec5f30ca85c",
|
||||||
|
"0xffb0746ad72d53240895bbdb07d1cc5a94bcf4e6422c0dbe7b2b3fff57587271",
|
||||||
|
"0x1cef16d47f2975e4517a9bead7df47d7e0db677c68d80e50edca3a81f493cdb9",
|
||||||
|
"0x50824f81d7ccbdadfdf5fc4b082d920d1416d6f3e6dae3a347e71993a2565ecd",
|
||||||
|
"0x10707c02efc13e50e5b1a9217ba2602ec77dee3817385d145674eceaa21d2892",
|
||||||
|
"0xa281eb9159884095b5d3584b67bb7db899464fa176cc90800ed8ccf23eccb4c7",
|
||||||
|
"0x2f63567e75786960025334d3772571f6fe1ff411b6bf867c84c1455f3954ef13",
|
||||||
|
"0xe1d9eb8d78fb1365f28d4112b14f3d5575a68f1160813f0d0a2a1faae3266d1c",
|
||||||
|
"0x7a7dd4036031fe92e19c41af52f5c039fa3c12430d5b79111c568681b640a2a0",
|
||||||
|
"0x509e93ce350453b61b502de0f87fed794b0d77bb6878225122eee67a1414320f",
|
||||||
|
"0x679778b1f6732382d834000d24a94223b69a0a88b56d0c070b659fb2daed668c",
|
||||||
|
"0x49963e1807e7f45e132a7e3d2cf7c10fa0e1c36aae866a9641cc801ee8d261aa",
|
||||||
|
"0xa1124f9bf0d2b0ef671ddcfca3a66a86545cac8ca9ecc82631480ca091ccea94",
|
||||||
|
"0x9ec43a9de16fc83ddf5022891c6f5593796122b9f9c72803373c62888c5f9198",
|
||||||
|
"0x5af071f137c5584bc1766ef4ef092fdd8f4a3a3a64ebaca50b169a22e32d2542",
|
||||||
|
"0x5b3ada30dc686e15bac396821debd08d8a96fe1450e5180170241cd6527b4bbd",
|
||||||
|
"0xe56f8e15e3f74d77427424811c6d03b2bc98f010750c6bc83c34b8eb94bee0d1",
|
||||||
|
"0x5dbe293dc9f09c20091e29ec20249a9b1e52e28ec863afce106f03a75b88b111",
|
||||||
|
"0xd61adfaf9d822c3d8e981725a42113a13abeb8f887f16e0ae021cb23d7255a2f",
|
||||||
|
"0x1efdd0a60ad05c11faecde65b02f3ba3fb85bce685a9b89ee4e6a94ddde4b7d5",
|
||||||
|
"0x60613e04232a203fe161398acf4346652a9b6b9a07837fcc06f53a950136d911",
|
||||||
|
"0x1b9f0c43d87ba4efaf7781da46f52a6eff60b8c9ca6d81dbe02bf6774fa80047",
|
||||||
|
"0x41aab71c01968d0cb73fad35b9839f6ba2e8d807852ac9c6f1220d5aef866f74",
|
||||||
|
"0x67ca5da2f269bfea45e0ec5037bcb1e467d5938eff17760f6b3c5ef74448af69",
|
||||||
|
"0xc16c2d3a36275d3123d5d95b6ace3bf131af1e6e07de185a8f4e335c5a3cfc1d",
|
||||||
|
"0xa70dd20159272a4d8e5efe456500a1f710a271b690334e98862a24d31d4427f4",
|
||||||
|
"0xeb932d05a4e57bd9cbe363a96cc616d0aed481298cb38183bafbaed9384ed27e",
|
||||||
|
"0xad772cc01c6537fddff8eacd182680e1e8b0d203bbbbc317a4ad9c1e7c1e4b71",
|
||||||
|
"0x81d7acf3f3760b06a68257654e4b0c466883e3198c61ad71decae53963435817",
|
||||||
|
"0x33cbfe14923923214b2047d445696b34251f70d53005e84f43e383fa1dd791fe",
|
||||||
|
"0x8a74d3f3c775f619f9225388fb5172b187141a8ed35ad794c40b2d278e6a388c",
|
||||||
|
"0x9db16af2961834b804e6330a9f587512c92a137b8656bc5baffb227686fea9db",
|
||||||
|
"0xa23c0d4f859ad30a4b7d3863ad16926faf41b4623e6adf9c7f2a59815890f4ee",
|
||||||
|
"0x97da87b047a43970a8e537ed5cb15c0f28885812262e8119c659a3d1a92f8aab",
|
||||||
|
"0xe0a2d92c83b8ab1bfaad4bd1e717fb5dda967c001ec7662815042a3544bef441",
|
||||||
|
"0xc70983fb6257a34bd43862c405023db2112f0b1c4a11aebc23ba17eee3ecd1e5",
|
||||||
|
"0x05798069ba546f61fec26ddc4b260fcadad3a84d612900ee2afc84e10dd13358",
|
||||||
|
"0x1d12ca65d3a55ecdc19fa4135e47bf470bc6ca85fa6639eeeabe951d9d0ddfa2",
|
||||||
|
"0xd47f4b22fc0326df733607783934b1be3818fe057afe802216178a450f507c17",
|
||||||
|
"0x4d71d9619222c0c4ebd0fb25da7e53358ddf4ab2cbd962ad88b37fbb331442ce",
|
||||||
|
"0x2be4b69114e307d117df01cb568d35f79588ea70e9016f865f641614691cf7c8",
|
||||||
|
"0xa87d1304e2462cabcf90207b81a058ae766273007821ac98b718467792eff05c",
|
||||||
|
"0xd94b7d41761d34a27c5cf565f0e92fbb65ccc3e8aeb5b1c1d9d233b032f071ba",
|
||||||
|
"0x6079df72e53c3f1793bcf5a4d22ed2035e31662d45bfd210c4bdee475335039f",
|
||||||
|
"0x85506dcffd6342df61e673ac01219c58198558bcaf7759eb2e4b19925ddae8e6",
|
||||||
|
"0x6a19a7212075395bba890eeaf4709c7025af6ef3087ca86671da478c7e49ed83",
|
||||||
|
"0x62c52d8ad2b6c000462358d31c652b280bce3676f103d7182fd3646a7f007604",
|
||||||
|
"0xa600ffa0e6d161287d9b9bfb13ee9dba74699e542aede1278d5344e6688f0382",
|
||||||
|
"0x7404c9ba05ab64a8e88847dc725b132b627686f4531248ebdd76dc76d42a8b36",
|
||||||
|
"0xff0198b39d39660cb3c74d455b4019ae0f23fb181378c207bbcb3b79587b8558",
|
||||||
|
"0xf47db7ef987a8cc32dd3f61b44e6812c940592337c056570d265e1604ef49f4b",
|
||||||
|
"0xfbf7eeb0951ed5c4704fff2e5d121b831637a86472e32c24a7b85e9daed5e1e5",
|
||||||
|
"0xdc560bf4b2d849ecb777a4d2d8a3b3bfd12c1a4a295531573fd1d493af34042c",
|
||||||
|
"0xce32751e3958436d8aa727ab6f89d1354cd0373f288b40395e9105aa905a1713",
|
||||||
|
"0xdfb4595b9c8bce6108ed0b550f920fd098f6757a3e64734fa97fd5a640c962d8",
|
||||||
|
"0xfc557009bbfc0b2a47eb486002568e963a32eb664f7a55d81335ef6efa79c804",
|
||||||
|
"0x9dd310e9b00e69b7d0b0d91db5095065c78bc91f2321df8b5622a490ef940626",
|
||||||
|
"0xd4ca936ec7acd0d54c6efd71cc6c808573482f2510175ac6251f1cffd7a12ade",
|
||||||
|
"0x465a05fb5c4c66d0bfa64097c705eccb50bafe9d2ba223ee69111b16c2014c02",
|
||||||
|
"0x634d4372ed9478b3afaaeb35e316f71cc5d371548260eefe273c236501d5616e",
|
||||||
|
"0x16ebd07c2e0032fb1c3722df3647e74650b7c1c81f4e7084149a30524846ccf3",
|
||||||
|
"0x32ee5ef340cf87e26642d11d619eff9ab9e5a1518815b9897b6a95007e2b7572",
|
||||||
|
"0x47ed528e27c42d8a4100a84957ef81a4784c0272f5e3cb6a68212af492a844fd",
|
||||||
|
"0xcc376aa2c1b0b49f96bde6390d5ec296fe7d5671d6bb5b5df31cdff2eb5f08f6",
|
||||||
|
"0xdde8938b019a5e587a28eaf579b5e21892bfc3475ce75112c4f1d9a5ef65dad7",
|
||||||
|
"0xd0b4c6d8ca3d95851c34e729d9228cfb0f4c4efa7fdcac3d96ea4e4d3e0c0189",
|
||||||
|
"0xb441266ed512646050c73207c3d88869ccceb7584f3325125a5511d5b05bf5e2",
|
||||||
|
"0xf05a1a620f1179a6ebe9281fac034638620155bf9260bba7df47d59b54789bd6",
|
||||||
|
"0xdba9596e7229cee4c339fbd182b0ebd076309e3c8d3653060a94dff252ceca19",
|
||||||
|
"0x30142242a511348d48171bd65aa191fea095446cefc49967fc7ac88964efb4c9",
|
||||||
|
"0xed1b743e8baa487193935a6d974a7c417cd42fb761007e5ef168f35486cdc2d2",
|
||||||
|
"0xfe54e8161aa159b9873dfd4f2d3b7bfd5cc70c4625855b70348684c7a19acdb6",
|
||||||
|
"0x7993784b62dec4dbdc595450f114290152676cb6938fca76e956968367e34519",
|
||||||
|
"0x2efca2f1900c2ae1f572342a077afd97fccde2b2305ee0b60fbce8240d6779eb",
|
||||||
|
"0x99ec617f5f447a4608d5bd96ca375a33a15894270ce22091b60f308298ac51e3",
|
||||||
|
"0xa38427232204d3f8e58dacb6495799a6c21e60746d26a438d8504dadab3a9bbc",
|
||||||
|
"0x8c39c623cd06d598ef78e2c46f7506523ab9ae5fba5a7273366ce9a3d9bb977f",
|
||||||
|
"0x9e15df3655d1a3acc064309382a41e0f7db24925ebf1df51e23e0693d9b119b1",
|
||||||
|
"0x69b4a6a1cdae2b0f84a18b712286ee304995f6073b6c81fe7ee544ab1d17539f",
|
||||||
|
"0xe395574bbbc54fbc2e3dc7f363abb34dc760bc2f6fa92c980d26d5c9df5681f5",
|
||||||
|
"0x1f863b9112535a87fa2e28cecbe0af5c22dbeb41558b93cac0dead527affb06c",
|
||||||
|
"0x78229983620efa77087391d04057e1971b2ecde2c9f9d959f769e18c1e07a8c5",
|
||||||
|
"0xcb72a2403046e54d6babc6cb9e2db5f79f09a9c45f983dcf595dae3fece77570",
|
||||||
|
"0x5267de76947667220d218ec4d1c3db31213d991e59cd0f8e4e547197e4f99205",
|
||||||
|
"0x55b03de02f92b3210a614f8d0eed98e056a348dce7dc03dc46dec5f7ffa942df",
|
||||||
|
"0xc2e6b807b1baf078a962a9bf2d92f91c0b326cce0ba6ff59c834b812e55278cb",
|
||||||
|
"0x94073fbeb062a2fc6f1a0450776b598b1a26aaabb1c1b07e79ba0a816f63ea26",
|
||||||
|
"0x2521e9b0d16b0129ae594dbea0a2fdc115c379c6c754933ae4dbd20091e8d148",
|
||||||
|
"0xd2e288fcb68b22fb80e5591bca2524d7a21eef199c3c333a80218a4eb698550c",
|
||||||
|
"0xc92539e422408c2bbf932556b096d90cea0caeb81e29c2c92552d156c2bf8399",
|
||||||
|
"0x5ffcc95004131253c4b32e34f7e1db552938b092f7343f501e15554cebe914e4",
|
||||||
|
"0xea70a44b30ed6d5a7e8e9f85eb8b70aaa05320489054faa40e15989e01ba789e",
|
||||||
|
"0xcccead6845a28d610af1674a474bd77a5042ce93f682f0c4e879cb0c3e836320",
|
||||||
|
"0x3ee01f8d3f6948da18f0212ee7c990bdc2ba2eedd020d29461d9d558ac9155c8",
|
||||||
|
"0xc5aec3935dcbf93026bcd8e24632e405b56ba1ab003cddc169b41372ea6d3a59",
|
||||||
|
"0x1a9e0622cb0658017749353e3167f38bb1961c4088442f124c1ceee2dab52945",
|
||||||
|
"0x2628f184beb5baff725a1918ad222900d41a1c3911eca1f272b484fe103ed4d8",
|
||||||
|
"0x2a03c227d307eb99185eab66ad4fe4b77ac1a0245ec28bf4d87702092461c275",
|
||||||
|
"0x4664e5b9b20927813f129a23414f319628243cf2ec6d93b0779f0bab5c602803",
|
||||||
|
"0xdb8978d3303d1c40d51e1608a24102af93c15ef7a82bb3fa8f9a1ffcccf87bf9",
|
||||||
|
"0xbe63631e76bae0c7eb4ab34abae21f9c827638954578ab93e823d9db8212c08a",
|
||||||
|
"0xfcb959859a8eed19f6cfabce408e5207206e8e0f96924328355a279f9fe9779a",
|
||||||
|
"0xc1f2e02c014167d9456a985c669121d543e39a8957aaf328ec1779de2803ee99",
|
||||||
|
"0x3261a5631dc254f335cfe69cb835f61e11caaf9b0299f0701ebbfd0470755313",
|
||||||
|
"0x02d30a73d3a7fec6c2567e1f2861113428fae47abcf76167ec432da20515134b",
|
||||||
|
"0x312e3cc2897aa8eb766bb4d0a91e160884153c90c266d03bb6efed08c4f48cc1",
|
||||||
|
"0x00f196dae3153faa0b4ce1bb9b3122f76cf1c1398fb43f8aba95037b8a6d797d",
|
||||||
|
"0x8e4bb4443854630bf0835c3644270462d9b7e8f3fa409e2c8c420010c8dcf0f6",
|
||||||
|
"0x3ad0e8f5abb1238702bbd95556ac9a9018f4a4ce107bb2d87b7ebc76b0b723ea",
|
||||||
|
"0x5c78e87df5d32db813c9e89d4934a18490f9ec5e4f2e5e66941db9e6c8dd1129",
|
||||||
|
"0xac6749f8a149d465b9d98dda8283425ae7e27eacd803baf2babd9254d2da0e97",
|
||||||
|
"0xf68f70077a1f7d69e5afbc259adbd51fd97cb78e45a38bcd698922ca0f2c17bc",
|
||||||
|
"0xc6b1279ce5d96648642dfff31d3bf3d989de50143a69dced098f883f2d58ad36",
|
||||||
|
"0xc4655ffd7482e52531cef2edc1f259f384d69a3920f699f6443e92386a0b63f0",
|
||||||
|
"0x28ea7302f04d4ff4b2c40fc150908ffc34403d7e5d756be4e980983e08a72db4",
|
||||||
|
"0x87d6de7a3cfb49ba01d006bfc051c5d22c2671eb67bf3af87291d34bf84dd328",
|
||||||
|
"0xd156e6fefece7a5613122c24733683863b9a20f7fae1cd022b093c9dfb53b366",
|
||||||
|
"0x5501015e22d6086647d60e44df262d70d4d8921648bcf366e8442cfd8421e83c",
|
||||||
|
"0xfe520098dd0cb9422d83d4a562c099bf8445c25e93b3b9a410319f0300b710dd",
|
||||||
|
"0xbac6ee3d851c6d574004c6645647b2ffa6a3519f13f3ff9529e5924288815a5e",
|
||||||
|
"0x3fbbb9d0516549cb952f1be5ab6e69d60ef1a8369cfa4d22152d006d886eb604",
|
||||||
|
"0xbc1843d922c2e0ccd1403a0da02b4f758fad4f02bb09ab823560308826149cf9",
|
||||||
|
"0x9ec0d3d14623babe08dbba627c2d478ab34a0a0f46984e528499b86755bab02e",
|
||||||
|
"0x98715273786d911f75085819b301792d241d005934e2d93e8e689c8a5cebc5f0",
|
||||||
|
"0x0c25dafe9a23ad5d17e97f23782e11152f548c73a0ff58fba9b3a64aa26cfacb",
|
||||||
|
"0x7a8fc37c03b6ce7d275c2a4160e883787df5010892fd6ffad54dfdd70a97168f",
|
||||||
|
"0x342816670945437b66e0a12d5eae2d284176a54cee727a5cff6f5fac83845864",
|
||||||
|
"0x40f472f8737a813a879eb762f085ea5966934e1a4562b212b11612b5fac059f4",
|
||||||
|
"0x865b00c472ef94d6d9b038f328aeb2eab1e81cbd2da3c4720257c8b4b8b41e76",
|
||||||
|
"0xe94ee97f38d8989ab6bbd137ed9bad8529c543910e5a328b01fd5571ed63199f",
|
||||||
|
"0x57ac21373529bdcb22c053797736b9b600737d91ccaf296ea761bdb9d425ed74",
|
||||||
|
"0x4c56a968ab57aa36196bca9841e308e4ecf366b21891cfeeeb4a7741caf00bdd",
|
||||||
|
"0x79e087e68abf35a76d839a0792932730441d2f57506fe7db72b9b91b3fbb50d9",
|
||||||
|
"0xad2df80333074a637b0afdf1dca51759ebb10d7d443adf507f41a99863b2c7ef",
|
||||||
|
"0xbdc6c77a8ee0b979cfa93d42e4b87c9aee8b0c19e6f19206008a5d1083909478",
|
||||||
|
"0x369810909434600983003d17fd321e7e73dc4b8ad0e73d925caf499f2b836690",
|
||||||
|
"0x4d3749a7865675e8a3ecf2b1af4b7c3250a311ca8d20449e71d6d8ffa33a7536",
|
||||||
|
"0x7286924c10b2db63e61041976ca7c6bd3d6b1ddc69eac4dac03427e0460333fc",
|
||||||
|
"0x33edb799e39ee239790c7d3a6349218284a61847a235f9b6978accddbb57467c",
|
||||||
|
"0x0f131efecd5a1deeb5267f4f99e64ad2dc84532f7698802fe500daa8c306c1e6",
|
||||||
|
"0x96f48183924cca8948eeb08c3c5320aeceaba747c7f7ccc321cf17ec0704ffd6",
|
||||||
|
"0x87a8c9e79f17968814cc145bdb1325a2b5740cff68f1ef7fc7ae42f20729287a",
|
||||||
|
"0x3c9d17093214572bfe4e6438528163d7b6e24228dd15ec1986924f07e8b9e197",
|
||||||
|
"0xe9c033c63af4230d352ee370bcddbcf79a284e113ff5b8f559d5d958a6648f2a",
|
||||||
|
"0x331c86081b46499c6c0b23304f562afdfa467ae8b390e22718f2abd96dbb6c2f",
|
||||||
|
"0xf783b03698791d07c2ce40bcd9f69e6f04a4041cecdc85e17b96e6673f57d9d2",
|
||||||
|
"0xb886c566152b6f0fb43d8eaae97d8f6698caaca12845f63e6b98872d7be91429",
|
||||||
|
"0x70abce391cbeb52597c5cd3b3668e33aded768c797a1c27d22ef827c3c82e516",
|
||||||
|
"0x37b6b2d24a95cf8837b6345b7646e48942b1dfc26bbe8a0026715501e56d1d71",
|
||||||
|
"0x95d0f6f51d5efafcd395e79b83facd5886c4cd68fd725d68305a8bd3e73fa818",
|
||||||
|
"0x839db36c5e8d539cd87c2fad2221a95728d201e27aa0f21e48c61a4d50088e6e",
|
||||||
|
"0x85370ab2418ca50bd86694bebf26c9fd59f7b737282375f1a53c06d1aecdacdf",
|
||||||
|
"0x42270a3434074b79bf19b043bd5cb7a819d5639461edd5eddc24b336fdb39428",
|
||||||
|
"0x105f93a4dbaef09de92dcb0fde88051d7cc267ed11ee0433c2840ccea459fc81",
|
||||||
|
"0x2b97bb02b8447cab790dd30d312471385d233b89dd135c0fa59ed763f7f1a5dd",
|
||||||
|
"0x39d6aebdd41ddb3937963660a188b9e840166fb249c2859cb442588ddaeaa2f8",
|
||||||
|
"0x635d327dcea329de7bae55e025d4fee8470ffac2ecc8a87cb2a796b822cfbfdc",
|
||||||
|
"0x53b87772eb46bcb5dc54ee6f2fe0c8ec1384bf13e02057cf2fc551c657a961c9",
|
||||||
|
"0x9cf06b583c647f8c5e875c6d0cba5ffff00052620c39d49a04095cec4d4c8c51",
|
||||||
|
"0x917634c039976e153be529547de0799bfb23b733c5edc42e1e54b3e6ebe55d11",
|
||||||
|
"0x108e5ff2b56ae17fe3dc92203f454fda904dd4e15f4732397fba95f38b632f98",
|
||||||
|
"0x4bd32df511cab41fdcd3a502704c74f3c7b0eccd352b82b4c3c28b0a844fdff0",
|
||||||
|
"0xd8e04779971d970f01a77212d1ee2b8926d12194ecfb756f9f83b524c072abfd",
|
||||||
|
"0x1f0226a32fd46224ee3d9b7424df992847a711660fa1777ee8ec699a255a3046",
|
||||||
|
"0x9dbdd6b26f1fa61ae7fa8c31bcb259c754e2827d6c6f6e7a604ea84f54770255",
|
||||||
|
"0xaa59f69dc2ac48f6e2b06cbf95e68ab1d0971ef6ea4274ac4e24263d01a2d0de",
|
||||||
|
"0x217ab35702c7c959e994c09f9a8bbd939b9711c3a6c4a57d03b02d615561cd13",
|
||||||
|
"0x8016f4e0ab60e64c8ece505bc77fd8ae9a73e663200615679692057588706ae7",
|
||||||
|
"0x1ab438e4d7e7ac9e9157c2a43fcd730f7b3bc70676a302784d22dc6e9d7cc1e8",
|
||||||
|
"0x902a3b829ef54cd702094667296ff452eff0aabd04f76046cc799331da7296b1",
|
||||||
|
"0x80d14802bae3c50cda30a6830db5122e72f7dcc67544d33857e1153a49bdd710",
|
||||||
|
"0xaa73faa4c36e080065a0640acfa4cdf16de65fe6aa1b0ed74d20ab01ef675b32",
|
||||||
|
"0xf129f354afb67cda78b4f05e531e0553b512f8238278a7388a8ea2a26d4fd5fb",
|
||||||
|
"0x8ac7e8a496a2c3465ce049ed69c0f1a671714369856d705c1037cbd193106dab",
|
||||||
|
"0x0167c76291a52cd70b1302ef3bca9e8449d071761c1e5520219d70344e0b39c5",
|
||||||
|
"0x0796256c466d0f1a706462c642813620e7acb3ba0e17b606bd464edd52e0b491",
|
||||||
|
"0xf9e68a276fb7585b978ccd0a5d4cb07851fab909fe223e1534897574745ac585",
|
||||||
|
"0x215b53c58f116b3d45669d5257644b866639eede3eebdef04e171d9415247eb7",
|
||||||
|
"0x69425708be100d1e7402bea70be42a2dc981ff3a4d7c8c5c859283c06d1283c9",
|
||||||
|
"0xfb0b4c899f6081eb3e2b4bd4d32554c0c34199731d3f80976ac3885cd62ca5d5",
|
||||||
|
"0xe07304905487800ca8bc3357236b5b4971ccc884612d4c3a0fa903ca4ea399ae",
|
||||||
|
"0xfc0e4e84ccf10d44f338d76dfd0562cd47db6758dc7f3eb08006dbcd577c5dbd",
|
||||||
|
"0xd198d19f531de16e174f85a4cf6d3d2d0f326de398f027223f34534c9a6e8634",
|
||||||
|
"0xf5f6dd24e48fe4b37a5098700dea861fea66c835e81269ec20b911fa821abc8d",
|
||||||
|
"0x6930e75f5170de31a5cb2f899db422feb51f080f83f49be83951eecb5f913793",
|
||||||
|
"0x5a8d5ffc0944ebfa1273e0162e766fdb34fada198583876f0931e331ac7164c8",
|
||||||
|
"0xc6a5ae3002cccdc6bc302c68ce171dd83c385444ab5c04c66b19bf67255e298c",
|
||||||
|
"0x05c8c483696d2aaf79f985706ff9e84c9ad08defe8399531aa0fb3d32fea316b",
|
||||||
|
"0xc226d5d5d4df247a1e5cec4fa6fe43605e9ecd27bb07b9c220c4b6ad5a4e70ad",
|
||||||
|
"0x312cca0e8c4b55bb84176a54926d1366dd5928d9859f1d2ad2991e0fd9624b79",
|
||||||
|
"0xd0aac977184cfbdf53ee96ffb2e0bbcb85a202b5c6ea02f9989972c70120468c",
|
||||||
|
"0xdb3b8102d9a9a363174e138b292ca67020f31fc819cb15c5cb9ee34ccf2d2f8f",
|
||||||
|
"0x1a50ef2cef7ee171832dd9e9162125e51e6ae7c27d08753c30c4a03cc68cd473",
|
||||||
|
"0x292ef1d673e8441c3850d68ce27faeb572083864ec22f09220cb9f4fe32d560d",
|
||||||
|
"0x0cd5290d348d7462f747030cbd8a38636f1549023f8f6379c244b91420312ab5",
|
||||||
|
"0x2a35347668b072eb67d478dfe9146822e77ac78abb4b69cf57478a87c4f5b794",
|
||||||
|
"0x70d10e3336ea822d3385352737397cdc660ee71e07158fc1ffd711d249daa841",
|
||||||
|
"0x1f9d182b5e755e9c0ab2f77a9f302b01241c4d235b5b717237b96247a9157141",
|
||||||
|
"0x93ef750e15a936c2fd6f047e65affabcc2c0b5bdf3cfb160402dd0696329a654",
|
||||||
|
"0x17c7f10a273615b0f8df2044396e3f0aa33b46ad053bf6ec6dbc32273e66c4b7",
|
||||||
|
"0xc249c69c4c2d40dd9d0a7fde388824ff734f3b8c2868d1e824a52b32dc05e58c",
|
||||||
|
"0xc1c1f0f9ff1c472a7e84ae89f8da22575df60fa7f9479fc3638f2f0d02509010",
|
||||||
|
"0xb563144ab0b85113b0e30109cfbde500c28faafaf922c81939dcf9f1ea469752",
|
||||||
|
"0x80f88663065d058d2db7e55df1af8035c810e36a6589f4b1989794bb32e337c6",
|
||||||
|
"0x25905f6b1188bb66393a10ee044c6bc197627d83301f766f4900d36cbdbdf8e3",
|
||||||
|
"0xb73cbb759230184289722513df452814de312c90f8726e77b129b6e37e5e803f",
|
||||||
|
"0xff19c1a15bf598da49fc91d04c7401c88b4aab08fa926e467779fb14d8f8002b",
|
||||||
|
"0x71d46f2c6a4d7291a9906df0beb183d495248599e40c41da6ad30ca3fe37f43c",
|
||||||
|
"0x5a00726405d2db913571b141053892aa41faf26644c6788c16c8f417df49ede2",
|
||||||
|
"0xbb046094f514ccd722d224a2bc4b6b473c760224a7b36ba09a21f149cc244e1d",
|
||||||
|
"0x8b0d483f156f390376c526acc219070a9c393df731b7115753e934af20940621",
|
||||||
|
"0xead2c2100390e48bf720d19378964dfc1d0071e28c1d799b2d5d529b118290e8",
|
||||||
|
"0xa4169df4e2f8662b43845598c58a591e6fd17574c0d567d7b702d3f12d4b74e7",
|
||||||
|
"0xe14c4be058238b81d8025fa71abb580aeaf52d4cc3aa4f05bd5b24be77479fe8",
|
||||||
|
"0x81e58c707025a640a9b014046559ee7f827142474606ac24ccbd61557b0a7745",
|
||||||
|
"0xc1717626f785ffd170697d0bd148226d1916f16461796dee609f59ee5eed3423",
|
||||||
|
"0xdbe52fc3e71b136881136693f3a318d9e3257e6a0384d17768cba6c84b1e3ec3",
|
||||||
|
"0x7596e35148892b5831e2111a168ea56a59ede2f2222a08f8d82fd235f09cb267",
|
||||||
|
"0x130fdf1383873279e44ba21c7d1d6f962ab3d71031270a0e5f57f12f90eedcde",
|
||||||
|
"0x0d52be29476a3b4ec79a432554198255be617f50ddfa6d614ff5b73302c44067",
|
||||||
|
"0x3f1edff4b943e5fa15bddad5ab9e3248db0335359af255fd6efb66c8b63bce69",
|
||||||
|
"0xad9909d1fdd9e1de3e6cbca641e42a87e3fa254a0498085790b3e44e6ee42045",
|
||||||
|
"0xaa166286f4e1799f9ed1033861eb8b2117810d08dcb29cc3f7a3fdcb05989780",
|
||||||
|
"0x11401b423d204a1df2e918882c3f795e9cd1695ad0badd77532bd2512eb7d1a8",
|
||||||
|
"0xa738bfb7ad265db50854afc6d8988d5342ba77d7021ad5d5a45efd582b6b6bec",
|
||||||
|
"0x25051016399b94cef771f16cef661de81bca5f3803c96c602dac42d395679c15",
|
||||||
|
"0xeec18e2c9d76a98455ea4e50f744926a13b9ac8c6d0f575128787cd134ade901",
|
||||||
|
"0xaa4a38ed3e461643c1acc765ed8f27262eae8ed1dfd6659c4e4e1ea080f42363",
|
||||||
|
"0x42760a8066850088424917edca117faf1df6a05221216479aaead8ba11286400",
|
||||||
|
"0xb3503c3841ccf8bc2853eaa618435036b976c9e77d1e1081a5fceb036091f9d4",
|
||||||
|
"0xcf5979cabf525d5b6cc1199358688fe0bde640f6ed95dd7c30a6f42a38337cc2",
|
||||||
|
"0x713df6a565efbb13da4161b545908ac4255af1ce8ab229146ed00954b3c58e4b",
|
||||||
|
"0x9ff3a78a18a59687eb99e54ac79df1ac920a3361b3b5416dbe95126f8de3074b",
|
||||||
|
"0xbaa888556f1a519b1b1acd01b4ebcd9132dd55bfec1bef0ffae9408152333fce",
|
||||||
|
"0x5ced4fedd95a4742ee250948c233f59587eb1624e3adcfb6662f9d81b5517bad",
|
||||||
|
"0xac1d2706dd82b142b8a629b42ea5c4f13286af59d24f21b3bc36ebdb4eaaeeb6",
|
||||||
|
"0x1d99ca18dd1d872a4be8ed45385d0898215041f54e7c8e7f3252ca212b4eba3a",
|
||||||
|
"0x1dc60cc7789fb6b25c3d27868ac49136e09f6bfeb09a20061781ef14cb7c670e",
|
||||||
|
"0xaec01b8047a0693e78b6ed445396dfe6dea247997ad32747896ba0e30a20d2ea",
|
||||||
|
"0x977779b6e2da8fde03c1151537d2e03facfd217650e862c3fef07af71f34b507",
|
||||||
|
"0xa1634dc9c2bdb48762a7bf7b41b74a2e8d4d731b15792044cff1ac3b416fb28b",
|
||||||
|
"0xc36b6333c28344a360214708798c125adb5e2cf8a2145a216e303186b85a8f91",
|
||||||
|
"0x1196ee872385c8fea747eba6f5b4fc6f30817714e86c28b657c24593ded2e0ef",
|
||||||
|
"0x8dc3ccff642a29b46266eee8782b9a9ebcb171ba154c5dca0ca5f73fe24969b0",
|
||||||
|
"0xa9dbea651bb7a362e526744229b3e1807705ceb492a8e4bc54a9a1f36102a9c3",
|
||||||
|
"0x0bc82693277412688a6577a6bc95ce99504a1a50904f49b4b4588538f506fbf9",
|
||||||
|
"0x8df943b0847f1de48f76d6dcaec5cc7b0d7d839ec5e6c8c887f6e5cd785f53cd",
|
||||||
|
"0x92f4a5577743eb6c34134fa7867cc7d8836fdfd4000abec8cbf1460d136054cc",
|
||||||
|
"0x047f5f8332e788d1b6be8a3ecbebffa80ad6df670cf4eb4e76a6f22c5781ac14",
|
||||||
|
"0x392652a55a85300848f43879d9a45d8b7fe5897467743d51a9208b2ac0dc029d",
|
||||||
|
"0xfa2e6a2cdf4949028be0772f9513169815fa9af20c53ce188680f09f57efa671",
|
||||||
|
"0x0b86c1c1e683a9e6debddb8ef516b16fb15709b87dcd780ad6cd7f9b9080f4d8",
|
||||||
|
"0xc8e942935b64b294ff66d4fddc51fc83b0097772bca50140e738d4c034b09cb4",
|
||||||
|
"0x0b783f8b64650bad1753e4f86fd66b99d7ad03d2da0460bf44965a1f443b70d9",
|
||||||
|
"0x8a9aa339e78f09ad3d2ffe3999c22684d519219b787ac3cc64c772d1e6508392",
|
||||||
|
"0xb8a2303cb9d927badda947a962311c699a290545b597f0d242f669392076facf",
|
||||||
|
"0x34a1bd076dd55dc6eb2e675c5231b3cc8f2a197194c86242c9c5c052a6859d28",
|
||||||
|
"0x0623254a886ba8bb191d3340e9705ae52e71df2717c6e84bd07a759d1f415d91",
|
||||||
|
"0x37d451749a48d1cf4780f28360c5445d3b749d8b24f065db07b8df89facab6b9",
|
||||||
|
"0xd73f2404b935580681cd7f6060b17ff569f7419196e67596f101b6b1d1d913e3",
|
||||||
|
"0x45029ea3cd0d90900c46df72e6b182bba69ecac1a9289a4719b2f6008f11ffd0",
|
||||||
|
"0x23315337a4609580ca1835f370575bbe025d2ba5447b61e583119757debfe35a",
|
||||||
|
"0x581bb3ed8dac28e597d89e9a211bce6b011a4b6dabf001597b68e5e8c6ab7c8f",
|
||||||
|
"0xb71f91dc1a2eae9ff7e0aacbdcd3d8a77302437ba0e9d327790c5b92c7603ac2",
|
||||||
|
"0xde661510c4713c64961a0ce9db1eaaecfa509e66446998450178c0afb4f5a670",
|
||||||
|
"0x9070334bbe9fbda52e42939155c43daa239833ed2d952eaa5eb4d5fa8d56b708",
|
||||||
|
"0x7dc07b309fa5e188f2e417525e9228b80f84c6c36ac00cd3e49defa0e0146e15",
|
||||||
|
"0x2e9ecefa3e28f4b31b876e5d9214877ac00be6e7eb65a26990fdd5a2799dec54",
|
||||||
|
"0x6c4b8dc62fdb63d5da2e1387a50759e82f00f7b3cb9c4306d98fa1a4630e0136",
|
||||||
|
"0x1244fa807ba8ff8a27b88ea1146c3386e96995ab1d7b0f491efedb89a2400028",
|
||||||
|
"0x7b18bd023a26e920b03e517b3399304c2d277045d2bc62ea7ca0ff8dff1e453c",
|
||||||
|
"0xa71afca6a9475974486a698a897c34cd6b5a7dec8023c62bf252f60b3d63c306",
|
||||||
|
"0x4162c46dcf1961704d020fb0bbee7f9c0ea85f4dfc58d6db2c09f5ef0df543ec",
|
||||||
|
"0x651d2fdf296254f97528a2f7b2d2395438b1f58ed11f4d1cc076f1fd04912824",
|
||||||
|
"0xc2705774d530011afebc9430c39aaa28e27962427e46164822bfd6da9948887e",
|
||||||
|
"0x9c88eb61fae9cc442bb10503b32a439b771f8ed67d626c4980ccb3d53cd24fde",
|
||||||
|
"0x8f86c85d3df630b1f292217035ede6ab978d9388fb6bfff402419c3de0a8406e",
|
||||||
|
"0xf8946728a1deb862861627606bbfb887e66d743d47fe03048b9b1799e083c5b3",
|
||||||
|
"0x023cc1ee86a5dc550b934e28e668e3de2c0a925c9c0dc9fcabec34d33da07a75",
|
||||||
|
"0xa40e3c2eb6531a40239499165490be2d6a986f356c3e50c4449a81a9ee037df2",
|
||||||
|
"0xe85b21c59987f25bad5ae1ee09dadf22ab33530cd907ed72819ebade1e2b84f7",
|
||||||
|
"0x9acd8cc33e4e79adffd4fd50fab9ba6025822f2510b165d547c3bdc037cb7629",
|
||||||
|
"0xb07c7c23039d83efb37b63873d4c7dabcb4e9265bad35f9a1667114159cbefe9",
|
||||||
|
"0x3b470afc97f674222850a489a3c845a1c68384c88c03ee3946ceb90924c7554e",
|
||||||
|
"0x669492bc00a496fcfa5920c9617f74170242d2382c4cd231d22e48e991b12687",
|
||||||
|
"0x0e4a605fed37c87fe9bb0de8ee63f571785aa3da8767093cda45da51414a38ea",
|
||||||
|
"0x5a25cabd5470cf246164f60ca6c963a3960550e684ca051958c2f768af92e227",
|
||||||
|
"0xf6dc542a83245efdddccc4527ce125c5e4409045afb2e57e11941d4d5c21015d",
|
||||||
|
"0xca22cafbdd6ce48b7cd3700090a5b9ce0dcc267a16e5a6e55df4bcbf681f7e88",
|
||||||
|
"0x9d89784fcd3cd9a0fe85b82d2329a1561d46026abf132289126d001cd6507bdb",
|
||||||
|
"0x7fe02ef1e87c7b1294501dcf0fb97fcf5b8f2b131ea00b3559dba67feb7431e1",
|
||||||
|
"0x0c5870d20c5e086520c1a4fe39d09933da794f49b5e4db186b7fba5f55751334",
|
||||||
|
"0xa6664e2bafcc0b548a41c272568d2a3ffc0328f64c3f4ac80e3c0dca18253ebe",
|
||||||
|
"0x539fc6955f7ceb8b9b662534e98512be388ed59e3e3b2fc21226569c3a85f272",
|
||||||
|
"0x1f4a0c45d47e378f8c0cbe4603e6e8ef3131ca7cbd4a732a4c5a081bab3cb381",
|
||||||
|
"0x1be1bc472e060fbaeedee56fe03a42cd74afef7321904c64ca7d384ecdf39be2",
|
||||||
|
"0x3a74f2b96cd47864ee7b113651a176c328c23059e9b8f8bc2111a071895d2bb8",
|
||||||
|
"0xdc05d7314a2fe10122a1a4f037b96e960ce344202328932e8f069d3801881606",
|
||||||
|
"0xf5b2462912f2a53b8261d4f63e788289213ca566ca915f59969c79b6698aac80",
|
||||||
|
"0x8febf165b4673b4762bfc7d1c4f8a82cdc5649065f080bf00e843a0ae3f3dd53",
|
||||||
|
"0x1ed2f84e593f6356522b0bd4606209b1291518a7ff708d21ad8765572292f3ad",
|
||||||
|
"0xb7af3b32db199c91881f8b7d23f53376c310cc1cee191cd62a1878a229dbef3b",
|
||||||
|
"0xd5711bb07409bb27c5fb8164cb2860c0d6583e5f5f5882c6e6e74b0cfca540a0",
|
||||||
|
"0xa8d7cc512c42b6028121f6114b974163f687ac19a5c71b1c25789a7ba8f38236",
|
||||||
|
"0x72f3aa7c612ff18149497e90fdc03e766686e37209573a3e5bf144a9a010192e",
|
||||||
|
"0x6950075793f3170d754bc05fdb31856d6d15fa389281c7e4f73d8c597b1aa4da",
|
||||||
|
"0x34f1a8805f65b0a09f1e5523a53d35cfc12dfdecc22e47efc80ce209d40dd514",
|
||||||
|
"0xc348d949ce4bd0299853e6d616dc292a8d33485ad93924f7b9ce64666594a44a",
|
||||||
|
"0x0f828822e7a2250d0b8f2b819ff27631f5d50a3168874ba1c1922babce345fe5",
|
||||||
|
"0x92c5275a7bb840f9ea612340bca5275dee489cc7e2b13e6037ed49b3606ec01e",
|
||||||
|
"0x29e227f64c8446f49611f9d2dbe04b8328b8165193b5a0a2ad8c337e60d7ae74",
|
||||||
|
"0x4032647c4576c6e4f23dcf87377e7a403ccccb4785e276d404bc8e6fd66aebf4",
|
||||||
|
"0x971070530b371733bf83599364270fde641d64155807d36c8ec79e73e3c990ac",
|
||||||
|
"0x52d8cb01d3999e01141667df6f11143754e7cdc1b12f5b5bbe5e16f51af1acce",
|
||||||
|
"0xdd821e13bef48af8e79041e7a5e28db421502e98aa41382d2a89480dadd0e7e5",
|
||||||
|
"0xa785dea19433b90dac8703f0b075df9d3c91394826e6b8b89abd806f5cec6ce0",
|
||||||
|
"0xe82804babcdbf1af8f6fac1dd0076550928c372d0a9dda8c0560a6f378e2c970",
|
||||||
|
"0x1dd41ff3d620b1ae3725debcb26edec36cc219292bf651fe9305a0fd08523042",
|
||||||
|
"0x9e2d84e8a10b32fae0b29b150f747041b8eed743d2e3026991c31c607839ba09",
|
||||||
|
"0x79ca039f12ab21e7ecb6d6629a501515d94a56a3c24d669474624603a0ed0c90",
|
||||||
|
"0x7cd387f75eadccb5aea925124377d09be0e7b4a9af6463dd649213c5af521236",
|
||||||
|
"0x31fa2bb5eb784c0dcbdeedc7d439704bd44294ec2bb1b4f49e6bf508381ed521",
|
||||||
|
"0xd0772b6dccbe61b5b2cbec0a95a9542fb9b89e9a75b8324e05855039c2914dcc",
|
||||||
|
"0xddcb84f63b7469935bd4f6ec405ecd619a5539c89c2cd28250065ba9b4984838",
|
||||||
|
"0xd866486a928c2a69b054339b5e57bde41149c63e6e16c066046e3fe8018cba2b",
|
||||||
|
"0x7246af9a036f7b773bff1b2f9b388618402738e6bcd03c354816c507aa7fdebe",
|
||||||
|
"0xd16bd03e80088d51f007a7068697e19cc91a0daa96816ab336135b0e1bda7e1a",
|
||||||
|
"0x3571d1fe22f56864df7584f73958b5cf9336b6afe6702cc4ec9d1f097c4fc58d",
|
||||||
|
"0x74e19b61d2a511e2b067662bb61bf93241bf538d74face662561a5d170c8c2ad",
|
||||||
|
"0x01720ba8bf55fe1caac98a1cc5843f24a1376bbd08cf630c9a39fe219ec31b68",
|
||||||
|
"0xe2d0a0e01f6557e5ea96808c0cdb7618d36bb5bdbbd1d9e2fbffc07672a120cd",
|
||||||
|
"0x0ff2e856f17849a4349c70aa6fe2c04d7fffcc6e41860774210c2c2a0208f2c0",
|
||||||
|
"0xfbe09f759660388a823894be477df3491bb6c51ef7df038dbf12ab9c122b358f",
|
||||||
|
"0x9e610db00a109f0b4a4cbb094b88680f62dfe5d3526bc83377645cfcf6c03b18",
|
||||||
|
"0xe7460e14d9b5365c3b1306eaca86ffe4f996f07909c16bfbd731443d91df1931",
|
||||||
|
"0xe7c05451729b5eb5b61a3f159d522424fefa1b30f3929366289a89b714f59609",
|
||||||
|
"0x28055b2961079028d017758cd43b12e4046fca9a1ef53e09c3a4e0da3f8ff197",
|
||||||
|
"0xac65523c531d9ca6551cb6b9336d1e78671c7aeee7208f30548b3c010d79b15a",
|
||||||
|
"0x3c6939d2ef02c1c6e9aaf6aa1119fd4fa2682b71d5b010708a59144641b794ae",
|
||||||
|
"0x40cc42a031994649aa861a544d6fb7c02aabd574a5b14d26e7802d5cf2574e36",
|
||||||
|
"0x054cfeb8044d5dffd1577bf0e45dcdc53d15c308cadcc4d022d3c0dbc292efc2",
|
||||||
|
"0x337dd5519a0f33011f3d27da8e1d2cf43dc249597f199d5388cefa6200e9e3b6",
|
||||||
|
"0x3263b6e7d5c31f7873fe32542124bf2b11ce9520c629bc8b277e1dc9152717cf",
|
||||||
|
"0xce5e58922cf860beff17177cea7aa6c0e789233ba1b15cfaab6896c45dab7e3e",
|
||||||
|
"0x7b5bd2a6e19812524fc1c1c9c6ee8b970ddc3684b4a5bc3fe865dc28726032f3",
|
||||||
|
"0xbb76c2c12be46fb4a8d18e15817f9e77547acea67f71cd3bf0f13ebcf674080c",
|
||||||
|
"0x300838c866e4c8ec4e7d130a3191f3122795c26757ebeac2d51eb69f19319624",
|
||||||
|
"0x53b73eb4f155c5f126802db8f2a64ba08d93972743f3308454be1c0c68c7f4e5",
|
||||||
|
"0x4e0de18b8bb30adcd9770ee1cab2e0fb45225737e382b4376b08d4e64fab577e",
|
||||||
|
"0x3a6ca6bdeee957b6ed7297760bbcf53bc5b9945ef1fecfe8c9dbc077926d519a",
|
||||||
|
"0x014dea0c5dfe7db3b67349ebed21bae42f40f02857456827c72ace435b6b8632",
|
||||||
|
"0xa0b1b3f7f3883d34cb1ee9789c36b607ada517c526eea23193a786d72196ee1d",
|
||||||
|
"0x2bc8ee35c612ac2a9c9e5b97d6d3b9c458f7d8825c89c2d593faba38ca116357",
|
||||||
|
"0x6d61cf0212c61b9c608d7b0a5b2395e9ff41a815f429ed05abecfe350fa5c22b",
|
||||||
|
"0xcd284b589d6f3ea56a8eac1f7e17d4932c809ebe955300c3b1da554f7d0998cc",
|
||||||
|
"0x56b3afb245b853cb2cd2a9e6b938819db181b7541003fc298347b646cd0bd894",
|
||||||
|
"0xe24a047cf216f0837c52bfaccbcf4810026bc374618465d94480d5d222c37ec4",
|
||||||
|
"0x5e80313f3a14f41e63ae80192b79456d742e0a43d89e505d938e5d0b164a2b6c",
|
||||||
|
"0xcacdae3d23fd91db005624bd007f1f0c9bc48ee212e6ca2aab8b189b687b9f0d",
|
||||||
|
"0x2a0f603aeadf258feaf46805767fd42a61ccc3f031f42f131c4548875a887ba5",
|
||||||
|
"0xf90ac12554e9929db35620b33a5b61cef0cea7209a83f9ab44937dddb4c96bb3",
|
||||||
|
"0x1a4eb8628a48f763284900ffbd01107879f41c9479bc76c139db520d34295fc4",
|
||||||
|
"0xe0b600503c7f112ccc29a447ccd1c85285a304b403aaf0d227b3a7c7ffa4d9b8",
|
||||||
|
"0x1ecc791b207e1d79e10a9252fcb35591b0cabf71910eb50bde734ff7a364945c",
|
||||||
|
"0x7dc509f4b620ccc2de77ee7064b910a831a577008b8f099b76c2c9382c4ab31a",
|
||||||
|
"0xe94bf1b965b4a10ea548653cfccc63720c9945b3f02785b650c9ed26047855c6",
|
||||||
|
"0x19001b2e4a67c28e925ee2656aa6b8918c3b6d785101f4810ac9ba46cbd80d0a",
|
||||||
|
"0x717a34a0113fba177f11307a4b06f467fe4bff06f1bb38fea0c272ccd9256db6",
|
||||||
|
"0x1f8815eb7335b0a2b0b4d0cabc9f9fd97ec2fca78a69fe7c048ca540cdd303e3",
|
||||||
|
"0x56897445682734394c0e6923826b78222719c51dc288529d2ad2ffede4649f34",
|
||||||
|
"0x3c059f0c0e1809877da2fc06b1384e1ab651dee6b373980b0c5c64da57dc137e",
|
||||||
|
"0x7a0a2968b2b0458e653fda06a611c892ea1983ca852e31d916415244f06142a7",
|
||||||
|
"0x4711f167a6332b0dcd27e4530a498d2d5585dbad9b6a5d5e71d4dd07ad57adce",
|
||||||
|
"0xbdc064506c9f16e3a9607e7864ad1b4471c1fc9e0be5f98aefc5a330a33ba805",
|
||||||
|
"0x16d54ff57301af6239313e4b98e163d1a23ce6a0aa82d08e989edd31b24ba999",
|
||||||
|
"0x225a99bdb550da94a9a4717ae178f7def59f799ef36fe9d392a31a344ef6fe4a",
|
||||||
|
"0x3e502698ef85c6246dd7040f311f277f705bc028644a873df537b80b98d1fea1",
|
||||||
|
"0xe6969b55177b17b69d45c8e569fa83d00a75723ce5ba8a4b5ca67202ac5c353c",
|
||||||
|
"0x4358581c44a2caf58f64b86802c3729cf77f2b14df54c18ceac805b219440b0e",
|
||||||
|
"0xab33a0104b936b5e1be1e9d197619872eda67745ecd61f864149ff6932acfc3c",
|
||||||
|
"0x9da92be95e0f0d0e284bd8d2d3ee01b53b60482878b1434726df51e270fdf603",
|
||||||
|
"0x9543a4c4fcbe9d86084fc4b9431cfb8124919413c03f83e8666f2ec6376f0982",
|
||||||
|
"0x7ede3504ac4981e29634f703ac85e69ab389df3ee6f6ae62f6721b500fdddd20",
|
||||||
|
"0xe2ccb0b4c4114f266c9cbb387d255ee86971496aecfb57bd98f7ff1808384e06",
|
||||||
|
"0x971d50027dcde0cc2443d898438b181c772699bc7d4ed5d501258c4a8ba32de7",
|
||||||
|
"0x449ebd55963c7777e5d5523521810f69a5d4bcd6b20f558a2a5f904646dea0a0",
|
||||||
|
"0x5379acbafaa3c16ee514482e0497d4f3938399788f207adc9a77312c11d4aeb9",
|
||||||
|
"0x704ed53672d490277a0fe111fcd7790cd2fb53d94ef9d65196e315d788e38f60",
|
||||||
|
"0xfb0ff7818c21bd9883af9e04f5a2b9e5bb43173c8f791972d410d302b5dbf674",
|
||||||
|
"0x80a5bdb23c110c6acf90e6efc194eabf88d054cf1f27588ca77fbec650878544",
|
||||||
|
"0xdecf2911a31b325760b1df7fc9d9df80f28a6bca798f5503b2f73f93a4404a38",
|
||||||
|
"0x5bf29b9b96265b010a33a4bc05967edfac53c6fb3e8a8000d8c60fa869a8e8f0",
|
||||||
|
"0x24e0a4762cac65712ea029233970aded11c859dc4a5abf9c673664c35078ac1f",
|
||||||
|
"0x68327c02f690d8edd22330efefdb6233e2c8bbcb0c0ec4905694b1833adec387",
|
||||||
|
"0xbef7609a716a8d2623ead6eb31daebfbd9421816c467a4f80d027ba7dc1902cd",
|
||||||
|
"0xed29b3bc58c2dac4b2874e34dcbb83e32fff33b28437260d17edefa4ea1cbdbd",
|
||||||
|
"0x1c11469afb27568d93adc3d9af95075530067a6411b06431016efc05b021e6c3",
|
||||||
|
"0x1c1b432281eaea836c78fc78edc7ba02b3a5d6451a13c556fb46b682b02504c6",
|
||||||
|
"0xeebaab0904bfa1331f72dbc02e73b05303b4a71f2bea6b8e1b9855dd9b2d67d0",
|
||||||
|
"0xad36e72940ba9dfab81721c33d05bad5b412c774026a76ca0caaa8c6819e2f4d",
|
||||||
|
"0x5101be8446b66c40c7c375a663001070c6aaac7ccb559bc088e773f3370e8d97",
|
||||||
|
"0x3be827089ad34a73b9f6f8bbe1c7c414cdbcafc6573f6d987c3fe3e39f8fc043",
|
||||||
|
"0x16d5eca9c07ad9a133cf54c455d27030121482a1db142988d71770d083090dd5",
|
||||||
|
"0x4c2f8374663d94c4677d199b463f16916d307430ca39d36650be11e8dfe39c91",
|
||||||
|
"0xc26e2080ec735af4b67f9058e2289477ad970625d2e8cd7c4724d3844ee68936",
|
||||||
|
"0x49b9428a3cfb02fab5ecd3b603a68df495e36219f5c5a7335237137c9855c70f",
|
||||||
|
"0x55a4f76f8dc95a2a84666954727057845eb0ecf6ee456295739255c8fef23b81",
|
||||||
|
"0xe2efe0ae812195d68c6f8f846ad0fb90240984a444a2b2b5ba1096e8d299c96c",
|
||||||
|
"0x585d1f644a9802cb9a742d373a711616ff5ab0f3ba0a5f685d3dea11b041d289",
|
||||||
|
"0xaf87cda7cde3ff36e1a4a0a3a90e42052a72983f21331d78aba1e4c681eeb591",
|
||||||
|
"0x4f2cc01d0e07e9634505030847ed039ddbe4138ea4b2425e7b24188043b6fdfe",
|
||||||
|
"0x13a10286bc58803a4dbbd59c59dbf3c9ebb605d4ed0417a525fe30575331f4cd",
|
||||||
|
"0x9b54f33798b2d69512c527b1e92017351ea98f7edd956a1744d7ae00acdd096e",
|
||||||
|
"0xd5d636fd588c85c54d6f797ffa674e526caf5dab6e4e87f26c70c4462eef6c8c",
|
||||||
|
"0x47a182d7f196f6cd6f8b8818a9be457ce06fe8b93ef53c5669c756b23a07c5f1",
|
||||||
|
"0x2cebac7f3796b470e9c75693b1a8596bdbd2a89de862ab60ece1957d7b5383f3",
|
||||||
|
"0x7ce7e3078c683ec1573b2cd41b0b5fc62c28af48a23454b177699fec9ab322de",
|
||||||
|
"0x7d4f2be3a45bad9abc61edcbba9d86234f0460145e358dc6566ef623c50b91f2",
|
||||||
|
"0xfdaba3ce59b5e7ccd1f4a9e84bdd5feeb2b135603ffa49b86a7ce89eac635ce6",
|
||||||
|
"0x8c72f673640ed0564c3de1280414dabeb89cfe0ce6f49ebb81c3d7f0b1e6d55a",
|
||||||
|
"0xacacfcbe5ae3d3a9d1b3886bf8ec26bff6f84a23ae5dae8820ea138edb974c3b",
|
||||||
|
"0x3f2339582dc6834395622db187e6798edbcbe2f2e8458c2216779c1bb14d45dc",
|
||||||
|
"0x73a444fa697c736d392cd6d2b347d98734f5329d5910520419f391a443fdbd44",
|
||||||
|
"0xe03bb06673dd6d6e82f2d21c71053e62d3b1dd649d5e7a38150b83b0f085a473",
|
||||||
|
"0xc68461b94228db05a62a234ad0569aefbf31fa59fdba3d144c3a619d05fea871",
|
||||||
|
"0xb44575ebdc05026549326e837692dd60253155f001c7fa6f789568b7a136e8db",
|
||||||
|
"0xad0159409b99c1dead470cd92b3a9d4bfe25266d7400595c93f9276d8d580312",
|
||||||
|
"0x545c4abba819ad9a1d719991a5a0ca289932466fbc62471250e6c9148727a02e",
|
||||||
|
"0x5fa8b86faf4cec2e9de78f071822dc0af0198fcec23e1693e35ebb765d97d12c",
|
||||||
|
"0x2159886570715c7aa819fafea2166c045832707f76958fe456cf7af5ce8d73b6",
|
||||||
|
"0xff22db024b0e036d81383646db787cb0b1aeb713dc3387b788fd43a283a4a27c",
|
||||||
|
"0x7f229da8a815b51cdeb7b3662b7c902238b540ded6f224ce5568514032832ec3",
|
||||||
|
"0xa5e57b07a872a68d2cf2ee6fe73baeffdd4b5c3a423d2a819e67dd73dd36fb83",
|
||||||
|
"0xf0ad72ee27fb47af398972ea5ee5d07ff21091a0ee610a015da1f677ac04beeb",
|
||||||
|
"0xdbca73f967cd079e0c863e9be4194acfd63857fa71ab93c3d4c44dec0f88f9f8",
|
||||||
|
"0x29f4dafd87f712ebbe677193aa86ac807dc933cf0ab895c95feb8c19a46a78c8",
|
||||||
|
"0xef79cedefe4aab625ea24882c8e5493ac4540ddfa7ec8ac72d06d6c264a2a43f",
|
||||||
|
"0x377ad1711a2818e94eff19e349d34a5a7c0eaf3ad514b918efa58d48980f8dc7",
|
||||||
|
"0xca40524371fd62f82dfc73b74acd6f103bad8e81c22dcfe2c3b56d0941a2bf03",
|
||||||
|
"0x14f6e3daa8495585abf5030e856f742b63e2c3b8fab950fbcf61438d203b3481",
|
||||||
|
"0xfab710e7caecd295113ae04e2da94fd089d0cf2ed1bb804fc961bbda414fc78a",
|
||||||
|
"0x6a4ea10fee2a5029011fe25fc6788d1ffd6cdaeca4105b146745883ca457f7f2",
|
||||||
|
"0x3d16f801b58a8a0362178a2de3667967ac8e8e5600dec667098c56534e95c51e",
|
||||||
|
"0xe6b91400dbbe1279d8001c9ebbb951b85ae815e0812b3d706a257fd7cafc72a9",
|
||||||
|
"0x833f7223f1f9c216001b67fc3c5869c012ac7bdadf07a750bf5d504b8da9dac8",
|
||||||
|
"0x1dadfa642e018d46c90e4c9b45e7d22f964c713c829f28e7dd94456efb5ba769",
|
||||||
|
"0x9b0b0f0f9255c2ff2b0c0d9b70baea541997a2981b3e1cec904420c02c8e68f9",
|
||||||
|
"0x0ab920eab62b4a0fa9751d42b4656be510a8724337fe0adf54224cfea0b0e3b9",
|
||||||
|
"0x1669cc89308825fbcf62478c1d6d4a979d730bde70c1512afc0926e0d4e23929",
|
||||||
|
"0x66b011d44e8e971ad3063722cf5d6238c519d57c0a94c760e5c307a3158e4161",
|
||||||
|
"0x0a4ac475f2b54e24784b10b18df0086a92c407e2474479357baccd46086ea81c",
|
||||||
|
"0x988a166c64baeb21ff5ade5d2c563ef93ad0452c67015a1c472b2fc14944fcb7",
|
||||||
|
"0xac583c02f23326514085d3b816973c5907541f1efdb31373b399a67807ad1322",
|
||||||
|
"0x51d7e2b08d025386fb4b335b0d0e2d07f55b9208fff10d3a362832dc6a7547e0",
|
||||||
|
"0x6c4e553f3ce7b7c80cbce8d3c107cdcb8a7b4c89ebca8f1057e526552f1c979c",
|
||||||
|
"0x870d63c54b37873abfc8b0c8cc7bfa2b41261f77550251ab59a8f304417dbcd5",
|
||||||
|
"0x6db3c454f0583e94ba43aeca2c4ef413f80555eaef5829b1c4c1708d63d3b4e6",
|
||||||
|
"0x6cc1ddaf69d050d9b492d559de84c69232e43b7607cb6807933b1801cb4beea4",
|
||||||
|
"0xc7c0aa117b17ceef132579c731956b015ebaf3e802b85ee0a6c825f124a4451e",
|
||||||
|
"0x8bf5ba7ba1184ca6aa5f6915e418e455bb096403d43746ade9b5895fa8d0e69a",
|
||||||
|
"0x13bb12782984d634332842ce7b72a981a17bdd34ee6acd9adbf65844b96d7b48",
|
||||||
|
"0x88a59590e8e1366ec65ddf718dedbb5540a06317613a7dbe130c4a570f7f2963",
|
||||||
|
"0x8a89daffb49834fc7f2341d00151f952ef7d1a7299ab92b3fc926e442d9dad74",
|
||||||
|
"0x78afc35edc10009ad9fa1b51bb7774a48d7e53a960ebdd8818e51899fd8f5cc5",
|
||||||
|
"0x0e25764281bb700a43644ed3455c279969b80f5c537f4096934413a7904863a0",
|
||||||
|
"0xdad129d76c4fe2fc61c1af14ed7556321989efaef6824aee0436216504a36e1a",
|
||||||
|
"0x9e4fc1c9dea1e18cc4147cfc52cab7eaa90930a2b393a442238a8c5378cd4274",
|
||||||
|
"0x08c8c7dc91c967fdb900953d543b4975ec90b8def04eadcf7885c555c782ba5f",
|
||||||
|
"0x07d599a0c521f72463b80cbb534bf4dc605bf345dc1c5de1db13b55486d382d7",
|
||||||
|
"0x420c5f035c465ba9127bc832eb0f757814a6769dd9fce22b28f4a3a3e9cdfd33",
|
||||||
|
"0x2dc76172b77b50b249a5a5b9d5e23595b3310aff6199d7335eb94881d8d24906",
|
||||||
|
"0xd2fbcd5e757bd9eec8698e53088491d63b36854d315d278d1a2bd81988485077",
|
||||||
|
"0x3544b07abaf58fa8c4aa0dd1f0060c11e0de7cc1ed04b18f5f90cc196d3c99b3",
|
||||||
|
"0xe238c7374ba22d723699269c9c943eba814aa1afdb95d5e00707b3cac06a5f2a",
|
||||||
|
"0x1cfadf02760942304c47e07d07a7acbdfe7417c62d330b5802f598a7f550863f",
|
||||||
|
"0x65ad9de6d69c6e80c1cabd34f49c4c9d74b5986ecdf2e3bac30833a599cb792c",
|
||||||
|
"0x27f8b2a3a019abec3e4487fb353bd9ec0ac11a160c6c3a83df6ca959d404aa6d",
|
||||||
|
"0x6c814f0081795e7cdcf730b0807a3c91c7c656132d0d9ec2d9e39f1bb8f57526",
|
||||||
|
"0xec686e5d76bb74cc369ce26db62b742235bcf6ad7e7c5ef6872d62c45bdfd5d7",
|
||||||
|
"0x09941fefe99a62e910b1a0ab5751c36eef7d21b1740f2b9e25d814af27169649",
|
||||||
|
"0xc0cf4f22b4e05e192421baa0af9c888bd976239e70046a62cfb5b018d9205378",
|
||||||
|
"0x6c45ab7adedfa0a6a133d288a7b8ba2d213fce73124d78b0fa12e1360d930714",
|
||||||
|
"0x85872e50c368df9ce35b61d5363ce8db27f123661ae528334c6424a953197d00",
|
||||||
|
"0x6869696612636971deda05c67f663242977351aaaea43d9cdb718be5948f080b",
|
||||||
|
"0x291097a53461b3ec1740b0b61c129d827f0cf731e16defcfede2d7a544bf52f2",
|
||||||
|
"0x438259d8150e73fc0d2ec553a2143e1fa5d3e53e27b0533ca20ab37991050b4b",
|
||||||
|
"0xb1889369c5a7f3385258a7d63dcbe5b05ae2e2ff4ff1e5cf82e5b582a02e895b",
|
||||||
|
"0x3b03ee5f95e9588caaf54878d8b6c746dbeea3e695bf768651fd3c8e3255cade",
|
||||||
|
"0x60443bf8bbbec8f21d35a3d16c5cdafec1dd3bdf4b9c447bbeda74fd92655efd",
|
||||||
|
"0x61bbd3649fd7f9bdab23d6693135ec6dcf07adf1560d9bda68cbc97ae4917b42",
|
||||||
|
"0xc019e34634d76e06d2984f7201c445cf6fa3f72f3164c148de2b1827eed0b6b9",
|
||||||
|
"0x3031e3e27af9bcca0902254143e3a440d40dfed6bd69ee5095387347559fd231",
|
||||||
|
"0x6600ccda7d374610e0c8d0b7fb012bf5cb59966aa0d93f65850db3c6e4544bab",
|
||||||
|
"0x8e692bc730330a2f4bacebaae77983a1831372e64fb9578d42701a305f972ddf",
|
||||||
|
"0xb504ec0ea7de6f102f2b59f698d9f7a63893fa352fbe7d17bf05f9c0e0c7c0ea",
|
||||||
|
"0x8e8d3763f75dfb8c07fc5f609bd6becf34b6a19cadcf52a593cca1098bb2e56e",
|
||||||
|
"0xa30d9cca760ef7f64b647573f17adefe0da9694567c0948c677024388ff51617",
|
||||||
|
"0x61a0157d34d3474a167146c9dee2870b409cd9f96c9d2e530764a296b3b33d0d",
|
||||||
|
"0x625183a74036771889d7177b16cb7bc6982b1a68814c5140b4a31157ff953a2b",
|
||||||
|
"0x9c1fe65834f3733fef1fc14c47fbcbb270c01384975490ec7a483b5a29ab6a7d",
|
||||||
|
"0xf334351dae09bcd536fcf96d031457d0c1158d422adb8980b194da88670ffcbb",
|
||||||
|
"0xa9a92557684b04bfda34805c6588e1cb9fa44d7c73803c28a12a4cce0e46d222",
|
||||||
|
"0x9e5c9a5df1dfb47ea6cf46f0421492ed1613039789ab91d237ce65a1ef6826ec",
|
||||||
|
"0xc3fe546f606cee75b2c28ad343ae67da95b99b507742aa1814fcf472a8874bed",
|
||||||
|
"0x73a429e5ad90697799123575999fa28922436600934689457b0b5ae787e3aa20",
|
||||||
|
"0xbd8ce8cb98c7f263a6b8cb909b671782cb57ee111180f565c988bd97c9369ce1",
|
||||||
|
"0x45a0254dd0944f5419fa6a658a124de3a8fdf53dd799d2ff71fb1256b6648273",
|
||||||
|
"0x598cba26ab789de29b9043f53d02872d6fa2fc86df238d54786b14e4ad8bcbe9"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"nodes": [
|
"nodes": [
|
||||||
@ -2739,12 +3391,13 @@
|
|||||||
"nonce": "0x0",
|
"nonce": "0x0",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x19f0a0",
|
|
||||||
"eip1108_transition": "0x62f756",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x19f0a0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x62f756": {
|
||||||
|
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2754,12 +3407,13 @@
|
|||||||
"nonce": "0x0",
|
"nonce": "0x0",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x19f0a0",
|
|
||||||
"eip1108_transition": "0x62f756",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0x19f0a0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x62f756": {
|
||||||
|
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2769,14 +3423,13 @@
|
|||||||
"nonce": "0x0",
|
"nonce": "0x0",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x19f0a0",
|
|
||||||
"eip1108_transition": "0x62f756",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0x19f0a0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x62f756": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,12 +62,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,12 +76,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,14 +90,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "0x0",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,12 +60,13 @@
|
|||||||
"0000000000000000000000000000000000000006": {
|
"0000000000000000000000000000000000000006": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": "5",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"5": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,12 +74,13 @@
|
|||||||
"0000000000000000000000000000000000000007": {
|
"0000000000000000000000000000000000000007": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": "5",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"5": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -86,14 +88,13 @@
|
|||||||
"0000000000000000000000000000000000000008": {
|
"0000000000000000000000000000000000000008": {
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": "5",
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"5": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -24,6 +24,9 @@
|
|||||||
"eip211Transition": "0x0",
|
"eip211Transition": "0x0",
|
||||||
"eip214Transition": "0x0",
|
"eip214Transition": "0x0",
|
||||||
"eip658Transition": "0x0",
|
"eip658Transition": "0x0",
|
||||||
|
"eip145Transition": "0x0",
|
||||||
|
"eip1014Transition": "0x0",
|
||||||
|
"eip1052Transition": "0x0",
|
||||||
"wasmActivationTransition": "0x0"
|
"wasmActivationTransition": "0x0"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
@ -47,12 +50,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,12 +65,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,14 +80,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,12 +40,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_add",
|
"name": "alt_bn128_add",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 500,
|
"price": { "alt_bn128_const_operations": { "price": 500 }}
|
||||||
"eip1108_transition_price": 150
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 150 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,12 +55,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_mul",
|
"name": "alt_bn128_mul",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_const_operations": {
|
"0": {
|
||||||
"price": 40000,
|
"price": { "alt_bn128_const_operations": { "price": 40000 }}
|
||||||
"eip1108_transition_price": 6000
|
},
|
||||||
|
"0x7fffffffffffff": {
|
||||||
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_const_operations": { "price": 6000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -68,14 +70,13 @@
|
|||||||
"balance": "1",
|
"balance": "1",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
"name": "alt_bn128_pairing",
|
"name": "alt_bn128_pairing",
|
||||||
"activate_at": 0,
|
|
||||||
"eip1108_transition": "0x7fffffffffffff",
|
|
||||||
"pricing": {
|
"pricing": {
|
||||||
"alt_bn128_pairing": {
|
"0": {
|
||||||
"base": 100000,
|
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
|
||||||
"pair": 80000,
|
},
|
||||||
"eip1108_transition_base": 45000,
|
"0x7fffffffffffff": {
|
||||||
"eip1108_transition_pair": 34000
|
"info": "EIP 1108 transition",
|
||||||
|
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
ethcore/res/null_morden_with_finality.json
Normal file
38
ethcore/res/null_morden_with_finality.json
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "Morden",
|
||||||
|
"engine": {
|
||||||
|
"null": {
|
||||||
|
"params": {
|
||||||
|
"immediateFinalization": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"accountStartNonce": "0x0",
|
||||||
|
"maximumExtraDataSize": "0x20",
|
||||||
|
"minGasLimit": "0x1388",
|
||||||
|
"networkID" : "0x2"
|
||||||
|
},
|
||||||
|
"genesis": {
|
||||||
|
"seal": {
|
||||||
|
"ethereum": {
|
||||||
|
"nonce": "0x00006d6f7264656e",
|
||||||
|
"mixHash": "0x00000000000000000000000000000000000000647572616c65787365646c6578"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"difficulty": "0x20000",
|
||||||
|
"author": "0x0000000000000000000000000000000000000000",
|
||||||
|
"timestamp": "0x00",
|
||||||
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"extraData": "0x",
|
||||||
|
"gasLimit": "0x2fefd8"
|
||||||
|
},
|
||||||
|
"accounts": {
|
||||||
|
"0000000000000000000000000000000000000001": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
||||||
|
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
||||||
|
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
||||||
|
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
||||||
|
"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }
|
||||||
|
}
|
||||||
|
}
|
155
ethcore/res/spec_backward_compability.json
Normal file
155
ethcore/res/spec_backward_compability.json
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
{
|
||||||
|
"name": "Volta",
|
||||||
|
"engine": {
|
||||||
|
"authorityRound": {
|
||||||
|
"params": {
|
||||||
|
"stepDuration": "5",
|
||||||
|
"validators": {
|
||||||
|
"contract": "0x1204700000000000000000000000000000000000"
|
||||||
|
},
|
||||||
|
"maximumUncleCountTransition": "0",
|
||||||
|
"maximumUncleCount": "0",
|
||||||
|
"blockRewardContractAddress": "0x1204700000000000000000000000000000000002",
|
||||||
|
"blockRewardContractTransition": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params": {
|
||||||
|
"networkID": "0x12047",
|
||||||
|
"maximumExtraDataSize": "0x20",
|
||||||
|
"gasLimitBoundDivisor": "0x400",
|
||||||
|
"minGasLimit": "0x1388",
|
||||||
|
"maxCodeSize": "0x6000",
|
||||||
|
"eip140Transition": "0x0",
|
||||||
|
"eip211Transition": "0x0",
|
||||||
|
"eip214Transition": "0x0",
|
||||||
|
"eip658Transition": "0x0",
|
||||||
|
"eip145Transition": "0x0",
|
||||||
|
"eip1014Transition": "0x0",
|
||||||
|
"eip1052Transition": "0x0",
|
||||||
|
"registrar": "0x1204700000000000000000000000000000000006"
|
||||||
|
},
|
||||||
|
"genesis": {
|
||||||
|
"seal": {
|
||||||
|
"authorityRound": {
|
||||||
|
"step": "0x0",
|
||||||
|
"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"difficulty": "0x20000",
|
||||||
|
"gasLimit": "0x5B8D80"
|
||||||
|
},
|
||||||
|
"accounts": {
|
||||||
|
"0x0000000000000000000000000000000000000001": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 3000,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000002": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "sha256",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 60,
|
||||||
|
"word": 12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000003": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ripemd160",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 600,
|
||||||
|
"word": 120
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000004": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "identity",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 15,
|
||||||
|
"word": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000005": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "modexp",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"modexp": {
|
||||||
|
"divisor": 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000006": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "alt_bn128_add",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 500,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000007": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "alt_bn128_mul",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 40000,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0x0000000000000000000000000000000000000008": {
|
||||||
|
"balance": "1",
|
||||||
|
"builtin": {
|
||||||
|
"name": "alt_bn128_pairing",
|
||||||
|
"activate_at": "0",
|
||||||
|
"pricing": {
|
||||||
|
"alt_bn128_pairing": {
|
||||||
|
"base": 100000,
|
||||||
|
"pair": 80000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nodes": [
|
||||||
|
"enode://59c9250cb805409e84c9cd0038e97d8e5e4605b928663675869ebdfd4c251d80ccad76267a5eb2f4362ddceb5ec671f7595463adfc0a12e9f68dbf233072db41@54.70.158.106:30303",
|
||||||
|
"enode://e487ebacbdad3418905d2ed7f009fa5dbd17d73880854884acc604c0afc1a60a396aa90cb2741278c555a4e30ffc6ffc1c29e83840aa22009ec92fe53f81ec04@99.81.92.124:30303",
|
||||||
|
"enode://563f12602a117201b39ebeea108185abb15d9286830c074640c9fccbaaaabcc7fe2c95682cc43f95b95059f6d0dc4c9becbc1b2bd78e0c5ef5fddff07d85ba0e@54.201.62.74:30303",
|
||||||
|
"enode://5903b3acebdc4a34800f6923e5f3aec3ca7e5d1285bec4adb9f20ebb0f87a3bebdd748b1849ca1108a9f1e37ff9ced0b475292b8effc29e95d49ec438f244b02@3.121.165.10:30303",
|
||||||
|
"enode://8f8e35a6dcacfee946f46447b4703c84f4e485e478143997f86b1834e1b0bb78dab363d700dff3147442b9d3e2a1c521f79340c436eb7245a97c7fe385b89a5d@54.93.159.98:30303",
|
||||||
|
"enode://bd228aa03cf4a88491c81c5f3ab4a1437df3b463081cc93943c4d3ab37f1e4f8081c6995eca076f717d4fdf9a277c750bd0289477ac151f1e2b024747dcd1747@52.31.129.130:30303"
|
||||||
|
]
|
||||||
|
}
|
@ -17,23 +17,27 @@
|
|||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::collections::{HashSet, BTreeMap, VecDeque};
|
use std::collections::{HashSet, BTreeMap, VecDeque};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering};
|
use std::str::from_utf8;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
use std::sync::atomic::{AtomicUsize, AtomicI64, AtomicBool, Ordering as AtomicOrdering};
|
||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
use std::time::{Instant, Duration};
|
use std::io::{BufReader, BufRead};
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
use blockchain::{BlockReceipts, BlockChain, BlockChainDB, BlockProvider, TreeRoute, ImportRoute, TransactionAddress, ExtrasInsert, BlockNumberKey};
|
use blockchain::{BlockReceipts, BlockChain, BlockChainDB, BlockProvider, TreeRoute, ImportRoute, TransactionAddress, ExtrasInsert, BlockNumberKey};
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use call_contract::{CallContract, RegistryInfo};
|
use bytes::ToPretty;
|
||||||
use ethcore_miner::pool::VerifiedTransaction;
|
use error::Error;
|
||||||
use ethereum_types::{H256, H264, Address, U256};
|
use ethereum_types::{Address, H256, H264, U256};
|
||||||
use evm::Schedule;
|
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use io::IoChannel;
|
use call_contract::CallContract;
|
||||||
|
use ethcore_miner::pool::VerifiedTransaction;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use journaldb;
|
use kvdb::{DBTransaction, DBValue, KeyValueDB};
|
||||||
use kvdb::{DBValue, KeyValueDB, DBTransaction};
|
|
||||||
use parking_lot::{Mutex, RwLock};
|
use parking_lot::{Mutex, RwLock};
|
||||||
use rand::OsRng;
|
use rand::OsRng;
|
||||||
|
use rlp::PayloadInfo;
|
||||||
|
use rustc_hex::FromHex;
|
||||||
use types::transaction::{self, LocalizedTransaction, UnverifiedTransaction, SignedTransaction, Action};
|
use types::transaction::{self, LocalizedTransaction, UnverifiedTransaction, SignedTransaction, Action};
|
||||||
use trie::{TrieSpec, TrieFactory, Trie};
|
use trie::{TrieSpec, TrieFactory, Trie};
|
||||||
use types::ancestry_action::AncestryAction;
|
use types::ancestry_action::AncestryAction;
|
||||||
@ -43,6 +47,7 @@ use types::log_entry::LocalizedLogEntry;
|
|||||||
use types::receipt::{Receipt, LocalizedReceipt};
|
use types::receipt::{Receipt, LocalizedReceipt};
|
||||||
use types::{BlockNumber, header::{Header, ExtendedHeader}};
|
use types::{BlockNumber, header::{Header, ExtendedHeader}};
|
||||||
use vm::{EnvInfo, LastHashes};
|
use vm::{EnvInfo, LastHashes};
|
||||||
|
use types::data_format::DataFormat;
|
||||||
|
|
||||||
use block::{LockedBlock, Drain, ClosedBlock, OpenBlock, enact_verified, SealedBlock};
|
use block::{LockedBlock, Drain, ClosedBlock, OpenBlock, enact_verified, SealedBlock};
|
||||||
use client::ancient_import::AncientVerifier;
|
use client::ancient_import::AncientVerifier;
|
||||||
@ -51,19 +56,19 @@ use client::{
|
|||||||
ReopenBlock, PrepareOpenBlock, ScheduleInfo, ImportSealedBlock,
|
ReopenBlock, PrepareOpenBlock, ScheduleInfo, ImportSealedBlock,
|
||||||
BroadcastProposalBlock, ImportBlock, StateOrBlock, StateInfo, StateClient, Call,
|
BroadcastProposalBlock, ImportBlock, StateOrBlock, StateInfo, StateClient, Call,
|
||||||
AccountData, BlockChain as BlockChainTrait, BlockProducer, SealedBlockImporter,
|
AccountData, BlockChain as BlockChainTrait, BlockProducer, SealedBlockImporter,
|
||||||
ClientIoMessage, BlockChainReset
|
ClientIoMessage, BlockChainReset, ImportExportBlocks
|
||||||
};
|
};
|
||||||
use client::{
|
use client::{
|
||||||
BlockId, TransactionId, UncleId, TraceId, ClientConfig, BlockChainClient,
|
BlockId, TransactionId, UncleId, TraceId, ClientConfig, BlockChainClient,
|
||||||
TraceFilter, CallAnalytics, Mode,
|
TraceFilter, CallAnalytics, Mode,
|
||||||
ChainNotify, NewBlocks, ChainRoute, PruningInfo, ProvingBlockChainClient, EngineInfo, ChainMessageType,
|
ChainNotify, NewBlocks, ChainRoute, PruningInfo, ProvingBlockChainClient, EngineInfo, ChainMessageType,
|
||||||
IoClient, BadBlocks,
|
IoClient, BadBlocks, traits::ForceUpdateSealing
|
||||||
};
|
};
|
||||||
use client::bad_blocks;
|
use client::bad_blocks;
|
||||||
use engines::{MAX_UNCLE_AGE, EthEngine, EpochTransition, ForkChoice, EngineError};
|
use engines::{MAX_UNCLE_AGE, EthEngine, EpochTransition, ForkChoice, EngineError};
|
||||||
use engines::epoch::PendingTransition;
|
use engines::epoch::PendingTransition;
|
||||||
use error::{
|
use error::{
|
||||||
ImportErrorKind, ExecutionError, CallError, BlockError,
|
ImportErrorKind, ExecutionError, CallError, BlockError, ImportError,
|
||||||
QueueError, QueueErrorKind, Error as EthcoreError, EthcoreResult, ErrorKind as EthcoreErrorKind
|
QueueError, QueueErrorKind, Error as EthcoreError, EthcoreResult, ErrorKind as EthcoreErrorKind
|
||||||
};
|
};
|
||||||
use executive::{Executive, Executed, TransactOptions, contract_address};
|
use executive::{Executive, Executed, TransactOptions, contract_address};
|
||||||
@ -80,7 +85,9 @@ use verification::queue::kind::blocks::Unverified;
|
|||||||
use verification::{PreverifiedBlock, Verifier, BlockQueue};
|
use verification::{PreverifiedBlock, Verifier, BlockQueue};
|
||||||
use verification;
|
use verification;
|
||||||
use ansi_term::Colour;
|
use ansi_term::Colour;
|
||||||
|
use call_contract::RegistryInfo;
|
||||||
|
use io::IoChannel;
|
||||||
|
use vm::Schedule;
|
||||||
// re-export
|
// re-export
|
||||||
pub use types::blockchain_info::BlockChainInfo;
|
pub use types::blockchain_info::BlockChainInfo;
|
||||||
pub use types::block_status::BlockStatus;
|
pub use types::block_status::BlockStatus;
|
||||||
@ -153,7 +160,7 @@ struct Importer {
|
|||||||
pub import_lock: Mutex<()>, // FIXME Maybe wrap the whole `Importer` instead?
|
pub import_lock: Mutex<()>, // FIXME Maybe wrap the whole `Importer` instead?
|
||||||
|
|
||||||
/// Used to verify blocks
|
/// Used to verify blocks
|
||||||
pub verifier: Box<Verifier<Client>>,
|
pub verifier: Box<dyn Verifier<Client>>,
|
||||||
|
|
||||||
/// Queue containing pending blocks
|
/// Queue containing pending blocks
|
||||||
pub block_queue: BlockQueue,
|
pub block_queue: BlockQueue,
|
||||||
@ -196,7 +203,7 @@ pub struct Client {
|
|||||||
pruning: journaldb::Algorithm,
|
pruning: journaldb::Algorithm,
|
||||||
|
|
||||||
/// Client uses this to store blocks, traces, etc.
|
/// Client uses this to store blocks, traces, etc.
|
||||||
db: RwLock<Arc<BlockChainDB>>,
|
db: RwLock<Arc<dyn BlockChainDB>>,
|
||||||
|
|
||||||
state_db: RwLock<StateDB>,
|
state_db: RwLock<StateDB>,
|
||||||
|
|
||||||
@ -210,7 +217,7 @@ pub struct Client {
|
|||||||
io_channel: RwLock<IoChannel<ClientIoMessage>>,
|
io_channel: RwLock<IoChannel<ClientIoMessage>>,
|
||||||
|
|
||||||
/// List of actors to be notified on certain chain events
|
/// List of actors to be notified on certain chain events
|
||||||
notify: RwLock<Vec<Weak<ChainNotify>>>,
|
notify: RwLock<Vec<Weak<dyn ChainNotify>>>,
|
||||||
|
|
||||||
/// Queued transactions from IO
|
/// Queued transactions from IO
|
||||||
queue_transactions: IoChannelQueue,
|
queue_transactions: IoChannelQueue,
|
||||||
@ -232,12 +239,12 @@ pub struct Client {
|
|||||||
history: u64,
|
history: u64,
|
||||||
|
|
||||||
/// An action to be done if a mode/spec_name change happens
|
/// An action to be done if a mode/spec_name change happens
|
||||||
on_user_defaults_change: Mutex<Option<Box<FnMut(Option<Mode>) + 'static + Send>>>,
|
on_user_defaults_change: Mutex<Option<Box<dyn FnMut(Option<Mode>) + 'static + Send>>>,
|
||||||
|
|
||||||
registrar_address: Option<Address>,
|
registrar_address: Option<Address>,
|
||||||
|
|
||||||
/// A closure to call when we want to restart the client
|
/// A closure to call when we want to restart the client
|
||||||
exit_handler: Mutex<Option<Box<Fn(String) + 'static + Send>>>,
|
exit_handler: Mutex<Option<Box<dyn Fn(String) + 'static + Send>>>,
|
||||||
|
|
||||||
importer: Importer,
|
importer: Importer,
|
||||||
}
|
}
|
||||||
@ -248,8 +255,13 @@ impl Importer {
|
|||||||
engine: Arc<EthEngine>,
|
engine: Arc<EthEngine>,
|
||||||
message_channel: IoChannel<ClientIoMessage>,
|
message_channel: IoChannel<ClientIoMessage>,
|
||||||
miner: Arc<Miner>,
|
miner: Arc<Miner>,
|
||||||
) -> Result<Importer, ::error::Error> {
|
) -> Result<Importer, EthcoreError> {
|
||||||
let block_queue = BlockQueue::new(config.queue.clone(), engine.clone(), message_channel.clone(), config.verifier_type.verifying_seal());
|
let block_queue = BlockQueue::new(
|
||||||
|
config.queue.clone(),
|
||||||
|
engine.clone(),
|
||||||
|
message_channel.clone(),
|
||||||
|
config.verifier_type.verifying_seal()
|
||||||
|
);
|
||||||
|
|
||||||
Ok(Importer {
|
Ok(Importer {
|
||||||
import_lock: Mutex::new(()),
|
import_lock: Mutex::new(()),
|
||||||
@ -475,7 +487,16 @@ impl Importer {
|
|||||||
//
|
//
|
||||||
// The header passed is from the original block data and is sealed.
|
// The header passed is from the original block data and is sealed.
|
||||||
// TODO: should return an error if ImportRoute is none, issue #9910
|
// TODO: should return an error if ImportRoute is none, issue #9910
|
||||||
fn commit_block<B>(&self, block: B, header: &Header, block_data: encoded::Block, pending: Option<PendingTransition>, client: &Client) -> ImportRoute where B: Drain {
|
fn commit_block<B>(
|
||||||
|
&self,
|
||||||
|
block: B,
|
||||||
|
header: &Header,
|
||||||
|
block_data: encoded::Block,
|
||||||
|
pending: Option<PendingTransition>,
|
||||||
|
client: &Client
|
||||||
|
) -> ImportRoute
|
||||||
|
where B: Drain
|
||||||
|
{
|
||||||
let hash = &header.hash();
|
let hash = &header.hash();
|
||||||
let number = header.number();
|
let number = header.number();
|
||||||
let parent = header.parent_hash();
|
let parent = header.parent_hash();
|
||||||
@ -1017,15 +1038,16 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get a copy of the best block's state.
|
/// Get a copy of the best block's state.
|
||||||
pub fn latest_state(&self) -> State<StateDB> {
|
pub fn latest_state_and_header(&self) -> (State<StateDB>, Header) {
|
||||||
let header = self.best_block_header();
|
let header = self.best_block_header();
|
||||||
State::from_existing(
|
let state = State::from_existing(
|
||||||
self.state_db.read().boxed_clone_canon(&header.hash()),
|
self.state_db.read().boxed_clone_canon(&header.hash()),
|
||||||
*header.state_root(),
|
*header.state_root(),
|
||||||
self.engine.account_start_nonce(header.number()),
|
self.engine.account_start_nonce(header.number()),
|
||||||
self.factories.clone()
|
self.factories.clone()
|
||||||
)
|
)
|
||||||
.expect("State root of best block header always valid.")
|
.expect("State root of best block header always valid.");
|
||||||
|
(state, header)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempt to get a copy of a specific block's final state.
|
/// Attempt to get a copy of a specific block's final state.
|
||||||
@ -1035,9 +1057,9 @@ impl Client {
|
|||||||
/// is unknown.
|
/// is unknown.
|
||||||
pub fn state_at(&self, id: BlockId) -> Option<State<StateDB>> {
|
pub fn state_at(&self, id: BlockId) -> Option<State<StateDB>> {
|
||||||
// fast path for latest state.
|
// fast path for latest state.
|
||||||
match id.clone() {
|
if let BlockId::Latest = id {
|
||||||
BlockId::Latest => return Some(self.latest_state()),
|
let (state, _) = self.latest_state_and_header();
|
||||||
_ => {},
|
return Some(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
let block_number = match self.block_number(id) {
|
let block_number = match self.block_number(id) {
|
||||||
@ -1071,8 +1093,9 @@ impl Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get a copy of the best block's state.
|
/// Get a copy of the best block's state.
|
||||||
pub fn state(&self) -> Box<StateInfo> {
|
pub fn state(&self) -> impl StateInfo {
|
||||||
Box::new(self.latest_state()) as Box<_>
|
let (state, _) = self.latest_state_and_header();
|
||||||
|
state
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get info on the cache.
|
/// Get info on the cache.
|
||||||
@ -1525,8 +1548,8 @@ impl ImportBlock for Client {
|
|||||||
impl StateClient for Client {
|
impl StateClient for Client {
|
||||||
type State = State<::state_db::StateDB>;
|
type State = State<::state_db::StateDB>;
|
||||||
|
|
||||||
fn latest_state(&self) -> Self::State {
|
fn latest_state_and_header(&self) -> (Self::State, Header) {
|
||||||
Client::latest_state(self)
|
Client::latest_state_and_header(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn state_at(&self, id: BlockId) -> Option<Self::State> {
|
fn state_at(&self, id: BlockId) -> Option<Self::State> {
|
||||||
@ -2079,7 +2102,7 @@ impl BlockChainClient for Client {
|
|||||||
blocks
|
blocks
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(self.chain.read().logs(blocks, |entry| filter.matches(entry), filter.limit))
|
Ok(chain.logs(blocks, |entry| filter.matches(entry), filter.limit))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn filter_traces(&self, filter: TraceFilter) -> Option<Vec<LocalizedTrace>> {
|
fn filter_traces(&self, filter: TraceFilter) -> Option<Vec<LocalizedTrace>> {
|
||||||
@ -2401,7 +2424,9 @@ impl ImportSealedBlock for Client {
|
|||||||
let raw = block.rlp_bytes();
|
let raw = block.rlp_bytes();
|
||||||
let header = block.header.clone();
|
let header = block.header.clone();
|
||||||
let hash = header.hash();
|
let hash = header.hash();
|
||||||
self.notify(|n| n.block_pre_import(&raw, &hash, header.difficulty()));
|
self.notify(|n| {
|
||||||
|
n.block_pre_import(&raw, &hash, header.difficulty())
|
||||||
|
});
|
||||||
|
|
||||||
let route = {
|
let route = {
|
||||||
// Do a super duper basic verification to detect potential bugs
|
// Do a super duper basic verification to detect potential bugs
|
||||||
@ -2489,19 +2514,22 @@ impl ::miner::TransactionVerifierClient for Client {}
|
|||||||
impl ::miner::BlockChainClient for Client {}
|
impl ::miner::BlockChainClient for Client {}
|
||||||
|
|
||||||
impl super::traits::EngineClient for Client {
|
impl super::traits::EngineClient for Client {
|
||||||
fn update_sealing(&self) {
|
fn update_sealing(&self, force: ForceUpdateSealing) {
|
||||||
self.importer.miner.update_sealing(self)
|
self.importer.miner.update_sealing(self, force)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
||||||
let import = self.importer.miner.submit_seal(block_hash, seal).and_then(|block| self.import_sealed_block(block));
|
let import = self.importer.miner.submit_seal(block_hash, seal)
|
||||||
|
.and_then(|block| self.import_sealed_block(block));
|
||||||
if let Err(err) = import {
|
if let Err(err) = import {
|
||||||
warn!(target: "poa", "Wrong internal seal submission! {:?}", err);
|
warn!(target: "poa", "Wrong internal seal submission! {:?}", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn broadcast_consensus_message(&self, message: Bytes) {
|
fn broadcast_consensus_message(&self, message: Bytes) {
|
||||||
self.notify(|notify| notify.broadcast(ChainMessageType::Consensus(message.clone())));
|
self.notify(|notify| {
|
||||||
|
notify.broadcast(ChainMessageType::Consensus(message.clone()))
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn epoch_transition_for(&self, parent_hash: H256) -> Option<::engines::EpochTransition> {
|
fn epoch_transition_for(&self, parent_hash: H256) -> Option<::engines::EpochTransition> {
|
||||||
@ -2558,13 +2586,139 @@ impl ProvingBlockChainClient for Client {
|
|||||||
|
|
||||||
impl SnapshotClient for Client {}
|
impl SnapshotClient for Client {}
|
||||||
|
|
||||||
impl Drop for Client {
|
|
||||||
fn drop(&mut self) {
|
impl ImportExportBlocks for Client {
|
||||||
if let Some(c) = Arc::get_mut(&mut self.engine) {
|
fn export_blocks<'a>(
|
||||||
c.stop()
|
&self,
|
||||||
} else {
|
mut out: Box<dyn std::io::Write + 'a>,
|
||||||
warn!(target: "shutdown", "unable to get mut ref for engine for shutdown.");
|
from: BlockId,
|
||||||
|
to: BlockId,
|
||||||
|
format: Option<DataFormat>
|
||||||
|
) -> Result<(), String> {
|
||||||
|
let from = self.block_number(from).ok_or("Starting block could not be found")?;
|
||||||
|
let to = self.block_number(to).ok_or("End block could not be found")?;
|
||||||
|
let format = format.unwrap_or_default();
|
||||||
|
|
||||||
|
for i in from..=to {
|
||||||
|
if i % 10000 == 0 {
|
||||||
|
info!("#{}", i);
|
||||||
|
}
|
||||||
|
let b = self.block(BlockId::Number(i))
|
||||||
|
.ok_or("Error exporting incomplete chain")?
|
||||||
|
.into_inner();
|
||||||
|
match format {
|
||||||
|
DataFormat::Binary => {
|
||||||
|
out.write(&b)
|
||||||
|
.map_err(|e| {
|
||||||
|
format!("Couldn't write to stream. Cause: {}", e)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
DataFormat::Hex => {
|
||||||
|
out.write_fmt(format_args!("{}\n", b.pretty()))
|
||||||
|
.map_err(|e| {
|
||||||
|
format!("Couldn't write to stream. Cause: {}", e)
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn import_blocks<'a>(
|
||||||
|
&self,
|
||||||
|
mut source: Box<dyn std::io::Read + 'a>,
|
||||||
|
format: Option<DataFormat>
|
||||||
|
) -> Result<(), String> {
|
||||||
|
const READAHEAD_BYTES: usize = 8;
|
||||||
|
|
||||||
|
let mut first_bytes: Vec<u8> = vec![0; READAHEAD_BYTES];
|
||||||
|
let mut first_read = 0;
|
||||||
|
|
||||||
|
let format = match format {
|
||||||
|
Some(format) => format,
|
||||||
|
None => {
|
||||||
|
first_read = source.read(&mut first_bytes)
|
||||||
|
.map_err(|_| {
|
||||||
|
"Error reading from the file/stream."
|
||||||
|
})?;
|
||||||
|
match first_bytes[0] {
|
||||||
|
0xf9 => DataFormat::Binary,
|
||||||
|
_ => DataFormat::Hex,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let do_import = |bytes: Vec<u8>| {
|
||||||
|
let block = Unverified::from_rlp(bytes).map_err(|_| "Invalid block rlp")?;
|
||||||
|
let number = block.header.number();
|
||||||
|
while self.queue_info().is_full() {
|
||||||
|
std::thread::sleep(Duration::from_secs(1));
|
||||||
|
}
|
||||||
|
match self.import_block(block) {
|
||||||
|
Err(Error(EthcoreErrorKind::Import(ImportErrorKind::AlreadyInChain), _)) => {
|
||||||
|
trace!("Skipping block #{}: already in chain.", number);
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
return Err(format!("Cannot import block #{}: {:?}", number, e));
|
||||||
|
},
|
||||||
|
Ok(_) => {},
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
};
|
||||||
|
|
||||||
|
match format {
|
||||||
|
DataFormat::Binary => {
|
||||||
|
loop {
|
||||||
|
let (mut bytes, n) = if first_read > 0 {
|
||||||
|
(first_bytes.clone(), first_read)
|
||||||
|
} else {
|
||||||
|
let mut bytes = vec![0; READAHEAD_BYTES];
|
||||||
|
let n = source.read(&mut bytes)
|
||||||
|
.map_err(|err| {
|
||||||
|
format!("Error reading from the file/stream: {:?}", err)
|
||||||
|
})?;
|
||||||
|
(bytes, n)
|
||||||
|
};
|
||||||
|
if n == 0 { break; }
|
||||||
|
first_read = 0;
|
||||||
|
let s = PayloadInfo::from(&bytes)
|
||||||
|
.map_err(|e| {
|
||||||
|
format!("Invalid RLP in the file/stream: {:?}", e)
|
||||||
|
})?.total();
|
||||||
|
bytes.resize(s, 0);
|
||||||
|
source.read_exact(&mut bytes[n..])
|
||||||
|
.map_err(|err| {
|
||||||
|
format!("Error reading from the file/stream: {:?}", err)
|
||||||
|
})?;
|
||||||
|
do_import(bytes)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DataFormat::Hex => {
|
||||||
|
for line in BufReader::new(source).lines() {
|
||||||
|
let s = line
|
||||||
|
.map_err(|err| {
|
||||||
|
format!("Error reading from the file/stream: {:?}", err)
|
||||||
|
})?;
|
||||||
|
let s = if first_read > 0 {
|
||||||
|
from_utf8(&first_bytes)
|
||||||
|
.map_err(|err| {
|
||||||
|
format!("Invalid UTF-8: {:?}", err)
|
||||||
|
})?
|
||||||
|
.to_owned() + &(s[..])
|
||||||
|
} else {
|
||||||
|
s
|
||||||
|
};
|
||||||
|
first_read = 0;
|
||||||
|
let bytes = s.from_hex()
|
||||||
|
.map_err(|err| {
|
||||||
|
format!("Invalid hex in file/stream: {:?}", err)
|
||||||
|
})?;
|
||||||
|
do_import(bytes)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
self.flush_queue();
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2613,8 +2767,52 @@ fn transaction_receipt(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Queue some items to be processed by IO client.
|
||||||
|
struct IoChannelQueue {
|
||||||
|
/// Using a *signed* integer for counting currently queued messages since the
|
||||||
|
/// order in which the counter is incremented and decremented is not defined.
|
||||||
|
/// Using an unsigned integer can (and will) result in integer underflow,
|
||||||
|
/// incorrectly rejecting messages and returning a FullQueue error.
|
||||||
|
currently_queued: Arc<AtomicI64>,
|
||||||
|
limit: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IoChannelQueue {
|
||||||
|
pub fn new(limit: usize) -> Self {
|
||||||
|
let limit = i64::try_from(limit).unwrap_or(i64::max_value());
|
||||||
|
IoChannelQueue {
|
||||||
|
currently_queued: Default::default(),
|
||||||
|
limit,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn queue<F>(&self, channel: &IoChannel<ClientIoMessage>, count: usize, fun: F) -> EthcoreResult<()> where
|
||||||
|
F: Fn(&Client) + Send + Sync + 'static,
|
||||||
|
{
|
||||||
|
let queue_size = self.currently_queued.load(AtomicOrdering::Relaxed);
|
||||||
|
if queue_size >= self.limit {
|
||||||
|
let err_limit = usize::try_from(self.limit).unwrap_or(usize::max_value());
|
||||||
|
bail!("The queue is full ({})", err_limit);
|
||||||
|
};
|
||||||
|
|
||||||
|
let count = i64::try_from(count).unwrap_or(i64::max_value());
|
||||||
|
|
||||||
|
let currently_queued = self.currently_queued.clone();
|
||||||
|
let _ok = channel.send(ClientIoMessage::execute(move |client| {
|
||||||
|
currently_queued.fetch_sub(count, AtomicOrdering::SeqCst);
|
||||||
|
fun(client);
|
||||||
|
}))?;
|
||||||
|
|
||||||
|
self.currently_queued.fetch_add(count, AtomicOrdering::SeqCst);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use test_helpers::{generate_dummy_client, generate_dummy_client_with_data, generate_dummy_client_with_spec_and_data, get_good_dummy_block_hash};
|
||||||
|
use blockchain::{BlockProvider, ExtrasInsert};
|
||||||
|
use spec::Spec;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_not_cache_details_before_commit() {
|
fn should_not_cache_details_before_commit() {
|
||||||
@ -2626,7 +2824,6 @@ mod tests {
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use kvdb::DBTransaction;
|
use kvdb::DBTransaction;
|
||||||
use blockchain::ExtrasInsert;
|
|
||||||
use types::encoded;
|
use types::encoded;
|
||||||
|
|
||||||
let client = generate_dummy_client(0);
|
let client = generate_dummy_client(0);
|
||||||
@ -2768,40 +2965,23 @@ mod tests {
|
|||||||
outcome: TransactionOutcome::StateRoot(state_root),
|
outcome: TransactionOutcome::StateRoot(state_root),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue some items to be processed by IO client.
|
#[test]
|
||||||
struct IoChannelQueue {
|
fn should_mark_finalization_correctly_for_parent() {
|
||||||
currently_queued: Arc<AtomicUsize>,
|
let client = generate_dummy_client_with_spec_and_data(Spec::new_test_with_finality, 2, 0, &[]);
|
||||||
limit: usize,
|
let chain = client.chain();
|
||||||
}
|
|
||||||
|
|
||||||
impl IoChannelQueue {
|
let block1_details = chain.block_hash(1).and_then(|h| chain.block_details(&h));
|
||||||
pub fn new(limit: usize) -> Self {
|
assert!(block1_details.is_some());
|
||||||
IoChannelQueue {
|
let block1_details = block1_details.unwrap();
|
||||||
currently_queued: Default::default(),
|
assert_eq!(block1_details.children.len(), 1);
|
||||||
limit,
|
assert!(block1_details.is_finalized);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn queue<F>(&self, channel: &IoChannel<ClientIoMessage>, count: usize, fun: F) -> Result<(), QueueError> where
|
let block2_details = chain.block_hash(2).and_then(|h| chain.block_details(&h));
|
||||||
F: Fn(&Client) + Send + Sync + 'static,
|
assert!(block2_details.is_some());
|
||||||
{
|
let block2_details = block2_details.unwrap();
|
||||||
let queue_size = self.currently_queued.load(AtomicOrdering::Relaxed);
|
assert_eq!(block2_details.children.len(), 0);
|
||||||
ensure!(queue_size < self.limit, QueueErrorKind::Full(self.limit));
|
assert!(!block2_details.is_finalized);
|
||||||
|
|
||||||
let currently_queued = self.currently_queued.clone();
|
|
||||||
let result = channel.send(ClientIoMessage::execute(move |client| {
|
|
||||||
currently_queued.fetch_sub(count, AtomicOrdering::SeqCst);
|
|
||||||
fun(client);
|
|
||||||
}));
|
|
||||||
|
|
||||||
match result {
|
|
||||||
Ok(_) => {
|
|
||||||
self.currently_queued.fetch_add(count, AtomicOrdering::SeqCst);
|
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
Err(e) => bail!(QueueErrorKind::Channel(e)),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ mod config;
|
|||||||
mod evm_test_client;
|
mod evm_test_client;
|
||||||
mod io_message;
|
mod io_message;
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
#[cfg(any(test, feature = "test-helpers"))]
|
||||||
mod test_client;
|
pub mod test_client;
|
||||||
mod trace;
|
mod trace;
|
||||||
|
|
||||||
pub use self::client::*;
|
pub use self::client::*;
|
||||||
@ -38,7 +38,7 @@ pub use self::chain_notify::{ChainNotify, NewBlocks, ChainRoute, ChainRouteType,
|
|||||||
pub use self::traits::{
|
pub use self::traits::{
|
||||||
Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, TransactionInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock,
|
Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, TransactionInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock,
|
||||||
StateOrBlock, StateClient, Call, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, BadBlocks,
|
StateOrBlock, StateClient, Call, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, BadBlocks,
|
||||||
BlockChainReset
|
BlockChainReset, ImportExportBlocks
|
||||||
};
|
};
|
||||||
pub use state::StateInfo;
|
pub use state::StateInfo;
|
||||||
pub use self::traits::{BlockChainClient, EngineClient, ProvingBlockChainClient, IoClient};
|
pub use self::traits::{BlockChainClient, EngineClient, ProvingBlockChainClient, IoClient};
|
||||||
|
@ -56,7 +56,7 @@ use client::{
|
|||||||
TransactionId, UncleId, TraceId, TraceFilter, LastHashes, CallAnalytics,
|
TransactionId, UncleId, TraceId, TraceFilter, LastHashes, CallAnalytics,
|
||||||
ProvingBlockChainClient, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock,
|
ProvingBlockChainClient, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock,
|
||||||
Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient,
|
Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient,
|
||||||
BadBlocks,
|
BadBlocks, traits::ForceUpdateSealing
|
||||||
};
|
};
|
||||||
use engines::EthEngine;
|
use engines::EthEngine;
|
||||||
use error::{Error, EthcoreResult};
|
use error::{Error, EthcoreResult};
|
||||||
@ -586,7 +586,7 @@ impl ImportBlock for TestBlockChainClient {
|
|||||||
|
|
||||||
impl Call for TestBlockChainClient {
|
impl Call for TestBlockChainClient {
|
||||||
// State will not be used by test client anyway, since all methods that accept state are mocked
|
// State will not be used by test client anyway, since all methods that accept state are mocked
|
||||||
type State = ();
|
type State = TestState;
|
||||||
|
|
||||||
fn call(&self, _t: &SignedTransaction, _analytics: CallAnalytics, _state: &mut Self::State, _header: &Header) -> Result<Executed, CallError> {
|
fn call(&self, _t: &SignedTransaction, _analytics: CallAnalytics, _state: &mut Self::State, _header: &Header) -> Result<Executed, CallError> {
|
||||||
self.execution_result.read().clone().unwrap()
|
self.execution_result.read().clone().unwrap()
|
||||||
@ -605,7 +605,10 @@ impl Call for TestBlockChainClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StateInfo for () {
|
/// NewType wrapper around `()` to impersonate `State` in trait impls. State will not be used by
|
||||||
|
/// test client, since all methods that accept state are mocked.
|
||||||
|
pub struct TestState;
|
||||||
|
impl StateInfo for TestState {
|
||||||
fn nonce(&self, _address: &Address) -> ethtrie::Result<U256> { unimplemented!() }
|
fn nonce(&self, _address: &Address) -> ethtrie::Result<U256> { unimplemented!() }
|
||||||
fn balance(&self, _address: &Address) -> ethtrie::Result<U256> { unimplemented!() }
|
fn balance(&self, _address: &Address) -> ethtrie::Result<U256> { unimplemented!() }
|
||||||
fn storage_at(&self, _address: &Address, _key: &H256) -> ethtrie::Result<H256> { unimplemented!() }
|
fn storage_at(&self, _address: &Address, _key: &H256) -> ethtrie::Result<H256> { unimplemented!() }
|
||||||
@ -614,14 +617,14 @@ impl StateInfo for () {
|
|||||||
|
|
||||||
impl StateClient for TestBlockChainClient {
|
impl StateClient for TestBlockChainClient {
|
||||||
// State will not be used by test client anyway, since all methods that accept state are mocked
|
// State will not be used by test client anyway, since all methods that accept state are mocked
|
||||||
type State = ();
|
type State = TestState;
|
||||||
|
|
||||||
fn latest_state(&self) -> Self::State {
|
fn latest_state_and_header(&self) -> (Self::State, Header) {
|
||||||
()
|
(TestState, self.best_block_header())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn state_at(&self, _id: BlockId) -> Option<Self::State> {
|
fn state_at(&self, _id: BlockId) -> Option<Self::State> {
|
||||||
Some(())
|
Some(TestState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -928,8 +931,8 @@ impl ProvingBlockChainClient for TestBlockChainClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl super::traits::EngineClient for TestBlockChainClient {
|
impl super::traits::EngineClient for TestBlockChainClient {
|
||||||
fn update_sealing(&self) {
|
fn update_sealing(&self, force: ForceUpdateSealing) {
|
||||||
self.miner.update_sealing(self)
|
self.miner.update_sealing(self, force)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {
|
||||||
|
@ -31,6 +31,7 @@ use types::basic_account::BasicAccount;
|
|||||||
use types::block_status::BlockStatus;
|
use types::block_status::BlockStatus;
|
||||||
use types::blockchain_info::BlockChainInfo;
|
use types::blockchain_info::BlockChainInfo;
|
||||||
use types::call_analytics::CallAnalytics;
|
use types::call_analytics::CallAnalytics;
|
||||||
|
use types::data_format::DataFormat;
|
||||||
use types::encoded;
|
use types::encoded;
|
||||||
use types::filter::Filter;
|
use types::filter::Filter;
|
||||||
use types::header::Header;
|
use types::header::Header;
|
||||||
@ -144,8 +145,8 @@ pub trait StateClient {
|
|||||||
/// Type representing chain state
|
/// Type representing chain state
|
||||||
type State: StateInfo;
|
type State: StateInfo;
|
||||||
|
|
||||||
/// Get a copy of the best block's state.
|
/// Get a copy of the best block's state and header.
|
||||||
fn latest_state(&self) -> Self::State;
|
fn latest_state_and_header(&self) -> (Self::State, Header);
|
||||||
|
|
||||||
/// Attempt to get a copy of a specific block's final state.
|
/// Attempt to get a copy of a specific block's final state.
|
||||||
///
|
///
|
||||||
@ -422,10 +423,19 @@ pub trait BroadcastProposalBlock {
|
|||||||
/// Provides methods to import sealed block and broadcast a block proposal
|
/// Provides methods to import sealed block and broadcast a block proposal
|
||||||
pub trait SealedBlockImporter: ImportSealedBlock + BroadcastProposalBlock {}
|
pub trait SealedBlockImporter: ImportSealedBlock + BroadcastProposalBlock {}
|
||||||
|
|
||||||
|
/// Do we want to force update sealing?
|
||||||
|
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||||
|
pub enum ForceUpdateSealing {
|
||||||
|
/// Ideally you want to use `No` at all times as `Yes` skips `reseal_required` checks.
|
||||||
|
Yes,
|
||||||
|
/// Don't skip `reseal_required` checks
|
||||||
|
No
|
||||||
|
}
|
||||||
|
|
||||||
/// Client facilities used by internally sealing Engines.
|
/// Client facilities used by internally sealing Engines.
|
||||||
pub trait EngineClient: Sync + Send + ChainInfo {
|
pub trait EngineClient: Sync + Send + ChainInfo {
|
||||||
/// Make a new block and seal it.
|
/// Make a new block and seal it.
|
||||||
fn update_sealing(&self);
|
fn update_sealing(&self, force: ForceUpdateSealing);
|
||||||
|
|
||||||
/// Submit a seal for a block in the mining queue.
|
/// Submit a seal for a block in the mining queue.
|
||||||
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>);
|
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>);
|
||||||
@ -477,3 +487,29 @@ pub trait BlockChainReset {
|
|||||||
/// reset to best_block - n
|
/// reset to best_block - n
|
||||||
fn reset(&self, num: u32) -> Result<(), String>;
|
fn reset(&self, num: u32) -> Result<(), String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Provides a method for importing/exporting blocks
|
||||||
|
pub trait ImportExportBlocks {
|
||||||
|
/// Export blocks to destination, with the given from, to and format argument.
|
||||||
|
/// destination could be a file or stdout.
|
||||||
|
/// If the format is hex, each block is written on a new line.
|
||||||
|
/// For binary exports, all block data is written to the same line.
|
||||||
|
fn export_blocks<'a>(
|
||||||
|
&self,
|
||||||
|
destination: Box<dyn std::io::Write + 'a>,
|
||||||
|
from: BlockId,
|
||||||
|
to: BlockId,
|
||||||
|
format: Option<DataFormat>
|
||||||
|
) -> Result<(), String>;
|
||||||
|
|
||||||
|
/// Import blocks from destination, with the given format argument
|
||||||
|
/// Source could be a file or stdout.
|
||||||
|
/// For hex format imports, it attempts to read the blocks on a line by line basis.
|
||||||
|
/// For binary format imports, reads the 8 byte RLP header in order to decode the block
|
||||||
|
/// length to be read.
|
||||||
|
fn import_blocks<'a>(
|
||||||
|
&self,
|
||||||
|
source: Box<dyn std::io::Read + 'a>,
|
||||||
|
format: Option<DataFormat>
|
||||||
|
) -> Result<(), String>;
|
||||||
|
}
|
||||||
|
@ -25,7 +25,7 @@ use std::sync::{Weak, Arc};
|
|||||||
use std::time::{UNIX_EPOCH, Duration};
|
use std::time::{UNIX_EPOCH, Duration};
|
||||||
|
|
||||||
use block::*;
|
use block::*;
|
||||||
use client::EngineClient;
|
use client::{EngineClient, traits::ForceUpdateSealing};
|
||||||
use engines::{Engine, Seal, EngineError, ConstructedVerifier};
|
use engines::{Engine, Seal, EngineError, ConstructedVerifier};
|
||||||
use engines::block_reward;
|
use engines::block_reward;
|
||||||
use engines::block_reward::{BlockRewardContract, RewardKind};
|
use engines::block_reward::{BlockRewardContract, RewardKind};
|
||||||
@ -908,7 +908,7 @@ impl IoHandler<()> for TransitionHandler {
|
|||||||
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
||||||
if let Some(ref weak) = *self.client.read() {
|
if let Some(ref weak) = *self.client.read() {
|
||||||
if let Some(c) = weak.upgrade() {
|
if let Some(c) = weak.upgrade() {
|
||||||
c.update_sealing();
|
c.update_sealing(ForceUpdateSealing::No);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -936,7 +936,7 @@ impl Engine<EthereumMachine> for AuthorityRound {
|
|||||||
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
|
||||||
if let Some(ref weak) = *self.client.read() {
|
if let Some(ref weak) = *self.client.read() {
|
||||||
if let Some(c) = weak.upgrade() {
|
if let Some(c) = weak.upgrade() {
|
||||||
c.update_sealing();
|
c.update_sealing(ForceUpdateSealing::No);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,11 +64,11 @@ use std::collections::VecDeque;
|
|||||||
use std::sync::{Arc, Weak};
|
use std::sync::{Arc, Weak};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time;
|
use std::time;
|
||||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
use std::time::{Instant, Duration, SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
use block::ExecutedBlock;
|
use block::ExecutedBlock;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use client::{BlockId, EngineClient};
|
use client::{BlockId, EngineClient, traits::ForceUpdateSealing};
|
||||||
use engines::clique::util::{extract_signers, recover_creator};
|
use engines::clique::util::{extract_signers, recover_creator};
|
||||||
use engines::{Engine, EngineError, Seal};
|
use engines::{Engine, EngineError, Seal};
|
||||||
use error::{BlockError, Error};
|
use error::{BlockError, Error};
|
||||||
@ -88,11 +88,9 @@ use types::header::{ExtendedHeader, Header};
|
|||||||
|
|
||||||
use self::block_state::CliqueBlockState;
|
use self::block_state::CliqueBlockState;
|
||||||
use self::params::CliqueParams;
|
use self::params::CliqueParams;
|
||||||
use self::step_service::StepService;
|
|
||||||
|
|
||||||
mod params;
|
mod params;
|
||||||
mod block_state;
|
mod block_state;
|
||||||
mod step_service;
|
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
// TODO(niklasad1): extract tester types into a separate mod to be shared in the code base
|
// TODO(niklasad1): extract tester types into a separate mod to be shared in the code base
|
||||||
@ -167,7 +165,6 @@ pub struct Clique {
|
|||||||
block_state_by_hash: RwLock<LruCache<H256, CliqueBlockState>>,
|
block_state_by_hash: RwLock<LruCache<H256, CliqueBlockState>>,
|
||||||
proposals: RwLock<HashMap<Address, VoteType>>,
|
proposals: RwLock<HashMap<Address, VoteType>>,
|
||||||
signer: RwLock<Option<Box<EngineSigner>>>,
|
signer: RwLock<Option<Box<EngineSigner>>>,
|
||||||
step_service: Option<Arc<StepService>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -180,30 +177,45 @@ pub struct Clique {
|
|||||||
pub block_state_by_hash: RwLock<LruCache<H256, CliqueBlockState>>,
|
pub block_state_by_hash: RwLock<LruCache<H256, CliqueBlockState>>,
|
||||||
pub proposals: RwLock<HashMap<Address, VoteType>>,
|
pub proposals: RwLock<HashMap<Address, VoteType>>,
|
||||||
pub signer: RwLock<Option<Box<EngineSigner>>>,
|
pub signer: RwLock<Option<Box<EngineSigner>>>,
|
||||||
pub step_service: Option<Arc<StepService>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Clique {
|
impl Clique {
|
||||||
/// Initialize Clique engine from empty state.
|
/// Initialize Clique engine from empty state.
|
||||||
pub fn new(our_params: CliqueParams, machine: EthereumMachine) -> Result<Arc<Self>, Error> {
|
pub fn new(params: CliqueParams, machine: EthereumMachine) -> Result<Arc<Self>, Error> {
|
||||||
let mut engine = Clique {
|
/// Step Clique at most every 2 seconds
|
||||||
epoch_length: our_params.epoch,
|
const SEALING_FREQ: Duration = Duration::from_secs(2);
|
||||||
period: our_params.period,
|
|
||||||
|
let engine = Clique {
|
||||||
|
epoch_length: params.epoch,
|
||||||
|
period: params.period,
|
||||||
client: Default::default(),
|
client: Default::default(),
|
||||||
block_state_by_hash: RwLock::new(LruCache::new(STATE_CACHE_NUM)),
|
block_state_by_hash: RwLock::new(LruCache::new(STATE_CACHE_NUM)),
|
||||||
proposals: Default::default(),
|
proposals: Default::default(),
|
||||||
signer: Default::default(),
|
signer: Default::default(),
|
||||||
machine,
|
machine,
|
||||||
step_service: None,
|
|
||||||
};
|
};
|
||||||
|
let engine = Arc::new(engine);
|
||||||
|
let weak_eng = Arc::downgrade(&engine);
|
||||||
|
|
||||||
let res = Arc::new(engine);
|
thread::Builder::new().name("StepService".into())
|
||||||
|
.spawn(move || {
|
||||||
|
loop {
|
||||||
|
let next_step_at = Instant::now() + SEALING_FREQ;
|
||||||
|
trace!(target: "miner", "StepService: triggering sealing");
|
||||||
|
if let Some(eng) = weak_eng.upgrade() {
|
||||||
|
eng.step()
|
||||||
|
} else {
|
||||||
|
warn!(target: "shutdown", "StepService: engine is dropped; exiting.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if our_params.period > 0 {
|
let now = Instant::now();
|
||||||
engine.step_service = Some(StepService::start(Arc::downgrade(&res) as Weak<Engine<_>>));
|
if now < next_step_at {
|
||||||
}
|
thread::sleep(next_step_at - now);
|
||||||
|
}
|
||||||
Ok(res)
|
}
|
||||||
|
})?;
|
||||||
|
Ok(engine)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -221,7 +233,6 @@ impl Clique {
|
|||||||
proposals: Default::default(),
|
proposals: Default::default(),
|
||||||
signer: Default::default(),
|
signer: Default::default(),
|
||||||
machine: Spec::new_test_machine(),
|
machine: Spec::new_test_machine(),
|
||||||
step_service: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -695,7 +706,7 @@ impl Engine<EthereumMachine> for Clique {
|
|||||||
trace!(target: "engine", "populate_from_parent in sealing");
|
trace!(target: "engine", "populate_from_parent in sealing");
|
||||||
|
|
||||||
// It's unclear how to prevent creating new blocks unless we are authorized, the best way (and geth does this too)
|
// It's unclear how to prevent creating new blocks unless we are authorized, the best way (and geth does this too)
|
||||||
// it's just to ignore setting an correct difficulty here, we will check authorization in next step in generate_seal anyway.
|
// it's just to ignore setting a correct difficulty here, we will check authorization in next step in generate_seal anyway.
|
||||||
if let Some(signer) = self.signer.read().as_ref() {
|
if let Some(signer) = self.signer.read().as_ref() {
|
||||||
let state = match self.state(&parent) {
|
let state = match self.state(&parent) {
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
@ -738,20 +749,12 @@ impl Engine<EthereumMachine> for Clique {
|
|||||||
if self.signer.read().is_some() {
|
if self.signer.read().is_some() {
|
||||||
if let Some(ref weak) = *self.client.read() {
|
if let Some(ref weak) = *self.client.read() {
|
||||||
if let Some(c) = weak.upgrade() {
|
if let Some(c) = weak.upgrade() {
|
||||||
c.update_sealing();
|
c.update_sealing(ForceUpdateSealing::No);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stop(&mut self) {
|
|
||||||
if let Some(mut s) = self.step_service.as_mut() {
|
|
||||||
Arc::get_mut(&mut s).map(|x| x.stop());
|
|
||||||
} else {
|
|
||||||
warn!(target: "engine", "Stopping `CliqueStepService` failed requires mutable access");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clique timestamp is set to parent + period , or current time which ever is higher.
|
/// Clique timestamp is set to parent + period , or current time which ever is higher.
|
||||||
fn open_block_header_timestamp(&self, parent_timestamp: u64) -> u64 {
|
fn open_block_header_timestamp(&self, parent_timestamp: u64) -> u64 {
|
||||||
let now = time::SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap_or_default();
|
let now = time::SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap_or_default();
|
||||||
|
@ -1,77 +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::sync::Weak;
|
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
|
||||||
use std::time::Duration;
|
|
||||||
use std::thread;
|
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use engines::Engine;
|
|
||||||
use machine::Machine;
|
|
||||||
|
|
||||||
/// Service that is managing the engine
|
|
||||||
pub struct StepService {
|
|
||||||
shutdown: Arc<AtomicBool>,
|
|
||||||
thread: Option<thread::JoinHandle<()>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl StepService {
|
|
||||||
/// Start the `StepService`
|
|
||||||
pub fn start<M: Machine + 'static>(engine: Weak<Engine<M>>) -> Arc<Self> {
|
|
||||||
let shutdown = Arc::new(AtomicBool::new(false));
|
|
||||||
let s = shutdown.clone();
|
|
||||||
|
|
||||||
let thread = thread::Builder::new()
|
|
||||||
.name("CliqueStepService".into())
|
|
||||||
.spawn(move || {
|
|
||||||
// startup delay.
|
|
||||||
thread::sleep(Duration::from_secs(5));
|
|
||||||
|
|
||||||
loop {
|
|
||||||
// see if we are in shutdown.
|
|
||||||
if shutdown.load(Ordering::Acquire) {
|
|
||||||
trace!(target: "miner", "CliqueStepService: received shutdown signal!");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
trace!(target: "miner", "CliqueStepService: triggering sealing");
|
|
||||||
|
|
||||||
// Try sealing
|
|
||||||
engine.upgrade().map(|x| x.step());
|
|
||||||
|
|
||||||
// Yield
|
|
||||||
thread::sleep(Duration::from_millis(2000));
|
|
||||||
}
|
|
||||||
trace!(target: "miner", "CliqueStepService: shutdown.");
|
|
||||||
}).expect("CliqueStepService thread failed");
|
|
||||||
|
|
||||||
Arc::new(StepService {
|
|
||||||
shutdown: s,
|
|
||||||
thread: Some(thread),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Stop the `StepService`
|
|
||||||
pub fn stop(&mut self) {
|
|
||||||
trace!(target: "miner", "CliqueStepService: shutting down.");
|
|
||||||
self.shutdown.store(true, Ordering::Release);
|
|
||||||
if let Some(t) = self.thread.take() {
|
|
||||||
t.join().expect("CliqueStepService thread panicked!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -63,6 +63,13 @@ impl<M: Machine> Engine<M> for InstantSeal<M> {
|
|||||||
|
|
||||||
fn seals_internally(&self) -> Option<bool> { Some(true) }
|
fn seals_internally(&self) -> Option<bool> { Some(true) }
|
||||||
|
|
||||||
|
fn should_reseal_on_update(&self) -> bool {
|
||||||
|
// We would like for the miner to `update_sealing` if there are local_pending_transactions
|
||||||
|
// in the pool to prevent transactions sent in parallel from stalling in the transaction
|
||||||
|
// pool. (see #9660)
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
fn generate_seal(&self, block: &ExecutedBlock, _parent: &Header) -> Seal {
|
fn generate_seal(&self, block: &ExecutedBlock, _parent: &Header) -> Seal {
|
||||||
if !block.transactions.is_empty() {
|
if !block.transactions.is_empty() {
|
||||||
let block_number = block.header.number();
|
let block_number = block.header.number();
|
||||||
|
@ -307,6 +307,14 @@ pub trait Engine<M: Machine>: Sync + Send {
|
|||||||
/// Some(false) means that the node might seal internally but is not qualified now.
|
/// Some(false) means that the node might seal internally but is not qualified now.
|
||||||
fn seals_internally(&self) -> Option<bool> { None }
|
fn seals_internally(&self) -> Option<bool> { None }
|
||||||
|
|
||||||
|
/// Called in `miner.chain_new_blocks` if the engine wishes to `update_sealing`
|
||||||
|
/// after a block was recently sealed.
|
||||||
|
///
|
||||||
|
/// returns false by default
|
||||||
|
fn should_reseal_on_update(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Attempt to seal the block internally.
|
/// Attempt to seal the block internally.
|
||||||
///
|
///
|
||||||
/// If `Some` is returned, then you get a valid seal.
|
/// If `Some` is returned, then you get a valid seal.
|
||||||
@ -425,9 +433,6 @@ pub trait Engine<M: Machine>: Sync + Send {
|
|||||||
/// Trigger next step of the consensus engine.
|
/// Trigger next step of the consensus engine.
|
||||||
fn step(&self) {}
|
fn step(&self) {}
|
||||||
|
|
||||||
/// Stops any services that the may hold the Engine and makes it safe to drop.
|
|
||||||
fn stop(&mut self) {}
|
|
||||||
|
|
||||||
/// Create a factory for building snapshot chunks and restoring from them.
|
/// Create a factory for building snapshot chunks and restoring from them.
|
||||||
/// Returning `None` indicates that this engine doesn't support snapshot creation.
|
/// Returning `None` indicates that this engine doesn't support snapshot creation.
|
||||||
fn snapshot_components(&self) -> Option<Box<SnapshotComponents>> {
|
fn snapshot_components(&self) -> Option<Box<SnapshotComponents>> {
|
||||||
|
@ -20,6 +20,7 @@ use ethereum_types::U256;
|
|||||||
use machine::Machine;
|
use machine::Machine;
|
||||||
use types::BlockNumber;
|
use types::BlockNumber;
|
||||||
use types::header::{Header, ExtendedHeader};
|
use types::header::{Header, ExtendedHeader};
|
||||||
|
use types::ancestry_action::AncestryAction;
|
||||||
use block::ExecutedBlock;
|
use block::ExecutedBlock;
|
||||||
|
|
||||||
/// Params for a null engine.
|
/// Params for a null engine.
|
||||||
@ -27,12 +28,15 @@ use block::ExecutedBlock;
|
|||||||
pub struct NullEngineParams {
|
pub struct NullEngineParams {
|
||||||
/// base reward for a block.
|
/// base reward for a block.
|
||||||
pub block_reward: U256,
|
pub block_reward: U256,
|
||||||
|
/// Immediate finalization.
|
||||||
|
pub immediate_finalization: bool
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<::ethjson::spec::NullEngineParams> for NullEngineParams {
|
impl From<::ethjson::spec::NullEngineParams> for NullEngineParams {
|
||||||
fn from(p: ::ethjson::spec::NullEngineParams) -> Self {
|
fn from(p: ::ethjson::spec::NullEngineParams) -> Self {
|
||||||
NullEngineParams {
|
NullEngineParams {
|
||||||
block_reward: p.block_reward.map_or_else(Default::default, Into::into),
|
block_reward: p.block_reward.map_or_else(Default::default, Into::into),
|
||||||
|
immediate_finalization: p.immediate_finalization.unwrap_or(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,4 +110,13 @@ impl<M: Machine> Engine<M> for NullEngine<M> {
|
|||||||
fn fork_choice(&self, new: &ExtendedHeader, current: &ExtendedHeader) -> super::ForkChoice {
|
fn fork_choice(&self, new: &ExtendedHeader, current: &ExtendedHeader) -> super::ForkChoice {
|
||||||
super::total_difficulty_fork_choice(new, current)
|
super::total_difficulty_fork_choice(new, current)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ancestry_actions(&self, _header: &Header, ancestry: &mut dyn Iterator<Item=ExtendedHeader>) -> Vec<AncestryAction> {
|
||||||
|
if self.params.immediate_finalization {
|
||||||
|
// always mark parent finalized
|
||||||
|
ancestry.take(1).map(|e| AncestryAction::MarkFinalized(e.header.hash())).collect()
|
||||||
|
} else {
|
||||||
|
Vec::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ mod tests {
|
|||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use accounts::AccountProvider;
|
use accounts::AccountProvider;
|
||||||
use client::{BlockChainClient, ChainInfo, BlockInfo, ImportBlock};
|
use client::{BlockChainClient, ChainInfo, BlockInfo, ImportBlock, traits::ForceUpdateSealing};
|
||||||
use engines::EpochChange;
|
use engines::EpochChange;
|
||||||
use engines::validator_set::ValidatorSet;
|
use engines::validator_set::ValidatorSet;
|
||||||
use ethkey::Secret;
|
use ethkey::Secret;
|
||||||
@ -181,24 +181,24 @@ mod tests {
|
|||||||
let signer = Box::new((tap.clone(), v1, "".into()));
|
let signer = Box::new((tap.clone(), v1, "".into()));
|
||||||
client.miner().set_author(miner::Author::Sealer(signer));
|
client.miner().set_author(miner::Author::Sealer(signer));
|
||||||
client.transact_contract(Default::default(), Default::default()).unwrap();
|
client.transact_contract(Default::default(), Default::default()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
::client::EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 0);
|
assert_eq!(client.chain_info().best_block_number, 0);
|
||||||
// Right signer for the first block.
|
// Right signer for the first block.
|
||||||
let signer = Box::new((tap.clone(), v0, "".into()));
|
let signer = Box::new((tap.clone(), v0, "".into()));
|
||||||
client.miner().set_author(miner::Author::Sealer(signer));
|
client.miner().set_author(miner::Author::Sealer(signer));
|
||||||
::client::EngineClient::update_sealing(&*client);
|
::client::EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 1);
|
assert_eq!(client.chain_info().best_block_number, 1);
|
||||||
// This time v0 is wrong.
|
// This time v0 is wrong.
|
||||||
client.transact_contract(Default::default(), Default::default()).unwrap();
|
client.transact_contract(Default::default(), Default::default()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
::client::EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 1);
|
assert_eq!(client.chain_info().best_block_number, 1);
|
||||||
let signer = Box::new((tap.clone(), v1, "".into()));
|
let signer = Box::new((tap.clone(), v1, "".into()));
|
||||||
client.miner().set_author(miner::Author::Sealer(signer));
|
client.miner().set_author(miner::Author::Sealer(signer));
|
||||||
::client::EngineClient::update_sealing(&*client);
|
::client::EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 2);
|
assert_eq!(client.chain_info().best_block_number, 2);
|
||||||
// v1 is still good.
|
// v1 is still good.
|
||||||
client.transact_contract(Default::default(), Default::default()).unwrap();
|
client.transact_contract(Default::default(), Default::default()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
::client::EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 3);
|
assert_eq!(client.chain_info().best_block_number, 3);
|
||||||
|
|
||||||
// Check syncing.
|
// Check syncing.
|
||||||
|
@ -447,7 +447,7 @@ mod tests {
|
|||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use accounts::AccountProvider;
|
use accounts::AccountProvider;
|
||||||
use types::transaction::{Transaction, Action};
|
use types::transaction::{Transaction, Action};
|
||||||
use client::{ChainInfo, BlockInfo, ImportBlock};
|
use client::{ChainInfo, BlockInfo, ImportBlock, traits::{ForceUpdateSealing, EngineClient}};
|
||||||
use ethkey::Secret;
|
use ethkey::Secret;
|
||||||
use miner::{self, MinerService};
|
use miner::{self, MinerService};
|
||||||
use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data};
|
use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data};
|
||||||
@ -488,7 +488,7 @@ mod tests {
|
|||||||
data: "bfc708a000000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
|
data: "bfc708a000000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
|
||||||
}.sign(&s0, Some(chain_id));
|
}.sign(&s0, Some(chain_id));
|
||||||
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 1);
|
assert_eq!(client.chain_info().best_block_number, 1);
|
||||||
// Add "1" validator back in.
|
// Add "1" validator back in.
|
||||||
let tx = Transaction {
|
let tx = Transaction {
|
||||||
@ -500,14 +500,14 @@ mod tests {
|
|||||||
data: "4d238c8e00000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
|
data: "4d238c8e00000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
|
||||||
}.sign(&s0, Some(chain_id));
|
}.sign(&s0, Some(chain_id));
|
||||||
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
// The transaction is not yet included so still unable to seal.
|
// The transaction is not yet included so still unable to seal.
|
||||||
assert_eq!(client.chain_info().best_block_number, 1);
|
assert_eq!(client.chain_info().best_block_number, 1);
|
||||||
|
|
||||||
// Switch to the validator that is still there.
|
// Switch to the validator that is still there.
|
||||||
let signer = Box::new((tap.clone(), v0, "".into()));
|
let signer = Box::new((tap.clone(), v0, "".into()));
|
||||||
client.miner().set_author(miner::Author::Sealer(signer));
|
client.miner().set_author(miner::Author::Sealer(signer));
|
||||||
::client::EngineClient::update_sealing(&*client);
|
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
assert_eq!(client.chain_info().best_block_number, 2);
|
assert_eq!(client.chain_info().best_block_number, 2);
|
||||||
// Switch back to the added validator, since the state is updated.
|
// Switch back to the added validator, since the state is updated.
|
||||||
let signer = Box::new((tap.clone(), v1, "".into()));
|
let signer = Box::new((tap.clone(), v1, "".into()));
|
||||||
@ -521,7 +521,7 @@ mod tests {
|
|||||||
data: Vec::new(),
|
data: Vec::new(),
|
||||||
}.sign(&s0, Some(chain_id));
|
}.sign(&s0, Some(chain_id));
|
||||||
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
client.miner().import_own_transaction(client.as_ref(), tx.into()).unwrap();
|
||||||
::client::EngineClient::update_sealing(&*client);
|
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
// Able to seal again.
|
// Able to seal again.
|
||||||
assert_eq!(client.chain_info().best_block_number, 3);
|
assert_eq!(client.chain_info().best_block_number, 3);
|
||||||
|
|
||||||
|
@ -134,6 +134,11 @@ pub fn new_sokol<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
|||||||
load(params.into(), include_bytes!("../../res/ethereum/poasokol.json"))
|
load(params.into(), include_bytes!("../../res/ethereum/poasokol.json"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new Morodor testnet chain spec.
|
||||||
|
pub fn new_mordor<'a, T: Into<SpecParams<'a>>>(params: T) -> Spec {
|
||||||
|
load(params.into(), include_bytes!("../../res/ethereum/mordor.json"))
|
||||||
|
}
|
||||||
|
|
||||||
// For tests
|
// For tests
|
||||||
|
|
||||||
/// Create a new Foundation Frontier-era chain spec as though it never changes to Homestead.
|
/// Create a new Foundation Frontier-era chain spec as though it never changes to Homestead.
|
||||||
|
@ -406,7 +406,7 @@ impl<'a> CallCreateExecutive<'a> {
|
|||||||
if let Err(e) = result {
|
if let Err(e) = result {
|
||||||
state.revert_to_checkpoint();
|
state.revert_to_checkpoint();
|
||||||
|
|
||||||
Err(e.into())
|
Err(vm::Error::BuiltIn(e))
|
||||||
} else {
|
} else {
|
||||||
state.discard_checkpoint();
|
state.discard_checkpoint();
|
||||||
|
|
||||||
|
@ -58,7 +58,6 @@
|
|||||||
#![recursion_limit="128"]
|
#![recursion_limit="128"]
|
||||||
|
|
||||||
extern crate ansi_term;
|
extern crate ansi_term;
|
||||||
extern crate bn;
|
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate common_types as types;
|
extern crate common_types as types;
|
||||||
extern crate crossbeam_utils;
|
extern crate crossbeam_utils;
|
||||||
@ -67,6 +66,7 @@ extern crate ethabi;
|
|||||||
extern crate ethash;
|
extern crate ethash;
|
||||||
extern crate ethcore_blockchain as blockchain;
|
extern crate ethcore_blockchain as blockchain;
|
||||||
extern crate ethcore_bloom_journal as bloom_journal;
|
extern crate ethcore_bloom_journal as bloom_journal;
|
||||||
|
extern crate ethcore_builtin as builtin;
|
||||||
extern crate ethcore_call_contract as call_contract;
|
extern crate ethcore_call_contract as call_contract;
|
||||||
extern crate ethcore_db as db;
|
extern crate ethcore_db as db;
|
||||||
extern crate ethcore_io as io;
|
extern crate ethcore_io as io;
|
||||||
@ -86,10 +86,8 @@ extern crate len_caching_lock;
|
|||||||
extern crate lru_cache;
|
extern crate lru_cache;
|
||||||
extern crate memory_cache;
|
extern crate memory_cache;
|
||||||
extern crate memory_db;
|
extern crate memory_db;
|
||||||
extern crate num;
|
|
||||||
extern crate num_cpus;
|
extern crate num_cpus;
|
||||||
extern crate parity_bytes as bytes;
|
extern crate parity_bytes as bytes;
|
||||||
extern crate parity_crypto;
|
|
||||||
extern crate parity_snappy as snappy;
|
extern crate parity_snappy as snappy;
|
||||||
extern crate parking_lot;
|
extern crate parking_lot;
|
||||||
extern crate trie_db as trie;
|
extern crate trie_db as trie;
|
||||||
@ -154,7 +152,6 @@ extern crate fetch;
|
|||||||
extern crate parity_runtime;
|
extern crate parity_runtime;
|
||||||
|
|
||||||
pub mod block;
|
pub mod block;
|
||||||
pub mod builtin;
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
pub mod engines;
|
pub mod engines;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
@ -52,7 +52,7 @@ use client::{
|
|||||||
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId
|
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId
|
||||||
};
|
};
|
||||||
use client::{BlockId, ClientIoMessage};
|
use client::{BlockId, ClientIoMessage};
|
||||||
use client::traits::EngineClient;
|
use client::traits::{EngineClient, ForceUpdateSealing};
|
||||||
use engines::{EthEngine, Seal, EngineSigner};
|
use engines::{EthEngine, Seal, EngineSigner};
|
||||||
use error::{Error, ErrorKind};
|
use error::{Error, ErrorKind};
|
||||||
use executed::ExecutionError;
|
use executed::ExecutionError;
|
||||||
@ -276,6 +276,7 @@ impl Miner {
|
|||||||
let tx_queue_strategy = options.tx_queue_strategy;
|
let tx_queue_strategy = options.tx_queue_strategy;
|
||||||
let nonce_cache_size = cmp::max(4096, limits.max_count / 4);
|
let nonce_cache_size = cmp::max(4096, limits.max_count / 4);
|
||||||
let refuse_service_transactions = options.refuse_service_transactions;
|
let refuse_service_transactions = options.refuse_service_transactions;
|
||||||
|
let engine = spec.engine.clone();
|
||||||
|
|
||||||
Miner {
|
Miner {
|
||||||
sealing: Mutex::new(SealingWork {
|
sealing: Mutex::new(SealingWork {
|
||||||
@ -294,7 +295,7 @@ impl Miner {
|
|||||||
options,
|
options,
|
||||||
transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)),
|
transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)),
|
||||||
accounts: Arc::new(accounts),
|
accounts: Arc::new(accounts),
|
||||||
engine: spec.engine.clone(),
|
engine,
|
||||||
io_channel: RwLock::new(None),
|
io_channel: RwLock::new(None),
|
||||||
service_transaction_checker: if refuse_service_transactions {
|
service_transaction_checker: if refuse_service_transactions {
|
||||||
None
|
None
|
||||||
@ -829,7 +830,7 @@ impl Miner {
|
|||||||
preparation_status
|
preparation_status
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prepare pending block, check whether sealing is needed, and then update sealing.
|
/// Prepare pending block, check whether sealing is needed, and then update sealing.
|
||||||
fn prepare_and_update_sealing<C: miner::BlockChainClient>(&self, chain: &C) {
|
fn prepare_and_update_sealing<C: miner::BlockChainClient>(&self, chain: &C) {
|
||||||
|
|
||||||
// Make sure to do it after transaction is imported and lock is dropped.
|
// Make sure to do it after transaction is imported and lock is dropped.
|
||||||
@ -838,7 +839,7 @@ impl Miner {
|
|||||||
// If new block has not been prepared (means we already had one)
|
// If new block has not been prepared (means we already had one)
|
||||||
// or Engine might be able to seal internally,
|
// or Engine might be able to seal internally,
|
||||||
// we need to update sealing.
|
// we need to update sealing.
|
||||||
self.update_sealing(chain);
|
self.update_sealing(chain, ForceUpdateSealing::No);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1109,6 +1110,11 @@ impl miner::MinerService for Miner {
|
|||||||
let prev_gas = if index == 0 { Default::default() } else { receipts[index - 1].gas_used };
|
let prev_gas = if index == 0 { Default::default() } else { receipts[index - 1].gas_used };
|
||||||
let receipt = &receipts[index];
|
let receipt = &receipts[index];
|
||||||
RichReceipt {
|
RichReceipt {
|
||||||
|
from: tx.sender(),
|
||||||
|
to: match tx.action {
|
||||||
|
Action::Create => None,
|
||||||
|
Action::Call(ref address) => Some(*address),
|
||||||
|
},
|
||||||
transaction_hash: tx.hash(),
|
transaction_hash: tx.hash(),
|
||||||
transaction_index: index,
|
transaction_index: index,
|
||||||
cumulative_gas_used: receipt.gas_used,
|
cumulative_gas_used: receipt.gas_used,
|
||||||
@ -1131,14 +1137,16 @@ impl miner::MinerService for Miner {
|
|||||||
|
|
||||||
/// Update sealing if required.
|
/// Update sealing if required.
|
||||||
/// Prepare the block and work if the Engine does not seal internally.
|
/// Prepare the block and work if the Engine does not seal internally.
|
||||||
fn update_sealing<C>(&self, chain: &C) where
|
fn update_sealing<C>(&self, chain: &C, force: ForceUpdateSealing) where
|
||||||
C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync,
|
C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync,
|
||||||
{
|
{
|
||||||
trace!(target: "miner", "update_sealing");
|
trace!(target: "miner", "update_sealing");
|
||||||
|
|
||||||
// Do nothing if reseal is not required,
|
// Do nothing if we don't want to force update_sealing and reseal is not required.
|
||||||
// but note that `requires_reseal` updates internal state.
|
// but note that `requires_reseal` updates internal state.
|
||||||
if !self.requires_reseal(chain.chain_info().best_block_number) {
|
if force == ForceUpdateSealing::No &&
|
||||||
|
!self.requires_reseal(chain.chain_info().best_block_number)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1168,6 +1176,7 @@ impl miner::MinerService for Miner {
|
|||||||
if self.seal_and_import_block_internally(chain, block) {
|
if self.seal_and_import_block_internally(chain, block) {
|
||||||
trace!(target: "miner", "update_sealing: imported internally sealed block");
|
trace!(target: "miner", "update_sealing: imported internally sealed block");
|
||||||
}
|
}
|
||||||
|
return
|
||||||
},
|
},
|
||||||
Some(false) => {
|
Some(false) => {
|
||||||
trace!(target: "miner", "update_sealing: engine is not keen to seal internally right now");
|
trace!(target: "miner", "update_sealing: engine is not keen to seal internally right now");
|
||||||
@ -1176,9 +1185,9 @@ impl miner::MinerService for Miner {
|
|||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
|
trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
|
||||||
self.prepare_work(block, original_work_hash)
|
self.prepare_work(block, original_work_hash);
|
||||||
},
|
},
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_currently_sealing(&self) -> bool {
|
fn is_currently_sealing(&self) -> bool {
|
||||||
@ -1279,7 +1288,7 @@ impl miner::MinerService for Miner {
|
|||||||
// | NOTE Code below requires sealing locks. |
|
// | NOTE Code below requires sealing locks. |
|
||||||
// | Make sure to release the locks before calling that method. |
|
// | Make sure to release the locks before calling that method. |
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
self.update_sealing(chain);
|
self.update_sealing(chain, ForceUpdateSealing::No);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1307,8 +1316,9 @@ impl miner::MinerService for Miner {
|
|||||||
service_transaction_checker.as_ref(),
|
service_transaction_checker.as_ref(),
|
||||||
);
|
);
|
||||||
queue.cull(client);
|
queue.cull(client);
|
||||||
if is_internal_import {
|
if engine.should_reseal_on_update() {
|
||||||
chain.update_sealing();
|
// force update_sealing here to skip `reseal_required` checks
|
||||||
|
chain.update_sealing(ForceUpdateSealing::Yes);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1317,8 +1327,9 @@ impl miner::MinerService for Miner {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.transaction_queue.cull(client);
|
self.transaction_queue.cull(client);
|
||||||
if is_internal_import {
|
if self.engine.should_reseal_on_update() {
|
||||||
self.update_sealing(chain);
|
// force update_sealing here to skip `reseal_required` checks
|
||||||
|
self.update_sealing(chain, ForceUpdateSealing::Yes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1638,14 +1649,14 @@ mod tests {
|
|||||||
let import = miner.import_external_transactions(&*client, vec![transaction_with_chain_id(spec.chain_id()).into()]).pop().unwrap();
|
let import = miner.import_external_transactions(&*client, vec![transaction_with_chain_id(spec.chain_id()).into()]).pop().unwrap();
|
||||||
assert_eq!(import.unwrap(), ());
|
assert_eq!(import.unwrap(), ());
|
||||||
|
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
client.flush_queue();
|
client.flush_queue();
|
||||||
assert!(miner.pending_block(0).is_none());
|
assert!(miner.pending_block(0).is_none());
|
||||||
assert_eq!(client.chain_info().best_block_number, 3 as BlockNumber);
|
assert_eq!(client.chain_info().best_block_number, 3 as BlockNumber);
|
||||||
|
|
||||||
assert!(miner.import_own_transaction(&*client, PendingTransaction::new(transaction_with_chain_id(spec.chain_id()).into(), None)).is_ok());
|
assert!(miner.import_own_transaction(&*client, PendingTransaction::new(transaction_with_chain_id(spec.chain_id()).into(), None)).is_ok());
|
||||||
|
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
client.flush_queue();
|
client.flush_queue();
|
||||||
assert!(miner.pending_block(0).is_none());
|
assert!(miner.pending_block(0).is_none());
|
||||||
assert_eq!(client.chain_info().best_block_number, 4 as BlockNumber);
|
assert_eq!(client.chain_info().best_block_number, 4 as BlockNumber);
|
||||||
@ -1673,7 +1684,7 @@ mod tests {
|
|||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
|
|
||||||
assert!(miner.is_currently_sealing());
|
assert!(miner.is_currently_sealing());
|
||||||
}
|
}
|
||||||
@ -1684,7 +1695,7 @@ mod tests {
|
|||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
|
|
||||||
assert!(!miner.is_currently_sealing());
|
assert!(!miner.is_currently_sealing());
|
||||||
}
|
}
|
||||||
@ -1695,7 +1706,7 @@ mod tests {
|
|||||||
let miner = Miner::new_for_tests(&spec, None);
|
let miner = Miner::new_for_tests(&spec, None);
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
|
|
||||||
assert!(!miner.is_currently_sealing());
|
assert!(!miner.is_currently_sealing());
|
||||||
}
|
}
|
||||||
@ -1714,7 +1725,7 @@ mod tests {
|
|||||||
miner.add_work_listener(Box::new(DummyNotifyWork));
|
miner.add_work_listener(Box::new(DummyNotifyWork));
|
||||||
|
|
||||||
let client = generate_dummy_client(2);
|
let client = generate_dummy_client(2);
|
||||||
miner.update_sealing(&*client);
|
miner.update_sealing(&*client, ForceUpdateSealing::No);
|
||||||
|
|
||||||
assert!(miner.is_currently_sealing());
|
assert!(miner.is_currently_sealing());
|
||||||
}
|
}
|
||||||
@ -1753,6 +1764,7 @@ mod tests {
|
|||||||
},
|
},
|
||||||
fetch,
|
fetch,
|
||||||
p,
|
p,
|
||||||
|
"fake_endpoint".to_owned()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ use call_contract::{CallContract, RegistryInfo};
|
|||||||
use client::{
|
use client::{
|
||||||
ScheduleInfo,
|
ScheduleInfo,
|
||||||
BlockChain, BlockProducer, SealedBlockImporter, ChainInfo,
|
BlockChain, BlockProducer, SealedBlockImporter, ChainInfo,
|
||||||
AccountData, Nonce,
|
AccountData, Nonce, traits::ForceUpdateSealing
|
||||||
};
|
};
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use state::StateInfo;
|
use state::StateInfo;
|
||||||
@ -83,7 +83,7 @@ pub trait MinerService : Send + Sync {
|
|||||||
where C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync;
|
where C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync;
|
||||||
|
|
||||||
/// Update current pending block
|
/// Update current pending block
|
||||||
fn update_sealing<C>(&self, chain: &C)
|
fn update_sealing<C>(&self, chain: &C, force: ForceUpdateSealing)
|
||||||
where C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync;
|
where C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync;
|
||||||
|
|
||||||
// Notifications
|
// Notifications
|
||||||
|
@ -217,8 +217,6 @@ impl NotifyWork for Stratum {
|
|||||||
|
|
||||||
self.service.push_work_all(
|
self.service.push_work_all(
|
||||||
self.dispatcher.payload(pow_hash, difficulty, number)
|
self.dispatcher.payload(pow_hash, difficulty, number)
|
||||||
).unwrap_or_else(
|
|
||||||
|e| warn!(target: "stratum", "Error while pushing work: {:?}", e)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -231,16 +229,13 @@ impl Stratum {
|
|||||||
|
|
||||||
let dispatcher = Arc::new(StratumJobDispatcher::new(miner, client));
|
let dispatcher = Arc::new(StratumJobDispatcher::new(miner, client));
|
||||||
|
|
||||||
let stratum_svc = StratumService::start(
|
let service = StratumService::start(
|
||||||
&SocketAddr::new(options.listen_addr.parse::<IpAddr>()?, options.port),
|
&SocketAddr::new(options.listen_addr.parse::<IpAddr>()?, options.port),
|
||||||
dispatcher.clone(),
|
dispatcher.clone(),
|
||||||
options.secret.clone(),
|
options.secret.clone(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(Stratum {
|
Ok(Stratum { dispatcher, service })
|
||||||
dispatcher: dispatcher,
|
|
||||||
service: stratum_svc,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start STRATUM job dispatcher and register it in the miner
|
/// Start STRATUM job dispatcher and register it in the miner
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
//! Parameters for a block chain.
|
//! Parameters for a block chain.
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::convert::TryFrom;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -534,19 +535,28 @@ impl From<SpecHardcodedSync> for ethjson::spec::HardcodedSync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn load_machine_from(s: ethjson::spec::Spec) -> EthereumMachine {
|
fn load_machine_from(s: ethjson::spec::Spec) -> EthereumMachine {
|
||||||
let builtins = s.accounts.builtins().into_iter().map(|p| (p.0.into(), From::from(p.1))).collect();
|
let builtins = s.accounts.builtins().into_iter().map(|p| (p.0.into(), Builtin::try_from(p.1).expect("chain spec is invalid"))).collect();
|
||||||
let params = CommonParams::from(s.params);
|
let params = CommonParams::from(s.params);
|
||||||
|
|
||||||
Spec::machine(&s.engine, params, builtins)
|
Spec::machine(&s.engine, params, builtins)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn convert_json_to_spec(
|
||||||
|
(address, builtin): (ethjson::hash::Address, ethjson::spec::builtin::Builtin),
|
||||||
|
) -> Result<(Address, Builtin), Error> {
|
||||||
|
let builtin = Builtin::try_from(builtin)?;
|
||||||
|
Ok((address.into(), builtin))
|
||||||
|
}
|
||||||
|
|
||||||
/// Load from JSON object.
|
/// Load from JSON object.
|
||||||
fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result<Spec, Error> {
|
fn load_from(spec_params: SpecParams, s: ethjson::spec::Spec) -> Result<Spec, Error> {
|
||||||
let builtins = s.accounts
|
let builtins: Result<BTreeMap<Address, Builtin>, _> = s
|
||||||
|
.accounts
|
||||||
.builtins()
|
.builtins()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|p| (p.0.into(), From::from(p.1)))
|
.map(convert_json_to_spec)
|
||||||
.collect();
|
.collect();
|
||||||
|
let builtins = builtins?;
|
||||||
let g = Genesis::from(s.genesis);
|
let g = Genesis::from(s.genesis);
|
||||||
let GenericSeal(seal_rlp) = g.seal.into();
|
let GenericSeal(seal_rlp) = g.seal.into();
|
||||||
let params = CommonParams::from(s.params);
|
let params = CommonParams::from(s.params);
|
||||||
@ -967,6 +977,10 @@ impl Spec {
|
|||||||
#[cfg(any(test, feature = "test-helpers"))]
|
#[cfg(any(test, feature = "test-helpers"))]
|
||||||
pub fn new_test_with_reward() -> Spec { load_bundled!("null_morden_with_reward") }
|
pub fn new_test_with_reward() -> Spec { load_bundled!("null_morden_with_reward") }
|
||||||
|
|
||||||
|
/// Create a new Spec which conforms to the Frontier-era Morden chain except that it's a NullEngine consensus with finality.
|
||||||
|
#[cfg(any(test, feature = "test-helpers"))]
|
||||||
|
pub fn new_test_with_finality() -> Spec { load_bundled!("null_morden_with_finality") }
|
||||||
|
|
||||||
/// Create a new Spec which is a NullEngine consensus with a premine of address whose
|
/// Create a new Spec which is a NullEngine consensus with a premine of address whose
|
||||||
/// secret is keccak('').
|
/// secret is keccak('').
|
||||||
#[cfg(any(test, feature = "test-helpers"))]
|
#[cfg(any(test, feature = "test-helpers"))]
|
||||||
|
@ -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 std::str::FromStr;
|
use std::str::{FromStr, from_utf8};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use ethereum_types::{U256, Address};
|
use ethereum_types::{U256, Address};
|
||||||
@ -22,23 +22,32 @@ use ethkey::KeyPair;
|
|||||||
use hash::keccak;
|
use hash::keccak;
|
||||||
use io::IoChannel;
|
use io::IoChannel;
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
use types::transaction::{PendingTransaction, Transaction, Action, Condition};
|
use types::{
|
||||||
use types::filter::Filter;
|
data_format::DataFormat,
|
||||||
use types::view;
|
ids::BlockId,
|
||||||
use types::views::BlockView;
|
transaction::{PendingTransaction, Transaction, Action, Condition},
|
||||||
|
filter::Filter,
|
||||||
use client::{BlockChainClient, BlockChainReset, Client, ClientConfig, BlockId, ChainInfo, BlockInfo, PrepareOpenBlock, ImportSealedBlock, ImportBlock};
|
view,
|
||||||
|
views::BlockView,
|
||||||
|
};
|
||||||
|
use verification::queue::kind::blocks::Unverified;
|
||||||
|
use client::{Client, ClientConfig, PrepareOpenBlock, ImportSealedBlock};
|
||||||
|
use client::traits::{
|
||||||
|
BlockInfo, BlockChainClient, BlockChainReset, ChainInfo,
|
||||||
|
ImportExportBlocks, ImportBlock
|
||||||
|
};
|
||||||
|
use spec;
|
||||||
use ethereum;
|
use ethereum;
|
||||||
use executive::{Executive, TransactOptions};
|
use executive::{Executive, TransactOptions};
|
||||||
use miner::{Miner, PendingOrdering, MinerService};
|
use miner::{Miner, PendingOrdering, MinerService};
|
||||||
use spec::Spec;
|
use spec::Spec;
|
||||||
use state::{self, State, CleanupMode};
|
use state::{self, State, CleanupMode, StateInfo};
|
||||||
use test_helpers::{
|
use test_helpers::{
|
||||||
self,
|
self,
|
||||||
generate_dummy_client, push_blocks_to_client, get_test_client_with_blocks, get_good_dummy_block_seq,
|
generate_dummy_client, push_blocks_to_client, get_test_client_with_blocks, get_good_dummy_block_seq,
|
||||||
generate_dummy_client_with_data, get_good_dummy_block, get_bad_state_dummy_block
|
generate_dummy_client_with_data, get_good_dummy_block, get_bad_state_dummy_block
|
||||||
};
|
};
|
||||||
use verification::queue::kind::blocks::Unverified;
|
use rustc_hex::ToHex;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn imports_from_empty() {
|
fn imports_from_empty() {
|
||||||
@ -120,7 +129,7 @@ fn query_none_block() {
|
|||||||
Arc::new(Miner::new_for_tests(&spec, None)),
|
Arc::new(Miner::new_for_tests(&spec, None)),
|
||||||
IoChannel::disconnected(),
|
IoChannel::disconnected(),
|
||||||
).unwrap();
|
).unwrap();
|
||||||
let non_existant = client.block_header(BlockId::Number(188));
|
let non_existant = client.block_header(BlockId::Number(188));
|
||||||
assert!(non_existant.is_none());
|
assert!(non_existant.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,3 +395,79 @@ fn reset_blockchain() {
|
|||||||
|
|
||||||
assert!(client.block_header(BlockId::Number(15)).is_some());
|
assert!(client.block_header(BlockId::Number(15)).is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn import_export_hex() {
|
||||||
|
let client = get_test_client_with_blocks(get_good_dummy_block_seq(19));
|
||||||
|
let block_rlps = (15..20)
|
||||||
|
.filter_map(|num| client.block(BlockId::Number(num)))
|
||||||
|
.map(|header| {
|
||||||
|
header.raw().to_hex()
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let mut out = Vec::new();
|
||||||
|
|
||||||
|
client.export_blocks(
|
||||||
|
Box::new(&mut out),
|
||||||
|
BlockId::Number(15),
|
||||||
|
BlockId::Number(20),
|
||||||
|
Some(DataFormat::Hex)
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
let written = from_utf8(&out)
|
||||||
|
.unwrap()
|
||||||
|
.split("\n")
|
||||||
|
// last line is empty, ignore it.
|
||||||
|
.take(5)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(block_rlps, written);
|
||||||
|
|
||||||
|
assert!(client.reset(5).is_ok());
|
||||||
|
client.chain().clear_cache();
|
||||||
|
|
||||||
|
assert!(client.block_header(BlockId::Number(20)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(19)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(18)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(17)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(16)).is_none());
|
||||||
|
|
||||||
|
client.import_blocks(Box::new(&*out), Some(DataFormat::Hex)).unwrap();
|
||||||
|
|
||||||
|
assert!(client.block_header(BlockId::Number(20)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(19)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(18)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(17)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(16)).is_some());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn import_export_binary() {
|
||||||
|
let client = get_test_client_with_blocks(get_good_dummy_block_seq(19));
|
||||||
|
|
||||||
|
let mut out = Vec::new();
|
||||||
|
|
||||||
|
client.export_blocks(
|
||||||
|
Box::new(&mut out),
|
||||||
|
BlockId::Number(15),
|
||||||
|
BlockId::Number(20),
|
||||||
|
Some(DataFormat::Binary)
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
assert!(client.reset(5).is_ok());
|
||||||
|
client.chain().clear_cache();
|
||||||
|
|
||||||
|
assert!(client.block_header(BlockId::Number(20)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(19)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(18)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(17)).is_none());
|
||||||
|
assert!(client.block_header(BlockId::Number(16)).is_none());
|
||||||
|
|
||||||
|
client.import_blocks(Box::new(&*out), Some(DataFormat::Binary)).unwrap();
|
||||||
|
|
||||||
|
assert!(client.block_header(BlockId::Number(19)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(18)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(20)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(17)).is_some());
|
||||||
|
assert!(client.block_header(BlockId::Number(16)).is_some());
|
||||||
|
}
|
||||||
|
43
ethcore/types/src/data_format.rs
Normal file
43
ethcore/types/src/data_format.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// 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/>.
|
||||||
|
|
||||||
|
//! Data format for importing/exporting blocks from disk
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
/// Format for importing/exporting blocks
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub enum DataFormat {
|
||||||
|
Hex,
|
||||||
|
Binary,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for DataFormat {
|
||||||
|
fn default() -> Self {
|
||||||
|
DataFormat::Binary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for DataFormat {
|
||||||
|
type Err = String;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"binary" | "bin" => Ok(DataFormat::Binary),
|
||||||
|
"hex" => Ok(DataFormat::Hex),
|
||||||
|
x => Err(format!("Invalid format: {}", x))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -74,6 +74,7 @@ pub mod trace_filter;
|
|||||||
pub mod transaction;
|
pub mod transaction;
|
||||||
pub mod tree_route;
|
pub mod tree_route;
|
||||||
pub mod verification_queue_info;
|
pub mod verification_queue_info;
|
||||||
|
pub mod data_format;
|
||||||
|
|
||||||
/// Type for block number.
|
/// Type for block number.
|
||||||
pub type BlockNumber = u64;
|
pub type BlockNumber = u64;
|
||||||
|
@ -128,6 +128,7 @@ pub struct RichReceipt {
|
|||||||
/// The gas used in the execution of the transaction. Note the difference of meaning to `Receipt::gas_used`.
|
/// The gas used in the execution of the transaction. Note the difference of meaning to `Receipt::gas_used`.
|
||||||
pub gas_used: U256,
|
pub gas_used: U256,
|
||||||
/// Contract address.
|
/// Contract address.
|
||||||
|
/// NOTE: It is an Option because only `Action::Create` transactions has a contract address
|
||||||
pub contract_address: Option<Address>,
|
pub contract_address: Option<Address>,
|
||||||
/// Logs
|
/// Logs
|
||||||
pub logs: Vec<LogEntry>,
|
pub logs: Vec<LogEntry>,
|
||||||
@ -135,6 +136,11 @@ pub struct RichReceipt {
|
|||||||
pub log_bloom: Bloom,
|
pub log_bloom: Bloom,
|
||||||
/// Transaction outcome.
|
/// Transaction outcome.
|
||||||
pub outcome: TransactionOutcome,
|
pub outcome: TransactionOutcome,
|
||||||
|
/// Receiver address
|
||||||
|
/// NOTE: It is an Option because only `Action::Call` transactions has a receiver address
|
||||||
|
pub to: Option<H160>,
|
||||||
|
/// Sender
|
||||||
|
pub from: H160
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receipt with additional info.
|
/// Receipt with additional info.
|
||||||
@ -153,6 +159,7 @@ pub struct LocalizedReceipt {
|
|||||||
/// The gas used in the execution of the transaction. Note the difference of meaning to `Receipt::gas_used`.
|
/// The gas used in the execution of the transaction. Note the difference of meaning to `Receipt::gas_used`.
|
||||||
pub gas_used: U256,
|
pub gas_used: U256,
|
||||||
/// Contract address.
|
/// Contract address.
|
||||||
|
/// NOTE: It is an Option because only `Action::Create` transactions has a contract address
|
||||||
pub contract_address: Option<Address>,
|
pub contract_address: Option<Address>,
|
||||||
/// Logs
|
/// Logs
|
||||||
pub logs: Vec<LocalizedLogEntry>,
|
pub logs: Vec<LocalizedLogEntry>,
|
||||||
@ -161,6 +168,7 @@ pub struct LocalizedReceipt {
|
|||||||
/// Transaction outcome.
|
/// Transaction outcome.
|
||||||
pub outcome: TransactionOutcome,
|
pub outcome: TransactionOutcome,
|
||||||
/// Receiver address
|
/// Receiver address
|
||||||
|
/// NOTE: It is an Option because only `Action::Call` transactions has a receiver address
|
||||||
pub to: Option<H160>,
|
pub to: Option<H160>,
|
||||||
/// Sender
|
/// Sender
|
||||||
pub from: H160
|
pub from: H160
|
||||||
|
@ -25,6 +25,7 @@ serde_json = "1.0"
|
|||||||
vm = { path = "../ethcore/vm" }
|
vm = { path = "../ethcore/vm" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
criterion = "0.3.0"
|
||||||
pretty_assertions = "0.1"
|
pretty_assertions = "0.1"
|
||||||
tempdir = "0.3"
|
tempdir = "0.3"
|
||||||
|
|
||||||
|
@ -17,69 +17,83 @@
|
|||||||
//! benchmarking for EVM
|
//! benchmarking for EVM
|
||||||
//! should be started with:
|
//! should be started with:
|
||||||
//! ```bash
|
//! ```bash
|
||||||
//! multirust run nightly cargo bench
|
//! cargo bench
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
#![feature(test)]
|
#[macro_use]
|
||||||
|
extern crate criterion;
|
||||||
extern crate test;
|
|
||||||
extern crate ethcore;
|
extern crate ethcore;
|
||||||
extern crate evm;
|
extern crate evm;
|
||||||
extern crate ethcore_util;
|
extern crate ethereum_types;
|
||||||
extern crate ethcore_bigint;
|
|
||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
|
extern crate vm;
|
||||||
|
|
||||||
use self::test::{Bencher, black_box};
|
use std::sync::Arc;
|
||||||
|
use criterion::{Criterion, black_box};
|
||||||
|
|
||||||
use evm::run_vm;
|
use ethereum_types::U256;
|
||||||
use ethcore::vm::ActionParams;
|
use evm::Factory;
|
||||||
use ethcore_bigint::prelude::U256;
|
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
|
use vm::tests::FakeExt;
|
||||||
|
use vm::{ActionParams, Ext};
|
||||||
|
|
||||||
#[bench]
|
criterion_group!(
|
||||||
fn simple_loop_usize(b: &mut Bencher) {
|
evmbin,
|
||||||
simple_loop(U256::from(::std::usize::MAX), b)
|
bench_simple_loop_usize,
|
||||||
|
bench_simple_loop_u256,
|
||||||
|
bench_rng_usize,
|
||||||
|
bench_rng_u256
|
||||||
|
);
|
||||||
|
criterion_main!(evmbin);
|
||||||
|
|
||||||
|
fn bench_simple_loop_usize(c: &mut Criterion) {
|
||||||
|
simple_loop(U256::from(::std::usize::MAX), c, "simple_loop_usize")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
fn bench_simple_loop_u256(c: &mut Criterion) {
|
||||||
fn simple_loop_u256(b: &mut Bencher) {
|
simple_loop(!U256::zero(), c, "simple_loop_u256")
|
||||||
simple_loop(!U256::zero(), b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn simple_loop(gas: U256, b: &mut Bencher) {
|
fn simple_loop(gas: U256, c: &mut Criterion, bench_id: &str) {
|
||||||
let code = black_box(
|
let code = black_box(
|
||||||
"606060405260005b620042408112156019575b6001016007565b600081905550600680602b6000396000f3606060405200".from_hex().unwrap()
|
"606060405260005b620042408112156019575b6001016007565b600081905550600680602b6000396000f3606060405200".from_hex().unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
b.iter(|| {
|
c.bench_function(bench_id, move |b| {
|
||||||
let mut params = ActionParams::default();
|
b.iter(|| {
|
||||||
params.gas = gas;
|
let mut params = ActionParams::default();
|
||||||
params.code = Some(code.clone());
|
params.gas = gas;
|
||||||
|
params.code = Some(Arc::new(code.clone()));
|
||||||
|
|
||||||
run_vm(params)
|
let mut ext = FakeExt::new();
|
||||||
|
let evm = Factory::default().create(params, ext.schedule(), ext.depth());
|
||||||
|
let _ = evm.exec(&mut ext);
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
fn bench_rng_usize(c: &mut Criterion) {
|
||||||
fn rng_usize(b: &mut Bencher) {
|
rng(U256::from(::std::usize::MAX), c, "rng_usize")
|
||||||
rng(U256::from(::std::usize::MAX), b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
fn bench_rng_u256(c: &mut Criterion) {
|
||||||
fn rng_u256(b: &mut Bencher) {
|
rng(!U256::zero(), c, "rng_u256")
|
||||||
rng(!U256::zero(), b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rng(gas: U256, b: &mut Bencher) {
|
fn rng(gas: U256, c: &mut Criterion, bench_id: &str) {
|
||||||
let code = black_box(
|
let code = black_box(
|
||||||
"6060604052600360056007600b60005b62004240811215607f5767ffe7649d5eca84179490940267f47ed85c4b9a6379019367f8e5dd9a5c994bba9390930267f91d87e4b8b74e55019267ff97f6f3b29cda529290920267f393ada8dd75c938019167fe8d437c45bb3735830267f47d9a7b5428ffec019150600101600f565b838518831882186000555050505050600680609a6000396000f3606060405200".from_hex().unwrap()
|
"6060604052600360056007600b60005b62004240811215607f5767ffe7649d5eca84179490940267f47ed85c4b9a6379019367f8e5dd9a5c994bba9390930267f91d87e4b8b74e55019267ff97f6f3b29cda529290920267f393ada8dd75c938019167fe8d437c45bb3735830267f47d9a7b5428ffec019150600101600f565b838518831882186000555050505050600680609a6000396000f3606060405200".from_hex().unwrap()
|
||||||
);
|
);
|
||||||
|
|
||||||
b.iter(|| {
|
c.bench_function(bench_id, move |b| {
|
||||||
let mut params = ActionParams::default();
|
b.iter(|| {
|
||||||
params.gas = gas;
|
let mut params = ActionParams::default();
|
||||||
params.code = Some(code.clone());
|
params.gas = gas;
|
||||||
|
params.code = Some(Arc::new(code.clone()));
|
||||||
|
|
||||||
run_vm(params)
|
let mut ext = FakeExt::new();
|
||||||
|
let evm = Factory::default().create(params, ext.schedule(), ext.depth());
|
||||||
|
let _ = evm.exec(&mut ext);
|
||||||
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
ethcore = { path = "../ethcore" }
|
ethcore = { path = "../ethcore" }
|
||||||
parity-bytes = "0.1"
|
parity-bytes = "0.1"
|
||||||
ethereum-types = "0.4"
|
ethereum-types = "0.4"
|
||||||
jsonrpc-core = "10.0.1"
|
jsonrpc-core = "14.0.3"
|
||||||
jsonrpc-http-server = "10.0.1"
|
jsonrpc-http-server = "14.0.3"
|
||||||
rlp = { version = "0.3.0", features = ["ethereum"] }
|
rlp = { version = "0.3.0", features = ["ethereum"] }
|
||||||
cid = "0.3"
|
cid = "0.3"
|
||||||
multihash = "0.8"
|
multihash = "0.8"
|
||||||
|
@ -11,3 +11,5 @@ serde = "1.0"
|
|||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
macros = { path = "../util/macros" }
|
||||||
|
@ -20,6 +20,9 @@ extern crate serde_json;
|
|||||||
extern crate ethereum_types;
|
extern crate ethereum_types;
|
||||||
#[macro_use] extern crate serde_derive;
|
#[macro_use] extern crate serde_derive;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate macros;
|
||||||
|
|
||||||
pub mod hash;
|
pub mod hash;
|
||||||
pub mod uint;
|
pub mod uint;
|
||||||
pub mod bytes;
|
pub mod bytes;
|
||||||
|
@ -17,16 +17,18 @@
|
|||||||
//! Spec account deserialization.
|
//! Spec account deserialization.
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use spec::builtin::Builtin;
|
use spec::builtin::BuiltinCompat;
|
||||||
|
|
||||||
/// Spec account.
|
/// Spec account.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct Account {
|
pub struct Account {
|
||||||
/// Builtin contract.
|
/// Builtin contract.
|
||||||
pub builtin: Option<Builtin>,
|
pub builtin: Option<BuiltinCompat>,
|
||||||
/// Balance.
|
/// Balance.
|
||||||
pub balance: Option<Uint>,
|
pub balance: Option<Uint>,
|
||||||
/// Nonce.
|
/// Nonce.
|
||||||
@ -102,7 +104,15 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn account_empty() {
|
fn account_empty() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } }
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 3000,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}"#;
|
}"#;
|
||||||
let deserialized: Account = serde_json::from_str(s).unwrap();
|
let deserialized: Account = serde_json::from_str(s).unwrap();
|
||||||
assert!(deserialized.is_empty());
|
assert!(deserialized.is_empty());
|
||||||
@ -113,8 +123,16 @@ mod tests {
|
|||||||
let s = r#"{
|
let s = r#"{
|
||||||
"balance": "1",
|
"balance": "1",
|
||||||
"nonce": "0",
|
"nonce": "0",
|
||||||
"builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } },
|
"code": "1234",
|
||||||
"code": "1234"
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 3000,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}"#;
|
}"#;
|
||||||
let deserialized: Account = serde_json::from_str(s).unwrap();
|
let deserialized: Account = serde_json::from_str(s).unwrap();
|
||||||
assert!(!deserialized.is_empty());
|
assert!(!deserialized.is_empty());
|
||||||
|
@ -17,16 +17,16 @@
|
|||||||
//! Spec builtin deserialization.
|
//! Spec builtin deserialization.
|
||||||
|
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
/// Linear pricing.
|
/// Linear pricing.
|
||||||
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct Linear {
|
pub struct Linear {
|
||||||
/// Base price.
|
/// Base price.
|
||||||
pub base: usize,
|
pub base: u64,
|
||||||
/// Price for word.
|
/// Price for word.
|
||||||
pub word: usize,
|
pub word: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pricing for modular exponentiation.
|
/// Pricing for modular exponentiation.
|
||||||
@ -34,7 +34,7 @@ pub struct Linear {
|
|||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct Modexp {
|
pub struct Modexp {
|
||||||
/// Price divisor.
|
/// Price divisor.
|
||||||
pub divisor: usize,
|
pub divisor: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pricing for constant alt_bn128 operations (ECADD and ECMUL)
|
/// Pricing for constant alt_bn128 operations (ECADD and ECMUL)
|
||||||
@ -42,9 +42,7 @@ pub struct Modexp {
|
|||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct AltBn128ConstOperations {
|
pub struct AltBn128ConstOperations {
|
||||||
/// price
|
/// price
|
||||||
pub price: usize,
|
pub price: u64,
|
||||||
/// EIP 1108 transition price
|
|
||||||
pub eip1108_transition_price: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pricing for alt_bn128_pairing.
|
/// Pricing for alt_bn128_pairing.
|
||||||
@ -52,13 +50,9 @@ pub struct AltBn128ConstOperations {
|
|||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct AltBn128Pairing {
|
pub struct AltBn128Pairing {
|
||||||
/// Base price.
|
/// Base price.
|
||||||
pub base: usize,
|
pub base: u64,
|
||||||
/// Price per point pair.
|
/// Price per point pair.
|
||||||
pub pair: usize,
|
pub pair: u64,
|
||||||
/// EIP 1108 transition base price
|
|
||||||
pub eip1108_transition_base: usize,
|
|
||||||
/// EIP 1108 transition price per point pair
|
|
||||||
pub eip1108_transition_pair: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Pricing variants.
|
/// Pricing variants.
|
||||||
@ -81,25 +75,72 @@ pub enum Pricing {
|
|||||||
AltBn128ConstOperations(AltBn128ConstOperations),
|
AltBn128ConstOperations(AltBn128ConstOperations),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Spec builtin.
|
/// Builtin compability layer
|
||||||
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
|
pub struct BuiltinCompat {
|
||||||
|
/// Builtin name.
|
||||||
|
name: String,
|
||||||
|
/// Builtin pricing.
|
||||||
|
pricing: PricingCompat,
|
||||||
|
/// Activation block.
|
||||||
|
activate_at: Option<Uint>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Spec builtin.
|
||||||
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
pub struct Builtin {
|
pub struct Builtin {
|
||||||
/// Builtin name.
|
/// Builtin name.
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// Builtin pricing.
|
/// Builtin pricing.
|
||||||
pub pricing: Pricing,
|
pub pricing: BTreeMap<u64, PricingAt>,
|
||||||
/// Activation block.
|
}
|
||||||
pub activate_at: Option<Uint>,
|
|
||||||
/// EIP 1108
|
impl From<BuiltinCompat> for Builtin {
|
||||||
pub eip1108_transition: Option<Uint>,
|
fn from(legacy: BuiltinCompat) -> Self {
|
||||||
|
let pricing = match legacy.pricing {
|
||||||
|
PricingCompat::Single(pricing) => {
|
||||||
|
let mut map = BTreeMap::new();
|
||||||
|
let activate_at: u64 = legacy.activate_at.map_or(0, Into::into);
|
||||||
|
map.insert(activate_at, PricingAt { info: None, price: pricing });
|
||||||
|
map
|
||||||
|
}
|
||||||
|
PricingCompat::Multi(pricings) => {
|
||||||
|
pricings.into_iter().map(|(a, p)| (a.into(), p)).collect()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Self { name: legacy.name, pricing }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compability layer for different pricings
|
||||||
|
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
||||||
|
#[serde(rename_all = "snake_case")]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
enum PricingCompat {
|
||||||
|
/// Single builtin
|
||||||
|
Single(Pricing),
|
||||||
|
/// Multiple builtins
|
||||||
|
Multi(BTreeMap<Uint, PricingAt>),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Price for a builtin, with the block number to activate it on
|
||||||
|
#[derive(Debug, PartialEq, Deserialize, Clone)]
|
||||||
|
#[serde(deny_unknown_fields)]
|
||||||
|
pub struct PricingAt {
|
||||||
|
/// Description of the activation, e.g. "PunyPony HF, March 12, 2025".
|
||||||
|
pub info: Option<String>,
|
||||||
|
/// Builtin pricing.
|
||||||
|
pub price: Pricing,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use spec::builtin::{Builtin, Pricing, Linear, Modexp};
|
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
|
use super::{Builtin, BuiltinCompat, BTreeMap, Pricing, PricingAt, Linear, Modexp, AltBn128ConstOperations};
|
||||||
|
use macros::map;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn builtin_deserialization() {
|
fn builtin_deserialization() {
|
||||||
@ -107,10 +148,42 @@ mod tests {
|
|||||||
"name": "ecrecover",
|
"name": "ecrecover",
|
||||||
"pricing": { "linear": { "base": 3000, "word": 0 } }
|
"pricing": { "linear": { "base": 3000, "word": 0 } }
|
||||||
}"#;
|
}"#;
|
||||||
let deserialized: Builtin = serde_json::from_str(s).unwrap();
|
let builtin: Builtin = serde_json::from_str::<BuiltinCompat>(s).unwrap().into();
|
||||||
assert_eq!(deserialized.name, "ecrecover");
|
assert_eq!(builtin.name, "ecrecover");
|
||||||
assert_eq!(deserialized.pricing, Pricing::Linear(Linear { base: 3000, word: 0 }));
|
assert_eq!(builtin.pricing, map![
|
||||||
assert!(deserialized.activate_at.is_none());
|
0 => PricingAt {
|
||||||
|
info: None,
|
||||||
|
price: Pricing::Linear(Linear { base: 3000, word: 0 })
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialize_multiple_pricings() {
|
||||||
|
let s = r#"{
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"0": {
|
||||||
|
"price": {"linear": { "base": 3000, "word": 0 }}
|
||||||
|
},
|
||||||
|
"500": {
|
||||||
|
"info": "enable fake EIP at block 500",
|
||||||
|
"price": {"linear": { "base": 10, "word": 0 }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}"#;
|
||||||
|
let builtin: Builtin = serde_json::from_str::<BuiltinCompat>(s).unwrap().into();
|
||||||
|
assert_eq!(builtin.name, "ecrecover");
|
||||||
|
assert_eq!(builtin.pricing, map![
|
||||||
|
0 => PricingAt {
|
||||||
|
info: None,
|
||||||
|
price: Pricing::Linear(Linear { base: 3000, word: 0 })
|
||||||
|
},
|
||||||
|
500 => PricingAt {
|
||||||
|
info: Some(String::from("enable fake EIP at block 500")),
|
||||||
|
price: Pricing::Linear(Linear { base: 10, word: 0 })
|
||||||
|
}
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -120,10 +193,14 @@ mod tests {
|
|||||||
"activate_at": "0xffffff",
|
"activate_at": "0xffffff",
|
||||||
"pricing": { "blake2_f": { "gas_per_round": 123 } }
|
"pricing": { "blake2_f": { "gas_per_round": 123 } }
|
||||||
}"#;
|
}"#;
|
||||||
let deserialized: Builtin = serde_json::from_str(s).unwrap();
|
let builtin: Builtin = serde_json::from_str::<BuiltinCompat>(s).unwrap().into();
|
||||||
assert_eq!(deserialized.name, "blake2_f");
|
assert_eq!(builtin.name, "blake2_f");
|
||||||
assert_eq!(deserialized.pricing, Pricing::Blake2F { gas_per_round: 123 });
|
assert_eq!(builtin.pricing, map![
|
||||||
assert!(deserialized.activate_at.is_some());
|
0xffffff => PricingAt {
|
||||||
|
info: None,
|
||||||
|
price: Pricing::Blake2F { gas_per_round: 123 }
|
||||||
|
}
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -134,9 +211,13 @@ mod tests {
|
|||||||
"pricing": { "modexp": { "divisor": 5 } }
|
"pricing": { "modexp": { "divisor": 5 } }
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Builtin = serde_json::from_str(s).unwrap();
|
let builtin: Builtin = serde_json::from_str::<BuiltinCompat>(s).unwrap().into();
|
||||||
assert_eq!(deserialized.name, "late_start");
|
assert_eq!(builtin.name, "late_start");
|
||||||
assert_eq!(deserialized.pricing, Pricing::Modexp(Modexp { divisor: 5 }));
|
assert_eq!(builtin.pricing, map![
|
||||||
assert_eq!(deserialized.activate_at, Some(Uint(100000.into())));
|
100_000 => PricingAt {
|
||||||
|
info: None,
|
||||||
|
price: Pricing::Modexp(Modexp { divisor: 5 })
|
||||||
|
}
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@ use uint::Uint;
|
|||||||
pub struct NullEngineParams {
|
pub struct NullEngineParams {
|
||||||
/// Block reward.
|
/// Block reward.
|
||||||
pub block_reward: Option<Uint>,
|
pub block_reward: Option<Uint>,
|
||||||
|
/// Immediate finalization.
|
||||||
|
pub immediate_finalization: Option<bool>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Null engine descriptor
|
/// Null engine descriptor
|
||||||
|
@ -76,63 +76,63 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn should_error_on_unknown_fields() {
|
fn should_error_on_unknown_fields() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"name": "Morden",
|
"name": "Morden",
|
||||||
"dataDir": "morden",
|
"dataDir": "morden",
|
||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"homesteadTransition" : "0x",
|
"homesteadTransition" : "0x",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
||||||
"daoHardforkAccounts": []
|
"daoHardforkAccounts": []
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
"params": {
|
|
||||||
"accountStartNonce": "0x0100000",
|
|
||||||
"maximumExtraDataSize": "0x20",
|
|
||||||
"minGasLimit": "0x1388",
|
|
||||||
"networkID" : "0x2",
|
|
||||||
"forkBlock": "0xffffffffffffffff",
|
|
||||||
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"gasLimitBoundDivisor": "0x20",
|
|
||||||
"unknownField": "0x0"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"seal": {
|
|
||||||
"ethereum": {
|
|
||||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"nonce": "0x00006d6f7264656e"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"difficulty": "0x20000",
|
"params": {
|
||||||
"author": "0x0000000000000000000000000000000000000000",
|
"accountStartNonce": "0x0100000",
|
||||||
"timestamp": "0x00",
|
"maximumExtraDataSize": "0x20",
|
||||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
"minGasLimit": "0x1388",
|
||||||
"extraData": "0x",
|
"networkID" : "0x2",
|
||||||
"gasLimit": "0x2fefd8"
|
"forkBlock": "0xffffffffffffffff",
|
||||||
},
|
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"nodes": [
|
"gasLimitBoundDivisor": "0x20",
|
||||||
"enode://b1217cbaa440e35ed471157123fe468e19e8b5ad5bedb4b1fdbcbdab6fb2f5ed3e95dd9c24a22a79fdb2352204cea207df27d92bfd21bfd41545e8b16f637499@104.44.138.37:30303"
|
"unknownField": "0x0"
|
||||||
],
|
},
|
||||||
"accounts": {
|
"genesis": {
|
||||||
"0000000000000000000000000000000000000001": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
"seal": {
|
||||||
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
"ethereum": {
|
||||||
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
"nonce": "0x00006d6f7264656e"
|
||||||
"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }
|
}
|
||||||
},
|
},
|
||||||
"hardcodedSync": {
|
"difficulty": "0x20000",
|
||||||
"header": "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23",
|
"author": "0x0000000000000000000000000000000000000000",
|
||||||
"totalDifficulty": "0x400000000",
|
"timestamp": "0x00",
|
||||||
"CHTs": [
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"extraData": "0x",
|
||||||
|
"gasLimit": "0x2fefd8"
|
||||||
|
},
|
||||||
|
"nodes": [
|
||||||
|
"enode://b1217cbaa440e35ed471157123fe468e19e8b5ad5bedb4b1fdbcbdab6fb2f5ed3e95dd9c24a22a79fdb2352204cea207df27d92bfd21bfd41545e8b16f637499@104.44.138.37:30303"
|
||||||
|
],
|
||||||
|
"accounts": {
|
||||||
|
"0000000000000000000000000000000000000001": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
||||||
|
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
||||||
|
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
||||||
|
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
||||||
|
"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }
|
||||||
|
},
|
||||||
|
"hardcodedSync": {
|
||||||
|
"header": "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23",
|
||||||
|
"totalDifficulty": "0x400000000",
|
||||||
|
"CHTs": [
|
||||||
"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
||||||
"0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
"0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}"#;
|
}"#;
|
||||||
let result: Result<Spec, _> = serde_json::from_str(s);
|
let result: Result<Spec, _> = serde_json::from_str(s);
|
||||||
assert!(result.is_err());
|
assert!(result.is_err());
|
||||||
@ -141,62 +141,110 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn spec_deserialization() {
|
fn spec_deserialization() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"name": "Morden",
|
"name": "Morden",
|
||||||
"dataDir": "morden",
|
"dataDir": "morden",
|
||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"homesteadTransition" : "0x",
|
"homesteadTransition" : "0x",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
||||||
"daoHardforkAccounts": []
|
"daoHardforkAccounts": []
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
"params": {
|
|
||||||
"accountStartNonce": "0x0100000",
|
|
||||||
"maximumExtraDataSize": "0x20",
|
|
||||||
"minGasLimit": "0x1388",
|
|
||||||
"networkID" : "0x2",
|
|
||||||
"forkBlock": "0xffffffffffffffff",
|
|
||||||
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"gasLimitBoundDivisor": "0x20"
|
|
||||||
},
|
|
||||||
"genesis": {
|
|
||||||
"seal": {
|
|
||||||
"ethereum": {
|
|
||||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
|
||||||
"nonce": "0x00006d6f7264656e"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"difficulty": "0x20000",
|
"params": {
|
||||||
"author": "0x0000000000000000000000000000000000000000",
|
"accountStartNonce": "0x0100000",
|
||||||
"timestamp": "0x00",
|
"maximumExtraDataSize": "0x20",
|
||||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
"minGasLimit": "0x1388",
|
||||||
"extraData": "0x",
|
"networkID" : "0x2",
|
||||||
"gasLimit": "0x2fefd8"
|
"forkBlock": "0xffffffffffffffff",
|
||||||
},
|
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"nodes": [
|
"gasLimitBoundDivisor": "0x20"
|
||||||
"enode://b1217cbaa440e35ed471157123fe468e19e8b5ad5bedb4b1fdbcbdab6fb2f5ed3e95dd9c24a22a79fdb2352204cea207df27d92bfd21bfd41545e8b16f637499@104.44.138.37:30303"
|
},
|
||||||
],
|
"genesis": {
|
||||||
"accounts": {
|
"seal": {
|
||||||
"0000000000000000000000000000000000000001": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
|
"ethereum": {
|
||||||
"0000000000000000000000000000000000000002": { "balance": "1", "nonce": "1048576", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
|
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"0000000000000000000000000000000000000003": { "balance": "1", "nonce": "1048576", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
|
"nonce": "0x00006d6f7264656e"
|
||||||
"0000000000000000000000000000000000000004": { "balance": "1", "nonce": "1048576", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
|
}
|
||||||
"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }
|
},
|
||||||
},
|
"difficulty": "0x20000",
|
||||||
"hardcodedSync": {
|
"author": "0x0000000000000000000000000000000000000000",
|
||||||
"header": "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23",
|
"timestamp": "0x00",
|
||||||
"totalDifficulty": "0x400000000",
|
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
"CHTs": [
|
"extraData": "0x",
|
||||||
"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
"gasLimit": "0x2fefd8"
|
||||||
"0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
},
|
||||||
]
|
"nodes": [
|
||||||
}
|
"enode://b1217cbaa440e35ed471157123fe468e19e8b5ad5bedb4b1fdbcbdab6fb2f5ed3e95dd9c24a22a79fdb2352204cea207df27d92bfd21bfd41545e8b16f637499@104.44.138.37:30303"
|
||||||
|
],
|
||||||
|
"accounts": {
|
||||||
|
"0000000000000000000000000000000000000001": {
|
||||||
|
"balance": "1",
|
||||||
|
"nonce": "1048576",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ecrecover",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 3000,
|
||||||
|
"word": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0000000000000000000000000000000000000002": {
|
||||||
|
"balance": "1",
|
||||||
|
"nonce": "1048576",
|
||||||
|
"builtin": {
|
||||||
|
"name": "sha256",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 60,
|
||||||
|
"word": 12
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0000000000000000000000000000000000000003": {
|
||||||
|
"balance": "1",
|
||||||
|
"nonce": "1048576",
|
||||||
|
"builtin": {
|
||||||
|
"name": "ripemd160",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 600,
|
||||||
|
"word": 120
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"0000000000000000000000000000000000000004": {
|
||||||
|
"balance": "1",
|
||||||
|
"nonce": "1048576",
|
||||||
|
"builtin": {
|
||||||
|
"name": "identity",
|
||||||
|
"pricing": {
|
||||||
|
"linear": {
|
||||||
|
"base": 15,
|
||||||
|
"word": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376", "nonce": "1048576" }
|
||||||
|
},
|
||||||
|
"hardcodedSync": {
|
||||||
|
"header": "f901f9a0d405da4e66f1445d455195229624e133f5baafe72b5cf7b3c36c12c8146e98b7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05fb2b4bfdef7b314451cb138a534d225c922fc0e5fbe25e451142732c3e25c25a088d2ec6b9860aae1a2c3b299f72b6a5d70d7f7ba4722c78f2c49ba96273c2158a007c6fdfa8eea7e86b81f5b0fc0f78f90cc19f4aa60d323151e0cac660199e9a1b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefba82524d84568e932a80a0a0349d8c3df71f1a48a9df7d03fd5f14aeee7d91332c009ecaff0a71ead405bd88ab4e252a7e8c2a23",
|
||||||
|
"totalDifficulty": "0x400000000",
|
||||||
|
"CHTs": [
|
||||||
|
"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
|
||||||
|
"0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
|
||||||
|
]
|
||||||
|
}
|
||||||
}"#;
|
}"#;
|
||||||
let _deserialized: Spec = serde_json::from_str(s).unwrap();
|
let _deserialized: Spec = serde_json::from_str(s).unwrap();
|
||||||
// TODO: validate all fields
|
// TODO: validate all fields
|
||||||
|
@ -31,7 +31,7 @@ impl State {
|
|||||||
pub fn builtins(&self) -> BTreeMap<Address, Builtin> {
|
pub fn builtins(&self) -> BTreeMap<Address, Builtin> {
|
||||||
self.0
|
self.0
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(add, ref acc)| acc.builtin.clone().map(|b| (add.clone(), b)))
|
.filter_map(|(add, ref acc)| acc.builtin.clone().map(|b| (add.clone(), b.into())))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
ethash = { path = "../ethash", optional = true }
|
ethash = { path = "../ethash", optional = true }
|
||||||
fetch = { path = "../util/fetch", optional = true }
|
fetch = { path = "../util/fetch", optional = true }
|
||||||
hyper = { version = "0.12", optional = true }
|
hyper = { version = "0.12", optional = true }
|
||||||
url = { version = "1", optional = true }
|
url = { version = "2", optional = true }
|
||||||
|
|
||||||
# Miner
|
# Miner
|
||||||
ansi_term = "0.10"
|
ansi_term = "0.10"
|
||||||
|
@ -92,8 +92,7 @@ impl<F> cmp::PartialEq for Client<F> {
|
|||||||
|
|
||||||
impl<F: Fetch> Client<F> {
|
impl<F: Fetch> Client<F> {
|
||||||
/// Creates a new instance of the `Client` given a `fetch::Client`.
|
/// Creates a new instance of the `Client` given a `fetch::Client`.
|
||||||
pub fn new(fetch: F, pool: Executor) -> Client<F> {
|
pub fn new(fetch: F, pool: Executor, api_endpoint: String) -> Client<F> {
|
||||||
let api_endpoint = "https://api.etherscan.io/api?module=stats&action=ethprice".to_owned();
|
|
||||||
Client { pool, api_endpoint, fetch }
|
Client { pool, api_endpoint, fetch }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,11 +141,11 @@ mod test {
|
|||||||
use fake_fetch::FakeFetch;
|
use fake_fetch::FakeFetch;
|
||||||
|
|
||||||
fn price_info_ok(response: &str, executor: Executor) -> Client<FakeFetch<String>> {
|
fn price_info_ok(response: &str, executor: Executor) -> Client<FakeFetch<String>> {
|
||||||
Client::new(FakeFetch::new(Some(response.to_owned())), executor)
|
Client::new(FakeFetch::new(Some(response.to_owned())), executor, "fake_endpoint".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn price_info_not_found(executor: Executor) -> Client<FakeFetch<String>> {
|
fn price_info_not_found(executor: Executor) -> Client<FakeFetch<String>> {
|
||||||
Client::new(FakeFetch::new(None::<String>), executor)
|
Client::new(FakeFetch::new(None::<String>), executor, "fake_endpoint".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -43,11 +43,11 @@ pub struct GasPriceCalibrator {
|
|||||||
|
|
||||||
impl GasPriceCalibrator {
|
impl GasPriceCalibrator {
|
||||||
/// Create a new gas price calibrator.
|
/// Create a new gas price calibrator.
|
||||||
pub fn new(options: GasPriceCalibratorOptions, fetch: FetchClient, p: Executor) -> GasPriceCalibrator {
|
pub fn new(options: GasPriceCalibratorOptions, fetch: FetchClient, p: Executor, api_endpoint: String) -> GasPriceCalibrator {
|
||||||
GasPriceCalibrator {
|
GasPriceCalibrator {
|
||||||
options: options,
|
options: options,
|
||||||
next_calibration: Instant::now(),
|
next_calibration: Instant::now(),
|
||||||
price_info: PriceInfoClient::new(fetch, p),
|
price_info: PriceInfoClient::new(fetch, p, api_endpoint),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,8 @@ authors = ["Parity Technologies <admin@parity.io>"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
ethereum-types = "0.4"
|
ethereum-types = "0.4"
|
||||||
keccak-hash = "0.1"
|
keccak-hash = "0.1"
|
||||||
jsonrpc-core = "10.0.1"
|
jsonrpc-core = "14.0.3"
|
||||||
jsonrpc-tcp-server = "10.0.1"
|
jsonrpc-tcp-server = "14.0.3"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
parking_lot = "0.7"
|
parking_lot = "0.7"
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ impl Stratum {
|
|||||||
|
|
||||||
let implementation = Arc::new(StratumImpl {
|
let implementation = Arc::new(StratumImpl {
|
||||||
subscribers: RwLock::default(),
|
subscribers: RwLock::default(),
|
||||||
job_que: RwLock::default(),
|
job_queue: RwLock::default(),
|
||||||
dispatcher,
|
dispatcher,
|
||||||
workers: Arc::new(RwLock::default()),
|
workers: Arc::new(RwLock::default()),
|
||||||
secret,
|
secret,
|
||||||
@ -106,13 +106,9 @@ impl Stratum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PushWorkHandler for Stratum {
|
impl PushWorkHandler for Stratum {
|
||||||
fn push_work_all(&self, payload: String) -> Result<(), Error> {
|
fn push_work_all(&self, payload: String) {
|
||||||
self.implementation.push_work_all(payload, &self.tcp_dispatcher)
|
self.implementation.push_work_all(payload, &self.tcp_dispatcher)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_work(&self, payloads: Vec<String>) -> Result<(), Error> {
|
|
||||||
self.implementation.push_work(payloads, &self.tcp_dispatcher)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Stratum {
|
impl Drop for Stratum {
|
||||||
@ -126,14 +122,14 @@ struct StratumImpl {
|
|||||||
/// Subscribed clients
|
/// Subscribed clients
|
||||||
subscribers: RwLock<Vec<SocketAddr>>,
|
subscribers: RwLock<Vec<SocketAddr>>,
|
||||||
/// List of workers supposed to receive job update
|
/// List of workers supposed to receive job update
|
||||||
job_que: RwLock<HashSet<SocketAddr>>,
|
job_queue: RwLock<HashSet<SocketAddr>>,
|
||||||
/// Payload manager
|
/// Payload manager
|
||||||
dispatcher: Arc<JobDispatcher>,
|
dispatcher: Arc<JobDispatcher>,
|
||||||
/// Authorized workers (socket - worker_id)
|
/// Authorized workers (socket - worker_id)
|
||||||
workers: Arc<RwLock<HashMap<SocketAddr, String>>>,
|
workers: Arc<RwLock<HashMap<SocketAddr, String>>>,
|
||||||
/// Secret if any
|
/// Secret if any
|
||||||
secret: Option<H256>,
|
secret: Option<H256>,
|
||||||
/// Dispatch notify couinter
|
/// Dispatch notify counter
|
||||||
notify_counter: RwLock<u32>,
|
notify_counter: RwLock<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +139,7 @@ impl StratumImpl {
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
self.subscribers.write().push(meta.addr().clone());
|
self.subscribers.write().push(meta.addr().clone());
|
||||||
self.job_que.write().insert(meta.addr().clone());
|
self.job_queue.write().insert(meta.addr().clone());
|
||||||
trace!(target: "stratum", "Subscription request from {:?}", meta.addr());
|
trace!(target: "stratum", "Subscription request from {:?}", meta.addr());
|
||||||
|
|
||||||
Ok(match self.dispatcher.initial() {
|
Ok(match self.dispatcher.initial() {
|
||||||
@ -160,7 +156,7 @@ impl StratumImpl {
|
|||||||
|
|
||||||
/// rpc method `mining.authorize`
|
/// rpc method `mining.authorize`
|
||||||
fn authorize(&self, params: Params, meta: SocketMetadata) -> RpcResult {
|
fn authorize(&self, params: Params, meta: SocketMetadata) -> RpcResult {
|
||||||
params.parse::<(String, String)>().map(|(worker_id, secret)|{
|
params.parse::<(String, String)>().map(|(worker_id, secret)| {
|
||||||
if let Some(valid_secret) = self.secret {
|
if let Some(valid_secret) = self.secret {
|
||||||
let hash = keccak(secret);
|
let hash = keccak(secret);
|
||||||
if hash != valid_secret {
|
if hash != valid_secret {
|
||||||
@ -184,15 +180,15 @@ impl StratumImpl {
|
|||||||
_ => None
|
_ => None
|
||||||
})
|
})
|
||||||
.collect::<Vec<String>>()) {
|
.collect::<Vec<String>>()) {
|
||||||
Ok(()) => {
|
Ok(()) => {
|
||||||
self.update_peers(&meta.tcp_dispatcher.expect("tcp_dispatcher is always initialized; qed"));
|
self.update_peers(&meta.tcp_dispatcher.expect("tcp_dispatcher is always initialized; qed"));
|
||||||
to_value(true)
|
to_value(true)
|
||||||
},
|
},
|
||||||
Err(submit_err) => {
|
Err(submit_err) => {
|
||||||
warn!("Error while submitting share: {:?}", submit_err);
|
warn!("Error while submitting share: {:?}", submit_err);
|
||||||
to_value(false)
|
to_value(false)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
trace!(target: "stratum", "Invalid submit work format {:?}", params);
|
trace!(target: "stratum", "Invalid submit work format {:?}", params);
|
||||||
@ -204,36 +200,37 @@ impl StratumImpl {
|
|||||||
/// Helper method
|
/// Helper method
|
||||||
fn update_peers(&self, tcp_dispatcher: &Dispatcher) {
|
fn update_peers(&self, tcp_dispatcher: &Dispatcher) {
|
||||||
if let Some(job) = self.dispatcher.job() {
|
if let Some(job) = self.dispatcher.job() {
|
||||||
if let Err(e) = self.push_work_all(job, tcp_dispatcher) {
|
self.push_work_all(job, tcp_dispatcher)
|
||||||
warn!("Failed to update some of the peers: {:?}", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_work_all(&self, payload: String, tcp_dispatcher: &Dispatcher) -> Result<(), Error> {
|
fn push_work_all(&self, payload: String, tcp_dispatcher: &Dispatcher) {
|
||||||
let hup_peers = {
|
let hup_peers = {
|
||||||
let workers = self.workers.read();
|
let workers = self.workers.read();
|
||||||
let next_request_id = {
|
let next_request_id = {
|
||||||
let mut counter = self.notify_counter.write();
|
let mut counter = self.notify_counter.write();
|
||||||
if *counter == ::std::u32::MAX { *counter = NOTIFY_COUNTER_INITIAL; }
|
if *counter == ::std::u32::MAX {
|
||||||
else { *counter = *counter + 1 }
|
*counter = NOTIFY_COUNTER_INITIAL;
|
||||||
|
} else {
|
||||||
|
*counter = *counter + 1
|
||||||
|
}
|
||||||
*counter
|
*counter
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut hup_peers = HashSet::with_capacity(0); // most of the cases won't be needed, hence avoid allocation
|
let mut hup_peers = HashSet::new();
|
||||||
let workers_msg = format!("{{ \"id\": {}, \"method\": \"mining.notify\", \"params\": {} }}", next_request_id, payload);
|
let workers_msg = format!("{{ \"id\": {}, \"method\": \"mining.notify\", \"params\": {} }}", next_request_id, payload);
|
||||||
trace!(target: "stratum", "pushing work for {} workers (payload: '{}')", workers.len(), &workers_msg);
|
trace!(target: "stratum", "pushing work for {} workers (payload: '{}')", workers.len(), &workers_msg);
|
||||||
for (ref addr, _) in workers.iter() {
|
for (addr, _) in workers.iter() {
|
||||||
trace!(target: "stratum", "pusing work to {}", addr);
|
trace!(target: "stratum", "pusing work to {}", addr);
|
||||||
match tcp_dispatcher.push_message(addr, workers_msg.clone()) {
|
match tcp_dispatcher.push_message(addr, workers_msg.clone()) {
|
||||||
Err(PushMessageError::NoSuchPeer) => {
|
Err(PushMessageError::NoSuchPeer) => {
|
||||||
trace!(target: "stratum", "Worker no longer connected: {}", &addr);
|
trace!(target: "stratum", "Worker no longer connected: {}", addr);
|
||||||
hup_peers.insert(*addr.clone());
|
hup_peers.insert(addr.clone());
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
warn!(target: "stratum", "Unexpected transport error: {:?}", e);
|
warn!(target: "stratum", "Unexpected transport error: {:?}", e);
|
||||||
},
|
},
|
||||||
Ok(_) => { },
|
Ok(_) => {},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hup_peers
|
hup_peers
|
||||||
@ -241,33 +238,10 @@ impl StratumImpl {
|
|||||||
|
|
||||||
if !hup_peers.is_empty() {
|
if !hup_peers.is_empty() {
|
||||||
let mut workers = self.workers.write();
|
let mut workers = self.workers.write();
|
||||||
for hup_peer in hup_peers { workers.remove(&hup_peer); }
|
for hup_peer in hup_peers {
|
||||||
|
workers.remove(&hup_peer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn push_work(&self, payloads: Vec<String>, tcp_dispatcher: &Dispatcher) -> Result<(), Error> {
|
|
||||||
if !payloads.len() > 0 {
|
|
||||||
return Err(Error::NoWork);
|
|
||||||
}
|
|
||||||
let workers = self.workers.read();
|
|
||||||
let addrs = workers.keys().collect::<Vec<&SocketAddr>>();
|
|
||||||
if !workers.len() > 0 {
|
|
||||||
return Err(Error::NoWorkers);
|
|
||||||
}
|
|
||||||
let mut que = payloads;
|
|
||||||
let mut addr_index = 0;
|
|
||||||
while que.len() > 0 {
|
|
||||||
let next_worker = addrs[addr_index];
|
|
||||||
let mut next_payload = que.drain(0..1);
|
|
||||||
tcp_dispatcher.push_message(
|
|
||||||
next_worker,
|
|
||||||
next_payload.nth(0).expect("drained successfully of 0..1, so 0-th element should exist")
|
|
||||||
)?;
|
|
||||||
addr_index = addr_index + 1;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,8 +449,7 @@ mod tests {
|
|||||||
.map_err(|err: timeout::Error<()>| panic!("Timeout: {:?}", err))
|
.map_err(|err: timeout::Error<()>| panic!("Timeout: {:?}", err))
|
||||||
.and_then(move |stream| {
|
.and_then(move |stream| {
|
||||||
trace!(target: "stratum", "Pusing work to peers");
|
trace!(target: "stratum", "Pusing work to peers");
|
||||||
stratum.push_work_all(r#"{ "00040008", "100500" }"#.to_owned())
|
stratum.push_work_all(r#"{ "00040008", "100500" }"#.to_owned());
|
||||||
.expect("Pushing work should produce no errors");
|
|
||||||
Timeout::new(future::ok(stream), ::std::time::Duration::from_millis(100))
|
Timeout::new(future::ok(stream), ::std::time::Duration::from_millis(100))
|
||||||
})
|
})
|
||||||
.map_err(|err: timeout::Error<()>| panic!("Timeout: {:?}", err))
|
.map_err(|err: timeout::Error<()>| panic!("Timeout: {:?}", err))
|
||||||
@ -497,4 +470,11 @@ mod tests {
|
|||||||
"{ \"id\": 17, \"method\": \"mining.notify\", \"params\": { \"00040008\", \"100500\" } }\n",
|
"{ \"id\": 17, \"method\": \"mining.notify\", \"params\": { \"00040008\", \"100500\" } }\n",
|
||||||
response);
|
response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn jsonprc_server_is_send_and_sync() {
|
||||||
|
fn is_send_and_sync<T: Send + Sync>() {}
|
||||||
|
|
||||||
|
is_send_and_sync::<JsonRpcServer>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,10 +55,7 @@ pub trait JobDispatcher: Send + Sync {
|
|||||||
/// Interface that can handle requests to push job for workers
|
/// Interface that can handle requests to push job for workers
|
||||||
pub trait PushWorkHandler: Send + Sync {
|
pub trait PushWorkHandler: Send + Sync {
|
||||||
/// push the same work package for all workers (`payload`: json of pow-specific set of work specification)
|
/// push the same work package for all workers (`payload`: json of pow-specific set of work specification)
|
||||||
fn push_work_all(&self, payload: String) -> Result<(), Error>;
|
fn push_work_all(&self, payload: String);
|
||||||
|
|
||||||
/// push the work packages worker-wise (`payload`: json of pow-specific set of work specification)
|
|
||||||
fn push_work(&self, payloads: Vec<String>) -> Result<(), Error>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ServiceConfiguration {
|
pub struct ServiceConfiguration {
|
||||||
|
@ -14,7 +14,7 @@ futures = "0.1.6"
|
|||||||
jni = { version = "0.11", optional = true }
|
jni = { version = "0.11", optional = true }
|
||||||
panic_hook = { path = "../util/panic-hook" }
|
panic_hook = { path = "../util/panic-hook" }
|
||||||
parity-ethereum = { path = "../", default-features = false }
|
parity-ethereum = { path = "../", default-features = false }
|
||||||
tokio = "0.1.11"
|
tokio = "0.1.22"
|
||||||
tokio-current-thread = "0.1.3"
|
tokio-current-thread = "0.1.3"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
@ -81,7 +81,7 @@ mod accounts {
|
|||||||
hardware_wallet_classic_key: spec == &SpecType::Classic,
|
hardware_wallet_classic_key: spec == &SpecType::Classic,
|
||||||
unlock_keep_secret: cfg.enable_fast_unlock,
|
unlock_keep_secret: cfg.enable_fast_unlock,
|
||||||
blacklisted_accounts: match *spec {
|
blacklisted_accounts: match *spec {
|
||||||
SpecType::Morden | SpecType::Ropsten | SpecType::Kovan | SpecType::Sokol | SpecType::Dev => vec![],
|
SpecType::Morden | SpecType::Mordor | SpecType::Ropsten | SpecType::Kovan | SpecType::Goerli | SpecType::Kotti | SpecType::Sokol | SpecType::Dev => vec![],
|
||||||
_ => vec![
|
_ => vec![
|
||||||
"00a329c0648769a73afac7f9381e08fb43dbea72".into()
|
"00a329c0648769a73afac7f9381e08fb43dbea72".into()
|
||||||
],
|
],
|
||||||
|
@ -14,20 +14,22 @@
|
|||||||
// 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 std::str::{FromStr, from_utf8};
|
use std::str::from_utf8;
|
||||||
use std::{io, fs};
|
use std::{io, fs};
|
||||||
use std::io::{BufReader, BufRead};
|
use std::io::{BufReader, BufRead};
|
||||||
use std::time::{Instant, Duration};
|
use std::time::{Instant, Duration};
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use rustc_hex::FromHex;
|
use rustc_hex::FromHex;
|
||||||
use hash::{keccak, KECCAK_NULL_RLP};
|
use hash::{keccak, KECCAK_NULL_RLP};
|
||||||
use ethereum_types::{U256, H256, Address};
|
use ethereum_types::{U256, H256, Address};
|
||||||
use bytes::ToPretty;
|
use bytes::ToPretty;
|
||||||
use rlp::PayloadInfo;
|
use rlp::PayloadInfo;
|
||||||
use ethcore::client::{
|
use ethcore::client::{
|
||||||
Mode, DatabaseCompactionProfile, VMType, Nonce, Balance, BlockChainClient, BlockId, BlockInfo, ImportBlock, BlockChainReset
|
Mode, DatabaseCompactionProfile, VMType, Nonce, Balance, BlockChainClient, BlockId, BlockInfo, ImportBlock, BlockChainReset, ImportExportBlocks
|
||||||
};
|
};
|
||||||
|
use types::data_format::DataFormat;
|
||||||
use ethcore::error::{ImportErrorKind, ErrorKind as EthcoreErrorKind, Error as EthcoreError};
|
use ethcore::error::{ImportErrorKind, ErrorKind as EthcoreErrorKind, Error as EthcoreError};
|
||||||
use ethcore::miner::Miner;
|
use ethcore::miner::Miner;
|
||||||
use ethcore::verification::queue::VerifierSettings;
|
use ethcore::verification::queue::VerifierSettings;
|
||||||
@ -43,30 +45,6 @@ use ethcore_private_tx;
|
|||||||
use db;
|
use db;
|
||||||
use ansi_term::Colour;
|
use ansi_term::Colour;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
pub enum DataFormat {
|
|
||||||
Hex,
|
|
||||||
Binary,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for DataFormat {
|
|
||||||
fn default() -> Self {
|
|
||||||
DataFormat::Binary
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for DataFormat {
|
|
||||||
type Err = String;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
match s {
|
|
||||||
"binary" | "bin" => Ok(DataFormat::Binary),
|
|
||||||
"hex" => Ok(DataFormat::Hex),
|
|
||||||
x => Err(format!("Invalid format: {}", x))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum BlockchainCmd {
|
pub enum BlockchainCmd {
|
||||||
Kill(KillBlockchain),
|
Kill(KillBlockchain),
|
||||||
@ -228,7 +206,7 @@ fn execute_import_light(cmd: ImportBlockchain) -> Result<(), String> {
|
|||||||
&cmd.cache_config,
|
&cmd.cache_config,
|
||||||
&cmd.compaction).map_err(|e| format!("Failed to open database: {:?}", e))?;
|
&cmd.compaction).map_err(|e| format!("Failed to open database: {:?}", e))?;
|
||||||
|
|
||||||
// TODO: could epoch signals be avilable at the end of the file?
|
// TODO: could epoch signals be available at the end of the file?
|
||||||
let fetch = ::light::client::fetch::unavailable();
|
let fetch = ::light::client::fetch::unavailable();
|
||||||
let service = LightClientService::start(config, &spec, fetch, db, cache)
|
let service = LightClientService::start(config, &spec, fetch, db, cache)
|
||||||
.map_err(|e| format!("Failed to start client: {}", e))?;
|
.map_err(|e| format!("Failed to start client: {}", e))?;
|
||||||
@ -238,7 +216,7 @@ fn execute_import_light(cmd: ImportBlockchain) -> Result<(), String> {
|
|||||||
|
|
||||||
let client = service.client();
|
let client = service.client();
|
||||||
|
|
||||||
let mut instream: Box<io::Read> = match cmd.file_path {
|
let mut instream: Box<dyn io::Read> = match cmd.file_path {
|
||||||
Some(f) => Box::new(fs::File::open(&f).map_err(|_| format!("Cannot open given file: {}", f))?),
|
Some(f) => Box::new(fs::File::open(&f).map_err(|_| format!("Cannot open given file: {}", f))?),
|
||||||
None => Box::new(io::stdin()),
|
None => Box::new(io::stdin()),
|
||||||
};
|
};
|
||||||
@ -406,27 +384,11 @@ fn execute_import(cmd: ImportBlockchain) -> Result<(), String> {
|
|||||||
|
|
||||||
let client = service.client();
|
let client = service.client();
|
||||||
|
|
||||||
let mut instream: Box<io::Read> = match cmd.file_path {
|
let instream: Box<dyn io::Read> = match cmd.file_path {
|
||||||
Some(f) => Box::new(fs::File::open(&f).map_err(|_| format!("Cannot open given file: {}", f))?),
|
Some(f) => Box::new(fs::File::open(&f).map_err(|_| format!("Cannot open given file: {}", f))?),
|
||||||
None => Box::new(io::stdin()),
|
None => Box::new(io::stdin()),
|
||||||
};
|
};
|
||||||
|
|
||||||
const READAHEAD_BYTES: usize = 8;
|
|
||||||
|
|
||||||
let mut first_bytes: Vec<u8> = vec![0; READAHEAD_BYTES];
|
|
||||||
let mut first_read = 0;
|
|
||||||
|
|
||||||
let format = match cmd.format {
|
|
||||||
Some(format) => format,
|
|
||||||
None => {
|
|
||||||
first_read = instream.read(&mut first_bytes).map_err(|_| "Error reading from the file/stream.")?;
|
|
||||||
match first_bytes[0] {
|
|
||||||
0xf9 => DataFormat::Binary,
|
|
||||||
_ => DataFormat::Hex,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let informant = Arc::new(Informant::new(
|
let informant = Arc::new(Informant::new(
|
||||||
FullNodeInformantData {
|
FullNodeInformantData {
|
||||||
client: client.clone(),
|
client: client.clone(),
|
||||||
@ -440,49 +402,7 @@ fn execute_import(cmd: ImportBlockchain) -> Result<(), String> {
|
|||||||
|
|
||||||
service.register_io_handler(informant).map_err(|_| "Unable to register informant handler".to_owned())?;
|
service.register_io_handler(informant).map_err(|_| "Unable to register informant handler".to_owned())?;
|
||||||
|
|
||||||
let do_import = |bytes| {
|
client.import_blocks(instream, cmd.format)?;
|
||||||
let block = Unverified::from_rlp(bytes).map_err(|_| "Invalid block rlp")?;
|
|
||||||
while client.queue_info().is_full() { sleep(Duration::from_secs(1)); }
|
|
||||||
match client.import_block(block) {
|
|
||||||
Err(EthcoreError(EthcoreErrorKind::Import(ImportErrorKind::AlreadyInChain), _)) => {
|
|
||||||
trace!("Skipping block already in chain.");
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
return Err(format!("Cannot import block: {:?}", e));
|
|
||||||
},
|
|
||||||
Ok(_) => {},
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
};
|
|
||||||
|
|
||||||
match format {
|
|
||||||
DataFormat::Binary => {
|
|
||||||
loop {
|
|
||||||
let mut bytes = if first_read > 0 {first_bytes.clone()} else {vec![0; READAHEAD_BYTES]};
|
|
||||||
let n = if first_read > 0 {
|
|
||||||
first_read
|
|
||||||
} else {
|
|
||||||
instream.read(&mut bytes).map_err(|_| "Error reading from the file/stream.")?
|
|
||||||
};
|
|
||||||
if n == 0 { break; }
|
|
||||||
first_read = 0;
|
|
||||||
let s = PayloadInfo::from(&bytes).map_err(|e| format!("Invalid RLP in the file/stream: {:?}", e))?.total();
|
|
||||||
bytes.resize(s, 0);
|
|
||||||
instream.read_exact(&mut bytes[n..]).map_err(|_| "Error reading from the file/stream.")?;
|
|
||||||
do_import(bytes)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DataFormat::Hex => {
|
|
||||||
for line in BufReader::new(instream).lines() {
|
|
||||||
let s = line.map_err(|_| "Error reading from the file/stream.")?;
|
|
||||||
let s = if first_read > 0 {from_utf8(&first_bytes).unwrap().to_owned() + &(s[..])} else {s};
|
|
||||||
first_read = 0;
|
|
||||||
let bytes = s.from_hex().map_err(|_| "Invalid hex in file/stream.")?;
|
|
||||||
do_import(bytes)?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
client.flush_queue();
|
|
||||||
|
|
||||||
// save user defaults
|
// save user defaults
|
||||||
user_defaults.pruning = algorithm;
|
user_defaults.pruning = algorithm;
|
||||||
@ -611,32 +531,14 @@ fn execute_export(cmd: ExportBlockchain) -> Result<(), String> {
|
|||||||
false,
|
false,
|
||||||
cmd.max_round_blocks_to_import,
|
cmd.max_round_blocks_to_import,
|
||||||
)?;
|
)?;
|
||||||
let format = cmd.format.unwrap_or_default();
|
|
||||||
|
|
||||||
let client = service.client();
|
let client = service.client();
|
||||||
|
|
||||||
let mut out: Box<io::Write> = match cmd.file_path {
|
let out: Box<dyn io::Write> = match cmd.file_path {
|
||||||
Some(f) => Box::new(fs::File::create(&f).map_err(|_| format!("Cannot write to file given: {}", f))?),
|
Some(f) => Box::new(fs::File::create(&f).map_err(|_| format!("Cannot write to file given: {}", f))?),
|
||||||
None => Box::new(io::stdout()),
|
None => Box::new(io::stdout()),
|
||||||
};
|
};
|
||||||
|
|
||||||
let from = client.block_number(cmd.from_block).ok_or("From block could not be found")?;
|
client.export_blocks(out, cmd.from_block, cmd.to_block, cmd.format)?;
|
||||||
let to = client.block_number(cmd.to_block).ok_or("To block could not be found")?;
|
|
||||||
|
|
||||||
for i in from..(to + 1) {
|
|
||||||
if i % 10000 == 0 {
|
|
||||||
info!("#{}", i);
|
|
||||||
}
|
|
||||||
let b = client.block(BlockId::Number(i)).ok_or("Error exporting incomplete chain")?.into_inner();
|
|
||||||
match format {
|
|
||||||
DataFormat::Binary => {
|
|
||||||
out.write(&b).map_err(|e| format!("Couldn't write to stream. Cause: {}", e))?;
|
|
||||||
}
|
|
||||||
DataFormat::Hex => {
|
|
||||||
out.write_fmt(format_args!("{}", b.pretty())).map_err(|e| format!("Couldn't write to stream. Cause: {}", e))?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info!("Export completed.");
|
info!("Export completed.");
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -659,7 +561,7 @@ fn execute_export_state(cmd: ExportState) -> Result<(), String> {
|
|||||||
|
|
||||||
let client = service.client();
|
let client = service.client();
|
||||||
|
|
||||||
let mut out: Box<io::Write> = match cmd.file_path {
|
let mut out: Box<dyn io::Write> = match cmd.file_path {
|
||||||
Some(f) => Box::new(fs::File::create(&f).map_err(|_| format!("Cannot write to file given: {}", f))?),
|
Some(f) => Box::new(fs::File::create(&f).map_err(|_| format!("Cannot write to file given: {}", f))?),
|
||||||
None => Box::new(io::stdout()),
|
None => Box::new(io::stdout()),
|
||||||
};
|
};
|
||||||
|
@ -300,7 +300,7 @@ usage! {
|
|||||||
|
|
||||||
ARG arg_chain: (String) = "foundation", or |c: &Config| c.parity.as_ref()?.chain.clone(),
|
ARG arg_chain: (String) = "foundation", or |c: &Config| c.parity.as_ref()?.chain.clone(),
|
||||||
"--chain=[CHAIN]",
|
"--chain=[CHAIN]",
|
||||||
"Specify the blockchain type. CHAIN may be either a JSON chain specification file or ethereum, classic, poacore, xdai, volta, ewc, expanse, musicoin, ellaism, mix, callisto, morden, ropsten, kovan, rinkeby, goerli, kotti, poasokol, testnet, or dev.",
|
"Specify the blockchain type. CHAIN may be either a JSON chain specification file or ethereum, classic, poacore, xdai, volta, ewc, musicoin, ellaism, mix, callisto, morden, mordor, ropsten, kovan, rinkeby, goerli, kotti, poasokol, testnet, or dev.",
|
||||||
|
|
||||||
ARG arg_keys_path: (String) = "$BASE/keys", or |c: &Config| c.parity.as_ref()?.keys_path.clone(),
|
ARG arg_keys_path: (String) = "$BASE/keys", or |c: &Config| c.parity.as_ref()?.keys_path.clone(),
|
||||||
"--keys-path=[PATH]",
|
"--keys-path=[PATH]",
|
||||||
@ -1556,14 +1556,14 @@ mod tests {
|
|||||||
// given
|
// given
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
let mut operating = Operating::default();
|
let mut operating = Operating::default();
|
||||||
operating.chain = Some("morden".into());
|
operating.chain = Some("mordor".into());
|
||||||
config.parity = Some(operating);
|
config.parity = Some(operating);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
let args = Args::parse_with_config(&["parity"], config).unwrap();
|
let args = Args::parse_with_config(&["parity"], config).unwrap();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assert_eq!(args.arg_chain, "morden".to_owned());
|
assert_eq!(args.arg_chain, "mordor".to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -1571,7 +1571,7 @@ mod tests {
|
|||||||
// given
|
// given
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
let mut operating = Operating::default();
|
let mut operating = Operating::default();
|
||||||
operating.chain = Some("morden".into());
|
operating.chain = Some("mordor".into());
|
||||||
config.parity = Some(operating);
|
config.parity = Some(operating);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
|
@ -50,7 +50,8 @@ use ethcore_private_tx::{ProviderConfig, EncryptorConfig};
|
|||||||
use secretstore::{NodeSecretKey, Configuration as SecretStoreConfiguration, ContractAddress as SecretStoreContractAddress};
|
use secretstore::{NodeSecretKey, Configuration as SecretStoreConfiguration, ContractAddress as SecretStoreContractAddress};
|
||||||
use updater::{UpdatePolicy, UpdateFilter, ReleaseTrack};
|
use updater::{UpdatePolicy, UpdateFilter, ReleaseTrack};
|
||||||
use run::RunCmd;
|
use run::RunCmd;
|
||||||
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, KillBlockchain, ExportState, DataFormat, ResetBlockchain};
|
use types::data_format::DataFormat;
|
||||||
|
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, KillBlockchain, ExportState, ResetBlockchain};
|
||||||
use export_hardcoded_sync::ExportHsyncCmd;
|
use export_hardcoded_sync::ExportHsyncCmd;
|
||||||
use presale::ImportWallet;
|
use presale::ImportWallet;
|
||||||
use account::{AccountCmd, NewAccount, ListAccounts, ImportAccounts, ImportFromGethAccounts};
|
use account::{AccountCmd, NewAccount, ListAccounts, ImportAccounts, ImportFromGethAccounts};
|
||||||
@ -59,6 +60,7 @@ use network::{IpFilter};
|
|||||||
|
|
||||||
const DEFAULT_MAX_PEERS: u16 = 50;
|
const DEFAULT_MAX_PEERS: u16 = 50;
|
||||||
const DEFAULT_MIN_PEERS: u16 = 25;
|
const DEFAULT_MIN_PEERS: u16 = 25;
|
||||||
|
pub const ETHERSCAN_ETH_PRICE_ENDPOINT: &str = "https://api.etherscan.io/api?module=stats&action=ethprice";
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum Cmd {
|
pub enum Cmd {
|
||||||
@ -668,23 +670,30 @@ impl Configuration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let usd_per_tx = to_price(&self.args.arg_usd_per_tx)?;
|
let usd_per_tx = to_price(&self.args.arg_usd_per_tx)?;
|
||||||
if "auto" == self.args.arg_usd_per_eth.as_str() {
|
|
||||||
return Ok(GasPricerConfig::Calibrated {
|
if "auto" == self.args.arg_usd_per_eth {
|
||||||
|
Ok(GasPricerConfig::Calibrated {
|
||||||
usd_per_tx: usd_per_tx,
|
usd_per_tx: usd_per_tx,
|
||||||
recalibration_period: to_duration(self.args.arg_price_update_period.as_str())?,
|
recalibration_period: to_duration(self.args.arg_price_update_period.as_str())?,
|
||||||
});
|
api_endpoint: ETHERSCAN_ETH_PRICE_ENDPOINT.to_string(),
|
||||||
|
})
|
||||||
|
} else if let Ok(usd_per_eth_parsed) = to_price(&self.args.arg_usd_per_eth) {
|
||||||
|
let wei_per_gas = wei_per_gas(usd_per_tx, usd_per_eth_parsed);
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"Using a fixed conversion rate of Ξ1 = {} ({} wei/gas)",
|
||||||
|
Colour::White.bold().paint(format!("US${:.2}", usd_per_eth_parsed)),
|
||||||
|
Colour::Yellow.bold().paint(format!("{}", wei_per_gas))
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(GasPricerConfig::Fixed(wei_per_gas))
|
||||||
|
} else {
|
||||||
|
Ok(GasPricerConfig::Calibrated {
|
||||||
|
usd_per_tx: usd_per_tx,
|
||||||
|
recalibration_period: to_duration(self.args.arg_price_update_period.as_str())?,
|
||||||
|
api_endpoint: self.args.arg_usd_per_eth.clone(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let usd_per_eth = to_price(&self.args.arg_usd_per_eth)?;
|
|
||||||
let wei_per_gas = wei_per_gas(usd_per_tx, usd_per_eth);
|
|
||||||
|
|
||||||
info!(
|
|
||||||
"Using a fixed conversion rate of Ξ1 = {} ({} wei/gas)",
|
|
||||||
Colour::White.bold().paint(format!("US${:.2}", usd_per_eth)),
|
|
||||||
Colour::Yellow.bold().paint(format!("{}", wei_per_gas))
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(GasPricerConfig::Fixed(wei_per_gas))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extra_data(&self) -> Result<Bytes, String> {
|
fn extra_data(&self) -> Result<Bytes, String> {
|
||||||
@ -1195,14 +1204,15 @@ mod tests {
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use tempdir::TempDir;
|
use tempdir::TempDir;
|
||||||
use ethcore::client::{VMType, BlockId};
|
use ethcore::client::VMType;
|
||||||
use ethcore::miner::MinerOptions;
|
use ethcore::miner::MinerOptions;
|
||||||
use miner::pool::PrioritizationStrategy;
|
use miner::pool::PrioritizationStrategy;
|
||||||
use parity_rpc::NetworkSettings;
|
use parity_rpc::NetworkSettings;
|
||||||
use updater::{UpdatePolicy, UpdateFilter, ReleaseTrack};
|
use updater::{UpdatePolicy, UpdateFilter, ReleaseTrack};
|
||||||
|
use types::ids::BlockId;
|
||||||
|
use types::data_format::DataFormat;
|
||||||
use account::{AccountCmd, NewAccount, ImportAccounts, ListAccounts};
|
use account::{AccountCmd, NewAccount, ImportAccounts, ListAccounts};
|
||||||
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, DataFormat, ExportState};
|
use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, ExportState};
|
||||||
use cli::Args;
|
use cli::Args;
|
||||||
use dir::{Directories, default_hypervisor_path};
|
use dir::{Directories, default_hypervisor_path};
|
||||||
use helpers::{default_network_config};
|
use helpers::{default_network_config};
|
||||||
@ -1564,7 +1574,7 @@ mod tests {
|
|||||||
// then
|
// then
|
||||||
assert_eq!(conf.network_settings(), Ok(NetworkSettings {
|
assert_eq!(conf.network_settings(), Ok(NetworkSettings {
|
||||||
name: "testname".to_owned(),
|
name: "testname".to_owned(),
|
||||||
chain: "kovan".to_owned(),
|
chain: "goerli".to_owned(),
|
||||||
is_dev_chain: false,
|
is_dev_chain: false,
|
||||||
network_port: 30303,
|
network_port: 30303,
|
||||||
rpc_enabled: true,
|
rpc_enabled: true,
|
||||||
|
@ -132,7 +132,7 @@ pub fn to_addresses(s: &Option<String>) -> Result<Vec<Address>, String> {
|
|||||||
|
|
||||||
/// Tries to parse string as a price.
|
/// Tries to parse string as a price.
|
||||||
pub fn to_price(s: &str) -> Result<f32, String> {
|
pub fn to_price(s: &str) -> Result<f32, String> {
|
||||||
s.parse::<f32>().map_err(|_| format!("Invalid transaciton price 's' given. Must be a decimal number."))
|
s.parse::<f32>().map_err(|_| format!("Invalid transaction price {:?} given. Must be a decimal number.", s))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn join_set(set: Option<&HashSet<String>>) -> Option<String> {
|
pub fn join_set(set: Option<&HashSet<String>>) -> Option<String> {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user