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:
Talha Cross 2019-11-11 21:57:38 +01:00 committed by s3krit
parent 5ee54b7298
commit f3cdd7bf21
159 changed files with 12295 additions and 3918 deletions

3
.gitignore vendored
View File

@ -43,3 +43,6 @@ parity-clib-examples/cpp/build/
.vscode .vscode
rls/ rls/
/parity.* /parity.*
# cargo remote artifacts
remote-target

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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"] }

View File

@ -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)

View File

@ -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"

View File

@ -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"

View File

@ -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']

View File

@ -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

View File

@ -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()];

View File

@ -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

View 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

View File

@ -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]>;

View File

@ -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>) { }

View File

@ -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"

View File

@ -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> {

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View 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 }}}
}
}
}
}
}

View 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 }
}
}
}
}
}

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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

View File

@ -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 }}
} }
} }
} }

View File

@ -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 @@
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View 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
}
}
}
}
}
}
}
}

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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": {

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View File

@ -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

View File

@ -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 }}
} }
} }
} }

View File

@ -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 }}
} }
} }
} }

View 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" }
}
}

View 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"
]
}

View File

@ -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)),
}
} }
} }

View File

@ -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};

View File

@ -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>) {

View File

@ -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>;
}

View File

@ -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);
} }
} }
} }

View File

@ -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();

View File

@ -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!");
}
}
}

View File

@ -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();

View File

@ -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>> {

View File

@ -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()
}
}
} }

View File

@ -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.

View File

@ -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);

View File

@ -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.

View File

@ -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();

View File

@ -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;

View File

@ -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()
) )
) )
} }

View File

@ -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

View File

@ -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

View File

@ -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"))]

View File

@ -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());
}

View 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))
}
}
}

View File

@ -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;

View File

@ -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

View File

@ -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"

View File

@ -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);
})
}); });
} }

View File

@ -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"

View File

@ -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" }

View File

@ -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;

View File

@ -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());

View File

@ -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 })
}
]);
} }
} }

View File

@ -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

View File

@ -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

View File

@ -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()
} }

View File

@ -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"

View File

@ -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]

View File

@ -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),
} }
} }

View File

@ -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"

View File

@ -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>();
}
} }

View File

@ -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 {

View File

@ -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]

View File

@ -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()
], ],

View File

@ -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()),
}; };

View File

@ -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

View File

@ -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,

View File

@ -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