Compare commits

...

10 Commits

Author SHA1 Message Date
Niklas Adolfsson
5162bc2c88 [backport beta]: add eip1344_transition for istanbul (#11304)
* [chainspec]: add `eip1344_transition` for istanbul (#11301)

* Update version and CHANGELOG.md
2019-12-05 14:07:09 +01:00
Niklas Adolfsson
4a4edf9383 [changelog]: add missing PR (#11288) 2019-11-25 16:28:06 +01:00
s3krit
2f2de5b52a update CHANGELOG.md (#11260) 2019-11-14 17:42:18 +01:00
Denis S. Soldatov aka General-Beck
753b923ee9 Beta sccache backport (#11254)
fix check-benches
2019-11-12 18:54:05 +01:00
Talha Cross
bc90ba2863 v2.6.5 beta (#11240)
* [CI] check evmbin build (#11096)
* Correct EIP-712 encoding (#11092)
* [client]: Fix for incorrectly dropped consensus messages (#11082) (#11086)
* Update hardcoded headers (foundation, classic, kovan, xdai, ewc, ...) (#11053)
* Add cargo-remote dir to .gitignore (?)
* Update light client headers: ropsten 6631425 foundation 8798209 (#11201)
* Update list of bootnodes for xDai chain (#11236)
* ethcore/res: add mordor testnet configuration (#11200)
* [chain specs]: activate Istanbul on mainnet (#11228)
* [builtin]: support multiple prices and activations in chain spec (#11039)
* [receipt]: add sender & receiver to RichReceipts (#11179)
* [ethcore/builtin]: do not panic in blake2pricer on short input (#11180)
* Made ecrecover implementation trait public (#11188)
* Fix docker centos build (#11226)
* Update MIX bootnodes. (#11203)
* Insert explicit warning into the panic hook (#11225)
* Use provided usd-per-eth value if an endpoint is specified (#11209)
* Cleanup stratum a bit (#11161)
* Add Constantinople EIPs to the dev (instant_seal) config (#10809) (already backported)
* util Host: fix a double Read Lock bug in fn Host::session_readable() (#11175)
* ethcore client: fix a double Read Lock bug in fn Client::logs() (#11172)
* Type annotation for next_key() matching of json filter options (#11192)
* Upgrade jsonrpc to latest (#11206)
* [dependencies]: jsonrpc 14.0.1 (#11183)
* Upgrade to jsonrpc v14 (#11151)
* Switching sccache from local to Redis (#10971)
* Snapshot restoration overhaul (#11219)
* Add new line after writing block to hex file. (#10984)
* Pause pruning while snapshotting (#11178)
* Change how RPCs eth_call and eth_estimateGas handle "Pending" (#11127)
* Fix block detail updating (#11015)
* Make InstantSeal Instant again #11186
* Filter out some bad ropsten warp snapshots (#11247)
2019-11-11 23:55:19 +01:00
Niklas Adolfsson
9838c9f447 Secret store: fix Instant::now() related race in net_keep_alive (#11155) (#11158)
* try Instant fix in SS

* proper fix + add comment

* fix compilation
2019-10-10 15:52:09 +01:00
Niklas Adolfsson
1a62f5a086 [beta]: backports (#11115)
* [spec] fix rinkeby spec (#11108)

* use images from our registry (#11105)
2019-10-02 12:24:07 +02:00
Andronik Ordian
badb04502f [evmbin] fix build (#11095) 2019-09-26 14:47:28 +02:00
s3krit
a44fad04fa Update CHANGELOG.md and version (#11094)
* Update CHANGELOG.md and version
2019-09-26 12:12:59 +02:00
s3krit
7ae5d8ebdc v2.6.4-beta (#11090)
* ethcore/res: activate Istanbul on Ropsten, Görli, Rinkeby, Kovan (#11068)

* ethcore/res: activate Istanbul on Ropsten block 6485846

* ethcore/res: activate Istanbul on Goerli block 1561651

* ethcore/res: use hex values for Istanbul specs

* ethcore/res: fix trailing comma

* ethcore/res: be pedantic about EIP-1283 in Petersburg and Istanbul test specs

* ethcore/res: activate Istanbul on Rinkeby block 5435345

* ethcore/res: activate Istanbul on Kovan block 14111141

* ethcore/res: fix kovan istanbul number to 0xd751a5

* cleanup json crate (#11027)

* [json]: cleanup

write something here....

* nit: commit new/moved files

* nit: remove needless features

* nits

* fix(grumbles): use explicit import `DifficultyTest`

* fix(grumbles): remove needless type hints

* fix(grumble): docs `from -> used by`

Co-Authored-By: David <dvdplm@gmail.com>

* fix(grumbles): use explicit `imports`

* fix(grumble): merge `tx` and `tx_with_signing_info`

* fix(grumbles): resolve introduced `TODO's`

* [json-spec] make blake2 pricing spec more readable (#11034)

* [json-spec] make blake2 pricing spec more readable

* [ethcore] fix compilation

* Update JSON tests to d4f86ecf4aa7c (#11054)

* new ethereum consensus tests, #10908

* Update JSON tests to 725dbc73a

This PR reverts the controversial changes of the previous PR and skips the failing tests.

Maybe I misunderstand the suggested workaround of putting the fix under `#[cfg(test)]` but it seems odd to run different code in production than we run in tests. Instead here I suggest we skip the failing tests with the argument that we do not wish to fix this issue (at least not at this time) because it does not affect us. If I am wrong, and I likely am, I look forward to hearing why and what a better approach to updating the state tests is.

Branched off https://github.com/paritytech/parity-ethereum/pull/10923

ref #10908

* Update json test commit to 1dc9d20e97165708f7db0bbf2d1a87a6b4285827

* Fail with error message

* Handle missing r, s, v params in json tests
Light cleanup of json test runner

* Include the path to the test file

* Handle new `postState` format: string or map
Sort out tests
Missing docs

* WIP

* Include test-helpers from ethjson

* Sort out new paths

* Remove dead code

* Fix warnings stemming from code called only from macros
Skip failing tests in stRevert/ and stTransactionTest/ (too course a filter!)
Docs and light touch refactorings for readability

* Skip all failing tests

* Document the single-test-skipping madness

* Update tests to latest commit on the `develop` branch

* Rename test skipping types to reflect actual purpose

* Switch to skipping individual tests in currents.json
Add some logging to help debug skipping

* Fix rpc test by curve fitting to new json test source file

* Add refs to all issues for fixing failing&skipped json tests

* Sort out the need for Clone for tests

* [json-tests] populate state from genesis pod state (#11083)

* [json-tests] populate state from genesis pod state

* [json-tests] #11075 is resolved as well

* [json-tests] #11076 hopefully too

* [json-tests] #11077 🎉

* [json-tests] fix trailing comma

* Update ethcore/src/json_tests/chain.rs

Co-Authored-By: Andronik Ordian <write@reusable.software>

* Add issue numbers to TODOs

* Apply @ordians fix for wrong state_root

* Warn on invalid RLP

* Remove the `ci-skip-tests` feature
2019-09-26 11:04:00 +02:00
262 changed files with 25543 additions and 4790 deletions

3
.gitignore vendored
View File

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

View File

@@ -4,15 +4,15 @@ stages:
- publish
- optional
image: parity/parity-ci-linux:latest
image: ${REGISTRY}/parity-ci-linux:latest
variables:
GIT_STRATEGY: fetch
GIT_SUBMODULE_STRATEGY: recursive
CI_SERVER_NAME: "GitLab CI"
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
REGISTRY: registry.parity.io/parity/infrastructure/scripts
.releaseable_branches: # list of git refs for building GitLab artifacts (think "pre-release binaries")
only: &releaseable_branches
@@ -37,22 +37,12 @@ variables:
before_script:
- rustup show
- 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
retry:
max: 2
when:
- runner_system_failure
- unknown_failure
- api_failure
tags:
- linux-docker
@@ -62,7 +52,6 @@ variables:
<<: *collect_artifacts
script:
- scripts/gitlab/build-linux.sh
- sccache -s
after_script:
- mkdir -p tools
- cp -r scripts/docker/hub/* ./tools
@@ -80,21 +69,38 @@ cargo-check 0 3:
<<: *docker-cache-status
script:
- time cargo check --target $CARGO_TARGET --locked --no-default-features --verbose --color=always
- sccache -s
- sccache --show-stats
cargo-check 1 3:
stage: test
<<: *docker-cache-status
script:
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --no-default-features --verbose --color=always
- sccache -s
- sccache --show-stats
cargo-check 2 3:
stage: test
<<: *docker-cache-status
script:
- time cargo check --target $CARGO_TARGET --locked --manifest-path util/io/Cargo.toml --features "mio" --verbose --color=always
- sccache -s
- sccache --show-stats
cargo-check-evmbin:
stage: test
<<: *docker-cache-status
script:
- time cargo check -p evmbin --target $CARGO_TARGET --locked --verbose --color=always
- sccache --show-stats
cargo-check-benches:
stage: test
<<: *docker-cache-status
script:
- time (
cargo check --all --benches --exclude ethash --target $CARGO_TARGET --locked --verbose --color=always;
(cd ethash; time cargo check --benches --features bench --target $CARGO_TARGET --locked --verbose --color=always)
)
- sccache --show-stats
cargo-audit:
stage: test
@@ -108,21 +114,18 @@ validate-chainspecs:
<<: *docker-cache-status
script:
- ./scripts/gitlab/validate-chainspecs.sh
- sccache -s
test-cpp:
stage: build
<<: *docker-cache-status
script:
- ./scripts/gitlab/test-cpp.sh
- sccache -s
test-linux:
stage: build
<<: *docker-cache-status
script:
- ./scripts/gitlab/test-linux.sh stable
- sccache -s
test-linux-beta:
stage: build
@@ -130,7 +133,6 @@ test-linux-beta:
<<: *docker-cache-status
script:
- ./scripts/gitlab/test-linux.sh beta
- sccache -s
test-linux-nightly:
stage: build
@@ -138,12 +140,11 @@ test-linux-nightly:
<<: *docker-cache-status
script:
- ./scripts/gitlab/test-linux.sh nightly
- sccache -s
allow_failure: true
build-android:
<<: *build-on-linux
image: parity/parity-ci-android:stretch
image: ${REGISTRY}/parity-ci-android:stretch
variables:
CARGO_TARGET: armv7-linux-androideabi
@@ -154,21 +155,21 @@ build-linux:
build-linux-i386:
<<: *build-on-linux
only: *releaseable_branches
image: parity/parity-ci-i386:latest
image: ${REGISTRY}/parity-ci-i386:latest
variables:
CARGO_TARGET: i686-unknown-linux-gnu
build-linux-arm64:
<<: *build-on-linux
only: *releaseable_branches
image: parity/parity-ci-arm64:latest
image: ${REGISTRY}/parity-ci-arm64:latest
variables:
CARGO_TARGET: aarch64-unknown-linux-gnu
build-linux-armhf:
<<: *build-on-linux
only: *releaseable_branches
image: parity/parity-ci-armhf:latest
image: ${REGISTRY}/parity-ci-armhf:latest
variables:
CARGO_TARGET: armv7-unknown-linux-gnueabihf
@@ -219,7 +220,7 @@ publish-docker:
DOCKER_DRIVER: overlay2
GIT_STRATEGY: none
# DOCKERFILE: tools/Dockerfile
# CONTAINER_IMAGE: parity/parity
# CONTAINER_IMAGE: parity/parity
script:
- ./tools/publish-docker.sh
tags:
@@ -307,7 +308,7 @@ publish-onchain-manually:
when: manual
publish-release-awss3-nightly: &publish-release-awss3
image: parity/awscli:latest
image: ${REGISTRY}/awscli:latest
stage: publish
only:
- nightly
@@ -335,13 +336,13 @@ publish-release-awss3-nightly: &publish-release-awss3
- linux-docker
publish-release-awss3-manually:
<<: *publish-release-awss3
<<: *publish-release-awss3
only: *releaseable_branches
when: manual
publish-docs:
stage: publish
image: parity/parity-ci-docs:latest
image: ${REGISTRY}/parity-ci-docs:latest
only:
- tags
except:

View File

@@ -1,4 +1,69 @@
## Parity-Ethereum [v2.6.3](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.3)
## Parity-Ethereum [v2.6.6](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.6)
Parity Ethereum v2.6.6-beta is an emergency patch release that adds the missing
eip1344_transition for mainnet - Users are advised to update as soon as possible
to prevent any issues with the imminent Istanbul hardfork
The full list of included changes:
* [chainspec]: add `eip1344_transition` for istanbul (#11301)
## Parity-Ethereum [v2.6.5](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.5)
Parity Ethereum v2.6.5-beta is a patch release that adds block numbers for activating the Istanbul hardfork on mainnet, as well as a large number of various bugfixes, QoL changes, some code cleanup/refactoring and other miscellaneous changes.
This release removes legacy aliases for the mainnet. If you specify `--chain homestead`, `--chain frontier` or `--chain byzantium`, this will need to be changed to one of: `--chain eth`, `--chain ethereum`, `--chain foundation` or `--chain mainnet`.
This release includes important changes to how snapshots are produced. The size of the Ethereum account state means that producing a snapshot takes a long while; most nodes today are not able to finish before the relevant state is pruned. Starting with v2.6.5, pruning is paused while a snapshot is underway, hopefully fixing the current dearth of recent snapshots. The downside to this is that memory usage goes up while a snapshot is produced.
The full list of included changes:
* [CI] check evmbin build (#11096)
* Correct EIP-712 encoding (#11092)
* [client]: Fix for incorrectly dropped consensus messages (#11082) (#11086)
* Update hardcoded headers (foundation, classic, kovan, xdai, ewc, ...) (#11053)
* Add cargo-remote dir to .gitignore (?)
* Update light client headers: ropsten 6631425 foundation 8798209 (#11201)
* Update list of bootnodes for xDai chain (#11236)
* ethcore/res: add mordor testnet configuration (#11200)
* [chain specs]: activate Istanbul on mainnet (#11228)
* [builtin]: support multiple prices and activations in chain spec (#11039)
* [receipt]: add sender & receiver to RichReceipts (#11179)
* [ethcore/builtin]: do not panic in blake2pricer on short input (#11180)
* Made ecrecover implementation trait public (#11188)
* Fix docker centos build (#11226)
* Update MIX bootnodes. (#11203)
* Insert explicit warning into the panic hook (#11225)
* Use provided usd-per-eth value if an endpoint is specified (#11209)
* Cleanup stratum a bit (#11161)
* Add Constantinople EIPs to the dev (instant_seal) config (#10809) (already backported)
* util Host: fix a double Read Lock bug in fn Host::session_readable() (#11175)
* ethcore client: fix a double Read Lock bug in fn Client::logs() (#11172)
* Type annotation for next_key() matching of json filter options (#11192)
* Upgrade jsonrpc to latest (#11206)
* [dependencies]: jsonrpc 14.0.1 (#11183)
* Upgrade to jsonrpc v14 (#11151)
* Switching sccache from local to Redis (#10971)
* Snapshot restoration overhaul (#11219)
* Add new line after writing block to hex file. (#10984)
* Pause pruning while snapshotting (#11178)
* Change how RPCs eth_call and eth_estimateGas handle "Pending" (#11127)
* Fix block detail updating (#11015)
* Make InstantSeal Instant again #11186
* Filter out some bad ropsten warp snapshots (#11247)
* Allow default block parameter to be blockHash (#10932)
## Parity-Ethereum [v2.6.4](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.4)
Parity Ethereum v2.6.4-stable is a patch release that adds the block numbers for activating the Istanbul hardfork on test networks: Ropsten, Görli, Rinkeby and Kovan.
A full list of included changes:
* ethcore/res: activate Istanbul on Ropsten, Görli, Rinkeby, Kovan (#11068)
* cleanup json crate (#11027)
* [json-spec] make blake2 pricing spec more readable (#11034)
* Update JSON tests to d4f86ecf4aa7c (#11054)
## Parity-Ethereum [v2.6.3](https://github.com/paritytech/parity-ethereum/releases/tag/v2.6.3)
Parity Ethereum v2.6.3-stable is a patch release that improves security, stability and performance.
@@ -23,7 +88,7 @@ The full list of included changes:
* Better error message for rpc gas price errors (#10931)
* Fix fork choice (#10837)
* Fix compilation on recent nightlies (#10991)
* Don't build rpc with ethcore test-helpers (#11048)
* Don't build rpc with ethcore test-helpers (#11048)
* EIP 1884 Re-pricing of trie-size dependent operations (#10992)
* Implement EIP-1283 reenable transition, EIP-1706 and EIP-2200 (#10191)

1347
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
description = "Parity Ethereum client"
name = "parity-ethereum"
# NOTE Make sure to update util/version/Cargo.toml as well
version = "2.6.3"
version = "2.6.6"
license = "GPL-3.0"
authors = ["Parity Technologies <admin@parity.io>"]
@@ -19,7 +19,7 @@ number_prefix = "0.2"
rpassword = "1.0"
semver = "0.9"
ansi_term = "0.11"
parking_lot = "0.7"
parking_lot = "0.9"
regex = "1.0"
atty = "0.2.8"
toml = "0.4"
@@ -29,7 +29,7 @@ serde_derive = "1.0"
futures = "0.1"
fdlimit = "0.1"
ctrlc = { git = "https://github.com/paritytech/rust-ctrlc.git" }
jsonrpc-core = "12.0.0"
jsonrpc-core = "14.0.3"
parity-bytes = "0.1"
common-types = { path = "ethcore/types" }
ethcore = { path = "ethcore", features = ["parity"] }
@@ -66,7 +66,7 @@ panic_hook = { path = "util/panic-hook" }
keccak-hash = "0.2.0"
migration-rocksdb = { path = "util/migration-rocksdb" }
kvdb = "0.1"
kvdb-rocksdb = "0.1.3"
kvdb-rocksdb = "0.1.5"
journaldb = { path = "util/journaldb" }
ethcore-secretstore = { path = "secret-store", optional = true }
@@ -92,7 +92,6 @@ default = ["accounts"]
accounts = ["ethcore-accounts", "parity-rpc/accounts"]
miner-debug = ["ethcore/miner-debug"]
json-tests = ["ethcore/json-tests"]
ci-skip-tests = ["ethcore/ci-skip-tests"]
test-heavy = ["ethcore/test-heavy"]
evm-debug = ["ethcore/evm-debug"]
evm-debug-tests = ["ethcore/evm-debug-tests"]

View File

@@ -151,7 +151,7 @@ To start Parity Ethereum as a regular user using `systemd` init:
## 4. Testing <a id="chapter-004"></a>
You can run tests with the following commands:
Download the required test files: `git submodule update --init --recursive`. You can run tests with the following commands:
* **All** packages
```

View File

@@ -11,7 +11,7 @@ edition = "2018"
ethkey = { path = "ethkey" }
ethstore = { path = "ethstore" }
log = "0.4"
parking_lot = "0.7"
parking_lot = "0.9"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"

View File

@@ -16,7 +16,7 @@ rustc-hex = "1.0"
tiny-keccak = "1.4"
time = "0.1.34"
itertools = "0.5"
parking_lot = "0.7"
parking_lot = "0.9"
parity-crypto = "0.4.0"
ethereum-types = "0.6.0"
dir = { path = "../../util/dir" }

View File

@@ -11,7 +11,7 @@ num_cpus = "1.6"
rustc-hex = "1.0"
serde = "1.0"
serde_derive = "1.0"
parking_lot = "0.7"
parking_lot = "0.9"
ethstore = { path = "../" }
dir = { path = '../../../util/dir' }
panic_hook = { path = "../../../util/panic-hook" }

View File

@@ -12,10 +12,10 @@ futures = "0.1"
log = "0.4"
serde = "1.0"
serde_json = "1.0"
url = "1.2.0"
url = "2.1.0"
matches = "0.1"
parking_lot = "0.7"
jsonrpc-core = "12.0.0"
jsonrpc-ws-server = "12.0.0"
parking_lot = "0.9"
jsonrpc-core = "14.0.3"
jsonrpc-ws-server = "14.0.3"
parity-rpc = { path = "../../rpc" }
keccak-hash = "0.2.0"

View File

@@ -11,11 +11,11 @@ ethereum-types = "0.6.0"
keccak-hash = "0.2.0"
log = "0.4"
memmap = "0.6"
parking_lot = "0.7"
parking_lot = "0.9"
primal = "0.2.3"
[dev-dependencies]
criterion = "0.2"
criterion = "0.3"
rustc-hex = "1.0"
serde_json = "1.0"
tempdir = "0.3"

View File

@@ -39,7 +39,7 @@ keccak-hash = "0.2.0"
keccak-hasher = { path = "../util/keccak-hasher" }
kvdb = "0.1"
kvdb-memorydb = "0.1"
kvdb-rocksdb = { version = "0.1.3", optional = true }
kvdb-rocksdb = { version = "0.1.5", optional = true }
lazy_static = "1.2.0"
len-caching-lock = { path = "../util/len-caching-lock" }
log = "0.4"
@@ -50,7 +50,7 @@ memory-db = "0.12.4"
num_cpus = "1.2"
parity-bytes = "0.1"
parity-snappy = "0.1"
parking_lot = "0.7"
parking_lot = "0.9"
pod-account = { path = "pod-account" }
trie-db = "0.12.4"
patricia-trie-ethereum = { path = "../util/patricia-trie-ethereum" }
@@ -58,7 +58,8 @@ rand = "0.6"
rayon = "1.1"
rlp = "0.4.0"
rlp_derive = { path = "../util/rlp-derive" }
rustc-hex = "1.0"
rustc-hex = "1"
scopeguard = "1.0.0"
serde = "1.0"
serde_derive = "1.0"
state-account = { path = "state-account" }
@@ -75,11 +76,13 @@ rand_xorshift = "0.1.1"
[dev-dependencies]
blooms-db = { path = "../util/blooms-db" }
criterion = "0.2"
criterion = "0.3"
env_logger = "0.5"
ethcore-accounts = { path = "../accounts" }
ethjson = { path = "../json", features = ["test-helpers"] }
ethkey = { path = "../accounts/ethkey" }
fetch = { path = "../util/fetch" }
kvdb-rocksdb = "0.1.3"
kvdb-rocksdb = "0.1.5"
parity-runtime = { path = "../util/runtime" }
rlp_compress = { path = "../util/rlp-compress" }
serde_json = "1.0"
@@ -109,8 +112,6 @@ evm-debug-tests = ["evm-debug", "evm/evm-debug-tests"]
slow-blocks = []
# Run JSON consensus tests.
json-tests = ["env_logger", "test-helpers", "to-pod-full"]
# Skip JSON consensus tests with pending issues.
ci-skip-tests = []
# Run memory/cpu heavy tests.
test-heavy = []
# Compile test helpers

View File

@@ -21,13 +21,14 @@ extern crate criterion;
extern crate lazy_static;
extern crate ethcore;
extern crate ethcore_builtin as builtin;
extern crate ethereum_types;
extern crate parity_bytes as bytes;
extern crate rustc_hex;
use criterion::{Criterion, Bencher};
use bytes::BytesRef;
use ethcore::builtin::Builtin;
use builtin::Builtin;
use ethcore::machine::Machine;
use ethereum_types::H160;
use ethcore::ethereum::new_byzantium_test_machine;

View File

@@ -0,0 +1,149 @@
// 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/>.
//! Benchmarking of calling builtin contract
use std::str::FromStr;
use account_state::State;
use parity_bytes::Bytes;
use ethcore::test_helpers::get_temp_state_db;
use ethereum_types::{H160, U256};
use criterion::{black_box, criterion_main, criterion_group, Criterion};
use machine::{test_helpers, Machine};
use machine::executive::CallCreateExecutive;
use machine::substate::Substate;
use trace::{NoopTracer, NoopVMTracer};
use trie_vm_factories::VmFactory;
use vm::{ActionParams, EnvInfo, Schedule};
const ECRECOVER: &str = "0000000000000000000000000000000000000001";
const SHA256: &str = "0000000000000000000000000000000000000002";
const SIGNED_DATA: &str = "hash000000000001v000000000000002r000000000000003s000000000000004";
fn single_builtin_pricing() -> Machine {
test_helpers::load_machine(include_bytes!("../../res/ethereum/builtin_one_activation_bench.json"))
}
fn multiple_builtin_pricing() -> Machine {
test_helpers::load_machine(include_bytes!("../../res/ethereum/builtin_multi_bench.json"))
}
fn builtin_params(address: H160, execute: bool) -> ActionParams {
let mut params = ActionParams::default();
params.code_address = address;
params.gas = u64::max_value().into();
if execute {
params.data = Some(SIGNED_DATA.bytes().collect::<Bytes>());
}
params
}
fn single_activation(c: &mut Criterion) {
let contract = H160::from_str(ECRECOVER).unwrap();
let params = builtin_params(contract, false);
let env_info = EnvInfo::default();
let machine = single_builtin_pricing();
let schedule = Schedule::default();
let factory = VmFactory::default();
let depth = 0;
let stack_depth = 0;
let parent_static_flag = false;
let db = get_temp_state_db();
let mut state = State::new(db, U256::from(0), Default::default());
let mut substate = Substate::new();
c.bench_function("single activation", move |b| {
b.iter(|| black_box(CallCreateExecutive::new_call_raw(
params.clone(),
&env_info,
&machine,
&schedule,
&factory,
depth,
stack_depth,
parent_static_flag,
).exec(&mut state, &mut substate, &mut NoopTracer, &mut NoopVMTracer))
)
});
}
fn ten_multiple_activations(c: &mut Criterion) {
let contract = H160::from_str(ECRECOVER).unwrap();
let params = builtin_params(contract, false);
let env_info = EnvInfo::default();
let machine = multiple_builtin_pricing();
let schedule = Schedule::default();
let factory = VmFactory::default();
let depth = 0;
let stack_depth = 0;
let parent_static_flag = false;
let db = get_temp_state_db();
let mut state = State::new(db, U256::from(0), Default::default());
let mut substate = Substate::new();
c.bench_function("ten activations", move |b| {
b.iter(|| black_box(CallCreateExecutive::new_call_raw(
params.clone(),
&env_info,
&machine,
&schedule,
&factory,
depth,
stack_depth,
parent_static_flag,
).exec(&mut state, &mut substate, &mut NoopTracer, &mut NoopVMTracer))
)
});
}
fn fourty_multiple_activations(c: &mut Criterion) {
let contract = H160::from_str(SHA256).unwrap();
let params = builtin_params(contract, false);
let env_info = EnvInfo::default();
let machine = multiple_builtin_pricing();
let schedule = Schedule::default();
let factory = VmFactory::default();
let depth = 0;
let stack_depth = 0;
let parent_static_flag = false;
let db = get_temp_state_db();
let mut state = State::new(db, U256::from(0), Default::default());
let mut substate = Substate::new();
c.bench_function("fourty activations", move |b| {
b.iter(|| black_box(CallCreateExecutive::new_call_raw(
params.clone(),
&env_info,
&machine,
&schedule,
&factory,
depth,
stack_depth,
parent_static_flag,
).exec(&mut state, &mut substate, &mut NoopTracer, &mut NoopVMTracer))
)
});
}
criterion_group!(benches, single_activation, ten_multiple_activations, fourty_multiple_activations);
criterion_main!(benches);

View File

@@ -19,7 +19,7 @@ itertools = "0.5"
kvdb = "0.1"
log = "0.4"
parity-bytes = "0.1"
parking_lot = "0.7"
parking_lot = "0.9"
rand = "0.6"
rayon = "1.0"
rlp = "0.4.0"

View File

@@ -195,6 +195,12 @@ pub trait BlockProvider {
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)]
enum CacheId {
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.
#[derive(Clone)]
pub struct AncestryIter<'a> {
@@ -592,7 +611,7 @@ impl BlockChain {
let best_block_rlp = bc.block(&best_block_hash)
.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();
*best_block = BestBlock {
total_difficulty: best_block_total_difficulty,
@@ -792,7 +811,7 @@ impl BlockChain {
batch.put(db::COL_HEADERS, hash.as_bytes(), &compressed_header);
batch.put(db::COL_BODIES, hash.as_bytes(), &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 {
// parent known to be in chain.
@@ -855,12 +874,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) {
self.block_bodies.write().clear();
self.block_details.write().clear();
self.block_hashes.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
@@ -1044,7 +1082,7 @@ impl BlockChain {
///
/// 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) {
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));
parent_details.children.push(child_hash);
@@ -1151,7 +1189,7 @@ impl BlockChain {
/// Mark a block to be considered finalized. Returns `Some(())` if the operation succeeds, and `None` if the block
/// hash is not found.
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;
self.update_block_details(batch, block_hash, block_details);
@@ -1344,7 +1382,7 @@ impl BlockChain {
/// 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> {
// 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);
// create current block details.
@@ -1650,7 +1688,7 @@ mod tests {
let fork_choice = {
let header = block.header_view();
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();
if block_total_difficulty > bc.best_block_total_difficulty() {
common_types::engines::ForkChoice::New

View File

@@ -8,15 +8,18 @@ edition = "2018"
[dependencies]
bn = { git = "https://github.com/paritytech/bn", default-features = false }
ethereum-types = "0.6.0"
byteorder = "1.3.2"
common-types = { path = "../types" }
eip-152 = { path = "../../util/EIP-152" }
ethjson = { path = "../../json" }
ethkey = { path = "../../accounts/ethkey" }
keccak-hash = "0.2.0"
log = "0.4"
macros = { path = "../../util/macros" }
num = { version = "0.1", default-features = false, features = ["bigint"] }
parity-bytes = "0.1"
eip-152 = { path = "../../util/EIP-152" }
parity-crypto = "0.4.0"
byteorder = "1.3.2"
[dev-dependencies]
hex-literal = "0.2.1"
parity-crypto = "0.4.0"

View File

@@ -16,13 +16,17 @@
//! Standard built-in contracts.
#![warn(missing_docs)]
use std::{
cmp::{max, min},
collections::BTreeMap,
convert::{TryFrom, TryInto},
io::{self, Read, Cursor},
mem::size_of,
str::FromStr
};
use bn;
use byteorder::{BigEndian, LittleEndian, ReadBytesExt};
use ethereum_types::{H256, U256};
use ethjson;
@@ -34,17 +38,18 @@ use parity_bytes::BytesRef;
use parity_crypto::digest;
use eip_152::compress;
type EthcoreError = String;
/// Native implementation of a built-in contract.
trait Implementation: Send + Sync {
pub trait Implementation: Send + Sync {
/// execute this built-in on the given input, writing to the given output.
fn execute(&self, input: &[u8], output: &mut BytesRef) -> Result<(), &'static str>;
}
/// A gas pricing scheme for built-in contracts.
// TODO: refactor this trait, see https://github.com/paritytech/parity-ethereum/issues/11014
trait Pricer: Send + Sync {
/// The gas cost of running this built-in for the given input data at block number `at`
fn cost(&self, input: &[u8], at: u64) -> U256;
fn cost(&self, input: &[u8]) -> U256;
}
/// Pricing for the Blake2 compression function (aka "F").
@@ -53,78 +58,94 @@ trait Pricer: Send + Sync {
pub type Blake2FPricer = u64;
impl Pricer for Blake2FPricer {
fn cost(&self, input: &[u8], _at: u64) -> U256 {
use std::convert::TryInto;
let (rounds_bytes, _) = input.split_at(std::mem::size_of::<u32>());
fn cost(&self, input: &[u8]) -> U256 {
const FOUR: usize = std::mem::size_of::<u32>();
// Returning zero if the conversion fails is fine because `execute()` will check the length
// and bail with the appropriate error.
let rounds = u32::from_be_bytes(rounds_bytes.try_into().unwrap_or([0u8; 4]));
if input.len() < FOUR {
return U256::zero();
}
let (rounds_bytes, _) = input.split_at(FOUR);
let rounds = u32::from_be_bytes(rounds_bytes.try_into().unwrap_or([0u8; FOUR]));
U256::from(*self as u128 * rounds as u128)
}
}
/// A linear pricing model. This computes a price using a base cost and a cost per-word.
struct Linear {
base: usize,
word: usize,
/// Pricing model
#[derive(Debug)]
enum Pricing {
AltBn128Pairing(AltBn128PairingPricer),
AltBn128ConstOperations(AltBn128ConstOperations),
Blake2F(Blake2FPricer),
Linear(Linear),
Modexp(ModexpPricer),
}
/// A special pricing model for modular exponentiation.
struct ModexpPricer {
divisor: usize,
}
impl Pricer for Linear {
fn cost(&self, input: &[u8], _at: u64) -> U256 {
U256::from(self.base) + U256::from(self.word) * U256::from((input.len() + 31) / 32)
impl Pricer for Pricing {
fn cost(&self, input: &[u8]) -> U256 {
match self {
Pricing::AltBn128Pairing(inner) => inner.cost(input),
Pricing::AltBn128ConstOperations(inner) => inner.cost(input),
Pricing::Blake2F(inner) => inner.cost(input),
Pricing::Linear(inner) => inner.cost(input),
Pricing::Modexp(inner) => inner.cost(input),
}
}
}
/// alt_bn128 constant operations (add and mul) pricing model.
struct AltBn128ConstOperations {
price: usize,
eip1108_transition_at: u64,
eip1108_transition_price: usize,
/// A linear pricing model. This computes a price using a base cost and a cost per-word.
#[derive(Debug)]
struct Linear {
base: u64,
word: u64,
}
impl Pricer for AltBn128ConstOperations {
fn cost(&self, _input: &[u8], at: u64) -> U256 {
if at >= self.eip1108_transition_at {
self.eip1108_transition_price.into()
} else {
self.price.into()
}
/// A special pricing model for modular exponentiation.
#[derive(Debug)]
struct ModexpPricer {
divisor: u64,
}
impl Pricer for Linear {
fn cost(&self, input: &[u8]) -> U256 {
U256::from(self.base) + U256::from(self.word) * U256::from((input.len() + 31) / 32)
}
}
/// alt_bn128 pairing price
#[derive(Debug, Copy, Clone)]
struct AltBn128PairingPrice {
base: usize,
pair: usize,
base: u64,
pair: u64,
}
/// alt_bn128_pairing pricing model. This computes a price using a base cost and a cost per pair.
#[derive(Debug)]
struct AltBn128PairingPricer {
price: AltBn128PairingPrice,
eip1108_transition_at: u64,
eip1108_transition_price: AltBn128PairingPrice,
}
/// Pricing for constant alt_bn128 operations (ECADD and ECMUL)
#[derive(Debug, Copy, Clone)]
pub struct AltBn128ConstOperations {
/// Fixed price.
pub price: u64,
}
impl Pricer for AltBn128ConstOperations {
fn cost(&self, _input: &[u8]) -> U256 {
self.price.into()
}
}
impl Pricer for AltBn128PairingPricer {
fn cost(&self, input: &[u8], at: u64) -> U256 {
let price = if at >= self.eip1108_transition_at {
self.eip1108_transition_price
} else {
self.price
};
U256::from(price.base) + U256::from(price.pair) * U256::from(input.len() / 192)
fn cost(&self, input: &[u8]) -> U256 {
U256::from(self.price.base) + U256::from(self.price.pair) * U256::from(input.len() / 192)
}
}
impl Pricer for ModexpPricer {
fn cost(&self, input: &[u8], _at: u64) -> U256 {
fn cost(&self, input: &[u8]) -> U256 {
let mut reader = input.chain(io::repeat(0));
let mut buf = [0; 32];
@@ -149,8 +170,10 @@ impl Pricer for ModexpPricer {
let m = max(mod_len, base_len);
// read fist 32-byte word of the exponent.
let exp_low = if base_len + 96 >= input.len() as u64 { U256::zero() } else {
let mut buf = [0; 32];
let exp_low = if base_len + 96 >= input.len() as u64 {
U256::zero()
} else {
buf.iter_mut().for_each(|b| *b = 0);
let mut reader = input[(96 + base_len as usize)..].chain(io::repeat(0));
let len = min(exp_len, 32) as usize;
reader.read_exact(&mut buf[(32 - len)..]).expect("reading from zero-extended memory cannot fail; qed");
@@ -181,7 +204,7 @@ impl ModexpPricer {
match x {
x if x <= 64 => x * x,
x if x <= 1024 => (x * x) / 4 + 96 * x - 3072,
x => (x * x) / 16 + 480 * x - 199680,
x => (x * x) / 16 + 480 * x - 199_680,
}
}
}
@@ -190,137 +213,179 @@ impl ModexpPricer {
///
/// Call `cost` to compute cost for the given input, `execute` to execute the contract
/// on the given input, and `is_active` to determine whether the contract is active.
///
/// Unless `is_active` is true,
pub struct Builtin {
pricer: Box<dyn Pricer>,
native: Box<dyn Implementation>,
activate_at: u64,
pricer: BTreeMap<u64, Pricing>,
native: EthereumBuiltin,
}
impl Builtin {
/// Simple forwarder for cost.
///
/// Return the cost of the most recently activated pricer at the current block number.
///
/// If no pricer is actived `zero` is returned
///
/// If multiple `activation_at` has the same block number the last one is used
/// (follows `BTreeMap` semantics).
#[inline]
pub fn cost(&self, input: &[u8], at: u64) -> U256 {
self.pricer.cost(input, at)
if let Some((_, pricer)) = self.pricer.range(0..=at).last() {
pricer.cost(input)
} else {
U256::zero()
}
}
/// Simple forwarder for execute.
#[inline]
pub fn execute(&self, input: &[u8], output: &mut BytesRef) -> Result<(), &'static str> {
self.native.execute(input, output)
}
/// Whether the builtin is activated at the given block number.
#[inline]
pub fn is_active(&self, at: u64) -> bool {
at >= self.activate_at
self.pricer.range(0..=at).last().is_some()
}
}
impl From<ethjson::spec::Builtin> for Builtin {
fn from(b: ethjson::spec::Builtin) -> Self {
let pricer: Box<dyn Pricer> = match b.pricing {
ethjson::spec::Pricing::Blake2F(cost_per_round) => {
Box::new(cost_per_round)
},
ethjson::spec::Pricing::Linear(linear) => {
Box::new(Linear {
impl TryFrom<ethjson::spec::builtin::Builtin> for Builtin {
type Error = EthcoreError;
fn try_from(b: ethjson::spec::builtin::Builtin) -> Result<Self, Self::Error> {
let native = EthereumBuiltin::from_str(&b.name)?;
let mut pricer = BTreeMap::new();
for (activate_at, p) in b.pricing {
pricer.insert(activate_at, p.price.into());
}
Ok(Self { pricer, native })
}
}
impl From<ethjson::spec::builtin::Pricing> for Pricing {
fn from(pricing: ethjson::spec::builtin::Pricing) -> Self {
match pricing {
ethjson::spec::builtin::Pricing::Blake2F { gas_per_round } => {
Pricing::Blake2F(gas_per_round)
}
ethjson::spec::builtin::Pricing::Linear(linear) => {
Pricing::Linear(Linear {
base: linear.base,
word: linear.word,
})
}
ethjson::spec::Pricing::Modexp(exp) => {
Box::new(ModexpPricer {
ethjson::spec::builtin::Pricing::Modexp(exp) => {
Pricing::Modexp(ModexpPricer {
divisor: if exp.divisor == 0 {
warn!(target: "builtin", "Zero modexp divisor specified. Falling back to default.");
warn!(target: "builtin", "Zero modexp divisor specified. Falling back to default: 10.");
10
} else {
exp.divisor
}
})
}
ethjson::spec::Pricing::AltBn128Pairing(pricer) => {
Box::new(AltBn128PairingPricer {
ethjson::spec::builtin::Pricing::AltBn128Pairing(pricer) => {
Pricing::AltBn128Pairing(AltBn128PairingPricer {
price: AltBn128PairingPrice {
base: pricer.base,
pair: pricer.pair,
},
eip1108_transition_at: b.eip1108_transition.map_or(u64::max_value(), Into::into),
eip1108_transition_price: AltBn128PairingPrice {
base: pricer.eip1108_transition_base,
pair: pricer.eip1108_transition_pair,
},
})
}
ethjson::spec::Pricing::AltBn128ConstOperations(pricer) => {
Box::new(AltBn128ConstOperations {
price: pricer.price,
eip1108_transition_price: pricer.eip1108_transition_price,
eip1108_transition_at: b.eip1108_transition.map_or(u64::max_value(), Into::into)
ethjson::spec::builtin::Pricing::AltBn128ConstOperations(pricer) => {
Pricing::AltBn128ConstOperations(AltBn128ConstOperations {
price: pricer.price
})
}
};
Builtin {
pricer,
native: ethereum_builtin(&b.name),
activate_at: b.activate_at.map_or(0, Into::into),
}
}
}
/// Ethereum built-in factory.
fn ethereum_builtin(name: &str) -> Box<dyn Implementation> {
match name {
"identity" => Box::new(Identity) as Box<dyn Implementation>,
"ecrecover" => Box::new(EcRecover) as Box<dyn Implementation>,
"sha256" => Box::new(Sha256) as Box<dyn Implementation>,
"ripemd160" => Box::new(Ripemd160) as Box<dyn Implementation>,
"modexp" => Box::new(Modexp) as Box<dyn Implementation>,
"alt_bn128_add" => Box::new(Bn128Add) as Box<dyn Implementation>,
"alt_bn128_mul" => Box::new(Bn128Mul) as Box<dyn Implementation>,
"alt_bn128_pairing" => Box::new(Bn128Pairing) as Box<dyn Implementation>,
"blake2_f" => Box::new(Blake2F) as Box<dyn Implementation>,
_ => panic!("invalid builtin name: {}", name),
/// Ethereum builtins:
enum EthereumBuiltin {
/// The identity function
Identity(Identity),
/// ec recovery
EcRecover(EcRecover),
/// sha256
Sha256(Sha256),
/// ripemd160
Ripemd160(Ripemd160),
/// modexp (EIP 198)
Modexp(Modexp),
/// alt_bn128_add
Bn128Add(Bn128Add),
/// alt_bn128_mul
Bn128Mul(Bn128Mul),
/// alt_bn128_pairing
Bn128Pairing(Bn128Pairing),
/// blake2_f (The Blake2 compression function F, EIP-152)
Blake2F(Blake2F)
}
impl FromStr for EthereumBuiltin {
type Err = EthcoreError;
fn from_str(name: &str) -> Result<EthereumBuiltin, Self::Err> {
match name {
"identity" => Ok(EthereumBuiltin::Identity(Identity)),
"ecrecover" => Ok(EthereumBuiltin::EcRecover(EcRecover)),
"sha256" => Ok(EthereumBuiltin::Sha256(Sha256)),
"ripemd160" => Ok(EthereumBuiltin::Ripemd160(Ripemd160)),
"modexp" => Ok(EthereumBuiltin::Modexp(Modexp)),
"alt_bn128_add" => Ok(EthereumBuiltin::Bn128Add(Bn128Add)),
"alt_bn128_mul" => Ok(EthereumBuiltin::Bn128Mul(Bn128Mul)),
"alt_bn128_pairing" => Ok(EthereumBuiltin::Bn128Pairing(Bn128Pairing)),
"blake2_f" => Ok(EthereumBuiltin::Blake2F(Blake2F)),
_ => return Err(format!("invalid builtin name: {}", name)),
}
}
}
// Ethereum builtins:
//
// - The identity function
// - ec recovery
// - sha256
// - ripemd160
// - modexp (EIP198)
// - alt_bn128_add
// - alt_bn128_mul
// - alt_bn128_pairing
// - blake2_f (The Blake2 compression function F, EIP-152)
impl Implementation for EthereumBuiltin {
fn execute(&self, input: &[u8], output: &mut BytesRef) -> Result<(), &'static str> {
match self {
EthereumBuiltin::Identity(inner) => inner.execute(input, output),
EthereumBuiltin::EcRecover(inner) => inner.execute(input, output),
EthereumBuiltin::Sha256(inner) => inner.execute(input, output),
EthereumBuiltin::Ripemd160(inner) => inner.execute(input, output),
EthereumBuiltin::Modexp(inner) => inner.execute(input, output),
EthereumBuiltin::Bn128Add(inner) => inner.execute(input, output),
EthereumBuiltin::Bn128Mul(inner) => inner.execute(input, output),
EthereumBuiltin::Bn128Pairing(inner) => inner.execute(input, output),
EthereumBuiltin::Blake2F(inner) => inner.execute(input, output),
}
}
}
#[derive(Debug)]
struct Identity;
pub struct Identity;
#[derive(Debug)]
struct EcRecover;
pub struct EcRecover;
#[derive(Debug)]
struct Sha256;
pub struct Sha256;
#[derive(Debug)]
struct Ripemd160;
pub struct Ripemd160;
#[derive(Debug)]
struct Modexp;
pub struct Modexp;
#[derive(Debug)]
struct Bn128Add;
pub struct Bn128Add;
#[derive(Debug)]
struct Bn128Mul;
pub struct Bn128Mul;
#[derive(Debug)]
struct Bn128Pairing;
pub struct Bn128Pairing;
#[derive(Debug)]
struct Blake2F;
pub struct Blake2F;
impl Implementation for Identity {
fn execute(&self, input: &[u8], output: &mut BytesRef) -> Result<(), &'static str> {
@@ -342,7 +407,7 @@ impl Implementation for EcRecover {
let s = H256::from_slice(&input[96..128]);
let bit = match v[31] {
27 | 28 if &v.0[..31] == &[0; 31] => v[31] - 27,
27 | 28 if v.0[..31] == [0; 31] => v[31] - 27,
_ => { return Ok(()); },
};
@@ -384,13 +449,13 @@ impl Implementation for Blake2F {
// state vector, h
let mut h = [0u64; 8];
for state_word in h.iter_mut() {
for state_word in &mut h {
*state_word = cursor.read_u64::<LittleEndian>().expect(PROOF);
}
// message block vector, m
let mut m = [0u64; 16];
for msg_word in m.iter_mut() {
for msg_word in &mut m {
*msg_word = cursor.read_u64::<LittleEndian>().expect(PROOF);
}
@@ -443,7 +508,7 @@ fn modexp(mut base: BigUint, exp: Vec<u8>, modulus: BigUint) -> BigUint {
let mut exp = exp.into_iter().skip_while(|d| *d == 0).peekable();
// n^0 % m
if let None = exp.peek() {
if exp.peek().is_none() {
return BigUint::one();
}
@@ -452,7 +517,7 @@ fn modexp(mut base: BigUint, exp: Vec<u8>, modulus: BigUint) -> BigUint {
return BigUint::zero();
}
base = base % &modulus;
base %= &modulus;
// Fast path for base divisible by modulus.
if base.is_zero() { return BigUint::zero() }
@@ -621,10 +686,11 @@ impl Bn128Pairing {
fn execute_with_error(&self, input: &[u8], output: &mut BytesRef) -> Result<(), &'static str> {
use bn::{AffineG1, AffineG2, Fq, Fq2, pairing_batch, G1, G2, Gt, Group};
let elements = input.len() / 192; // (a, b_a, b_b - each 64-byte affine coordinates)
let ret_val = if input.len() == 0 {
let ret_val = if input.is_empty() {
U256::one()
} else {
// (a, b_a, b_b - each 64-byte affine coordinates)
let elements = input.len() / 192;
let mut vals = Vec::new();
for idx in 0..elements {
let a_x = Fq::from_slice(&input[idx*192..idx*192+32])
@@ -679,19 +745,26 @@ impl Bn128Pairing {
#[cfg(test)]
mod tests {
use std::convert::TryFrom;
use ethereum_types::U256;
use ethjson::uint::Uint;
use ethjson::spec::builtin::{
Builtin as JsonBuiltin, Linear as JsonLinearPricing,
PricingAt, AltBn128Pairing as JsonAltBn128PairingPricing, Pricing as JsonPricing,
};
use hex_literal::hex;
use macros::map;
use num::{BigUint, Zero, One};
use parity_bytes::BytesRef;
use hex_literal::hex;
use super::{Builtin, Linear, ethereum_builtin, Pricer, ModexpPricer, modexp as me};
use super::{
BTreeMap, Builtin, EthereumBuiltin, FromStr, Implementation, Linear,
ModexpPricer, modexp as me, Pricing
};
#[test]
fn blake2f_cost() {
let f = Builtin {
pricer: Box::new(123),
native: ethereum_builtin("blake2_f"),
activate_at: 0,
pricer: map![0 => Pricing::Blake2F(123)],
native: EthereumBuiltin::from_str("blake2_f").unwrap(),
};
// 5 rounds
let input = hex!("0000000548c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
@@ -701,9 +774,21 @@ mod tests {
assert_eq!(f.cost(&input[..], 0), U256::from(123*5));
}
#[test]
fn blake2f_cost_on_invalid_length() {
let f = Builtin {
pricer: map![0 => Pricing::Blake2F(123)],
native: EthereumBuiltin::from_str("blake2_f").expect("known builtin"),
};
// invalid input (too short)
let input = hex!("00");
assert_eq!(f.cost(&input[..], 0), U256::from(0));
}
#[test]
fn blake2_f_is_err_on_invalid_length() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 1 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-1
let input = hex!("00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let mut out = [0u8; 64];
@@ -715,7 +800,7 @@ mod tests {
#[test]
fn blake2_f_is_err_on_invalid_length_2() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 2 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-2
let input = hex!("000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let mut out = [0u8; 64];
@@ -727,7 +812,7 @@ mod tests {
#[test]
fn blake2_f_is_err_on_bad_finalization_flag() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 3 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-3
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002");
let mut out = [0u8; 64];
@@ -739,7 +824,7 @@ mod tests {
#[test]
fn blake2_f_zero_rounds_is_ok_test_vector_4() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 4 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-4
let input = hex!("0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b");
@@ -750,7 +835,7 @@ mod tests {
#[test]
fn blake2_f_test_vector_5() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 5 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-5
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923");
@@ -761,7 +846,7 @@ mod tests {
#[test]
fn blake2_f_test_vector_6() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 6 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-6
let input = hex!("0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000");
let expected = hex!("75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735");
@@ -772,7 +857,7 @@ mod tests {
#[test]
fn blake2_f_test_vector_7() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 7 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-7
let input = hex!("0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
let expected = hex!("b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421");
@@ -784,7 +869,7 @@ mod tests {
#[ignore]
#[test]
fn blake2_f_test_vector_8() {
let blake2 = ethereum_builtin("blake2_f");
let blake2 = EthereumBuiltin::from_str("blake2_f").unwrap();
// Test vector 8 and expected output from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-152.md#test-vector-8
// Note this test is slow, 4294967295/0xffffffff rounds take a while.
let input = hex!("ffffffff48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001");
@@ -829,8 +914,7 @@ mod tests {
#[test]
fn identity() {
let f = ethereum_builtin("identity");
let f = EthereumBuiltin::from_str("identity").unwrap();
let i = [0u8, 1, 2, 3];
let mut o2 = [255u8; 2];
@@ -849,8 +933,7 @@ mod tests {
#[test]
fn sha256() {
let f = ethereum_builtin("sha256");
let f = EthereumBuiltin::from_str("sha256").unwrap();
let i = [0u8; 0];
let mut o = [255u8; 32];
@@ -872,8 +955,7 @@ mod tests {
#[test]
fn ripemd160() {
let f = ethereum_builtin("ripemd160");
let f = EthereumBuiltin::from_str("ripemd160").unwrap();
let i = [0u8; 0];
let mut o = [255u8; 32];
@@ -891,7 +973,7 @@ mod tests {
#[test]
fn ecrecover() {
let f = ethereum_builtin("ecrecover");
let f = EthereumBuiltin::from_str("ecrecover").unwrap();
let i = hex!("47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad000000000000000000000000000000000000000000000000000000000000001b650acf9d3f5f0a2c799776a1254355d5f4061762a237396a99a0e0e3fc2bcd6729514a0dacb2e623ac4abd157cb18163ff942280db4d5caad66ddf941ba12e03");
@@ -941,18 +1023,16 @@ mod tests {
#[test]
fn modexp() {
let f = Builtin {
pricer: Box::new(ModexpPricer { divisor: 20 }),
native: ethereum_builtin("modexp"),
activate_at: 0,
pricer: map![0 => Pricing::Modexp(ModexpPricer { divisor: 20 })],
native: EthereumBuiltin::from_str("modexp").unwrap(),
};
// test for potential gas cost multiplication overflow
{
let input = hex!("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b27bafd00000000000000000000000000000000000000000000000000000000503c8ac3");
let expected_cost = U256::max_value();
assert_eq!(f.cost(&input[..], 0), expected_cost.into());
assert_eq!(f.cost(&input[..], 0), expected_cost);
}
// test for potential exp len overflow
@@ -969,7 +1049,7 @@ mod tests {
f.execute(&input[..], &mut BytesRef::Fixed(&mut output[..])).expect("Builtin should fail");
assert_eq!(output, expected);
assert_eq!(f.cost(&input[..], 0), expected_cost.into());
assert_eq!(f.cost(&input[..], 0), expected_cost);
}
// fermat's little theorem example.
@@ -1054,9 +1134,8 @@ mod tests {
fn bn128_add() {
let f = Builtin {
pricer: Box::new(Linear { base: 0, word: 0 }),
native: ethereum_builtin("alt_bn128_add"),
activate_at: 0,
pricer: map![0 => Pricing::Linear(Linear { base: 0, word: 0 })],
native: EthereumBuiltin::from_str("alt_bn128_add").unwrap(),
};
// zero-points additions
@@ -1113,9 +1192,8 @@ mod tests {
fn bn128_mul() {
let f = Builtin {
pricer: Box::new(Linear { base: 0, word: 0 }),
native: ethereum_builtin("alt_bn128_mul"),
activate_at: 0,
pricer: map![0 => Pricing::Linear(Linear { base: 0, word: 0 })],
native: EthereumBuiltin::from_str("alt_bn128_mul").unwrap(),
};
// zero-point multiplication
@@ -1153,9 +1231,8 @@ mod tests {
fn builtin_pairing() -> Builtin {
Builtin {
pricer: Box::new(Linear { base: 0, word: 0 }),
native: ethereum_builtin("alt_bn128_pairing"),
activate_at: 0,
pricer: map![0 => Pricing::Linear(Linear { base: 0, word: 0 })],
native: EthereumBuiltin::from_str("alt_bn128_pairing").unwrap(),
}
}
@@ -1226,16 +1303,15 @@ mod tests {
#[test]
#[should_panic]
fn from_unknown_linear() {
let _ = ethereum_builtin("foo");
let _ = EthereumBuiltin::from_str("foo").unwrap();
}
#[test]
fn is_active() {
let pricer = Box::new(Linear { base: 10, word: 20} );
let pricer = Pricing::Linear(Linear { base: 10, word: 20 });
let b = Builtin {
pricer: pricer as Box<dyn Pricer>,
native: ethereum_builtin("identity"),
activate_at: 100_000,
pricer: map![100_000 => pricer],
native: EthereumBuiltin::from_str("identity").unwrap(),
};
assert!(!b.is_active(99_999));
@@ -1245,11 +1321,10 @@ mod tests {
#[test]
fn from_named_linear() {
let pricer = Box::new(Linear { base: 10, word: 20 });
let pricer = Pricing::Linear(Linear { base: 10, word: 20 });
let b = Builtin {
pricer: pricer as Box<dyn Pricer>,
native: ethereum_builtin("identity"),
activate_at: 1,
pricer: map![0 => pricer],
native: EthereumBuiltin::from_str("identity").unwrap(),
};
assert_eq!(b.cost(&[0; 0], 0), U256::from(10));
@@ -1265,15 +1340,15 @@ mod tests {
#[test]
fn from_json() {
let b = Builtin::from(ethjson::spec::Builtin {
let b = Builtin::try_from(ethjson::spec::Builtin {
name: "identity".to_owned(),
pricing: ethjson::spec::Pricing::Linear(ethjson::spec::Linear {
base: 10,
word: 20,
}),
activate_at: None,
eip1108_transition: None,
});
pricing: map![
0 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing { base: 10, word: 20 })
}
]
}).unwrap();
assert_eq!(b.cost(&[0; 0], 0), U256::from(10));
assert_eq!(b.cost(&[0; 1], 0), U256::from(30));
@@ -1288,17 +1363,25 @@ mod tests {
#[test]
fn bn128_pairing_eip1108_transition() {
let b = Builtin::from(ethjson::spec::Builtin {
let b = Builtin::try_from(JsonBuiltin {
name: "alt_bn128_pairing".to_owned(),
pricing: ethjson::spec::Pricing::AltBn128Pairing(ethjson::spec::builtin::AltBn128Pairing {
base: 100_000,
pair: 80_000,
eip1108_transition_base: 45_000,
eip1108_transition_pair: 34_000,
}),
activate_at: Some(Uint(U256::from(10))),
eip1108_transition: Some(Uint(U256::from(20))),
});
pricing: map![
10 => PricingAt {
info: None,
price: JsonPricing::AltBn128Pairing(JsonAltBn128PairingPricing {
base: 100_000,
pair: 80_000,
}),
},
20 => PricingAt {
info: None,
price: JsonPricing::AltBn128Pairing(JsonAltBn128PairingPricing {
base: 45_000,
pair: 34_000,
}),
}
],
}).unwrap();
assert_eq!(b.cost(&[0; 192 * 3], 10), U256::from(340_000), "80 000 * 3 + 100 000 == 340 000");
assert_eq!(b.cost(&[0; 192 * 7], 20), U256::from(283_000), "34 000 * 7 + 45 000 == 283 000");
@@ -1306,15 +1389,25 @@ mod tests {
#[test]
fn bn128_add_eip1108_transition() {
let b = Builtin::from(ethjson::spec::Builtin {
let b = Builtin::try_from(JsonBuiltin {
name: "alt_bn128_add".to_owned(),
pricing: ethjson::spec::Pricing::AltBn128ConstOperations(ethjson::spec::builtin::AltBn128ConstOperations {
price: 500,
eip1108_transition_price: 150,
}),
activate_at: Some(Uint(U256::from(10))),
eip1108_transition: Some(Uint(U256::from(20))),
});
pricing: map![
10 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 500,
word: 0,
}),
},
20 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 150,
word: 0,
}),
}
],
}).unwrap();
assert_eq!(b.cost(&[0; 192], 10), U256::from(500));
assert_eq!(b.cost(&[0; 10], 20), U256::from(150), "after istanbul hardfork gas cost for add should be 150");
@@ -1322,17 +1415,99 @@ mod tests {
#[test]
fn bn128_mul_eip1108_transition() {
let b = Builtin::from(ethjson::spec::Builtin {
let b = Builtin::try_from(JsonBuiltin {
name: "alt_bn128_mul".to_owned(),
pricing: ethjson::spec::Pricing::AltBn128ConstOperations(ethjson::spec::builtin::AltBn128ConstOperations {
price: 40_000,
eip1108_transition_price: 6000,
}),
activate_at: Some(Uint(U256::from(10))),
eip1108_transition: Some(Uint(U256::from(20))),
});
pricing: map![
10 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 40_000,
word: 0,
}),
},
20 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 6_000,
word: 0,
}),
}
],
}).unwrap();
assert_eq!(b.cost(&[0; 192], 10), U256::from(40_000));
assert_eq!(b.cost(&[0; 10], 20), U256::from(6_000), "after istanbul hardfork gas cost for mul should be 6 000");
}
#[test]
fn multimap_use_most_recent_on_activate() {
let b = Builtin::try_from(JsonBuiltin {
name: "alt_bn128_mul".to_owned(),
pricing: map![
10 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 40_000,
word: 0,
}),
},
20 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 6_000,
word: 0,
})
},
100 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 1_337,
word: 0,
})
}
]
}).unwrap();
assert_eq!(b.cost(&[0; 2], 0), U256::zero(), "not activated yet; should be zero");
assert_eq!(b.cost(&[0; 3], 10), U256::from(40_000), "use price #1");
assert_eq!(b.cost(&[0; 4], 20), U256::from(6_000), "use price #2");
assert_eq!(b.cost(&[0; 1], 99), U256::from(6_000), "use price #2");
assert_eq!(b.cost(&[0; 1], 100), U256::from(1_337), "use price #3");
assert_eq!(b.cost(&[0; 1], u64::max_value()), U256::from(1_337), "use price #3 indefinitely");
}
#[test]
fn multimap_use_last_with_same_activate_at() {
let b = Builtin::try_from(JsonBuiltin {
name: "alt_bn128_mul".to_owned(),
pricing: map![
1 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 40_000,
word: 0,
}),
},
1 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 6_000,
word: 0,
}),
},
1 => PricingAt {
info: None,
price: JsonPricing::Linear(JsonLinearPricing {
base: 1_337,
word: 0,
}),
}
],
}).unwrap();
assert_eq!(b.cost(&[0; 1], 0), U256::from(0), "not activated yet");
assert_eq!(b.cost(&[0; 1], 1), U256::from(1_337), "use price #3");
}
}

View File

@@ -12,6 +12,6 @@ common-types = { path = "../types" }
ethereum-types = "0.6.0"
kvdb = "0.1"
parity-util-mem = "0.1"
parking_lot = "0.7"
parking_lot = "0.9"
rlp = "0.4.0"
rlp_derive = { path = "../../util/rlp-derive" }

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.
fn exists<T, R>(&self, col: Option<u32>, key: &Key<T, Target = R>) -> bool where R: AsRef<[u8]>;

View File

@@ -13,12 +13,12 @@ lazy_static = "1.0"
log = "0.4"
vm = { path = "../vm" }
keccak-hash = "0.2.0"
parking_lot = "0.7"
parking_lot = "0.9"
memory-cache = { path = "../../util/memory-cache" }
[dev-dependencies]
rustc-hex = "1.0"
criterion = "0.2"
criterion = "0.3"
hex-literal = "0.2.0"
[features]

View File

@@ -35,7 +35,7 @@ itertools = "0.5"
bincode = "1.1"
serde = "1.0"
serde_derive = "1.0"
parking_lot = "0.7"
parking_lot = "0.9"
stats = { path = "../../util/stats" }
keccak-hash = "0.2.0"
keccak-hasher = { path = "../../util/keccak-hasher" }

View File

@@ -18,7 +18,7 @@
use std::sync::{Weak, Arc};
use ethcore::client::{ClientReport, EnvInfo, ClientIoMessage};
use ethcore::client::{ClientReport, EnvInfo, EngineClient, ClientIoMessage, ForceUpdateSealing};
use ethcore::engines::{epoch, Engine, EpochChange, EpochTransition, Proof};
use ethcore::error::{Error, EthcoreResult};
use ethcore::verification::queue::{self, HeaderQueue};
@@ -620,8 +620,8 @@ impl<T: ChainDataFetcher> ::ethcore::client::ChainInfo for Client<T> {
}
}
impl<T: ChainDataFetcher> ::ethcore::client::EngineClient for Client<T> {
fn update_sealing(&self) { }
impl<T: ChainDataFetcher> EngineClient for Client<T> {
fn update_sealing(&self, _force: ForceUpdateSealing) {}
fn submit_seal(&self, _block_hash: H256, _seal: Vec<Vec<u8>>) { }
fn broadcast_consensus_message(&self, _message: Vec<u8>) { }

View File

@@ -12,7 +12,7 @@ ethcore-network = { path = "../../util/network" }
ethcore-network-devp2p = { path = "../../util/network-devp2p" }
ethereum-types = "0.6.0"
log = "0.4"
parking_lot = "0.7"
parking_lot = "0.9"
ethabi = "8.0"
ethabi-derive = "8.0"
ethabi-contract = "8.0"

View File

@@ -82,21 +82,6 @@ impl PodAccount {
}
}
impl From<ethjson::blockchain::Account> for PodAccount {
fn from(a: ethjson::blockchain::Account) -> Self {
PodAccount {
balance: a.balance.into(),
nonce: a.nonce.into(),
code: Some(a.code.into()),
storage: a.storage.into_iter().map(|(key, value)| {
let key: U256 = key.into();
let value: U256 = value.into();
(BigEndianHash::from_uint(&key), BigEndianHash::from_uint(&value))
}).collect(),
}
}
}
impl From<ethjson::spec::Account> for PodAccount {
fn from(a: ethjson::spec::Account) -> Self {
PodAccount {

View File

@@ -25,7 +25,7 @@ keccak-hash = "0.2.0"
log = "0.4"
parity-bytes = "0.1"
parity-crypto = "0.4.0"
parking_lot = "0.7"
parking_lot = "0.9"
trie-db = "0.12.4"
patricia-trie-ethereum = { path = "../../util/patricia-trie-ethereum" }
rand = "0.3"
@@ -38,7 +38,7 @@ serde_json = "1.0"
time-utils = { path = "../../util/time-utils" }
tiny-keccak = "1.4"
transaction-pool = "2.0.1"
url = "1"
url = "2.1.0"
[dev-dependencies]
env_logger = "0.5"

View File

@@ -50,12 +50,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -64,12 +65,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -78,14 +80,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -53,12 +53,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -67,12 +68,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -81,14 +83,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -42,12 +42,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x0": {
"price": { "linear": { "base": 500, "word": 0 }}
},
"0x7fffffffffffff": {
"price": { "linear": { "base": 150, "word": 0 }}
}
}
}
@@ -56,12 +56,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x0": {
"price": { "linear": { "base": 40000, "word": 0 }}
},
"0x7fffffffffffff": {
"price": { "linear": { "base": 6000, "word": 0 }}
}
}
}
@@ -70,14 +70,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -38,12 +38,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "linear": { "base": 500, "word": 0 }}
},
"0x7fffffffffffff": {
"info": "EIP1108 transition",
"price": { "linear": { "base": 150, "word": 0 }}
}
}
}
@@ -52,12 +53,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "linear": {"base": 40000, "word": 0 }}
},
"0x7fffffffffffff": {
"info": "EIP1108 transition",
"price": { "linear": { "base": 6000, "word": 0 }}
}
}
}
@@ -66,14 +68,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"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": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -70,12 +71,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -83,14 +85,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -76,12 +76,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 20,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"20": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -90,12 +90,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 20,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"20": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -104,14 +104,12 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 20,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"20": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -55,8 +55,8 @@
"stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
},
"hardcodedSync": {
"header": "f9021ba0a281d23475d3d5ff03df8636c9f528cdd91498af274a3b2f8989bbd51bfeb809a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794004730417cd2b1d19f6be2679906ded4fa8a64e2a0d5fdd62e7e29dc3da1cd3fe5ad549e000260bfdb55f523fde008f26390220d23a0370ff78457d6c7469ff333a13165f4bb8057d00cfa68365cb4d1a8c8a1da46d5a0dea37365a20f5bb5ad3766a24a9fe7b04b946e35aaba74f862467a7c5cdb7d67b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000004000000000040000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000100000000000000000000000080000000000000000020000000000000000000000000000000000000000000000000000000000000000000000020000000000001000000000000000000000000000000080010000000000000008000000000000000866fc181925a9783763801837a121d830c317c845c9d1efe9b457468657265756d436c6173736963534f4c4f2f326d696e657273a0bb6e626c7ee3d827da18e1b303d9552ba17e92cefcedfc58bdfc5bac6a8ebabe882d8c26402344c24b",
"totalDifficulty": "598584828374329723203",
"header": "f901fda0f46341de105659d5897cc2c49b97df3f74a7535f2f0a7c86b12a0f23b2c436afa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479421479eb8cb1a27861c902f07a952b72b10fd53efa0c409d60020629ffe77f7aa91603b8fe5df8811957d231638b29471a0b0cb695ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000868527ce839a798385e8018379f57980845d7b0d1c80a051d85cf8feba52d2c0cf244ceb037441ec276d88a07ad755e6ff3cc92d52097e88f3906b50ebf30eec",
"totalDifficulty": "729996985215121503838",
"CHTs": [
"0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc",
"0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11",
@@ -3840,7 +3840,509 @@
"0xc893aee6d249c152f5db3d7763f34a3311345dff721ae9c71ab5fb3d2b3e2559",
"0x250caa98ea3e682be9c866990f19647f443d57690052229ac0ccfa0ab30a5a71",
"0xc32fd5318214071a41cd8e98499b2b65942c5837c686a06b536146fd0bf294bf",
"0xac390c012eecd83fa8f4cc77a59992914b5c95af36b28747e07adea13228acbc"
"0xac390c012eecd83fa8f4cc77a59992914b5c95af36b28747e07adea13228acbc",
"0x5baa5a91d5e9d4632ba89304ca9a3b252f873477f3f0dbbe82a2656eb11cc74b",
"0x063db9182a0d7061dd6872e56c0fc9c5ce9dcd50bba1c1be4e066ac31baea300",
"0x30718f710304c59b8438a03539aca2d431d0a751fd718d905bd14b9b14587674",
"0xeff0df83d65ca2db9b93f92245f8f2be2777ac0eb8b05960c63f9761c4a609b2",
"0xad3e2da2fe9dfa45f6c2655ebbf57f4291db03ee48d4cc9c9dce8ba77068192c",
"0x1c2da7631ac5be07f69d7a33ab11c19677f037339197eb6019ad7a85b81ccc73",
"0xad135339b16d46696f1d630a041af6ff703e50f03720a2391a7437cca1e86c6b",
"0x18a288ba23d438c58600d500f8a2f5b66fbf8cac2fdf21c92602715e1d7d9c0a",
"0xc41f27d18eeac02197b67d185163b407d7ee75e776cd73e36e568f05f7528631",
"0x5243561b8e640354f82568049d4b8ce7f30e092384398f22ec4f0558da756c86",
"0x0fc498227a7c657eec7dfe09a668db967d6ed74bbabe16dc2108406870d7d7f2",
"0xf229992ca93866a74fe61e3d0a742e7b756db30e5c1b20038cece1c7e0a20c2a",
"0x6ec77884426881486865322f73f26c09cca3446081380d91730d19fca46adb61",
"0xed8ce85df6404d421b09dda6e3e4539df7963067f2ee0190de80faf9589249a7",
"0x5fe506925192e162787bafa20c4829755d2616c27fb448d08a9594383608b114",
"0x18808bdd50aa3f52f045cfa8eb2a669c52004c38b12b68536ac3e742f3a11a15",
"0xded04cbdd4942959435b197403ac9d38b7239f51693440d88e3fe4cc2f90a3a0",
"0x6ad413fbdd413fc14decf9aae5c37dae63fd4ec2d11844c6058023a462040053",
"0xa1cf0f465f9af59340b2e3f49242e02282f6a0ab82ea4721bfdae4f995e2da99",
"0xe1794440b5173a4a6cde5595e3d34df38aaaaed9489af182af314b29357748b2",
"0x1d427d41658ea2a40d9da5e2f03ad0b3060a9693572d2e188e0ae4e9e1852f36",
"0x0799a99fb0ef1edbcb102022b3d86abd3a4d771e583814a292f6a499233a0fc4",
"0x63cc0d8e879d5c25fb4001b90e0e9e8fb8201cf50aaad3c9ae7f6354760bd976",
"0xc94df53c16fad900034e2b3fca50038979b8eb94032f745073f10a56bce1e027",
"0xc587fb5f436afaf00310ec86dbfd622afdb3f694c08ff71db952f903a4bb8a55",
"0x70fda21e86b108ac5e16109a12f51f26d374c164899898106d80d5a641b7dd03",
"0xa48bf905f87aab400fb9f4e456d27de102763156bb33a3db37f8fc8aeccbb135",
"0xb934c6f92f574a1ce070dfefbc2fbc6764ea22a2565a8083ac5b1063b3a237d3",
"0x474b3eb3e73312269d3598161bfbcae30b7e1056919a6f6afeca3a2abb853897",
"0x122e4343fe46c9cd740381675fba4a0258e0f42dfa569073bdf055bb66cc6543",
"0x8c4a235053e9fb225eaed1ad6f61747d1ca9f29fa520465ee0471f4fb028c619",
"0x5228999495c587f7000ec00e18e09cccaa1ac2eb8e0415307439f3927450832d",
"0x81ab2253864c7e7ce4d7184f2280cb080e38a7d672e9f8dc3c18907a51894509",
"0xf8bc443f7984839c9024c2649ef329cca6c7f05fffe90e116436267aa0bcc27a",
"0x99553484d427f255d14c1b03ceeac1cdb5e08134ad4f4a06a1b02ec3fb1657f4",
"0xf8fce679a0ef4119057ee408a5bb7dfea18cb93d8d41f4ca7e663ca6c1c8a1cf",
"0xa432fffcec6116e11426685b7d73d37945e884c2f261a139f5cb8c458e501f1e",
"0x2729cf60d8531d0620ef907cd4f5cb51f6eabfb94a5af5b1e1f674bdb916cbbe",
"0xa5977b367bb45c53c85f40d28e9ff0215790e94054dbc11510222137e55736cf",
"0x0c4378b1341796a2ae2143795df0a7c5e3a85c57e5a2ed62d14fe6296fa98d84",
"0x07d744b148a65d6535c0b7ec4789323c10cf19062177780cb196e2d7ff5b169e",
"0x9bbf777e8fbb1cbdb773eb18a47bf9cf0946e501653584a8364e8f6bda245d34",
"0xdd70ea9aa94dffda9c2dc901e84e621135c139405e2136ac6f7e54e71aaad593",
"0xde5e19af4bc19137ead84d3db93a511a7c253eb1d71ca3cc9284163facf2ecc7",
"0xa75e5454a26c2f26768e17aa56fc1768503d7c8b2d3d0bf8a65380cdcb3348cc",
"0x37f55a4f1df17bdf0813e0781d0227f539e9633f6ff924fe73d9cbb248e2741c",
"0x2834deeb897f9f9cb7f8902825a106b0c7389f5a151f61f7bcf38fa569968893",
"0x31e583216ab016d456e9e5cfda5a27b564a822f164ee3b70dc956392bd504a18",
"0x92bbc94b98ce4dcc8bc0f98b5cec91618904021c721f175676fe59ce308cf6e1",
"0xeb3ca726b5bd919e41376a95d41deafba80d8ab52f79f976dbb1eab219af8653",
"0x1b4ff093569939e006a6854a2a1af06b8220151968240d80fbd5ac56a0837cd4",
"0xc87b28f21420b002c2b79c12388d714661ba67e55a587aca1a390f2082505168",
"0x866a67c833049cfc8491d672696d591d1163f8fe21b67f385030e6a153c3399f",
"0x61b4ddb584fc452f47db7d9912388da253ac97ae4270676c09dcfab3df91e4fe",
"0x132616810148d4491328b6893edb9a66db1b20184aef5efae481505d43ee78db",
"0x21c644596d384f59307e7e6defcf9547794b30a1f61758ec24dd0362690bf22b",
"0xc4905b2f5798c1e88ce47e7f2144bb5f8c2650b44926be59f9336b9a76477f14",
"0x281a805a9dff1fb6ffc3bc1660063d2d92ce2cdf1de4da98e007c217a8eb2b2b",
"0x4f52a327469d9fb0978cb57f8061d7c3c4c39b73aa7eb771173ac5f375850832",
"0xb690d892e39e838dda77b78ffcb4e3dc6fc4621856388233d559eddeb25f89c3",
"0x1dd206d1bfaf594caeab38e041f30f2bbcff635f8818bf5c8407a7a957e44a97",
"0x6d5189f970052250a91f304dd419742b1b96655566f4426b33335c3bdcc3e6fe",
"0x7aec3247a3d6e0ffd3e4bfd60dd143455dfebd7a5587e531575772f215bc45e0",
"0x810187dfc969f107494d9f9891d9f1cdcc0978d48efdec0ac8bbff5ef9843977",
"0xe104b79045c6efaf4b5cdab9ab1c25d6afac28a9165bdd22a601a0baed63b1f5",
"0x258f8300d1e177e19666c69dc714b71d7a441d251e4841d73bac817814ef2f91",
"0x3e78915853a869348a65035fec30987d4e7cf23f42e06f6f6b932e0d94d45d1c",
"0x60f0fff616c4014b36320f632b50e011521a4804b7cf87071f0d4b138e1540a0",
"0x91efbedd8494c07e4e77e826dc0cc557f55b903854cfd45358a7b10deaf9f814",
"0xb8d2abfbdb710b8a2694a60e72536f0e99b455614c1e2f0050ff6be1e2c0d89e",
"0x26f7662a23f6b3f20e9ade429977f4c3c56b7e53ff72f09d40d2dc0cd3d002ef",
"0x91e9906b0591fbecef8e154903c4dbeb3d2d6f853b1d2bd85af26fa6ec6b12b8",
"0xa932981dc47fee204a3a57fe11465fd836936b7cf0d314ebbfd92f5a700935c0",
"0x49ea0da0300b7864b201bc474c841641b920741f95607714d59b8ce62c11be14",
"0x778fc84c0b7e7aaaa9a12478156c352c3eb88c9703066e7744183eff8615f529",
"0x28467d644dbe57aecf7486e729c5dac2e23d1850f2d1c0e1fd6b641c9c57a72b",
"0x4a5a47a6978dc72d46dd823e9a5056d37367ee9b31b620baec372a60a5d923b1",
"0xb3ffab40553877702b0401133e512958bedbc667076cb19afc3ac17ad812558d",
"0xf0fdef8c21a19c70e3eec8f5cd8cbd8e7189ab12924adc6a913739da5b259814",
"0x3052012ceb30e8a8805a289c1a702451d8d144325e960b24214659dbbee92aa0",
"0xad90c660afa7d924632728d2462d6e12621292436d5608d6f8f4b9edd6e8fac1",
"0xa77f30230e8444590e86c0062585e299a42fc11f1bb4fe0bdd54270bc56d41bb",
"0x3b95bc0943de7c51628110c942c96445bf6e66e22817803f62a961fe5e5a7842",
"0xf1d18b53e1753fe6ae35451ed5416871df5ef3d11f298fe0c4728f2a45dc4a36",
"0x9f583b0e5aaa4ecaec2f364d15fcc92127b7975d21d73d88cc8a4dac794c4c4d",
"0x8b35fafdfae45c2084821d8232f39515f0eae1a33b54a7b068c27ef577f17401",
"0x9164a7d5479e4e017762a6d23f9615aefb7908309aac0d7ca5136c5f12038be6",
"0xbdc2907185dc191216024480db13512f447bfce61a26cada361b13519f4c8750",
"0x26aae1e9fc65bc757b8b5214a53dd3181716148fe5ee8b6024def720e8f2dfb1",
"0xdd27ddb445b4e0ebbcaee4e4ee16cd82026053ba710d203a8f12d98be49bd192",
"0xa65e6212135dc4800e8db31eaffecc5fd102e27392eeb29a0408027b8296aa6c",
"0x48be60400a417b4278f6a4462df5b21ed84478aef95832d6bc84d268043a58d4",
"0x15064498fd0d9306f93b049c09e2ae34bde26666a68398d43334bde79e81a8c5",
"0x1675cfc2488fbcc07abb552be0d9330863d72109cd326df28fc29ebe31a9f0c3",
"0x355dd1ddbc5d1661798bc2e6c14bab637c865ef2f9269cbc9de65c000e8ffd6f",
"0x3d43b77d3cc2496287b70876afa5fd95091b9c7be2404ba7d4beb33f63a59946",
"0x67d7b72f12b310423f7255c23adddba8b254955fbd26f6e1a04d2894b986d2ed",
"0x474266653b5c0fb8cdec08165fd372e0621666cec9518dd760ecf4a17532909d",
"0x21789112f6735fba468d54bc2fb0e36944dc6600714a5a91559a2d3c58a88506",
"0x4f7b92f944a137f4fabe94e79dead83d0751d67fc576d3bf0ed12f45ae7ab19a",
"0x8e8b807df4d55d066e557499e338a0c4469d0dc60c1f1049ab10c0793bbc1341",
"0x0c80c5a951364b0535c30cb2377359330e62a3b22baa9e46def2bd34335808df",
"0xed0e8622188e86095f0c00451330a8c6c66c3c4ded762c24cbc5d9583ca6c14a",
"0x32ebe89b887a32f373619861777bd4848834e2f15d32caefa86cc68a828b60e1",
"0x219dc3416bd64cc30ea4d235962476703ef07371b894e2fc6921831a400668b1",
"0x15094b0e7221259ed675e59abecae8a7b06639b8af7c8275331fc4fa2ff28bfa",
"0x39eac3cfdbcc36436bb4dc9549921b3da0b698bf6811a524f5645a43ddbb4152",
"0x50434374e8cdd1d864073732729f22a42b396973a94966afb61787a6a016878f",
"0x65b62ec39e4e8191eced64fdd511f8631bdc91361e7340b04b0bcd36f64a1450",
"0x108449a43e9c8162c067f1a7cc592c64d77646fa56bf752b4f9d8cf509df8ca3",
"0x0a01e40f6cae91f422eb3f6ccc2bc1df1ecd74102e31ca7c108cb830fe960dbd",
"0x687a6e0d33f87f4218a27806dad2cfcc03ee83a60b129bdad30640210bc0ceba",
"0xbe9514f263b1e396879f7e826e70eb610f9324d6b5b1bcef613184d858b20268",
"0x5240516bb101ef84c1ade7f6d4859f1de174f8d71a58651eee8aaaf625812c92",
"0xc92b4d735fe7b91d55d4d9dd7be705010c5046e734e7269e00a8a2d0b6eda469",
"0x989cbd034d9785f6391387ff80280bb871f5fcda1ed4491558deedc0642d539d",
"0x8b1f0fa6557b231bcfa3c1e3e441b0307d0143cce4147404cc2251e04f2e7c6e",
"0xcd6c7d23c13c62de5c2d1b284e95eec5aa938146963bfc0d928dc4f2bedbb990",
"0x6598cb8c83478b0169bdd9efc51e31c03029a193962cde282eebc57ca50209a8",
"0x6ac406d7f3c720ef0e511482353fd1764a59e236681dcc21b5b0c5608065c254",
"0xc4f81e27afca02ffdb9cc75b10755714d9f0ed585c49a02ff56dca68ea81a4b9",
"0x73f18bb87df70b65d87f5857b7ed56a0aeee9e5782f02c731b2a088dc87ffa90",
"0x292c53312388cab0d16e1ef0b5e0664260e6192a2eef5466cf2f55b9d884e84f",
"0xe12f08a92be7116c0f2124e00e31a0e365862c02f24b969d11d73eca742e9d20",
"0xff4dcaf5ecacd0a0c79ffd05fed7064a42aa34b7e4d4c2ef06cf93866ab11b0d",
"0x09b269a7bda10a51f41a382195997c1eb999e7d5b95cd80c2bbcdca1516ad2df",
"0x84a3219e02c807319ccb729b8b75884ef07828362f41352ba5366c8a971ac8ad",
"0x00625ef937b27ea4d4cdea0877a8ea6c1c12a30fedaf9ffa616c4bfc03fdad41",
"0xb260408afa75b0dd271c42d03329d18b4a52eac1b366284e4dce49228c93aee4",
"0xf6aab365a58d33619568bb5b048f0832bf56464b8ff18e5e5cb01221d2c9153e",
"0x3c1cca7e56641f2513ed3a8200af452f07c57ba719a03f0ad152924d5025f78c",
"0x4d8fe151b547736943fc9461162fd0c38c3c587543ed07919f0899c33571c02a",
"0x1f96e14e7f4b0d88667caa9358f71537ae8259058cdd5bf4d4548a596aafd6fe",
"0x47269a44adf8d4da7387b4472a6fe6fc73ff036bfd3d18539baa7a994cbb08b6",
"0x99dc1f31c4372c92c111e07f9204b0c02a65c60cb98945b48f36f91e4ee3ebbc",
"0xb386f83f1dfb377542729637b7c9fa5aaeda1b1e80a943814b595455169df4d5",
"0xc658d48da7857f2428e842f082058f67b5a207f1e89755be975d63f2536d052d",
"0xb4ac984c3973d2b29dab339b22f24184a71a8f2095687730e2e983c7ead1debc",
"0xe18a17e73707dfda4dff0d6d265dbefb30ade501f66ddb271e4acc14abe33a67",
"0x54094994c0767621e6991968292626ea6b96ded08b7db4911ca813addd6c97cd",
"0x66ebf14e3b67586988821edc1d1359b5e2b7a1308ebf74e8f262936eaf094a79",
"0xe4ec70730abb9ca432449ade5fa755063f000e4f951b9bd66427a7c81f0e2693",
"0xba2d8fd5e35c180ab7f82bd9756bc0d6d9869517dfa955c4eca986ba24e77879",
"0x01a94449579d72a037bc9b3f2c7e5b2a9fa271efbba739dcfc4317f46f7f6351",
"0x58acf073f978e3429fec96bdb141370e950c4b6262455e187901a8ae9cd996c5",
"0xf8dfd826ef39b866257bb1735a6f90e42cf5c43b0141bef9e8a40ad27fce51cb",
"0x13bc935c01bb67d74f990026ee7c71af40fda4ba767477811806033c9eda0627",
"0x06be0395e7baf7411391eb25aa6d686d17bc9b5234da75e222513aee2fd57667",
"0x79c8f4cf27457be49ba894d8f9941d07537c6efc8403e2409fefd48cdf57ff72",
"0xa3e8dec2fe3b7ae4a72bb335ffd73ba83b6f554a241bad37f57e91fe0489e0be",
"0xa09c11f4d0a7987b2b13645db856b0075aa7cf2ae6d192df34e47ac3e382e91d",
"0x6bbd7d58f36dabf050aed607cf4cf0cad4b77cd8d8fabd7e8102f37d57d0b431",
"0x64f8a336f48ba487fce269f2a50f96b27854e821a9ed8a7a37d234531919fffc",
"0xeadd50546049b0fe946d16fb473694d67cc3a3a47b66c95e36e2c5c07d5c00cb",
"0x7ff4c90b3926f3d1e0e05256afca46888c873a518d4cb31e2a8e09774c8377fa",
"0x071beac76eea71ff246007f02a36cc8a622280dfaec5ee03ad4b30c7de4e7db7",
"0x32700ffce5a146bcd52564e00a98452038e19871f766a49734705b0715b4813e",
"0x8d2266050b03ef7e8a04338443bde3838d70c093ee018ef1b78175a96de98f1e",
"0xfae1a03d9e78ac16e03720f2195ea151b266fc1af5c9cc394846a3005b939944",
"0xa9db306a833357705f982694f681ad88e6b4f01f8bbe788ebc94e46d6e57de88",
"0x0bcd8dfe6604fafeebbd60243236c8b087f39525a764b069114c254d9b3a0660",
"0x32233199d897fdca97996fda5ccade8627169b0f674fdd2dde0a9fc7fa90c44e",
"0x2457dd631c1eb6142f65a4b3de12fe569a40d44345d0bde097341acda75a40cb",
"0x484bd77e0c06fecbcdcdcd28b07baf8de611b732123a08bcc4a3a94a49e6a6c7",
"0xfb9cb098723627e59ea6904dddcf688d8df3f7128a613b0d2519d445034d79dc",
"0x0804bb070784b8eb843c54abbd0a3047cf0c8a0ca7cad1853b2c9e9e38058d61",
"0x3c8d85c1cc596e45cf5f2e956ed42e1f1b87e8d38a9e043520b23721a8dbfa6d",
"0x718be0e6a7902f2464021258cc453038fd16baf96ae5c23d4649d4f12b405841",
"0x050660b3a33d96bab20fc6325ad84aea2727cd15e6908b438ba781ea92b83b51",
"0xd1c630d407eea28e5ac5bdaa26ac32a942896b5df088ba3adf67bdbe379b0adc",
"0xe76ea018d89c46a82381d930814e79580bdccc0acee6040162ebf44d174b0be1",
"0x25193d452b79ba224d3099ab5037af2420604d533773dcef5809bf60a46d5a42",
"0xf6576b28692002a1af1e3a6b0c3955cdd9c152b8b393e23dfd35b89786ea9067",
"0xe72cbedb7d4d7be50c52a0c0341b6a1e2b8d2b9b5a337eeb848840eb67eb435e",
"0xd1db44c28724f464268c4167f10ee0b7926178c181693ff60314b6b8d1eaee83",
"0x85b058f6028aac3720e6357d3f422c698b40dbfbc669c4edbfea775feb9a4463",
"0xa4fe8bd82ae34471453c6555314c4eda49f9273e996d6d54f7d1623229a96f30",
"0xa1fe7219b3f459c299f74678c1dff85cfa71e0286fa648022670ddcdad71a14e",
"0x43a9107554de014df984318d14a69e3c2f944ce5f63740e0c234e72ad9a7d05c",
"0x7aeb4bde654f62f16272018905520fdcd5aff603c3b5f400ce308cb4220458fa",
"0x8b2c8a696b029571caccbdc6c62b88e81216fcef074a9962e2b8da9589e4eee5",
"0x70ca647133e53019d1eb2ad9f88a39cedfff6613ba145eff700a2e6430f5edbc",
"0x56b6e937851f9fff38f8482fd739d2534bbea1d9f7bdff37593f2b6e24c6c892",
"0x6fbbbb8c4b2194b3f29d9233b251d33ad2b35e44ce51ceaaad6c982bb27ad6af",
"0xc76aafb66d6506356a83bf7bb4f618fa8b4e8fe5c5eab6361b6381ee519d7299",
"0xd839e351e77b21da7b42028f0102982703785b7ab17844c8fccc08385a85fdae",
"0x18a0082277bd4521c73f506f775f7b9193c81e3985c1a0341b97c9eb532a2aae",
"0x18dfbfa1771b2e60c8e859352550104d4f4ed4f788e4acb5e1700eda9bd2aae6",
"0x4c637fec82e7c993ae0c1f1ca76ef7ce02cae03eef1d40d3651c0ca945b37223",
"0x59fb0b58a885ba8dc9fb49cae638505bb609ad4fb8ff6769cb5174df461de748",
"0x97c58e7dfd2d45c4162f3590d0a4307b3d489223167df97177a11a9a2c4f107a",
"0xeb3a84563ab5b034eb5b301ed927db60c7c9918a73c88725bcb4f391ec80e264",
"0x1e24665e197511c1d5f369b6cd5d9655e39ccc71dc96481c3786294aa95f7716",
"0xd99d4053a8937501b5f33c2a891dc1c5c68596540f46be4bb95829b0fc8fe518",
"0xcacd99e02e6d95871337755edd5078fac19d0765a296a256401cb36772450fc8",
"0x0d8b1ad0070f13966c5c1a793f8596a1c4546e0deca4d2eab770abaea7d8c788",
"0xae12f968a8d9e854a55213c7d8c3522014fabfa31a41c5620bf4c1fa4b412ed8",
"0xae8d86547cd68065a8201df6f5e5e7ff7d0f253354e3a11f109b4c307197bacf",
"0x9aa0e527eb19eb7ad49e98387b7c367a8af94bbaa1493e9cb1f82ffba95439b7",
"0x4bc7af1e8d91864331f06e261b71ed690a2f95bce4a10b32ce8e57d41ed434ea",
"0xb7e3303f5aea61f4198720b67fec535db3a67a236271897c40a5b3626324b1e5",
"0x1c28333ddb6b715dc49390d7603124a32aa79f2d1a3df439972b796fcda24b75",
"0x1142fe51525a5e1c35e710e39136e9272c3ffe17e93070e29f543e2ce15a1747",
"0x13d2fdd1a280e4cbf56c256a0874b37d1c96b720c57d6baa58ce5e53c878778d",
"0x0697c729147f0bfcd8140ece6818594d9700a06eb642dca83c82d71ee3fe58c3",
"0x575577dea847a6dbdae4996ee5d580233f72a14862674c5d3e7a10a42e2d0351",
"0x8be0771aa3c46db990fcf44e5695cc68e0eaab17a27c2edd8ad133071b213d08",
"0x97c00d772b74e819d1ce3bd8f960ed146876c92a6832fe550af02ee1a5fcdb6e",
"0x252574a6c2b3d4c1256555c92b15bb319c65c281ec7182bb846556039aac9ae8",
"0x2c8c35d0884c1722087df8453554bb41c4dc0ccd2c733a4cb0ef96e82afdce29",
"0xed9bd6b0a0935fea6255c1165c3cd4f4a679e7682b2c1ddf56576a4ff4e2899d",
"0x15930523b35b7dcb5c3667235530f65c6dcb6e50be95a566bae3ab8462e09d6a",
"0xb496381c8bceed672708b285db8faaa4a88685c82cb3300aef2eec432ba5d510",
"0xaeb6db62dc87ee9c11b22dcb1f6e2edc8704614ca8339f46fd5ca93c9a6dfdef",
"0x51d2858b08f1fce5e913eb191bf00e892101b28cc052bc101fdd3b1431f33566",
"0x6e116778db7bea0bcc0ca8091ddd25d79e49380e8ae1db3f6c5d02a58108019b",
"0xc8bfa6406b64178e69982aa5b0469e3c673335d02b95c4e92e063b63f3c4822e",
"0x99dc14bb9eac3b98ec17c47dde323eca58c03995819fd77064e67c39fd4bd267",
"0xc1ead1e67df08872a479b65e113dfc2b526798fe6710498d23f85860f975f19d",
"0xd02d56db80e0f440b8a341070e9fdbf4367d4f00de0d20540fe0366ceb805c43",
"0x5e729e9b1c67af239a175145dd70231e27c803e74f41978e2c2a1c57bb44e01d",
"0x8278da9eee31e624a0a18d3fbda12a01212ec3b768efb17ed0104861d0685c8c",
"0x9fc130daf463021658a868f4e04ed7ead2f7eee4f7fdaf69f6d8e56e08fb52bc",
"0x65527a873087e8be55671750d2c747dc1fd6786097824cc7e6a38014d4cc7a40",
"0xa5e696a432c64bc1839ac343f4b421d480f86050f463a32bf6f4886c271b579a",
"0x59b5c415bbc0e63238a465b9f97d246a71a67265796568e15cad26bcecafd656",
"0x1dd2cd36fdf907adc8056ab2d95ea1271d750afda532e72b1e4934831acf4c9e",
"0x56003948c7d0b3ba9a2f2b750e59435f6c07931ba7b268e921f92641a99f1ea5",
"0x4aff1adfe1ca51079258e8af4459dec78140e41ea008ecbc4f6c0ee6da9c0379",
"0xf06bd8fe34e7ef3adcccc9ec96bb8a353375d46eaf4e5b96d75a81605f04abe2",
"0xf3e751999b43f851b5c03da4c204c516af1c48a427e918b1c06881f19df9e698",
"0xa3096446ca5a29ff568afd1054d37f9c1cee28ef5e285a73ab478dd4aa7166b1",
"0x481c53551e35f05d14e14449c0baa5595c482e36dc5f71cd1a6ac94027eb1d08",
"0x4604fbec1af30c8a30524ac648da5ad50d35a2cd2d7a74ae3d91a485c5f6c627",
"0x527dc65c0cefe3734029ed170d6a555729b83ae0934bb28230aad0c1b6f81579",
"0x7df2ef4eee8774415151f49c3f2936778f660f9086e389261fdb7838e6805e86",
"0xf7a6da82f8adba9187bc45cb1e23428c7c16cedd3b8313816baeee93784b3bd3",
"0xe69fec45b3b22ee02e540adea0a45dc05c0268e6ad6e9a6d180ca3a407eacc79",
"0x67052e1622bf5bd9227e63cd0fc3dcaf8db70012649d5676150121e73f17c314",
"0xc253d564634365b785ee7f83f28a9fa2f975e24063a2e6b8744631ffb7f47add",
"0xb0c858b95a5761e46aec676ec81ba4d84b76f4a77c968267e835905a035b1d79",
"0x8e400499cab14c1b3c172758ab8c1ae6130d986d4252bb5a08ff2d01ba9a5ca8",
"0x919fe24156e68e047e059048771ebdd7c521bdfaceeecabc00d2985eccf85f23",
"0xb848d66d8ef6611b5b8aed3c2b52514d122065ff823ae2791b8fb2a0da0012e6",
"0x4e2b2ac13f7d8fe7c3610d9f9ca72a2e8c3b087a30340dc602cda5dcb34ee1be",
"0x7fb678e57abe63f107a2f551f02119ea8f4818b33d24254e83a50ad31cd9e003",
"0xe20d018271635eda8809a6e33e212356145dd760e0396ca4c7c20b174e0903d1",
"0xbbd32616b6405ebf16a849c52466f44d1b6a75781144ca26bbd9a0a800ab579c",
"0x66e56cde1d5725159dc25161a7fdeae566286102197da75d3b2a0061c5e72e17",
"0xed78c34110a34a035c272d23177b1e89711aa6fe5d86bc310639e2be281cbbc8",
"0xdfd222650f64f50bcbdcbb0cde52f2f595e2bbc6c407f2331d6261710039a229",
"0xf417a3bac12e37cc34af45941d125364e967d733960dcf532f5884f0123cce8c",
"0x71bc627f16637e45f324d328ee77753405f386e6eb09d728751484b669bb39a3",
"0x8c1ddc7575b40e933bf78d79ffc5e7a1576f57d815188135c9b69f95cb7a07c2",
"0xcade8b3aa016d5c38fcd25e437efd7faa7c7b348ccc0f5739e432ea764c43934",
"0x0faeaac8367dfa7befe0d1fe8faa0dda63e52b2a3fd6c1949ad3cb573b65f812",
"0x788c80ff254701d0875226bf44d1979f0630d62e61e462af607030ff0d9b3368",
"0xe0e6e03423b59807bb8b13902fd122e9a54948a62ab1c7166d70b04827732b9f",
"0x9d719c9624361d38acbbfa953d138455aed6219988f4c0efb81943b9914aa667",
"0x110fe7e2bce9d595b165bfa4b1623b8d68aadc009dacffaa7f5b9b22e156429f",
"0x8584f37f802adfc366bc7e4495381a5118a1748cf7092263af6ae821639b375f",
"0x43ba36909165e888100e3bfa68c143608d2957e6e12e8e5a5afc505723f2681f",
"0xe3502faa04ecda52f9e2991e9b0a4bb12336568f8639b2d5df79302293ba0e80",
"0xcb5b16709d72464e9cf8006dee81c0a13134ba0fc7cff79a3c148c023906b46c",
"0x39042255a95890e5e25fe5b337ec6f67752a525c3f16c13c192278501d1cf98b",
"0x6acb1a8761b4dea3bbfb0ff36acbfd9691306760128021645ff996047956ce52",
"0x7d271348df01d06078731f840dae289c83ad9c62a053a6fc4c1604ac3761059a",
"0xfded75a4f5fc836ba1e7c361fd8c9859c8837c9378e85382ff9fd5ce68c35f6e",
"0x7be16ddbe3440ca448b35ef2096e5908df7c6fe5ebb947d36fb8b850296be6b0",
"0x231f208f3cd518ffb2fe8247839c85028e5f571294145568041d485cf890818a",
"0xfd6b89d1df0963e9f1e7cd20a04c8c64d4acf080068945d369c147818876661e",
"0xe6b04006a037628d7d5b92daae5a658f0609a67a1e3ab5ba192c4b1b89124fd2",
"0x64e4c31781178ad1cda0f4692fcb64f712fb2168662c62c329a5583e57b18108",
"0xa2d8b3ae5cd5426986f9b9c7efb7b310048a0a0d2f67334bdf7f624733f6c848",
"0xd561bf8889d91b742fdbe91568ff515ed00ee4b00f0c348b7ccbf886b77def48",
"0xc75f30604271aa0866c4bce63a36843ac97393eaaf049d1f298bbe5a222a7e84",
"0xe1311ecd05a64af66424105d836cd841f24109e95dac07c88bb64ee78c449200",
"0xdf9926e89a65d1bb3207adfd7b6db4a3244d97be45142fa06bb3e998dab0a86a",
"0xedeb275850750b783ec429af321dfc027e5d39dd803f4c9a5b203ddf953a1b27",
"0xee6148cfb49cf82a27d1dfcb14f80147f690e01f3d9a890616bf5dc1e607c046",
"0x3b69daf8b05fae34985bf38b252453dfea52213cb5bfecd90f6ca38a8e58fd1e",
"0x348b4cd39e5d417085e043f8a8025a3e68ccd6bfcbdbdcb90c66d70a28709494",
"0x9002d69e7e739b8f776ecff6d118435b900e505a7c16fca31f64ae71dce82986",
"0x29a96ec2a1293ba421682f5d1c74f83aec5d4a6f0fa3c1c394df14b9e235d974",
"0xda53cb82c0ad9c5c26ddb6562d8af102334477c2f7435bb53c8fc4e4a877b0a5",
"0x13b9d65a3a66d855a206f6f63312eaed4e405cc4ffeab4fe7263539360755b26",
"0x4a4cec2d543aea8d1418a1fecc9f0e1038457d753da7f450b7d3293c851ea512",
"0x35630db49b5997eedc830b7b47fe0428a95fdabd954e2c8af32a0a98309e0761",
"0x7f50e590df1675cd2385dd13c5f82cb0c8faba9690dd294b5ca90bafb6b588cb",
"0x2b6cc6065a1804cf831874955a03df8f106fe271ab60832c0f33c3b0ca94bcc0",
"0x258fe7a7fa5a2628512f9a1cf775ed428e5d333213584e40df40e4e1e4b53e99",
"0xd1b148d8d8212698f4f5f99c0b615fe3d1d0d81983149d87c0fadd3f308425e5",
"0xda4b8ef0abc842ddcdcf78fe71a9526120585fbff658bde79024c43fdbc86551",
"0xb446a4dec3b4f517a705e58d699ff5c07290648db07de60bb09e62877ab86584",
"0x33830123a250cd8638561396c1b840001e1e2b6d169ad0bb5bc59286547fef91",
"0xa1576028b9a8c08f4492bab43160fd3dbae34ce6be0de51ebfd2a6d2d6a38dc4",
"0x1d962eafcd83751feade5c58c63e76a56253602775521ab1a202006b391c4e89",
"0x86ead56e6284fa402779a9e4553664ec6ae0ec1803b850a614868b21ce8586d3",
"0xd4cb116199be898e4b56769751a9e85b8ab87818d259e916a9db1fc73ac06e0f",
"0x882652ae9949e0ac72673999486bcad68ff9baa2956c7372670e51c98cefc8af",
"0xf6e6ff41c774c0becd16b43ef716775181a925d274c31c768f74ad1c3a32b1ef",
"0xb09e6534374ef307453dc3f2a0602fe47a346c62f2d001f6697236d2f2e11a98",
"0x75597bbdfc11290134402983aa34f4b5af723ae2e4a825a4b5c0819db72ac240",
"0xb9110e79b2f2330cbe3b4535ea080c5ee1fa80403da4fea5ecb6084ecb6d277d",
"0x55ae4ff2123e5101cd3e4f4fdeed8545bf9c59397db8e8f9d8901e0a7e75ddeb",
"0x3238b14dff5a6eaab7fff9091fed04ab2789b1f368926d86035a82a140ae49c7",
"0x2514e5d19c4a00387e11dc98cef2763692da4a7f90342d2adb6f4802bb70ea2d",
"0xeb5643fe5d8e8fe13f285be6b76b1eac831c57fe46cb6fa7a59e239676676959",
"0x1f1ef022a02bd26891c039b75462be51fd13865c07a3c60dc98688bd45f4c543",
"0x668e62f2513afc51ccbb179aa126c14ab0317c2278702938337949da86e36417",
"0xe16db22afa2c8f38121d6e67250691e124474e4f7fbc8d3c6aa9b285ae7c92b3",
"0x8793a39fb3262ee2c50d11bf33a5604d9e0cc42b39375683ef6a6cd89ab5d5c1",
"0xd8b11d3391a1007d7aa716743c452e6eebcf4bd5695c1ed5533a071899cc543b",
"0x192b38f9be07ef6b42b5217376352c95769e5e07997b9d5baf51663581f232b3",
"0xec13d6b476922aa74a40f50eb782581ba47ec6327082df32473952de25c83d0c",
"0x5cc1c80c881738bc133377ea71be4b6802c99567247719a387cda27668d58778",
"0x34b7a9633cd49ad3a895f772ac73a8e715ce9c4f0fd5507356c8e3eaf33cb29b",
"0x46f1cdf66e60d898ae032f06bfe93f61b7cd69fd5a0eaccb9db620380339083b",
"0xfe6d2f1ba7e4ef4b294b41970fa68dbf900b4e85e58a9af27c4a42cfc30f1dbf",
"0x352f6b99a68daaf5dce5221592a142103b7cda46731ed187c3e1103b96e82dce",
"0x6e99833da7b5b8956d716cb9a2960a392eddfe06a0bc5d78fd564c86fb0ccb52",
"0xfff814a33bac8f75288186ef922ece3b606dcbbbf737c9c4e8a5f1f4b8aeb043",
"0x9e76a2096f56a74a8c7e7087e0fb800cab4c8cbef8f74561f084b744427a57b3",
"0x3ec126ac97179bc3b6b5c6e705e99add70c05fa0944d94cc7d03dea80cf99a22",
"0xd3bcc11fff5b05e8f68dcc7ce18fc859b4694ac6054274eba2d57b429bfd4684",
"0x2dcc7c43c813f86f5384bf873f80719ba130564fd762f79f997afb8b78400ddf",
"0x99dd99812eaf582974ea9dfaa34af648b8c9285f83739064ba5c1a27b15b3a9e",
"0x4dbf1bb339d6bd7aff3cc30cf88fbb1ad477ff86b03003c27c00d04daebe3b9e",
"0x965d253eddefce112690eda236fd4b3c0bc886cf1fbd8f7169baf01180db62f9",
"0x65b655141981bb0fd37f940a0e9cd4ec0da22dea05ea76a218b282c5c3bf6870",
"0x206ced27047c5943fcbe0a3e8aea8319eedfb74f9ef987e325e960c1e5de6c1b",
"0xafe29dce7d2d5fab4e25dbf8feb9e9140b7c9ec32e85998094b45bd567c501f7",
"0xdd9587a1ee2979c22d3c5f9c1f75197c6106fdef4edf96b6c031a145275c3411",
"0x92923394097069edace46aacc259122d57e839a88d8279164c060860c02b558f",
"0xf0bdf2797e8e26c50e72790b8e2eb9f021cdd28d9f787c5be91f9ae9aa7c4254",
"0x375b5ec9a57ec7e138d83d587557756c8a257c35826647d6fb8722483f6ad6ca",
"0x97565f3583e044d82b34538bc1ae4ae73b1438bd293353bcefd8074fc4d57d9a",
"0xccaf1047024f3879cc6c24be5f2f032bd66c811f3e31c43ed4e659cf615d5c22",
"0xe0feb551c2f9d3abb1aafcd39ad8f6e2cecadf58452c4cf618855829e51296f4",
"0x61b00166b1e2418340130739836b55e629e71121c03d951f216a5ffe790c0bb0",
"0x224940c2a88acd6c08d383f9266cd58cc30733778419a1eebb9b3f29c7d63ea5",
"0xf7ee4ced3c20f765bb217df4f9ed3acffeba11adcb3ce780cce4534f0d1f76fd",
"0x6ec6d073da3ba16c979d73d89a484805a61f89ae5aa7da63cb3b4142e672c37f",
"0xf13edccf3c2ba5b07e51aacaac79390d48407f172369fb3b5d0fae5b0362e81e",
"0x36bf725db4b4a913b9da3b9239cfed8cd8c2920b9f6fa225fd9e01cf50f7b015",
"0x313761a59054f3fcb6575d84dcaf36a0b2b98de4ec7c946c0e52d98390977396",
"0xfb2f6e111aca75e4a7eee5e45e9bd019242751208874f70f130631e6e70f652c",
"0x5f669e23137ce3b13c3370a2a9bb69d678c2d4832bf83e92f3d3fe4004e74f65",
"0x3e4e8e594981033e13bfd7c966806f29c488a8fd28b4d4c41762909cb1eed0c1",
"0x012223f48eb911be09c85d7c497383ed56198483a624fdb6fee2647bd225773d",
"0xff1873be4d0bd3b5f631b9838e690a359849b33f7f3fc1e19ccbb72c88756767",
"0xbd687d562bcb4ce7c97533750e6b960ce0c70e651cf4e48a86471d9c2d697bc9",
"0xadf6c679a8bad9a1debac26bc47ea20d85fd583d1ecb6686e04fa9e302f9115a",
"0xbaf772ae7b9297ca5506f5dcf2c38b8342d25cef39d38a3565b59b053f3bc3e9",
"0x75e82f9e9b1c1bf35165642cb5eaf663282e19a865b8ed357955da5357807040",
"0x1434b0eb9da6e3d6b303fb90ff53b1e9437a48c0a76a0c4b697e0cb35be1f2ce",
"0x9374a8ccb290ac7092baaa3015833b85162dd8a25f5bc9085bdb3cec74ab74cb",
"0x3f70a231bbe16e811656114d9f56e2f2189a8c09150c771671fde8dcc810349e",
"0xa35119becf58b88b1047cf99c6e1505fe95084b3a7bed9671086586af9f73492",
"0x80529edeba202929712f3cdce41d5e62e64b400be30367628c00755ff6b9d413",
"0xbc3760b47f838830baa4ffb46e2565e1d46b5ebc23b3b1edf6ec7c805f09c2b6",
"0x62a71459985ab84b9d41cdf869e3662fdd893cba3d0bb4a927153de686599a5f",
"0x5ef1e0728bf7beccf56ba47d4845bb46390cd3c6e93dcb2cca731606f95d1500",
"0x7779015d840f8a88c1d0cf67f92cf127d3c9794ff3dc054aaaf2a3e4b3c1aae4",
"0xa9080b382667b7441685f821da557df676a42816d09315675c7a006a72270a46",
"0xa47b186f5816a5e491f340f6ddbcaea411fdb2f18927434c453af3e516823600",
"0x7d8c351d6adbdd697adced72bf78d872cbe0863ac9ec8d2dba3a710586164cd0",
"0x405866bdea47ef0bea80299efade675f38d3d3fe7099ef81a72e38e1a3cb3986",
"0x4dfc49055b63fba170f839e40b4937db2d526e417b91663315e2b30d6f457659",
"0x305c768a219d7cb2680e318db51a56316b4cb5031ea3054881391223f14d0d68",
"0x068059d70253d4b9fa6c6b9aa5f1e630216dc86909d9d0ef85efebf035c7e117",
"0x8511119d6b7ad71610dc7f6885d629cbb5b29de798ccbab2d19c933c4b19cdc1",
"0x5c07b07624f978be768a9ee75c921008fe568b26fd72fcecac9bb86cafdcca2c",
"0x3fa37280dc8af0b49c5336a212d4ad0eade7c396aa819d1875843912d926d44d",
"0x927f2c496e370470948f98840189bd42e1069c19084d286d92b99e18657fce11",
"0x1e16eade51d54a2571949f47a60f3c8fac1fef64017f4aa89e352d59ebaed60c",
"0x4d192d0b3676f2318ce425322362039570bed3a631712c77b2a7ec83e533be56",
"0x772edb64509e35b4787a4a00b9744970af1611b5a99d54369d72285c1b8cebbc",
"0xf7e8a2805741e7026c16e5725abdbb79e41ae67d7e8244102fb9335825b7c121",
"0xcff6ba50d31a3517b6b8a90f369c1926487097ab1aa8f94db8b1825d732da641",
"0x32785079f4953cb089335c558734e7db5bc56ce9ff0fa6b3eeba5c17ccddf712",
"0xb1bf5ae4a4c4d15951737a8512907b55d6861b4469eb93f0126131f0e960db76",
"0xa1f6ad11014379152a2d9ce3cfcc9ccb78c7d368fc8d6fe6c7d3f0cd9b18d243",
"0x29acf19bbd78df2552e096d34865103b67bcb675e1f7637d7e3126ea81328383",
"0x5fa035769737cea3a671055117fcee6e49f87dbb91f405bd8e57917f40d43258",
"0x9376967d393c7f162b3137a8d5223eba30523efb840a77f9ffb3c54f6562cea0",
"0xeb906fcea9d31514f9a9ca677a1a5446c59f55b00988f31288be7b793d4d4a0d",
"0x28df5982f0ec1bab9f53634f84812fab8474ef1f1ea445bd5abcce7160654af3",
"0xe8db1f0c5c36b93e6a624faab49798068ad7048e0e119b85d2bc390a47ff86fe",
"0x035eed70ca4e86cfeb63724e4497097fb5732f9e35186499f32305e1cb62aaf7",
"0xce7e3d7445800b883a6afe66de6ef645ff64860ecca5138c0114efb0b98658c1",
"0x507d639abbbde60fe1a793cbb74b3390159177b7ed439382e1c6bb519b93ab4f",
"0x8165b07162d41891743b8dc66ae9e74b53eb0b2148ee0a279004ab4fede787b7",
"0xc591ba93abf2754767db7bb127c72be6acd719913c36ff7fa21bdbd05ec3c928",
"0x54f15e8785546f8a30e21ab3674d46a6e891f9bebead810b9f1366d5072fb538",
"0x61d3b6d1e22ec3ce39e01b3a2156bff745eb28f405450e7415b6aa75bc2165ae",
"0xa0710473b2f9c580c38ed05d49c3a70ec3d62b8da444bf60b025dc06865b7913",
"0xd7060eafb6ce0e0290392ff840b36014b279707c96eb8a6874d539c17417db77",
"0xe6cdcd01dbee6f9bebb2b8d6ecea9128adbaae36645e95402a3141f720c61607",
"0x7defe0a4cca43220d9e734eae2c391140146a1429893c4e22872b322097ce083",
"0x0889381511a1c287d44de2b97892bc42a7187f192a40130c02b64fe4ed307979",
"0x7b51f005bd2251f2505c166af288afce15c5daa7e579d84dec64da2611663213",
"0x78590863017925ae20ecd0ab3d894ee379eb6b317fd555762d690afb6c7571c9",
"0xe5364e7972dfd48a13d283faef5048eb5cbf9cefdacfca2f344bab62f553a3e9",
"0xce082eedc1cf0e59648767fb5e6111cd52c2384142bd0e64b53327eed71b9bda",
"0xb55bb94834fd25c07be869a595ecc8c7ca073bcd10a52736ae090b5333a7c01a",
"0xb7ba53ed094df02bbcaa3f5e14093050fd7ce3b5f56581da3ef39b20faa52ff6",
"0x14f91b36704989c461c3c91fdd387af8a0e5cb9de83564768d12a3161dfb6570",
"0xb783126d4aff67331c09a8c2dd67975e390c5e30d491f387eba3ab460d61e48f",
"0x1df18339d1cd450b00eef7c5ffc629ddde7ce7c66635d7e3f6173ba67c465f09",
"0xc3afbe9680722e1c6e6e2f1c4ca05578f5cc03ee471c3a874629500375772ce2",
"0xe0762a2f4dd50008f509b090512a9f3b61da31ca15e89565de1a20a5e82498c8",
"0xb40798c2bc2f2f1d4ca733cf725067d93b8a7ce79e825b0d8c3d75de4b7b75f2",
"0xbbed0630817e3be3756769ac03f8cc47773a89b4d108dfb0f7c8134426d311e8",
"0x363ecf42cce3b2f9fae5351a3b1720f7ebb103d98ab98e83d070169c92f6eacd",
"0x5e2cf0cec878c48132bdc509d673617bdb5c8700cdaf0079594e9f0a852638c0",
"0xa41f1ab43326da96742e3ea121302eb78d699f7dfe5819874502c49922d32547",
"0xc57973f78786bc0da7d145c24029ca002ad18c305a2cb4a797702c2b5935afc7",
"0xa5c244713fdf07819cf73ad4e39370df2f9bd16017bf949235f709253ce8196f",
"0x5a2330c7eefceec26683cec8c78b03b31ed8d487f5a5fbc56ed1a7d70f30b4bf",
"0x4ba6253ac69cd862741d80b6c8cfef6bfb371148dfec35d53b2fda83a1d8d032",
"0x4f508f16eaddfab93cd2c54237c88175593f430efa30de624658ba1c07f7beb0",
"0xc7dc55bfd18e467d6ffd1fab5fd848976541aa5a57b6c959dee421c6a4b7eca1",
"0x261269c42408993cc6c818784e86b6c717c4991aa762d3b0b8478116e3703003",
"0xee2b50c384ec0b8033b3ff955369a91421bf56567495336a428a5e50cb6b27e9",
"0x133644fa7416af0ff9fff35be0ca69cec4624be54b9e578c9498a25942c8b583",
"0x04a76a83d9175aaae387188e53004a97856f509afb1d7b46d894381e73994741",
"0xab10e84cbf8e2b02a2e9c5a8235a1a9df4517d4df3af1830ad50d225c4644721",
"0x2a0aa09df678f7b485b8a3d96e61b79bc0879cff33093410bb833a6ae8dcc9f3",
"0xa8eb8a0459295693d0024bcb8cf86bd0d829ac391694253c99b478a1325a4fac",
"0xa7d00c2f790abbee2aa9664f03814c8639538a8d3c897d573964a4a295b40fa2",
"0x9cb474bd11aeaad0b80dff8f86f053d3590b427a1a47976ae43be8620f1dcad7",
"0x3652c1b1014d272fcecfb5afd5f3cde1767a275054a009204ba41816741aee74",
"0x0b7f0b3f88b29597ce10c687133a97910a285ea3e9b9cc7f961482559c4db446",
"0x28e0f502a6feafa88d1f9839aa1ef05f885edf07b82c8a459c8be2dfe27011fe",
"0x3ed7c0a277f5c487db5ef55c873000051748845d33eccef3db934b4292eeface",
"0x9079da1da700f461597e4f986d0b4cde30873ddb400aaf087a827636f44a7ffd",
"0xfa44d95c7dcaaa534031536f3bfd7630776f1862a3585a6daa5e86e3dc5264b5",
"0x959dbcca720dfd5e920e618c28c663c925b589ae2bd82faab265b09e4cf6db08",
"0xbbe07491ee234bf9ecbb35560ad6e2d1a7ec8cb2690cd68b46cbad79538aba1f",
"0x589d7e261ca64bafa4d7f9cb101f5f3417ef71c501b5317e5162c3774291081b",
"0x5b97793b3b83b554beac60b2b6b3e22b6c257c81c32adeaf11f58cb70794bf5d",
"0xb37dc9e9418dc0178364af954fdb1a9395655955ff138fb0f66a81275ccfe0ed",
"0x704631d8f514805cf51530ba31f3c9f25d1bf8828a410cd89e4d31e98711f278",
"0x81ee7855bbd2ae8e1aefa5141efeaceff850b2223b8aae2fe65f2e2076d11b87",
"0x226370d2bb775c69f3432fdc1545c263311948acbee525e3848317cd9fc3da7d",
"0x4e6b200866b090eb2dc26259b7f8adabf57740fa0a73f73df0ada6d9f80d13ff",
"0xd164106da1db225979ad7f6fc9e11b40e5fb5ae345a818014d810e1a871b2b48",
"0x68087615488020a515970c41ef40392a4877e59f05d07444ec0b7f2467a099b3",
"0x21575bcaf329553469449cdf9d68faea0218728b09627a36ba8426bcf8115791",
"0x1e11dc27c4932814b0234bd17cff690aa0f9c8a258d57e11564484b4b17a3e0b",
"0xa8a409601f945aa2dcb36574966f6b8f1942f83d5110dab917d730016b3703aa",
"0x4eb77c78b2157e63b6ca0ddb36afcda138561ba409552529ab49ea9324e1796a",
"0xb66cd6e9e19f50d0346b5ca40410cf6d334dae9c41ab8fd5402c538c11a94a78",
"0x5069ac42df7f89261f4ba36452190e0ebe938ab46eb422090e9ef458f2fea8bc",
"0xf77faca1a86c25db5a348fc916b7f3724855b136b21eda7779b874459d6b7562",
"0x3fd875f36e535bbca2ba2f539d45b8e60487415a96d34846b110690cfb45fbff",
"0x2cf97dbc6bd70524c91ff72718b5ebc2b3ffb38b46a6430e9f16a1a8c3545271",
"0x0e4bd06ec123f3510d059c03439da7e19397473a2b144868b3fd70daccbc6e25",
"0x36d07bd92969b5465a70ea63ec814f18033990a941b38e76114e2173264505bd",
"0x7d8a17ff014fda45bf5c43a83316f53069214949be5eefa80b0fcb9c447573ac",
"0x70f8d99ac59af894e9f136a46e650ed1dcc022a7f23f7c7f7d3d899f0a934729",
"0xccdc7473316bf9faf3196c11f65eb560cc5be04988ed4aaeb2ae2fc7a76cd7cb",
"0xb95e9102f44161346459f9166695ad4d01b02cf827333bc04b73e9bfc76a6b4a",
"0xa0073174e023480efe99e1ee414a3a6fe7a4289a9146eafab77bc2a2f74ce041",
"0x71a170f1bd3eec872eb86ca28f5a07a16d34df621841c9a0327c5a4842d14cff",
"0xb46b6570cc7b9b9c6530f1395628201390559117744bb3ae3289a1329e2a9fe5",
"0x6612ab632dfb5fa48c92c28c1ebdc606d6456defa2cba07fee5c7637a9f0881e",
"0xbdc0d3c7bef21e95e10e012e8b3beb1d9d6afbf0f6d4431671c5e2c9d3d558d2",
"0x1317011bd4eded75c83e9a7a96e70556b3c056a996b90efc54cf983eb832234e",
"0xb63e87384e2b36fda06a1600031b9e8f76d8ab3ab2d1a50fdd24dbd0d7aba82c",
"0xc266ed0d55603ff6781b55b850d6b03fd2f0e96298b4cdfb5f05897a0fd2d143",
"0x3a6d30c03b37b50fee8cc592e39077f2577c1cca654fe65b30b8e6b7175d7c2a",
"0x6c1cfd1c1ba9c00cf25d42fc53fea15b3d436dc5b58f2cb3afeb8bb2a353a5c0",
"0x63d68be124625c2604e5297a5f8e655a6d44a43d0254f538d3f8e095c75c0e0a",
"0xcad240da9f6d07760ff04cb649dd5614d9ba8d1254734f2d99583cd24ec35d89",
"0x0ec939ec5cef73b863b964f3d7b852626d9d2428ce174fe998a45bf01aa8a203",
"0x9b526692a719f47c3c645818165283d9fcf0fe42e4dfbd780cd2628059278f14",
"0x1896c29de4883b1a6c91cb95db2dcdc0ff176b65ae1fd4bebc18afeda41eb425",
"0xb71cef6adb860bbde041254126bbaf54fd2a385f1870045c4b7986e22bfee34b",
"0x05c0644792c8d246675f4882045a2226aeec17443c8f796d63c84533c627b343",
"0xb3d2c5ed1089cc20ff4bb0882ac778417190dca446c7b83f5d58b194ecc55a66",
"0x723ef30c89606acf024be95e383372d42e07214de1d0040f386f268ec216df76",
"0x7dee5122c011954e14f6eb35957ead3b728e181331420b3919105f073d16bb05",
"0x0d10c86c88fbefe4f397db0e19ef7ffd5833d53ba90f4754987e89c13fb67d9a",
"0x5c744c979c84b49dcd4139c7c179910bb2150239979fb5a3b4a1053c6d398dbb",
"0xbe3c32d2059814004ec49e460dfe39cca8202877a8a83c8911f01c3ba234c921",
"0x8adfc2c122e2cf58b3c032981574255cf40b4559df4e62d49d550f04ed0553a0",
"0x80bf3ac9eaa6dc061e488a431c4cf08d4d042ea47453c44892ec50e966081065",
"0x817a4b2f3e63e983f6fc37476b1b1f467099a50a25f356738126479839c084dd",
"0x5dee0513b55736564262a7fc472ff671358d4fd66eeb9596ec170e054d954faf",
"0xce34b38ac7d48c0655885f7378948deed4f107f5fc4268608ca0a9850fd15085",
"0x6c95a9df5aaf661a2f32c96a25a091f66c38cb4b7479cbfd7a9a162dd4bc12ce",
"0xa63bfeca9998140d7aebc8d8603d6ebf91dec849445e454dc6539dcde35481f1",
"0xed514ea523571fd4eb31623e0da3dd8a41bdffc26ab4f8fdd90e2cd9324b1bf2",
"0x4037b9d183c4d81add87254e50219cf87c4cc94128535e50f2f04331b1baa3a6",
"0x1f009704b3245fd77ecdca0ad95322e6ada6f4075e1289108675caa5da480de3",
"0xab62a47d7ef09bb1f1e78289127d993aee91bfb76f95bb3264f6577df6d54684",
"0xc70538d7614ec964fea3227e60d9d46a5c6215c185d1d0db8e8c39763f50421c",
"0x2f294fdbc0f5a6407267d525fafd59211baf345e566db91717209349f655a31f",
"0xe867ce4a2df3e263044479d9c6f64a72a4d5b1f3426c54b9fb217451f81e6d6e",
"0x5a00548bb8369aaf20d16a63141a778346c70a37a3851eec1aac38c69c3c8c7f"
]
},
"nodes": [
@@ -3916,12 +4418,12 @@
"0x0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x85d9a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x85d9a0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -3929,12 +4431,12 @@
"0x0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x85d9a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x85d9a0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -3942,14 +4444,12 @@
"0x0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x85d9a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x85d9a0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -61,12 +61,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -74,12 +75,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -87,14 +89,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -49,12 +49,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -62,12 +63,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -75,14 +77,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -69,12 +69,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": 2000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"2000000": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -82,12 +83,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 2000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"2000000": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -95,14 +97,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 2000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"2000000": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"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": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0xC3500",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0xC3500": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -92,12 +93,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0xC3500",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0xC3500": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -105,14 +107,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0xC3500",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0xC3500": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -163,7 +163,12 @@
"eip658Transition": "0x42ae50",
"eip145Transition": "0x6f1580",
"eip1014Transition": "0x6f1580",
"eip1052Transition": "0x6f1580"
"eip1052Transition": "0x6f1580",
"eip1283Transition": "0x8a61c8",
"eip1706Transition": "0x8a61c8",
"eip1884Transition": "0x8a61c8",
"eip2028Transition": "0x8a61c8",
"eip1344Transition": "0x8a61c8"
},
"genesis": {
"seal": {
@@ -181,9 +186,9 @@
"stateRoot": "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544"
},
"hardcodedSync": {
"header": "f90212a0113ba3b1153987fc483b01ccfe9ecadbdc36a7b264be75d6486cb6b694cc38a1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479452bc44d5378309ee2abf1539bf71de1b7d7be3b5a0d91db5900e312a1ba8d39505406a95dc0ea20393b723c4bf488ade4e3c4ee4c3a05e63ab076852043b1c2fe010e2f14ab13dcc8e1c546ac497a24ce88c4abf3056a0b72e4a776f895459b6bf0937040990d868b1f45889aeaa26684e07472263fc31b90100b00200000063664554889124822ce2001022840543085d5810042382888542ca3816801780384384cd6851081cdc4d4b2b205a814b049198110a6869d60f4009a79c3854c9000581044889080000611c09142200106552000044027024004038092102814ed6c48040a8715851088a20108e80165f8c0c514019037a0000121304b2343416800b029000024404248238a06818414cb8690244879491855405026bc8250220520992c2380099d10024411c6048424083d1307822442d8444700405147883c4c041300aaa2408bb61084012983825a22830040a180106b5e27182088060b111515832902903a8f1d432a48004d0250437106a503491000048a91587067a897789f4d78371d801837a309c8379ffd7845c9d879e9150505945206e616e6f706f6f6c2e6f7267a0db22736cb3f06f9c86804902731fa6841eaaa1cd6326ea2a30e9c304d48bdd04880323b06837344cb8",
"totalDifficulty": "9633968582330911261986",
"CHTs": [
"header": "f90215a0ec6330e9082f796d1d40cd146f1c504efc5823b486633f81a9f8ee31e799d41aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ea674fdde714fd979de3edf0f56aa9716b898ec8a0d815854242c0f817a92beff41d66fc19dbfb2e4769762da7a2d4e49a9cf831c2a0e7e0ffc7d9a8ab82a7713cbf850628bf9a5227d80b0fe75d10b682be74bd90b9a0933423cb40b87bbcc53383c7d0a24d2ce5e8de99f2ba9213e51b4bb86b2fbb27b901008a0200250d21200aa00806e32495058b8880962440b0005dc4900000fc63451012c084c8c6224a0234ded20e96099533b08856aa0288a3bd00666137612c5680400000c4ec3ec5118ca2fa5c40804026c782e0188e4602502500c34460101adb47400d1b52c6884995204ac402d0bc10df7c1929827a9880b4a4051190406049368a1387c24c840a90b6c2b4e48e003e28459dc479c00042184824b2b8780308f3a660d05438a115a68804a16b209101020c0d9046812b61bc8004871b04402b1d904406114120beb0ea108a1cafe6983d9010c984882d2424301200000a78e0b03074ead02004044702412122423cbd2c5a4020ca9ca041998158050838033d8708cce2eaf2fd8b838640018397cc4d83979c13845db0992894505059452d65746865726d696e652d6575312d32a033a7c1a79360234b45773d79bb2d017ccf33414e59502691c87fea0a3ec26163880e5c7838013df6da",
"totalDifficulty": "12517645144159165893352",
"CHTs": [
"0x0eb474b7721727204978e92e27d31cddff56471911e424a4c8271c35f9c982cc",
"0xe10e94515fb5ffb7ffa9bf50db4a959b3f50c2ff75e0b8bd5f5e038749e52a11",
"0x816e7463af7b5d2fcb804ba55f09e8452182b0ba6c995a34e144245d76333d55",
@@ -3826,7 +3831,660 @@
"0x64b862e2d5a6c24d569f3352b8524ebfecfd5a3205a3200ec78df72d79a66838",
"0x6da8edf169a9c78307258a723c1ac1d96db20a7131018efad16f0606683c0f07",
"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": [
@@ -3920,12 +4578,13 @@
"0x0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x42ae50",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x42ae50": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x8a61c8": {
"info": "EIP 1108 transition at block 9_069_000 (0x8a61c8)",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -3933,12 +4592,13 @@
"0x0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x42ae50",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x42ae50": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x8a61c8": {
"info": "EIP 1108 transition at block 9_069_000 (0x8a61c8)",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -3946,14 +4606,24 @@
"0x0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x42ae50",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x42ae50": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x8a61c8": {
"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
}
}
}

View File

@@ -26,6 +26,11 @@
"eip1052Transition": "0x0",
"eip1283Transition": "0x0",
"eip1283DisableTransition": "0x0",
"eip1283ReenableTransition": "0x17d433",
"eip1344Transition": "0x17d433",
"eip1706Transition": "0x17d433",
"eip1884Transition": "0x17d433",
"eip2028Transition": "0x17d433",
"gasLimitBoundDivisor": "0x400",
"maxCodeSize": "0x6000",
"maxCodeSizeTransition": "0x0",
@@ -125,12 +130,13 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x17d433": {
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -139,12 +145,13 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x17d433": {
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -153,20 +160,28 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x00",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x17d433": {
"info": "EIP 1108 transition at block 1_561_651 (0x17d433)",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}
},
"0x0000000000000000000000000000000000000009": {
"balance": "0x1"
"balance": "0x1",
"builtin": {
"name": "blake2_f",
"activate_at": "0x17d433",
"pricing": {
"blake2_f": {
"gas_per_round": 1
}
}
}
},
"0x000000000000000000000000000000000000000a": {
"balance": "0x1"

View File

@@ -0,0 +1,121 @@
{
"name": "Istanbul (test)",
"engine": {
"Ethash": {
"params": {
"minimumDifficulty": "0x020000",
"difficultyBoundDivisor": "0x0800",
"durationLimit": "0x0d",
"blockReward": "0x1BC16D674EC80000",
"homesteadTransition": "0x0",
"eip100bTransition": "0x0",
"difficultyBombDelays": {
"0": 5000000
}
}
}
},
"params": {
"gasLimitBoundDivisor": "0x0400",
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
"accountStartNonce": "0x00",
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID" : "0x1",
"maxCodeSize": 24576,
"maxCodeSizeTransition": "0x0",
"eip150Transition": "0x0",
"eip160Transition": "0x0",
"eip161abcTransition": "0x0",
"eip161dTransition": "0x0",
"eip140Transition": "0x0",
"eip211Transition": "0x0",
"eip214Transition": "0x0",
"eip155Transition": "0x0",
"eip658Transition": "0x0",
"eip145Transition": "0x0",
"eip1014Transition": "0x0",
"eip1052Transition": "0x0",
"eip1283Transition": "0x0",
"eip1283DisableTransition": "0x0",
"eip1283ReenableTransition": "0x0",
"eip1344Transition": "0x0",
"eip1706Transition": "0x0",
"eip1884Transition": "0x0",
"eip2028Transition": "0x0"
},
"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 } } } },
"0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } },
"0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } },
"0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
"0000000000000000000000000000000000000005": { "builtin": { "name": "modexp", "activate_at": "0x00", "pricing": { "modexp": { "divisor": 20 } } } },
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"pricing": {
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
},
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"pricing": {
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
},
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"pricing": {
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}
},
"0000000000000000000000000000000000000009": {
"builtin": {
"name": "blake2_f",
"activate_at": "0x00",
"pricing": {
"blake2_f": {
"gas_per_round": 1
}
}
}
}
}
}

View File

@@ -13,6 +13,7 @@
"accountStartNonce": "0x0",
"chainID": "0x6",
"eip140Transition": "0xaef49",
"eip145Transition": "0x1a064d",
"eip150Transition": "0x0",
"eip155Transition": "0x0",
"eip160Transition": "0x0",
@@ -21,6 +22,8 @@
"eip211Transition": "0xaef49",
"eip214Transition": "0xaef49",
"eip658Transition": "0xaef49",
"eip1014Transition": "0x1a064d",
"eip1052Transition": "0x1a064d",
"gasLimitBoundDivisor": "0x400",
"maxCodeSize": "0x6000",
"maxCodeSizeTransition": "0xaef49",
@@ -116,12 +119,13 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0xaef49",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0xaef49": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -130,12 +134,13 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0xaef49",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0xaef49": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -144,14 +149,13 @@
"balance": "0x1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0xaef49",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0xaef49": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -63,12 +63,13 @@
"0x0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": 5067000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"5067000": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -76,12 +77,13 @@
"0x0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 5067000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"5067000": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -89,14 +91,13 @@
"0x0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 5067000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"5067000": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -123,12 +123,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at":"0x7fffffffffffff",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -136,12 +137,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at":"0x7fffffffffffff",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x7fffffffffffff": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -149,14 +151,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at":"0x7fffffffffffff",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x7fffffffffffff": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -48,13 +48,23 @@
},
"nodes": [
"enode://aeb6070deb50efeb41c5e4283a6a3b08ff701fef90e3522161c145f30df2852af3dfc51ba74591f7c9d96b11ca4c3c2b354bf58dd243f2d877f6eecc2373fd1d@139.162.15.124:30313",
"enode://cb4b0568607c97a3af4857700152fad9c79908a89319310268c7f49184e3f7e0c88c8d3504696f521c8aafcd00644f9325f76cba9427181b1493ff7ce230df00@139.162.15.124:30303",
"enode://e0c926dcdc5c1cf58b2ecba371c577c28c28c91f9b210093178a812389b65e5b53f0e478753b94fceb0b36645b779a915ca57c0c48507fe4d7f786508653656c@74.207.240.177:30313",
"enode://37fe8c0f8d667f110316de3109dcc2e9c9247219998e9ac395db39511bef697f9646f73d86a43da491efce35458f53ac3ac0994b85f7086bbf244809d4e7eb7f@74.207.240.177:30303",
"enode://a2a2adb8c12b9b189306050013a44f28db30f92fb3670db9675a049b98b96eb18901d6ff7b961b6e96cfa3923ac29e8f647ef452f0a23ddfef3903ac1cf826af@173.255.195.214:30313",
"enode://ed6fea8e7389bb75ff34846e4aaefa9157c9c79828c6404f4a0ab6b997a613f777aecaed5092c3f51abdf918926c925f7ee4f4cffdb0ac37775d03070a3d6b55@173.255.195.214:30303",
"enode://5460fd1ad217941befd0f8d060e6729a0535a0738770aba56827d1313c09aeb68e3098d458aace59faba2c6780b8c9c30cb140b80cd8e30ca3a074ce6d3344d3@50.116.38.52:30313",
"enode://9109e01dec60b67afa5aea77da17e0cb9a716a547469be378eb122c545a3fda9082e553624ff9e673195a715d5628ebf046a6c4ff315e566420e3bdde003bd9a@50.116.38.52:30303",
"enode://99fff4ed887d6a6a7b6e03a657c35c06d0eede1909ec289a362bad9d37dd4085886461bbce83aa484ce1327badb3c5958365caa851d71de49dc4530e075b64bc@45.79.128.151:30313",
"enode://4b4c06445175b77ac07eba03ac624f72e4e86065ee8bbdbca5f882a2a333e2608e6ef2ae5b5779816abd8d07ae6ec08f75888edeab3bc06f2b75871feb14afef@45.79.128.151:30303",
"enode://fd80e04c75559cfdd9ed8c08ef2c39c5bc95021f7cbaf31acb601914bc7dac7c34b470b90a05e519bc8a8435a46e1ce51053ae07fac31a83567285c34a79c6bf@139.162.224.203:30313",
"enode://d2e678247450c0a7aefdcf03787d4905deda2a6889f02071b241a1309a6bec6ea1c8b1160f69635dee0b4e00cc83656a601b4528cccbd85744b811654ab24b13@139.162.224.203:30303",
"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": {
"0000000000000000000000000000000000000001": { "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } },
@@ -65,12 +75,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": 3000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"3000000": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -78,12 +89,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 3000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"3000000": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -91,14 +103,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 3000000,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"3000000": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -37,7 +37,10 @@
"eip140Transition": "0x4829ba",
"eip211Transition": "0x4829ba",
"eip214Transition": "0x4829ba",
"eip658Transition": "0x4829ba"
"eip658Transition": "0x4829ba",
"eip145Transition": "0x4c4cbd",
"eip1014Transition": "0x4c4cbd",
"eip1052Transition": "0x4c4cbd"
},
"genesis": {
"seal": {
@@ -75,7 +78,7 @@
"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 } } } },
"0x0000000000000000000000000000000000000005": {
"0000000000000000000000000000000000000005": {
"builtin": {
"name": "modexp",
"activate_at": "0x4829ba",
@@ -86,43 +89,44 @@
}
}
},
"0x0000000000000000000000000000000000000006": {
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x4829ba",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x4829ba": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
},
"0x0000000000000000000000000000000000000007": {
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x4829ba",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x4829ba": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
},
"0x0000000000000000000000000000000000000008": {
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x4829ba",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x4829ba": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"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": {
"builtin": {
"name": "alt_bn128_add",
"activate_at":"0x21e88e",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x21e88e": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -144,12 +145,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at":"0x21e88e",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x21e88e": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -157,14 +159,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at":"0x21e88e",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x21e88e": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -26,6 +26,11 @@
"eip1052Transition": "0x37db77",
"eip1283Transition": "0x37db77",
"eip1283DisableTransition": "0x41efd2",
"eip1283ReenableTransition": "0x52efd1",
"eip1344Transition": "0x52efd1",
"eip1706Transition": "0x52efd1",
"eip1884Transition": "0x52efd1",
"eip2028Transition": "0x52efd1",
"gasLimitBoundDivisor": "0x400",
"maxCodeSize": "0x6000",
"maxCodeSizeTransition": "0x0",
@@ -117,48 +122,61 @@
}
},
"0x0000000000000000000000000000000000000006": {
"balance": "0x1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0xfcc25",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0xfcc25": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x52efd1": {
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
},
"0x0000000000000000000000000000000000000007": {
"balance": "0x1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0xfcc25",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0xfcc25": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x52efd1": {
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
},
"0x0000000000000000000000000000000000000008": {
"balance": "0x1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0xfcc25",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0xfcc25": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x52efd1": {
"info": "EIP 1108 transition at block 5_435_345 (0x52efd1)",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}
},
"0x0000000000000000000000000000000000000009": {
"balance": "0x1"
"balance": "0x1",
"builtin": {
"name": "blake2_f",
"activate_at": "0x52efd1",
"pricing": {
"blake2_f": {
"gas_per_round": 1
}
}
}
},
"0x000000000000000000000000000000000000000a": {
"balance": "0x1"

View File

@@ -28,8 +28,8 @@
"maximumExtraDataSize": "0x20",
"minGasLimit": "0x1388",
"networkID": "0x3",
"forkBlock": "0x40E80F",
"forkCanonHash": "0x3e12d5c0f8d63fbc5831cc7f7273bd824fa4d0a9a4102d65d99a7ea5604abc00",
"forkBlock": "0x62f757",
"forkCanonHash": "0x3a024a13310ec9b4805f681b17c3ae6c94167d1c6494e83d70a887ebc27df5ea",
"maxCodeSize": "0x6000",
"maxCodeSizeTransition": "0xa",
"eip150Transition": "0x0",
@@ -45,7 +45,12 @@
"eip1014Transition": "0x408b70",
"eip1052Transition": "0x408b70",
"eip1283Transition": "0x408b70",
"eip1283DisableTransition": "0x4b5e82"
"eip1283DisableTransition": "0x4b5e82",
"eip1283ReenableTransition": "0x62f756",
"eip1344Transition": "0x62f756",
"eip1706Transition": "0x62f756",
"eip1884Transition": "0x62f756",
"eip2028Transition": "0x62f756"
},
"genesis": {
"seal": {
@@ -62,8 +67,8 @@
"gasLimit": "0x1000000"
},
"hardcodedSync": {
"header": "f9021aa0a8da98b6ef1e12b6c49e85b0e965f1ed1688f5e3605f06bb3c6ce4f857aa0bc6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794635b4764d1939dfacd3a8014726159abc277becca0d03c319fe68a91e22fb3b945a8dfc73b817976e29cf57e6c8425e6a02e9bf034a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000849fe1546f8350d001837a121d80845c9d55f29fde8302020b8f5061726974792d457468657265756d86312e33322e30826c69a04bf72e97bcf64717bfd655e2bca9ed1a5253cce5373268729161b1786ca4710488db3c50627f9321c4",
"totalDifficulty": "18787961645682286",
"header": "f90219a081352ab3cd380f66493aa270deeb239af085e68a83579dd8871a0b0a7c7fd4e2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794295856bcf02b2017607e4f61cfc1573fd05d511fa0a886a42f9a2733e392a5f9459f70bb133e5012f059d6cb6aeb360a7bb766571ea01ffc81fa17e357d368e82f1a658c8b129877818e34fdad26e32fa60ac4b12fc7a0946e845a5b468d8c679890632ab9fdff3349b307ce864c7b13195e4f80af4777b90100000000000000008c00021100000000000000000000010000400000000280000000000000000000000000008201000000010000010408010002010000000000002000010102080000008000080000000400000020100010000000200000200000000000000000000010080000000000008000000000080800000080100210000000080201006008210002000002004000000004a0000010800000000820c00010100000000000880000000800080000000020000000000000000100020000002000008002000200100000000000880840000000000242000000020100408800000202000000200000000000000000000200000008000001000000520080000000850340be271083653001837a12008344ded9845db0acc49ad983010906846765746889676f312e31312e3133856c696e7578a0a23e3a33f308378c4cb1eb9b34b40c224844aae072c0eba928a840f6d6ca69a28892892d000574e452",
"totalDifficulty": "26251713144679901",
"CHTs": [
"0x614648fc0a459451850bdfe353a932b5ff824e1b568478394f78b3ed5427e37a",
"0x1eae561c582dbb7f4e041998e084e165d0332c915d3a6da367638a8d24f3fafc",
@@ -2650,7 +2655,659 @@
"0xebb3e8f76f3b6a95285154dc11d4bd94ac4c3a150383ed69f5373499b1983dc3",
"0xb0919ed300acac5f912f01611a428861db27ffb8129a80495f735f0ac608ab35",
"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": [
@@ -2734,12 +3391,13 @@
"nonce": "0x0",
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x19f0a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0x19f0a0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x62f756": {
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -2749,12 +3407,13 @@
"nonce": "0x0",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x19f0a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0x19f0a0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x62f756": {
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -2764,20 +3423,28 @@
"nonce": "0x0",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x19f0a0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0x19f0a0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x62f756": {
"info": "EIP 1108 transition at block 6_485_846 (0x62f756)",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}
},
"0x0000000000000000000000000000000000000009": {
"balance": "0x1"
"balance": "0x1",
"builtin": {
"name": "blake2_f",
"activate_at": "0x62f756",
"pricing": {
"blake2_f": {
"gas_per_round": 1
}
}
}
},
"0x000000000000000000000000000000000000000a": {
"balance": "0x0"

View File

@@ -36,6 +36,7 @@
"eip145Transition": "0x0",
"eip1014Transition": "0x0",
"eip1052Transition": "0x0",
"eip1283Transition": "0x0",
"eip1283DisableTransition": "0x0"
},
"genesis": {
@@ -61,12 +62,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -74,12 +76,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -87,14 +90,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "0x0",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -1,4 +1,57 @@
{
"block": [],
"state": []
"block": [
{
"reference": "Issue https://github.com/paritytech/parity-ethereum/issues/11073 (also see https://github.com/paritytech/parity-ethereum/pull/10923)",
"failing": "stRevertTest",
"subtests": [
"RevertPrecompiledTouch_d0g0v0_Byzantium",
"RevertPrecompiledTouch_d0g0v0_Constantinople",
"RevertPrecompiledTouch_d0g0v0_ConstantinopleFix",
"RevertPrecompiledTouch_d0g0v0_EIP158",
"RevertPrecompiledTouch_d3g0v0_ConstantinopleFix",
"RevertPrecompiledTouchCC_d0g0v0_Byzantium",
"RevertPrecompiledTouchCC_d0g0v0_Constantinople",
"RevertPrecompiledTouchCC_d0g0v0_EIP158",
"RevertPrecompiledTouchDC_d0g0v0_Byzantium",
"RevertPrecompiledTouchDC_d0g0v0_Constantinople",
"RevertPrecompiledTouchDC_d0g0v0_EIP158",
"RevertPrecompiledTouchExactOOG_d7g1v0_ConstantinopleFix",
"RevertPrecompiledTouchExactOOG_d31g1v0_ConstantinopleFix",
"RevertPrecompiledTouch_storage_d3g0v0_ConstantinopleFix",
"RevertPrecompiledTouch_storage_d0g0v0_ConstantinopleFix"
]
}
],
"state": [
{
"reference": "Issue https://github.com/paritytech/parity-ethereum/issues/11078 (also see https://github.com/paritytech/parity-ethereum/pull/10923)",
"failing": "stRevertTest",
"subtests": {
"RevertPrecompiledTouch_storage": {
"subnumbers": ["1", "2"],
"chain": "St. Peter's (test)"
}
}
},
{
"reference": "Issue https://github.com/paritytech/parity-ethereum/issues/11079 (also see https://github.com/paritytech/parity-ethereum/pull/10923)",
"failing": "stRevertTest",
"subtests": {
"RevertPrecompiledTouchExactOOG": {
"subnumbers": ["61", "64"],
"chain": "St. Peter's (test)"
}
}
},
{
"reference": "Issue https://github.com/paritytech/parity-ethereum/issues/11080 (also see https://github.com/paritytech/parity-ethereum/pull/10923)",
"failing": "stRevertTest",
"subtests": {
"RevertPrecompiledTouch": {
"subnumbers": ["1", "2"],
"chain": "St. Peter's (test)"
}
}
}
]
}

View File

@@ -60,12 +60,13 @@
"0000000000000000000000000000000000000006": {
"builtin": {
"name": "alt_bn128_add",
"activate_at": "5",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"5": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -73,12 +74,13 @@
"0000000000000000000000000000000000000007": {
"builtin": {
"name": "alt_bn128_mul",
"activate_at": "5",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"5": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -86,14 +88,13 @@
"0000000000000000000000000000000000000008": {
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": "5",
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"5": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"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

@@ -50,12 +50,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -64,12 +65,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -78,14 +80,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_pairing": { "base": 45000, "pair": 34000 }}
}
}
}

View File

@@ -40,12 +40,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_add",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 500,
"eip1108_transition_price": 150
"0": {
"price": { "alt_bn128_const_operations": { "price": 500 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 150 }}
}
}
}
@@ -54,12 +55,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_mul",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_const_operations": {
"price": 40000,
"eip1108_transition_price": 6000
"0": {
"price": { "alt_bn128_const_operations": { "price": 40000 }}
},
"0x7fffffffffffff": {
"info": "EIP 1108 transition",
"price": { "alt_bn128_const_operations": { "price": 6000 }}
}
}
}
@@ -68,14 +70,13 @@
"balance": "1",
"builtin": {
"name": "alt_bn128_pairing",
"activate_at": 0,
"eip1108_transition": "0x7fffffffffffff",
"pricing": {
"alt_bn128_pairing": {
"base": 100000,
"pair": 80000,
"eip1108_transition_base": 45000,
"eip1108_transition_pair": 34000
"0": {
"price": { "alt_bn128_pairing": { "base": 100000, "pair": 80000 }}
},
"0x7fffffffffffff": {
"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

@@ -20,4 +20,4 @@ trace-time = "0.1"
ethcore-db = { path = "../db" }
ethcore = { path = "..", features = ["test-helpers"] }
tempdir = "0.3"
kvdb-rocksdb = "0.1.3"
kvdb-rocksdb = "0.1.5"

View File

@@ -250,14 +250,12 @@ impl IoHandler<ClientIoMessage> for ClientIoHandler {
ClientIoMessage::TakeSnapshot(num) => {
let client = self.client.clone();
let snapshot = self.snapshot.clone();
let res = thread::Builder::new().name("Periodic Snapshot".into()).spawn(move || {
if let Err(e) = snapshot.take_snapshot(&*client, num) {
match e {
EthcoreError::Snapshot(SnapshotError::SnapshotAborted) => info!("Snapshot aborted"),
_ => warn!("Failed to take snapshot at block #{}: {}", num, e),
}
}
});

View File

@@ -15,77 +15,99 @@
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
use std::cmp;
use std::collections::{HashSet, BTreeMap, VecDeque};
use std::sync::atomic::{AtomicUsize, AtomicBool, Ordering as AtomicOrdering};
use std::collections::{BTreeMap, HashSet, VecDeque};
use std::convert::TryFrom;
use std::io::{BufRead, BufReader};
use std::str::from_utf8;
use std::sync::{Arc, Weak};
use std::time::{Instant, Duration};
use std::sync::atomic::{AtomicBool, AtomicI64, Ordering as AtomicOrdering, Ordering, AtomicU64};
use std::time::{Duration, Instant};
use blockchain::{BlockReceipts, BlockChain, BlockChainDB, BlockProvider, TreeRoute, ImportRoute, TransactionAddress, ExtrasInsert, BlockNumberKey};
use ansi_term::Colour;
use bytes::Bytes;
use call_contract::{CallContract, RegistryInfo};
use ethcore_miner::pool::VerifiedTransaction;
use ethereum_types::{H256, H264, Address, U256};
use evm::Schedule;
use bytes::ToPretty;
use ethereum_types::{Address, H256, H264, U256};
use hash::keccak;
use io::IoChannel;
use hash_db::EMPTY_PREFIX;
use itertools::Itertools;
use journaldb;
use kvdb::{DBValue, KeyValueDB, DBTransaction};
use kvdb::{DBTransaction, DBValue, KeyValueDB};
use parking_lot::{Mutex, RwLock};
use rand::rngs::OsRng;
use types::transaction::{self, LocalizedTransaction, UnverifiedTransaction, SignedTransaction, Action};
use trie::{TrieSpec, TrieFactory, Trie};
use types::ancestry_action::AncestryAction;
use types::encoded;
use types::filter::Filter;
use types::log_entry::LocalizedLogEntry;
use types::receipt::{Receipt, LocalizedReceipt};
use types::{BlockNumber, header::{Header, ExtendedHeader}};
use vm::{EnvInfo, LastHashes};
use hash_db::EMPTY_PREFIX;
use block::{LockedBlock, Drain, ClosedBlock, OpenBlock, enact_verified, SealedBlock};
use client::ancient_import::AncientVerifier;
use rlp::PayloadInfo;
use rustc_hex::FromHex;
use trie::{Trie, TrieFactory, TrieSpec};
use block::{ClosedBlock, Drain, enact_verified, LockedBlock, OpenBlock, SealedBlock};
use blockchain::{
BlockChain,
BlockChainDB,
BlockNumberKey,
BlockProvider,
BlockReceipts,
ExtrasInsert,
ImportRoute,
TransactionAddress,
TreeRoute
};
use call_contract::{CallContract, RegistryInfo};
use client::bad_blocks;
use client::{
Nonce, Balance, ChainInfo, BlockInfo, TransactionInfo,
ReopenBlock, PrepareOpenBlock, ScheduleInfo, ImportSealedBlock,
BroadcastProposalBlock, ImportBlock, StateOrBlock, StateInfo, StateClient, Call,
AccountData, BlockChain as BlockChainTrait, BlockProducer, SealedBlockImporter,
ClientIoMessage, BlockChainReset
ClientIoMessage, BlockChainReset, ImportExportBlocks, ForceUpdateSealing
};
use client::{
BlockId, TransactionId, UncleId, TraceId, ClientConfig, BlockChainClient,
TraceFilter, CallAnalytics, Mode,
ChainNotify, NewBlocks, ChainRoute, PruningInfo, ProvingBlockChainClient, EngineInfo, ChainMessageType,
IoClient, BadBlocks,
IoClient, BadBlocks
};
use client::bad_blocks;
use client::ancient_import::AncientVerifier;
use db::{keys::BlockDetails, Readable, Writable};
use engines::{MAX_UNCLE_AGE, Engine, EpochTransition, ForkChoice, EngineError, SealingState};
use engines::epoch::PendingTransition;
use error::{
ImportError, ExecutionError, CallError, BlockError,
QueueError, Error as EthcoreError, EthcoreResult,
QueueError, Error as EthcoreError, EthcoreResult
};
use ethcore_miner::pool::VerifiedTransaction;
use evm::Schedule;
use executive::{Executive, Executed, TransactOptions, contract_address};
use factory::{Factories, VmFactory};
use io::IoChannel;
use journaldb;
use miner::{Miner, MinerService};
use snapshot::{self, io as snapshot_io, SnapshotClient};
use snapshot::{self, io as snapshot_io, SnapshotClient, Error as SnapshotError, Progress};
use snapshot::io::SnapshotWriter;
use spec::Spec;
use state::{self, State};
use state_db::StateDB;
use trace::{self, TraceDB, ImportRequest as TraceImportRequest, LocalizedTrace, Database as TraceDatabase};
use trace::{self, Database as TraceDatabase, ImportRequest as TraceImportRequest, LocalizedTrace, TraceDB};
use transaction_ext::Transaction;
use verification::queue::kind::BlockLike;
use verification::queue::kind::blocks::Unverified;
use verification::{PreverifiedBlock, Verifier, BlockQueue};
use types::{
ancestry_action::AncestryAction,
BlockNumber,
encoded,
data_format::DataFormat,
filter::Filter,
header::{Header, ExtendedHeader},
log_entry::LocalizedLogEntry,
receipt::{LocalizedReceipt, Receipt},
transaction::{self, Action, LocalizedTransaction, SignedTransaction, UnverifiedTransaction},
};
use verification;
use ansi_term::Colour;
use verification::{BlockQueue, Verifier, PreverifiedBlock};
use verification::queue::kind::blocks::Unverified;
use verification::queue::kind::BlockLike;
use vm::{CreateContractAddress, EnvInfo, LastHashes};
// re-export
pub use types::blockchain_info::BlockChainInfo;
pub use types::block_status::BlockStatus;
pub use blockchain::CacheSize as BlockChainCacheSize;
pub use verification::QueueInfo as BlockQueueInfo;
use db::{Writable, Readable, keys::BlockDetails};
use_contract!(registry, "res/contracts/registrar.json");
@@ -194,6 +216,9 @@ pub struct Client {
/// Database pruning strategy to use for StateDB
pruning: journaldb::Algorithm,
/// Don't prune the state we're currently snapshotting
snapshotting_at: AtomicU64,
/// Client uses this to store blocks, traces, etc.
db: RwLock<Arc<dyn BlockChainDB>>,
@@ -773,6 +798,7 @@ impl Client {
tracedb,
engine,
pruning: config.pruning.clone(),
snapshotting_at: AtomicU64::new(0),
db: RwLock::new(db.clone()),
state_db: RwLock::new(state_db),
report: RwLock::new(Default::default()),
@@ -957,31 +983,47 @@ impl Client {
}
// prune ancient states until below the memory limit or only the minimum amount remain.
fn prune_ancient(&self, mut state_db: StateDB, chain: &BlockChain) -> Result<(), ::error::Error> {
let number = match state_db.journal_db().latest_era() {
fn prune_ancient(&self, mut state_db: StateDB, chain: &BlockChain) -> Result<(), EthcoreError> {
if !state_db.journal_db().is_pruned() {
return Ok(())
}
let latest_era = match state_db.journal_db().latest_era() {
Some(n) => n,
None => return Ok(()),
};
// prune all ancient eras until we're below the memory target,
// but have at least the minimum number of states.
// Prune all ancient eras until we're below the memory target (default: 32Mb),
// but have at least the minimum number of states, i.e. `history`.
// If a snapshot is under way, no pruning happens and memory consumption is allowed to
// increase above the memory target until the snapshot has finished.
loop {
let needs_pruning = state_db.journal_db().is_pruned() &&
state_db.journal_db().journal_size() >= self.config.history_mem;
if !needs_pruning { break }
match state_db.journal_db().earliest_era() {
Some(era) if era + self.history <= number => {
trace!(target: "client", "Pruning state for ancient era {}", era);
match chain.block_hash(era) {
Some(earliest_era) if earliest_era + self.history <= latest_era => {
let freeze_at = self.snapshotting_at.load(Ordering::SeqCst);
if freeze_at > 0 && freeze_at == earliest_era {
// Note: journal_db().mem_used() can be used for a more accurate memory
// consumption measurement but it can be expensive so sticking with the
// faster `journal_size()` instead.
trace!(target: "pruning", "Pruning is paused at era {} (snapshot under way); earliest era={}, latest era={}, journal_size={} Not pruning.",
freeze_at, earliest_era, latest_era, state_db.journal_db().journal_size());
break;
}
trace!(target: "pruning", "Pruning state for ancient era #{}; latest era={}, journal_size={}",
earliest_era, latest_era, state_db.journal_db().journal_size());
match chain.block_hash(earliest_era) {
Some(ancient_hash) => {
let mut batch = DBTransaction::new();
state_db.mark_canonical(&mut batch, era, &ancient_hash)?;
state_db.mark_canonical(&mut batch, earliest_era, &ancient_hash)?;
self.db.read().key_value().write_buffered(batch);
state_db.journal_db().flush();
}
None =>
debug!(target: "client", "Missing expected hash for block {}", era),
debug!(target: "pruning", "Missing expected hash for block {}", earliest_era),
}
}
_ => break, // means that every era is kept, no pruning necessary.
@@ -1023,15 +1065,16 @@ impl Client {
}
/// 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();
State::from_existing(
let state = State::from_existing(
self.state_db.read().boxed_clone_canon(&header.hash()),
*header.state_root(),
self.engine.account_start_nonce(header.number()),
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.
@@ -1041,9 +1084,9 @@ impl Client {
/// is unknown.
pub fn state_at(&self, id: BlockId) -> Option<State<StateDB>> {
// fast path for latest state.
match id.clone() {
BlockId::Latest => return Some(self.latest_state()),
_ => {},
if let BlockId::Latest = id {
let (state, _) = self.latest_state_and_header();
return Some(state)
}
let block_number = match self.block_number(id) {
@@ -1077,8 +1120,9 @@ impl Client {
}
/// Get a copy of the best block's state.
pub fn state(&self) -> Box<dyn StateInfo> {
Box::new(self.latest_state()) as Box<_>
pub fn state(&self) -> impl StateInfo {
let (state, _) = self.latest_state_and_header();
state
}
/// Get info on the cache.
@@ -1531,8 +1575,8 @@ impl ImportBlock for Client {
impl StateClient for Client {
type State = State<::state_db::StateDB>;
fn latest_state(&self) -> Self::State {
Client::latest_state(self)
fn latest_state_and_header(&self) -> (Self::State, Header) {
Client::latest_state_and_header(self)
}
fn state_at(&self, id: BlockId) -> Option<Self::State> {
@@ -1749,6 +1793,10 @@ impl BlockChainClient for Client {
self.config.spec_name.clone()
}
fn chain(&self) -> Arc<BlockProvider> {
self.chain.read().clone()
}
fn set_spec_name(&self, new_spec_name: String) -> Result<(), ()> {
trace!(target: "mode", "Client::set_spec_name({:?})", new_spec_name);
if !self.enabled.load(AtomicOrdering::Relaxed) {
@@ -2081,7 +2129,7 @@ impl BlockChainClient for Client {
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>> {
@@ -2402,7 +2450,9 @@ impl ImportSealedBlock for Client {
let raw = block.rlp_bytes();
let header = block.header.clone();
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 = {
// Do a super duper basic verification to detect potential bugs
@@ -2490,19 +2540,22 @@ impl ::miner::TransactionVerifierClient for Client {}
impl ::miner::BlockChainClient for Client {}
impl super::traits::EngineClient for Client {
fn update_sealing(&self) {
self.importer.miner.update_sealing(self)
fn update_sealing(&self, force: ForceUpdateSealing) {
self.importer.miner.update_sealing(self, force)
}
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 {
warn!(target: "poa", "Wrong internal seal submission! {:?}", err);
}
}
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> {
@@ -2559,6 +2612,141 @@ impl ProvingBlockChainClient for Client {
impl SnapshotClient for Client {}
impl ImportExportBlocks for Client {
fn export_blocks<'a>(
&self,
mut out: Box<dyn std::io::Write + 'a>,
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(EthcoreError::Import(ImportError::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(())
}
}
/// Returns `LocalizedReceipt` given `LocalizedTransaction`
/// and a vector of receipts from given block up to transaction index.
fn transaction_receipt(
@@ -2606,7 +2794,28 @@ fn transaction_receipt(
#[cfg(test)]
mod tests {
use ethereum_types::{H256, Address};
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::thread;
use std::time::Duration;
use ethereum_types::{Address, H256};
use hash::keccak;
use kvdb::DBTransaction;
use blockchain::{ExtrasInsert, BlockProvider};
use super::{BlockChainClient, ChainInfo};
use ethkey::KeyPair;
use types::{
encoded,
engines::ForkChoice,
ids::{BlockId, TransactionId},
log_entry::{LocalizedLogEntry, LogEntry},
receipt::{LocalizedReceipt, Receipt, TransactionOutcome},
transaction::{Action, LocalizedTransaction, Transaction},
};
use test_helpers::{generate_dummy_client, generate_dummy_client_with_data, generate_dummy_client_with_spec_and_data, get_good_dummy_block_hash};
use super::transaction_receipt;
#[test]
fn should_not_cache_details_before_commit() {
@@ -2760,42 +2969,64 @@ mod tests {
outcome: TransactionOutcome::StateRoot(state_root),
});
}
#[test]
fn should_mark_finalization_correctly_for_parent() {
let client = generate_dummy_client_with_spec_and_data(::spec::Spec::new_test_with_finality, 2, 0, &[]);
let chain = client.chain();
let block1_details = chain.block_hash(1).and_then(|h| chain.block_details(&h));
assert!(block1_details.is_some());
let block1_details = block1_details.unwrap();
assert_eq!(block1_details.children.len(), 1);
assert!(block1_details.is_finalized);
let block2_details = chain.block_hash(2).and_then(|h| chain.block_details(&h));
assert!(block2_details.is_some());
let block2_details = block2_details.unwrap();
assert_eq!(block2_details.children.len(), 0);
assert!(!block2_details.is_finalized);
}
}
/// Queue some items to be processed by IO client.
struct IoChannelQueue {
currently_queued: Arc<AtomicUsize>,
limit: usize,
/// 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) -> Result<(), QueueError> where
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 {
return Err(QueueError::Full(self.limit))
let err_limit = usize::try_from(self.limit).unwrap_or(usize::max_value());
return Err(EthcoreError::Queue(QueueError::Full(err_limit)))
};
let count = i64::try_from(count).unwrap_or(i64::max_value());
let currently_queued = self.currently_queued.clone();
let result = channel.send(ClientIoMessage::execute(move |client| {
let _ok = 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) => return Err(QueueError::Channel(e)),
}
self.currently_queued.fetch_add(count, AtomicOrdering::SeqCst);
Ok(())
}
}

View File

@@ -117,7 +117,7 @@ pub struct ClientConfig {
pub history: u64,
/// Ideal memory usage for state pruning history.
pub history_mem: usize,
/// Check seal valididity on block import
/// Check seal validity on block import
pub check_seal: bool,
/// Maximal number of transactions queued for verification in a separate thread.
pub transaction_verification_queue_size: usize,

View File

@@ -94,6 +94,7 @@ impl<'a> EvmTestClient<'a> {
ForkSpec::Byzantium => Some(ethereum::new_byzantium_test()),
ForkSpec::Constantinople => Some(ethereum::new_constantinople_test()),
ForkSpec::ConstantinopleFix => Some(ethereum::new_constantinople_fix_test()),
ForkSpec::Istanbul => Some(ethereum::new_istanbul_test()),
ForkSpec::EIP158ToByzantiumAt5 => Some(ethereum::new_transition_test()),
ForkSpec::FrontierToHomesteadAt5 | ForkSpec::HomesteadToDaoAt5 | ForkSpec::HomesteadToEIP150At5 => None,
}

View File

@@ -33,12 +33,12 @@ pub use self::config::{Mode, ClientConfig, DatabaseCompactionProfile, BlockChain
pub use self::evm_test_client::{EvmTestClient, EvmTestError, TransactErr, TransactSuccess};
pub use self::io_message::ClientIoMessage;
#[cfg(any(test, feature = "test-helpers"))]
pub use self::test_client::{TestBlockChainClient, EachBlockWith};
pub use self::test_client::{TestBlockChainClient, TestState, EachBlockWith};
pub use self::chain_notify::{ChainNotify, NewBlocks, ChainRoute, ChainRouteType, ChainMessageType};
pub use self::traits::{
Nonce, Balance, ChainInfo, BlockInfo, ReopenBlock, PrepareOpenBlock, TransactionInfo, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock,
StateOrBlock, StateClient, Call, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, BadBlocks,
BlockChainReset
BlockChainReset, ImportExportBlocks, ForceUpdateSealing
};
pub use state::StateInfo;
pub use self::traits::{BlockChainClient, EngineClient, ProvingBlockChainClient, IoClient};

View File

@@ -20,6 +20,7 @@ use std::str::FromStr;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering as AtomicOrder};
use std::sync::Arc;
use std::collections::{HashMap, BTreeMap};
use blockchain::BlockProvider;
use std::mem;
use blockchain::{TreeRoute, BlockReceipts};
@@ -57,7 +58,7 @@ use client::{
TransactionId, UncleId, TraceId, TraceFilter, LastHashes, CallAnalytics,
ProvingBlockChainClient, ScheduleInfo, ImportSealedBlock, BroadcastProposalBlock, ImportBlock, StateOrBlock,
Call, StateClient, EngineInfo, AccountData, BlockChain, BlockProducer, SealedBlockImporter, IoClient,
BadBlocks
BadBlocks, ForceUpdateSealing
};
use engines::Engine;
use error::{Error, EthcoreResult};
@@ -586,7 +587,7 @@ impl ImportBlock for TestBlockChainClient {
impl Call for TestBlockChainClient {
// 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> {
self.execution_result.read().clone().unwrap()
@@ -605,26 +606,30 @@ impl Call for TestBlockChainClient {
}
}
impl StateInfo for () {
impl StateClient for TestBlockChainClient {
// State will not be used by test client anyway, since all methods that accept state are mocked
type State = TestState;
fn latest_state_and_header(&self) -> (Self::State, Header) {
(TestState, self.best_block_header())
}
fn state_at(&self, _id: BlockId) -> Option<Self::State> {
Some(TestState)
}
}
/// 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 balance(&self, _address: &Address) -> ethtrie::Result<U256> { unimplemented!() }
fn storage_at(&self, _address: &Address, _key: &H256) -> ethtrie::Result<H256> { unimplemented!() }
fn code(&self, _address: &Address) -> ethtrie::Result<Option<Arc<Bytes>>> { unimplemented!() }
}
impl StateClient for TestBlockChainClient {
// State will not be used by test client anyway, since all methods that accept state are mocked
type State = ();
fn latest_state(&self) -> Self::State {
()
}
fn state_at(&self, _id: BlockId) -> Option<Self::State> {
Some(())
}
}
impl EngineInfo for TestBlockChainClient {
fn engine(&self) -> &dyn Engine {
unimplemented!()
@@ -699,6 +704,10 @@ impl BlockChainClient for TestBlockChainClient {
}
}
fn chain(&self) -> Arc<BlockProvider> {
unimplemented!()
}
fn list_accounts(&self, _id: BlockId, _after: Option<&Address>, _count: u64) -> Option<Vec<Address>> {
None
}
@@ -933,8 +942,8 @@ impl ProvingBlockChainClient for TestBlockChainClient {
}
impl super::traits::EngineClient for TestBlockChainClient {
fn update_sealing(&self) {
self.miner.update_sealing(self)
fn update_sealing(&self, force: ForceUpdateSealing) {
self.miner.update_sealing(self, force)
}
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>) {

View File

@@ -17,7 +17,7 @@
use std::collections::BTreeMap;
use std::sync::Arc;
use blockchain::{BlockReceipts, TreeRoute};
use blockchain::{BlockReceipts, TreeRoute, BlockProvider};
use bytes::Bytes;
use call_contract::{CallContract, RegistryInfo};
use ethcore_miner::pool::VerifiedTransaction;
@@ -31,6 +31,7 @@ use types::basic_account::BasicAccount;
use types::block_status::BlockStatus;
use types::blockchain_info::BlockChainInfo;
use types::call_analytics::CallAnalytics;
use types::data_format::DataFormat;
use types::encoded;
use types::filter::Filter;
use types::header::Header;
@@ -145,7 +146,7 @@ pub trait StateClient {
type State: StateInfo;
/// Get a copy of the best block's state.
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.
///
@@ -237,6 +238,8 @@ pub trait BlockChainClient : Sync + Send + AccountData + BlockChain + CallContra
.expect("code will return Some if given BlockId::Latest; qed")
}
fn chain(&self) -> Arc<BlockProvider>;
/// Get block queue information.
fn queue_info(&self) -> BlockQueueInfo;
@@ -419,10 +422,19 @@ pub trait BroadcastProposalBlock {
/// Provides methods to import sealed block and broadcast a block proposal
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.
pub trait EngineClient: Sync + Send + ChainInfo {
/// 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.
fn submit_seal(&self, block_hash: H256, seal: Vec<Bytes>);
@@ -474,3 +486,29 @@ pub trait BlockChainReset {
/// reset to best_block - n
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 block::*;
use client::EngineClient;
use client::{EngineClient, ForceUpdateSealing};
use engines::{Engine, Seal, SealingState, EngineError, ConstructedVerifier};
use engines::block_reward;
use engines::block_reward::{BlockRewardContract, RewardKind};
@@ -929,7 +929,7 @@ impl IoHandler<()> for TransitionHandler {
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
if let Some(ref weak) = *self.client.read() {
if let Some(c) = weak.upgrade() {
c.update_sealing();
c.update_sealing(ForceUpdateSealing::No);
}
}
}
@@ -957,7 +957,7 @@ impl Engine for AuthorityRound {
self.step.can_propose.store(true, AtomicOrdering::SeqCst);
if let Some(ref weak) = *self.client.read() {
if let Some(c) = weak.upgrade() {
c.update_sealing();
c.update_sealing(ForceUpdateSealing::No);
}
}
}

View File

@@ -67,7 +67,7 @@ use std::time;
use std::time::{Instant, Duration, SystemTime, UNIX_EPOCH};
use block::ExecutedBlock;
use client::{BlockId, EngineClient};
use client::{BlockId, EngineClient, ForceUpdateSealing};
use engines::clique::util::{extract_signers, recover_creator};
use engines::{Engine, EngineError, Seal, SealingState};
use error::{BlockError, Error};
@@ -750,7 +750,7 @@ impl Engine for Clique {
if self.signer.read().is_some() {
if let Some(ref weak) = *self.client.read() {
if let Some(c) = weak.upgrade() {
c.update_sealing();
c.update_sealing(ForceUpdateSealing::No);
}
}
}

View File

@@ -65,6 +65,13 @@ impl Engine for InstantSeal {
fn sealing_state(&self) -> SealingState { SealingState::Ready }
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 {
if !block.transactions.is_empty() {
let block_number = block.header.number();

View File

@@ -321,6 +321,14 @@ pub trait Engine: Sync + Send {
/// Returns the engine's current sealing state.
fn sealing_state(&self) -> SealingState { SealingState::External }
/// 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.
///
/// If `Some` is returned, then you get a valid seal.

View File

@@ -17,23 +17,29 @@
use engines::Engine;
use engines::block_reward::{self, RewardKind};
use ethereum_types::U256;
use machine::Machine;
use types::BlockNumber;
use types::header::{Header, ExtendedHeader};
use block::ExecutedBlock;
use error::Error;
use machine::Machine;
use types::BlockNumber;
use types::{
ancestry_action::AncestryAction,
header::{Header, ExtendedHeader},
};
/// Params for a null engine.
#[derive(Clone, Default)]
pub struct NullEngineParams {
/// base reward for a block.
pub block_reward: U256,
/// Immediate finalization.
pub immediate_finalization: bool
}
impl From<::ethjson::spec::NullEngineParams> for NullEngineParams {
fn from(p: ::ethjson::spec::NullEngineParams) -> Self {
NullEngineParams {
block_reward: p.block_reward.map_or_else(Default::default, Into::into),
immediate_finalization: p.immediate_finalization.unwrap_or(false)
}
}
}
@@ -105,4 +111,13 @@ impl Engine for NullEngine {
fn fork_choice(&self, new: &ExtendedHeader, current: &ExtendedHeader) -> super::ForkChoice {
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 hash::keccak;
use accounts::AccountProvider;
use client::{BlockChainClient, ChainInfo, BlockInfo, ImportBlock};
use client::{BlockChainClient, ChainInfo, BlockInfo, EngineClient, ImportBlock, ForceUpdateSealing};
use engines::EpochChange;
use engines::validator_set::ValidatorSet;
use ethkey::Secret;
@@ -181,24 +181,24 @@ mod tests {
let signer = Box::new((tap.clone(), v1, "".into()));
client.miner().set_author(miner::Author::Sealer(signer));
client.transact_contract(Default::default(), Default::default()).unwrap();
::client::EngineClient::update_sealing(&*client);
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 0);
// Right signer for the first block.
let signer = Box::new((tap.clone(), v0, "".into()));
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, 1);
// This time v0 is wrong.
client.transact_contract(Default::default(), Default::default()).unwrap();
::client::EngineClient::update_sealing(&*client);
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 1);
let signer = Box::new((tap.clone(), v1, "".into()));
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);
// v1 is still good.
client.transact_contract(Default::default(), Default::default()).unwrap();
::client::EngineClient::update_sealing(&*client);
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 3);
// Check syncing.

View File

@@ -453,7 +453,7 @@ mod tests {
use spec::Spec;
use accounts::AccountProvider;
use types::transaction::{Transaction, Action};
use client::{ChainInfo, BlockInfo, ImportBlock};
use client::{ChainInfo, BlockInfo, EngineClient, ImportBlock, ForceUpdateSealing};
use ethkey::Secret;
use miner::{self, MinerService};
use test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data};
@@ -495,7 +495,7 @@ mod tests {
data: "bfc708a000000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
}.sign(&s0, Some(chain_id));
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);
// Add "1" validator back in.
let tx = Transaction {
@@ -507,14 +507,14 @@ mod tests {
data: "4d238c8e00000000000000000000000082a978b3f5962a5b0957d9ee9eef472ee55b42f1".from_hex().unwrap(),
}.sign(&s0, Some(chain_id));
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.
assert_eq!(client.chain_info().best_block_number, 1);
// Switch to the validator that is still there.
let signer = Box::new((tap.clone(), v0, "".into()));
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);
// Switch back to the added validator, since the state is updated.
let signer = Box::new((tap.clone(), v1, "".into()));
@@ -528,7 +528,7 @@ mod tests {
data: Vec::new(),
}.sign(&s0, Some(chain_id));
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.
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"))
}
/// Create a new Mordor 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
/// Create a new Foundation Frontier-era chain spec as though it never changes to Homestead.
@@ -166,6 +171,9 @@ pub fn new_constantinople_test() -> Spec { load(None, include_bytes!("../../res/
/// Create a new Foundation St. Peter's (Contantinople Fix) era spec.
pub fn new_constantinople_fix_test() -> Spec { load(None, include_bytes!("../../res/ethereum/st_peters_test.json")) }
/// Create a new Foundation Istanbul era spec.
pub fn new_istanbul_test() -> Spec { load(None, include_bytes!("../../res/ethereum/istanbul_test.json")) }
/// Create a new Musicoin-MCIP3-era spec.
pub fn new_mcip3_test() -> Spec { load(None, include_bytes!("../../res/ethereum/mcip3_test.json")) }

View File

@@ -18,49 +18,49 @@ use std::path::Path;
use std::sync::Arc;
use client::{EvmTestClient, Client, ClientConfig, ChainInfo, ImportBlock};
use spec::Genesis;
use ethjson;
use ethjson::test_helpers::blockchain;
use miner::Miner;
use io::IoChannel;
use test_helpers;
use verification::queue::kind::blocks::Unverified;
use verification::VerifierType;
use super::SKIP_TEST_STATE;
use verification::{VerifierType, queue::kind::BlockLike, queue::kind::blocks::Unverified};
use super::SKIP_TESTS;
use super::HookType;
/// Run chain jsontests on a given folder.
pub fn run_test_path<H: FnMut(&str, HookType)>(p: &Path, skip: &[&'static str], h: &mut H) {
::json_tests::test_common::run_test_path(p, skip, json_chain_test, h)
}
/// Run chain jsontests on a given file.
pub fn run_test_file<H: FnMut(&str, HookType)>(p: &Path, h: &mut H) {
::json_tests::test_common::run_test_file(p, json_chain_test, h)
}
#[allow(dead_code)]
fn skip_test(name: &String) -> bool {
SKIP_TEST_STATE.block.iter().any(|block_test|block_test.subtests.contains(name))
SKIP_TESTS
.block
.iter()
.any(|block_test|block_test.subtests.contains(name))
}
pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
#[allow(dead_code)]
pub fn json_chain_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
let _ = ::env_logger::try_init();
let tests = ethjson::blockchain::Test::load(json_data).unwrap();
let tests = blockchain::Test::load(json_data)
.expect(&format!("Could not parse JSON chain test data from {}", path.display()));
let mut failed = Vec::new();
for (name, blockchain) in tests.into_iter() {
if skip_test(&name) {
println!(" - {} | {:?} Ignoring tests because in skip list", name, blockchain.network);
println!(" - {} | {:?}: SKIPPED", name, blockchain.network);
continue;
}
start_stop_hook(&name, HookType::OnStart);
let mut fail = false;
{
let mut fail_unless = |cond: bool| if !cond && !fail {
failed.push(name.clone());
flushln!("FAIL");
fail = true;
true
} else {false};
let mut fail_unless = |cond: bool| {
if !cond && !fail {
failed.push(name.clone());
flushln!("FAIL");
fail = true;
true
} else {
false
}
};
flush!(" - {}...", name);
@@ -68,7 +68,7 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
let mut spec = match EvmTestClient::spec_from_json(&blockchain.network) {
Some(spec) => spec,
None => {
println!(" - {} | {:?} Ignoring tests because of missing spec", name, blockchain.network);
println!(" - {} | {:?} Ignoring tests because of missing chainspec", name, blockchain.network);
continue;
}
};
@@ -77,30 +77,44 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
let state = From::from(blockchain.pre_state.clone());
spec.set_genesis_state(state).expect("Failed to overwrite genesis state");
spec.overwrite_genesis_params(genesis);
assert!(spec.is_state_root_valid());
// assert!(spec.is_state_root_valid());
spec
};
{
let db = test_helpers::new_db();
let mut config = ClientConfig::default();
if ethjson::blockchain::Engine::NoProof == blockchain.engine {
if ethjson::test_helpers::blockchain::Engine::NoProof == blockchain.engine {
config.verifier_type = VerifierType::CanonNoSeal;
config.check_seal = false;
}
config.history = 8;
config.queue.verifier_settings.num_verifiers = 1;
let client = Client::new(
config,
&spec,
db,
Arc::new(Miner::new_for_tests(&spec, None)),
IoChannel::disconnected(),
).unwrap();
).expect("Failed to instantiate a new Client");
for b in blockchain.blocks_rlp() {
if let Ok(block) = Unverified::from_rlp(b) {
let _ = client.import_block(block);
client.flush_queue();
client.import_verified_blocks();
let bytes_len = b.len();
let block = Unverified::from_rlp(b);
match block {
Ok(block) => {
let num = block.header.number();
let hash = block.hash();
trace!(target: "json-tests", "{} Importing {} bytes. Block #{}/{}", name, bytes_len, num, hash);
let res = client.import_block(block);
if let Err(e) = res {
warn!(target: "json-tests", "{} Error importing block #{}/{}: {:?}", name, num, hash, e);
}
client.flush_queue();
},
Err(decoder_err) => {
warn!(target: "json-tests", "Error decoding test block: {:?} ({} bytes)", decoder_err, bytes_len);
}
}
}
fail_unless(client.chain_info().best_block_hash == blockchain.best_block.into());
@@ -109,24 +123,31 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
if !fail {
flushln!("ok");
} else {
flushln!("fail");
}
start_stop_hook(&name, HookType::OnStop);
}
println!("!!! {:?} tests from failed.", failed.len());
if failed.len() > 0 {
println!("!!! {:?} tests failed.", failed.len());
}
failed
}
#[cfg(test)]
mod block_tests {
use std::path::Path;
use super::json_chain_test;
use json_tests::HookType;
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
json_chain_test(json_data, h)
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], h: &mut H) -> Vec<String> {
json_chain_test(path, json_data, h)
}
//todo[dvdplm] do these tests match all folders in `res/` or are there tests we're missing?
//Issue: https://github.com/paritytech/parity-ethereum/issues/11085
declare_test!{BlockchainTests_bcBlockGasLimitTest, "BlockchainTests/bcBlockGasLimitTest"}
declare_test!{BlockchainTests_bcExploitTest, "BlockchainTests/bcExploitTest"}
declare_test!{BlockchainTests_bcForgedTest, "BlockchainTests/bcForgedTest"}
@@ -173,7 +194,12 @@ mod block_tests {
declare_test!{BlockchainTests_GeneralStateTest_stRandom2, "BlockchainTests/GeneralStateTests/stRandom2/"}
declare_test!{BlockchainTests_GeneralStateTest_stRecursiveCreate, "BlockchainTests/GeneralStateTests/stRecursiveCreate/"}
declare_test!{BlockchainTests_GeneralStateTest_stRefundTest, "BlockchainTests/GeneralStateTests/stRefundTest/"}
declare_test!{BlockchainTests_GeneralStateTest_stReturnDataTest, "BlockchainTests/GeneralStateTests/stReturnDataTest/"}
declare_test!{ BlockchainTests_GeneralStateTest_stReturnDataTest, "BlockchainTests/GeneralStateTests/stReturnDataTest/"}
// todo[dvdplm]:
// "RevertPrecompiledTouch_storage" contains 4 tests, only two fails
// "RevertPrecompiledTouchExactOOG" contains a ton of tests, only two fails
// "RevertPrecompiledTouch" has 4 tests, 2 failures
// Ignored in currents.json, issue: https://github.com/paritytech/parity-ethereum/issues/11073
declare_test!{BlockchainTests_GeneralStateTest_stRevertTest, "BlockchainTests/GeneralStateTests/stRevertTest/"}
declare_test!{BlockchainTests_GeneralStateTest_stShift, "BlockchainTests/GeneralStateTests/stShift/"}
declare_test!{BlockchainTests_GeneralStateTest_stSolidityTest, "BlockchainTests/GeneralStateTests/stSolidityTest/"}

View File

@@ -14,16 +14,24 @@
// 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 ethjson;
use types::header::Header;
use std::path::Path;
use ethereum_types::U256;
use ethjson::test_helpers::difficulty::DifficultyTest;
use types::header::Header;
use spec::Spec;
use super::HookType;
pub fn json_difficulty_test<H: FnMut(&str, HookType)>(json_data: &[u8], spec: Spec, start_stop_hook: &mut H) -> Vec<String> {
let _ = ::env_logger::try_init();
let tests = ethjson::test::DifficultyTest::load(json_data).unwrap();
pub fn json_difficulty_test<H: FnMut(&str, HookType)>(
path: &Path,
json_data: &[u8],
spec: Spec,
start_stop_hook: &mut H
) -> Vec<String> {
let _ = env_logger::try_init();
let tests = DifficultyTest::load(json_data)
.expect(&format!("Could not parse JSON difficulty test data from {}", path.display()));
let engine = &spec.engine;
for (name, test) in tests.into_iter() {
@@ -54,29 +62,28 @@ pub fn json_difficulty_test<H: FnMut(&str, HookType)>(json_data: &[u8], spec: Sp
macro_rules! difficulty_json_test {
( $spec:ident ) => {
use std::path::Path;
use super::json_difficulty_test;
use tempdir::TempDir;
use json_tests::HookType;
use super::json_difficulty_test;
use tempdir::TempDir;
use json_tests::HookType;
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
let tempdir = TempDir::new("").unwrap();
json_difficulty_test(json_data, ::ethereum::$spec(&tempdir.path()), h)
}
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], h: &mut H) -> Vec<String> {
let tempdir = TempDir::new("").unwrap();
json_difficulty_test(path, json_data, ::ethereum::$spec(&tempdir.path()), h)
}
}
}
macro_rules! difficulty_json_test_nopath {
( $spec:ident ) => {
use std::path::Path;
use super::json_difficulty_test;
use json_tests::HookType;
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
json_difficulty_test(json_data, ::ethereum::$spec(), h)
}
use super::json_difficulty_test;
use json_tests::HookType;
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], h: &mut H) -> Vec<String> {
json_difficulty_test(path, json_data, ::ethereum::$spec(), h)
}
}
}

View File

@@ -230,16 +230,22 @@ impl<'a, T: 'a, V: 'a, B: 'a> Ext for TestExt<'a, T, V, B>
}
}
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], h: &mut H) -> Vec<String> {
let vms = VMType::all();
vms
.iter()
.flat_map(|vm| do_json_test_for(vm, json_data, h))
.flat_map(|vm| do_json_test_for(path, vm, json_data, h))
.collect()
}
fn do_json_test_for<H: FnMut(&str, HookType)>(vm_type: &VMType, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
let tests = ethjson::vm::Test::load(json_data).unwrap();
fn do_json_test_for<H: FnMut(&str, HookType)>(
path: &Path,
vm_type: &VMType,
json_data: &[u8],
start_stop_hook: &mut H
) -> Vec<String> {
let tests = ethjson::test_helpers::vm::Test::load(json_data)
.expect(&format!("Could not parse JSON executive test data from {}", path.display()));
let mut failed = Vec::new();
for (name, vm) in tests.into_iter() {
@@ -331,15 +337,15 @@ fn do_json_test_for<H: FnMut(&str, HookType)>(vm_type: &VMType, json_data: &[u8]
for (address, account) in vm.post_state.unwrap().into_iter() {
let address = address.into();
let code: Vec<u8> = account.code.into();
let code: Vec<u8> = account.code.expect("code is missing from json; test should have code").into();
let found_code = try_fail!(state.code(&address));
let found_balance = try_fail!(state.balance(&address));
let found_nonce = try_fail!(state.nonce(&address));
fail_unless(found_code.as_ref().map_or_else(|| code.is_empty(), |c| &**c == &code), "code is incorrect");
fail_unless(found_balance == account.balance.into(), "balance is incorrect");
fail_unless(found_nonce == account.nonce.into(), "nonce is incorrect");
for (k, v) in account.storage {
fail_unless(account.balance.as_ref().map_or(false, |b| b.0 == found_balance), "balance is incorrect");
fail_unless(account.nonce.as_ref().map_or(false, |n| n.0 == found_nonce), "nonce is incorrect");
for (k, v) in account.storage.expect("test should have storage") {
let key: U256 = k.into();
let value: U256 = v.into();
let found_storage = try_fail!(state.storage_at(&address, &BigEndianHash::from_uint(&key)));

View File

@@ -30,17 +30,7 @@ mod skip;
mod difficulty;
pub use self::test_common::HookType;
pub use self::transaction::run_test_path as run_transaction_test_path;
pub use self::transaction::run_test_file as run_transaction_test_file;
pub use self::executive::run_test_path as run_executive_test_path;
pub use self::executive::run_test_file as run_executive_test_file;
pub use self::state::run_test_path as run_state_test_path;
pub use self::state::run_test_file as run_state_test_file;
pub use self::chain::run_test_path as run_chain_test_path;
pub use self::chain::run_test_file as run_chain_test_file;
pub use self::trie::run_generic_test_path as run_generic_trie_test_path;
pub use self::trie::run_generic_test_file as run_generic_trie_test_file;
pub use self::trie::run_secure_test_path as run_secure_trie_test_path;
pub use self::trie::run_secure_test_file as run_secure_trie_test_file;
use self::skip::SKIP_TEST_STATE;
use self::skip::SKIP_TESTS;

View File

@@ -14,21 +14,30 @@
// You should have received a copy of the GNU General Public License
// along with Parity Ethereum. If not, see <http://www.gnu.org/licenses/>.
//! State tests to skip.
//! State or blockchain tests to skip.
//!
//! Looks in the `ethereum/tests/test-issues/currents.json` file. This file contains two
//! collections, `block` and `state`, each with a different format to specify single tests to skip.
//!
//! To skip a blockchain test, add a JSON object to the `block` array, where `failing` names the
//! leaf folder with the tests to skip. The `subtests` array contains the names of the tests to skip.
//! Note that this does not handle duplicate folder names, e.g. `ValidBlocks/funTests/` and
//! `Something/funTests` would both be matched when `failing` is set to `funTests`.
//!
//! To skip a state test, add a JSON object to the `state` array. The `failing` works like for block
//! tests, but the `subtests` key is an object on the form:
//! "testName": {"subnumbers": [INDEX_OF_SKIPPED_SUBTESTS | "*"], "chain": "Blockchain name (informational)"}`
//!
//! Use the `reference` key to point to the github issue tracking to solution to the problem.
//!
//! Note: the `declare_test!` macro can also be use to skip tests, but skips entire files rather
//! than single tests.
use ethjson;
use ethjson::test_helpers::skip::SkipTests;
#[cfg(feature="ci-skip-tests")]
lazy_static!{
pub static ref SKIP_TEST_STATE: ethjson::test::SkipStates = {
lazy_static! {
pub static ref SKIP_TESTS: SkipTests = {
let skip_data = include_bytes!("../../res/ethereum/tests-issues/currents.json");
ethjson::test::SkipStates::load(&skip_data[..]).expect("No invalid json allowed")
};
}
#[cfg(not(feature="ci-skip-tests"))]
lazy_static!{
pub static ref SKIP_TEST_STATE: ethjson::test::SkipStates = {
ethjson::test::SkipStates::empty()
SkipTests::load(&skip_data[..]).expect("JSON from disk is valid")
};
}

View File

@@ -22,34 +22,31 @@ use client::{EvmTestClient, EvmTestError, TransactErr, TransactSuccess};
use ethjson;
use types::transaction::SignedTransaction;
use vm::EnvInfo;
use super::SKIP_TEST_STATE;
use super::SKIP_TESTS;
use super::HookType;
/// Run state jsontests on a given folder.
pub fn run_test_path<H: FnMut(&str, HookType)>(p: &Path, skip: &[&'static str], h: &mut H) {
::json_tests::test_common::run_test_path(p, skip, json_chain_test, h)
}
/// Run state jsontests on a given file.
pub fn run_test_file<H: FnMut(&str, HookType)>(p: &Path, h: &mut H) {
::json_tests::test_common::run_test_file(p, json_chain_test, h)
}
#[allow(dead_code)]
fn skip_test(subname: &str, chain: &String, number: usize) -> bool {
SKIP_TEST_STATE.state.iter().any(|state_test|{
trace!(target: "json-tests", "[state, skip_test] subname: '{}', chain: '{}', number: {}", subname, chain, number);
SKIP_TESTS.state.iter().any(|state_test|{
if let Some(subtest) = state_test.subtests.get(subname) {
trace!(target: "json-tests", "[state, skip_test] Maybe skipping {:?}", subtest);
chain == &subtest.chain &&
(subtest.subnumbers[0] == "*"
|| subtest.subnumbers.contains(&number.to_string()))
(
subtest.subnumbers[0] == "*" ||
subtest.subnumbers.contains(&number.to_string())
)
} else {
false
}
})
}
pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
#[allow(dead_code)]
pub fn json_chain_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
let _ = ::env_logger::try_init();
let tests = ethjson::state::test::Test::load(json_data).unwrap();
let tests = ethjson::test_helpers::state::Test::load(json_data)
.expect(&format!("Could not parse JSON state test data from {}", path.display()));
let mut failed = Vec::new();
for (name, test) in tests.into_iter() {
@@ -65,7 +62,7 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
let spec = match EvmTestClient::spec_from_json(&spec_name) {
Some(spec) => spec,
None => {
println!(" - {} | {:?} Ignoring tests because of missing spec", name, spec_name);
println!(" - {} | {:?} Ignoring tests because of missing chainspec", name, spec_name);
continue;
}
};
@@ -73,7 +70,7 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
for (i, state) in states.into_iter().enumerate() {
let info = format!(" - {} | {:?} ({}/{}) ...", name, spec_name, i + 1, total);
if skip_test(&name, &spec.name, i + 1) {
println!("{} in skip list : SKIPPED", info);
println!("{}: SKIPPED", info);
continue;
}
@@ -123,11 +120,13 @@ pub fn json_chain_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_ho
#[cfg(test)]
mod state_tests {
use std::path::Path;
use super::json_chain_test;
use json_tests::HookType;
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], h: &mut H) -> Vec<String> {
json_chain_test(json_data, h)
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], h: &mut H) -> Vec<String> {
json_chain_test(path, json_data, h)
}
declare_test!{GeneralStateTest_stArgsZeroOneBalance, "GeneralStateTests/stArgsZeroOneBalance/"}
@@ -164,6 +163,15 @@ mod state_tests {
declare_test!{GeneralStateTest_stRecursiveCreate, "GeneralStateTests/stRecursiveCreate/"}
declare_test!{GeneralStateTest_stRefundTest, "GeneralStateTests/stRefundTest/"}
declare_test!{GeneralStateTest_stReturnDataTest, "GeneralStateTests/stReturnDataTest/"}
// todo[dvdplm]:
// "RevertPrecompiledTouch_storage" contains 4 tests, only two fails
// "RevertPrecompiledTouchExactOOG" contains a ton of tests, only two fails
// "RevertPrecompiledTouch" has 4 tests, 2 failures
// Ignored in `currents.json`.
// Issues:
// https://github.com/paritytech/parity-ethereum/issues/11078
// https://github.com/paritytech/parity-ethereum/issues/11079
// https://github.com/paritytech/parity-ethereum/issues/11080
declare_test!{GeneralStateTest_stRevertTest, "GeneralStateTests/stRevertTest/"}
declare_test!{GeneralStateTest_stSStoreTest, "GeneralStateTests/stSStoreTest/"}
declare_test!{GeneralStateTest_stShift, "GeneralStateTests/stShift/"}

View File

@@ -30,43 +30,61 @@ pub enum HookType {
OnStop
}
/// Run all tests under the given path (except for the test files named in the skip list) using the
/// provided runner function.
pub fn run_test_path<H: FnMut(&str, HookType)>(
p: &Path, skip: &[&'static str],
runner: fn(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
path: &Path,
skip: &[&'static str],
runner: fn(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
start_stop_hook: &mut H
) {
if !skip.is_empty() {
// todo[dvdplm] it's really annoying to have to use flushln here. Should be `info!(target:
// "json-tests", …)`. Issue https://github.com/paritytech/parity-ethereum/issues/11084
flushln!("[run_test_path] Skipping tests in {}: {:?}", path.display(), skip);
}
let mut errors = Vec::new();
run_test_path_inner(p, skip, runner, start_stop_hook, &mut errors);
run_test_path_inner(path, skip, runner, start_stop_hook, &mut errors);
let empty: [String; 0] = [];
assert_eq!(errors, empty);
assert_eq!(errors, empty, "\nThere were {} tests in '{}' that failed.", errors.len(), path.display());
}
fn run_test_path_inner<H: FnMut(&str, HookType)>(
p: &Path, skip: &[&'static str],
runner: fn(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
p: &Path,
skip: &[&'static str],
runner: fn(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
start_stop_hook: &mut H,
errors: &mut Vec<String>
) {
let path = Path::new(p);
let s: HashSet<OsString> = skip.iter().map(|s| {
let extension = path.extension().and_then(|s| s.to_str());
let skip_list: HashSet<OsString> = skip.iter().map(|s| {
let mut os: OsString = s.into();
os.push(".json");
os
}).collect();
let extension = path.extension().and_then(|s| s.to_str());
if path.is_dir() {
for p in read_dir(path).unwrap().filter_map(|e| {
let e = e.unwrap();
if s.contains(&e.file_name()) {
None
} else {
Some(e.path())
}}) {
run_test_path_inner(&p, skip, runner, start_stop_hook, errors);
trace!(target: "json-tests", "running tests contained in '{}'", path.display());
let test_files = read_dir(path)
.expect("Directory exists on disk")
.filter_map(|dir_entry| {
let dir_entry = dir_entry.expect("Entry in directory listing exists");
if skip_list.contains(&dir_entry.file_name()) {
debug!(target: "json-tests", "'{:?}' is on the skip list.", dir_entry.file_name());
None
} else {
Some(dir_entry.path())
}
});
for test_file in test_files {
run_test_path_inner(&test_file, skip, runner, start_stop_hook, errors);
}
} else if extension == Some("swp") || extension == None {
trace!(target: "json-tests", "ignoring '{}', extension {:?} Junk?", path.display(), extension);
// Ignore junk
} else {
trace!(target: "json-tests", "running tests in '{}'", path.display());
let mut path = p.to_path_buf();
path.set_extension("json");
run_test_file_append(&path, runner, start_stop_hook, errors)
@@ -75,7 +93,7 @@ fn run_test_path_inner<H: FnMut(&str, HookType)>(
fn run_test_file_append<H: FnMut(&str, HookType)>(
path: &Path,
runner: fn(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
runner: fn(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
start_stop_hook: &mut H,
errors: &mut Vec<String>
) {
@@ -85,12 +103,12 @@ fn run_test_file_append<H: FnMut(&str, HookType)>(
Err(_) => panic!("Error opening test file at: {:?}", path),
};
file.read_to_end(&mut data).expect("Error reading test file");
errors.append(&mut runner(&data, start_stop_hook));
errors.append(&mut runner(&path, &data, start_stop_hook));
}
pub fn run_test_file<H: FnMut(&str, HookType)>(
path: &Path,
runner: fn(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
runner: fn(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String>,
start_stop_hook: &mut H
) {
let mut data = Vec::new();
@@ -99,7 +117,7 @@ pub fn run_test_file<H: FnMut(&str, HookType)>(
Err(_) => panic!("Error opening test file at: {:?}", path),
};
file.read_to_end(&mut data).expect("Error reading test file");
let results = runner(&data, start_stop_hook);
let results = runner(&path, &data, start_stop_hook);
let empty: [String; 0] = [];
assert_eq!(results, empty);
}
@@ -107,11 +125,25 @@ pub fn run_test_file<H: FnMut(&str, HookType)>(
#[cfg(test)]
macro_rules! test {
($name: expr, $skip: expr) => {
::json_tests::test_common::run_test_path(::std::path::Path::new(concat!("res/ethereum/tests/", $name)), &$skip, do_json_test, &mut |_, _| ());
::json_tests::test_common::run_test_path(
::std::path::Path::new(concat!("res/ethereum/tests/", $name)),
&$skip,
do_json_test,
&mut |_, _| ()
);
}
}
/// Declares a test
/// Declares a test:
///
/// declare_test!(test_name, "path/to/folder/with/tests");
///
/// Declares a test but skip the named test files inside the folder (no extension):
///
/// declare_test!(skip => ["a-test-file", "other-test-file"], test_name, "path/to/folder/with/tests");
///
/// NOTE: a skipped test is considered a passing test as far as `cargo test` is concerned. Normally
/// one test corresponds to a folder full of test files, each of which may contain many tests.
#[macro_export]
macro_rules! declare_test {
(skip => $arr: expr, $id: ident, $name: expr) => {

View File

@@ -23,22 +23,14 @@ use types::header::Header;
use types::transaction::UnverifiedTransaction;
use transaction_ext::Transaction;
/// Run transaction jsontests on a given folder.
pub fn run_test_path<H: FnMut(&str, HookType)>(p: &Path, skip: &[&'static str], h: &mut H) {
::json_tests::test_common::run_test_path(p, skip, do_json_test, h)
}
#[allow(dead_code)]
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
// Block number used to run the tests.
// Make sure that all the specified features are activated.
const BLOCK_NUMBER: u64 = 0x6ffffffffffffe;
/// Run transaction jsontests on a given file.
pub fn run_test_file<H: FnMut(&str, HookType)>(p: &Path, h: &mut H) {
::json_tests::test_common::run_test_file(p, do_json_test, h)
}
// Block number used to run the tests.
// Make sure that all the specified features are activated.
const BLOCK_NUMBER: u64 = 0x6ffffffffffffe;
fn do_json_test<H: FnMut(&str, HookType)>(json_data: &[u8], start_stop_hook: &mut H) -> Vec<String> {
let tests = ethjson::transaction::Test::load(json_data).unwrap();
let tests = ethjson::test_helpers::transaction::Test::load(json_data)
.expect(&format!("Could not parse JSON transaction test data from {}", path.display()));
let mut failed = Vec::new();
for (name, test) in tests.into_iter() {
start_stop_hook(&name, HookType::OnStart);

View File

@@ -14,6 +14,8 @@
// 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::path::Path;
use ethjson;
use trie::{TrieFactory, TrieSpec};
use ethtrie::RlpCodec;
@@ -21,13 +23,10 @@ use ethereum_types::H256;
use super::HookType;
pub use self::generic::run_test_path as run_generic_test_path;
pub use self::generic::run_test_file as run_generic_test_file;
pub use self::secure::run_test_path as run_secure_test_path;
pub use self::secure::run_test_file as run_secure_test_file;
fn test_trie<H: FnMut(&str, HookType)>(json: &[u8], trie: TrieSpec, start_stop_hook: &mut H) -> Vec<String> {
let tests = ethjson::trie::Test::load(json).unwrap();
#[allow(dead_code)]
fn test_trie<H: FnMut(&str, HookType)>(path: &Path, json: &[u8], trie: TrieSpec, start_stop_hook: &mut H) -> Vec<String> {
let tests = ethjson::test_helpers::trie::Test::load(json)
.expect(&format!("Could not parse JSON trie test data from {}", path.display()));
let factory = TrieFactory::<_, RlpCodec>::new(trie);
let mut result = vec![];
@@ -65,18 +64,9 @@ mod generic {
use super::HookType;
/// Run generic trie jsontests on a given folder.
pub fn run_test_path<H: FnMut(&str, HookType)>(p: &Path, skip: &[&'static str], h: &mut H) {
::json_tests::test_common::run_test_path(p, skip, do_json_test, h)
}
/// Run generic trie jsontests on a given file.
pub fn run_test_file<H: FnMut(&str, HookType)>(p: &Path, h: &mut H) {
::json_tests::test_common::run_test_file(p, do_json_test, h)
}
fn do_json_test<H: FnMut(&str, HookType)>(json: &[u8], h: &mut H) -> Vec<String> {
super::test_trie(json, TrieSpec::Generic, h)
#[allow(dead_code)]
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json: &[u8], h: &mut H) -> Vec<String> {
super::test_trie(path, json, TrieSpec::Generic, h)
}
declare_test!{TrieTests_trietest, "TrieTests/trietest"}
@@ -89,18 +79,9 @@ mod secure {
use super::HookType;
/// Run secure trie jsontests on a given folder.
pub fn run_test_path<H: FnMut(&str, HookType)>(p: &Path, skip: &[&'static str], h: &mut H) {
::json_tests::test_common::run_test_path(p, skip, do_json_test, h)
}
/// Run secure trie jsontests on a given file.
pub fn run_test_file<H: FnMut(&str, HookType)>(p: &Path, h: &mut H) {
::json_tests::test_common::run_test_file(p, do_json_test, h)
}
fn do_json_test<H: FnMut(&str, HookType)>(json: &[u8], h: &mut H) -> Vec<String> {
super::test_trie(json, TrieSpec::Secure, h)
#[allow(dead_code)]
fn do_json_test<H: FnMut(&str, HookType)>(path: &Path, json: &[u8], h: &mut H) -> Vec<String> {
super::test_trie(path, json, TrieSpec::Secure, h)
}
declare_test!{TrieTests_hex_encoded_secure, "TrieTests/hex_encoded_securetrie_test"}

View File

@@ -160,8 +160,8 @@ impl<'de> Deserialize<'de> for FilterOptions {
M: MapAccess<'de>,
{
let mut filter = FilterOptions::default();
while let Some(key) = map.next_key()? {
match key {
while let Some(key) = map.next_key::<String>()? {
match key.as_str() {
"from" => {
filter.from = map.validate_from()?;
},
@@ -221,8 +221,8 @@ impl<'de> Deserialize<'de> for FilterOptions {
let mut counter = 0;
let mut f_op = Wrapper::O(FilterOperator::Any);
while let Some(key) = map.next_key()? {
match key {
while let Some(key) = map.next_key::<String>()? {
match key.as_str() {
"eq" => f_op = W::O(FilterOperator::Eq(map.next_value()?)),
"gt" => f_op = W::O(FilterOperator::GreaterThan(map.next_value()?)),
"lt" => f_op = W::O(FilterOperator::LessThan(map.next_value()?)),

View File

@@ -51,9 +51,10 @@ use using_queue::{UsingQueue, GetAction};
use block::{ClosedBlock, SealedBlock};
use client::{
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce, TransactionInfo, TransactionId
BlockChain, ChainInfo, BlockProducer, SealedBlockImporter, Nonce,
TransactionInfo, TransactionId, ForceUpdateSealing
};
use client::{BlockId, ClientIoMessage};
use client::{Client, BlockId, ClientIoMessage};
use client::traits::EngineClient;
use engines::{Engine, Seal, SealingState, EngineSigner};
use error::Error;
@@ -291,6 +292,7 @@ impl Miner {
let tx_queue_strategy = options.tx_queue_strategy;
let nonce_cache_size = cmp::max(4096, limits.max_count / 4);
let refuse_service_transactions = options.refuse_service_transactions;
let engine = spec.engine.clone();
Miner {
sealing: Mutex::new(SealingWork {
@@ -309,7 +311,7 @@ impl Miner {
options,
transaction_queue: Arc::new(TransactionQueue::new(limits, verifier_options, tx_queue_strategy)),
accounts: Arc::new(accounts),
engine: spec.engine.clone(),
engine,
io_channel: RwLock::new(None),
service_transaction_checker: if refuse_service_transactions {
None
@@ -862,12 +864,12 @@ impl Miner {
match self.engine.sealing_state() {
SealingState::Ready => {
self.maybe_enable_sealing();
self.update_sealing(chain)
self.update_sealing(chain, ForceUpdateSealing::No);
}
SealingState::External => {
// this calls `maybe_enable_sealing()`
if self.prepare_pending_block(chain) == BlockPreparationStatus::NotPrepared {
self.update_sealing(chain)
self.update_sealing(chain, ForceUpdateSealing::No);
}
}
SealingState::NotReady => { self.maybe_enable_sealing(); },
@@ -1216,6 +1218,11 @@ impl miner::MinerService for Miner {
let prev_gas = if index == 0 { Default::default() } else { receipts[index - 1].gas_used };
let receipt = &receipts[index];
RichReceipt {
from: tx.sender(),
to: match tx.action {
Action::Create => None,
Action::Call(ref address) => Some(*address),
},
transaction_hash: tx.hash(),
transaction_index: index,
cumulative_gas_used: receipt.gas_used,
@@ -1238,14 +1245,16 @@ impl miner::MinerService for Miner {
/// Update sealing if required.
/// 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,
{
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.
if !self.requires_reseal(chain.chain_info().best_block_number) {
if force == ForceUpdateSealing::No &&
!self.requires_reseal(chain.chain_info().best_block_number)
{
return;
}
@@ -1280,13 +1289,14 @@ impl miner::MinerService for Miner {
if self.seal_and_import_block_internally(chain, block) {
trace!(target: "miner", "update_sealing: imported internally sealed block");
}
return
},
SealingState::NotReady => unreachable!("We returned right after sealing_state was computed. qed."),
SealingState::External => {
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 {
@@ -1387,7 +1397,7 @@ impl miner::MinerService for Miner {
// | NOTE Code below requires sealing locks. |
// | Make sure to release the locks before calling that method. |
// --------------------------------------------------------------------------
self.update_sealing(chain);
self.update_sealing(chain, ForceUpdateSealing::No);
}
}
@@ -1405,8 +1415,7 @@ impl miner::MinerService for Miner {
let engine = self.engine.clone();
let accounts = self.accounts.clone();
let service_transaction_checker = self.service_transaction_checker.clone();
let cull = move |chain: &::client::Client| {
let cull = move |chain: &Client| {
let client = PoolClient::new(
chain,
&nonce_cache,
@@ -1415,8 +1424,9 @@ impl miner::MinerService for Miner {
service_transaction_checker.as_ref(),
);
queue.cull(client);
if is_internal_import {
chain.update_sealing();
if engine.should_reseal_on_update() {
// force update_sealing here to skip `reseal_required` checks
chain.update_sealing(ForceUpdateSealing::Yes);
}
};
@@ -1425,8 +1435,9 @@ impl miner::MinerService for Miner {
}
} else {
self.transaction_queue.cull(client);
if is_internal_import {
self.update_sealing(chain);
if self.engine.should_reseal_on_update() {
// force update_sealing here to skip `reseal_required` checks
self.update_sealing(chain, ForceUpdateSealing::Yes);
}
}
}
@@ -1751,7 +1762,7 @@ mod tests {
).pop().unwrap();
assert_eq!(import.unwrap(), ());
miner.update_sealing(&*client);
miner.update_sealing(&*client, ForceUpdateSealing::No);
client.flush_queue();
assert!(miner.pending_block(0).is_none());
assert_eq!(client.chain_info().best_block_number, 3 as BlockNumber);
@@ -1761,7 +1772,7 @@ mod tests {
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();
assert!(miner.pending_block(0).is_none());
assert_eq!(client.chain_info().best_block_number, 4 as BlockNumber);
@@ -1789,7 +1800,7 @@ mod tests {
let miner = Miner::new_for_tests(&spec, None);
let client = generate_dummy_client(2);
miner.update_sealing(&*client);
miner.update_sealing(&*client, ForceUpdateSealing::No);
assert!(miner.is_currently_sealing());
}
@@ -1800,7 +1811,7 @@ mod tests {
let miner = Miner::new_for_tests(&spec, None);
let client = generate_dummy_client(2);
miner.update_sealing(&*client);
miner.update_sealing(&*client, ForceUpdateSealing::No);
assert!(!miner.is_currently_sealing());
}
@@ -1811,7 +1822,7 @@ mod tests {
let miner = Miner::new_for_tests(&spec, None);
let client = generate_dummy_client(2);
miner.update_sealing(&*client);
miner.update_sealing(&*client, ForceUpdateSealing::No);
assert!(!miner.is_currently_sealing());
}
@@ -1830,7 +1841,7 @@ mod tests {
miner.add_work_listener(Box::new(DummyNotifyWork));
let client = generate_dummy_client(2);
miner.update_sealing(&*client);
miner.update_sealing(&*client, ForceUpdateSealing::No);
assert!(miner.is_currently_sealing());
}
@@ -1868,6 +1879,7 @@ mod tests {
},
fetch,
p,
"fake_endpoint".to_owned()
)
)
}

View File

@@ -47,7 +47,7 @@ use call_contract::{CallContract, RegistryInfo};
use client::{
ScheduleInfo,
BlockChain, BlockProducer, SealedBlockImporter, ChainInfo,
AccountData, Nonce,
AccountData, Nonce, ForceUpdateSealing
};
use error::Error;
use state::StateInfo;
@@ -84,7 +84,7 @@ pub trait MinerService : Send + Sync {
where C: BlockChain + CallContract + BlockProducer + SealedBlockImporter + Nonce + Sync;
/// 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;
// Notifications

View File

@@ -225,8 +225,6 @@ impl NotifyWork for Stratum {
self.service.push_work_all(
self.dispatcher.payload(pow_hash, difficulty, number)
).unwrap_or_else(
|e| warn!(target: "stratum", "Error while pushing work: {:?}", e)
);
}
}
@@ -239,16 +237,13 @@ impl Stratum {
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),
dispatcher.clone(),
options.secret.clone(),
)?;
Ok(Stratum {
dispatcher: dispatcher,
service: stratum_svc,
})
Ok(Stratum { dispatcher, service })
}
/// Start STRATUM job dispatcher and register it in the miner

View File

@@ -40,13 +40,6 @@ impl PodState {
pub fn drain(self) -> BTreeMap<Address, PodAccount> { self.0 }
}
impl From<ethjson::blockchain::State> for PodState {
fn from(s: ethjson::blockchain::State) -> PodState {
let state = s.into_iter().map(|(addr, acc)| (addr.into(), PodAccount::from(acc))).collect();
PodState(state)
}
}
impl From<ethjson::spec::State> for PodState {
fn from(s: ethjson::spec::State) -> PodState {
let state: BTreeMap<_,_> = s.into_iter()

View File

@@ -250,7 +250,7 @@ mod tests {
let thin_rlp = ::rlp::encode(&account);
assert_eq!(::rlp::decode::<BasicAccount>(&thin_rlp).unwrap(), account);
let p = Progress::default();
let p = Progress::new();
let fat_rlps = to_fat_rlps(&keccak(&addr), &account, &AccountDB::from_hash(db.as_hash_db(), keccak(addr)), &mut Default::default(), usize::max_value(), usize::max_value(), &p).unwrap();
let fat_rlp = Rlp::new(&fat_rlps[0]).at(1).unwrap();
assert_eq!(from_fat_rlp(&mut AccountDBMut::from_hash(db.as_hash_db_mut(), keccak(addr)), fat_rlp, H256::zero()).unwrap().0, account);
@@ -276,7 +276,7 @@ mod tests {
let thin_rlp = ::rlp::encode(&account);
assert_eq!(::rlp::decode::<BasicAccount>(&thin_rlp).unwrap(), account);
let p = Progress::default();
let p = Progress::new();
let fat_rlp = to_fat_rlps(&keccak(&addr), &account, &AccountDB::from_hash(db.as_hash_db(), keccak(addr)), &mut Default::default(), usize::max_value(), usize::max_value(), &p).unwrap();
let fat_rlp = Rlp::new(&fat_rlp[0]).at(1).unwrap();
@@ -303,7 +303,7 @@ mod tests {
let thin_rlp = ::rlp::encode(&account);
assert_eq!(::rlp::decode::<BasicAccount>(&thin_rlp).unwrap(), account);
let p = Progress::default();
let p = Progress::new();
let fat_rlps = to_fat_rlps(&keccak(addr), &account, &AccountDB::from_hash(db.as_hash_db(), keccak(addr)), &mut Default::default(), 500, 1000, &p).unwrap();
let mut root = KECCAK_NULL_RLP;
let mut restored_account = None;
@@ -347,8 +347,8 @@ mod tests {
};
let mut used_code = HashSet::new();
let p1 = Progress::default();
let p2 = Progress::default();
let p1 = Progress::new();
let p2 = Progress::new();
let fat_rlp1 = to_fat_rlps(&keccak(&addr1), &account1, &AccountDB::from_hash(db.as_hash_db(), keccak(addr1)), &mut used_code, usize::max_value(), usize::max_value(), &p1).unwrap();
let fat_rlp2 = to_fat_rlps(&keccak(&addr2), &account2, &AccountDB::from_hash(db.as_hash_db(), keccak(addr2)), &mut used_code, usize::max_value(), usize::max_value(), &p2).unwrap();
assert_eq!(used_code.len(), 1);

View File

@@ -166,7 +166,7 @@ impl<'a> PowWorker<'a> {
let parent_hash = last_header.parent_hash();
let parent_total_difficulty = last_details.total_difficulty - last_header.difficulty();
trace!(target: "snapshot", "parent last written block: {}", parent_hash);
trace!(target: "snapshot", "parent last written block: #{}/{}", parent_number, parent_hash);
let num_entries = self.rlps.len();
let mut rlp_stream = RlpStream::new_list(3 + num_entries);

View File

@@ -23,8 +23,9 @@ use std::collections::{HashMap, HashSet};
use std::cmp;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering};
use hash::{keccak, KECCAK_NULL_RLP, KECCAK_EMPTY};
use std::time::Instant;
use hash::{keccak, KECCAK_NULL_RLP, KECCAK_EMPTY};
use account_db::{AccountDB, AccountDBMut};
use blockchain::{BlockChain, BlockProvider};
use engines::Engine;
@@ -36,7 +37,7 @@ use hash_db::HashDB;
use keccak_hasher::KeccakHasher;
use snappy;
use bytes::Bytes;
use parking_lot::Mutex;
use parking_lot::{Mutex, RwLock};
use journaldb::{self, Algorithm, JournalDB};
use kvdb::{KeyValueDB, DBValue};
use trie::{Trie, TrieMut};
@@ -113,21 +114,38 @@ impl Default for SnapshotConfiguration {
}
/// A progress indicator for snapshots.
#[derive(Debug, Default)]
#[derive(Debug)]
pub struct Progress {
accounts: AtomicUsize,
prev_accounts: AtomicUsize,
blocks: AtomicUsize,
size: AtomicU64,
bytes: AtomicUsize,
prev_bytes: AtomicUsize,
done: AtomicBool,
abort: AtomicBool,
last_tick: RwLock<Instant>,
}
impl Progress {
/// Create a new progress tracker.
pub fn new() -> Progress {
Progress {
accounts: AtomicUsize::new(0),
prev_accounts: AtomicUsize::new(0),
blocks: AtomicUsize::new(0),
bytes: AtomicUsize::new(0),
prev_bytes: AtomicUsize::new(0),
abort: AtomicBool::new(false),
done: AtomicBool::new(false),
last_tick: RwLock::new(Instant::now()),
}
}
/// Reset the progress.
pub fn reset(&self) {
self.accounts.store(0, Ordering::Release);
self.blocks.store(0, Ordering::Release);
self.size.store(0, Ordering::Release);
self.bytes.store(0, Ordering::Release);
self.abort.store(false, Ordering::Release);
// atomic fence here to ensure the others are written first?
@@ -142,12 +160,39 @@ impl Progress {
pub fn blocks(&self) -> usize { self.blocks.load(Ordering::Acquire) }
/// Get the written size of the snapshot in bytes.
pub fn size(&self) -> u64 { self.size.load(Ordering::Acquire) }
pub fn bytes(&self) -> usize { self.bytes.load(Ordering::Acquire) }
/// Whether the snapshot is complete.
pub fn done(&self) -> bool { self.done.load(Ordering::Acquire) }
/// Return the progress rate over the last tick (i.e. since last update).
pub fn rate(&self) -> (f64, f64) {
let last_tick = *self.last_tick.read();
let dt = last_tick.elapsed().as_secs_f64();
if dt < 1.0 {
return (0f64, 0f64);
}
let delta_acc = self.accounts.load(Ordering::Relaxed)
.saturating_sub(self.prev_accounts.load(Ordering::Relaxed));
let delta_bytes = self.bytes.load(Ordering::Relaxed)
.saturating_sub(self.prev_bytes.load(Ordering::Relaxed));
(delta_acc as f64 / dt, delta_bytes as f64 / dt)
}
/// Update state progress counters and set the last tick.
pub fn update(&self, accounts_delta: usize, bytes_delta: usize) {
*self.last_tick.write() = Instant::now();
self.prev_accounts.store(
self.accounts.fetch_add(accounts_delta, Ordering::SeqCst),
Ordering::SeqCst
);
self.prev_bytes.store(
self.bytes.fetch_add(bytes_delta, Ordering::SeqCst),
Ordering::SeqCst
);
}
}
/// Take a snapshot using the given blockchain, starting block hash, and database, writing into the given writer.
pub fn take_snapshot<W: SnapshotWriter + Send>(
chunker: Box<dyn SnapshotComponents>,
@@ -163,35 +208,34 @@ pub fn take_snapshot<W: SnapshotWriter + Send>(
let state_root = start_header.state_root();
let block_number = start_header.number();
info!("Taking snapshot starting at block {}", block_number);
info!("Taking snapshot starting at block #{}/{:?}", block_number, block_hash);
let version = chunker.current_version();
let writer = Mutex::new(writer);
let (state_hashes, block_hashes) = thread::scope(|scope| -> Result<(Vec<H256>, Vec<H256>), Error> {
let writer = &writer;
let block_guard = scope.spawn(move |_| {
let tb = scope.builder().name("Snapshot Worker - Blocks".to_string());
let block_guard = tb.spawn(move |_| {
chunk_secondary(chunker, chain, block_hash, writer, p)
});
})?;
// The number of threads must be between 1 and SNAPSHOT_SUBPARTS
assert!(processing_threads >= 1, "Cannot use less than 1 threads for creating snapshots");
let num_threads: usize = cmp::min(processing_threads, SNAPSHOT_SUBPARTS);
let num_threads = cmp::min(processing_threads, SNAPSHOT_SUBPARTS);
info!(target: "snapshot", "Using {} threads for Snapshot creation.", num_threads);
let mut state_guards = Vec::with_capacity(num_threads as usize);
let mut state_guards = Vec::with_capacity(num_threads);
for thread_idx in 0..num_threads {
let state_guard = scope.spawn(move |_| -> Result<Vec<H256>, Error> {
let tb = scope.builder().name(format!("Snapshot Worker #{} - State", thread_idx).to_string());
let state_guard = tb.spawn(move |_| -> Result<Vec<H256>, Error> {
let mut chunk_hashes = Vec::new();
for part in (thread_idx..SNAPSHOT_SUBPARTS).step_by(num_threads) {
debug!(target: "snapshot", "Chunking part {} in thread {}", part, thread_idx);
debug!(target: "snapshot", "Chunking part {} of the state at {} in thread {}", part, block_number, thread_idx);
let mut hashes = chunk_state(state_db, &state_root, writer, p, Some(part), thread_idx)?;
chunk_hashes.append(&mut hashes);
}
Ok(chunk_hashes)
});
})?;
state_guards.push(state_guard);
}
@@ -203,7 +247,8 @@ pub fn take_snapshot<W: SnapshotWriter + Send>(
state_hashes.extend(part_state_hashes);
}
debug!(target: "snapshot", "Took a snapshot of {} accounts", p.accounts.load(Ordering::SeqCst));
info!("Took a snapshot at #{} of {} accounts", block_number, p.accounts());
Ok((state_hashes, block_hashes))
}).expect("Sub-thread never panics; qed")?;
@@ -252,7 +297,7 @@ pub fn chunk_secondary<'a>(
trace!(target: "snapshot", "wrote secondary chunk. hash: {:x}, size: {}, uncompressed size: {}",
hash, size, raw_data.len());
progress.size.fetch_add(size as u64, Ordering::SeqCst);
progress.update(0, size);
chunk_hashes.push(hash);
Ok(())
};
@@ -309,8 +354,7 @@ impl<'a> StateChunker<'a> {
self.writer.lock().write_state_chunk(hash, compressed)?;
trace!(target: "snapshot", "Thread {} wrote state chunk. size: {}, uncompressed size: {}", self.thread_idx, compressed_size, raw_data.len());
self.progress.accounts.fetch_add(num_entries, Ordering::SeqCst);
self.progress.size.fetch_add(compressed_size as u64, Ordering::SeqCst);
self.progress.update(num_entries, compressed_size);
self.hashes.push(hash);
self.cur_size = 0;
@@ -361,7 +405,7 @@ pub fn chunk_state<'a>(
if let Some(part) = part {
assert!(part < 16, "Wrong chunk state part number (must be <16) in snapshot creation.");
let part_offset = MAX_SNAPSHOT_SUBPARTS / SNAPSHOT_SUBPARTS;
let part_offset = MAX_SNAPSHOT_SUBPARTS / SNAPSHOT_SUBPARTS; // 16
let mut seek_from = vec![0; 32];
seek_from[0] = (part * part_offset) as u8;
account_iter.seek(&seek_from)?;
@@ -383,7 +427,15 @@ pub fn chunk_state<'a>(
let account = ::rlp::decode(&*account_data)?;
let account_db = AccountDB::from_hash(db, account_key_hash);
let fat_rlps = account::to_fat_rlps(&account_key_hash, &account, &account_db, &mut used_code, PREFERRED_CHUNK_SIZE - chunker.chunk_size(), PREFERRED_CHUNK_SIZE, progress)?;
let fat_rlps = account::to_fat_rlps(
&account_key_hash,
&account,
&account_db,
&mut used_code,
PREFERRED_CHUNK_SIZE - chunker.chunk_size(),
PREFERRED_CHUNK_SIZE,
progress
)?;
for (i, fat_rlp) in fat_rlps.into_iter().enumerate() {
if i > 0 {
chunker.write_chunk()?;
@@ -479,7 +531,6 @@ impl StateRebuilder {
StateDB::commit_bloom(&mut batch, bloom_journal)?;
self.db.inject(&mut batch)?;
backing.write_buffered(batch);
trace!(target: "snapshot", "current state root: {:?}", self.state_root);
Ok(())
}

View File

@@ -24,7 +24,7 @@ use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use std::cmp;
use super::{ManifestData, StateRebuilder, Rebuilder, RestorationStatus, SnapshotService, MAX_CHUNK_SIZE};
use super::{ManifestData, StateRebuilder, Rebuilder, RestorationStatus, SnapshotService, Progress, MAX_CHUNK_SIZE};
use super::io::{SnapshotReader, LooseReader, SnapshotWriter, LooseWriter};
use blockchain::{BlockChain, BlockChainDB, BlockChainDBHandler};
@@ -38,10 +38,10 @@ use types::ids::BlockId;
use io::IoChannel;
use ethereum_types::H256;
use parking_lot::{Mutex, RwLock, RwLockReadGuard};
use bytes::Bytes;
use journaldb::Algorithm;
use kvdb::DBTransaction;
use parking_lot::{Mutex, RwLock, RwLockReadGuard};
use snappy;
use snapshot::error::Error::UnlinkedAncientBlockChain;
@@ -141,6 +141,7 @@ impl Restoration {
if let Some(ref mut writer) = self.writer.as_mut() {
writer.write_state_chunk(hash, chunk)?;
trace!(target: "snapshot", "Wrote {}/{} bytes of state to db/disk. Current state root: {:?}", len, chunk.len(), self.state.state_root());
}
self.state_chunks_left.remove(&hash);
@@ -194,7 +195,7 @@ impl Restoration {
}
self.guard.disarm();
trace!(target: "snapshot", "restoration finalised correctly");
trace!(target: "snapshot", "Restoration finalised correctly");
Ok(())
}
@@ -265,7 +266,7 @@ impl Service {
state_chunks: AtomicUsize::new(0),
block_chunks: AtomicUsize::new(0),
client: params.client,
progress: Default::default(),
progress: Progress::new(),
taking_snapshot: AtomicBool::new(false),
restoring_snapshot: AtomicBool::new(false),
};
@@ -398,7 +399,10 @@ impl Service {
Some(x) => x,
None => return Ok(0),
};
info!(target: "snapshot", "Migrating blocks from old db to new. Start: #{}/{:?}, Target: #{}/{:?}",
self.client.block_number(BlockId::Hash(start_hash)).unwrap_or_default(), start_hash,
self.client.block_number(BlockId::Hash(target_hash)).unwrap_or_default(), target_hash,
);
let mut batch = DBTransaction::new();
let mut parent_hash = start_hash;
while parent_hash != target_hash {
@@ -440,10 +444,10 @@ impl Service {
next_chain.commit();
next_db.key_value().flush().expect("DB flush failed.");
batch = DBTransaction::new();
}
if block_number % 10_000 == 0 {
info!(target: "snapshot", "Block restoration at #{}", block_number);
if block_number % 10_000 == 0 {
info!(target: "snapshot", "Block restoration at #{}", block_number);
}
}
}
@@ -468,11 +472,13 @@ impl Service {
if self.progress.done() || !self.taking_snapshot.load(Ordering::SeqCst) { return }
let p = &self.progress;
info!("Snapshot: {} accounts {} blocks {} bytes", p.accounts(), p.blocks(), p.size());
info!("Snapshot: {} accounts, {} blocks, {} bytes", p.accounts(), p.blocks(), p.bytes());
let rate = p.rate();
debug!(target: "snapshot", "Current progress rate: {:.0} acc/s, {:.0} bytes/s (compressed)", rate.0, rate.1);
}
/// Take a snapshot at the block with the given number.
/// calling this while a restoration is in progress or vice versa
/// Calling this while a restoration is in progress or vice versa
/// will lead to a race condition where the first one to finish will
/// have their produced snapshot overwritten.
pub fn take_snapshot(&self, client: &Client, num: u64) -> Result<(), Error> {
@@ -482,45 +488,40 @@ impl Service {
}
info!("Taking snapshot at #{}", num);
self.progress.reset();
{
scopeguard::defer! {{
self.taking_snapshot.store(false, Ordering::SeqCst);
}}
let start_time = std::time::Instant::now();
self.progress.reset();
let temp_dir = self.temp_snapshot_dir();
let snapshot_dir = self.snapshot_dir();
let temp_dir = self.temp_snapshot_dir();
let snapshot_dir = self.snapshot_dir();
let _ = fs::remove_dir_all(&temp_dir);
let _ = fs::remove_dir_all(&temp_dir); // expected to fail
let writer = LooseWriter::new(temp_dir.clone())?;
let writer = LooseWriter::new(temp_dir.clone())?;
let guard = Guard::new(temp_dir.clone());
let res = client.take_snapshot(writer, BlockId::Number(num), &self.progress);
self.taking_snapshot.store(false, Ordering::SeqCst);
if let Err(e) = res {
if client.chain_info().best_block_number >= num + client.pruning_history() {
// The state we were snapshotting was pruned before we could finish.
info!("Periodic snapshot failed: block state pruned. Run with a longer `--pruning-history` or with `--no-periodic-snapshot`");
return Err(e);
} else {
return Err(e);
let guard = Guard::new(temp_dir.clone());
let _ = client.take_snapshot(writer, BlockId::Number(num), &self.progress)?;
info!("Finished taking snapshot at #{}, in {:.0?}", num, start_time.elapsed());
// destroy the old snapshot reader.
let mut reader = self.reader.write();
*reader = None;
if snapshot_dir.exists() {
trace!(target: "snapshot", "Removing previous snapshot at {:?}", &snapshot_dir);
fs::remove_dir_all(&snapshot_dir)?;
}
fs::rename(temp_dir, &snapshot_dir)?;
trace!(target: "snapshot", "Moved new snapshot into place at {:?}", &snapshot_dir);
*reader = Some(LooseReader::new(snapshot_dir)?);
guard.disarm();
Ok(())
}
info!("Finished taking snapshot at #{}", num);
let mut reader = self.reader.write();
// destroy the old snapshot reader.
*reader = None;
if snapshot_dir.exists() {
fs::remove_dir_all(&snapshot_dir)?;
}
fs::rename(temp_dir, &snapshot_dir)?;
*reader = Some(LooseReader::new(snapshot_dir)?);
guard.disarm();
Ok(())
}
/// Initialize the restoration synchronously.
@@ -639,13 +640,19 @@ impl Service {
Ok(())
}
/// Import a previous chunk at the given path. Returns whether the block was imported or not
fn import_prev_chunk(&self, restoration: &mut Option<Restoration>, manifest: &ManifestData, file: io::Result<fs::DirEntry>) -> Result<bool, Error> {
/// Import a previous chunk at the given path. Returns whether the chunk was imported or not
fn import_prev_chunk(
&self,
restoration: &mut Option<Restoration>,
manifest: &ManifestData,
file: io::Result<fs::DirEntry>
) -> Result<bool, Error> {
let file = file?;
let path = file.path();
let mut file = File::open(path.clone())?;
let mut buffer = Vec::new();
let filesize = file.metadata()?.len();
let mut buffer = Vec::with_capacity(filesize as usize + 1); // +1 for EOF
file.read_to_end(&mut buffer)?;
let hash = keccak(&buffer);
@@ -655,6 +662,7 @@ impl Service {
} else if manifest.state_hashes.contains(&hash) {
true
} else {
warn!(target: "snapshot", "Hash of the content of {:?} not present in the manifest block/state hashes.", path);
return Ok(false);
};
@@ -665,11 +673,10 @@ impl Service {
Ok(true)
}
// finalize the restoration. this accepts an already-locked
// restoration as an argument -- so acquiring it again _will_
// lead to deadlock.
// Finalize the restoration. This accepts an already-locked restoration as an argument -- so
// acquiring it again _will_ lead to deadlock.
fn finalize_restoration(&self, rest: &mut Option<Restoration>) -> Result<(), Error> {
trace!(target: "snapshot", "finalizing restoration");
trace!(target: "snapshot", "Finalizing restoration");
*self.status.lock() = RestorationStatus::Finalizing;
let recover = rest.as_ref().map_or(false, |rest| rest.writer.is_some());
@@ -680,7 +687,7 @@ impl Service {
.unwrap_or(Ok(()))?;
let migrated_blocks = self.migrate_blocks()?;
info!(target: "snapshot", "Migrated {} ancient blocks", migrated_blocks);
info!(target: "snapshot", "Migrated {} ancient blocks from the old DB", migrated_blocks);
// replace the Client's database with the new one (restart the Client).
self.client.restore_db(&*self.restoration_db().to_string_lossy())?;
@@ -692,11 +699,11 @@ impl Service {
let snapshot_dir = self.snapshot_dir();
if snapshot_dir.exists() {
trace!(target: "snapshot", "removing old snapshot dir at {}", snapshot_dir.to_string_lossy());
trace!(target: "snapshot", "Removing old snapshot dir at {}", snapshot_dir.to_string_lossy());
fs::remove_dir_all(&snapshot_dir)?;
}
trace!(target: "snapshot", "copying restored snapshot files over");
trace!(target: "snapshot", "Copying restored snapshot files over");
fs::rename(self.temp_recovery_dir(), &snapshot_dir)?;
*reader = Some(LooseReader::new(snapshot_dir)?);
@@ -767,7 +774,7 @@ impl Service {
false => Ok(())
}
}
other => other.map(drop),
Err(e) => Err(e)
};
(res, db)
}

View File

@@ -27,7 +27,7 @@ use types::basic_account::BasicAccount;
use blockchain::{BlockChain, BlockChainDB};
use client::{Client, ChainInfo};
use engines::Engine;
use snapshot::{StateRebuilder};
use snapshot::{StateRebuilder, Progress};
use snapshot::io::{SnapshotReader, PackedWriter, PackedReader};
use tempdir::TempDir;
@@ -138,7 +138,7 @@ pub fn snap(client: &Client) -> (Box<dyn SnapshotReader>, TempDir) {
let tempdir = TempDir::new("").unwrap();
let path = tempdir.path().join("file");
let writer = PackedWriter::new(&path).unwrap();
let progress = Default::default();
let progress = Progress::new();
let hash = client.chain_info().best_block_hash;
client.take_snapshot(writer, BlockId::Hash(hash), &progress).unwrap();

Some files were not shown because too many files have changed in this diff Show More