diff --git a/.gitignore b/.gitignore index 41ad64138028..111f7a88aeac 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ # If you find yourself ignoring temporary files generated by your text editor # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile ~/.gitignore_global - +tests/files/VMTests/RandomTests/* /tmp */**/*un~ */**/*.test diff --git a/.gitmodules b/.gitmodules index fbd82891d081..5bb332a5c048 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "cmd/mist/assets/ext/expanse.js"] path = cmd/mist/assets/ext/expanse.js - url = https://github.com/expanse-project/web3.js + url = https://github.com/expanse-org/web3.js diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 25b3793337af..9afe9a2a96da 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -5,11 +5,6 @@ "./..." ], "Deps": [ - { - "ImportPath": "code.google.com/p/go-uuid/uuid", - "Comment": "null-12", - "Rev": "7dda39b2e7d5e265014674c5af696ba4186679e9" - }, { "ImportPath": "github.com/codegangsta/cli", "Comment": "1.2.0-95-g9b2bd2b", @@ -21,7 +16,7 @@ }, { "ImportPath": "github.com/expanse-project/ethash", - "Comment": "v23.1-227-g8f6ccaa", + "Comment": "v23.1-234-g062e40a", "Rev": "8f6ccaaef9b418553807a73a95cb5f49cd3ea39f" }, { @@ -51,7 +46,7 @@ }, { "ImportPath": "github.com/mattn/go-isatty", - "Rev": "fdbe02a1b44e75977b2690062b83cf507d70c013" + "Rev": "7fcbc72f853b92b5720db4a6b8482be612daef24" }, { "ImportPath": "github.com/mattn/go-runewidth", @@ -62,6 +57,10 @@ "ImportPath": "github.com/nsf/termbox-go", "Rev": "675ffd907b7401b8a709a5ef2249978af5616bb2" }, + { + "ImportPath": "github.com/pborman/uuid", + "Rev": "cccd189d45f7ac3368a0d127efb7f4d08ae0b655" + }, { "ImportPath": "github.com/peterh/liner", "Rev": "29f6a646557d83e2b6e9ba05c45fbea9c006dbe8" diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h index 6ca6cc036494..849325a59612 100644 --- a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/endian.h @@ -35,10 +35,14 @@ #elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) #define ethash_swap_u32(input_) bswap32(input_) #define ethash_swap_u64(input_) bswap64(input_) +#elif defined(__OpenBSD__) +#include +#define ethash_swap_u32(input_) swap32(input_) +#define ethash_swap_u64(input_) swap64(input_) #else // posix #include -#define ethash_swap_u32(input_) __bswap_32(input_) -#define ethash_swap_u64(input_) __bswap_64(input_) +#define ethash_swap_u32(input_) bswap_32(input_) +#define ethash_swap_u64(input_) bswap_64(input_) #endif diff --git a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h index ee5252b5b307..e11090f6ac45 100644 --- a/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h +++ b/Godeps/_workspace/src/github.com/expanse-project/ethash/src/libethash/fnv.h @@ -29,6 +29,10 @@ extern "C" { #define FNV_PRIME 0x01000193 +/* The FNV-1 spec multiplies the prime with the input one byte (octet) in turn. + We instead multiply it with the full 32-bit input. + This gives a different result compared to a canonical FNV-1 implementation. +*/ static inline uint32_t fnv_hash(uint32_t const x, uint32_t const y) { return x * FNV_PRIME ^ y; diff --git a/Godeps/_workspace/src/github.com/mattn/go-isatty/LICENSE b/Godeps/_workspace/src/github.com/mattn/go-isatty/LICENSE new file mode 100644 index 000000000000..65dc692b6b17 --- /dev/null +++ b/Godeps/_workspace/src/github.com/mattn/go-isatty/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Godeps/_workspace/src/github.com/mattn/go-isatty/isatty_bsd.go b/Godeps/_workspace/src/github.com/mattn/go-isatty/isatty_bsd.go index 035274751250..e6282b529a2d 100644 --- a/Godeps/_workspace/src/github.com/mattn/go-isatty/isatty_bsd.go +++ b/Godeps/_workspace/src/github.com/mattn/go-isatty/isatty_bsd.go @@ -1,4 +1,4 @@ -// +build darwin freebsd +// +build darwin freebsd openbsd netbsd package isatty diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/CONTRIBUTORS b/Godeps/_workspace/src/github.com/pborman/uuid/CONTRIBUTORS new file mode 100644 index 000000000000..b382a04eda9d --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/CONTRIBUTORS @@ -0,0 +1 @@ +Paul Borman diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/LICENSE b/Godeps/_workspace/src/github.com/pborman/uuid/LICENSE similarity index 96% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/LICENSE rename to Godeps/_workspace/src/github.com/pborman/uuid/LICENSE index ab6b011a1093..5dc68268d900 100644 --- a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/LICENSE +++ b/Godeps/_workspace/src/github.com/pborman/uuid/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 Google Inc. All rights reserved. +Copyright (c) 2009,2014 Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/dce.go b/Godeps/_workspace/src/github.com/pborman/uuid/dce.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/dce.go rename to Godeps/_workspace/src/github.com/pborman/uuid/dce.go diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/doc.go b/Godeps/_workspace/src/github.com/pborman/uuid/doc.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/doc.go rename to Godeps/_workspace/src/github.com/pborman/uuid/doc.go diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/hash.go b/Godeps/_workspace/src/github.com/pborman/uuid/hash.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/hash.go rename to Godeps/_workspace/src/github.com/pborman/uuid/hash.go diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/json.go b/Godeps/_workspace/src/github.com/pborman/uuid/json.go new file mode 100644 index 000000000000..760580a504f4 --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/json.go @@ -0,0 +1,30 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import "errors" + +func (u UUID) MarshalJSON() ([]byte, error) { + if len(u) == 0 { + return []byte(`""`), nil + } + return []byte(`"` + u.String() + `"`), nil +} + +func (u *UUID) UnmarshalJSON(data []byte) error { + if len(data) == 0 || string(data) == `""` { + return nil + } + if len(data) < 2 || data[0] != '"' || data[len(data)-1] != '"' { + return errors.New("invalid UUID format") + } + data = data[1 : len(data)-1] + uu := Parse(string(data)) + if uu == nil { + return errors.New("invalid UUID format") + } + *u = uu + return nil +} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go new file mode 100644 index 000000000000..b5eae092472c --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go @@ -0,0 +1,32 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "encoding/json" + "reflect" + "testing" +) + +var testUUID = Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479") + +func TestJSON(t *testing.T) { + type S struct { + ID1 UUID + ID2 UUID + } + s1 := S{ID1: testUUID} + data, err := json.Marshal(&s1) + if err != nil { + t.Fatal(err) + } + var s2 S + if err := json.Unmarshal(data, &s2); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(&s1, &s2) { + t.Errorf("got %#v, want %#v", s2, s1) + } +} diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/node.go b/Godeps/_workspace/src/github.com/pborman/uuid/node.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/node.go rename to Godeps/_workspace/src/github.com/pborman/uuid/node.go diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go new file mode 100644 index 000000000000..3b3d1430d513 --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go @@ -0,0 +1,66 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "flag" + "runtime" + "testing" + "time" +) + +// This test is only run when --regressions is passed on the go test line. +var regressions = flag.Bool("regressions", false, "run uuid regression tests") + +// TestClockSeqRace tests for a particular race condition of returning two +// identical Version1 UUIDs. The duration of 1 minute was chosen as the race +// condition, before being fixed, nearly always occured in under 30 seconds. +func TestClockSeqRace(t *testing.T) { + if !*regressions { + t.Skip("skipping regression tests") + } + duration := time.Minute + + done := make(chan struct{}) + defer close(done) + + ch := make(chan UUID, 10000) + ncpu := runtime.NumCPU() + switch ncpu { + case 0, 1: + // We can't run the test effectively. + t.Skip("skipping race test, only one CPU detected") + return + default: + runtime.GOMAXPROCS(ncpu) + } + for i := 0; i < ncpu; i++ { + go func() { + for { + select { + case <-done: + return + case ch <- NewUUID(): + } + } + }() + } + + uuids := make(map[string]bool) + cnt := 0 + start := time.Now() + for u := range ch { + s := u.String() + if uuids[s] { + t.Errorf("duplicate uuid after %d in %v: %s", cnt, time.Since(start), s) + return + } + uuids[s] = true + if time.Since(start) > duration { + return + } + cnt++ + } +} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/sql.go b/Godeps/_workspace/src/github.com/pborman/uuid/sql.go new file mode 100644 index 000000000000..2d7679e2af9a --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/sql.go @@ -0,0 +1,40 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "errors" + "fmt" +) + +// Scan implements sql.Scanner so UUIDs can be read from databases transparently +// Currently, database types that map to string and []byte are supported. Please +// consult database-specific driver documentation for matching types. +func (uuid *UUID) Scan(src interface{}) error { + switch src.(type) { + case string: + // see uuid.Parse for required string format + parsed := Parse(src.(string)) + + if parsed == nil { + return errors.New("Scan: invalid UUID format") + } + + *uuid = parsed + case []byte: + // assumes a simple slice of bytes, just check validity and store + u := UUID(src.([]byte)) + + if u.Variant() == Invalid { + return errors.New("Scan: invalid UUID format") + } + + *uuid = u + default: + return fmt.Errorf("Scan: unable to scan type %T into UUID", src) + } + + return nil +} diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go new file mode 100644 index 000000000000..d643567eeb82 --- /dev/null +++ b/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go @@ -0,0 +1,53 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package uuid + +import ( + "strings" + "testing" +) + +func TestScan(t *testing.T) { + var stringTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d479" + var byteTest []byte = Parse(stringTest) + var badTypeTest int = 6 + var invalidTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d4" + var invalidByteTest []byte = Parse(invalidTest) + + var uuid UUID + err := (&uuid).Scan(stringTest) + if err != nil { + t.Fatal(err) + } + + err = (&uuid).Scan(byteTest) + if err != nil { + t.Fatal(err) + } + + err = (&uuid).Scan(badTypeTest) + if err == nil { + t.Error("int correctly parsed and shouldn't have") + } + if !strings.Contains(err.Error(), "unable to scan type") { + t.Error("attempting to parse an int returned an incorrect error message") + } + + err = (&uuid).Scan(invalidTest) + if err == nil { + t.Error("invalid uuid was parsed without error") + } + if !strings.Contains(err.Error(), "invalid UUID") { + t.Error("attempting to parse an invalid UUID returned an incorrect error message") + } + + err = (&uuid).Scan(invalidByteTest) + if err == nil { + t.Error("invalid byte uuid was parsed without error") + } + if !strings.Contains(err.Error(), "invalid UUID") { + t.Error("attempting to parse an invalid byte UUID returned an incorrect error message") + } +} diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/time.go b/Godeps/_workspace/src/github.com/pborman/uuid/time.go similarity index 93% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/time.go rename to Godeps/_workspace/src/github.com/pborman/uuid/time.go index b9369c200b90..7ebc9bef1090 100644 --- a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/time.go +++ b/Godeps/_workspace/src/github.com/pborman/uuid/time.go @@ -40,15 +40,15 @@ func (t Time) UnixTime() (sec, nsec int64) { } // GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and -// adjusts the clock sequence as needed. An error is returned if the current -// time cannot be determined. -func GetTime() (Time, error) { +// clock sequence as well as adjusting the clock sequence as needed. An error +// is returned if the current time cannot be determined. +func GetTime() (Time, uint16, error) { defer mu.Unlock() mu.Lock() return getTime() } -func getTime() (Time, error) { +func getTime() (Time, uint16, error) { t := timeNow() // If we don't have a clock sequence already, set one. @@ -63,7 +63,7 @@ func getTime() (Time, error) { clock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000 } lasttime = now - return Time(now), nil + return Time(now), clock_seq, nil } // ClockSequence returns the current clock sequence, generating one if not diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/util.go b/Godeps/_workspace/src/github.com/pborman/uuid/util.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/util.go rename to Godeps/_workspace/src/github.com/pborman/uuid/util.go diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid.go b/Godeps/_workspace/src/github.com/pborman/uuid/uuid.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid.go rename to Godeps/_workspace/src/github.com/pborman/uuid/uuid.go diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/uuid_test.go rename to Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version1.go b/Godeps/_workspace/src/github.com/pborman/uuid/version1.go similarity index 93% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version1.go rename to Godeps/_workspace/src/github.com/pborman/uuid/version1.go index 63580044b6c8..0127eacfab8a 100644 --- a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version1.go +++ b/Godeps/_workspace/src/github.com/pborman/uuid/version1.go @@ -19,7 +19,7 @@ func NewUUID() UUID { SetNodeInterface("") } - now, err := GetTime() + now, seq, err := GetTime() if err != nil { return nil } @@ -34,7 +34,7 @@ func NewUUID() UUID { binary.BigEndian.PutUint32(uuid[0:], time_low) binary.BigEndian.PutUint16(uuid[4:], time_mid) binary.BigEndian.PutUint16(uuid[6:], time_hi) - binary.BigEndian.PutUint16(uuid[8:], clock_seq) + binary.BigEndian.PutUint16(uuid[8:], seq) copy(uuid[10:], nodeID) return uuid diff --git a/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version4.go b/Godeps/_workspace/src/github.com/pborman/uuid/version4.go similarity index 100% rename from Godeps/_workspace/src/code.google.com/p/go-uuid/uuid/version4.go rename to Godeps/_workspace/src/github.com/pborman/uuid/version4.go diff --git a/Makefile b/Makefile index 3539c4c965cb..bf4f0eed7245 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,30 @@ gexp: @echo "Done building." @echo "Run \"$(GOBIN)/gexp\" to launch gexp." +geth-cross: geth-linux geth-darwin geth-windows geth-android + @echo "Full cross compilation done:" + @ls -l $(GOBIN)/geth-* + +geth-linux: xgo + build/env.sh $(GOBIN)/xgo --dest=$(GOBIN) --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 --targets=linux/* -v ./cmd/geth + @echo "Linux cross compilation done:" + @ls -l $(GOBIN)/geth-linux-* + +geth-darwin: xgo + build/env.sh $(GOBIN)/xgo --dest=$(GOBIN) --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 --targets=darwin/* -v ./cmd/geth + @echo "Darwin cross compilation done:" + @ls -l $(GOBIN)/geth-darwin-* + +geth-windows: xgo + build/env.sh $(GOBIN)/xgo --dest=$(GOBIN) --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 --targets=windows/* -v ./cmd/geth + @echo "Windows cross compilation done:" + @ls -l $(GOBIN)/geth-windows-* + +geth-android: xgo + build/env.sh $(GOBIN)/xgo --dest=$(GOBIN) --deps=https://gmplib.org/download/gmp/gmp-6.0.0a.tar.bz2 --targets=android-16/*,android-21/* -v ./cmd/geth + @echo "Android cross compilation done:" + @ls -l $(GOBIN)/geth-android-* + evm: build/env.sh $(GOROOT)/bin/go install -v $(shell build/ldflags.sh) ./cmd/evm @echo "Done building." @@ -28,5 +52,8 @@ test: all travis-test-with-coverage: all build/env.sh build/test-global-coverage.sh +xgo: + build/env.sh go get github.com/karalabe/xgo + clean: rm -fr build/_workspace/pkg/ Godeps/_workspace/pkg $(GOBIN)/* diff --git a/VERSION b/VERSION new file mode 100644 index 000000000000..23aa8390630c --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.2.2 diff --git a/build/ldflags.sh b/build/ldflags.sh index 9e17ca49862e..3f055d416ff1 100755 --- a/build/ldflags.sh +++ b/build/ldflags.sh @@ -7,7 +7,12 @@ if [ ! -f "build/env.sh" ]; then exit 2 fi +# Since Go 1.5, the separator char for link time assignments +# is '=' and using ' ' prints a warning. However, Go < 1.5 does +# not support using '='. +sep=$(go version | awk '{ if ($3 >= "go1.5" || index($3, "devel")) print "="; else print " "; }' -) + # set gitCommit when running from a Git checkout. if [ -f ".git/HEAD" ]; then - echo "-ldflags '-X main.gitCommit $(git rev-parse HEAD)'" + echo "-ldflags '-X main.gitCommit$sep$(git rev-parse HEAD)'" fi diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index d8989b2385bd..5d659845ba42 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -34,7 +34,7 @@ import ( func main() { var ( - listenAddr = flag.String("addr", ":30301", "listen address") + listenAddr = flag.String("addr", ":42787", "listen address") genKey = flag.String("genkey", "", "generate a node key and quit") nodeKeyFile = flag.String("nodekey", "", "private key filename") nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") diff --git a/cmd/gexp/blocktestcmd.go b/cmd/gexp/blocktestcmd.go index 58d3c60e0c4f..cec14509a513 100644 --- a/cmd/gexp/blocktestcmd.go +++ b/cmd/gexp/blocktestcmd.go @@ -22,7 +22,6 @@ import ( "github.com/codegangsta/cli" "github.com/expanse-project/go-expanse/cmd/utils" - "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/exp" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/tests" @@ -92,7 +91,7 @@ func runBlockTest(ctx *cli.Context) { if err != nil { utils.Fatalf("%v", err) } - defer expanse.Stop() + if rpc { fmt.Println("Block Test post state validated, starting RPC interface.") startEth(ctx, expanse) @@ -103,7 +102,7 @@ func runBlockTest(ctx *cli.Context) { func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*exp.Expanse, error) { cfg := utils.MakeEthConfig(ClientIdentifier, Version, ctx) - cfg.NewDB = func(path string) (common.Database, error) { return ethdb.NewMemDatabase() } + cfg.NewDB = func(path string) (ethdb.Database, error) { return ethdb.NewMemDatabase() } cfg.MaxPeers = 0 // disable network cfg.Shh = false // disable whisper cfg.NAT = nil // disable port mapping @@ -112,25 +111,25 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*exp.Expanse, err if err != nil { return nil, err } - // if err := expanse.Start(); err != nil { - // return nil, err - // } // import the genesis block expanse.ResetWithGenesisBlock(test.Genesis) - // import pre accounts - statedb, err := test.InsertPreState(expanse) + _, err = test.InsertPreState(expanse) + if err != nil { return expanse, fmt.Errorf("InsertPreState: %v", err) } - if err := test.TryBlocksInsert(expanse.ChainManager()); err != nil { + cm := expanse.ChainManager() + validBlocks, err := test.TryBlocksInsert(cm) + if err != nil { return expanse, fmt.Errorf("Block Test load error: %v", err) } - - if err := test.ValidatePostState(statedb); err != nil { + newDB := cm.State() + if err := test.ValidatePostState(newDB); err != nil { return expanse, fmt.Errorf("post state validation failed: %v", err) } - return expanse, nil + return expanse, test.ValidateImportedHeaders(cm, validBlocks) + } diff --git a/cmd/gexp/chaincmd.go b/cmd/gexp/chaincmd.go index 3ba3a5f663f5..54b375532e0b 100644 --- a/cmd/gexp/chaincmd.go +++ b/cmd/gexp/chaincmd.go @@ -24,11 +24,13 @@ import ( "time" "github.com/codegangsta/cli" + "github.com/expanse-project/go-expanse/cmd/utils" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/logger/glog" ) @@ -191,7 +193,7 @@ func hashish(x string) bool { return err != nil } -func closeAll(dbs ...common.Database) { +func closeAll(dbs ...ethdb.Database) { for _, db := range dbs { db.Close() } diff --git a/cmd/gexp/js.go b/cmd/gexp/js.go index 40fd2a43eb97..cd4ebd4749c0 100644 --- a/cmd/gexp/js.go +++ b/cmd/gexp/js.go @@ -121,7 +121,7 @@ func keywordCompleter(line string) []string { } func apiWordCompleter(line string, pos int) (head string, completions []string, tail string) { - if len(line) == 0 { + if len(line) == 0 || pos == 0 { return "", nil, "" } diff --git a/cmd/gexp/js_test.go b/cmd/gexp/js_test.go index 5772a0beace5..0dd65acced17 100644 --- a/cmd/gexp/js_test.go +++ b/cmd/gexp/js_test.go @@ -92,7 +92,7 @@ func testREPL(t *testing.T, config func(*exp.Config)) (string, *testjethre, *exp db, _ := ethdb.NewMemDatabase() - core.WriteGenesisBlockForTesting(db, common.HexToAddress(testAddress), common.String2Big(testBalance)) + core.WriteGenesisBlockForTesting(db, core.GenesisAccount{common.HexToAddress(testAddress), common.String2Big(testBalance)}) ks := crypto.NewKeyStorePlain(filepath.Join(tmp, "keystore")) am := accounts.NewManager(ks) conf := &exp.Config{ @@ -103,7 +103,7 @@ func testREPL(t *testing.T, config func(*exp.Config)) (string, *testjethre, *exp Name: "test", SolcPath: testSolcPath, PowTest: true, - NewDB: func(path string) (common.Database, error) { return db, nil }, + NewDB: func(path string) (ethdb.Database, error) { return db, nil }, } if config != nil { config(conf) diff --git a/cmd/gexp/main.go b/cmd/gexp/main.go index d47bb148fd43..e276c7dca41f 100644 --- a/cmd/gexp/main.go +++ b/cmd/gexp/main.go @@ -47,17 +47,23 @@ import ( ) const ( + ClientIdentifier = "Gexp" - Version = "1.1.4" + Version = "1.2.2" VersionMajor = 1 - VersionMinor = 1 - VersionPatch = 4 + VersionMinor = 2 + VersionPatch = 2 ) var ( gitCommit string // set via linker flagg nodeNameVersion string app *cli.App + + ExtraDataFlag = cli.StringFlag{ + Name: "extradata", + Usage: "Extra data for the miner", + } ) func init() { @@ -283,6 +289,7 @@ JavaScript API. See https://github.com/expanse-project/go-expanse/wiki/Javascipt utils.DataDirFlag, utils.BlockchainVersionFlag, utils.OlympicFlag, + utils.EthVersionFlag, utils.CacheFlag, utils.JSpathFlag, utils.ListenPortFlag, @@ -307,6 +314,7 @@ JavaScript API. See https://github.com/expanse-project/go-expanse/wiki/Javascipt utils.IPCPathFlag, utils.ExecFlag, utils.WhisperEnabledFlag, + utils.DevModeFlag, utils.VMDebugFlag, utils.VMForceJitFlag, utils.VMJitCacheFlag, @@ -329,10 +337,12 @@ JavaScript API. See https://github.com/expanse-project/go-expanse/wiki/Javascipt utils.GpobaseStepDownFlag, utils.GpobaseStepUpFlag, utils.GpobaseCorrectionFactorFlag, + ExtraDataFlag, } app.Before = func(ctx *cli.Context) error { utils.SetupLogger(ctx) utils.SetupVM(ctx) + utils.SetupEth(ctx) if ctx.GlobalBool(utils.PProfEanbledFlag.Name) { utils.StartPProf(ctx) } @@ -351,6 +361,14 @@ func main() { } } +// makeExtra resolves extradata for the miner from a flag or returns a default. +func makeExtra(ctx *cli.Context) []byte { + if ctx.GlobalIsSet(ExtraDataFlag.Name) { + return []byte(ctx.GlobalString(ExtraDataFlag.Name)) + } + return makeDefaultExtra() +} + func makeDefaultExtra() []byte { var clientInfo = struct { Version uint @@ -379,7 +397,7 @@ func run(ctx *cli.Context) { } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) - cfg.ExtraData = makeDefaultExtra() + cfg.ExtraData = makeExtra(ctx) expanse, err := exp.New(cfg) if err != nil { @@ -400,7 +418,7 @@ func attach(ctx *cli.Context) { client, err = comms.ClientFromEndpoint(ctx.Args().First(), codec.JSON) } else { cfg := comms.IpcConfig{ - Endpoint: ctx.GlobalString(utils.IPCPathFlag.Name), + Endpoint: utils.IpcSocketPath(ctx), } client, err = comms.NewIpcClient(cfg, codec.JSON) } @@ -427,6 +445,9 @@ func console(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) + + cfg.ExtraData = makeExtra(ctx) + expanse, err := exp.New(cfg) if err != nil { utils.Fatalf("%v", err) @@ -525,17 +546,16 @@ func blockRecovery(ctx *cli.Context) { var block *types.Block if arg[0] == '#' { - block = core.GetBlockByNumber(blockDb, common.String2Big(arg[1:]).Uint64()) + block = core.GetBlock(blockDb, core.GetCanonicalHash(blockDb, common.String2Big(arg[1:]).Uint64())) } else { - block = core.GetBlockByHash(blockDb, common.HexToHash(arg)) + block = core.GetBlock(blockDb, common.HexToHash(arg)) } if block == nil { glog.Fatalln("block not found. Recovery failed") } - err = core.WriteHead(blockDb, block) - if err != nil { + if err = core.WriteHeadBlockHash(blockDb, block.Hash()); err != nil { glog.Fatalln("block write err", err) } glog.Infof("Recovery succesful. New HEAD %x\n", block.Hash()) diff --git a/cmd/gexp/monitorcmd.go b/cmd/gexp/monitorcmd.go index 945eab5beb6a..09c822992b26 100644 --- a/cmd/gexp/monitorcmd.go +++ b/cmd/gexp/monitorcmd.go @@ -289,7 +289,7 @@ func updateChart(metric string, data []float64, base *int, chart *termui.LineCha } } unit, scale := 0, 1.0 - for high >= 1000 { + for high >= 1000 && unit+1 < len(dataUnits) { high, unit, scale = high/1000, unit+1, scale*1000 } // If the unit changes, re-create the chart (hack to set max height...) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 7df2d66334ca..7c72bad2c493 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -122,6 +122,10 @@ var ( Name: "genesis", Usage: "Inserts/Overwrites the genesis block (json format)", } + DevModeFlag = cli.BoolFlag{ + Name: "dev", + Usage: "Developer mode. This mode creates a private network and sets several debugging flags", + } IdentityFlag = cli.StringFlag{ Name: "identity", Usage: "Custom node name", @@ -139,6 +143,11 @@ var ( Name: "olympic", Usage: "Use olympic style protocol", } + EthVersionFlag = cli.IntFlag{ + Name: "eth", + Value: 62, + Usage: "Highest eth protocol to advertise (temporary, dev option)", + } // miner settings MinerThreadsFlag = cli.IntFlag{ @@ -406,7 +415,8 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *exp.Config { glog.V(logger.Error).Infoln("WARNING: No etherbase set and no accounts found as default") } - return &exp.Config{ + + cfg := &exp.Config{ Name: common.MakeName(clientID, version), DataDir: ctx.GlobalString(DataDirFlag.Name), GenesisNonce: ctx.GlobalInt(GenesisNonceFlag.Name), @@ -443,6 +453,33 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *exp.Config { SolcPath: ctx.GlobalString(SolcPathFlag.Name), AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name), } + + if ctx.GlobalBool(DevModeFlag.Name) { + if !ctx.GlobalIsSet(VMDebugFlag.Name) { + cfg.VmDebug = true + } + if !ctx.GlobalIsSet(MaxPeersFlag.Name) { + cfg.MaxPeers = 0 + } + if !ctx.GlobalIsSet(GasPriceFlag.Name) { + cfg.GasPrice = new(big.Int) + } + if !ctx.GlobalIsSet(ListenPortFlag.Name) { + cfg.Port = "0" // auto port + } + if !ctx.GlobalIsSet(WhisperEnabledFlag.Name) { + cfg.Shh = true + } + if !ctx.GlobalIsSet(DataDirFlag.Name) { + cfg.DataDir = os.TempDir() + "/ethereum_dev_mode" + } + cfg.PowTest = true + cfg.DevMode = true + + glog.V(logger.Info).Infoln("dev mode enabled") + } + + return cfg } // SetupLogger configures glog from the logging-related command line flags. @@ -460,8 +497,20 @@ func SetupVM(ctx *cli.Context) { vm.SetJITCacheSize(ctx.GlobalInt(VMJitCacheFlag.Name)) } +// SetupEth configures the eth packages global settings +func SetupEth(ctx *cli.Context) { + version := ctx.GlobalInt(EthVersionFlag.Name) + for len(exp.ProtocolVersions) > 0 && exp.ProtocolVersions[0] > uint(version) { + exp.ProtocolVersions = exp.ProtocolVersions[1:] + exp.ProtocolLengths = exp.ProtocolLengths[1:] + } + if len(exp.ProtocolVersions) == 0 { + Fatalf("No valid eth protocols remaining") + } +} + // MakeChain creates a chain manager from set command line flags. -func MakeChain(ctx *cli.Context) (chain *core.ChainManager, chainDb common.Database) { +func MakeChain(ctx *cli.Context) (chain *core.ChainManager, chainDb ethdb.Database) { datadir := ctx.GlobalString(DataDirFlag.Name) cache := ctx.GlobalInt(CacheFlag.Name) diff --git a/common/README.md b/common/README.md index a1ddd98cc6b4..0c2c71556918 100644 --- a/common/README.md +++ b/common/README.md @@ -1,49 +1,53 @@ -# ethutil +# common [![Build Status](https://travis-ci.org/expanse/go-expanse.png?branch=master)](https://travis-ci.org/expanse/go-expanse) -The ethutil package contains the expanse utility library. +The common package contains the expanse utility library. # Installation -`go get github.com/expanse-project/ethutil-go` +As a subdirectory the main go-ethereum repository, you get it with +`go get github.com/expanse-project/go-expanse`. # Usage ## RLP (Recursive Linear Prefix) Encoding + RLP Encoding is an encoding scheme utilized by the Expanse project. It encodes any native value or list to string. More in depth information about the Encoding scheme see the [Wiki](http://wiki.expanse.org/index.php/RLP) article. + ```go -rlp := ethutil.Encode("doge") +rlp := common.Encode("doge") fmt.Printf("%q\n", rlp) // => "\0x83dog" -rlp = ethutil.Encode([]interface{}{"dog", "cat"}) +rlp = common.Encode([]interface{}{"dog", "cat"}) fmt.Printf("%q\n", rlp) // => "\0xc8\0x83dog\0x83cat" -decoded := ethutil.Decode(rlp) +decoded := common.Decode(rlp) fmt.Println(decoded) // => ["dog" "cat"] ``` ## Patricia Trie -Patricie Tree is a merkle trie utilized by the Expanse project. +Patricie Tree is a merkle tree utilized by the Expanse project. + More in depth information about the (modified) Patricia Trie can be found on the [Wiki](http://wiki.expanse.org/index.php/Patricia_Tree). The patricia trie uses a db as backend and could be anything as long as -it satisfies the Database interface found in `ethutil/db.go`. +it satisfies the Database interface found in `common/db.go`. ```go db := NewDatabase() // db, root -trie := ethutil.NewTrie(db, "") +trie := common.NewTrie(db, "") trie.Put("puppy", "dog") trie.Put("horse", "stallion") @@ -65,7 +69,7 @@ all (key, value) bindings. // ... Create db/trie // Note that RLP uses interface slices as list -value := ethutil.Encode([]interface{}{"one", 2, "three", []interface{}{42}}) +value := common.Encode([]interface{}{"one", 2, "three", []interface{}{42}}) // Store the RLP encoded value of the list trie.Put("mykey", value) ``` @@ -89,7 +93,7 @@ type (e.g. `Slice()` returns []interface{}, `Uint()` return 0, etc). `Append(v)` appends the value (v) to the current value/list. ```go -val := ethutil.NewEmptyValue().Append(1).Append("2") +val := common.NewEmptyValue().Append(1).Append("2") val.AppendList().Append(3) ``` @@ -110,7 +114,7 @@ val.AppendList().Append(3) `Byte()` returns the value as a single byte. ```go -val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}}) +val := common.NewValue([]interface{}{1,"2",[]interface{}{3}}) val.Get(0).Uint() // => 1 val.Get(1).Str() // => "2" s := val.Get(2) // => Value([]interface{}{3}) @@ -122,7 +126,7 @@ s.Get(0).Uint() // => 3 Decoding streams of RLP data is simplified ```go -val := ethutil.NewValueFromBytes(rlpData) +val := common.NewValueFromBytes(rlpData) val.Get(0).Uint() ``` @@ -132,7 +136,7 @@ Encoding from Value to RLP is done with the `Encode` method. The underlying value can be anything RLP can encode (int, str, lists, bytes) ```go -val := ethutil.NewValue([]interface{}{1,"2",[]interface{}{3}}) +val := common.NewValue([]interface{}{1,"2",[]interface{}{3}}) rlp := val.Encode() // Store the rlp data Store(rlp) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index d3d0a2a57bc7..869c57a1e507 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -19,6 +19,7 @@ package compiler import ( "bytes" "encoding/json" + "errors" "fmt" "io/ioutil" "os" @@ -33,15 +34,10 @@ import ( "github.com/expanse-project/go-expanse/logger/glog" ) -const ( - // flair = "Christian and Lefteris (c) 2014-2015" - flair = "" - languageVersion = "0" -) - var ( - versionRegExp = regexp.MustCompile("[0-9]+.[0-9]+.[0-9]+") - params = []string{ + versionRegexp = regexp.MustCompile("[0-9]+\\.[0-9]+\\.[0-9]+") + legacyRegexp = regexp.MustCompile("0\\.(9\\..*|1\\.[01])") + paramsLegacy = []string{ "--binary", // Request to output the contract in binary (hexadecimal). "file", // "--json-abi", // Request to output the contract's JSON ABI interface. @@ -53,6 +49,15 @@ var ( "--add-std", "1", } + paramsNew = []string{ + "--bin", // Request to output the contract in binary (hexadecimal). + "--abi", // Request to output the contract's JSON ABI interface. + "--userdoc", // Request to output the contract's Natspec user documentation. + "--devdoc", // Request to output the contract's Natspec developer documentation. + "--add-std", // include standard lib contracts + "--optimize", // code optimizer switched on + "-o", // output directory + } ) type Contract struct { @@ -65,14 +70,17 @@ type ContractInfo struct { Language string `json:"language"` LanguageVersion string `json:"languageVersion"` CompilerVersion string `json:"compilerVersion"` + CompilerOptions string `json:"compilerOptions"` AbiDefinition interface{} `json:"abiDefinition"` UserDoc interface{} `json:"userDoc"` DeveloperDoc interface{} `json:"developerDoc"` } type Solidity struct { - solcPath string - version string + solcPath string + version string + fullVersion string + legacy bool } func New(solcPath string) (sol *Solidity, err error) { @@ -93,112 +101,118 @@ func New(solcPath string) (sol *Solidity, err error) { return } - version := versionRegExp.FindString(out.String()) + fullVersion := out.String() + version := versionRegexp.FindString(fullVersion) + legacy := legacyRegexp.MatchString(version) + sol = &Solidity{ - solcPath: solcPath, - version: version, + solcPath: solcPath, + version: version, + fullVersion: fullVersion, + legacy: legacy, } glog.V(logger.Info).Infoln(sol.Info()) return } func (sol *Solidity) Info() string { - return fmt.Sprintf("solc v%s\nSolidity Compiler: %s\n%s", sol.version, sol.solcPath, flair) + return fmt.Sprintf("%s\npath: %s", sol.fullVersion, sol.solcPath) } func (sol *Solidity) Version() string { return sol.version } -func (sol *Solidity) Compile(source string) (contracts map[string]*Contract, err error) { - +// Compile builds and returns all the contracts contained within a source string. +func (sol *Solidity) Compile(source string) (map[string]*Contract, error) { + // Short circuit if no source code was specified if len(source) == 0 { - err = fmt.Errorf("empty source") - return + return nil, errors.New("solc: empty source string") } - + // Create a safe place to dump compilation output wd, err := ioutil.TempDir("", "solc") if err != nil { - return + return nil, fmt.Errorf("solc: failed to create temporary build folder: %v", err) } defer os.RemoveAll(wd) - in := strings.NewReader(source) - var out bytes.Buffer - // cwd set to temp dir + // Assemble the compiler command, change to the temp folder and capture any errors + stderr := new(bytes.Buffer) + + var params []string + if sol.legacy { + params = paramsLegacy + } else { + params = paramsNew + params = append(params, wd) + } + compilerOptions := strings.Join(params, " ") + cmd := exec.Command(sol.solcPath, params...) cmd.Dir = wd - cmd.Stdin = in - cmd.Stdout = &out - err = cmd.Run() - if err != nil { - err = fmt.Errorf("solc error: %v", err) - return - } + cmd.Stdin = strings.NewReader(source) + cmd.Stderr = stderr - matches, _ := filepath.Glob(wd + "/*.binary") + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("solc: %v\n%s", err, string(stderr.Bytes())) + } + // Sanity check that something was actually built + matches, _ := filepath.Glob(wd + "/*\\.bin*") if len(matches) < 1 { - err = fmt.Errorf("solc error: missing code output") - return + return nil, fmt.Errorf("solc: no build results found") } - - contracts = make(map[string]*Contract) + // Compilation succeeded, assemble and return the contracts + contracts := make(map[string]*Contract) for _, path := range matches { _, file := filepath.Split(path) base := strings.Split(file, ".")[0] - codeFile := filepath.Join(wd, base+".binary") - abiDefinitionFile := filepath.Join(wd, base+".abi") - userDocFile := filepath.Join(wd, base+".docuser") - developerDocFile := filepath.Join(wd, base+".docdev") - - var code, abiDefinitionJson, userDocJson, developerDocJson []byte - code, err = ioutil.ReadFile(codeFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for code: %v", err) - return + // Parse the individual compilation results (code binary, ABI definitions, user and dev docs) + var binary []byte + binext := ".bin" + if sol.legacy { + binext = ".binary" } - abiDefinitionJson, err = ioutil.ReadFile(abiDefinitionFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) - return + if binary, err = ioutil.ReadFile(filepath.Join(wd, base+binext)); err != nil { + return nil, fmt.Errorf("solc: error reading compiler output for code: %v", err) } - var abiDefinition interface{} - err = json.Unmarshal(abiDefinitionJson, &abiDefinition) - userDocJson, err = ioutil.ReadFile(userDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for userDoc: %v", err) - return + var abi interface{} + if blob, err := ioutil.ReadFile(filepath.Join(wd, base+".abi")); err != nil { + return nil, fmt.Errorf("solc: error reading abi definition: %v", err) + } else if err = json.Unmarshal(blob, &abi); err != nil { + return nil, fmt.Errorf("solc: error parsing abi definition: %v", err) } - var userDoc interface{} - err = json.Unmarshal(userDocJson, &userDoc) - developerDocJson, err = ioutil.ReadFile(developerDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for developerDoc: %v", err) - return + var userdoc interface{} + if blob, err := ioutil.ReadFile(filepath.Join(wd, base+".docuser")); err != nil { + return nil, fmt.Errorf("solc: error reading user doc: %v", err) + } else if err = json.Unmarshal(blob, &userdoc); err != nil { + return nil, fmt.Errorf("solc: error parsing user doc: %v", err) } - var developerDoc interface{} - err = json.Unmarshal(developerDocJson, &developerDoc) - contract := &Contract{ - Code: "0x" + string(code), + var devdoc interface{} + if blob, err := ioutil.ReadFile(filepath.Join(wd, base+".docdev")); err != nil { + return nil, fmt.Errorf("solc: error reading dev doc: %v", err) + } else if err = json.Unmarshal(blob, &devdoc); err != nil { + return nil, fmt.Errorf("solc: error parsing dev doc: %v", err) + } + // Assemble the final contract + contracts[base] = &Contract{ + Code: "0x" + string(binary), Info: ContractInfo{ Source: source, Language: "Solidity", - LanguageVersion: languageVersion, + LanguageVersion: sol.version, CompilerVersion: sol.version, - AbiDefinition: abiDefinition, - UserDoc: userDoc, - DeveloperDoc: developerDoc, + CompilerOptions: compilerOptions, + AbiDefinition: abi, + UserDoc: userdoc, + DeveloperDoc: devdoc, }, } - - contracts[base] = contract } - - return + return contracts, nil } func SaveInfo(info *ContractInfo, filename string) (contenthash common.Hash, err error) { diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index cf9aec44072b..04bbd48d680b 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -26,7 +26,7 @@ import ( "github.com/expanse-project/go-expanse/common" ) -const solcVersion = "0.9.23" +const solcVersion = "0.1.1" var ( source = ` @@ -37,18 +37,18 @@ contract test { } } ` - code = "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056" - info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0","compilerVersion":"0.9.23","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` + code = "0x6060604052606d8060116000396000f30060606040526000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa1146037576035565b005b6046600480359060200150605c565b6040518082815260200191505060405180910390f35b60006007820290506068565b91905056" + info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0.1.1","compilerVersion":"0.1.1","compilerOptions":"--binary file --json-abi file --natspec-user file --natspec-dev file --add-std 1","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` - infohash = common.HexToHash("0xea782f674eb898e477c20e8a7cf11c2c28b09fa68b5278732104f7a101aed255") + infohash = common.HexToHash("0x9f3803735e7f16120c5a140ab3f02121fd3533a9655c69b33a10e78752cc49b0") ) func TestCompiler(t *testing.T) { sol, err := New("") if err != nil { - t.Skip("solc not found: skip") + t.Skipf("solc not found: %v", err) } else if sol.Version() != solcVersion { - t.Skip("WARNING: skipping due to a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) + t.Skipf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } contracts, err := sol.Compile(source) if err != nil { @@ -83,7 +83,7 @@ func TestCompileError(t *testing.T) { func TestNoCompiler(t *testing.T) { _, err := New("/path/to/solc") if err != nil { - t.Log("solidity quits with error: %v", err) + t.Logf("solidity quits with error: %v", err) } else { t.Errorf("no solc installed, but got no error") } diff --git a/common/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index 8c063f625927..2c2a57bf759d 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -134,7 +134,7 @@ func testEth(t *testing.T) (expanse *exp.Expanse, err error) { db, _ := ethdb.NewMemDatabase() // set up mock genesis with balance on the testAddress - core.WriteGenesisBlockForTesting(db, common.HexToAddress(testAddress), common.String2Big(testBalance)) + core.WriteGenesisBlockForTesting(db, core.GenesisAccount{common.HexToAddress(testAddress), common.String2Big(testBalance)}) // only use minimalistic stack with no networking expanse, err = exp.New(&exp.Config{ @@ -143,7 +143,7 @@ func testEth(t *testing.T) (expanse *exp.Expanse, err error) { MaxPeers: 0, PowTest: true, Etherbase: common.HexToAddress(testAddress), - NewDB: func(path string) (common.Database, error) { return db, nil }, + NewDB: func(path string) (ethdb.Database, error) { return db, nil }, }) if err != nil { diff --git a/core/bench_test.go b/core/bench_test.go index b2a624187a20..a39578bcba0b 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -144,7 +144,7 @@ func genUncles(i int, gen *BlockGen) { func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { // Create the database in memory or in a temporary directory. - var db common.Database + var db ethdb.Database if !disk { db, _ = ethdb.NewMemDatabase() } else { @@ -162,7 +162,7 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { // Generate a chain of b.N blocks using the supplied block // generator function. - genesis := WriteGenesisBlockForTesting(db, benchRootAddr, benchRootFunds) + genesis := WriteGenesisBlockForTesting(db, GenesisAccount{benchRootAddr, benchRootFunds}) chain := GenerateChain(genesis, db, b.N, gen) // Time the insertion of the new chain. diff --git a/core/block_processor.go b/core/block_processor.go index 56287933bf04..6ec3c3e6a485 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -22,10 +22,12 @@ import ( "sync" "time" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" @@ -41,7 +43,7 @@ const ( ) type BlockProcessor struct { - chainDb common.Database + chainDb ethdb.Database // Mutex for locking the block processor. Blocks can only be handled one at a time mutex sync.Mutex // Canonical block chain @@ -68,7 +70,8 @@ type GasPool interface { SubGas(gas, price *big.Int) error } -func NewBlockProcessor(db common.Database, pow pow.PoW, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor { + +func NewBlockProcessor(db ethdb.Database, pow pow.PoW, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor { sm := &BlockProcessor{ chainDb: db, mem: make(map[string]*big.Int), @@ -213,7 +216,8 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st txs := block.Transactions() // Block validation - if err = ValidateHeader(sm.Pow, header, parent, false, false); err != nil { + + if err = ValidateHeader(sm.Pow, header, parent.Header(), false, false); err != nil { return } @@ -337,7 +341,8 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty return UncleError("uncle[%d](%x)'s parent is not ancestor (%x)", i, hash[:4], uncle.ParentHash[0:4]) } - if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash], true, true); err != nil { + + if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash].Header(), true, true); err != nil { return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err)) } } @@ -367,52 +372,50 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro } // See YP section 4.3.4. "Block Header Validity" -// Validates a block. Returns an error if the block is invalid. -func ValidateHeader(pow pow.PoW, block *types.Header, parent *types.Block, checkPow, uncle bool) error { - if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { - return fmt.Errorf("Block extra data too long (%d)", len(block.Extra)) +// Validates a header. Returns an error if the header is invalid. +func ValidateHeader(pow pow.PoW, header *types.Header, parent *types.Header, checkPow, uncle bool) error { + if big.NewInt(int64(len(header.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { + return fmt.Errorf("Header extra data too long (%d)", len(header.Extra)) } if uncle { - if block.Time.Cmp(common.MaxBig) == 1 { + if header.Time.Cmp(common.MaxBig) == 1 { return BlockTSTooBigErr } } else { - if block.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 { + if header.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 { return BlockFutureErr } } - if block.Time.Cmp(parent.Time()) != 1 { + if header.Time.Cmp(parent.Time) != 1 { return BlockEqualTSErr } - expd := CalcDifficulty(block.Time.Uint64(), parent.Time().Uint64(), parent.Number(), parent.Difficulty()) - if expd.Cmp(block.Difficulty) != 0 { - return fmt.Errorf("Difficulty check failed for block %v, %v", block.Difficulty, expd) + expd := CalcDifficulty(header.Time.Uint64(), parent.Time.Uint64(), parent.Number, parent.Difficulty) + if expd.Cmp(header.Difficulty) != 0 { + return fmt.Errorf("Difficulty check failed for header %v, %v", header.Difficulty, expd) } - var a, b *big.Int - a = parent.GasLimit() - a = a.Sub(a, block.GasLimit) + a := new(big.Int).Set(parent.GasLimit) + a = a.Sub(a, header.GasLimit) a.Abs(a) - b = parent.GasLimit() + b := new(big.Int).Set(parent.GasLimit) b = b.Div(b, params.GasLimitBoundDivisor) - if !(a.Cmp(b) < 0) || (block.GasLimit.Cmp(params.MinGasLimit) == -1) { - return fmt.Errorf("GasLimit check failed for block %v (%v > %v)", block.GasLimit, a, b) + if !(a.Cmp(b) < 0) || (header.GasLimit.Cmp(params.MinGasLimit) == -1) { + return fmt.Errorf("GasLimit check failed for header %v (%v > %v)", header.GasLimit, a, b) } - num := parent.Number() - num.Sub(block.Number, num) + num := new(big.Int).Set(parent.Number) + num.Sub(header.Number, num) if num.Cmp(big.NewInt(1)) != 0 { return BlockNumberErr } if checkPow { - // Verify the nonce of the block. Return an error if it's not valid - if !pow.Verify(types.NewBlockWithHeader(block)) { - return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + // Verify the nonce of the header. Return an error if it's not valid + if !pow.Verify(types.NewBlockWithHeader(header)) { + return ValidationError("Header's nonce is invalid (= %x)", header.Nonce) } } - return nil } diff --git a/core/block_processor_test.go b/core/block_processor_test.go index 3af0926bf180..21af0f70a1e2 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -48,13 +48,14 @@ func TestNumber(t *testing.T) { statedb := state.New(chain.Genesis().Root(), chain.chainDb) header := makeHeader(chain.Genesis(), statedb) header.Number = big.NewInt(3) - err := ValidateHeader(pow, header, chain.Genesis(), false, false) + err := ValidateHeader(pow, header, chain.Genesis().Header(), false, false) if err != BlockNumberErr { t.Errorf("expected block number error, got %q", err) } header = makeHeader(chain.Genesis(), statedb) - err = ValidateHeader(pow, header, chain.Genesis(), false, false) + + err = ValidateHeader(pow, header, chain.Genesis().Header(), false, false) if err == BlockNumberErr { t.Errorf("didn't expect block number error") } diff --git a/core/chain_makers.go b/core/chain_makers.go index 2a9be36c918a..47c56d0bf779 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -19,9 +19,11 @@ package core import ( "math/big" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/pow" ) @@ -130,6 +132,17 @@ func (b *BlockGen) PrevBlock(index int) *types.Block { return b.chain[index] } +// OffsetTime modifies the time instance of a block, implicitly changing its +// associated difficulty. It's useful to test scenarios where forking is not +// tied to chain length directly. +func (b *BlockGen) OffsetTime(seconds int64) { + b.header.Time.Add(b.header.Time, new(big.Int).SetInt64(seconds)) + if b.header.Time.Cmp(b.parent.Header().Time) <= 0 { + panic("block time out of range") + } + b.header.Difficulty = CalcDifficulty(b.header.Time.Uint64(), b.parent.Time().Uint64(), b.parent.Number(), b.parent.Difficulty()) +} + // GenerateChain creates a chain of n blocks. The first block's // parent will be the provided parent. db is used to store // intermediate states and should contain the parent's state trie. @@ -142,7 +155,7 @@ func (b *BlockGen) PrevBlock(index int) *types.Block { // Blocks created by GenerateChain do not contain valid proof of work // values. Inserting them into ChainManager requires use of FakePow or // a similar non-validating proof of work implementation. -func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int, *BlockGen)) []*types.Block { +func GenerateChain(parent *types.Block, db ethdb.Database, n int, gen func(int, *BlockGen)) []*types.Block { statedb := state.New(parent.Root(), db) blocks := make(types.Blocks, n) genblock := func(i int, h *types.Header) *types.Block { @@ -158,7 +171,6 @@ func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int, for i := 0; i < n; i++ { header := makeHeader(parent, statedb) block := genblock(i, header) - block.Td = CalcTD(block, parent) blocks[i] = block parent = block } @@ -186,7 +198,7 @@ func makeHeader(parent *types.Block, state *state.StateDB) *types.Header { // newCanonical creates a new deterministic canonical chain by running // InsertChain on the result of makeChain. -func newCanonical(n int, db common.Database) (*BlockProcessor, error) { +func newCanonical(n int, db ethdb.Database) (*BlockProcessor, error) { evmux := &event.TypeMux{} WriteTestNetGenesisBlock(db, 0) @@ -202,7 +214,7 @@ func newCanonical(n int, db common.Database) (*BlockProcessor, error) { return bman, err } -func makeChain(parent *types.Block, n int, db common.Database, seed int) []*types.Block { +func makeChain(parent *types.Block, n int, db ethdb.Database, seed int) []*types.Block { return GenerateChain(parent, db, n, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{0: byte(seed), 19: byte(i)}) }) diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index ffca9e8c93f6..c37daff7dacf 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -42,7 +42,7 @@ func ExampleGenerateChain() { ) // Ensure that key1 has some funds in the genesis block. - genesis := WriteGenesisBlockForTesting(db, addr1, big.NewInt(1000000)) + genesis := WriteGenesisBlockForTesting(db, GenesisAccount{addr1, big.NewInt(1000000)}) // This call generates a chain of 5 blocks. The function runs for // each block and adds different features to gen based on the diff --git a/core/chain_manager.go b/core/chain_manager.go index 46453b4b250b..6546a87e65f5 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -22,19 +22,21 @@ import ( "fmt" "io" "math/big" - "runtime" "sync" "sync/atomic" "time" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/metrics" "github.com/expanse-project/go-expanse/pow" + "github.com/expanse-project/go-expanse/rlp" "github.com/hashicorp/golang-lru" ) @@ -48,6 +50,9 @@ var ( ) const ( + headerCacheLimit = 512 + bodyCacheLimit = 256 + tdCacheLimit = 1024 blockCacheLimit = 256 maxFutureBlocks = 256 maxTimeFutureBlocks = 30 @@ -56,7 +61,7 @@ const ( type ChainManager struct { //eth EthManager - chainDb common.Database + chainDb ethdb.Database processor types.BlockProcessor eventMux *event.TypeMux genesisBlock *types.Block @@ -68,10 +73,13 @@ type ChainManager struct { checkpoint int // checkpoint counts towards the new checkpoint td *big.Int currentBlock *types.Block - lastBlockHash common.Hash currentGasLimit *big.Int - cache *lru.Cache // cache is the LRU caching + headerCache *lru.Cache // Cache for the most recent block headers + bodyCache *lru.Cache // Cache for the most recent block bodies + bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format + tdCache *lru.Cache // Cache for the most recent block total difficulties + blockCache *lru.Cache // Cache for the most recent entire blocks futureBlocks *lru.Cache // future blocks are blocks added for later processing quit chan struct{} @@ -83,14 +91,25 @@ type ChainManager struct { pow pow.PoW } -func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) { - cache, _ := lru.New(blockCacheLimit) +func NewChainManager(chainDb ethdb.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) { + headerCache, _ := lru.New(headerCacheLimit) + bodyCache, _ := lru.New(bodyCacheLimit) + bodyRLPCache, _ := lru.New(bodyCacheLimit) + tdCache, _ := lru.New(tdCacheLimit) + blockCache, _ := lru.New(blockCacheLimit) + futureBlocks, _ := lru.New(maxFutureBlocks) + bc := &ChainManager{ - chainDb: chainDb, - eventMux: mux, - quit: make(chan struct{}), - cache: cache, - pow: pow, + chainDb: chainDb, + eventMux: mux, + quit: make(chan struct{}), + headerCache: headerCache, + bodyCache: bodyCache, + bodyRLPCache: bodyRLPCache, + tdCache: tdCache, + blockCache: blockCache, + futureBlocks: futureBlocks, + pow: pow, } bc.genesisBlock = bc.GetBlockByNumber(0) @@ -105,11 +124,9 @@ func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) ( } glog.V(logger.Info).Infoln("WARNING: Wrote default expanse genesis block") } - if err := bc.setLastState(); err != nil { return nil, err } - // Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain for hash, _ := range BadHashes { if block := bc.GetBlock(hash); block != nil { @@ -123,14 +140,8 @@ func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) ( glog.V(logger.Error).Infoln("Chain reorg was successfull. Resuming normal operation") } } - // Take ownership of this particular state - - bc.futureBlocks, _ = lru.New(maxFutureBlocks) - bc.makeCache() - go bc.update() - return bc, nil } @@ -139,14 +150,16 @@ func (bc *ChainManager) SetHead(head *types.Block) { defer bc.mu.Unlock() for block := bc.currentBlock; block != nil && block.Hash() != head.Hash(); block = bc.GetBlock(block.ParentHash()) { - bc.removeBlock(block) + DeleteBlock(bc.chainDb, block.Hash()) } + bc.headerCache.Purge() + bc.bodyCache.Purge() + bc.bodyRLPCache.Purge() + bc.blockCache.Purge() + bc.futureBlocks.Purge() - bc.cache, _ = lru.New(blockCacheLimit) bc.currentBlock = head - bc.makeCache() - - bc.setTotalDifficulty(head.Td) + bc.setTotalDifficulty(bc.GetTd(head.Hash())) bc.insert(head) bc.setLastState() } @@ -169,7 +182,7 @@ func (self *ChainManager) LastBlockHash() common.Hash { self.mu.RLock() defer self.mu.RUnlock() - return self.lastBlockHash + return self.currentBlock.Hash() } func (self *ChainManager) CurrentBlock() *types.Block { @@ -199,13 +212,13 @@ func (bc *ChainManager) recover() bool { if len(data) != 0 { block := bc.GetBlock(common.BytesToHash(data)) if block != nil { - err := bc.chainDb.Put([]byte("LastBlock"), block.Hash().Bytes()) - if err != nil { - glog.Fatalln("db write err:", err) + if err := WriteCanonicalHash(bc.chainDb, block.Hash(), block.NumberU64()); err != nil { + glog.Fatalf("failed to write database head number: %v", err) + } + if err := WriteHeadBlockHash(bc.chainDb, block.Hash()); err != nil { + glog.Fatalf("failed to write database head hash: %v", err) } - bc.currentBlock = block - bc.lastBlockHash = block.Hash() return true } } @@ -213,14 +226,13 @@ func (bc *ChainManager) recover() bool { } func (bc *ChainManager) setLastState() error { - data, _ := bc.chainDb.Get([]byte("LastBlock")) - if len(data) != 0 { - block := bc.GetBlock(common.BytesToHash(data)) + head := GetHeadBlockHash(bc.chainDb) + if head != (common.Hash{}) { + block := bc.GetBlock(head) if block != nil { bc.currentBlock = block - bc.lastBlockHash = block.Hash() } else { - glog.Infof("LastBlock (%x) not found. Recovering...\n", data) + glog.Infof("LastBlock (%x) not found. Recovering...\n", head) if bc.recover() { glog.Infof("Recover successful") } else { @@ -230,7 +242,7 @@ func (bc *ChainManager) setLastState() error { } else { bc.Reset() } - bc.td = bc.currentBlock.Td + bc.td = bc.GetTd(bc.currentBlock.Hash()) bc.currentGasLimit = CalcGasLimit(bc.currentBlock) if glog.V(logger.Info) { @@ -240,63 +252,38 @@ func (bc *ChainManager) setLastState() error { return nil } -func (bc *ChainManager) makeCache() { - bc.cache, _ = lru.New(blockCacheLimit) - // load in last `blockCacheLimit` - 1 blocks. Last block is the current. - bc.cache.Add(bc.genesisBlock.Hash(), bc.genesisBlock) - for _, block := range bc.GetBlocksFromHash(bc.currentBlock.Hash(), blockCacheLimit) { - bc.cache.Add(block.Hash(), block) - } -} - +// Reset purges the entire blockchain, restoring it to its genesis state. func (bc *ChainManager) Reset() { - bc.mu.Lock() - defer bc.mu.Unlock() - - for block := bc.currentBlock; block != nil; block = bc.GetBlock(block.ParentHash()) { - bc.removeBlock(block) - } - - bc.cache, _ = lru.New(blockCacheLimit) - - // Prepare the genesis block - err := WriteBlock(bc.chainDb, bc.genesisBlock) - if err != nil { - glog.Fatalln("db err:", err) - } - - bc.insert(bc.genesisBlock) - bc.currentBlock = bc.genesisBlock - bc.makeCache() - - bc.setTotalDifficulty(common.Big("0")) -} - -func (bc *ChainManager) removeBlock(block *types.Block) { - bc.chainDb.Delete(append(blockHashPre, block.Hash().Bytes()...)) + bc.ResetWithGenesisBlock(bc.genesisBlock) } -func (bc *ChainManager) ResetWithGenesisBlock(gb *types.Block) { +// ResetWithGenesisBlock purges the entire blockchain, restoring it to the +// specified genesis state. +func (bc *ChainManager) ResetWithGenesisBlock(genesis *types.Block) { bc.mu.Lock() defer bc.mu.Unlock() + // Dump the entire block chain and purge the caches for block := bc.currentBlock; block != nil; block = bc.GetBlock(block.ParentHash()) { - bc.removeBlock(block) + DeleteBlock(bc.chainDb, block.Hash()) } + bc.headerCache.Purge() + bc.bodyCache.Purge() + bc.bodyRLPCache.Purge() + bc.blockCache.Purge() + bc.futureBlocks.Purge() - // Prepare the genesis block - gb.Td = gb.Difficulty() - bc.genesisBlock = gb - - err := WriteBlock(bc.chainDb, bc.genesisBlock) - if err != nil { - glog.Fatalln("db err:", err) + // Prepare the genesis block and reinitialize the chain + if err := WriteTd(bc.chainDb, genesis.Hash(), genesis.Difficulty()); err != nil { + glog.Fatalf("failed to write genesis block TD: %v", err) } - + if err := WriteBlock(bc.chainDb, genesis); err != nil { + glog.Fatalf("failed to write genesis block: %v", err) + } + bc.genesisBlock = genesis bc.insert(bc.genesisBlock) bc.currentBlock = bc.genesisBlock - bc.makeCache() - bc.td = gb.Difficulty() + bc.setTotalDifficulty(genesis.Difficulty()) } // Export writes the active chain to the given writer. @@ -335,23 +322,23 @@ func (self *ChainManager) ExportN(w io.Writer, first uint64, last uint64) error // insert injects a block into the current chain block chain. Note, this function // assumes that the `mu` mutex is held! func (bc *ChainManager) insert(block *types.Block) { - err := WriteHead(bc.chainDb, block) - if err != nil { - glog.Fatal("db write fail:", err) + // Add the block to the canonical chain number scheme and mark as the head + if err := WriteCanonicalHash(bc.chainDb, block.Hash(), block.NumberU64()); err != nil { + glog.Fatalf("failed to insert block number: %v", err) } - + if err := WriteHeadBlockHash(bc.chainDb, block.Hash()); err != nil { + glog.Fatalf("failed to insert block number: %v", err) + } + // Add a new restore point if we reached some limit bc.checkpoint++ if bc.checkpoint > checkpointLimit { - err = bc.chainDb.Put([]byte("checkpoint"), block.Hash().Bytes()) - if err != nil { - glog.Fatal("db write fail:", err) + if err := bc.chainDb.Put([]byte("checkpoint"), block.Hash().Bytes()); err != nil { + glog.Fatalf("failed to create checkpoint: %v", err) } - bc.checkpoint = 0 } - + // Update the internal internal state with the head block bc.currentBlock = block - bc.lastBlockHash = block.Hash() } // Accessors @@ -359,61 +346,141 @@ func (bc *ChainManager) Genesis() *types.Block { return bc.genesisBlock } -// Block fetching methods -func (bc *ChainManager) HasBlock(hash common.Hash) bool { - if bc.cache.Contains(hash) { - return true +// HasHeader checks if a block header is present in the database or not, caching +// it if present. +func (bc *ChainManager) HasHeader(hash common.Hash) bool { + return bc.GetHeader(hash) != nil +} + +// GetHeader retrieves a block header from the database by hash, caching it if +// found. +func (self *ChainManager) GetHeader(hash common.Hash) *types.Header { + // Short circuit if the header's already in the cache, retrieve otherwise + if header, ok := self.headerCache.Get(hash); ok { + return header.(*types.Header) + } + header := GetHeader(self.chainDb, hash) + if header == nil { + return nil } + // Cache the found header for next time and return + self.headerCache.Add(header.Hash(), header) + return header +} - data, _ := bc.chainDb.Get(append(blockHashPre, hash[:]...)) - return len(data) != 0 +// GetHeaderByNumber retrieves a block header from the database by number, +// caching it (associated with its hash) if found. +func (self *ChainManager) GetHeaderByNumber(number uint64) *types.Header { + hash := GetCanonicalHash(self.chainDb, number) + if hash == (common.Hash{}) { + return nil + } + return self.GetHeader(hash) } -func (self *ChainManager) GetBlockHashesFromHash(hash common.Hash, max uint64) (chain []common.Hash) { - block := self.GetBlock(hash) - if block == nil { - return +// GetBody retrieves a block body (transactions and uncles) from the database by +// hash, caching it if found. +func (self *ChainManager) GetBody(hash common.Hash) *types.Body { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := self.bodyCache.Get(hash); ok { + body := cached.(*types.Body) + return body } - // XXX Could be optimised by using a different database which only holds hashes (i.e., linked list) - for i := uint64(0); i < max; i++ { - block = self.GetBlock(block.ParentHash()) - if block == nil { - break - } + body := GetBody(self.chainDb, hash) + if body == nil { + return nil + } + // Cache the found body for next time and return + self.bodyCache.Add(hash, body) + return body +} - chain = append(chain, block.Hash()) - if block.Number().Cmp(common.Big0) <= 0 { - break - } +// GetBodyRLP retrieves a block body in RLP encoding from the database by hash, +// caching it if found. +func (self *ChainManager) GetBodyRLP(hash common.Hash) rlp.RawValue { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := self.bodyRLPCache.Get(hash); ok { + return cached.(rlp.RawValue) + } + body := GetBodyRLP(self.chainDb, hash) + if len(body) == 0 { + return nil } + // Cache the found body for next time and return + self.bodyRLPCache.Add(hash, body) + return body +} - return +// GetTd retrieves a block's total difficulty in the canonical chain from the +// database by hash, caching it if found. +func (self *ChainManager) GetTd(hash common.Hash) *big.Int { + // Short circuit if the td's already in the cache, retrieve otherwise + if cached, ok := self.tdCache.Get(hash); ok { + return cached.(*big.Int) + } + td := GetTd(self.chainDb, hash) + if td == nil { + return nil + } + // Cache the found body for next time and return + self.tdCache.Add(hash, td) + return td +} + +// HasBlock checks if a block is fully present in the database or not, caching +// it if present. +func (bc *ChainManager) HasBlock(hash common.Hash) bool { + return bc.GetBlock(hash) != nil } +// GetBlock retrieves a block from the database by hash, caching it if found. func (self *ChainManager) GetBlock(hash common.Hash) *types.Block { - if block, ok := self.cache.Get(hash); ok { + // Short circuit if the block's already in the cache, retrieve otherwise + if block, ok := self.blockCache.Get(hash); ok { return block.(*types.Block) } - - block := GetBlockByHash(self.chainDb, hash) + block := GetBlock(self.chainDb, hash) if block == nil { return nil } - - // Add the block to the cache - self.cache.Add(hash, (*types.Block)(block)) - - return (*types.Block)(block) + // Cache the found block for next time and return + self.blockCache.Add(block.Hash(), block) + return block } -func (self *ChainManager) GetBlockByNumber(num uint64) *types.Block { - self.mu.RLock() - defer self.mu.RUnlock() - - return self.getBlockByNumber(num) +// GetBlockByNumber retrieves a block from the database by number, caching it +// (associated with its hash) if found. +func (self *ChainManager) GetBlockByNumber(number uint64) *types.Block { + hash := GetCanonicalHash(self.chainDb, number) + if hash == (common.Hash{}) { + return nil + } + return self.GetBlock(hash) +} +// GetBlockHashesFromHash retrieves a number of block hashes starting at a given +// hash, fetching towards the genesis block. +func (self *ChainManager) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { + // Get the origin header from which to fetch + header := self.GetHeader(hash) + if header == nil { + return nil + } + // Iterate the headers until enough is collected or the genesis reached + chain := make([]common.Hash, 0, max) + for i := uint64(0); i < max; i++ { + if header = self.GetHeader(header.ParentHash); header == nil { + break + } + chain = append(chain, header.Hash()) + if header.Number.Cmp(common.Big0) == 0 { + break + } + } + return chain } +// [deprecated by eth/62] // GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors. func (self *ChainManager) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) { for i := 0; i < n; i++ { @@ -427,11 +494,6 @@ func (self *ChainManager) GetBlocksFromHash(hash common.Hash, n int) (blocks []* return } -// non blocking version -func (self *ChainManager) getBlockByNumber(num uint64) *types.Block { - return GetBlockByNumber(self.chainDb, num) -} - func (self *ChainManager) GetUnclesInChain(block *types.Block, length int) (uncles []*types.Header) { for i := 0; block != nil && i < length; i++ { uncles = append(uncles, block.Uncles()...) @@ -487,39 +549,48 @@ const ( SideStatTy ) -// WriteBlock writes the block to the chain (or pending queue) -func (self *ChainManager) WriteBlock(block *types.Block, queued bool) (status writeStatus, err error) { +// WriteBlock writes the block to the chain. +func (self *ChainManager) WriteBlock(block *types.Block) (status writeStatus, err error) { self.wg.Add(1) defer self.wg.Done() + // Calculate the total difficulty of the block + ptd := self.GetTd(block.ParentHash()) + if ptd == nil { + return NonStatTy, ParentError(block.ParentHash()) + } + td := new(big.Int).Add(block.Difficulty(), ptd) + + self.mu.RLock() cblock := self.currentBlock + self.mu.RUnlock() + // Compare the TD of the last known block in the canonical chain to make sure it's greater. // At this point it's possible that a different chain (fork) becomes the new canonical chain. - if block.Td.Cmp(self.Td()) > 0 { + if td.Cmp(self.Td()) > 0 { // chain fork if block.ParentHash() != cblock.Hash() { // during split we merge two different chains and create the new canonical chain - err := self.merge(cblock, block) + err := self.reorg(cblock, block) if err != nil { return NonStatTy, err } - - status = SplitStatTy } + status = CanonStatTy self.mu.Lock() - self.setTotalDifficulty(block.Td) + self.setTotalDifficulty(td) self.insert(block) self.mu.Unlock() - - status = CanonStatTy } else { status = SideStatTy } - err = WriteBlock(self.chainDb, block) - if err != nil { - glog.Fatalln("db err:", err) + if err := WriteTd(self.chainDb, block.Hash(), td); err != nil { + glog.Fatalf("failed to write block total difficulty: %v", err) + } + if err := WriteBlock(self.chainDb, block); err != nil { + glog.Fatalf("filed to write block contents: %v", err) } // Delete from future blocks self.futureBlocks.Remove(block.Hash()) @@ -545,14 +616,12 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { stats struct{ queued, processed, ignored int } tstart = time.Now() - nonceDone = make(chan nonceResult, len(chain)) - nonceQuit = make(chan struct{}) nonceChecked = make([]bool, len(chain)) ) // Start the parallel nonce verifier. - go verifyNonces(self.pow, chain, nonceQuit, nonceDone) - defer close(nonceQuit) + nonceAbort, nonceResults := verifyNoncesFromBlocks(self.pow, chain) + defer close(nonceAbort) txcount := 0 for i, block := range chain { @@ -565,24 +634,19 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { // Wait for block i's nonce to be verified before processing // its state transition. for !nonceChecked[i] { - r := <-nonceDone - nonceChecked[r.i] = true + r := <-nonceResults + nonceChecked[r.index] = true if !r.valid { - block := chain[r.i] - return r.i, &BlockNonceErr{Hash: block.Hash(), Number: block.Number(), Nonce: block.Nonce()} + block := chain[r.index] + return r.index, &BlockNonceErr{Hash: block.Hash(), Number: block.Number(), Nonce: block.Nonce()} } } if BadHashes[block.Hash()] { - err := fmt.Errorf("Found known bad hash in chain %x", block.Hash()) + err := BadHashError(block.Hash()) blockErr(block, err) return i, err } - - // Setting block.Td regardless of error (known for example) prevents errors down the line - // in the protocol handler - block.Td = new(big.Int).Set(CalcTD(block, self.GetBlock(block.ParentHash()))) - // Call in to the block processor and check for errors. It's likely that if one block fails // all others will fail too (unless a known block is returned). logs, receipts, err := self.processor.Process(block) @@ -618,11 +682,13 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { return i, err } + if err := PutBlockReceipts(self.chainDb, block, receipts); err != nil { + glog.V(logger.Warn).Infoln("error writing block receipts:", err) + } txcount += len(block.Transactions()) - // write the block to the chain and get the status - status, err := self.WriteBlock(block, true) + status, err := self.WriteBlock(block) if err != nil { return i, err } @@ -648,10 +714,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { queue[i] = ChainSplitEvent{block, logs} queueEvent.splitCount++ } - if err := PutBlockReceipts(self.chainDb, block, receipts); err != nil { - glog.V(logger.Warn).Infoln("error writing block receipts:", err) - } - stats.processed++ } @@ -666,20 +728,26 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { return 0, nil } -// diff takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them -// to be part of the new canonical chain. -func (self *ChainManager) diff(oldBlock, newBlock *types.Block) (types.Blocks, error) { +// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them +// to be part of the new canonical chain and accumulates potential missing transactions and post an +// event about them +func (self *ChainManager) reorg(oldBlock, newBlock *types.Block) error { + self.mu.Lock() + defer self.mu.Unlock() + var ( newChain types.Blocks commonBlock *types.Block oldStart = oldBlock newStart = newBlock + deletedTxs types.Transactions ) // first reduce whoever is higher bound if oldBlock.NumberU64() > newBlock.NumberU64() { // reduce old chain for oldBlock = oldBlock; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = self.GetBlock(oldBlock.ParentHash()) { + deletedTxs = append(deletedTxs, oldBlock.Transactions()...) } } else { // reduce new chain and append new chain blocks for inserting later on @@ -688,10 +756,10 @@ func (self *ChainManager) diff(oldBlock, newBlock *types.Block) (types.Blocks, e } } if oldBlock == nil { - return nil, fmt.Errorf("Invalid old chain") + return fmt.Errorf("Invalid old chain") } if newBlock == nil { - return nil, fmt.Errorf("Invalid new chain") + return fmt.Errorf("Invalid new chain") } numSplit := newBlock.Number() @@ -701,13 +769,14 @@ func (self *ChainManager) diff(oldBlock, newBlock *types.Block) (types.Blocks, e break } newChain = append(newChain, newBlock) + deletedTxs = append(deletedTxs, oldBlock.Transactions()...) oldBlock, newBlock = self.GetBlock(oldBlock.ParentHash()), self.GetBlock(newBlock.ParentHash()) if oldBlock == nil { - return nil, fmt.Errorf("Invalid old chain") + return fmt.Errorf("Invalid old chain") } if newBlock == nil { - return nil, fmt.Errorf("Invalid new chain") + return fmt.Errorf("Invalid new chain") } } @@ -716,18 +785,8 @@ func (self *ChainManager) diff(oldBlock, newBlock *types.Block) (types.Blocks, e glog.Infof("Chain split detected @ %x. Reorganising chain from #%v %x to %x", commonHash[:4], numSplit, oldStart.Hash().Bytes()[:4], newStart.Hash().Bytes()[:4]) } - return newChain, nil -} - -// merge merges two different chain to the new canonical chain -func (self *ChainManager) merge(oldBlock, newBlock *types.Block) error { - newChain, err := self.diff(oldBlock, newBlock) - if err != nil { - return fmt.Errorf("chain reorg failed: %v", err) - } - + var addedTxs types.Transactions // insert blocks. Order does not matter. Last block will be written in ImportChain itself which creates the new head properly - self.mu.Lock() for _, block := range newChain { // insert the block in the canonical way, re-writing history self.insert(block) @@ -735,8 +794,20 @@ func (self *ChainManager) merge(oldBlock, newBlock *types.Block) error { PutTransactions(self.chainDb, block, block.Transactions()) PutReceipts(self.chainDb, GetBlockReceipts(self.chainDb, block.Hash())) + addedTxs = append(addedTxs, block.Transactions()...) + } + + // calculate the difference between deleted and added transactions + diff := types.TxDifference(deletedTxs, addedTxs) + // When transactions get deleted from the database that means the + // receipts that were created in the fork must also be deleted + for _, tx := range diff { + DeleteReceipt(self.chainDb, tx.Hash()) + DeleteTransaction(self.chainDb, tx.Hash()) } - self.mu.Unlock() + // Must be posted in a goroutine because of the transaction pool trying + // to acquire the chain manager lock + go self.eventMux.Post(RemovedTransactionEvent{diff}) return nil } @@ -755,12 +826,11 @@ out: case ChainEvent: // We need some control over the mining operation. Acquiring locks and waiting for the miner to create new block takes too long // and in most cases isn't even necessary. - if self.lastBlockHash == event.Hash { + if self.currentBlock.Hash() == event.Hash { self.currentGasLimit = CalcGasLimit(event.Block) self.eventMux.Post(ChainHeadEvent{event.Block}) } } - self.eventMux.Post(event) } } @@ -778,40 +848,3 @@ func blockErr(block *types.Block, err error) { glog.V(logger.Error).Infoln(err) glog.V(logger.Debug).Infoln(verifyNonces) } - -type nonceResult struct { - i int - valid bool -} - -// block verifies nonces of the given blocks in parallel and returns -// an error if one of the blocks nonce verifications failed. -func verifyNonces(pow pow.PoW, blocks []*types.Block, quit <-chan struct{}, done chan<- nonceResult) { - // Spawn a few workers. They listen for blocks on the in channel - // and send results on done. The workers will exit in the - // background when in is closed. - var ( - in = make(chan int) - nworkers = runtime.GOMAXPROCS(0) - ) - defer close(in) - if len(blocks) < nworkers { - nworkers = len(blocks) - } - for i := 0; i < nworkers; i++ { - go func() { - for i := range in { - done <- nonceResult{i: i, valid: pow.Verify(blocks[i])} - } - }() - } - // Feed block indices to the workers. - for i := range blocks { - select { - case in <- i: - continue - case <-quit: - return - } - } -} diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index d8088aca03d0..d3e82bdb3b35 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -26,12 +26,15 @@ import ( "strconv" "testing" - "github.com/expanse-project/ethash" + + "github.com/ethereum/ethash" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" "github.com/expanse-project/go-expanse/pow" "github.com/expanse-project/go-expanse/rlp" "github.com/hashicorp/golang-lru" @@ -46,7 +49,7 @@ func thePow() pow.PoW { return pow } -func theChainManager(db common.Database, t *testing.T) *ChainManager { +func theChainManager(db ethdb.Database, t *testing.T) *ChainManager { var eventMux event.TypeMux WriteTestNetGenesisBlock(db, 0) chainMan, err := NewChainManager(db, thePow(), &eventMux) @@ -73,10 +76,11 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big if err != nil { t.Fatal("could not make new canonical in testFork", err) } - // asert the bmans have the same block at i + // assert the bmans have the same block at i bi1 := bman.bc.GetBlockByNumber(uint64(i)).Hash() bi2 := bman2.bc.GetBlockByNumber(uint64(i)).Hash() if bi1 != bi2 { + fmt.Printf("%+v\n%+v\n\n", bi1, bi2) t.Fatal("chains do not have the same hash at height", i) } bman2.bc.SetProcessor(bman2) @@ -110,7 +114,6 @@ func printChain(bc *ChainManager) { // process blocks against a chain func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) { - td := new(big.Int) for _, block := range chainB { _, _, err := bman.bc.processor.Process(block) if err != nil { @@ -119,17 +122,12 @@ func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) { } return nil, err } - parent := bman.bc.GetBlock(block.ParentHash()) - block.Td = CalcTD(block, parent) - td = block.Td - bman.bc.mu.Lock() - { - WriteBlock(bman.bc.chainDb, block) - } + WriteTd(bman.bc.chainDb, block.Hash(), new(big.Int).Add(block.Difficulty(), bman.bc.GetTd(block.ParentHash()))) + WriteBlock(bman.bc.chainDb, block) bman.bc.mu.Unlock() } - return td, nil + return bman.bc.GetTd(chainB[len(chainB)-1].Hash()), nil } func loadChain(fn string, t *testing.T) (types.Blocks, error) { @@ -385,10 +383,14 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block return chain } -func chm(genesis *types.Block, db common.Database) *ChainManager { +func chm(genesis *types.Block, db ethdb.Database) *ChainManager { var eventMux event.TypeMux bc := &ChainManager{chainDb: db, genesisBlock: genesis, eventMux: &eventMux, pow: FakePow{}} - bc.cache, _ = lru.New(100) + bc.headerCache, _ = lru.New(100) + bc.bodyCache, _ = lru.New(100) + bc.bodyRLPCache, _ = lru.New(100) + bc.tdCache, _ = lru.New(100) + bc.blockCache, _ = lru.New(100) bc.futureBlocks, _ = lru.New(100) bc.processor = bproc{} bc.ResetWithGenesisBlock(genesis) @@ -420,6 +422,59 @@ func TestReorgLongest(t *testing.T) { } } +func TestBadHashes(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + genesis, err := WriteTestNetGenesisBlock(db, 0) + if err != nil { + t.Error(err) + t.FailNow() + } + bc := chm(genesis, db) + + chain := makeChainWithDiff(genesis, []int{1, 2, 4}, 10) + BadHashes[chain[2].Header().Hash()] = true + + _, err = bc.InsertChain(chain) + if !IsBadHashError(err) { + t.Errorf("error mismatch: want: BadHashError, have: %v", err) + } +} + +func TestReorgBadHashes(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + genesis, err := WriteTestNetGenesisBlock(db, 0) + if err != nil { + t.Error(err) + t.FailNow() + } + bc := chm(genesis, db) + + chain := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 11) + bc.InsertChain(chain) + + if chain[3].Header().Hash() != bc.LastBlockHash() { + t.Errorf("last block hash mismatch: want: %x, have: %x", chain[3].Header().Hash(), bc.LastBlockHash()) + } + + // NewChainManager should check BadHashes when loading it db + BadHashes[chain[3].Header().Hash()] = true + + var eventMux event.TypeMux + ncm, err := NewChainManager(db, FakePow{}, &eventMux) + if err != nil { + t.Errorf("NewChainManager err: %s", err) + } + + // check it set head to (valid) parent of bad hash block + if chain[2].Header().Hash() != ncm.LastBlockHash() { + t.Errorf("last block hash mismatch: want: %x, have: %x", chain[2].Header().Hash(), ncm.LastBlockHash()) + } + + if chain[2].Header().GasLimit.Cmp(ncm.GasLimit()) != 0 { + t.Errorf("current block gasLimit mismatch: want: %x, have: %x", chain[2].Header().GasLimit, ncm.GasLimit()) + } +} + func TestReorgShortest(t *testing.T) { db, _ := ethdb.NewMemDatabase() genesis, err := WriteTestNetGenesisBlock(db, 0) @@ -457,7 +512,7 @@ func TestInsertNonceError(t *testing.T) { fail := rand.Int() % len(blocks) failblock := blocks[fail] - bc.pow = failpow{failblock.NumberU64()} + bc.pow = failPow{failblock.NumberU64()} n, err := bc.InsertChain(blocks) // Check that the returned error indicates the nonce failure. @@ -484,34 +539,115 @@ func TestInsertNonceError(t *testing.T) { } } -/* -func TestGenesisMismatch(t *testing.T) { - db, _ := ethdb.NewMemDatabase() - var mux event.TypeMux - genesis := GenesisBlock(0, db) - _, err := NewChainManager(genesis, db, db, db, thePow(), &mux) - if err != nil { - t.Error(err) - } - genesis = GenesisBlock(1, db) - _, err = NewChainManager(genesis, db, db, db, thePow(), &mux) - if err == nil { - t.Error("expected genesis mismatch error") +// Tests that chain reorganizations handle transaction removals and reinsertions. +func TestChainTxReorgs(t *testing.T) { + params.MinGasLimit = big.NewInt(125000) // Minimum the gas limit may ever be. + params.GenesisGasLimit = big.NewInt(3141592) // Gas limit of the Genesis block. + + var ( + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + key2, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") + key3, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + addr2 = crypto.PubkeyToAddress(key2.PublicKey) + addr3 = crypto.PubkeyToAddress(key3.PublicKey) + db, _ = ethdb.NewMemDatabase() + ) + genesis := WriteGenesisBlockForTesting(db, + GenesisAccount{addr1, big.NewInt(1000000)}, + GenesisAccount{addr2, big.NewInt(1000000)}, + GenesisAccount{addr3, big.NewInt(1000000)}, + ) + // Create two transactions shared between the chains: + // - postponed: transaction included at a later block in the forked chain + // - swapped: transaction included at the same block number in the forked chain + postponed, _ := types.NewTransaction(0, addr1, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key1) + swapped, _ := types.NewTransaction(1, addr1, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key1) + + // Create two transactions that will be dropped by the forked chain: + // - pastDrop: transaction dropped retroactively from a past block + // - freshDrop: transaction dropped exactly at the block where the reorg is detected + var pastDrop, freshDrop *types.Transaction + + // Create three transactions that will be added in the forked chain: + // - pastAdd: transaction added before the reorganiztion is detected + // - freshAdd: transaction added at the exact block the reorg is detected + // - futureAdd: transaction added after the reorg has already finished + var pastAdd, freshAdd, futureAdd *types.Transaction + + chain := GenerateChain(genesis, db, 3, func(i int, gen *BlockGen) { + switch i { + case 0: + pastDrop, _ = types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key2) + + gen.AddTx(pastDrop) // This transaction will be dropped in the fork from below the split point + gen.AddTx(postponed) // This transaction will be postponed till block #3 in the fork + + case 2: + freshDrop, _ = types.NewTransaction(gen.TxNonce(addr2), addr2, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key2) + + gen.AddTx(freshDrop) // This transaction will be dropped in the fork from exactly at the split point + gen.AddTx(swapped) // This transaction will be swapped out at the exact height + + gen.OffsetTime(9) // Lower the block difficulty to simulate a weaker chain + } + }) + // Import the chain. This runs all block validation rules. + evmux := &event.TypeMux{} + chainman, _ := NewChainManager(db, FakePow{}, evmux) + chainman.SetProcessor(NewBlockProcessor(db, FakePow{}, chainman, evmux)) + if i, err := chainman.InsertChain(chain); err != nil { + t.Fatalf("failed to insert original chain[%d]: %v", i, err) + } + + // overwrite the old chain + chain = GenerateChain(genesis, db, 5, func(i int, gen *BlockGen) { + switch i { + case 0: + pastAdd, _ = types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key3) + gen.AddTx(pastAdd) // This transaction needs to be injected during reorg + + case 2: + gen.AddTx(postponed) // This transaction was postponed from block #1 in the original chain + gen.AddTx(swapped) // This transaction was swapped from the exact current spot in the original chain + + freshAdd, _ = types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key3) + gen.AddTx(freshAdd) // This transaction will be added exactly at reorg time + + case 3: + futureAdd, _ = types.NewTransaction(gen.TxNonce(addr3), addr3, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(key3) + gen.AddTx(futureAdd) // This transaction will be added after a full reorg + } + }) + if _, err := chainman.InsertChain(chain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) } -} -*/ - -// failpow returns false from Verify for a certain block number. -type failpow struct{ num uint64 } -func (pow failpow) Search(pow.Block, <-chan struct{}) (nonce uint64, mixHash []byte) { - return 0, nil -} -func (pow failpow) Verify(b pow.Block) bool { - return b.NumberU64() != pow.num -} -func (pow failpow) GetHashrate() int64 { - return 0 -} -func (pow failpow) Turbo(bool) { + // removed tx + for i, tx := range (types.Transactions{pastDrop, freshDrop}) { + if GetTransaction(db, tx.Hash()) != nil { + t.Errorf("drop %d: tx found while shouldn't have been", i) + } + if GetReceipt(db, tx.Hash()) != nil { + t.Errorf("drop %d: receipt found while shouldn't have been", i) + } + } + // added tx + for i, tx := range (types.Transactions{pastAdd, freshAdd, futureAdd}) { + if GetTransaction(db, tx.Hash()) == nil { + t.Errorf("add %d: expected tx to be found", i) + } + if GetReceipt(db, tx.Hash()) == nil { + t.Errorf("add %d: expected receipt to be found", i) + } + } + // shared tx + for i, tx := range (types.Transactions{postponed, swapped}) { + if GetTransaction(db, tx.Hash()) == nil { + t.Errorf("share %d: expected tx to be found", i) + } + if GetReceipt(db, tx.Hash()) == nil { + t.Errorf("share %d: expected receipt to be found", i) + } + } } diff --git a/core/chain_pow.go b/core/chain_pow.go new file mode 100644 index 000000000000..c0b95d0f111f --- /dev/null +++ b/core/chain_pow.go @@ -0,0 +1,87 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "runtime" + + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/pow" +) + +// nonceCheckResult contains the result of a nonce verification. +type nonceCheckResult struct { + index int // Index of the item verified from an input array + valid bool // Result of the nonce verification +} + +// verifyNoncesFromHeaders starts a concurrent header nonce verification, +// returning a quit channel to abort the operations and a results channel +// to retrieve the async verifications. +func verifyNoncesFromHeaders(checker pow.PoW, headers []*types.Header) (chan<- struct{}, <-chan nonceCheckResult) { + items := make([]pow.Block, len(headers)) + for i, header := range headers { + items[i] = types.NewBlockWithHeader(header) + } + return verifyNonces(checker, items) +} + +// verifyNoncesFromBlocks starts a concurrent block nonce verification, +// returning a quit channel to abort the operations and a results channel +// to retrieve the async verifications. +func verifyNoncesFromBlocks(checker pow.PoW, blocks []*types.Block) (chan<- struct{}, <-chan nonceCheckResult) { + items := make([]pow.Block, len(blocks)) + for i, block := range blocks { + items[i] = block + } + return verifyNonces(checker, items) +} + +// verifyNonces starts a concurrent nonce verification, returning a quit channel +// to abort the operations and a results channel to retrieve the async checks. +func verifyNonces(checker pow.PoW, items []pow.Block) (chan<- struct{}, <-chan nonceCheckResult) { + // Spawn as many workers as allowed threads + workers := runtime.GOMAXPROCS(0) + if len(items) < workers { + workers = len(items) + } + // Create a task channel and spawn the verifiers + tasks := make(chan int, workers) + results := make(chan nonceCheckResult, len(items)) // Buffered to make sure all workers stop + for i := 0; i < workers; i++ { + go func() { + for index := range tasks { + results <- nonceCheckResult{index: index, valid: checker.Verify(items[index])} + } + }() + } + // Feed item indices to the workers until done or aborted + abort := make(chan struct{}) + go func() { + defer close(tasks) + + for i := range items { + select { + case tasks <- i: + continue + case <-abort: + return + } + } + }() + return abort, results +} diff --git a/core/chain_pow_test.go b/core/chain_pow_test.go new file mode 100644 index 000000000000..d8792ffdb7f9 --- /dev/null +++ b/core/chain_pow_test.go @@ -0,0 +1,233 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "math/big" + "runtime" + "testing" + "time" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/pow" +) + +// failPow is a non-validating proof of work implementation, that returns true +// from Verify for all but one block. +type failPow struct { + failing uint64 +} + +func (pow failPow) Search(pow.Block, <-chan struct{}) (uint64, []byte) { + return 0, nil +} +func (pow failPow) Verify(block pow.Block) bool { return block.NumberU64() != pow.failing } +func (pow failPow) GetHashrate() int64 { return 0 } +func (pow failPow) Turbo(bool) {} + +// delayedPow is a non-validating proof of work implementation, that returns true +// from Verify for all blocks, but delays them the configured amount of time. +type delayedPow struct { + delay time.Duration +} + +func (pow delayedPow) Search(pow.Block, <-chan struct{}) (uint64, []byte) { + return 0, nil +} +func (pow delayedPow) Verify(block pow.Block) bool { time.Sleep(pow.delay); return true } +func (pow delayedPow) GetHashrate() int64 { return 0 } +func (pow delayedPow) Turbo(bool) {} + +// Tests that simple POW verification works, for both good and bad blocks. +func TestPowVerification(t *testing.T) { + // Create a simple chain to verify + var ( + testdb, _ = ethdb.NewMemDatabase() + genesis = GenesisBlockForTesting(testdb, common.Address{}, new(big.Int)) + blocks = GenerateChain(genesis, testdb, 8, nil) + ) + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + // Run the POW checker for blocks one-by-one, checking for both valid and invalid nonces + for i := 0; i < len(blocks); i++ { + for j, full := range []bool{true, false} { + for k, valid := range []bool{true, false} { + var results <-chan nonceCheckResult + + switch { + case full && valid: + _, results = verifyNoncesFromBlocks(FakePow{}, []*types.Block{blocks[i]}) + case full && !valid: + _, results = verifyNoncesFromBlocks(failPow{blocks[i].NumberU64()}, []*types.Block{blocks[i]}) + case !full && valid: + _, results = verifyNoncesFromHeaders(FakePow{}, []*types.Header{headers[i]}) + case !full && !valid: + _, results = verifyNoncesFromHeaders(failPow{headers[i].Number.Uint64()}, []*types.Header{headers[i]}) + } + // Wait for the verification result + select { + case result := <-results: + if result.index != 0 { + t.Errorf("test %d.%d.%d: invalid index: have %d, want 0", i, j, k, result.index) + } + if result.valid != valid { + t.Errorf("test %d.%d.%d: validity mismatch: have %v, want %v", i, j, k, result.valid, valid) + } + case <-time.After(time.Second): + t.Fatalf("test %d.%d.%d: verification timeout", i, j, k) + } + // Make sure no more data is returned + select { + case result := <-results: + t.Fatalf("test %d.%d.%d: unexpected result returned: %v", i, j, k, result) + case <-time.After(25 * time.Millisecond): + } + } + } + } +} + +// Tests that concurrent POW verification works, for both good and bad blocks. +func TestPowConcurrentVerification2(t *testing.T) { testPowConcurrentVerification(t, 2) } +func TestPowConcurrentVerification8(t *testing.T) { testPowConcurrentVerification(t, 8) } +func TestPowConcurrentVerification32(t *testing.T) { testPowConcurrentVerification(t, 32) } + +func testPowConcurrentVerification(t *testing.T, threads int) { + // Create a simple chain to verify + var ( + testdb, _ = ethdb.NewMemDatabase() + genesis = GenesisBlockForTesting(testdb, common.Address{}, new(big.Int)) + blocks = GenerateChain(genesis, testdb, 8, nil) + ) + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + // Set the number of threads to verify on + old := runtime.GOMAXPROCS(threads) + defer runtime.GOMAXPROCS(old) + + // Run the POW checker for the entire block chain at once both for a valid and + // also an invalid chain (enough if one is invalid, last but one (arbitrary)). + for i, full := range []bool{true, false} { + for j, valid := range []bool{true, false} { + var results <-chan nonceCheckResult + + switch { + case full && valid: + _, results = verifyNoncesFromBlocks(FakePow{}, blocks) + case full && !valid: + _, results = verifyNoncesFromBlocks(failPow{uint64(len(blocks) - 1)}, blocks) + case !full && valid: + _, results = verifyNoncesFromHeaders(FakePow{}, headers) + case !full && !valid: + _, results = verifyNoncesFromHeaders(failPow{uint64(len(headers) - 1)}, headers) + } + // Wait for all the verification results + checks := make(map[int]bool) + for k := 0; k < len(blocks); k++ { + select { + case result := <-results: + if _, ok := checks[result.index]; ok { + t.Fatalf("test %d.%d.%d: duplicate results for %d", i, j, k, result.index) + } + if result.index < 0 || result.index >= len(blocks) { + t.Fatalf("test %d.%d.%d: result %d out of bounds [%d, %d]", i, j, k, result.index, 0, len(blocks)-1) + } + checks[result.index] = result.valid + + case <-time.After(time.Second): + t.Fatalf("test %d.%d.%d: verification timeout", i, j, k) + } + } + // Check nonce check validity + for k := 0; k < len(blocks); k++ { + want := valid || (k != len(blocks)-2) // We chose the last but one nonce in the chain to fail + if checks[k] != want { + t.Errorf("test %d.%d.%d: validity mismatch: have %v, want %v", i, j, k, checks[k], want) + } + } + // Make sure no more data is returned + select { + case result := <-results: + t.Fatalf("test %d.%d: unexpected result returned: %v", i, j, result) + case <-time.After(25 * time.Millisecond): + } + } + } +} + +// Tests that aborting a POW validation indeed prevents further checks from being +// run, as well as checks that no left-over goroutines are leaked. +func TestPowConcurrentAbortion2(t *testing.T) { testPowConcurrentAbortion(t, 2) } +func TestPowConcurrentAbortion8(t *testing.T) { testPowConcurrentAbortion(t, 8) } +func TestPowConcurrentAbortion32(t *testing.T) { testPowConcurrentAbortion(t, 32) } + +func testPowConcurrentAbortion(t *testing.T, threads int) { + // Create a simple chain to verify + var ( + testdb, _ = ethdb.NewMemDatabase() + genesis = GenesisBlockForTesting(testdb, common.Address{}, new(big.Int)) + blocks = GenerateChain(genesis, testdb, 1024, nil) + ) + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + // Set the number of threads to verify on + old := runtime.GOMAXPROCS(threads) + defer runtime.GOMAXPROCS(old) + + // Run the POW checker for the entire block chain at once + for i, full := range []bool{true, false} { + var abort chan<- struct{} + var results <-chan nonceCheckResult + + // Start the verifications and immediately abort + if full { + abort, results = verifyNoncesFromBlocks(delayedPow{time.Millisecond}, blocks) + } else { + abort, results = verifyNoncesFromHeaders(delayedPow{time.Millisecond}, headers) + } + close(abort) + + // Deplete the results channel + verified := make(map[int]struct{}) + for depleted := false; !depleted; { + select { + case result := <-results: + verified[result.index] = struct{}{} + case <-time.After(50 * time.Millisecond): + depleted = true + } + } + // Check that abortion was honored by not processing too many POWs + if len(verified) > 2*threads { + t.Errorf("test %d: verification count too large: have %d, want below %d", i, len(verified), 2*threads) + } + // Check that there are no gaps in the results + for j := 0; j < len(verified); j++ { + if _, ok := verified[j]; !ok { + t.Errorf("test %d.%d: gap found in verification results", i, j) + } + } + } +} diff --git a/core/chain_util.go b/core/chain_util.go index 680355e5b711..7c11a8a105c6 100644 --- a/core/chain_util.go +++ b/core/chain_util.go @@ -19,10 +19,10 @@ package core import ( "bytes" "math/big" - "time" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/params" @@ -30,9 +30,18 @@ import ( ) var ( - blockHashPre = []byte("block-hash-") - blockNumPre = []byte("block-num-") + headHeaderKey = []byte("LastHeader") + headBlockKey = []byte("LastBlock") + + blockPrefix = []byte("block-") + blockNumPrefix = []byte("block-num-") + + headerSuffix = []byte("-header") + bodySuffix = []byte("-body") + tdSuffix = []byte("-td") + ExpDiffPeriod = big.NewInt(100000) + blockHashPre = []byte("block-hash-") // [deprecated by eth/63] ) // CalcDifficulty is the difficulty adjustment algorithm. It returns @@ -76,16 +85,6 @@ func CalcDifficulty(time, parentTime uint64, parentNumber, parentDiff *big.Int) return diff } -// CalcTD computes the total difficulty of block. -func CalcTD(block, parent *types.Block) *big.Int { - if parent == nil { - return block.Difficulty() - } - d := block.Difficulty() - d.Add(d, parent.Td) - return d -} - // CalcGasLimit computes the gas limit of the next block after parent. // The result may be modified by the caller. // This is miner strategy, not consensus protocol. @@ -119,68 +118,238 @@ func CalcGasLimit(parent *types.Block) *big.Int { return gl } -// GetBlockByHash returns the block corresponding to the hash or nil if not found -func GetBlockByHash(db common.Database, hash common.Hash) *types.Block { - data, _ := db.Get(append(blockHashPre, hash[:]...)) +// GetCanonicalHash retrieves a hash assigned to a canonical block number. +func GetCanonicalHash(db ethdb.Database, number uint64) common.Hash { + data, _ := db.Get(append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...)) + if len(data) == 0 { + return common.Hash{} + } + return common.BytesToHash(data) +} + +// GetHeadHeaderHash retrieves the hash of the current canonical head block's +// header. The difference between this and GetHeadBlockHash is that whereas the +// last block hash is only updated upon a full block import, the last header +// hash is updated already at header import, allowing head tracking for the +// fast synchronization mechanism. +func GetHeadHeaderHash(db ethdb.Database) common.Hash { + data, _ := db.Get(headHeaderKey) + if len(data) == 0 { + return common.Hash{} + } + return common.BytesToHash(data) +} + +// GetHeadBlockHash retrieves the hash of the current canonical head block. +func GetHeadBlockHash(db ethdb.Database) common.Hash { + data, _ := db.Get(headBlockKey) + if len(data) == 0 { + return common.Hash{} + } + return common.BytesToHash(data) +} + +// GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil +// if the header's not found. +func GetHeaderRLP(db ethdb.Database, hash common.Hash) rlp.RawValue { + data, _ := db.Get(append(append(blockPrefix, hash[:]...), headerSuffix...)) + return data +} + +// GetHeader retrieves the block header corresponding to the hash, nil if none +// found. +func GetHeader(db ethdb.Database, hash common.Hash) *types.Header { + data := GetHeaderRLP(db, hash) if len(data) == 0 { return nil } - var block types.StorageBlock - if err := rlp.Decode(bytes.NewReader(data), &block); err != nil { - glog.V(logger.Error).Infof("invalid block RLP for hash %x: %v", hash, err) + header := new(types.Header) + if err := rlp.Decode(bytes.NewReader(data), header); err != nil { + glog.V(logger.Error).Infof("invalid block header RLP for hash %x: %v", hash, err) return nil } - return (*types.Block)(&block) + return header +} + +// GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. +func GetBodyRLP(db ethdb.Database, hash common.Hash) rlp.RawValue { + data, _ := db.Get(append(append(blockPrefix, hash[:]...), bodySuffix...)) + return data } -// GetBlockByHash returns the canonical block by number or nil if not found -func GetBlockByNumber(db common.Database, number uint64) *types.Block { - key, _ := db.Get(append(blockNumPre, big.NewInt(int64(number)).Bytes()...)) - if len(key) == 0 { +// GetBody retrieves the block body (transactons, uncles) corresponding to the +// hash, nil if none found. +func GetBody(db ethdb.Database, hash common.Hash) *types.Body { + data := GetBodyRLP(db, hash) + if len(data) == 0 { + return nil + } + body := new(types.Body) + if err := rlp.Decode(bytes.NewReader(data), body); err != nil { + glog.V(logger.Error).Infof("invalid block body RLP for hash %x: %v", hash, err) return nil } + return body +} - return GetBlockByHash(db, common.BytesToHash(key)) +// GetTd retrieves a block's total difficulty corresponding to the hash, nil if +// none found. +func GetTd(db ethdb.Database, hash common.Hash) *big.Int { + data, _ := db.Get(append(append(blockPrefix, hash.Bytes()...), tdSuffix...)) + if len(data) == 0 { + return nil + } + td := new(big.Int) + if err := rlp.Decode(bytes.NewReader(data), td); err != nil { + glog.V(logger.Error).Infof("invalid block total difficulty RLP for hash %x: %v", hash, err) + return nil + } + return td } -// WriteCanonNumber writes the canonical hash for the given block -func WriteCanonNumber(db common.Database, block *types.Block) error { - key := append(blockNumPre, block.Number().Bytes()...) - err := db.Put(key, block.Hash().Bytes()) - if err != nil { +// GetBlock retrieves an entire block corresponding to the hash, assembling it +// back from the stored header and body. +func GetBlock(db ethdb.Database, hash common.Hash) *types.Block { + // Retrieve the block header and body contents + header := GetHeader(db, hash) + if header == nil { + return nil + } + body := GetBody(db, hash) + if body == nil { + return nil + } + // Reassemble the block and return + return types.NewBlockWithHeader(header).WithBody(body.Transactions, body.Uncles) +} + +// WriteCanonicalHash stores the canonical hash for the given block number. +func WriteCanonicalHash(db ethdb.Database, hash common.Hash, number uint64) error { + key := append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...) + if err := db.Put(key, hash.Bytes()); err != nil { + glog.Fatalf("failed to store number to hash mapping into database: %v", err) return err } return nil } -// WriteHead force writes the current head -func WriteHead(db common.Database, block *types.Block) error { - err := WriteCanonNumber(db, block) - if err != nil { +// WriteHeadHeaderHash stores the head header's hash. +func WriteHeadHeaderHash(db ethdb.Database, hash common.Hash) error { + if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { + glog.Fatalf("failed to store last header's hash into database: %v", err) return err } - err = db.Put([]byte("LastBlock"), block.Hash().Bytes()) - if err != nil { + return nil +} + +// WriteHeadBlockHash stores the head block's hash. +func WriteHeadBlockHash(db ethdb.Database, hash common.Hash) error { + if err := db.Put(headBlockKey, hash.Bytes()); err != nil { + glog.Fatalf("failed to store last block's hash into database: %v", err) return err } return nil } -// WriteBlock writes a block to the database -func WriteBlock(db common.Database, block *types.Block) error { - tstart := time.Now() +// WriteHeader serializes a block header into the database. +func WriteHeader(db ethdb.Database, header *types.Header) error { + data, err := rlp.EncodeToBytes(header) + if err != nil { + return err + } + key := append(append(blockPrefix, header.Hash().Bytes()...), headerSuffix...) + if err := db.Put(key, data); err != nil { + glog.Fatalf("failed to store header into database: %v", err) + return err + } + glog.V(logger.Debug).Infof("stored header #%v [%x…]", header.Number, header.Hash().Bytes()[:4]) + return nil +} - enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block)) - key := append(blockHashPre, block.Hash().Bytes()...) - err := db.Put(key, enc) +// WriteBody serializes the body of a block into the database. +func WriteBody(db ethdb.Database, hash common.Hash, body *types.Body) error { + data, err := rlp.EncodeToBytes(body) if err != nil { - glog.Fatal("db write fail:", err) return err } + key := append(append(blockPrefix, hash.Bytes()...), bodySuffix...) + if err := db.Put(key, data); err != nil { + glog.Fatalf("failed to store block body into database: %v", err) + return err + } + glog.V(logger.Debug).Infof("stored block body [%x…]", hash.Bytes()[:4]) + return nil +} - if glog.V(logger.Debug) { - glog.Infof("wrote block #%v %s. Took %v\n", block.Number(), common.PP(block.Hash().Bytes()), time.Since(tstart)) +// WriteTd serializes the total difficulty of a block into the database. +func WriteTd(db ethdb.Database, hash common.Hash, td *big.Int) error { + data, err := rlp.EncodeToBytes(td) + if err != nil { + return err } + key := append(append(blockPrefix, hash.Bytes()...), tdSuffix...) + if err := db.Put(key, data); err != nil { + glog.Fatalf("failed to store block total difficulty into database: %v", err) + return err + } + glog.V(logger.Debug).Infof("stored block total difficulty [%x…]: %v", hash.Bytes()[:4], td) + return nil +} +// WriteBlock serializes a block into the database, header and body separately. +func WriteBlock(db ethdb.Database, block *types.Block) error { + // Store the body first to retain database consistency + if err := WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil { + return err + } + // Store the header too, signaling full block ownership + if err := WriteHeader(db, block.Header()); err != nil { + return err + } return nil } + +// DeleteCanonicalHash removes the number to hash canonical mapping. +func DeleteCanonicalHash(db ethdb.Database, number uint64) { + db.Delete(append(blockNumPrefix, big.NewInt(int64(number)).Bytes()...)) +} + +// DeleteHeader removes all block header data associated with a hash. +func DeleteHeader(db ethdb.Database, hash common.Hash) { + db.Delete(append(append(blockPrefix, hash.Bytes()...), headerSuffix...)) +} + +// DeleteBody removes all block body data associated with a hash. +func DeleteBody(db ethdb.Database, hash common.Hash) { + db.Delete(append(append(blockPrefix, hash.Bytes()...), bodySuffix...)) +} + +// DeleteTd removes all block total difficulty data associated with a hash. +func DeleteTd(db ethdb.Database, hash common.Hash) { + db.Delete(append(append(blockPrefix, hash.Bytes()...), tdSuffix...)) +} + +// DeleteBlock removes all block data associated with a hash. +func DeleteBlock(db ethdb.Database, hash common.Hash) { + DeleteHeader(db, hash) + DeleteBody(db, hash) + DeleteTd(db, hash) +} + +// [deprecated by eth/63] +// GetBlockByHashOld returns the old combined block corresponding to the hash +// or nil if not found. This method is only used by the upgrade mechanism to +// access the old combined block representation. It will be dropped after the +// network transitions to eth/63. +func GetBlockByHashOld(db ethdb.Database, hash common.Hash) *types.Block { + data, _ := db.Get(append(blockHashPre, hash[:]...)) + if len(data) == 0 { + return nil + } + var block types.StorageBlock + if err := rlp.Decode(bytes.NewReader(data), &block); err != nil { + glog.V(logger.Error).Infof("invalid block RLP for hash %x: %v", hash, err) + return nil + } + return (*types.Block)(&block) +} diff --git a/core/chain_util_test.go b/core/chain_util_test.go index 095e4b273541..eb069c392c3a 100644 --- a/core/chain_util_test.go +++ b/core/chain_util_test.go @@ -23,6 +23,10 @@ import ( "testing" "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto/sha3" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/rlp" ) type diffTest struct { @@ -75,3 +79,242 @@ func TestDifficulty(t *testing.T) { } } } + +// Tests block header storage and retrieval operations. +func TestHeaderStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + // Create a test header to move around the database and make sure it's really new + header := &types.Header{Extra: []byte("test header")} + if entry := GetHeader(db, header.Hash()); entry != nil { + t.Fatalf("Non existent header returned: %v", entry) + } + // Write and verify the header in the database + if err := WriteHeader(db, header); err != nil { + t.Fatalf("Failed to write header into database: %v", err) + } + if entry := GetHeader(db, header.Hash()); entry == nil { + t.Fatalf("Stored header not found") + } else if entry.Hash() != header.Hash() { + t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, header) + } + if entry := GetHeaderRLP(db, header.Hash()); entry == nil { + t.Fatalf("Stored header RLP not found") + } else { + hasher := sha3.NewKeccak256() + hasher.Write(entry) + + if hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() { + t.Fatalf("Retrieved RLP header mismatch: have %v, want %v", entry, header) + } + } + // Delete the header and verify the execution + DeleteHeader(db, header.Hash()) + if entry := GetHeader(db, header.Hash()); entry != nil { + t.Fatalf("Deleted header returned: %v", entry) + } +} + +// Tests block body storage and retrieval operations. +func TestBodyStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + // Create a test body to move around the database and make sure it's really new + body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} + + hasher := sha3.NewKeccak256() + rlp.Encode(hasher, body) + hash := common.BytesToHash(hasher.Sum(nil)) + + if entry := GetBody(db, hash); entry != nil { + t.Fatalf("Non existent body returned: %v", entry) + } + // Write and verify the body in the database + if err := WriteBody(db, hash, body); err != nil { + t.Fatalf("Failed to write body into database: %v", err) + } + if entry := GetBody(db, hash); entry == nil { + t.Fatalf("Stored body not found") + } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(types.Transactions(body.Transactions)) || types.CalcUncleHash(entry.Uncles) != types.CalcUncleHash(body.Uncles) { + t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, body) + } + if entry := GetBodyRLP(db, hash); entry == nil { + t.Fatalf("Stored body RLP not found") + } else { + hasher := sha3.NewKeccak256() + hasher.Write(entry) + + if calc := common.BytesToHash(hasher.Sum(nil)); calc != hash { + t.Fatalf("Retrieved RLP body mismatch: have %v, want %v", entry, body) + } + } + // Delete the body and verify the execution + DeleteBody(db, hash) + if entry := GetBody(db, hash); entry != nil { + t.Fatalf("Deleted body returned: %v", entry) + } +} + +// Tests block storage and retrieval operations. +func TestBlockStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + // Create a test block to move around the database and make sure it's really new + block := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block")}) + if entry := GetBlock(db, block.Hash()); entry != nil { + t.Fatalf("Non existent block returned: %v", entry) + } + if entry := GetHeader(db, block.Hash()); entry != nil { + t.Fatalf("Non existent header returned: %v", entry) + } + if entry := GetBody(db, block.Hash()); entry != nil { + t.Fatalf("Non existent body returned: %v", entry) + } + // Write and verify the block in the database + if err := WriteBlock(db, block); err != nil { + t.Fatalf("Failed to write block into database: %v", err) + } + if entry := GetBlock(db, block.Hash()); entry == nil { + t.Fatalf("Stored block not found") + } else if entry.Hash() != block.Hash() { + t.Fatalf("Retrieved block mismatch: have %v, want %v", entry, block) + } + if entry := GetHeader(db, block.Hash()); entry == nil { + t.Fatalf("Stored header not found") + } else if entry.Hash() != block.Header().Hash() { + t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, block.Header()) + } + if entry := GetBody(db, block.Hash()); entry == nil { + t.Fatalf("Stored body not found") + } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(block.Transactions()) || types.CalcUncleHash(entry.Uncles) != types.CalcUncleHash(block.Uncles()) { + t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, &types.Body{block.Transactions(), block.Uncles()}) + } + // Delete the block and verify the execution + DeleteBlock(db, block.Hash()) + if entry := GetBlock(db, block.Hash()); entry != nil { + t.Fatalf("Deleted block returned: %v", entry) + } + if entry := GetHeader(db, block.Hash()); entry != nil { + t.Fatalf("Deleted header returned: %v", entry) + } + if entry := GetBody(db, block.Hash()); entry != nil { + t.Fatalf("Deleted body returned: %v", entry) + } +} + +// Tests that partial block contents don't get reassembled into full blocks. +func TestPartialBlockStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + block := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block")}) + + // Store a header and check that it's not recognized as a block + if err := WriteHeader(db, block.Header()); err != nil { + t.Fatalf("Failed to write header into database: %v", err) + } + if entry := GetBlock(db, block.Hash()); entry != nil { + t.Fatalf("Non existent block returned: %v", entry) + } + DeleteHeader(db, block.Hash()) + + // Store a body and check that it's not recognized as a block + if err := WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil { + t.Fatalf("Failed to write body into database: %v", err) + } + if entry := GetBlock(db, block.Hash()); entry != nil { + t.Fatalf("Non existent block returned: %v", entry) + } + DeleteBody(db, block.Hash()) + + // Store a header and a body separately and check reassembly + if err := WriteHeader(db, block.Header()); err != nil { + t.Fatalf("Failed to write header into database: %v", err) + } + if err := WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil { + t.Fatalf("Failed to write body into database: %v", err) + } + if entry := GetBlock(db, block.Hash()); entry == nil { + t.Fatalf("Stored block not found") + } else if entry.Hash() != block.Hash() { + t.Fatalf("Retrieved block mismatch: have %v, want %v", entry, block) + } +} + +// Tests block total difficulty storage and retrieval operations. +func TestTdStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + // Create a test TD to move around the database and make sure it's really new + hash, td := common.Hash{}, big.NewInt(314) + if entry := GetTd(db, hash); entry != nil { + t.Fatalf("Non existent TD returned: %v", entry) + } + // Write and verify the TD in the database + if err := WriteTd(db, hash, td); err != nil { + t.Fatalf("Failed to write TD into database: %v", err) + } + if entry := GetTd(db, hash); entry == nil { + t.Fatalf("Stored TD not found") + } else if entry.Cmp(td) != 0 { + t.Fatalf("Retrieved TD mismatch: have %v, want %v", entry, td) + } + // Delete the TD and verify the execution + DeleteTd(db, hash) + if entry := GetTd(db, hash); entry != nil { + t.Fatalf("Deleted TD returned: %v", entry) + } +} + +// Tests that canonical numbers can be mapped to hashes and retrieved. +func TestCanonicalMappingStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + // Create a test canonical number and assinged hash to move around + hash, number := common.Hash{0: 0xff}, uint64(314) + if entry := GetCanonicalHash(db, number); entry != (common.Hash{}) { + t.Fatalf("Non existent canonical mapping returned: %v", entry) + } + // Write and verify the TD in the database + if err := WriteCanonicalHash(db, hash, number); err != nil { + t.Fatalf("Failed to write canonical mapping into database: %v", err) + } + if entry := GetCanonicalHash(db, number); entry == (common.Hash{}) { + t.Fatalf("Stored canonical mapping not found") + } else if entry != hash { + t.Fatalf("Retrieved canonical mapping mismatch: have %v, want %v", entry, hash) + } + // Delete the TD and verify the execution + DeleteCanonicalHash(db, number) + if entry := GetCanonicalHash(db, number); entry != (common.Hash{}) { + t.Fatalf("Deleted canonical mapping returned: %v", entry) + } +} + +// Tests that head headers and head blocks can be assigned, individually. +func TestHeadStorage(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + + blockHead := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block header")}) + blockFull := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block full")}) + + // Check that no head entries are in a pristine database + if entry := GetHeadHeaderHash(db); entry != (common.Hash{}) { + t.Fatalf("Non head header entry returned: %v", entry) + } + if entry := GetHeadBlockHash(db); entry != (common.Hash{}) { + t.Fatalf("Non head block entry returned: %v", entry) + } + // Assign separate entries for the head header and block + if err := WriteHeadHeaderHash(db, blockHead.Hash()); err != nil { + t.Fatalf("Failed to write head header hash: %v", err) + } + if err := WriteHeadBlockHash(db, blockFull.Hash()); err != nil { + t.Fatalf("Failed to write head block hash: %v", err) + } + // Check that both heads are present, and different (i.e. two heads maintained) + if entry := GetHeadHeaderHash(db); entry != blockHead.Hash() { + t.Fatalf("Head header hash mismatch: have %v, want %v", entry, blockHead.Hash()) + } + if entry := GetHeadBlockHash(db); entry != blockFull.Hash() { + t.Fatalf("Head block hash mismatch: have %v, want %v", entry, blockFull.Hash()) + } +} diff --git a/core/error.go b/core/error.go index 715ee1bba9e3..269a8db47b06 100644 --- a/core/error.go +++ b/core/error.go @@ -177,3 +177,14 @@ func IsValueTransferErr(e error) bool { _, ok := e.(*ValueTransferError) return ok } + +type BadHashError common.Hash + +func (h BadHashError) Error() string { + return fmt.Sprintf("Found known bad hash in chain %x", h[:]) +} + +func IsBadHashError(err error) bool { + _, ok := err.(BadHashError) + return ok +} diff --git a/core/events.go b/core/events.go index bd91da6954ad..761690d60a0e 100644 --- a/core/events.go +++ b/core/events.go @@ -36,6 +36,9 @@ type NewBlockEvent struct{ Block *types.Block } // NewMinedBlockEvent is posted when a block has been imported. type NewMinedBlockEvent struct{ Block *types.Block } +// RemovedTransactionEvent is posted when a reorg happens +type RemovedTransactionEvent struct{ Txs types.Transactions } + // ChainSplit is posted when a new head is detected type ChainSplitEvent struct { Block *types.Block diff --git a/core/filter.go b/core/filter.go index 0bd8357dfed2..04662a831db1 100644 --- a/core/filter.go +++ b/core/filter.go @@ -131,12 +131,12 @@ done: func includes(addresses []common.Address, a common.Address) bool { for _, addr := range addresses { - if addr != a { - return false + if addr == a { + return true } } - return true + return false } func (self *Filter) FilterLogs(logs state.Logs) state.Logs { diff --git a/core/genesis.go b/core/genesis.go index fd8563a32725..3345502e42c8 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -27,13 +27,14 @@ import ( "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/params" ) // WriteGenesisBlock writes the genesis block to the database as block number 0 -func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, error) { +func WriteGenesisBlock(chainDb ethdb.Database, reader io.Reader) (*types.Block, error) { contents, err := ioutil.ReadAll(reader) if err != nil { return nil, err @@ -82,34 +83,35 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, Coinbase: common.HexToAddress(genesis.Coinbase), Root: statedb.Root(), }, nil, nil, nil) - block.Td = difficulty - if block := GetBlockByHash(chainDb, block.Hash()); block != nil { + if block := GetBlock(chainDb, block.Hash()); block != nil { glog.V(logger.Info).Infoln("Genesis block already in chain. Writing canonical number") - err := WriteCanonNumber(chainDb, block) + err := WriteCanonicalHash(chainDb, block.Hash(), block.NumberU64()) if err != nil { return nil, err } return block, nil } - statedb.Sync() - err = WriteBlock(chainDb, block) - if err != nil { + if err := WriteTd(chainDb, block.Hash(), difficulty); err != nil { return nil, err } - err = WriteHead(chainDb, block) - if err != nil { + if err := WriteBlock(chainDb, block); err != nil { + return nil, err + } + if err := WriteCanonicalHash(chainDb, block.Hash(), block.NumberU64()); err != nil { + return nil, err + } + if err := WriteHeadBlockHash(chainDb, block.Hash()); err != nil { return nil, err } - return block, nil } // GenesisBlockForTesting creates a block in which addr has the given wei balance. // The state trie of the block is written to db. -func GenesisBlockForTesting(db common.Database, addr common.Address, balance *big.Int) *types.Block { +func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block { statedb := state.New(common.Hash{}, db) obj := statedb.GetOrNewStateObject(addr) obj.SetBalance(balance) @@ -120,24 +122,35 @@ func GenesisBlockForTesting(db common.Database, addr common.Address, balance *bi GasLimit: params.GenesisGasLimit, Root: statedb.Root(), }, nil, nil, nil) - block.Td = params.GenesisDifficulty return block } -func WriteGenesisBlockForTesting(db common.Database, addr common.Address, balance *big.Int) *types.Block { +type GenesisAccount struct { + Address common.Address + Balance *big.Int +} + +func WriteGenesisBlockForTesting(db ethdb.Database, accounts ...GenesisAccount) *types.Block { + accountJson := "{" + for i, account := range accounts { + if i != 0 { + accountJson += "," + } + accountJson += fmt.Sprintf(`"0x%x":{"balance":"0x%x"}`, account.Address, account.Balance.Bytes()) + } + accountJson += "}" + testGenesis := fmt.Sprintf(`{ "nonce":"0x%x", "gasLimit":"0x%x", "difficulty":"0x%x", - "alloc": { - "0x%x":{"balance":"0x%x"} - } -}`, types.EncodeNonce(0), params.GenesisGasLimit.Bytes(), params.GenesisDifficulty.Bytes(), addr, balance.Bytes()) + "alloc": %s +}`, types.EncodeNonce(0), params.GenesisGasLimit.Bytes(), params.GenesisDifficulty.Bytes(), accountJson) block, _ := WriteGenesisBlock(db, strings.NewReader(testGenesis)) return block } -func WriteTestNetGenesisBlock(chainDb common.Database, nonce uint64) (*types.Block, error) { +func WriteTestNetGenesisBlock(chainDb ethdb.Database, nonce uint64) (*types.Block, error) { testGenesis := fmt.Sprintf(`{ "nonce":"0x%x", "gasLimit":"0x%x", diff --git a/core/helper_test.go b/core/helper_test.go index eb74c7bec165..1c52afaad28e 100644 --- a/core/helper_test.go +++ b/core/helper_test.go @@ -22,7 +22,7 @@ import ( "github.com/expanse-project/go-expanse/core/types" // "github.com/expanse-project/go-expanse/crypto" - "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" ) @@ -32,7 +32,7 @@ type TestManager struct { // stateManager *StateManager eventMux *event.TypeMux - db common.Database + db ethdb.Database txPool *TxPool blockChain *ChainManager Blocks []*types.Block @@ -74,7 +74,7 @@ func (tm *TestManager) EventMux() *event.TypeMux { // return nil // } -func (tm *TestManager) Db() common.Database { +func (tm *TestManager) Db() ethdb.Database { return tm.db } diff --git a/core/manager.go b/core/manager.go index ce62e6305954..29da5ec04169 100644 --- a/core/manager.go +++ b/core/manager.go @@ -17,8 +17,9 @@ package core import ( + "github.com/expanse-project/go-expanse/accounts" - "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" ) @@ -28,7 +29,7 @@ type Backend interface { BlockProcessor() *BlockProcessor ChainManager() *ChainManager TxPool() *TxPool - ChainDb() common.Database - DappDb() common.Database + ChainDb() ethdb.Database + DappDb() ethdb.Database EventMux() *event.TypeMux } diff --git a/core/state/state_object.go b/core/state/state_object.go index 149553c11fa1..b137fe210526 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -23,6 +23,7 @@ import ( "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/rlp" @@ -56,7 +57,7 @@ func (self Storage) Copy() Storage { type StateObject struct { // State database for storing state changes - db common.Database + db ethdb.Database trie *trie.SecureTrie // Address belonging to this account @@ -87,11 +88,7 @@ type StateObject struct { dirty bool } -func (self *StateObject) Reset() { - self.storage = make(Storage) -} - -func NewStateObject(address common.Address, db common.Database) *StateObject { +func NewStateObject(address common.Address, db ethdb.Database) *StateObject { object := &StateObject{db: db, address: address, balance: new(big.Int), gasPool: new(big.Int), dirty: true} object.trie = trie.NewSecure((common.Hash{}).Bytes(), db) object.storage = make(Storage) @@ -100,7 +97,7 @@ func NewStateObject(address common.Address, db common.Database) *StateObject { return object } -func NewStateObjectFromBytes(address common.Address, data []byte, db common.Database) *StateObject { +func NewStateObjectFromBytes(address common.Address, data []byte, db ethdb.Database) *StateObject { // TODO clean me up var extobject struct { Nonce uint64 @@ -184,14 +181,6 @@ func (self *StateObject) Update() { } } -func (c *StateObject) GetInstr(pc *big.Int) *common.Value { - if int64(len(c.code)-1) < pc.Int64() { - return common.NewValue(0) - } - - return common.NewValueFromBytes([]byte{c.code[pc.Int64()]}) -} - func (c *StateObject) AddBalance(amount *big.Int) { c.SetBalance(new(big.Int).Add(c.balance, amount)) @@ -268,10 +257,6 @@ func (self *StateObject) Copy() *StateObject { return stateObject } -func (self *StateObject) Set(stateObject *StateObject) { - *self = *stateObject -} - // // Attribute accessors // @@ -280,20 +265,11 @@ func (self *StateObject) Balance() *big.Int { return self.balance } -func (c *StateObject) N() *big.Int { - return big.NewInt(int64(c.nonce)) -} - // Returns the address of the contract/account func (c *StateObject) Address() common.Address { return c.address } -// Returns the initialization Code -func (c *StateObject) Init() Code { - return c.initCode -} - func (self *StateObject) Trie() *trie.SecureTrie { return self.trie } @@ -311,11 +287,6 @@ func (self *StateObject) SetCode(code []byte) { self.dirty = true } -func (self *StateObject) SetInitCode(code []byte) { - self.initCode = code - self.dirty = true -} - func (self *StateObject) SetNonce(nonce uint64) { self.nonce = nonce self.dirty = true @@ -354,19 +325,6 @@ func (c *StateObject) CodeHash() common.Bytes { return crypto.Sha3(c.code) } -func (c *StateObject) RlpDecode(data []byte) { - decoder := common.NewValueFromBytes(data) - c.nonce = decoder.Get(0).Uint() - c.balance = decoder.Get(1).BigInt() - c.trie = trie.NewSecure(decoder.Get(2).Bytes(), c.db) - c.storage = make(map[string]common.Hash) - c.gasPool = new(big.Int) - - c.codeHash = decoder.Get(3).Bytes() - - c.code, _ = c.db.Get(c.codeHash) -} - // Storage change object. Used by the manifest for notifying changes to // the sub channels. type StorageState struct { diff --git a/core/state/statedb.go b/core/state/statedb.go index 1d4ca3c7908d..3085ff97902e 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -18,13 +18,14 @@ package state import ( - "bytes" "math/big" "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/trie" + ) // StateDBs within the expanse protocol are used to store anything @@ -33,7 +34,7 @@ import ( // * Contracts // * Accounts type StateDB struct { - db common.Database + db ethdb.Database trie *trie.SecureTrie root common.Hash @@ -48,7 +49,7 @@ type StateDB struct { } // Create a new state from a given trie -func New(root common.Hash, db common.Database) *StateDB { +func New(root common.Hash, db ethdb.Database) *StateDB { trie := trie.NewSecure(root[:], db) return &StateDB{root: root, db: db, trie: trie, stateObjects: make(map[string]*StateObject), refund: new(big.Int), logs: make(map[common.Hash]Logs)} } @@ -276,10 +277,6 @@ func (self *StateDB) CreateAccount(addr common.Address) *StateObject { // Setting, copying of the state methods // -func (s *StateDB) Cmp(other *StateDB) bool { - return bytes.Equal(s.trie.Root(), other.trie.Root()) -} - func (self *StateDB) Copy() *StateDB { state := New(common.Hash{}, self.db) state.trie = self.trie @@ -311,22 +308,6 @@ func (s *StateDB) Root() common.Hash { return common.BytesToHash(s.trie.Root()) } -func (s *StateDB) Trie() *trie.SecureTrie { - return s.trie -} - -// Resets the trie and all siblings -func (s *StateDB) Reset() { - s.trie.Reset() - - // Reset all nested states - for _, stateObject := range s.stateObjects { - stateObject.Reset() - } - - s.Empty() -} - // Syncs the trie and all siblings func (s *StateDB) Sync() { // Sync all nested states diff --git a/core/transaction_pool.go b/core/transaction_pool.go index d9389b238f92..a7996dcccea7 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -81,7 +81,7 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func( gasLimit: gasLimitFn, minGasPrice: new(big.Int), pendingState: state.ManageState(currentStateFn()), - events: eventMux.Subscribe(ChainHeadEvent{}, GasPriceChanged{}), + events: eventMux.Subscribe(ChainHeadEvent{}, GasPriceChanged{}, RemovedTransactionEvent{}), } go pool.eventLoop() @@ -93,16 +93,18 @@ func (pool *TxPool) eventLoop() { // we need to know the new state. The new state will help us determine // the nonces in the managed state for ev := range pool.events.Chan() { - pool.mu.Lock() - switch ev := ev.(type) { case ChainHeadEvent: + pool.mu.Lock() pool.resetState() + pool.mu.Unlock() case GasPriceChanged: + pool.mu.Lock() pool.minGasPrice = ev.Price + pool.mu.Unlock() + case RemovedTransactionEvent: + pool.AddTransactions(ev.Txs) } - - pool.mu.Unlock() } } @@ -121,8 +123,8 @@ func (pool *TxPool) resetState() { if addr, err := tx.From(); err == nil { // Set the nonce. Transaction nonce can never be lower // than the state nonce; validatePool took care of that. - if pool.pendingState.GetNonce(addr) < tx.Nonce() { - pool.pendingState.SetNonce(addr, tx.Nonce()) + if pool.pendingState.GetNonce(addr) <= tx.Nonce() { + pool.pendingState.SetNonce(addr, tx.Nonce()+1) } } } diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index edbc1e03c0e8..736673270135 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -219,3 +219,34 @@ func TestMissingNonce(t *testing.T) { t.Error("expected 1 queued transaction, got", len(pool.queue[addr])) } } + +func TestNonceRecovery(t *testing.T) { + const n = 10 + pool, key := setupTxPool() + addr := crypto.PubkeyToAddress(key.PublicKey) + pool.currentState().SetNonce(addr, n) + pool.currentState().AddBalance(addr, big.NewInt(100000000000000)) + pool.resetState() + tx := transaction(n, big.NewInt(100000), key) + if err := pool.Add(tx); err != nil { + t.Error(err) + } + // simulate some weird re-order of transactions and missing nonce(s) + pool.currentState().SetNonce(addr, n-1) + pool.resetState() + if fn := pool.pendingState.GetNonce(addr); fn != n+1 { + t.Errorf("expected nonce to be %d, got %d", n+1, fn) + } +} + +func TestRemovedTxEvent(t *testing.T) { + pool, key := setupTxPool() + tx := transaction(0, big.NewInt(1000000), key) + from, _ := tx.From() + pool.currentState().AddBalance(from, big.NewInt(1000000000000)) + pool.eventMux.Post(RemovedTransactionEvent{types.Transactions{tx}}) + pool.eventMux.Post(ChainHeadEvent{nil}) + if len(pool.pending) != 1 { + t.Error("expected 1 pending tx, got", len(pool.pending)) + } +} diff --git a/core/transaction_util.go b/core/transaction_util.go index 625ffcf158da..7876cc7e661d 100644 --- a/core/transaction_util.go +++ b/core/transaction_util.go @@ -32,7 +32,7 @@ var ( ) // PutTransactions stores the transactions in the given database -func PutTransactions(db common.Database, block *types.Block, txs types.Transactions) { +func PutTransactions(db ethdb.Database, block *types.Block, txs types.Transactions) { batch := new(leveldb.Batch) _, batchWrite := db.(*ethdb.LDBDatabase) @@ -77,8 +77,24 @@ func PutTransactions(db common.Database, block *types.Block, txs types.Transacti } } +func DeleteTransaction(db ethdb.Database, txHash common.Hash) { + db.Delete(txHash[:]) +} + +func GetTransaction(db ethdb.Database, txhash common.Hash) *types.Transaction { + data, _ := db.Get(txhash[:]) + if len(data) != 0 { + var tx types.Transaction + if err := rlp.DecodeBytes(data, &tx); err != nil { + return nil + } + return &tx + } + return nil +} + // PutReceipts stores the receipts in the current database -func PutReceipts(db common.Database, receipts types.Receipts) error { +func PutReceipts(db ethdb.Database, receipts types.Receipts) error { batch := new(leveldb.Batch) _, batchWrite := db.(*ethdb.LDBDatabase) @@ -107,8 +123,13 @@ func PutReceipts(db common.Database, receipts types.Receipts) error { return nil } +// Delete a receipts from the database +func DeleteReceipt(db ethdb.Database, txHash common.Hash) { + db.Delete(append(receiptsPre, txHash[:]...)) +} + // GetReceipt returns a receipt by hash -func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt { +func GetReceipt(db ethdb.Database, txHash common.Hash) *types.Receipt { data, _ := db.Get(append(receiptsPre, txHash[:]...)) if len(data) == 0 { return nil @@ -124,7 +145,7 @@ func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt { // GetBlockReceipts returns the receipts generated by the transactions // included in block's given hash. -func GetBlockReceipts(db common.Database, hash common.Hash) types.Receipts { +func GetBlockReceipts(db ethdb.Database, hash common.Hash) types.Receipts { data, _ := db.Get(append(blockReceiptsPre, hash[:]...)) if len(data) == 0 { return nil @@ -141,7 +162,7 @@ func GetBlockReceipts(db common.Database, hash common.Hash) types.Receipts { // PutBlockReceipts stores the block's transactions associated receipts // and stores them by block hash in a single slice. This is required for // forks and chain reorgs -func PutBlockReceipts(db common.Database, block *types.Block, receipts types.Receipts) error { +func PutBlockReceipts(db ethdb.Database, block *types.Block, receipts types.Receipts) error { rs := make([]*types.ReceiptForStorage, len(receipts)) for i, receipt := range receipts { rs[i] = (*types.ReceiptForStorage)(receipt) diff --git a/core/types/block.go b/core/types/block.go index ea33668c9ede..e68ba795ab64 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -117,6 +117,13 @@ func rlpHash(x interface{}) (h common.Hash) { return h } +// Body is a simple (mutable, non-safe) data container for storing and moving +// a block's data contents (transactions and uncles) together. +type Body struct { + Transactions []*Transaction + Uncles []*Header +} + type Block struct { header *Header uncles []*Header @@ -129,12 +136,20 @@ type Block struct { // Td is used by package core to store the total difficulty // of the chain up to and including the block. - Td *big.Int + td *big.Int // ReceivedAt is used by package exp to track block propagation time. ReceivedAt time.Time } +// DeprecatedTd is an old relic for extracting the TD of a block. It is in the +// code solely to facilitate upgrading the database from the old format to the +// new, after which it should be deleted. Do not use! +func (b *Block) DeprecatedTd() *big.Int { + return b.td +} + +// [deprecated by eth/63] // StorageBlock defines the RLP encoding of a Block stored in the // state database. The StorageBlock encoding contains fields that // would otherwise need to be recomputed. @@ -147,6 +162,7 @@ type extblock struct { Uncles []*Header } +// [deprecated by eth/63] // "storage" block encoding. used for database. type storageblock struct { Header *Header @@ -168,7 +184,7 @@ var ( // are ignored and set to values derived from the given txs, uncles // and receipts. func NewBlock(header *Header, txs []*Transaction, uncles []*Header, receipts []*Receipt) *Block { - b := &Block{header: copyHeader(header), Td: new(big.Int)} + b := &Block{header: copyHeader(header), td: new(big.Int)} // TODO: panic if len(txs) != len(receipts) if len(txs) == 0 { @@ -268,24 +284,16 @@ func (b *Block) EncodeRLP(w io.Writer) error { }) } +// [deprecated by eth/63] func (b *StorageBlock) DecodeRLP(s *rlp.Stream) error { var sb storageblock if err := s.Decode(&sb); err != nil { return err } - b.header, b.uncles, b.transactions, b.Td = sb.Header, sb.Uncles, sb.Txs, sb.TD + b.header, b.uncles, b.transactions, b.td = sb.Header, sb.Uncles, sb.Txs, sb.TD return nil } -func (b *StorageBlock) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, storageblock{ - Header: b.header, - Txs: b.transactions, - Uncles: b.uncles, - TD: b.Td, - }) -} - // TODO: copies func (b *Block) Uncles() []*Header { return b.uncles } func (b *Block) Transactions() Transactions { return b.transactions } @@ -356,10 +364,23 @@ func (b *Block) WithMiningResult(nonce uint64, mixDigest common.Hash) *Block { transactions: b.transactions, receipts: b.receipts, uncles: b.uncles, - Td: b.Td, } } +// WithBody returns a new block with the given transaction and uncle contents. +func (b *Block) WithBody(transactions []*Transaction, uncles []*Header) *Block { + block := &Block{ + header: copyHeader(b.header), + transactions: make([]*Transaction, len(transactions)), + uncles: make([]*Header, len(uncles)), + } + copy(block.transactions, transactions) + for i := range uncles { + block.uncles[i] = copyHeader(uncles[i]) + } + return block +} + // Implement pow.Block func (b *Block) Hash() common.Hash { @@ -372,7 +393,7 @@ func (b *Block) Hash() common.Hash { } func (b *Block) String() string { - str := fmt.Sprintf(`Block(#%v): Size: %v TD: %v { + str := fmt.Sprintf(`Block(#%v): Size: %v { MinerHash: %x %v Transactions: @@ -380,7 +401,7 @@ Transactions: Uncles: %v } -`, b.Number(), b.Size(), b.Td, b.header.HashNoNonce(), b.header, b.transactions, b.uncles) +`, b.Number(), b.Size(), b.header.HashNoNonce(), b.header, b.transactions, b.uncles) return str } diff --git a/core/types/transaction.go b/core/types/transaction.go index 9d9c5de2fbbd..1857d6301f72 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -33,10 +33,6 @@ import ( var ErrInvalidSig = errors.New("invalid v, r, s values") -func IsContractAddr(addr []byte) bool { - return len(addr) == 0 -} - type Transaction struct { data txdata // caches @@ -276,14 +272,36 @@ func (tx *Transaction) String() string { // Transaction slice type for basic sorting. type Transactions []*Transaction -func (s Transactions) Len() int { return len(s) } +// Len returns the length of s +func (s Transactions) Len() int { return len(s) } + +// Swap swaps the i'th and the j'th element in s func (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +// GetRlp implements Rlpable and returns the i'th element of s in rlp func (s Transactions) GetRlp(i int) []byte { enc, _ := rlp.EncodeToBytes(s[i]) return enc } +// Returns a new set t which is the difference between a to b +func TxDifference(a, b Transactions) (keep Transactions) { + keep = make(Transactions, 0, len(a)) + + remove := make(map[common.Hash]struct{}) + for _, tx := range b { + remove[tx.Hash()] = struct{}{} + } + + for _, tx := range a { + if _, ok := remove[tx.Hash()]; !ok { + keep = append(keep, tx) + } + } + + return keep +} + type TxByNonce struct{ Transactions } func (s TxByNonce) Less(i, j int) bool { diff --git a/core/vm/errors.go b/core/vm/errors.go index dcf56a093b4d..29d45a7db397 100644 --- a/core/vm/errors.go +++ b/core/vm/errors.go @@ -25,20 +25,3 @@ import ( var OutOfGasError = errors.New("Out of gas") var DepthError = fmt.Errorf("Max call depth exceeded (%d)", params.CallCreateDepth) - -type StackError struct { - req, has int -} - -func StackErr(req, has int) StackError { - return StackError{req, has} -} - -func (self StackError) Error() string { - return fmt.Sprintf("stack error! require %v, have %v", self.req, self.has) -} - -func IsStackErr(err error) bool { - _, ok := err.(StackError) - return ok -} diff --git a/crypto/crypto.go b/crypto/crypto.go index cb6b6ed24dd7..c65a9b221de3 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -33,12 +33,12 @@ import ( "encoding/json" "errors" - "code.google.com/p/go-uuid/uuid" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/crypto/ecies" "github.com/expanse-project/go-expanse/crypto/secp256k1" "github.com/expanse-project/go-expanse/crypto/sha3" "github.com/expanse-project/go-expanse/rlp" + "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/ripemd160" ) diff --git a/crypto/key.go b/crypto/key.go index a44ddc1e7d43..7e6cfa3136bc 100644 --- a/crypto/key.go +++ b/crypto/key.go @@ -23,8 +23,8 @@ import ( "encoding/json" "io" - "code.google.com/p/go-uuid/uuid" "github.com/expanse-project/go-expanse/common" + "github.com/pborman/uuid" ) const ( diff --git a/crypto/key_store_passphrase.go b/crypto/key_store_passphrase.go index 8756c2cc6d43..53435ed5315a 100644 --- a/crypto/key_store_passphrase.go +++ b/crypto/key_store_passphrase.go @@ -36,9 +36,9 @@ import ( "io" "reflect" - "code.google.com/p/go-uuid/uuid" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/crypto/randentropy" + "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/scrypt" ) diff --git a/ethdb/database.go b/ethdb/database.go index 87fb9f87f97d..7553be17a327 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -61,9 +61,7 @@ type LDBDatabase struct { quitChan chan chan error // Quit channel to stop the metrics collection before closing the database } -// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by -// it self but requires a background poller which syncs every X. `Flush` should be called -// when data needs to be stored and written to disk. +// NewLDBDatabase returns a LevelDB wrapped object. func NewLDBDatabase(file string, cache int) (*LDBDatabase, error) { // Calculate the cache allowance for this particular database cache = int(float64(cache) * cacheRatio[filepath.Base(file)]) @@ -142,11 +140,6 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator { return self.db.NewIterator(nil, nil) } -// Flush flushes out the queue to leveldb -func (self *LDBDatabase) Flush() error { - return nil -} - func (self *LDBDatabase) Close() { // Stop the metrics collection to avoid internal database races self.quitLock.Lock() @@ -159,12 +152,14 @@ func (self *LDBDatabase) Close() { glog.V(logger.Error).Infof("metrics failure in '%s': %v\n", self.fn, err) } } - // Flush and close the database - if err := self.Flush(); err != nil { - glog.V(logger.Error).Infof("flushing '%s' failed: %v\n", self.fn, err) + err := self.db.Close() + if glog.V(logger.Error) { + if err == nil { + glog.Infoln("closed db:", self.fn) + } else { + glog.Errorf("error closing db %s: %v", self.fn, err) + } } - self.db.Close() - glog.V(logger.Error).Infoln("flushed and closed db:", self.fn) } func (self *LDBDatabase) LDB() *leveldb.DB { @@ -268,3 +263,23 @@ func (self *LDBDatabase) meter(refresh time.Duration) { } } } + +// TODO: remove this stuff and expose leveldb directly + +func (db *LDBDatabase) NewBatch() Batch { + return &ldbBatch{db: db.db, b: new(leveldb.Batch)} +} + +type ldbBatch struct { + db *leveldb.DB + b *leveldb.Batch +} + +func (b *ldbBatch) Put(key, value []byte) error { + b.b.Put(key, value) + return nil +} + +func (b *ldbBatch) Write() error { + return b.db.Write(b.b, nil) +} diff --git a/common/db.go b/ethdb/interface.go similarity index 90% rename from common/db.go rename to ethdb/interface.go index 5ee8c5fe98b7..2eb529aa31b8 100644 --- a/common/db.go +++ b/ethdb/interface.go @@ -14,13 +14,17 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-expanse library. If not, see . -package common +package ethdb -// Database interface type Database interface { Put(key []byte, value []byte) error Get(key []byte) ([]byte, error) Delete(key []byte) error Close() - Flush() error + NewBatch() Batch +} + +type Batch interface { + Put(key, value []byte) error + Write() error } diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index 0de185eaa5db..62b41dff124f 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -36,8 +36,7 @@ func NewMemDatabase() (*MemDatabase, error) { } func (db *MemDatabase) Put(key []byte, value []byte) error { - db.db[string(key)] = value - + db.db[string(key)] = common.CopyBytes(value) return nil } @@ -49,6 +48,14 @@ func (db *MemDatabase) Get(key []byte) ([]byte, error) { return db.db[string(key)], nil } +func (db *MemDatabase) Keys() [][]byte { + keys := [][]byte{} + for key, _ := range db.db { + keys = append(keys, []byte(key)) + } + return keys +} + /* func (db *MemDatabase) GetKeys() []*common.Key { data, _ := db.Get([]byte("KeyRing")) @@ -84,6 +91,25 @@ func (db *MemDatabase) LastKnownTD() []byte { return data } -func (db *MemDatabase) Flush() error { +func (db *MemDatabase) NewBatch() Batch { + return &memBatch{db: db} +} + +type kv struct{ k, v []byte } + +type memBatch struct { + db *MemDatabase + writes []kv +} + +func (w *memBatch) Put(key, value []byte) error { + w.writes = append(w.writes, kv{key, common.CopyBytes(value)}) + return nil +} + +func (w *memBatch) Write() error { + for _, kv := range w.writes { + w.db.db[string(kv.k)] = kv.v + } return nil } diff --git a/exp/backend.go b/exp/backend.go index 30f4d2d25f47..957efb7b58e6 100644 --- a/exp/backend.go +++ b/exp/backend.go @@ -18,6 +18,7 @@ package exp import ( + "bytes" "crypto/ecdsa" "encoding/json" "fmt" @@ -72,6 +73,8 @@ var ( ) type Config struct { + DevMode bool + Name string NetworkId int GenesisNonce int @@ -124,7 +127,7 @@ type Config struct { // NewDB is used to create databases. // If nil, the default is to create leveldb databases on disk. - NewDB func(path string) (common.Database, error) + NewDB func(path string) (ethdb.Database, error) } func (cfg *Config) parseBootNodes() []*discover.Node { @@ -206,11 +209,8 @@ type Expanse struct { shutdownChan chan bool // DB interfaces - chainDb common.Database // Block chain databe - dappDb common.Database // Dapp database - - // Closed when databases are flushed and closed - databasesClosed chan bool + chainDb ethdb.Database // Block chain database + dappDb ethdb.Database // Dapp database //*** SERVICES *** // State manager for processing new blocks and managing the over all states @@ -263,14 +263,10 @@ func New(config *Config) (*Expanse, error) { newdb := config.NewDB if newdb == nil { - newdb = func(path string) (common.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) } - } - - // attempt to merge database together, upgrading from an old version - if err := mergeDatabases(config.DataDir, newdb); err != nil { - return nil, err + newdb = func(path string) (ethdb.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) } } + // Open the chain database and perform any upgrades needed chainDb, err := newdb(filepath.Join(config.DataDir, "chaindata")) if err != nil { return nil, fmt.Errorf("blockchain db err: %v", err) @@ -278,6 +274,10 @@ func New(config *Config) (*Expanse, error) { if db, ok := chainDb.(*ethdb.LDBDatabase); ok { db.Meter("eth/db/chaindata/") } + if err := upgradeChainDatabase(chainDb); err != nil { + return nil, err + } + dappDb, err := newdb(filepath.Join(config.DataDir, "dapp")) if err != nil { return nil, fmt.Errorf("dapp db err: %v", err) @@ -302,18 +302,23 @@ func New(config *Config) (*Expanse, error) { glog.V(logger.Info).Infof("Successfully wrote genesis block. New genesis hash = %x\n", block.Hash()) } - if config.Olympic { + // different modes + switch { + case config.Olympic: + glog.V(logger.Error).Infoln("Starting Olympic network") + fallthrough + case config.DevMode: _, err := core.WriteTestNetGenesisBlock(chainDb, 42) if err != nil { return nil, err } - glog.V(logger.Error).Infoln("Starting Olympic network") } - // This is for testing only. if config.GenesisBlock != nil { + core.WriteTd(chainDb, config.GenesisBlock.Hash(), config.GenesisBlock.Difficulty()) core.WriteBlock(chainDb, config.GenesisBlock) - core.WriteHead(chainDb, config.GenesisBlock) + core.WriteCanonicalHash(chainDb, config.GenesisBlock.Hash(), config.GenesisBlock.NumberU64()) + core.WriteHeadBlockHash(chainDb, config.GenesisBlock.Hash()) } if !config.SkipBcVersionCheck { @@ -328,7 +333,6 @@ func New(config *Config) (*Expanse, error) { exp := &Expanse{ shutdownChan: make(chan bool), - databasesClosed: make(chan bool), chainDb: chainDb, dappDb: dappDb, eventMux: &event.TypeMux{}, @@ -372,7 +376,7 @@ func New(config *Config) (*Expanse, error) { exp.blockProcessor = core.NewBlockProcessor(chainDb, exp.pow, exp.chainManager, exp.EventMux()) exp.chainManager.SetProcessor(exp.blockProcessor) - exp.protocolManager = NewProtocolManager(config.NetworkId, exp.eventMux, exp.txPool, exp.pow, exp.chainManager) + exp.protocolManager = NewProtocolManager(config.NetworkId, exp.eventMux, exp.txPool, exp.pow, exp.chainManager, chainDb) exp.miner = miner.New(exp, exp.EventMux(), exp.pow) exp.miner.SetGasPrice(config.GasPrice) @@ -518,8 +522,8 @@ func (s *Expanse) BlockProcessor() *core.BlockProcessor { return s.blockProcesso func (s *Expanse) TxPool() *core.TxPool { return s.txPool } func (s *Expanse) Whisper() *whisper.Whisper { return s.whisper } func (s *Expanse) EventMux() *event.TypeMux { return s.eventMux } -func (s *Expanse) ChainDb() common.Database { return s.chainDb } -func (s *Expanse) DappDb() common.Database { return s.dappDb } +func (s *Expanse) ChainDb() ethdb.Database { return s.chainDb } +func (s *Expanse) DappDb() ethdb.Database { return s.dappDb } func (s *Expanse) IsListening() bool { return true } // Always listening func (s *Expanse) PeerCount() int { return s.net.PeerCount() } func (s *Expanse) Peers() []*p2p.Peer { return s.net.Peers() } @@ -530,7 +534,7 @@ func (s *Expanse) NetVersion() int { return s.netVersionId func (s *Expanse) ShhVersion() int { return s.shhVersionId } func (s *Expanse) Downloader() *downloader.Downloader { return s.protocolManager.downloader } -// Start the expanse +// Start the ethereum func (s *Expanse) Start() error { jsonlogger.LogJson(&logger.LogStarting{ ClientString: s.net.Name, @@ -540,8 +544,6 @@ func (s *Expanse) Start() error { if err != nil { return err } - // periodically flush databases - go s.syncDatabases() if s.AutoDAG { s.StartAutoDAG() @@ -557,32 +559,6 @@ func (s *Expanse) Start() error { return nil } -// sync databases every minute. If flushing fails we exit immediatly. The system -// may not continue under any circumstances. -func (s *Expanse) syncDatabases() { - ticker := time.NewTicker(1 * time.Minute) -done: - for { - select { - case <-ticker.C: - // don't change the order of database flushes - if err := s.dappDb.Flush(); err != nil { - glog.Fatalf("fatal error: flush dappDb: %v (Restart your node. We are aware of this issue)\n", err) - } - if err := s.chainDb.Flush(); err != nil { - glog.Fatalf("fatal error: flush chainDb: %v (Restart your node. We are aware of this issue)\n", err) - } - case <-s.shutdownChan: - break done - } - } - - s.chainDb.Close() - s.dappDb.Close() - - close(s.databasesClosed) -} - func (s *Expanse) StartForTest() { jsonlogger.LogJson(&logger.LogStarting{ ClientString: s.net.Name, @@ -613,12 +589,13 @@ func (s *Expanse) Stop() { } s.StopAutoDAG() + s.chainDb.Close() + s.dappDb.Close() close(s.shutdownChan) } // This function will wait for a shutdown and resumes main thread execution func (s *Expanse) WaitForShutdown() { - <-s.databasesClosed <-s.shutdownChan } @@ -708,7 +685,7 @@ func dagFiles(epoch uint64) (string, string) { return dag, "full-R" + dag } -func saveBlockchainVersion(db common.Database, bcVersion int) { +func saveBlockchainVersion(db ethdb.Database, bcVersion int) { d, _ := db.Get([]byte("BlockchainVersion")) blockchainVersion := common.NewValue(d).Uint() @@ -717,74 +694,61 @@ func saveBlockchainVersion(db common.Database, bcVersion int) { } } -// mergeDatabases when required merge old database layout to one single database -func mergeDatabases(datadir string, newdb func(path string) (common.Database, error)) error { - // Check if already upgraded - data := filepath.Join(datadir, "chaindata") - if _, err := os.Stat(data); !os.IsNotExist(err) { - return nil - } - // make sure it's not just a clean path - chainPath := filepath.Join(datadir, "blockchain") - if _, err := os.Stat(chainPath); os.IsNotExist(err) { +// upgradeChainDatabase ensures that the chain database stores block split into +// separate header and body entries. +func upgradeChainDatabase(db ethdb.Database) error { + // Short circuit if the head block is stored already as separate header and body + data, err := db.Get([]byte("LastBlock")) + if err != nil { return nil } - glog.Infoln("Database upgrade required. Upgrading...") + head := common.BytesToHash(data) - database, err := newdb(data) - if err != nil { - return fmt.Errorf("creating data db err: %v", err) + if block := core.GetBlockByHashOld(db, head); block == nil { + return nil } - defer database.Close() + // At least some of the database is still the old format, upgrade (skip the head block!) + glog.V(logger.Info).Info("Old database detected, upgrading...") - // Migrate blocks - chainDb, err := newdb(chainPath) - if err != nil { - return fmt.Errorf("state db err: %v", err) - } - defer chainDb.Close() + if db, ok := db.(*ethdb.LDBDatabase); ok { + blockPrefix := []byte("block-hash-") + for it := db.NewIterator(); it.Next(); { + // Skip anything other than a combined block + if !bytes.HasPrefix(it.Key(), blockPrefix) { + continue + } + // Skip the head block (merge last to signal upgrade completion) + if bytes.HasSuffix(it.Key(), head.Bytes()) { + continue + } + // Load the block, split and serialize (order!) + block := core.GetBlockByHashOld(db, common.BytesToHash(bytes.TrimPrefix(it.Key(), blockPrefix))) - if chain, ok := chainDb.(*ethdb.LDBDatabase); ok { - glog.Infoln("Merging blockchain database...") - it := chain.NewIterator() - for it.Next() { - database.Put(it.Key(), it.Value()) + if err := core.WriteTd(db, block.Hash(), block.DeprecatedTd()); err != nil { + return err + } + if err := core.WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil { + return err + } + if err := core.WriteHeader(db, block.Header()); err != nil { + return err + } + if err := db.Delete(it.Key()); err != nil { + return err + } } - it.Release() - } - - // Migrate state - stateDb, err := newdb(filepath.Join(datadir, "state")) - if err != nil { - return fmt.Errorf("state db err: %v", err) - } - defer stateDb.Close() + // Lastly, upgrade the head block, disabling the upgrade mechanism + current := core.GetBlockByHashOld(db, head) - if state, ok := stateDb.(*ethdb.LDBDatabase); ok { - glog.Infoln("Merging state database...") - it := state.NewIterator() - for it.Next() { - database.Put(it.Key(), it.Value()) + if err := core.WriteTd(db, current.Hash(), current.DeprecatedTd()); err != nil { + return err } - it.Release() - } - - // Migrate transaction / receipts - extraDb, err := newdb(filepath.Join(datadir, "extra")) - if err != nil { - return fmt.Errorf("state db err: %v", err) - } - defer extraDb.Close() - - if extra, ok := extraDb.(*ethdb.LDBDatabase); ok { - glog.Infoln("Merging transaction database...") - - it := extra.NewIterator() - for it.Next() { - database.Put(it.Key(), it.Value()) + if err := core.WriteBody(db, current.Hash(), &types.Body{current.Transactions(), current.Uncles()}); err != nil { + return err + } + if err := core.WriteHeader(db, current.Header()); err != nil { + return err } - it.Release() } - return nil } diff --git a/exp/downloader/downloader.go b/exp/downloader/downloader.go index bca84cc1827a..a8723e4de695 100644 --- a/exp/downloader/downloader.go +++ b/exp/downloader/downloader.go @@ -18,61 +18,64 @@ package downloader import ( - "bytes" "errors" "math" "math/big" - "math/rand" "sync" "sync/atomic" "time" "github.com/expanse-project/go-expanse/common" - "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" - "gopkg.in/fatih/set.v0" ) const ( - eth60 = 60 // Constant to check for old protocol support - eth61 = 61 // Constant to check for new protocol support + eth61 = 61 // Constant to check for old protocol support + eth62 = 62 // Constant to check for new protocol support ) var ( - MinHashFetch = 512 // Minimum amount of hashes to not consider a peer stalling - MaxHashFetch = 512 // Amount of hashes to be fetched per retrieval request - MaxBlockFetch = 128 // Amount of blocks to be fetched per retrieval request - - hashTTL = 5 * time.Second // Time it takes for a hash request to time out - blockSoftTTL = 3 * time.Second // Request completion threshold for increasing or decreasing a peer's bandwidth - blockHardTTL = 3 * blockSoftTTL // Maximum time allowance before a block request is considered expired - crossCheckCycle = time.Second // Period after which to check for expired cross checks - - maxQueuedHashes = 256 * 1024 // Maximum number of hashes to queue for import (DOS protection) - maxBannedHashes = 4096 // Number of bannable hashes before phasing old ones out - maxBlockProcess = 256 // Number of blocks to import at once into the chain + MaxHashFetch = 512 // Amount of hashes to be fetched per retrieval request + MaxBlockFetch = 128 // Amount of blocks to be fetched per retrieval request + MaxHeaderFetch = 192 // Amount of block headers to be fetched per retrieval request + MaxBodyFetch = 128 // Amount of block bodies to be fetched per retrieval request + MaxStateFetch = 384 // Amount of node state values to allow fetching per request + MaxReceiptsFetch = 384 // Amount of transaction receipts to allow fetching per request + + hashTTL = 5 * time.Second // [eth/61] Time it takes for a hash request to time out + blockSoftTTL = 3 * time.Second // [eth/61] Request completion threshold for increasing or decreasing a peer's bandwidth + blockHardTTL = 3 * blockSoftTTL // [eth/61] Maximum time allowance before a block request is considered expired + headerTTL = 5 * time.Second // [eth/62] Time it takes for a header request to time out + bodySoftTTL = 3 * time.Second // [eth/62] Request completion threshold for increasing or decreasing a peer's bandwidth + bodyHardTTL = 3 * bodySoftTTL // [eth/62] Maximum time allowance before a block body request is considered expired + + maxQueuedHashes = 256 * 1024 // [eth/61] Maximum number of hashes to queue for import (DOS protection) + maxQueuedHeaders = 256 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) + maxBlockProcess = 256 // Number of blocks to import at once into the chain ) var ( - errBusy = errors.New("busy") - errUnknownPeer = errors.New("peer is unknown or unhealthy") - errBadPeer = errors.New("action from bad peer ignored") - errStallingPeer = errors.New("peer is stalling") - errBannedHead = errors.New("peer head hash already banned") - errNoPeers = errors.New("no peers to keep download active") - errPendingQueue = errors.New("pending items in queue") - errTimeout = errors.New("timeout") - errEmptyHashSet = errors.New("empty hash set by peer") - errPeersUnavailable = errors.New("no peers available or all peers tried for block download process") - errAlreadyInPool = errors.New("hash already in pool") - errInvalidChain = errors.New("retrieved hash chain is invalid") - errCrossCheckFailed = errors.New("block cross-check failed") - errCancelHashFetch = errors.New("hash fetching canceled (requested)") - errCancelBlockFetch = errors.New("block downloading canceled (requested)") - errNoSyncActive = errors.New("no sync active") + errBusy = errors.New("busy") + errUnknownPeer = errors.New("peer is unknown or unhealthy") + errBadPeer = errors.New("action from bad peer ignored") + errStallingPeer = errors.New("peer is stalling") + errNoPeers = errors.New("no peers to keep download active") + errPendingQueue = errors.New("pending items in queue") + errTimeout = errors.New("timeout") + errEmptyHashSet = errors.New("empty hash set by peer") + errEmptyHeaderSet = errors.New("empty header set by peer") + errPeersUnavailable = errors.New("no peers available or all peers tried for block download process") + errAlreadyInPool = errors.New("hash already in pool") + errInvalidChain = errors.New("retrieved hash chain is invalid") + errInvalidBody = errors.New("retrieved block body is invalid") + errCancelHashFetch = errors.New("hash fetching canceled (requested)") + errCancelBlockFetch = errors.New("block downloading canceled (requested)") + errCancelHeaderFetch = errors.New("block header fetching canceled (requested)") + errCancelBodyFetch = errors.New("block body downloading canceled (requested)") + errNoSyncActive = errors.New("no sync active") ) // hashCheckFn is a callback type for verifying a hash's presence in the local chain. @@ -84,47 +87,58 @@ type blockRetrievalFn func(common.Hash) *types.Block // headRetrievalFn is a callback type for retrieving the head block from the local chain. type headRetrievalFn func() *types.Block +// tdRetrievalFn is a callback type for retrieving the total difficulty of a local block. +type tdRetrievalFn func(common.Hash) *big.Int + // chainInsertFn is a callback type to insert a batch of blocks into the local chain. type chainInsertFn func(types.Blocks) (int, error) // peerDropFn is a callback type for dropping a peer detected as malicious. type peerDropFn func(id string) +// hashPack is a batch of block hashes returned by a peer (eth/61). +type hashPack struct { + peerId string + hashes []common.Hash +} + +// blockPack is a batch of blocks returned by a peer (eth/61). type blockPack struct { peerId string blocks []*types.Block } -type hashPack struct { - peerId string - hashes []common.Hash +// headerPack is a batch of block headers returned by a peer. +type headerPack struct { + peerId string + headers []*types.Header } -type crossCheck struct { - expire time.Time - parent common.Hash +// bodyPack is a batch of block bodies returned by a peer. +type bodyPack struct { + peerId string + transactions [][]*types.Transaction + uncles [][]*types.Header } type Downloader struct { mux *event.TypeMux - queue *queue // Scheduler for selecting the hashes to download - peers *peerSet // Set of active peers from which download can proceed - checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain - banned *set.Set // Set of hashes we've received and banned + queue *queue // Scheduler for selecting the hashes to download + peers *peerSet // Set of active peers from which download can proceed interrupt int32 // Atomic boolean to signal termination // Statistics - importStart time.Time // Instance when the last blocks were taken from the cache - importQueue []*Block // Previously taken blocks to check import progress - importDone int // Number of taken blocks already imported from the last batch - importLock sync.Mutex + syncStatsOrigin uint64 // Origin block number where syncing started at + syncStatsHeight uint64 // Highest block number known when syncing started + syncStatsLock sync.RWMutex // Lock protecting the sync stats fields // Callbacks hasBlock hashCheckFn // Checks if a block is present in the chain getBlock blockRetrievalFn // Retrieves a block from the chain headBlock headRetrievalFn // Retrieves the head block from the chain + getTd tdRetrievalFn // Retrieves the TD of a block from the chain insertChain chainInsertFn // Injects a batch of blocks into the chain dropPeer peerDropFn // Drops a peer for misbehaving @@ -136,12 +150,19 @@ type Downloader struct { // Channels newPeerCh chan *peer - hashCh chan hashPack // Channel receiving inbound hashes - blockCh chan blockPack // Channel receiving inbound blocks - processCh chan bool // Channel to signal the block fetcher of new or finished work + hashCh chan hashPack // [eth/61] Channel receiving inbound hashes + blockCh chan blockPack // [eth/61] Channel receiving inbound blocks + headerCh chan headerPack // [eth/62] Channel receiving inbound block headers + bodyCh chan bodyPack // [eth/62] Channel receiving inbound block bodies + wakeCh chan bool // Channel to signal the block/body fetcher of new tasks cancelCh chan struct{} // Channel to cancel mid-flight syncs cancelLock sync.RWMutex // Lock to protect the cancel channel in delivers + + // Testing hooks + syncInitHook func(uint64, uint64) // Method to call upon initiating a new sync run + bodyFetchHook func([]*types.Header) // Method to call upon starting a block body fetch + chainInsertHook func([]*Block) // Method to call upon inserting a chain of blocks (possibly in multiple invocations) } // Block is an origin-tagged blockchain block. @@ -151,51 +172,34 @@ type Block struct { } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, headBlock headRetrievalFn, insertChain chainInsertFn, dropPeer peerDropFn) *Downloader { - // Create the base downloader - downloader := &Downloader{ +func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, headBlock headRetrievalFn, getTd tdRetrievalFn, insertChain chainInsertFn, dropPeer peerDropFn) *Downloader { + return &Downloader{ mux: mux, queue: newQueue(), peers: newPeerSet(), hasBlock: hasBlock, getBlock: getBlock, headBlock: headBlock, + getTd: getTd, insertChain: insertChain, dropPeer: dropPeer, newPeerCh: make(chan *peer, 1), hashCh: make(chan hashPack, 1), blockCh: make(chan blockPack, 1), - processCh: make(chan bool, 1), + headerCh: make(chan headerPack, 1), + bodyCh: make(chan bodyPack, 1), + wakeCh: make(chan bool, 1), } - // Inject all the known bad hashes - downloader.banned = set.New() - for hash, _ := range core.BadHashes { - downloader.banned.Add(hash) - } - return downloader } -// Stats retrieves the current status of the downloader. -func (d *Downloader) Stats() (pending int, cached int, importing int, estimate time.Duration) { - // Fetch the download status - pending, cached = d.queue.Size() - - // Figure out the import progress - d.importLock.Lock() - defer d.importLock.Unlock() +// Boundaries retrieves the synchronisation boundaries, specifically the origin +// block where synchronisation started at (may have failed/suspended) and the +// latest known block which the synchonisation targets. +func (d *Downloader) Boundaries() (uint64, uint64) { + d.syncStatsLock.RLock() + defer d.syncStatsLock.RUnlock() - for len(d.importQueue) > 0 && d.hasBlock(d.importQueue[0].RawBlock.Hash()) { - d.importQueue = d.importQueue[1:] - d.importDone++ - } - importing = len(d.importQueue) - - // Make an estimate on the total sync - estimate = 0 - if d.importDone > 0 { - estimate = time.Since(d.importStart) / time.Duration(d.importDone) * time.Duration(pending+cached+importing) - } - return + return d.syncStatsOrigin, d.syncStatsHeight } // Synchronising returns whether the downloader is currently retrieving blocks. @@ -205,15 +209,12 @@ func (d *Downloader) Synchronising() bool { // RegisterPeer injects a new download peer into the set of block source to be // used for fetching hashes and blocks from. -func (d *Downloader) RegisterPeer(id string, version int, head common.Hash, getRelHashes relativeHashFetcherFn, getAbsHashes absoluteHashFetcherFn, getBlocks blockFetcherFn) error { - // If the peer wants to send a banned hash, reject - if d.banned.Has(head) { - glog.V(logger.Debug).Infoln("Register rejected, head hash banned:", id) - return errBannedHead - } - // Otherwise try to construct and register the peer +func (d *Downloader) RegisterPeer(id string, version int, head common.Hash, + getRelHashes relativeHashFetcherFn, getAbsHashes absoluteHashFetcherFn, getBlocks blockFetcherFn, // eth/61 callbacks, remove when upgrading + getRelHeaders relativeHeaderFetcherFn, getAbsHeaders absoluteHeaderFetcherFn, getBlockBodies blockBodyFetcherFn) error { + glog.V(logger.Detail).Infoln("Registering peer", id) - if err := d.peers.Register(newPeer(id, version, head, getRelHashes, getAbsHashes, getBlocks)); err != nil { + if err := d.peers.Register(newPeer(id, version, head, getRelHashes, getAbsHashes, getBlocks, getRelHeaders, getAbsHeaders, getBlockBodies)); err != nil { glog.V(logger.Error).Infoln("Register failed:", err) return err } @@ -234,7 +235,7 @@ func (d *Downloader) UnregisterPeer(id string) error { // Synchronise tries to sync up our local block chain with a remote peer, both // adding various sanity checks as well as wrapping it with various log entries. func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int) { - glog.V(logger.Detail).Infof("Attempting synchronisation: %v, head 0x%x, TD %v", id, head[:4], td) + glog.V(logger.Detail).Infof("Attempting synchronisation: %v, head [%x…], TD %v", id, head[:4], td) switch err := d.synchronise(id, head, td); err { case nil: @@ -243,7 +244,7 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int) { case errBusy: glog.V(logger.Detail).Infof("Synchronisation already in progress") - case errTimeout, errBadPeer, errStallingPeer, errBannedHead, errEmptyHashSet, errPeersUnavailable, errInvalidChain, errCrossCheckFailed: + case errTimeout, errBadPeer, errStallingPeer, errEmptyHashSet, errEmptyHeaderSet, errPeersUnavailable, errInvalidChain: glog.V(logger.Debug).Infof("Removing peer %v: %v", id, err) d.dropPeer(id) @@ -269,10 +270,6 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int) error } defer atomic.StoreInt32(&d.synchronising, 0) - // If the head hash is banned, terminate immediately - if d.banned.Has(hash) { - return errBannedHead - } // Post a user notification of the sync (only once per session) if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { glog.V(logger.Info).Infoln("Block synchronisation started") @@ -284,8 +281,11 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int) error // Reset the queue and peer set to clean any internal leftover state d.queue.Reset() d.peers.Reset() - d.checks = make(map[common.Hash]*crossCheck) + select { + case <-d.wakeCh: + default: + } // Create cancel channel for aborting mid-flight d.cancelLock.Lock() d.cancelCh = make(chan struct{}) @@ -319,25 +319,69 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e } }() - glog.V(logger.Debug).Infof("Synchronizing with the network using: %s, exp/%d", p.id, p.version) - switch p.version { - case eth60: - // Old exp/60 version, use reverse hash retrieval algorithm - if err = d.fetchHashes60(p, hash); err != nil { + + glog.V(logger.Debug).Infof("Synchronising with the network using: %s [exp/%d]", p.id, p.version) + defer glog.V(logger.Debug).Infof("Synchronisation terminated") + + switch { + case p.version == eth61: + // Look up the sync boundaries: the common ancestor and the target block + latest, err := d.fetchHeight61(p) + if err != nil { + return err + } + origin, err := d.findAncestor61(p) + if err != nil { + return err + } + d.syncStatsLock.Lock() + if d.syncStatsHeight <= origin || d.syncStatsOrigin > origin { + d.syncStatsOrigin = origin + } + d.syncStatsHeight = latest + d.syncStatsLock.Unlock() + + // Initiate the sync using a concurrent hash and block retrieval algorithm + if d.syncInitHook != nil { + d.syncInitHook(origin, latest) + } + errc := make(chan error, 2) + go func() { errc <- d.fetchHashes61(p, td, origin+1) }() + go func() { errc <- d.fetchBlocks61(origin + 1) }() + + // If any fetcher fails, cancel the other + if err := <-errc; err != nil { + d.cancel() + <-errc return err } - if err = d.fetchBlocks60(); err != nil { + return <-errc + + case p.version >= eth62: + // Look up the sync boundaries: the common ancestor and the target block + latest, err := d.fetchHeight(p) + if err != nil { return err } - case eth61: - // New exp/61, use forward, concurrent hash and block retrieval algorithm - number, err := d.findAncestor(p) + + origin, err := d.findAncestor(p) if err != nil { return err } + d.syncStatsLock.Lock() + if d.syncStatsHeight <= origin || d.syncStatsOrigin > origin { + d.syncStatsOrigin = origin + } + d.syncStatsHeight = latest + d.syncStatsLock.Unlock() + + // Initiate the sync using a concurrent hash and block retrieval algorithm + if d.syncInitHook != nil { + d.syncInitHook(origin, latest) + } errc := make(chan error, 2) - go func() { errc <- d.fetchHashes(p, td, number+1) }() - go func() { errc <- d.fetchBlocks(number + 1) }() + go func() { errc <- d.fetchHeaders(p, td, origin+1) }() + go func() { errc <- d.fetchBodies(origin + 1) }() // If any fetcher fails, cancel the other if err := <-errc; err != nil { @@ -352,8 +396,6 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e glog.V(logger.Error).Infof("Unsupported exp protocol: %d", p.version) return errBadPeer } - glog.V(logger.Debug).Infoln("Synchronization completed") - return nil } @@ -382,310 +424,61 @@ func (d *Downloader) Terminate() { d.cancel() } -// fetchHashes60 starts retrieving hashes backwards from a specific peer and hash, -// up until it finds a common ancestor. If the source peer times out, alternative -// ones are tried for continuation. -func (d *Downloader) fetchHashes60(p *peer, h common.Hash) error { - var ( - start = time.Now() - active = p // active peer will help determine the current active peer - head = common.Hash{} // common and last hash - - timeout = time.NewTimer(0) // timer to dump a non-responsive active peer - attempted = make(map[string]bool) // attempted peers will help with retries - crossTicker = time.NewTicker(crossCheckCycle) // ticker to periodically check expired cross checks - ) - defer crossTicker.Stop() - defer timeout.Stop() - - glog.V(logger.Debug).Infof("Downloading hashes (%x) from %s", h[:4], p.id) - <-timeout.C // timeout channel should be initially empty. +// fetchHeight61 retrieves the head block of the remote peer to aid in estimating +// the total time a pending synchronisation would take. +func (d *Downloader) fetchHeight61(p *peer) (uint64, error) { + glog.V(logger.Debug).Infof("%v: retrieving remote chain height", p) - getHashes := func(from common.Hash) { - go active.getRelHashes(from) - timeout.Reset(hashTTL) - } + // Request the advertised remote head block and wait for the response + go p.getBlocks([]common.Hash{p.head}) - // Add the hash to the queue, and start hash retrieval. - d.queue.Insert([]common.Hash{h}, false) - getHashes(h) - - attempted[p.id] = true - for finished := false; !finished; { + timeout := time.After(blockSoftTTL) + for { select { case <-d.cancelCh: - return errCancelHashFetch - - case hashPack := <-d.hashCh: - // Make sure the active peer is giving us the hashes - if hashPack.peerId != active.id { - glog.V(logger.Debug).Infof("Received hashes from incorrect peer(%s)", hashPack.peerId) - break - } - timeout.Stop() - - // Make sure the peer actually gave something valid - if len(hashPack.hashes) == 0 { - glog.V(logger.Debug).Infof("Peer (%s) responded with empty hash set", active.id) - return errEmptyHashSet - } - for index, hash := range hashPack.hashes { - if d.banned.Has(hash) { - glog.V(logger.Debug).Infof("Peer (%s) sent a known invalid chain", active.id) - - d.queue.Insert(hashPack.hashes[:index+1], false) - if err := d.banBlocks(active.id, hash); err != nil { - glog.V(logger.Debug).Infof("Failed to ban batch of blocks: %v", err) - } - return errInvalidChain - } - } - // Determine if we're done fetching hashes (queue up all pending), and continue if not done - done, index := false, 0 - for index, head = range hashPack.hashes { - if d.hasBlock(head) || d.queue.GetBlock(head) != nil { - glog.V(logger.Debug).Infof("Found common hash %x", head[:4]) - hashPack.hashes = hashPack.hashes[:index] - done = true - break - } - } - // Insert all the new hashes, but only continue if got something useful - inserts := d.queue.Insert(hashPack.hashes, false) - if len(inserts) == 0 && !done { - glog.V(logger.Debug).Infof("Peer (%s) responded with stale hashes", active.id) - return errBadPeer - } - if !done { - // Check that the peer is not stalling the sync - if len(inserts) < MinHashFetch { - return errStallingPeer - } - // Try and fetch a random block to verify the hash batch - // Skip the last hash as the cross check races with the next hash fetch - cross := rand.Intn(len(inserts) - 1) - origin, parent := inserts[cross], inserts[cross+1] - glog.V(logger.Detail).Infof("Cross checking (%s) with %x/%x", active.id, origin, parent) - - d.checks[origin] = &crossCheck{ - expire: time.Now().Add(blockSoftTTL), - parent: parent, - } - go active.getBlocks([]common.Hash{origin}) - - // Also fetch a fresh batch of hashes - getHashes(head) - continue - } - // We're done, prepare the download cache and proceed pulling the blocks - offset := uint64(0) - if block := d.getBlock(head); block != nil { - offset = block.NumberU64() + 1 - } - d.queue.Prepare(offset) - finished = true - - case blockPack := <-d.blockCh: - // Cross check the block with the random verifications - if blockPack.peerId != active.id || len(blockPack.blocks) != 1 { - continue - } - block := blockPack.blocks[0] - if check, ok := d.checks[block.Hash()]; ok { - if block.ParentHash() != check.parent { - return errCrossCheckFailed - } - delete(d.checks, block.Hash()) - } - - case <-crossTicker.C: - // Iterate over all the cross checks and fail the hash chain if they're not verified - for hash, check := range d.checks { - if time.Now().After(check.expire) { - glog.V(logger.Debug).Infof("Cross check timeout for %x", hash) - return errCrossCheckFailed - } - } - - case <-timeout.C: - glog.V(logger.Debug).Infof("Peer (%s) didn't respond in time for hash request", p.id) - - var p *peer // p will be set if a peer can be found - // Attempt to find a new peer by checking inclusion of peers best hash in our - // already fetched hash list. This can't guarantee 100% correctness but does - // a fair job. This is always either correct or false incorrect. - for _, peer := range d.peers.AllPeers() { - if d.queue.Has(peer.head) && !attempted[peer.id] { - p = peer - break - } - } - // if all peers have been tried, abort the process entirely or if the hash is - // the zero hash. - if p == nil || (head == common.Hash{}) { - return errTimeout - } - // set p to the active peer. this will invalidate any hashes that may be returned - // by our previous (delayed) peer. - active = p - getHashes(head) - glog.V(logger.Debug).Infof("Hash fetching switched to new peer(%s)", p.id) - } - } - glog.V(logger.Debug).Infof("Downloaded hashes (%d) in %v", d.queue.Pending(), time.Since(start)) - - return nil -} + return 0, errCancelBlockFetch -// fetchBlocks60 iteratively downloads the entire schedules block-chain, taking -// any available peers, reserving a chunk of blocks for each, wait for delivery -// and periodically checking for timeouts. -func (d *Downloader) fetchBlocks60() error { - glog.V(logger.Debug).Infoln("Downloading", d.queue.Pending(), "block(s)") - start := time.Now() + case <-d.headerCh: + // Out of bounds eth/62 block headers received, ignore them - // Start a ticker to continue throttled downloads and check for bad peers - ticker := time.NewTicker(20 * time.Millisecond) - defer ticker.Stop() - -out: - for { - select { - case <-d.cancelCh: - return errCancelBlockFetch + case <-d.bodyCh: + // Out of bounds eth/62 block bodies received, ignore them case <-d.hashCh: // Out of bounds hashes received, ignore them case blockPack := <-d.blockCh: - // Short circuit if it's a stale cross check - if len(blockPack.blocks) == 1 { - block := blockPack.blocks[0] - if _, ok := d.checks[block.Hash()]; ok { - delete(d.checks, block.Hash()) - break - } - } - // If the peer was previously banned and failed to deliver it's pack - // in a reasonable time frame, ignore it's message. - if peer := d.peers.Peer(blockPack.peerId); peer != nil { - // Deliver the received chunk of blocks, and demote in case of errors - err := d.queue.Deliver(blockPack.peerId, blockPack.blocks) - switch err { - case nil: - // If no blocks were delivered, demote the peer (need the delivery above) - if len(blockPack.blocks) == 0 { - peer.Demote() - peer.SetIdle() - glog.V(logger.Detail).Infof("%s: no blocks delivered", peer) - break - } - // All was successful, promote the peer and potentially start processing - peer.Promote() - peer.SetIdle() - glog.V(logger.Detail).Infof("%s: delivered %d blocks", peer, len(blockPack.blocks)) - go d.process() - - case errInvalidChain: - // The hash chain is invalid (blocks are not ordered properly), abort - return err - - case errNoFetchesPending: - // Peer probably timed out with its delivery but came through - // in the end, demote, but allow to to pull from this peer. - peer.Demote() - peer.SetIdle() - glog.V(logger.Detail).Infof("%s: out of bound delivery", peer) - - case errStaleDelivery: - // Delivered something completely else than requested, usually - // caused by a timeout and delivery during a new sync cycle. - // Don't set it to idle as the original request should still be - // in flight. - peer.Demote() - glog.V(logger.Detail).Infof("%s: stale delivery", peer) - - default: - // Peer did something semi-useful, demote but keep it around - peer.Demote() - peer.SetIdle() - glog.V(logger.Detail).Infof("%s: delivery partially failed: %v", peer, err) - go d.process() - } - } - - case <-ticker.C: - // Short circuit if we lost all our peers - if d.peers.Len() == 0 { - return errNoPeers + // Discard anything not from the origin peer + if blockPack.peerId != p.id { + glog.V(logger.Debug).Infof("Received blocks from incorrect peer(%s)", blockPack.peerId) + break } - // Check for block request timeouts and demote the responsible peers - badPeers := d.queue.Expire(blockHardTTL) - for _, pid := range badPeers { - if peer := d.peers.Peer(pid); peer != nil { - peer.Demote() - glog.V(logger.Detail).Infof("%s: block delivery timeout", peer) - } + // Make sure the peer actually gave something valid + blocks := blockPack.blocks + if len(blocks) != 1 { + glog.V(logger.Debug).Infof("%v: invalid number of head blocks: %d != 1", p, len(blocks)) + return 0, errBadPeer } - // If there are unrequested hashes left start fetching from the available peers - if d.queue.Pending() > 0 { - // Throttle the download if block cache is full and waiting processing - if d.queue.Throttle() { - break - } - // Send a download request to all idle peers, until throttled - idlePeers := d.peers.IdlePeers() - for _, peer := range idlePeers { - // Short circuit if throttling activated since above - if d.queue.Throttle() { - break - } - // Get a possible chunk. If nil is returned no chunk - // could be returned due to no hashes available. - request := d.queue.Reserve(peer, peer.Capacity()) - if request == nil { - continue - } - if glog.V(logger.Detail) { - glog.Infof("%s: requesting %d blocks", peer, len(request.Hashes)) - } - // Fetch the chunk and check for error. If the peer was somehow - // already fetching a chunk due to a bug, it will be returned to - // the queue - if err := peer.Fetch(request); err != nil { - glog.V(logger.Error).Infof("Peer %s received double work", peer.id) - d.queue.Cancel(request) - } - } - // Make sure that we have peers available for fetching. If all peers have been tried - // and all failed throw an error - if d.queue.InFlight() == 0 { - return errPeersUnavailable - } + return blocks[0].NumberU64(), nil - } else if d.queue.InFlight() == 0 { - // When there are no more queue and no more in flight, We can - // safely assume we're done. Another part of the process will check - // for parent errors and will re-request anything that's missing - break out - } + case <-timeout: + glog.V(logger.Debug).Infof("%v: head block timeout", p) + return 0, errTimeout } } - glog.V(logger.Detail).Infoln("Downloaded block(s) in", time.Since(start)) - return nil } -// findAncestor tries to locate the common ancestor block of the local chain and +// findAncestor61 tries to locate the common ancestor block of the local chain and // a remote peers blockchain. In the general case when our node was in sync and // on the correct chain, checking the top N blocks should already get us a match. -// In the rare scenario when we ended up on a long soft fork (i.e. none of the -// head blocks match), we do a binary search to find the common ancestor. -func (d *Downloader) findAncestor(p *peer) (uint64, error) { +// In the rare scenario when we ended up on a long reorganization (i.e. none of +// the head blocks match), we do a binary search to find the common ancestor. +func (d *Downloader) findAncestor61(p *peer) (uint64, error) { glog.V(logger.Debug).Infof("%v: looking for common ancestor", p) // Request out head blocks to short circuit ancestor location head := d.headBlock().NumberU64() - from := int64(head) - int64(MaxHashFetch) + from := int64(head) - int64(MaxHashFetch) + 1 if from < 0 { from = 0 } @@ -724,6 +517,12 @@ func (d *Downloader) findAncestor(p *peer) (uint64, error) { case <-d.blockCh: // Out of bounds blocks received, ignore them + case <-d.headerCh: + // Out of bounds eth/62 block headers received, ignore them + + case <-d.bodyCh: + // Out of bounds eth/62 block bodies received, ignore them + case <-timeout: glog.V(logger.Debug).Infof("%v: head hash timeout", p) return 0, errTimeout @@ -731,7 +530,7 @@ func (d *Downloader) findAncestor(p *peer) (uint64, error) { } // If the head fetch already found an ancestor, return if !common.EmptyHash(hash) { - glog.V(logger.Debug).Infof("%v: common ancestor: #%d [%x]", p, number, hash[:4]) + glog.V(logger.Debug).Infof("%v: common ancestor: #%d [%x…]", p, number, hash[:4]) return number, nil } // Ancestor not found, we need to binary search over our chain @@ -770,7 +569,7 @@ func (d *Downloader) findAncestor(p *peer) (uint64, error) { break } if block.NumberU64() != check { - glog.V(logger.Debug).Infof("%v: non requested hash #%d [%x], instead of #%d", p, block.NumberU64(), block.Hash().Bytes()[:4], check) + glog.V(logger.Debug).Infof("%v: non requested hash #%d [%x…], instead of #%d", p, block.NumberU64(), block.Hash().Bytes()[:4], check) return 0, errBadPeer } start = check @@ -778,6 +577,12 @@ func (d *Downloader) findAncestor(p *peer) (uint64, error) { case <-d.blockCh: // Out of bounds blocks received, ignore them + case <-d.headerCh: + // Out of bounds eth/62 block headers received, ignore them + + case <-d.bodyCh: + // Out of bounds eth/62 block bodies received, ignore them + case <-timeout: glog.V(logger.Debug).Infof("%v: search hash timeout", p) return 0, errTimeout @@ -787,12 +592,13 @@ func (d *Downloader) findAncestor(p *peer) (uint64, error) { return start, nil } -// fetchHashes keeps retrieving hashes from the requested number, until no more +// fetchHashes61 keeps retrieving hashes from the requested number, until no more // are returned, potentially throttling on the way. -func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { +func (d *Downloader) fetchHashes61(p *peer, td *big.Int, from uint64) error { glog.V(logger.Debug).Infof("%v: downloading hashes from #%d", p, from) // Create a timeout timer, and the associated hash fetcher + request := time.Now() // time of the last fetch request timeout := time.NewTimer(0) // timer to dump a non-responsive active peer <-timeout.C // timeout channel should be initially empty defer timeout.Stop() @@ -801,6 +607,7 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { glog.V(logger.Detail).Infof("%v: fetching %d hashes from #%d", p, MaxHashFetch, from) go p.getAbsHashes(from, MaxHashFetch) + request = time.Now() timeout.Reset(hashTTL) } // Start pulling hashes, until all are exhausted @@ -812,12 +619,19 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { case <-d.cancelCh: return errCancelHashFetch + case <-d.headerCh: + // Out of bounds eth/62 block headers received, ignore them + + case <-d.bodyCh: + // Out of bounds eth/62 block bodies received, ignore them + case hashPack := <-d.hashCh: // Make sure the active peer is giving us the hashes if hashPack.peerId != p.id { glog.V(logger.Debug).Infof("Received hashes from incorrect peer(%s)", hashPack.peerId) break } + hashReqTimer.UpdateSince(request) timeout.Stop() // If no more hashes are inbound, notify the block fetcher and return @@ -825,7 +639,7 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { glog.V(logger.Debug).Infof("%v: no available hashes", p) select { - case d.processCh <- false: + case d.wakeCh <- false: case <-d.cancelCh: } // If no hashes were retrieved at all, the peer violated it's TD promise that it had a @@ -840,7 +654,7 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { // L: Sync begins, and finds common ancestor at 11 // L: Request new hashes up from 11 (R's TD was higher, it must have something) // R: Nothing to give - if !gotHashes && td.Cmp(d.headBlock().Td) > 0 { + if !gotHashes && td.Cmp(d.getTd(d.headBlock().Hash())) > 0 { return errStallingPeer } return nil @@ -850,18 +664,24 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { // Otherwise insert all the new hashes, aborting in case of junk glog.V(logger.Detail).Infof("%v: inserting %d hashes from #%d", p, len(hashPack.hashes), from) - inserts := d.queue.Insert(hashPack.hashes, true) + inserts := d.queue.Insert61(hashPack.hashes, true) if len(inserts) != len(hashPack.hashes) { glog.V(logger.Debug).Infof("%v: stale hashes", p) return errBadPeer } // Notify the block fetcher of new hashes, but stop if queue is full - cont := d.queue.Pending() < maxQueuedHashes - select { - case d.processCh <- cont: - default: - } - if !cont { + if d.queue.Pending() < maxQueuedHashes { + // We still have hashes to fetch, send continuation wake signal (potential) + select { + case d.wakeCh <- true: + default: + } + } else { + // Hash limit reached, send a termination wake signal (enforced) + select { + case d.wakeCh <- false: + case <-d.cancelCh: + } return nil } // Queue not yet full, fetch the next batch @@ -870,15 +690,16 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { case <-timeout.C: glog.V(logger.Debug).Infof("%v: hash request timed out", p) + hashTimeoutMeter.Mark(1) return errTimeout } } } -// fetchBlocks iteratively downloads the scheduled hashes, taking any available +// fetchBlocks61 iteratively downloads the scheduled hashes, taking any available // peers, reserving a chunk of blocks for each, waiting for delivery and also // periodically checking for timeouts. -func (d *Downloader) fetchBlocks(from uint64) error { +func (d *Downloader) fetchBlocks61(from uint64) error { glog.V(logger.Debug).Infof("Downloading blocks from #%d", from) defer glog.V(logger.Debug).Infof("Block download terminated") @@ -897,24 +718,30 @@ func (d *Downloader) fetchBlocks(from uint64) error { case <-d.cancelCh: return errCancelBlockFetch + case <-d.headerCh: + // Out of bounds eth/62 block headers received, ignore them + + case <-d.bodyCh: + // Out of bounds eth/62 block bodies received, ignore them + case blockPack := <-d.blockCh: // If the peer was previously banned and failed to deliver it's pack // in a reasonable time frame, ignore it's message. if peer := d.peers.Peer(blockPack.peerId); peer != nil { // Deliver the received chunk of blocks, and demote in case of errors - err := d.queue.Deliver(blockPack.peerId, blockPack.blocks) + err := d.queue.Deliver61(blockPack.peerId, blockPack.blocks) switch err { case nil: // If no blocks were delivered, demote the peer (need the delivery above) if len(blockPack.blocks) == 0 { peer.Demote() - peer.SetIdle() + peer.SetIdle61() glog.V(logger.Detail).Infof("%s: no blocks delivered", peer) break } // All was successful, promote the peer and potentially start processing peer.Promote() - peer.SetIdle() + peer.SetIdle61() glog.V(logger.Detail).Infof("%s: delivered %d blocks", peer, len(blockPack.blocks)) go d.process() @@ -926,7 +753,7 @@ func (d *Downloader) fetchBlocks(from uint64) error { // Peer probably timed out with its delivery but came through // in the end, demote, but allow to to pull from this peer. peer.Demote() - peer.SetIdle() + peer.SetIdle61() glog.V(logger.Detail).Infof("%s: out of bound delivery", peer) case errStaleDelivery: @@ -940,7 +767,7 @@ func (d *Downloader) fetchBlocks(from uint64) error { default: // Peer did something semi-useful, demote but keep it around peer.Demote() - peer.SetIdle() + peer.SetIdle61() glog.V(logger.Detail).Infof("%s: delivery partially failed: %v", peer, err) go d.process() } @@ -951,7 +778,7 @@ func (d *Downloader) fetchBlocks(from uint64) error { default: } - case cont := <-d.processCh: + case cont := <-d.wakeCh: // The hash fetcher sent a continuation flag, check if it's done if !cont { finished = true @@ -990,15 +817,17 @@ func (d *Downloader) fetchBlocks(from uint64) error { break } // Send a download request to all idle peers, until throttled - for _, peer := range d.peers.IdlePeers() { + throttled := false + for _, peer := range d.peers.IdlePeers(eth61) { // Short circuit if throttling activated if d.queue.Throttle() { + throttled = true break } // Reserve a chunk of hashes for a peer. A nil can mean either that // no more hashes are available, or that the peer is known not to // have them. - request := d.queue.Reserve(peer, peer.Capacity()) + request := d.queue.Reserve61(peer, peer.Capacity()) if request == nil { continue } @@ -1006,117 +835,480 @@ func (d *Downloader) fetchBlocks(from uint64) error { glog.Infof("%s: requesting %d blocks", peer, len(request.Hashes)) } // Fetch the chunk and make sure any errors return the hashes to the queue - if err := peer.Fetch(request); err != nil { + if err := peer.Fetch61(request); err != nil { glog.V(logger.Error).Infof("%v: fetch failed, rescheduling", peer) d.queue.Cancel(request) } } // Make sure that we have peers available for fetching. If all peers have been tried // and all failed throw an error - if !d.queue.Throttle() && d.queue.InFlight() == 0 { + if !throttled && d.queue.InFlight() == 0 { return errPeersUnavailable } } } } -// banBlocks retrieves a batch of blocks from a peer feeding us invalid hashes, -// and bans the head of the retrieved batch. -// -// This method only fetches one single batch as the goal is not ban an entire -// (potentially long) invalid chain - wasting a lot of time in the meanwhile -, -// but rather to gradually build up a blacklist if the peer keeps reconnecting. -func (d *Downloader) banBlocks(peerId string, head common.Hash) error { - glog.V(logger.Debug).Infof("Banning a batch out of %d blocks from %s", d.queue.Pending(), peerId) - - // Ask the peer being banned for a batch of blocks from the banning point - peer := d.peers.Peer(peerId) - if peer == nil { - return nil - } - request := d.queue.Reserve(peer, MaxBlockFetch) - if request == nil { - return nil - } - if err := peer.Fetch(request); err != nil { - return err - } - // Wait a bit for the reply to arrive, and ban if done so - timeout := time.After(blockHardTTL) +// fetchHeight retrieves the head header of the remote peer to aid in estimating +// the total time a pending synchronisation would take. +func (d *Downloader) fetchHeight(p *peer) (uint64, error) { + glog.V(logger.Debug).Infof("%v: retrieving remote chain height", p) + + // Request the advertised remote head block and wait for the response + go p.getRelHeaders(p.head, 1, 0, false) + + timeout := time.After(headerTTL) for { select { case <-d.cancelCh: - return errCancelBlockFetch + return 0, errCancelBlockFetch - case <-timeout: - return errTimeout + case headerPack := <-d.headerCh: + // Discard anything not from the origin peer + if headerPack.peerId != p.id { + glog.V(logger.Debug).Infof("Received headers from incorrect peer(%s)", headerPack.peerId) + break + } + // Make sure the peer actually gave something valid + headers := headerPack.headers + if len(headers) != 1 { + glog.V(logger.Debug).Infof("%v: invalid number of head headers: %d != 1", p, len(headers)) + return 0, errBadPeer + } + return headers[0].Number.Uint64(), nil + + case <-d.bodyCh: + // Out of bounds block bodies received, ignore them case <-d.hashCh: - // Out of bounds hashes received, ignore them + // Out of bounds eth/61 hashes received, ignore them - case blockPack := <-d.blockCh: - blocks := blockPack.blocks + case <-d.blockCh: + // Out of bounds eth/61 blocks received, ignore them - // Short circuit if it's a stale cross check - if len(blocks) == 1 { - block := blocks[0] - if _, ok := d.checks[block.Hash()]; ok { - delete(d.checks, block.Hash()) - break - } - } - // Short circuit if it's not from the peer being banned - if blockPack.peerId != peerId { - break - } - // Short circuit if no blocks were returned - if len(blocks) == 0 { - return errors.New("no blocks returned to ban") - } - // Reconstruct the original chain order and ensure we're banning the correct blocks - types.BlockBy(types.Number).Sort(blocks) - if bytes.Compare(blocks[0].Hash().Bytes(), head.Bytes()) != 0 { - return errors.New("head block not the banned one") - } - index := 0 - for _, block := range blocks[1:] { - if bytes.Compare(block.ParentHash().Bytes(), blocks[index].Hash().Bytes()) != 0 { - break - } - index++ - } - // Ban the head hash and phase out any excess - d.banned.Add(blocks[index].Hash()) - for d.banned.Size() > maxBannedHashes { - var evacuate common.Hash - - d.banned.Each(func(item interface{}) bool { - // Skip any hard coded bans - if core.BadHashes[item.(common.Hash)] { - return true - } - evacuate = item.(common.Hash) - return false - }) - d.banned.Remove(evacuate) - } - glog.V(logger.Debug).Infof("Banned %d blocks from: %s", index+1, peerId) - return nil + case <-timeout: + glog.V(logger.Debug).Infof("%v: head header timeout", p) + return 0, errTimeout } } } -// process takes blocks from the queue and tries to import them into the chain. -// -// The algorithmic flow is as follows: -// - The `processing` flag is swapped to 1 to ensure singleton access -// - The current `cancel` channel is retrieved to detect sync abortions -// - Blocks are iteratively taken from the cache and inserted into the chain -// - When the cache becomes empty, insertion stops -// - The `processing` flag is swapped back to 0 -// - A post-exit check is made whether new blocks became available -// - This step is important: it handles a potential race condition between -// checking for no more work, and releasing the processing "mutex". In +// findAncestor tries to locate the common ancestor block of the local chain and +// a remote peers blockchain. In the general case when our node was in sync and +// on the correct chain, checking the top N blocks should already get us a match. +// In the rare scenario when we ended up on a long reorganization (i.e. none of +// the head blocks match), we do a binary search to find the common ancestor. +func (d *Downloader) findAncestor(p *peer) (uint64, error) { + glog.V(logger.Debug).Infof("%v: looking for common ancestor", p) + + // Request our head blocks to short circuit ancestor location + head := d.headBlock().NumberU64() + from := int64(head) - int64(MaxHeaderFetch) + 1 + if from < 0 { + from = 0 + } + go p.getAbsHeaders(uint64(from), MaxHeaderFetch, 0, false) + + // Wait for the remote response to the head fetch + number, hash := uint64(0), common.Hash{} + timeout := time.After(hashTTL) + + for finished := false; !finished; { + select { + case <-d.cancelCh: + return 0, errCancelHashFetch + + case headerPack := <-d.headerCh: + // Discard anything not from the origin peer + if headerPack.peerId != p.id { + glog.V(logger.Debug).Infof("Received headers from incorrect peer(%s)", headerPack.peerId) + break + } + // Make sure the peer actually gave something valid + headers := headerPack.headers + if len(headers) == 0 { + glog.V(logger.Debug).Infof("%v: empty head header set", p) + return 0, errEmptyHeaderSet + } + // Check if a common ancestor was found + finished = true + for i := len(headers) - 1; i >= 0; i-- { + if d.hasBlock(headers[i].Hash()) { + number, hash = headers[i].Number.Uint64(), headers[i].Hash() + break + } + } + + case <-d.bodyCh: + // Out of bounds block bodies received, ignore them + + case <-d.hashCh: + // Out of bounds eth/61 hashes received, ignore them + + case <-d.blockCh: + // Out of bounds eth/61 blocks received, ignore them + + case <-timeout: + glog.V(logger.Debug).Infof("%v: head header timeout", p) + return 0, errTimeout + } + } + // If the head fetch already found an ancestor, return + if !common.EmptyHash(hash) { + glog.V(logger.Debug).Infof("%v: common ancestor: #%d [%x…]", p, number, hash[:4]) + return number, nil + } + // Ancestor not found, we need to binary search over our chain + start, end := uint64(0), head + for start+1 < end { + // Split our chain interval in two, and request the hash to cross check + check := (start + end) / 2 + + timeout := time.After(hashTTL) + go p.getAbsHeaders(uint64(check), 1, 0, false) + + // Wait until a reply arrives to this request + for arrived := false; !arrived; { + select { + case <-d.cancelCh: + return 0, errCancelHashFetch + + case headerPack := <-d.headerCh: + // Discard anything not from the origin peer + if headerPack.peerId != p.id { + glog.V(logger.Debug).Infof("Received headers from incorrect peer(%s)", headerPack.peerId) + break + } + // Make sure the peer actually gave something valid + headers := headerPack.headers + if len(headers) != 1 { + glog.V(logger.Debug).Infof("%v: invalid search header set (%d)", p, len(headers)) + return 0, errBadPeer + } + arrived = true + + // Modify the search interval based on the response + block := d.getBlock(headers[0].Hash()) + if block == nil { + end = check + break + } + if block.NumberU64() != check { + glog.V(logger.Debug).Infof("%v: non requested header #%d [%x…], instead of #%d", p, block.NumberU64(), block.Hash().Bytes()[:4], check) + return 0, errBadPeer + } + start = check + + case <-d.bodyCh: + // Out of bounds block bodies received, ignore them + + case <-d.hashCh: + // Out of bounds eth/61 hashes received, ignore them + + case <-d.blockCh: + // Out of bounds eth/61 blocks received, ignore them + + case <-timeout: + glog.V(logger.Debug).Infof("%v: search header timeout", p) + return 0, errTimeout + } + } + } + return start, nil +} + +// fetchHeaders keeps retrieving headers from the requested number, until no more +// are returned, potentially throttling on the way. +func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { + glog.V(logger.Debug).Infof("%v: downloading headers from #%d", p, from) + defer glog.V(logger.Debug).Infof("%v: header download terminated", p) + + // Create a timeout timer, and the associated hash fetcher + request := time.Now() // time of the last fetch request + timeout := time.NewTimer(0) // timer to dump a non-responsive active peer + <-timeout.C // timeout channel should be initially empty + defer timeout.Stop() + + getHeaders := func(from uint64) { + glog.V(logger.Detail).Infof("%v: fetching %d headers from #%d", p, MaxHeaderFetch, from) + + go p.getAbsHeaders(from, MaxHeaderFetch, 0, false) + request = time.Now() + timeout.Reset(headerTTL) + } + // Start pulling headers, until all are exhausted + getHeaders(from) + gotHeaders := false + + for { + select { + case <-d.cancelCh: + return errCancelHeaderFetch + + case <-d.hashCh: + // Out of bounds eth/61 hashes received, ignore them + + case <-d.blockCh: + // Out of bounds eth/61 blocks received, ignore them + + case headerPack := <-d.headerCh: + // Make sure the active peer is giving us the headers + if headerPack.peerId != p.id { + glog.V(logger.Debug).Infof("Received headers from incorrect peer (%s)", headerPack.peerId) + break + } + headerReqTimer.UpdateSince(request) + timeout.Stop() + + // If no more headers are inbound, notify the body fetcher and return + if len(headerPack.headers) == 0 { + glog.V(logger.Debug).Infof("%v: no available headers", p) + + select { + case d.wakeCh <- false: + case <-d.cancelCh: + } + // If no headers were retrieved at all, the peer violated it's TD promise that it had a + // better chain compared to ours. The only exception is if it's promised blocks were + // already imported by other means (e.g. fecher): + // + // R , L : Both at block 10 + // R: Mine block 11, and propagate it to L + // L: Queue block 11 for import + // L: Notice that R's head and TD increased compared to ours, start sync + // L: Import of block 11 finishes + // L: Sync begins, and finds common ancestor at 11 + // L: Request new headers up from 11 (R's TD was higher, it must have something) + // R: Nothing to give + if !gotHeaders && td.Cmp(d.getTd(d.headBlock().Hash())) > 0 { + return errStallingPeer + } + return nil + } + gotHeaders = true + + // Otherwise insert all the new headers, aborting in case of junk + glog.V(logger.Detail).Infof("%v: inserting %d headers from #%d", p, len(headerPack.headers), from) + + inserts := d.queue.Insert(headerPack.headers, from) + if len(inserts) != len(headerPack.headers) { + glog.V(logger.Debug).Infof("%v: stale headers", p) + return errBadPeer + } + // Notify the block fetcher of new headers, but stop if queue is full + if d.queue.Pending() < maxQueuedHeaders { + // We still have headers to fetch, send continuation wake signal (potential) + select { + case d.wakeCh <- true: + default: + } + } else { + // Header limit reached, send a termination wake signal (enforced) + select { + case d.wakeCh <- false: + case <-d.cancelCh: + } + return nil + } + // Queue not yet full, fetch the next batch + from += uint64(len(headerPack.headers)) + getHeaders(from) + + case <-timeout.C: + // Header retrieval timed out, consider the peer bad and drop + glog.V(logger.Debug).Infof("%v: header request timed out", p) + headerTimeoutMeter.Mark(1) + d.dropPeer(p.id) + + // Finish the sync gracefully instead of dumping the gathered data though + select { + case d.wakeCh <- false: + case <-d.cancelCh: + } + return nil + } + } +} + +// fetchBodies iteratively downloads the scheduled block bodies, taking any +// available peers, reserving a chunk of blocks for each, waiting for delivery +// and also periodically checking for timeouts. +func (d *Downloader) fetchBodies(from uint64) error { + glog.V(logger.Debug).Infof("Downloading block bodies from #%d", from) + defer glog.V(logger.Debug).Infof("Block body download terminated") + + // Create a timeout timer for scheduling expiration tasks + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + update := make(chan struct{}, 1) + + // Prepare the queue and fetch block bodies until the block header fetcher's done + d.queue.Prepare(from) + finished := false + + for { + select { + case <-d.cancelCh: + return errCancelBlockFetch + + case <-d.hashCh: + // Out of bounds eth/61 hashes received, ignore them + + case <-d.blockCh: + // Out of bounds eth/61 blocks received, ignore them + + case bodyPack := <-d.bodyCh: + // If the peer was previously banned and failed to deliver it's pack + // in a reasonable time frame, ignore it's message. + if peer := d.peers.Peer(bodyPack.peerId); peer != nil { + // Deliver the received chunk of bodies, and demote in case of errors + err := d.queue.Deliver(bodyPack.peerId, bodyPack.transactions, bodyPack.uncles) + switch err { + case nil: + // If no blocks were delivered, demote the peer (need the delivery above) + if len(bodyPack.transactions) == 0 || len(bodyPack.uncles) == 0 { + peer.Demote() + peer.SetIdle() + glog.V(logger.Detail).Infof("%s: no block bodies delivered", peer) + break + } + // All was successful, promote the peer and potentially start processing + peer.Promote() + peer.SetIdle() + glog.V(logger.Detail).Infof("%s: delivered %d:%d block bodies", peer, len(bodyPack.transactions), len(bodyPack.uncles)) + go d.process() + + case errInvalidChain: + // The hash chain is invalid (blocks are not ordered properly), abort + return err + + case errInvalidBody: + // The peer delivered something very bad, drop immediately + glog.V(logger.Error).Infof("%s: delivered invalid block, dropping", peer) + d.dropPeer(peer.id) + + case errNoFetchesPending: + // Peer probably timed out with its delivery but came through + // in the end, demote, but allow to to pull from this peer. + peer.Demote() + peer.SetIdle() + glog.V(logger.Detail).Infof("%s: out of bound delivery", peer) + + case errStaleDelivery: + // Delivered something completely else than requested, usually + // caused by a timeout and delivery during a new sync cycle. + // Don't set it to idle as the original request should still be + // in flight. + peer.Demote() + glog.V(logger.Detail).Infof("%s: stale delivery", peer) + + default: + // Peer did something semi-useful, demote but keep it around + peer.Demote() + peer.SetIdle() + glog.V(logger.Detail).Infof("%s: delivery partially failed: %v", peer, err) + go d.process() + } + } + // Blocks assembled, try to update the progress + select { + case update <- struct{}{}: + default: + } + + case cont := <-d.wakeCh: + // The header fetcher sent a continuation flag, check if it's done + if !cont { + finished = true + } + // Headers arrive, try to update the progress + select { + case update <- struct{}{}: + default: + } + + case <-ticker.C: + // Sanity check update the progress + select { + case update <- struct{}{}: + default: + } + + case <-update: + // Short circuit if we lost all our peers + if d.peers.Len() == 0 { + return errNoPeers + } + // Check for block body request timeouts and demote the responsible peers + for _, pid := range d.queue.Expire(bodyHardTTL) { + if peer := d.peers.Peer(pid); peer != nil { + peer.Demote() + glog.V(logger.Detail).Infof("%s: block body delivery timeout", peer) + } + } + // If there's noting more to fetch, wait or terminate + if d.queue.Pending() == 0 { + if d.queue.InFlight() == 0 && finished { + glog.V(logger.Debug).Infof("Block body fetching completed") + return nil + } + break + } + // Send a download request to all idle peers, until throttled + queuedEmptyBlocks, throttled := false, false + for _, peer := range d.peers.IdlePeers(eth62) { + // Short circuit if throttling activated + if d.queue.Throttle() { + throttled = true + break + } + // Reserve a chunk of hashes for a peer. A nil can mean either that + // no more hashes are available, or that the peer is known not to + // have them. + request, process, err := d.queue.Reserve(peer, peer.Capacity()) + if err != nil { + return err + } + if process { + queuedEmptyBlocks = true + go d.process() + } + if request == nil { + continue + } + if glog.V(logger.Detail) { + glog.Infof("%s: requesting %d block bodies", peer, len(request.Headers)) + } + // Fetch the chunk and make sure any errors return the hashes to the queue + if d.bodyFetchHook != nil { + d.bodyFetchHook(request.Headers) + } + if err := peer.Fetch(request); err != nil { + glog.V(logger.Error).Infof("%v: fetch failed, rescheduling", peer) + d.queue.Cancel(request) + } + } + // Make sure that we have peers available for fetching. If all peers have been tried + // and all failed throw an error + if !queuedEmptyBlocks && !throttled && d.queue.InFlight() == 0 { + return errPeersUnavailable + } + } + } +} + +// process takes blocks from the queue and tries to import them into the chain. +// +// The algorithmic flow is as follows: +// - The `processing` flag is swapped to 1 to ensure singleton access +// - The current `cancel` channel is retrieved to detect sync abortions +// - Blocks are iteratively taken from the cache and inserted into the chain +// - When the cache becomes empty, insertion stops +// - The `processing` flag is swapped back to 0 +// - A post-exit check is made whether new blocks became available +// - This step is important: it handles a potential race condition between +// checking for no more work, and releasing the processing "mutex". In // between these state changes, a block may have arrived, but a processing // attempt denied, so we need to re-enter to ensure the block isn't left // to idle in the cache. @@ -1134,16 +1326,10 @@ func (d *Downloader) process() { d.process() } }() - // Release the lock upon exit (note, before checking for reentry!), and set + // Release the lock upon exit (note, before checking for reentry!) // the import statistics to zero. - defer func() { - d.importLock.Lock() - d.importQueue = nil - d.importDone = 0 - d.importLock.Unlock() + defer atomic.StoreInt32(&d.processing, 0) - atomic.StoreInt32(&d.processing, 0) - }() // Repeat the processing as long as there are blocks to import for { // Fetch the next batch of blocks @@ -1151,13 +1337,9 @@ func (d *Downloader) process() { if len(blocks) == 0 { return } - // Reset the import statistics - d.importLock.Lock() - d.importStart = time.Now() - d.importQueue = blocks - d.importDone = 0 - d.importLock.Unlock() - + if d.chainInsertHook != nil { + d.chainInsertHook(blocks) + } // Actually import the blocks glog.V(logger.Debug).Infof("Inserting chain with %d blocks (#%v - #%v)\n", len(blocks), blocks[0].RawBlock.Number(), blocks[len(blocks)-1].RawBlock.Number()) for len(blocks) != 0 { @@ -1184,9 +1366,45 @@ func (d *Downloader) process() { } } -// DeliverBlocks injects a new batch of blocks received from a remote node. +// DeliverHashes61 injects a new batch of hashes received from a remote node into +// the download schedule. This is usually invoked through the BlockHashesMsg by +// the protocol handler. +func (d *Downloader) DeliverHashes61(id string, hashes []common.Hash) (err error) { + // Update the delivery metrics for both good and failed deliveries + hashInMeter.Mark(int64(len(hashes))) + defer func() { + if err != nil { + hashDropMeter.Mark(int64(len(hashes))) + } + }() + // Make sure the downloader is active + if atomic.LoadInt32(&d.synchronising) == 0 { + return errNoSyncActive + } + // Deliver or abort if the sync is canceled while queuing + d.cancelLock.RLock() + cancel := d.cancelCh + d.cancelLock.RUnlock() + + select { + case d.hashCh <- hashPack{id, hashes}: + return nil + + case <-cancel: + return errNoSyncActive + } +} + +// DeliverBlocks61 injects a new batch of blocks received from a remote node. // This is usually invoked through the BlocksMsg by the protocol handler. -func (d *Downloader) DeliverBlocks(id string, blocks []*types.Block) error { +func (d *Downloader) DeliverBlocks61(id string, blocks []*types.Block) (err error) { + // Update the delivery metrics for both good and failed deliveries + blockInMeter.Mark(int64(len(blocks))) + defer func() { + if err != nil { + blockDropMeter.Mark(int64(len(blocks))) + } + }() // Make sure the downloader is active if atomic.LoadInt32(&d.synchronising) == 0 { return errNoSyncActive @@ -1205,10 +1423,16 @@ func (d *Downloader) DeliverBlocks(id string, blocks []*types.Block) error { } } -// DeliverHashes injects a new batch of hashes received from a remote node into -// the download schedule. This is usually invoked through the BlockHashesMsg by -// the protocol handler. -func (d *Downloader) DeliverHashes(id string, hashes []common.Hash) error { +// DeliverHeaders injects a new batch of blck headers received from a remote +// node into the download schedule. +func (d *Downloader) DeliverHeaders(id string, headers []*types.Header) (err error) { + // Update the delivery metrics for both good and failed deliveries + headerInMeter.Mark(int64(len(headers))) + defer func() { + if err != nil { + headerDropMeter.Mark(int64(len(headers))) + } + }() // Make sure the downloader is active if atomic.LoadInt32(&d.synchronising) == 0 { return errNoSyncActive @@ -1219,7 +1443,34 @@ func (d *Downloader) DeliverHashes(id string, hashes []common.Hash) error { d.cancelLock.RUnlock() select { - case d.hashCh <- hashPack{id, hashes}: + case d.headerCh <- headerPack{id, headers}: + return nil + + case <-cancel: + return errNoSyncActive + } +} + +// DeliverBodies injects a new batch of block bodies received from a remote node. +func (d *Downloader) DeliverBodies(id string, transactions [][]*types.Transaction, uncles [][]*types.Header) (err error) { + // Update the delivery metrics for both good and failed deliveries + bodyInMeter.Mark(int64(len(transactions))) + defer func() { + if err != nil { + bodyDropMeter.Mark(int64(len(transactions))) + } + }() + // Make sure the downloader is active + if atomic.LoadInt32(&d.synchronising) == 0 { + return errNoSyncActive + } + // Deliver or abort if the sync is canceled while queuing + d.cancelLock.RLock() + cancel := d.cancelCh + d.cancelLock.RUnlock() + + select { + case d.bodyCh <- bodyPack{id, transactions, uncles}: return nil case <-cancel: diff --git a/exp/downloader/downloader_test.go b/exp/downloader/downloader_test.go index 5b4cb7d994e9..57a31e05636f 100644 --- a/exp/downloader/downloader_test.go +++ b/exp/downloader/downloader_test.go @@ -17,10 +17,10 @@ package downloader import ( - "crypto/rand" "errors" "fmt" "math/big" + "sync" "sync/atomic" "testing" "time" @@ -28,20 +28,39 @@ import ( "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/params" ) var ( - testdb, _ = ethdb.NewMemDatabase() - genesis = core.GenesisBlockForTesting(testdb, common.Address{}, big.NewInt(0)) + testdb, _ = ethdb.NewMemDatabase() + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testAddress = crypto.PubkeyToAddress(testKey.PublicKey) + genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) ) -// makeChain creates a chain of n blocks starting at but not including -// parent. the returned hash chain is ordered head->parent. +// makeChain creates a chain of n blocks starting at and including parent. +// the returned hash chain is ordered head->parent. In addition, every 3rd block +// contains a transaction and every 5th an uncle to allow testing correct block +// reassembly. func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common.Hash]*types.Block) { - blocks := core.GenerateChain(parent, testdb, n, func(i int, gen *core.BlockGen) { - gen.SetCoinbase(common.Address{seed}) + blocks := core.GenerateChain(parent, testdb, n, func(i int, block *core.BlockGen) { + block.SetCoinbase(common.Address{seed}) + + // If the block number is multiple of 3, send a bonus transaction to the miner + if parent == genesis && i%3 == 0 { + tx, err := types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(testKey) + if err != nil { + panic(err) + } + block.AddTx(tx) + } + // If the block number is a multiple of 5, add a bonus uncle to the block + if i%5 == 0 { + block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 1).Hash(), Number: big.NewInt(int64(i - 1))}) + } }) hashes := make([]common.Hash, n+1) hashes[len(hashes)-1] = parent.Hash() @@ -75,40 +94,45 @@ func makeChainFork(n, f int, parent *types.Block) (h1, h2 []common.Hash, b1, b2 type downloadTester struct { downloader *Downloader - ownHashes []common.Hash // Hash chain belonging to the tester - ownBlocks map[common.Hash]*types.Block // Blocks belonging to the tester - peerHashes map[string][]common.Hash // Hash chain belonging to different test peers - peerBlocks map[string]map[common.Hash]*types.Block // Blocks belonging to different test peers + ownHashes []common.Hash // Hash chain belonging to the tester + ownBlocks map[common.Hash]*types.Block // Blocks belonging to the tester + ownChainTd map[common.Hash]*big.Int // Total difficulties of the blocks in the local chain + peerHashes map[string][]common.Hash // Hash chain belonging to different test peers + peerBlocks map[string]map[common.Hash]*types.Block // Blocks belonging to different test peers + peerChainTds map[string]map[common.Hash]*big.Int // Total difficulties of the blocks in the peer chains - maxHashFetch int // Overrides the maximum number of retrieved hashes + lock sync.RWMutex } // newTester creates a new downloader test mocker. func newTester() *downloadTester { tester := &downloadTester{ - ownHashes: []common.Hash{genesis.Hash()}, - ownBlocks: map[common.Hash]*types.Block{genesis.Hash(): genesis}, - peerHashes: make(map[string][]common.Hash), - peerBlocks: make(map[string]map[common.Hash]*types.Block), + ownHashes: []common.Hash{genesis.Hash()}, + ownBlocks: map[common.Hash]*types.Block{genesis.Hash(): genesis}, + ownChainTd: map[common.Hash]*big.Int{genesis.Hash(): genesis.Difficulty()}, + peerHashes: make(map[string][]common.Hash), + peerBlocks: make(map[string]map[common.Hash]*types.Block), + peerChainTds: make(map[string]map[common.Hash]*big.Int), } - tester.downloader = New(new(event.TypeMux), tester.hasBlock, tester.getBlock, tester.headBlock, tester.insertChain, tester.dropPeer) + tester.downloader = New(new(event.TypeMux), tester.hasBlock, tester.getBlock, tester.headBlock, tester.getTd, tester.insertChain, tester.dropPeer) return tester } // sync starts synchronizing with a remote peer, blocking until it completes. func (dl *downloadTester) sync(id string, td *big.Int) error { + dl.lock.RLock() hash := dl.peerHashes[id][0] - // If no particular TD was requested, load from the peer's blockchain if td == nil { td = big.NewInt(1) - if block, ok := dl.peerBlocks[id][hash]; ok { - td = block.Td + if diff, ok := dl.peerChainTds[id][hash]; ok { + td = diff } } - err := dl.downloader.synchronise(id, hash, td) + dl.lock.RUnlock() + err := dl.downloader.synchronise(id, hash, td) for { // If the queue is empty and processing stopped, break hashes, blocks := dl.downloader.queue.Size() @@ -123,27 +147,48 @@ func (dl *downloadTester) sync(id string, td *big.Int) error { // hasBlock checks if a block is pres ent in the testers canonical chain. func (dl *downloadTester) hasBlock(hash common.Hash) bool { + dl.lock.RLock() + defer dl.lock.RUnlock() + return dl.getBlock(hash) != nil } // getBlock retrieves a block from the testers canonical chain. func (dl *downloadTester) getBlock(hash common.Hash) *types.Block { + dl.lock.RLock() + defer dl.lock.RUnlock() + return dl.ownBlocks[hash] } // headBlock retrieves the current head block from the canonical chain. func (dl *downloadTester) headBlock() *types.Block { + dl.lock.RLock() + defer dl.lock.RUnlock() + return dl.getBlock(dl.ownHashes[len(dl.ownHashes)-1]) } +// getTd retrieves the block's total difficulty from the canonical chain. +func (dl *downloadTester) getTd(hash common.Hash) *big.Int { + dl.lock.RLock() + defer dl.lock.RUnlock() + + return dl.ownChainTd[hash] +} + // insertChain injects a new batch of blocks into the simulated chain. func (dl *downloadTester) insertChain(blocks types.Blocks) (int, error) { + dl.lock.Lock() + defer dl.lock.Unlock() + for i, block := range blocks { if _, ok := dl.ownBlocks[block.ParentHash()]; !ok { return i, errors.New("unknown parent") } dl.ownHashes = append(dl.ownHashes, block.Hash()) dl.ownBlocks[block.Hash()] = block + dl.ownChainTd[block.Hash()] = dl.ownChainTd[block.ParentHash()] } return len(blocks), nil } @@ -157,14 +202,34 @@ func (dl *downloadTester) newPeer(id string, version int, hashes []common.Hash, // specific delay time on processing the network packets sent to it, simulating // potentially slow network IO. func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Hash, blocks map[common.Hash]*types.Block, delay time.Duration) error { - err := dl.downloader.RegisterPeer(id, version, hashes[0], dl.peerGetRelHashesFn(id, delay), dl.peerGetAbsHashesFn(id, version, delay), dl.peerGetBlocksFn(id, delay)) + dl.lock.Lock() + defer dl.lock.Unlock() + + var err error + switch version { + case 61: + err = dl.downloader.RegisterPeer(id, version, hashes[0], dl.peerGetRelHashesFn(id, delay), dl.peerGetAbsHashesFn(id, delay), dl.peerGetBlocksFn(id, delay), nil, nil, nil) + case 62: + err = dl.downloader.RegisterPeer(id, version, hashes[0], nil, nil, nil, dl.peerGetRelHeadersFn(id, delay), dl.peerGetAbsHeadersFn(id, delay), dl.peerGetBodiesFn(id, delay)) + case 63: + err = dl.downloader.RegisterPeer(id, version, hashes[0], nil, nil, nil, dl.peerGetRelHeadersFn(id, delay), dl.peerGetAbsHeadersFn(id, delay), dl.peerGetBodiesFn(id, delay)) + case 64: + err = dl.downloader.RegisterPeer(id, version, hashes[0], nil, nil, nil, dl.peerGetRelHeadersFn(id, delay), dl.peerGetAbsHeadersFn(id, delay), dl.peerGetBodiesFn(id, delay)) + } if err == nil { // Assign the owned hashes and blocks to the peer (deep copy) dl.peerHashes[id] = make([]common.Hash, len(hashes)) copy(dl.peerHashes[id], hashes) + dl.peerBlocks[id] = make(map[common.Hash]*types.Block) - for hash, block := range blocks { - dl.peerBlocks[id][hash] = block + dl.peerChainTds[id] = make(map[common.Hash]*big.Int) + for _, hash := range hashes { + if block, ok := blocks[hash]; ok { + dl.peerBlocks[id][hash] = block + if parent, ok := dl.peerBlocks[id][block.ParentHash()]; ok { + dl.peerChainTds[id][hash] = new(big.Int).Add(block.Difficulty(), dl.peerChainTds[id][parent.Hash()]) + } + } } } return err @@ -172,8 +237,12 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha // dropPeer simulates a hard peer removal from the connection pool. func (dl *downloadTester) dropPeer(id string) { + dl.lock.Lock() + defer dl.lock.Unlock() + delete(dl.peerHashes, id) delete(dl.peerBlocks, id) + delete(dl.peerChainTds, id) dl.downloader.UnregisterPeer(id) } @@ -185,13 +254,12 @@ func (dl *downloadTester) peerGetRelHashesFn(id string, delay time.Duration) fun return func(head common.Hash) error { time.Sleep(delay) - limit := MaxHashFetch - if dl.maxHashFetch > 0 { - limit = dl.maxHashFetch - } + dl.lock.RLock() + defer dl.lock.RUnlock() + // Gather the next batch of hashes hashes := dl.peerHashes[id] - result := make([]common.Hash, 0, limit) + result := make([]common.Hash, 0, MaxHashFetch) for i, hash := range hashes { if hash == head { i++ @@ -205,7 +273,7 @@ func (dl *downloadTester) peerGetRelHashesFn(id string, delay time.Duration) fun // Delay delivery a bit to allow attacks to unfold go func() { time.Sleep(time.Millisecond) - dl.downloader.DeliverHashes(id, result) + dl.downloader.DeliverHashes61(id, result) }() return nil } @@ -214,29 +282,23 @@ func (dl *downloadTester) peerGetRelHashesFn(id string, delay time.Duration) fun // peerGetAbsHashesFn constructs a GetHashesFromNumber function associated with // a particular peer in the download tester. The returned function can be used to // retrieve batches of hashes from the particularly requested peer. -func (dl *downloadTester) peerGetAbsHashesFn(id string, version int, delay time.Duration) func(uint64, int) error { - // If the simulated peer runs exp/60, this message is not supported - if version == eth60 { - return func(uint64, int) error { return nil } - } - // Otherwise create a method to request the blocks by number +func (dl *downloadTester) peerGetAbsHashesFn(id string, delay time.Duration) func(uint64, int) error { return func(head uint64, count int) error { time.Sleep(delay) - limit := count - if dl.maxHashFetch > 0 { - limit = dl.maxHashFetch - } + dl.lock.RLock() + defer dl.lock.RUnlock() + // Gather the next batch of hashes hashes := dl.peerHashes[id] - result := make([]common.Hash, 0, limit) - for i := 0; i < limit && len(hashes)-int(head)-1-i >= 0; i++ { + result := make([]common.Hash, 0, count) + for i := 0; i < count && len(hashes)-int(head)-1-i >= 0; i++ { result = append(result, hashes[len(hashes)-int(head)-1-i]) } // Delay delivery a bit to allow attacks to unfold go func() { time.Sleep(time.Millisecond) - dl.downloader.DeliverHashes(id, result) + dl.downloader.DeliverHashes61(id, result) }() return nil } @@ -248,6 +310,10 @@ func (dl *downloadTester) peerGetAbsHashesFn(id string, version int, delay time. func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([]common.Hash) error { return func(hashes []common.Hash) error { time.Sleep(delay) + + dl.lock.RLock() + defer dl.lock.RUnlock() + blocks := dl.peerBlocks[id] result := make([]*types.Block, 0, len(hashes)) for _, hash := range hashes { @@ -255,40 +321,103 @@ func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([ result = append(result, block) } } - go dl.downloader.DeliverBlocks(id, result) + go dl.downloader.DeliverBlocks61(id, result) return nil } } -// Tests that simple synchronization, without throttling from a good peer works. -func TestSynchronisation60(t *testing.T) { - // Create a small enough block chain to download and the tester - targetBlocks := blockCacheLimit - 15 - hashes, blocks := makeChain(targetBlocks, 0, genesis) +// peerGetRelHeadersFn constructs a GetBlockHeaders function based on a hashed +// origin; associated with a particular peer in the download tester. The returned +// function can be used to retrieve batches of headers from the particular peer. +func (dl *downloadTester) peerGetRelHeadersFn(id string, delay time.Duration) func(common.Hash, int, int, bool) error { + return func(origin common.Hash, amount int, skip int, reverse bool) error { + // Find the canonical number of the hash + dl.lock.RLock() + number := uint64(0) + for num, hash := range dl.peerHashes[id] { + if hash == origin { + number = uint64(len(dl.peerHashes[id]) - num - 1) + break + } + } + dl.lock.RUnlock() - tester := newTester() - tester.newPeer("peer", eth60, hashes, blocks) + // Use the absolute header fetcher to satisfy the query + return dl.peerGetAbsHeadersFn(id, delay)(number, amount, skip, reverse) + } +} - // Synchronise with the peer and make sure all blocks were retrieved - if err := tester.sync("peer", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) +// peerGetAbsHeadersFn constructs a GetBlockHeaders function based on a numbered +// origin; associated with a particular peer in the download tester. The returned +// function can be used to retrieve batches of headers from the particular peer. +func (dl *downloadTester) peerGetAbsHeadersFn(id string, delay time.Duration) func(uint64, int, int, bool) error { + return func(origin uint64, amount int, skip int, reverse bool) error { + time.Sleep(delay) + + dl.lock.RLock() + defer dl.lock.RUnlock() + + // Gather the next batch of hashes + hashes := dl.peerHashes[id] + blocks := dl.peerBlocks[id] + result := make([]*types.Header, 0, amount) + for i := 0; i < amount && len(hashes)-int(origin)-1-i >= 0; i++ { + if block, ok := blocks[hashes[len(hashes)-int(origin)-1-i]]; ok { + result = append(result, block.Header()) + } + } + // Delay delivery a bit to allow attacks to unfold + go func() { + time.Sleep(time.Millisecond) + dl.downloader.DeliverHeaders(id, result) + }() + return nil } - if imported := len(tester.ownBlocks); imported != targetBlocks+1 { - t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) +} + +// peerGetBodiesFn constructs a getBlockBodies method associated with a particular +// peer in the download tester. The returned function can be used to retrieve +// batches of block bodies from the particularly requested peer. +func (dl *downloadTester) peerGetBodiesFn(id string, delay time.Duration) func([]common.Hash) error { + return func(hashes []common.Hash) error { + time.Sleep(delay) + + dl.lock.RLock() + defer dl.lock.RUnlock() + + blocks := dl.peerBlocks[id] + + transactions := make([][]*types.Transaction, 0, len(hashes)) + uncles := make([][]*types.Header, 0, len(hashes)) + + for _, hash := range hashes { + if block, ok := blocks[hash]; ok { + transactions = append(transactions, block.Transactions()) + uncles = append(uncles, block.Uncles()) + } + } + go dl.downloader.DeliverBodies(id, transactions, uncles) + + return nil } } // Tests that simple synchronization against a canonical chain works correctly. // In this test common ancestor lookup should be short circuited and not require // binary searching. -func TestCanonicalSynchronisation61(t *testing.T) { +func TestCanonicalSynchronisation61(t *testing.T) { testCanonicalSynchronisation(t, 61) } +func TestCanonicalSynchronisation62(t *testing.T) { testCanonicalSynchronisation(t, 62) } +func TestCanonicalSynchronisation63(t *testing.T) { testCanonicalSynchronisation(t, 63) } +func TestCanonicalSynchronisation64(t *testing.T) { testCanonicalSynchronisation(t, 64) } + +func testCanonicalSynchronisation(t *testing.T, protocol int) { // Create a small enough block chain to download targetBlocks := blockCacheLimit - 15 hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() - tester.newPeer("peer", eth61, hashes, blocks) + tester.newPeer("peer", protocol, hashes, blocks) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("peer", nil); err != nil { @@ -301,8 +430,10 @@ func TestCanonicalSynchronisation61(t *testing.T) { // Tests that if a large batch of blocks are being downloaded, it is throttled // until the cached blocks are retrieved. -func TestThrottling60(t *testing.T) { testThrottling(t, eth60) } -func TestThrottling61(t *testing.T) { testThrottling(t, eth61) } +func TestThrottling61(t *testing.T) { testThrottling(t, 61) } +func TestThrottling62(t *testing.T) { testThrottling(t, 62) } +func TestThrottling63(t *testing.T) { testThrottling(t, 63) } +func TestThrottling64(t *testing.T) { testThrottling(t, 64) } func testThrottling(t *testing.T, protocol int) { // Create a long block chain to download and the tester @@ -313,11 +444,10 @@ func testThrottling(t *testing.T, protocol int) { tester.newPeer("peer", protocol, hashes, blocks) // Wrap the importer to allow stepping - done := make(chan int) - tester.downloader.insertChain = func(blocks types.Blocks) (int, error) { - n, err := tester.insertChain(blocks) - done <- n - return n, err + blocked, proceed := uint32(0), make(chan struct{}) + tester.downloader.chainInsertHook = func(blocks []*Block) { + atomic.StoreUint32(&blocked, uint32(len(blocks))) + <-proceed } // Start a synchronisation concurrently errc := make(chan error) @@ -325,30 +455,38 @@ func testThrottling(t *testing.T, protocol int) { errc <- tester.sync("peer", nil) }() // Iteratively take some blocks, always checking the retrieval count - for len(tester.ownBlocks) < targetBlocks+1 { + for { + // Check the retrieval count synchronously (! reason for this ugly block) + tester.lock.RLock() + retrieved := len(tester.ownBlocks) + tester.lock.RUnlock() + if retrieved >= targetBlocks+1 { + break + } // Wait a bit for sync to throttle itself var cached int - for start := time.Now(); time.Since(start) < 3*time.Second; { + for start := time.Now(); time.Since(start) < time.Second; { time.Sleep(25 * time.Millisecond) + tester.downloader.queue.lock.RLock() cached = len(tester.downloader.queue.blockPool) - if cached == blockCacheLimit || len(tester.ownBlocks)+cached == targetBlocks+1 { + tester.downloader.queue.lock.RUnlock() + + if cached == blockCacheLimit || len(tester.ownBlocks)+cached+int(atomic.LoadUint32(&blocked)) == targetBlocks+1 { break } } // Make sure we filled up the cache, then exhaust it time.Sleep(25 * time.Millisecond) // give it a chance to screw up - if cached != blockCacheLimit && len(tester.ownBlocks)+cached < targetBlocks+1 { - t.Fatalf("block count mismatch: have %v, want %v", cached, blockCacheLimit) + if cached != blockCacheLimit && len(tester.ownBlocks)+cached+int(atomic.LoadUint32(&blocked)) != targetBlocks+1 { + t.Fatalf("block count mismatch: have %v, want %v (owned %v, target %v)", cached, blockCacheLimit, len(tester.ownBlocks), targetBlocks+1) } - <-done // finish previous blocking import - for cached > maxBlockProcess { - cached -= <-done + // Permit the blocked blocks to import + if atomic.LoadUint32(&blocked) > 0 { + atomic.StoreUint32(&blocked, uint32(0)) + proceed <- struct{}{} } - time.Sleep(25 * time.Millisecond) // yield to the insertion } - <-done // finish the last blocking import - // Check that we haven't pulled more blocks than available if len(tester.ownBlocks) > targetBlocks+1 { t.Fatalf("target block count mismatch: have %v, want %v", len(tester.ownBlocks), targetBlocks+1) @@ -361,14 +499,19 @@ func testThrottling(t *testing.T, protocol int) { // Tests that simple synchronization against a forked chain works correctly. In // this test common ancestor lookup should *not* be short circuited, and a full // binary search should be executed. -func TestForkedSynchronisation61(t *testing.T) { +func TestForkedSynchronisation61(t *testing.T) { testForkedSynchronisation(t, 61) } +func TestForkedSynchronisation62(t *testing.T) { testForkedSynchronisation(t, 62) } +func TestForkedSynchronisation63(t *testing.T) { testForkedSynchronisation(t, 63) } +func TestForkedSynchronisation64(t *testing.T) { testForkedSynchronisation(t, 64) } + +func testForkedSynchronisation(t *testing.T, protocol int) { // Create a long enough forked chain common, fork := MaxHashFetch, 2*MaxHashFetch hashesA, hashesB, blocksA, blocksB := makeChainFork(common+fork, fork, genesis) tester := newTester() - tester.newPeer("fork A", eth61, hashesA, blocksA) - tester.newPeer("fork B", eth61, hashesB, blocksB) + tester.newPeer("fork A", protocol, hashesA, blocksA) + tester.newPeer("fork B", protocol, hashesB, blocksB) // Synchronise with the peer and make sure all blocks were retrieved if err := tester.sync("fork A", nil); err != nil { @@ -387,21 +530,36 @@ func TestForkedSynchronisation61(t *testing.T) { } // Tests that an inactive downloader will not accept incoming hashes and blocks. -func TestInactiveDownloader(t *testing.T) { +func TestInactiveDownloader61(t *testing.T) { tester := newTester() // Check that neither hashes nor blocks are accepted - if err := tester.downloader.DeliverHashes("bad peer", []common.Hash{}); err != errNoSyncActive { + if err := tester.downloader.DeliverHashes61("bad peer", []common.Hash{}); err != errNoSyncActive { + t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) + } + if err := tester.downloader.DeliverBlocks61("bad peer", []*types.Block{}); err != errNoSyncActive { t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) } - if err := tester.downloader.DeliverBlocks("bad peer", []*types.Block{}); err != errNoSyncActive { +} + +// Tests that an inactive downloader will not accept incoming block headers and bodies. +func TestInactiveDownloader62(t *testing.T) { + tester := newTester() + + // Check that neither block headers nor bodies are accepted + if err := tester.downloader.DeliverHeaders("bad peer", []*types.Header{}); err != errNoSyncActive { + t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) + } + if err := tester.downloader.DeliverBodies("bad peer", [][]*types.Transaction{}, [][]*types.Header{}); err != errNoSyncActive { t.Errorf("error mismatch: have %v, want %v", err, errNoSyncActive) } } // Tests that a canceled download wipes all previously accumulated state. -func TestCancel60(t *testing.T) { testCancel(t, eth60) } -func TestCancel61(t *testing.T) { testCancel(t, eth61) } +func TestCancel61(t *testing.T) { testCancel(t, 61) } +func TestCancel62(t *testing.T) { testCancel(t, 62) } +func TestCancel63(t *testing.T) { testCancel(t, 63) } +func TestCancel64(t *testing.T) { testCancel(t, 64) } func testCancel(t *testing.T, protocol int) { // Create a small enough block chain to download and the tester @@ -409,6 +567,9 @@ func testCancel(t *testing.T, protocol int) { if targetBlocks >= MaxHashFetch { targetBlocks = MaxHashFetch - 15 } + if targetBlocks >= MaxHeaderFetch { + targetBlocks = MaxHeaderFetch - 15 + } hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() @@ -416,28 +577,30 @@ func testCancel(t *testing.T, protocol int) { // Make sure canceling works with a pristine downloader tester.downloader.cancel() - hashCount, blockCount := tester.downloader.queue.Size() - if hashCount > 0 || blockCount > 0 { - t.Errorf("block or hash count mismatch: %d hashes, %d blocks, want 0", hashCount, blockCount) + downloading, importing := tester.downloader.queue.Size() + if downloading > 0 || importing > 0 { + t.Errorf("download or import count mismatch: %d downloading, %d importing, want 0", downloading, importing) } // Synchronise with the peer, but cancel afterwards if err := tester.sync("peer", nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } tester.downloader.cancel() - hashCount, blockCount = tester.downloader.queue.Size() - if hashCount > 0 || blockCount > 0 { - t.Errorf("block or hash count mismatch: %d hashes, %d blocks, want 0", hashCount, blockCount) + downloading, importing = tester.downloader.queue.Size() + if downloading > 0 || importing > 0 { + t.Errorf("download or import count mismatch: %d downloading, %d importing, want 0", downloading, importing) } } // Tests that synchronisation from multiple peers works as intended (multi thread sanity test). -func TestMultiSynchronisation60(t *testing.T) { testMultiSynchronisation(t, eth60) } -func TestMultiSynchronisation61(t *testing.T) { testMultiSynchronisation(t, eth61) } +func TestMultiSynchronisation61(t *testing.T) { testMultiSynchronisation(t, 61) } +func TestMultiSynchronisation62(t *testing.T) { testMultiSynchronisation(t, 62) } +func TestMultiSynchronisation63(t *testing.T) { testMultiSynchronisation(t, 63) } +func TestMultiSynchronisation64(t *testing.T) { testMultiSynchronisation(t, 64) } func testMultiSynchronisation(t *testing.T, protocol int) { // Create various peers with various parts of the chain - targetPeers := 16 + targetPeers := 8 targetBlocks := targetPeers*blockCacheLimit - 15 hashes, blocks := makeChain(targetBlocks, 0, genesis) @@ -463,394 +626,226 @@ func testMultiSynchronisation(t *testing.T, protocol int) { } } -// Tests that synchronising with a peer who's very slow at network IO does not -// stall the other peers in the system. -func TestSlowSynchronisation60(t *testing.T) { - tester := newTester() +// Tests that synchronisations behave well in multi-version protocol environments +// and not wreak havok on other nodes in the network. +func TestMultiProtocolSynchronisation61(t *testing.T) { testMultiProtocolSynchronisation(t, 61) } +func TestMultiProtocolSynchronisation62(t *testing.T) { testMultiProtocolSynchronisation(t, 62) } +func TestMultiProtocolSynchronisation63(t *testing.T) { testMultiProtocolSynchronisation(t, 63) } +func TestMultiProtocolSynchronisation64(t *testing.T) { testMultiProtocolSynchronisation(t, 64) } - // Create a batch of blocks, with a slow and a full speed peer - targetCycles := 2 - targetBlocks := targetCycles*blockCacheLimit - 15 - targetIODelay := time.Second +func testMultiProtocolSynchronisation(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 hashes, blocks := makeChain(targetBlocks, 0, genesis) - tester.newSlowPeer("fast", eth60, hashes, blocks, 0) - tester.newSlowPeer("slow", eth60, hashes, blocks, targetIODelay) + // Create peers of every type + tester := newTester() + tester.newPeer("peer 61", 61, hashes, blocks) + tester.newPeer("peer 62", 62, hashes, blocks) + tester.newPeer("peer 63", 63, hashes, blocks) + tester.newPeer("peer 64", 64, hashes, blocks) - // Try to sync with the peers (pull hashes from fast) - start := time.Now() - if err := tester.sync("fast", nil); err != nil { + // Synchronise with the requestd peer and make sure all blocks were retrieved + if err := tester.sync(fmt.Sprintf("peer %d", protocol), nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } if imported := len(tester.ownBlocks); imported != targetBlocks+1 { t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) } - // Check that the slow peer got hit at most once per block-cache-size import - limit := time.Duration(targetCycles+1) * targetIODelay - if delay := time.Since(start); delay >= limit { - t.Fatalf("synchronisation exceeded delay limit: have %v, want %v", delay, limit) + // Check that no peers have been dropped off + for _, version := range []int{61, 62, 63, 64} { + peer := fmt.Sprintf("peer %d", version) + if _, ok := tester.peerHashes[peer]; !ok { + t.Errorf("%s dropped", peer) + } } } -// Tests that if a peer returns an invalid chain with a block pointing to a non- -// existing parent, it is correctly detected and handled. -func TestNonExistingParentAttack60(t *testing.T) { - tester := newTester() +// Tests that if a block is empty (i.e. header only), no body request should be +// made, and instead the header should be assembled into a whole block in itself. +func TestEmptyBlockShortCircuit62(t *testing.T) { testEmptyBlockShortCircuit(t, 62) } +func TestEmptyBlockShortCircuit63(t *testing.T) { testEmptyBlockShortCircuit(t, 63) } +func TestEmptyBlockShortCircuit64(t *testing.T) { testEmptyBlockShortCircuit(t, 64) } - // Forge a single-link chain with a forged header - hashes, blocks := makeChain(1, 0, genesis) - tester.newPeer("valid", eth60, hashes, blocks) +func testEmptyBlockShortCircuit(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) - wrongblock := types.NewBlock(&types.Header{}, nil, nil, nil) - wrongblock.Td = blocks[hashes[0]].Td - hashes, blocks = makeChain(1, 0, wrongblock) - tester.newPeer("attack", eth60, hashes, blocks) + tester := newTester() + tester.newPeer("peer", protocol, hashes, blocks) - // Try and sync with the malicious node and check that it fails - if err := tester.sync("attack", nil); err == nil { - t.Fatalf("block synchronization succeeded") + // Instrument the downloader to signal body requests + requested := int32(0) + tester.downloader.bodyFetchHook = func(headers []*types.Header) { + atomic.AddInt32(&requested, int32(len(headers))) } - if tester.hasBlock(hashes[0]) { - t.Fatalf("tester accepted unknown-parent block: %v", blocks[hashes[0]]) - } - // Try to synchronize with the valid chain and make sure it succeeds - if err := tester.sync("valid", nil); err != nil { + // Synchronise with the peer and make sure all blocks were retrieved + if err := tester.sync("peer", nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - if !tester.hasBlock(tester.peerHashes["valid"][0]) { - t.Fatalf("tester didn't accept known-parent block: %v", tester.peerBlocks["valid"][hashes[0]]) + if imported := len(tester.ownBlocks); imported != targetBlocks+1 { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) } -} - -// Tests that if a malicious peers keeps sending us repeating hashes, we don't -// loop indefinitely. -func TestRepeatingHashAttack60(t *testing.T) { // TODO: Is this thing valid?? - tester := newTester() - - // Create a valid chain, but drop the last link - hashes, blocks := makeChain(blockCacheLimit, 0, genesis) - tester.newPeer("valid", eth60, hashes, blocks) - tester.newPeer("attack", eth60, hashes[:len(hashes)-1], blocks) - - // Try and sync with the malicious node - errc := make(chan error) - go func() { - errc <- tester.sync("attack", nil) - }() - // Make sure that syncing returns and does so with a failure - select { - case <-time.After(time.Second): - t.Fatalf("synchronisation blocked") - case err := <-errc: - if err == nil { - t.Fatalf("synchronisation succeeded") + // Validate the number of block bodies that should have been requested + needed := 0 + for _, block := range blocks { + if block != genesis && (len(block.Transactions()) > 0 || len(block.Uncles()) > 0) { + needed++ } } - // Ensure that a valid chain can still pass sync - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + if int(requested) != needed { + t.Fatalf("block body retrieval count mismatch: have %v, want %v", requested, needed) } } -// Tests that if a malicious peers returns a non-existent block hash, it should -// eventually time out and the sync reattempted. -func TestNonExistingBlockAttack60(t *testing.T) { - tester := newTester() - - // Create a valid chain, but forge the last link - hashes, blocks := makeChain(blockCacheLimit, 0, genesis) - tester.newPeer("valid", eth60, hashes, blocks) +// Tests that headers are enqueued continuously, preventing malicious nodes from +// stalling the downloader by feeding gapped header chains. +func TestMissingHeaderAttack62(t *testing.T) { testMissingHeaderAttack(t, 62) } +func TestMissingHeaderAttack63(t *testing.T) { testMissingHeaderAttack(t, 63) } +func TestMissingHeaderAttack64(t *testing.T) { testMissingHeaderAttack(t, 64) } - hashes[len(hashes)/2] = common.Hash{} - tester.newPeer("attack", eth60, hashes, blocks) - - // Try and sync with the malicious node and check that it fails - if err := tester.sync("attack", nil); err != errPeersUnavailable { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errPeersUnavailable) - } - // Ensure that a valid chain can still pass sync - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) - } -} - -// Tests that if a malicious peer is returning hashes in a weird order, that the -// sync throttler doesn't choke on them waiting for the valid blocks. -func TestInvalidHashOrderAttack60(t *testing.T) { - tester := newTester() - - // Create a valid long chain, but reverse some hashes within - hashes, blocks := makeChain(4*blockCacheLimit, 0, genesis) - tester.newPeer("valid", eth60, hashes, blocks) - - chunk1 := make([]common.Hash, blockCacheLimit) - chunk2 := make([]common.Hash, blockCacheLimit) - copy(chunk1, hashes[blockCacheLimit:2*blockCacheLimit]) - copy(chunk2, hashes[2*blockCacheLimit:3*blockCacheLimit]) - - copy(hashes[2*blockCacheLimit:], chunk1) - copy(hashes[blockCacheLimit:], chunk2) - tester.newPeer("attack", eth60, hashes, blocks) - - // Try and sync with the malicious node and check that it fails - if err := tester.sync("attack", nil); err != errInvalidChain { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain) - } - // Ensure that a valid chain can still pass sync - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) - } -} +func testMissingHeaderAttack(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) -// Tests that if a malicious peer makes up a random hash chain and tries to push -// indefinitely, it actually gets caught with it. -func TestMadeupHashChainAttack60(t *testing.T) { tester := newTester() - blockSoftTTL = 100 * time.Millisecond - crossCheckCycle = 25 * time.Millisecond - - // Create a long chain of hashes without backing blocks - hashes, blocks := makeChain(4*blockCacheLimit, 0, genesis) - - randomHashes := make([]common.Hash, 1024*blockCacheLimit) - for i := range randomHashes { - rand.Read(randomHashes[i][:]) - } - tester.newPeer("valid", eth60, hashes, blocks) - tester.newPeer("attack", eth60, randomHashes, nil) + // Attempt a full sync with an attacker feeding gapped headers + tester.newPeer("attack", protocol, hashes, blocks) + missing := targetBlocks / 2 + delete(tester.peerBlocks["attack"], hashes[missing]) - // Try and sync with the malicious node and check that it fails - if err := tester.sync("attack", nil); err != errCrossCheckFailed { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errCrossCheckFailed) + if err := tester.sync("attack", nil); err == nil { + t.Fatalf("succeeded attacker synchronisation") } - // Ensure that a valid chain can still pass sync + // Synchronise with the valid peer and make sure sync succeeds + tester.newPeer("valid", protocol, hashes, blocks) if err := tester.sync("valid", nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } -} - -// Tests that if a malicious peer makes up a random hash chain, and tries to push -// indefinitely, one hash at a time, it actually gets caught with it. The reason -// this is separate from the classical made up chain attack is that sending hashes -// one by one prevents reliable block/parent verification. -func TestMadeupHashChainDrippingAttack60(t *testing.T) { - // Create a random chain of hashes to drip - randomHashes := make([]common.Hash, 16*blockCacheLimit) - for i := range randomHashes { - rand.Read(randomHashes[i][:]) - } - randomHashes[len(randomHashes)-1] = genesis.Hash() - tester := newTester() - - // Try and sync with the attacker, one hash at a time - tester.maxHashFetch = 1 - tester.newPeer("attack", eth60, randomHashes, nil) - if err := tester.sync("attack", nil); err != errStallingPeer { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errStallingPeer) + if imported := len(tester.ownBlocks); imported != len(hashes) { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, len(hashes)) } } -// Tests that if a malicious peer makes up a random block chain, and tried to -// push indefinitely, it actually gets caught with it. -func TestMadeupBlockChainAttack60(t *testing.T) { - defaultBlockTTL := blockSoftTTL - defaultCrossCheckCycle := crossCheckCycle +// Tests that if requested headers are shifted (i.e. first is missing), the queue +// detects the invalid numbering. +func TestShiftedHeaderAttack62(t *testing.T) { testShiftedHeaderAttack(t, 62) } +func TestShiftedHeaderAttack63(t *testing.T) { testShiftedHeaderAttack(t, 63) } +func TestShiftedHeaderAttack64(t *testing.T) { testShiftedHeaderAttack(t, 64) } - blockSoftTTL = 100 * time.Millisecond - crossCheckCycle = 25 * time.Millisecond +func testShiftedHeaderAttack(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) - // Create a long chain of blocks and simulate an invalid chain by dropping every second - hashes, blocks := makeChain(16*blockCacheLimit, 0, genesis) - gapped := make([]common.Hash, len(hashes)/2) - for i := 0; i < len(gapped); i++ { - gapped[i] = hashes[2*i] - } - // Try and sync with the malicious node and check that it fails tester := newTester() - tester.newPeer("attack", eth60, gapped, blocks) - if err := tester.sync("attack", nil); err != errCrossCheckFailed { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errCrossCheckFailed) - } - // Ensure that a valid chain can still pass sync - blockSoftTTL = defaultBlockTTL - crossCheckCycle = defaultCrossCheckCycle - tester.newPeer("valid", eth60, hashes, blocks) - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) - } -} + // Attempt a full sync with an attacker feeding shifted headers + tester.newPeer("attack", protocol, hashes, blocks) + delete(tester.peerBlocks["attack"], hashes[len(hashes)-2]) -// Tests that if one/multiple malicious peers try to feed a banned blockchain to -// the downloader, it will not keep refetching the same chain indefinitely, but -// gradually block pieces of it, until its head is also blocked. -func TestBannedChainStarvationAttack60(t *testing.T) { - n := 8 * blockCacheLimit - fork := n/2 - 23 - hashes, forkHashes, blocks, forkBlocks := makeChainFork(n, fork, genesis) - - // Create the tester and ban the selected hash. - tester := newTester() - tester.downloader.banned.Add(forkHashes[fork-1]) - tester.newPeer("valid", eth60, hashes, blocks) - tester.newPeer("attack", eth60, forkHashes, forkBlocks) - - // Iteratively try to sync, and verify that the banned hash list grows until - // the head of the invalid chain is blocked too. - for banned := tester.downloader.banned.Size(); ; { - // Try to sync with the attacker, check hash chain failure - if err := tester.sync("attack", nil); err != errInvalidChain { - if tester.downloader.banned.Has(forkHashes[0]) && err == errBannedHead { - break - } - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain) - } - // Check that the ban list grew with at least 1 new item, or all banned - bans := tester.downloader.banned.Size() - if bans < banned+1 { - t.Fatalf("ban count mismatch: have %v, want %v+", bans, banned+1) - } - banned = bans - } - // Check that after banning an entire chain, bad peers get dropped - if err := tester.newPeer("new attacker", eth60, forkHashes, forkBlocks); err != errBannedHead { - t.Fatalf("peer registration mismatch: have %v, want %v", err, errBannedHead) - } - if peer := tester.downloader.peers.Peer("new attacker"); peer != nil { - t.Fatalf("banned attacker registered: %v", peer) + if err := tester.sync("attack", nil); err == nil { + t.Fatalf("succeeded attacker synchronisation") } - // Ensure that a valid chain can still pass sync + // Synchronise with the valid peer and make sure sync succeeds + tester.newPeer("valid", protocol, hashes, blocks) if err := tester.sync("valid", nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } + if imported := len(tester.ownBlocks); imported != len(hashes) { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, len(hashes)) + } } -// Tests that if a peer sends excessively many/large invalid chains that are -// gradually banned, it will have an upper limit on the consumed memory and also -// the origin bad hashes will not be evacuated. -func TestBannedChainMemoryExhaustionAttack60(t *testing.T) { - // Construct a banned chain with more chunks than the ban limit - n := 8 * blockCacheLimit - fork := n/2 - 23 - hashes, forkHashes, blocks, forkBlocks := makeChainFork(n, fork, genesis) +// Tests that if a peer sends an invalid body for a requested block, it gets +// dropped immediately by the downloader. +func TestInvalidBlockBodyAttack62(t *testing.T) { testInvalidBlockBodyAttack(t, 62) } +func TestInvalidBlockBodyAttack63(t *testing.T) { testInvalidBlockBodyAttack(t, 63) } +func TestInvalidBlockBodyAttack64(t *testing.T) { testInvalidBlockBodyAttack(t, 64) } - // Create the tester and ban the root hash of the fork. - tester := newTester() - tester.downloader.banned.Add(forkHashes[fork-1]) - - // Reduce the test size a bit - defaultMaxBlockFetch := MaxBlockFetch - defaultMaxBannedHashes := maxBannedHashes - - MaxBlockFetch = 4 - maxBannedHashes = 256 - - tester.newPeer("valid", eth60, hashes, blocks) - tester.newPeer("attack", eth60, forkHashes, forkBlocks) - - // Iteratively try to sync, and verify that the banned hash list grows until - // the head of the invalid chain is blocked too. - for { - // Try to sync with the attacker, check hash chain failure - if err := tester.sync("attack", nil); err != errInvalidChain { - t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errInvalidChain) - } - // Short circuit if the entire chain was banned. - if tester.downloader.banned.Has(forkHashes[0]) { - break - } - // Otherwise ensure we never exceed the memory allowance and the hard coded bans are untouched - if bans := tester.downloader.banned.Size(); bans > maxBannedHashes { - t.Fatalf("ban cap exceeded: have %v, want max %v", bans, maxBannedHashes) - } - for hash := range core.BadHashes { - if !tester.downloader.banned.Has(hash) { - t.Fatalf("hard coded ban evacuated: %x", hash) - } - } - } - // Ensure that a valid chain can still pass sync - MaxBlockFetch = defaultMaxBlockFetch - maxBannedHashes = defaultMaxBannedHashes +func testInvalidBlockBodyAttack(t *testing.T, protocol int) { + // Create two peers, one feeding invalid block bodies + targetBlocks := 4*blockCacheLimit - 15 + hashes, validBlocks := makeChain(targetBlocks, 0, genesis) - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) + invalidBlocks := make(map[common.Hash]*types.Block) + for hash, block := range validBlocks { + invalidBlocks[hash] = types.NewBlockWithHeader(block.Header()) } -} - -// Tests a corner case (potential attack) where a peer delivers both good as well -// as unrequested blocks to a hash request. This may trigger a different code -// path than the fully correct or fully invalid delivery, potentially causing -// internal state problems -// -// No, don't delete this test, it actually did happen! -func TestOverlappingDeliveryAttack60(t *testing.T) { - // Create an arbitrary batch of blocks ( < cache-size not to block) - targetBlocks := blockCacheLimit - 23 - hashes, blocks := makeChain(targetBlocks, 0, genesis) - // Register an attacker that always returns non-requested blocks too tester := newTester() - tester.newPeer("attack", eth60, hashes, blocks) + tester.newPeer("valid", protocol, hashes, validBlocks) + tester.newPeer("attack", protocol, hashes, invalidBlocks) - rawGetBlocks := tester.downloader.peers.Peer("attack").getBlocks - tester.downloader.peers.Peer("attack").getBlocks = func(request []common.Hash) error { - // Add a non requested hash the screw the delivery (genesis should be fine) - return rawGetBlocks(append(request, hashes[0])) - } - // Test that synchronisation can complete, check for import success - if err := tester.sync("attack", nil); err != nil { + // Synchronise with the valid peer (will pull contents from the attacker too) + if err := tester.sync("valid", nil); err != nil { t.Fatalf("failed to synchronise blocks: %v", err) } - start := time.Now() - for len(tester.ownHashes) != len(hashes) && time.Since(start) < time.Second { - time.Sleep(50 * time.Millisecond) + if imported := len(tester.ownBlocks); imported != len(hashes) { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, len(hashes)) } - if len(tester.ownHashes) != len(hashes) { - t.Fatalf("chain length mismatch: have %v, want %v", len(tester.ownHashes), len(hashes)) + // Make sure the attacker was detected and dropped in the mean time + if _, ok := tester.peerHashes["attack"]; ok { + t.Fatalf("block body attacker not detected/dropped") } } // Tests that a peer advertising an high TD doesn't get to stall the downloader // afterwards by not sending any useful hashes. -func TestHighTDStarvationAttack61(t *testing.T) { +func TestHighTDStarvationAttack61(t *testing.T) { testHighTDStarvationAttack(t, 61) } +func TestHighTDStarvationAttack62(t *testing.T) { testHighTDStarvationAttack(t, 62) } +func TestHighTDStarvationAttack63(t *testing.T) { testHighTDStarvationAttack(t, 63) } +func TestHighTDStarvationAttack64(t *testing.T) { testHighTDStarvationAttack(t, 64) } + +func testHighTDStarvationAttack(t *testing.T, protocol int) { tester := newTester() - tester.newPeer("attack", eth61, []common.Hash{genesis.Hash()}, nil) + hashes, blocks := makeChain(0, 0, genesis) + + tester.newPeer("attack", protocol, []common.Hash{hashes[0]}, blocks) if err := tester.sync("attack", big.NewInt(1000000)); err != errStallingPeer { t.Fatalf("synchronisation error mismatch: have %v, want %v", err, errStallingPeer) } } // Tests that misbehaving peers are disconnected, whilst behaving ones are not. -func TestHashAttackerDropping(t *testing.T) { +func TestBlockHeaderAttackerDropping61(t *testing.T) { testBlockHeaderAttackerDropping(t, 61) } +func TestBlockHeaderAttackerDropping62(t *testing.T) { testBlockHeaderAttackerDropping(t, 62) } +func TestBlockHeaderAttackerDropping63(t *testing.T) { testBlockHeaderAttackerDropping(t, 63) } +func TestBlockHeaderAttackerDropping64(t *testing.T) { testBlockHeaderAttackerDropping(t, 64) } + +func testBlockHeaderAttackerDropping(t *testing.T, protocol int) { // Define the disconnection requirement for individual hash fetch errors tests := []struct { result error drop bool }{ - {nil, false}, // Sync succeeded, all is well - {errBusy, false}, // Sync is already in progress, no problem - {errUnknownPeer, false}, // Peer is unknown, was already dropped, don't double drop - {errBadPeer, true}, // Peer was deemed bad for some reason, drop it - {errStallingPeer, true}, // Peer was detected to be stalling, drop it - {errBannedHead, true}, // Peer's head hash is a known bad hash, drop it - {errNoPeers, false}, // No peers to download from, soft race, no issue - {errPendingQueue, false}, // There are blocks still cached, wait to exhaust, no issue - {errTimeout, true}, // No hashes received in due time, drop the peer - {errEmptyHashSet, true}, // No hashes were returned as a response, drop as it's a dead end - {errPeersUnavailable, true}, // Nobody had the advertised blocks, drop the advertiser - {errInvalidChain, true}, // Hash chain was detected as invalid, definitely drop - {errCrossCheckFailed, true}, // Hash-origin failed to pass a block cross check, drop - {errCancelHashFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelBlockFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop + {nil, false}, // Sync succeeded, all is well + {errBusy, false}, // Sync is already in progress, no problem + {errUnknownPeer, false}, // Peer is unknown, was already dropped, don't double drop + {errBadPeer, true}, // Peer was deemed bad for some reason, drop it + {errStallingPeer, true}, // Peer was detected to be stalling, drop it + {errNoPeers, false}, // No peers to download from, soft race, no issue + {errPendingQueue, false}, // There are blocks still cached, wait to exhaust, no issue + {errTimeout, true}, // No hashes received in due time, drop the peer + {errEmptyHashSet, true}, // No hashes were returned as a response, drop as it's a dead end + {errEmptyHeaderSet, true}, // No headers were returned as a response, drop as it's a dead end + {errPeersUnavailable, true}, // Nobody had the advertised blocks, drop the advertiser + {errInvalidChain, true}, // Hash chain was detected as invalid, definitely drop + {errInvalidBody, false}, // A bad peer was detected, but not the sync origin + {errCancelHashFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop + {errCancelBlockFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop + {errCancelHeaderFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop + {errCancelBodyFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop } // Run the tests and check disconnection status tester := newTester() for i, tt := range tests { // Register a new peer and ensure it's presence id := fmt.Sprintf("test %d", i) - if err := tester.newPeer(id, eth60, []common.Hash{genesis.Hash()}, nil); err != nil { + if err := tester.newPeer(id, protocol, []common.Hash{genesis.Hash()}, nil); err != nil { t.Fatalf("test %d: failed to register new peer: %v", i, err) } if _, ok := tester.peerHashes[id]; !ok { @@ -867,7 +862,12 @@ func TestHashAttackerDropping(t *testing.T) { } // Tests that feeding bad blocks will result in a peer drop. -func TestBlockAttackerDropping(t *testing.T) { +func TestBlockBodyAttackerDropping61(t *testing.T) { testBlockBodyAttackerDropping(t, 61) } +func TestBlockBodyAttackerDropping62(t *testing.T) { testBlockBodyAttackerDropping(t, 62) } +func TestBlockBodyAttackerDropping63(t *testing.T) { testBlockBodyAttackerDropping(t, 63) } +func TestBlockBodyAttackerDropping64(t *testing.T) { testBlockBodyAttackerDropping(t, 64) } + +func testBlockBodyAttackerDropping(t *testing.T, protocol int) { // Define the disconnection requirement for individual block import errors tests := []struct { failure bool @@ -882,7 +882,7 @@ func TestBlockAttackerDropping(t *testing.T) { for i, tt := range tests { // Register a new peer and ensure it's presence id := fmt.Sprintf("test %d", i) - if err := tester.newPeer(id, eth60, []common.Hash{common.Hash{}}, nil); err != nil { + if err := tester.newPeer(id, protocol, []common.Hash{common.Hash{}}, nil); err != nil { t.Fatalf("test %d: failed to register new peer: %v", i, err) } if _, ok := tester.peerHashes[id]; !ok { @@ -904,3 +904,259 @@ func TestBlockAttackerDropping(t *testing.T) { } } } + +// Tests that synchronisation boundaries (origin block number and highest block +// number) is tracked and updated correctly. +func TestSyncBoundaries61(t *testing.T) { testSyncBoundaries(t, 61) } +func TestSyncBoundaries62(t *testing.T) { testSyncBoundaries(t, 62) } +func TestSyncBoundaries63(t *testing.T) { testSyncBoundaries(t, 63) } +func TestSyncBoundaries64(t *testing.T) { testSyncBoundaries(t, 64) } + +func testSyncBoundaries(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + // Set a sync init hook to catch boundary changes + starting := make(chan struct{}) + progress := make(chan struct{}) + + tester := newTester() + tester.downloader.syncInitHook = func(origin, latest uint64) { + starting <- struct{}{} + <-progress + } + // Retrieve the sync boundaries and ensure they are zero (pristine sync) + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != 0 { + t.Fatalf("Pristine boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, 0) + } + // Synchronise half the blocks and check initial boundaries + tester.newPeer("peer-half", protocol, hashes[targetBlocks/2:], blocks) + pending := new(sync.WaitGroup) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("peer-half", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(targetBlocks/2+1) { + t.Fatalf("Initial boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, targetBlocks/2+1) + } + progress <- struct{}{} + pending.Wait() + + // Synchronise all the blocks and check continuation boundaries + tester.newPeer("peer-full", protocol, hashes, blocks) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("peer-full", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != uint64(targetBlocks/2+1) || latest != uint64(targetBlocks) { + t.Fatalf("Completing boundary mismatch: have %v/%v, want %v/%v", origin, latest, targetBlocks/2+1, targetBlocks) + } + progress <- struct{}{} + pending.Wait() +} + +// Tests that synchronisation boundaries (origin block number and highest block +// number) is tracked and updated correctly in case of a fork (or manual head +// revertal). +func TestForkedSyncBoundaries61(t *testing.T) { testForkedSyncBoundaries(t, 61) } +func TestForkedSyncBoundaries62(t *testing.T) { testForkedSyncBoundaries(t, 62) } +func TestForkedSyncBoundaries63(t *testing.T) { testForkedSyncBoundaries(t, 63) } +func TestForkedSyncBoundaries64(t *testing.T) { testForkedSyncBoundaries(t, 64) } + +func testForkedSyncBoundaries(t *testing.T, protocol int) { + // Create a forked chain to simulate origin revertal + common, fork := MaxHashFetch, 2*MaxHashFetch + hashesA, hashesB, blocksA, blocksB := makeChainFork(common+fork, fork, genesis) + + // Set a sync init hook to catch boundary changes + starting := make(chan struct{}) + progress := make(chan struct{}) + + tester := newTester() + tester.downloader.syncInitHook = func(origin, latest uint64) { + starting <- struct{}{} + <-progress + } + // Retrieve the sync boundaries and ensure they are zero (pristine sync) + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != 0 { + t.Fatalf("Pristine boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, 0) + } + // Synchronise with one of the forks and check boundaries + tester.newPeer("fork A", protocol, hashesA, blocksA) + pending := new(sync.WaitGroup) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("fork A", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(len(hashesA)-1) { + t.Fatalf("Initial boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, len(hashesA)-1) + } + progress <- struct{}{} + pending.Wait() + + // Simulate a successful sync above the fork + tester.downloader.syncStatsOrigin = tester.downloader.syncStatsHeight + + // Synchronise with the second fork and check boundary resets + tester.newPeer("fork B", protocol, hashesB, blocksB) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("fork B", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != uint64(common) || latest != uint64(len(hashesB)-1) { + t.Fatalf("Forking boundary mismatch: have %v/%v, want %v/%v", origin, latest, common, len(hashesB)-1) + } + progress <- struct{}{} + pending.Wait() +} + +// Tests that if synchronisation is aborted due to some failure, then the boundary +// origin is not updated in the next sync cycle, as it should be considered the +// continuation of the previous sync and not a new instance. +func TestFailedSyncBoundaries61(t *testing.T) { testFailedSyncBoundaries(t, 61) } +func TestFailedSyncBoundaries62(t *testing.T) { testFailedSyncBoundaries(t, 62) } +func TestFailedSyncBoundaries63(t *testing.T) { testFailedSyncBoundaries(t, 63) } +func TestFailedSyncBoundaries64(t *testing.T) { testFailedSyncBoundaries(t, 64) } + +func testFailedSyncBoundaries(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + // Set a sync init hook to catch boundary changes + starting := make(chan struct{}) + progress := make(chan struct{}) + + tester := newTester() + tester.downloader.syncInitHook = func(origin, latest uint64) { + starting <- struct{}{} + <-progress + } + // Retrieve the sync boundaries and ensure they are zero (pristine sync) + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != 0 { + t.Fatalf("Pristine boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, 0) + } + // Attempt a full sync with a faulty peer + tester.newPeer("faulty", protocol, hashes, blocks) + missing := targetBlocks / 2 + delete(tester.peerBlocks["faulty"], hashes[missing]) + + pending := new(sync.WaitGroup) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("faulty", nil); err == nil { + t.Fatalf("succeeded faulty synchronisation") + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(targetBlocks) { + t.Fatalf("Initial boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, targetBlocks) + } + progress <- struct{}{} + pending.Wait() + + // Synchronise with a good peer and check that the boundary origin remind the same after a failure + tester.newPeer("valid", protocol, hashes, blocks) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("valid", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(targetBlocks) { + t.Fatalf("Completing boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, targetBlocks) + } + progress <- struct{}{} + pending.Wait() +} + +// Tests that if an attacker fakes a chain height, after the attack is detected, +// the boundary height is successfully reduced at the next sync invocation. +func TestFakedSyncBoundaries61(t *testing.T) { testFakedSyncBoundaries(t, 61) } +func TestFakedSyncBoundaries62(t *testing.T) { testFakedSyncBoundaries(t, 62) } +func TestFakedSyncBoundaries63(t *testing.T) { testFakedSyncBoundaries(t, 63) } +func TestFakedSyncBoundaries64(t *testing.T) { testFakedSyncBoundaries(t, 64) } + +func testFakedSyncBoundaries(t *testing.T, protocol int) { + // Create a small block chain + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks+3, 0, genesis) + + // Set a sync init hook to catch boundary changes + starting := make(chan struct{}) + progress := make(chan struct{}) + + tester := newTester() + tester.downloader.syncInitHook = func(origin, latest uint64) { + starting <- struct{}{} + <-progress + } + // Retrieve the sync boundaries and ensure they are zero (pristine sync) + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != 0 { + t.Fatalf("Pristine boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, 0) + } + // Create and sync with an attacker that promises a higher chain than available + tester.newPeer("attack", protocol, hashes, blocks) + for i := 1; i < 3; i++ { + delete(tester.peerBlocks["attack"], hashes[i]) + } + + pending := new(sync.WaitGroup) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("attack", nil); err == nil { + t.Fatalf("succeeded attacker synchronisation") + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(targetBlocks+3) { + t.Fatalf("Initial boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, targetBlocks+3) + } + progress <- struct{}{} + pending.Wait() + + // Synchronise with a good peer and check that the boundary height has been reduced to the true value + tester.newPeer("valid", protocol, hashes[3:], blocks) + pending.Add(1) + + go func() { + defer pending.Done() + if err := tester.sync("valid", nil); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } + }() + <-starting + if origin, latest := tester.downloader.Boundaries(); origin != 0 || latest != uint64(targetBlocks) { + t.Fatalf("Initial boundary mismatch: have %v/%v, want %v/%v", origin, latest, 0, targetBlocks) + } + progress <- struct{}{} + pending.Wait() +} diff --git a/exp/downloader/metrics.go b/exp/downloader/metrics.go new file mode 100644 index 000000000000..731fc721bd54 --- /dev/null +++ b/exp/downloader/metrics.go @@ -0,0 +1,45 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// Contains the metrics collected by the downloader. + +package downloader + +import ( + "github.com/expanse-project/go-expanse/metrics" +) + +var ( + hashInMeter = metrics.NewMeter("eth/downloader/hashes/in") + hashReqTimer = metrics.NewTimer("eth/downloader/hashes/req") + hashDropMeter = metrics.NewMeter("eth/downloader/hashes/drop") + hashTimeoutMeter = metrics.NewMeter("eth/downloader/hashes/timeout") + + blockInMeter = metrics.NewMeter("eth/downloader/blocks/in") + blockReqTimer = metrics.NewTimer("eth/downloader/blocks/req") + blockDropMeter = metrics.NewMeter("eth/downloader/blocks/drop") + blockTimeoutMeter = metrics.NewMeter("eth/downloader/blocks/timeout") + + headerInMeter = metrics.NewMeter("eth/downloader/headers/in") + headerReqTimer = metrics.NewTimer("eth/downloader/headers/req") + headerDropMeter = metrics.NewMeter("eth/downloader/headers/drop") + headerTimeoutMeter = metrics.NewMeter("eth/downloader/headers/timeout") + + bodyInMeter = metrics.NewMeter("eth/downloader/bodies/in") + bodyReqTimer = metrics.NewTimer("eth/downloader/bodies/req") + bodyDropMeter = metrics.NewMeter("eth/downloader/bodies/drop") + bodyTimeoutMeter = metrics.NewMeter("eth/downloader/bodies/timeout") +) diff --git a/exp/downloader/peer.go b/exp/downloader/peer.go index 0d23233efe0e..5514de40906e 100644 --- a/exp/downloader/peer.go +++ b/exp/downloader/peer.go @@ -31,10 +31,16 @@ import ( "gopkg.in/fatih/set.v0" ) +// Hash and block fetchers belonging to eth/61 and below type relativeHashFetcherFn func(common.Hash) error type absoluteHashFetcherFn func(uint64, int) error type blockFetcherFn func([]common.Hash) error +// Block header and body fethers belonging to eth/62 and above +type relativeHeaderFetcherFn func(common.Hash, int, int, bool) error +type absoluteHeaderFetcherFn func(uint64, int, int, bool) error +type blockBodyFetcherFn func([]common.Hash) error + var ( errAlreadyFetching = errors.New("already fetching blocks from peer") errAlreadyRegistered = errors.New("peer is already registered") @@ -54,25 +60,37 @@ type peer struct { ignored *set.Set // Set of hashes not to request (didn't have previously) - getRelHashes relativeHashFetcherFn // Method to retrieve a batch of hashes from an origin hash - getAbsHashes absoluteHashFetcherFn // Method to retrieve a batch of hashes from an absolute position - getBlocks blockFetcherFn // Method to retrieve a batch of blocks + getRelHashes relativeHashFetcherFn // [eth/61] Method to retrieve a batch of hashes from an origin hash + getAbsHashes absoluteHashFetcherFn // [eth/61] Method to retrieve a batch of hashes from an absolute position + getBlocks blockFetcherFn // [eth/61] Method to retrieve a batch of blocks + + getRelHeaders relativeHeaderFetcherFn // [eth/62] Method to retrieve a batch of headers from an origin hash + getAbsHeaders absoluteHeaderFetcherFn // [eth/62] Method to retrieve a batch of headers from an absolute position + getBlockBodies blockBodyFetcherFn // [eth/62] Method to retrieve a batch of block bodies version int // Exp protocol version number to switch strategies } // newPeer create a new downloader peer, with specific hash and block retrieval // mechanisms. -func newPeer(id string, version int, head common.Hash, getRelHashes relativeHashFetcherFn, getAbsHashes absoluteHashFetcherFn, getBlocks blockFetcherFn) *peer { +func newPeer(id string, version int, head common.Hash, + getRelHashes relativeHashFetcherFn, getAbsHashes absoluteHashFetcherFn, getBlocks blockFetcherFn, // eth/61 callbacks, remove when upgrading + getRelHeaders relativeHeaderFetcherFn, getAbsHeaders absoluteHeaderFetcherFn, getBlockBodies blockBodyFetcherFn) *peer { return &peer{ - id: id, - head: head, - capacity: 1, + id: id, + head: head, + capacity: 1, + ignored: set.New(), + getRelHashes: getRelHashes, getAbsHashes: getAbsHashes, getBlocks: getBlocks, - ignored: set.New(), - version: version, + + getRelHeaders: getRelHeaders, + getAbsHeaders: getAbsHeaders, + getBlockBodies: getBlockBodies, + + version: version, } } @@ -83,8 +101,8 @@ func (p *peer) Reset() { p.ignored.Clear() } -// Fetch sends a block retrieval request to the remote peer. -func (p *peer) Fetch(request *fetchRequest) error { +// Fetch61 sends a block retrieval request to the remote peer. +func (p *peer) Fetch61(request *fetchRequest) error { // Short circuit if the peer is already fetching if !atomic.CompareAndSwapInt32(&p.idle, 0, 1) { return errAlreadyFetching @@ -101,10 +119,28 @@ func (p *peer) Fetch(request *fetchRequest) error { return nil } -// SetIdle sets the peer to idle, allowing it to execute new retrieval requests. +// Fetch sends a block body retrieval request to the remote peer. +func (p *peer) Fetch(request *fetchRequest) error { + // Short circuit if the peer is already fetching + if !atomic.CompareAndSwapInt32(&p.idle, 0, 1) { + return errAlreadyFetching + } + p.started = time.Now() + + // Convert the header set to a retrievable slice + hashes := make([]common.Hash, 0, len(request.Headers)) + for _, header := range request.Headers { + hashes = append(hashes, header.Hash()) + } + go p.getBlockBodies(hashes) + + return nil +} + +// SetIdle61 sets the peer to idle, allowing it to execute new retrieval requests. // Its block retrieval allowance will also be updated either up- or downwards, // depending on whether the previous fetch completed in time or not. -func (p *peer) SetIdle() { +func (p *peer) SetIdle61() { // Update the peer's download allowance based on previous performance scale := 2.0 if time.Since(p.started) > blockSoftTTL { @@ -131,6 +167,36 @@ func (p *peer) SetIdle() { atomic.StoreInt32(&p.idle, 0) } +// SetIdle sets the peer to idle, allowing it to execute new retrieval requests. +// Its block body retrieval allowance will also be updated either up- or downwards, +// depending on whether the previous fetch completed in time or not. +func (p *peer) SetIdle() { + // Update the peer's download allowance based on previous performance + scale := 2.0 + if time.Since(p.started) > bodySoftTTL { + scale = 0.5 + if time.Since(p.started) > bodyHardTTL { + scale = 1 / float64(MaxBodyFetch) // reduces capacity to 1 + } + } + for { + // Calculate the new download bandwidth allowance + prev := atomic.LoadInt32(&p.capacity) + next := int32(math.Max(1, math.Min(float64(MaxBodyFetch), float64(prev)*scale))) + + // Try to update the old value + if atomic.CompareAndSwapInt32(&p.capacity, prev, next) { + // If we're having problems at 1 capacity, try to find better peers + if next == 1 { + p.Demote() + } + break + } + } + // Set the peer to idle to allow further block requests + atomic.StoreInt32(&p.idle, 0) +} + // Capacity retrieves the peers block download allowance based on its previously // discovered bandwidth capacity. func (p *peer) Capacity() int { @@ -246,14 +312,16 @@ func (ps *peerSet) AllPeers() []*peer { // IdlePeers retrieves a flat list of all the currently idle peers within the // active peer set, ordered by their reputation. -func (ps *peerSet) IdlePeers() []*peer { +func (ps *peerSet) IdlePeers(version int) []*peer { ps.lock.RLock() defer ps.lock.RUnlock() list := make([]*peer, 0, len(ps.peers)) for _, p := range ps.peers { - if atomic.LoadInt32(&p.idle) == 0 { - list = append(list, p) + if (version == eth61 && p.version == eth61) || (version >= eth62 && p.version >= eth62) { + if atomic.LoadInt32(&p.idle) == 0 { + list = append(list, p) + } } } for i := 0; i < len(list); i++ { diff --git a/exp/downloader/queue.go b/exp/downloader/queue.go index e35df3eb31e4..d04d11fae89e 100644 --- a/exp/downloader/queue.go +++ b/exp/downloader/queue.go @@ -43,16 +43,21 @@ var ( // fetchRequest is a currently running block retrieval operation. type fetchRequest struct { - Peer *peer // Peer to which the request was sent - Hashes map[common.Hash]int // Requested hashes with their insertion index (priority) - Time time.Time // Time when the request was made + Peer *peer // Peer to which the request was sent + Hashes map[common.Hash]int // [eth/61] Requested hashes with their insertion index (priority) + Headers []*types.Header // [eth/62] Requested headers, sorted by request order + Time time.Time // Time when the request was made } // queue represents hashes that are either need fetching or are being fetched type queue struct { - hashPool map[common.Hash]int // Pending hashes, mapping to their insertion index (priority) - hashQueue *prque.Prque // Priority queue of the block hashes to fetch - hashCounter int // Counter indexing the added hashes to ensure retrieval order + hashPool map[common.Hash]int // [eth/61] Pending hashes, mapping to their insertion index (priority) + hashQueue *prque.Prque // [eth/61] Priority queue of the block hashes to fetch + hashCounter int // [eth/61] Counter indexing the added hashes to ensure retrieval order + + headerPool map[common.Hash]*types.Header // [eth/62] Pending headers, mapping from their hashes + headerQueue *prque.Prque // [eth/62] Priority queue of the headers to fetch the bodies for + headerHead common.Hash // [eth/62] Hash of the last queued header to verify order pendPool map[string]*fetchRequest // Currently pending block retrieval operations @@ -66,11 +71,13 @@ type queue struct { // newQueue creates a new download queue for scheduling block retrieval. func newQueue() *queue { return &queue{ - hashPool: make(map[common.Hash]int), - hashQueue: prque.New(), - pendPool: make(map[string]*fetchRequest), - blockPool: make(map[common.Hash]uint64), - blockCache: make([]*Block, blockCacheLimit), + hashPool: make(map[common.Hash]int), + hashQueue: prque.New(), + headerPool: make(map[common.Hash]*types.Header), + headerQueue: prque.New(), + pendPool: make(map[string]*fetchRequest), + blockPool: make(map[common.Hash]uint64), + blockCache: make([]*Block, blockCacheLimit), } } @@ -83,6 +90,10 @@ func (q *queue) Reset() { q.hashQueue.Reset() q.hashCounter = 0 + q.headerPool = make(map[common.Hash]*types.Header) + q.headerQueue.Reset() + q.headerHead = common.Hash{} + q.pendPool = make(map[string]*fetchRequest) q.blockPool = make(map[common.Hash]uint64) @@ -90,21 +101,21 @@ func (q *queue) Reset() { q.blockCache = make([]*Block, blockCacheLimit) } -// Size retrieves the number of hashes in the queue, returning separately for +// Size retrieves the number of blocks in the queue, returning separately for // pending and already downloaded. func (q *queue) Size() (int, int) { q.lock.RLock() defer q.lock.RUnlock() - return len(q.hashPool), len(q.blockPool) + return len(q.hashPool) + len(q.headerPool), len(q.blockPool) } -// Pending retrieves the number of hashes pending for retrieval. +// Pending retrieves the number of blocks pending for retrieval. func (q *queue) Pending() int { q.lock.RLock() defer q.lock.RUnlock() - return q.hashQueue.Size() + return q.hashQueue.Size() + q.headerQueue.Size() } // InFlight retrieves the number of fetch requests currently in flight. @@ -124,7 +135,7 @@ func (q *queue) Throttle() bool { // Calculate the currently in-flight block requests pending := 0 for _, request := range q.pendPool { - pending += len(request.Hashes) + pending += len(request.Hashes) + len(request.Headers) } // Throttle if more blocks are in-flight than free space in the cache return pending >= len(q.blockCache)-len(q.blockPool) @@ -138,15 +149,18 @@ func (q *queue) Has(hash common.Hash) bool { if _, ok := q.hashPool[hash]; ok { return true } + if _, ok := q.headerPool[hash]; ok { + return true + } if _, ok := q.blockPool[hash]; ok { return true } return false } -// Insert adds a set of hashes for the download queue for scheduling, returning +// Insert61 adds a set of hashes for the download queue for scheduling, returning // the new hashes encountered. -func (q *queue) Insert(hashes []common.Hash, fifo bool) []common.Hash { +func (q *queue) Insert61(hashes []common.Hash, fifo bool) []common.Hash { q.lock.Lock() defer q.lock.Unlock() @@ -172,6 +186,40 @@ func (q *queue) Insert(hashes []common.Hash, fifo bool) []common.Hash { return inserts } +// Insert adds a set of headers for the download queue for scheduling, returning +// the new headers encountered. +func (q *queue) Insert(headers []*types.Header, from uint64) []*types.Header { + q.lock.Lock() + defer q.lock.Unlock() + + // Insert all the headers prioritized by the contained block number + inserts := make([]*types.Header, 0, len(headers)) + for _, header := range headers { + // Make sure no duplicate requests are executed + hash := header.Hash() + if _, ok := q.headerPool[hash]; ok { + glog.V(logger.Warn).Infof("Header #%d [%x] already scheduled", header.Number.Uint64(), hash[:4]) + continue + } + // Make sure chain order is honored and preserved throughout + if header.Number == nil || header.Number.Uint64() != from { + glog.V(logger.Warn).Infof("Header #%v [%x] broke chain ordering, expected %d", header.Number, hash[:4], from) + break + } + if q.headerHead != (common.Hash{}) && q.headerHead != header.ParentHash { + glog.V(logger.Warn).Infof("Header #%v [%x] broke chain ancestry", header.Number, hash[:4]) + break + } + // Queue the header for body retrieval + inserts = append(inserts, header) + q.headerPool[hash] = header + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + q.headerHead = hash + from++ + } + return inserts +} + // GetHeadBlock retrieves the first block from the cache, or nil if it hasn't // been downloaded yet (or simply non existent). func (q *queue) GetHeadBlock() *Block { @@ -227,9 +275,9 @@ func (q *queue) TakeBlocks() []*Block { return blocks } -// Reserve reserves a set of hashes for the given peer, skipping any previously +// Reserve61 reserves a set of hashes for the given peer, skipping any previously // failed download. -func (q *queue) Reserve(p *peer, count int) *fetchRequest { +func (q *queue) Reserve61(p *peer, count int) *fetchRequest { q.lock.Lock() defer q.lock.Unlock() @@ -276,6 +324,68 @@ func (q *queue) Reserve(p *peer, count int) *fetchRequest { return request } +// Reserve reserves a set of headers for the given peer, skipping any previously +// failed download. Beside the next batch of needed fetches, it also returns a +// flag whether empty blocks were queued requiring processing. +func (q *queue) Reserve(p *peer, count int) (*fetchRequest, bool, error) { + q.lock.Lock() + defer q.lock.Unlock() + + // Short circuit if the pool has been depleted, or if the peer's already + // downloading something (sanity check not to corrupt state) + if q.headerQueue.Empty() { + return nil, false, nil + } + if _, ok := q.pendPool[p.id]; ok { + return nil, false, nil + } + // Calculate an upper limit on the bodies we might fetch (i.e. throttling) + space := len(q.blockCache) - len(q.blockPool) + for _, request := range q.pendPool { + space -= len(request.Headers) + } + // Retrieve a batch of headers, skipping previously failed ones + send := make([]*types.Header, 0, count) + skip := make([]*types.Header, 0) + + process := false + for proc := 0; proc < space && len(send) < count && !q.headerQueue.Empty(); proc++ { + header := q.headerQueue.PopItem().(*types.Header) + + // If the header defines an empty block, deliver straight + if header.TxHash == types.DeriveSha(types.Transactions{}) && header.UncleHash == types.CalcUncleHash([]*types.Header{}) { + if err := q.enqueue("", types.NewBlockWithHeader(header)); err != nil { + return nil, false, errInvalidChain + } + delete(q.headerPool, header.Hash()) + process, space, proc = true, space-1, proc-1 + continue + } + // If it's a content block, add to the body fetch request + if p.ignored.Has(header.Hash()) { + skip = append(skip, header) + } else { + send = append(send, header) + } + } + // Merge all the skipped headers back + for _, header := range skip { + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + } + // Assemble and return the block download request + if len(send) == 0 { + return nil, process, nil + } + request := &fetchRequest{ + Peer: p, + Headers: send, + Time: time.Now(), + } + q.pendPool[p.id] = request + + return request, process, nil +} + // Cancel aborts a fetch request, returning all pending hashes to the queue. func (q *queue) Cancel(request *fetchRequest) { q.lock.Lock() @@ -284,6 +394,9 @@ func (q *queue) Cancel(request *fetchRequest) { for hash, index := range request.Hashes { q.hashQueue.Push(hash, float32(index)) } + for _, header := range request.Headers { + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + } delete(q.pendPool, request.Peer.id) } @@ -297,9 +410,19 @@ func (q *queue) Expire(timeout time.Duration) []string { peers := []string{} for id, request := range q.pendPool { if time.Since(request.Time) > timeout { + // Update the metrics with the timeout + if len(request.Hashes) > 0 { + blockTimeoutMeter.Mark(1) + } else { + bodyTimeoutMeter.Mark(1) + } + // Return any non satisfied requests to the pool for hash, index := range request.Hashes { q.hashQueue.Push(hash, float32(index)) } + for _, header := range request.Headers { + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + } peers = append(peers, id) } } @@ -310,8 +433,8 @@ func (q *queue) Expire(timeout time.Duration) []string { return peers } -// Deliver injects a block retrieval response into the download queue. -func (q *queue) Deliver(id string, blocks []*types.Block) (err error) { +// Deliver61 injects a block retrieval response into the download queue. +func (q *queue) Deliver61(id string, blocks []*types.Block) (err error) { q.lock.Lock() defer q.lock.Unlock() @@ -320,6 +443,7 @@ func (q *queue) Deliver(id string, blocks []*types.Block) (err error) { if request == nil { return errNoFetchesPending } + blockReqTimer.UpdateSince(request.Time) delete(q.pendPool, id) // If no blocks were retrieved, mark them as unavailable for the origin peer @@ -337,19 +461,12 @@ func (q *queue) Deliver(id string, blocks []*types.Block) (err error) { errs = append(errs, fmt.Errorf("non-requested block %x", hash)) continue } - // If a requested block falls out of the range, the hash chain is invalid - index := int(int64(block.NumberU64()) - int64(q.blockOffset)) - if index >= len(q.blockCache) || index < 0 { - return errInvalidChain - } - // Otherwise merge the block and mark the hash block - q.blockCache[index] = &Block{ - RawBlock: block, - OriginPeer: id, + // Queue the block up for processing + if err := q.enqueue(id, block); err != nil { + return err } delete(request.Hashes, hash) delete(q.hashPool, hash) - q.blockPool[hash] = block.NumberU64() } // Return all failed or missing fetches to the queue for hash, index := range request.Hashes { @@ -365,6 +482,89 @@ func (q *queue) Deliver(id string, blocks []*types.Block) (err error) { return nil } +// Deliver injects a block body retrieval response into the download queue. +func (q *queue) Deliver(id string, txLists [][]*types.Transaction, uncleLists [][]*types.Header) error { + q.lock.Lock() + defer q.lock.Unlock() + + // Short circuit if the block bodies were never requested + request := q.pendPool[id] + if request == nil { + return errNoFetchesPending + } + bodyReqTimer.UpdateSince(request.Time) + delete(q.pendPool, id) + + // If no block bodies were retrieved, mark them as unavailable for the origin peer + if len(txLists) == 0 || len(uncleLists) == 0 { + for hash, _ := range request.Headers { + request.Peer.ignored.Add(hash) + } + } + // Assemble each of the block bodies with their headers and queue for processing + errs := make([]error, 0) + for i, header := range request.Headers { + // Short circuit block assembly if no more bodies are found + if i >= len(txLists) || i >= len(uncleLists) { + break + } + // Reconstruct the next block if contents match up + if types.DeriveSha(types.Transactions(txLists[i])) != header.TxHash || types.CalcUncleHash(uncleLists[i]) != header.UncleHash { + errs = []error{errInvalidBody} + break + } + block := types.NewBlockWithHeader(header).WithBody(txLists[i], uncleLists[i]) + + // Queue the block up for processing + if err := q.enqueue(id, block); err != nil { + errs = []error{err} + break + } + request.Headers[i] = nil + delete(q.headerPool, header.Hash()) + } + // Return all failed or missing fetches to the queue + for _, header := range request.Headers { + if header != nil { + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + } + } + // If none of the blocks were good, it's a stale delivery + switch { + case len(errs) == 0: + return nil + + case len(errs) == 1 && errs[0] == errInvalidBody: + return errInvalidBody + + case len(errs) == 1 && errs[0] == errInvalidChain: + return errInvalidChain + + case len(errs) == len(request.Headers): + return errStaleDelivery + + default: + return fmt.Errorf("multiple failures: %v", errs) + } +} + +// enqueue inserts a new block into the final delivery queue, waiting for pickup +// by the processor. +func (q *queue) enqueue(origin string, block *types.Block) error { + // If a requested block falls out of the range, the hash chain is invalid + index := int(int64(block.NumberU64()) - int64(q.blockOffset)) + if index >= len(q.blockCache) || index < 0 { + return errInvalidChain + } + // Otherwise merge the block and mark the hash done + q.blockCache[index] = &Block{ + RawBlock: block, + OriginPeer: origin, + } + q.blockPool[block.Header().Hash()] = block.NumberU64() + return nil +} + // Prepare configures the block cache offset to allow accepting inbound blocks. func (q *queue) Prepare(offset uint64) { q.lock.Lock() diff --git a/exp/fetcher/fetcher.go b/exp/fetcher/fetcher.go index 77fdd4c9f602..1fbf6b8323ae 100644 --- a/exp/fetcher/fetcher.go +++ b/exp/fetcher/fetcher.go @@ -51,6 +51,12 @@ type blockRetrievalFn func(common.Hash) *types.Block // blockRequesterFn is a callback type for sending a block retrieval request. type blockRequesterFn func([]common.Hash) error +// headerRequesterFn is a callback type for sending a header retrieval request. +type headerRequesterFn func(common.Hash) error + +// bodyRequesterFn is a callback type for sending a body retrieval request. +type bodyRequesterFn func([]common.Hash) error + // blockValidatorFn is a callback type to verify a block's header for fast propagation. type blockValidatorFn func(block *types.Block, parent *types.Block) error @@ -69,11 +75,30 @@ type peerDropFn func(id string) // announce is the hash notification of the availability of a new block in the // network. type announce struct { - hash common.Hash // Hash of the block being announced - time time.Time // Timestamp of the announcement + hash common.Hash // Hash of the block being announced + number uint64 // Number of the block being announced (0 = unknown | old protocol) + header *types.Header // Header of the block partially reassembled (new protocol) + time time.Time // Timestamp of the announcement + + origin string // Identifier of the peer originating the notification + + fetch61 blockRequesterFn // [eth/61] Fetcher function to retrieve an announced block + fetchHeader headerRequesterFn // [eth/62] Fetcher function to retrieve the header of an announced block + fetchBodies bodyRequesterFn // [eth/62] Fetcher function to retrieve the body of an announced block +} - origin string // Identifier of the peer originating the notification - fetch blockRequesterFn // Fetcher function to retrieve +// headerFilterTask represents a batch of headers needing fetcher filtering. +type headerFilterTask struct { + headers []*types.Header // Collection of headers to filter + time time.Time // Arrival time of the headers +} + +// headerFilterTask represents a batch of block bodies (transactions and uncles) +// needing fetcher filtering. +type bodyFilterTask struct { + transactions [][]*types.Transaction // Collection of transactions per block bodies + uncles [][]*types.Header // Collection of uncles per block bodies + time time.Time // Arrival time of the blocks' contents } // inject represents a schedules import operation. @@ -88,14 +113,20 @@ type Fetcher struct { // Various event channels notify chan *announce inject chan *inject - filter chan chan []*types.Block - done chan common.Hash - quit chan struct{} + + blockFilter chan chan []*types.Block + headerFilter chan chan *headerFilterTask + bodyFilter chan chan *bodyFilterTask + + done chan common.Hash + quit chan struct{} // Announce states - announces map[string]int // Per peer announce counts to prevent memory exhaustion - announced map[common.Hash][]*announce // Announced blocks, scheduled for fetching - fetching map[common.Hash]*announce // Announced blocks, currently fetching + announces map[string]int // Per peer announce counts to prevent memory exhaustion + announced map[common.Hash][]*announce // Announced blocks, scheduled for fetching + fetching map[common.Hash]*announce // Announced blocks, currently fetching + fetched map[common.Hash][]*announce // Blocks with headers fetched, scheduled for body retrieval + completing map[common.Hash]*announce // Blocks with headers, currently body-completing // Block cache queue *prque.Prque // Queue containing the import operations (block number sorted) @@ -111,8 +142,9 @@ type Fetcher struct { dropPeer peerDropFn // Drops a peer for misbehaving // Testing hooks - fetchingHook func([]common.Hash) // Method to call upon starting a block fetch - importedHook func(*types.Block) // Method to call upon successful block import + fetchingHook func([]common.Hash) // Method to call upon starting a block (eth/61) or header (eth/62) fetch + completingHook func([]common.Hash) // Method to call upon starting a block body fetch (eth/62) + importedHook func(*types.Block) // Method to call upon successful block import (both eth/61 and eth/62) } // New creates a block fetcher to retrieve blocks based on hash announcements. @@ -120,12 +152,16 @@ func New(getBlock blockRetrievalFn, validateBlock blockValidatorFn, broadcastBlo return &Fetcher{ notify: make(chan *announce), inject: make(chan *inject), - filter: make(chan chan []*types.Block), + blockFilter: make(chan chan []*types.Block), + headerFilter: make(chan chan *headerFilterTask), + bodyFilter: make(chan chan *bodyFilterTask), done: make(chan common.Hash), quit: make(chan struct{}), announces: make(map[string]int), announced: make(map[common.Hash][]*announce), fetching: make(map[common.Hash]*announce), + fetched: make(map[common.Hash][]*announce), + completing: make(map[common.Hash]*announce), queue: prque.New(), queues: make(map[string]int), queued: make(map[common.Hash]*inject), @@ -152,12 +188,17 @@ func (f *Fetcher) Stop() { // Notify announces the fetcher of the potential availability of a new block in // the network. -func (f *Fetcher) Notify(peer string, hash common.Hash, time time.Time, fetcher blockRequesterFn) error { +func (f *Fetcher) Notify(peer string, hash common.Hash, number uint64, time time.Time, + blockFetcher blockRequesterFn, // eth/61 specific whole block fetcher + headerFetcher headerRequesterFn, bodyFetcher bodyRequesterFn) error { block := &announce{ - hash: hash, - time: time, - origin: peer, - fetch: fetcher, + hash: hash, + number: number, + time: time, + origin: peer, + fetch61: blockFetcher, + fetchHeader: headerFetcher, + fetchBodies: bodyFetcher, } select { case f.notify <- block: @@ -181,14 +222,16 @@ func (f *Fetcher) Enqueue(peer string, block *types.Block) error { } } -// Filter extracts all the blocks that were explicitly requested by the fetcher, +// FilterBlocks extracts all the blocks that were explicitly requested by the fetcher, // returning those that should be handled differently. -func (f *Fetcher) Filter(blocks types.Blocks) types.Blocks { +func (f *Fetcher) FilterBlocks(blocks types.Blocks) types.Blocks { + glog.V(logger.Detail).Infof("[eth/61] filtering %d blocks", len(blocks)) + // Send the filter channel to the fetcher filter := make(chan []*types.Block) select { - case f.filter <- filter: + case f.blockFilter <- filter: case <-f.quit: return nil } @@ -207,11 +250,69 @@ func (f *Fetcher) Filter(blocks types.Blocks) types.Blocks { } } +// FilterHeaders extracts all the headers that were explicitly requested by the fetcher, +// returning those that should be handled differently. +func (f *Fetcher) FilterHeaders(headers []*types.Header, time time.Time) []*types.Header { + glog.V(logger.Detail).Infof("[eth/62] filtering %d headers", len(headers)) + + // Send the filter channel to the fetcher + filter := make(chan *headerFilterTask) + + select { + case f.headerFilter <- filter: + case <-f.quit: + return nil + } + // Request the filtering of the header list + select { + case filter <- &headerFilterTask{headers: headers, time: time}: + case <-f.quit: + return nil + } + // Retrieve the headers remaining after filtering + select { + case task := <-filter: + return task.headers + case <-f.quit: + return nil + } +} + +// FilterBodies extracts all the block bodies that were explicitly requested by +// the fetcher, returning those that should be handled differently. +func (f *Fetcher) FilterBodies(transactions [][]*types.Transaction, uncles [][]*types.Header, time time.Time) ([][]*types.Transaction, [][]*types.Header) { + glog.V(logger.Detail).Infof("[eth/62] filtering %d:%d bodies", len(transactions), len(uncles)) + + // Send the filter channel to the fetcher + filter := make(chan *bodyFilterTask) + + select { + case f.bodyFilter <- filter: + case <-f.quit: + return nil, nil + } + // Request the filtering of the body list + select { + case filter <- &bodyFilterTask{transactions: transactions, uncles: uncles, time: time}: + case <-f.quit: + return nil, nil + } + // Retrieve the bodies remaining after filtering + select { + case task := <-filter: + return task.transactions, task.uncles + case <-f.quit: + return nil, nil + } +} + // Loop is the main fetcher loop, checking and processing various notification // events. func (f *Fetcher) loop() { // Iterate the block fetching until a quit is requested - fetch := time.NewTimer(0) + fetchTimer := time.NewTimer(0) + completeTimer := time.NewTimer(0) + for { // Clean up any expired block fetches for hash, announce := range f.fetching { @@ -246,26 +347,38 @@ func (f *Fetcher) loop() { case notification := <-f.notify: // A block was announced, make sure the peer isn't DOSing us - announceMeter.Mark(1) + propAnnounceInMeter.Mark(1) count := f.announces[notification.origin] + 1 if count > hashLimit { glog.V(logger.Debug).Infof("Peer %s: exceeded outstanding announces (%d)", notification.origin, hashLimit) + propAnnounceDOSMeter.Mark(1) break } + // If we have a valid block number, check that it's potentially useful + if notification.number > 0 { + if dist := int64(notification.number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { + glog.V(logger.Debug).Infof("[eth/62] Peer %s: discarded announcement #%d [%x…], distance %d", notification.origin, notification.number, notification.hash[:4], dist) + propAnnounceDropMeter.Mark(1) + break + } + } // All is well, schedule the announce if block's not yet downloading if _, ok := f.fetching[notification.hash]; ok { break } + if _, ok := f.completing[notification.hash]; ok { + break + } f.announces[notification.origin] = count f.announced[notification.hash] = append(f.announced[notification.hash], notification) if len(f.announced) == 1 { - f.reschedule(fetch) + f.rescheduleFetch(fetchTimer) } case op := <-f.inject: // A direct block insertion was requested, try and fill any pending gaps - broadcastMeter.Mark(1) + propBroadcastInMeter.Mark(1) f.enqueue(op.origin, op.block) case hash := <-f.done: @@ -273,7 +386,7 @@ func (f *Fetcher) loop() { f.forgetHash(hash) f.forgetBlock(hash) - case <-fetch.C: + case <-fetchTimer.C: // At least one block's timer ran out, check for needing retrieval request := make(map[string][]common.Hash) @@ -290,30 +403,80 @@ func (f *Fetcher) loop() { } } } - // Send out all block requests + // Send out all block (eth/61) or header (eth/62) requests for peer, hashes := range request { if glog.V(logger.Detail) && len(hashes) > 0 { list := "[" for _, hash := range hashes { - list += fmt.Sprintf("%x, ", hash[:4]) + list += fmt.Sprintf("%x…, ", hash[:4]) } list = list[:len(list)-2] + "]" - glog.V(logger.Detail).Infof("Peer %s: fetching %s", peer, list) + if f.fetching[hashes[0]].fetch61 != nil { + glog.V(logger.Detail).Infof("[eth/61] Peer %s: fetching blocks %s", peer, list) + } else { + glog.V(logger.Detail).Infof("[eth/62] Peer %s: fetching headers %s", peer, list) + } } // Create a closure of the fetch and schedule in on a new thread - fetcher, hashes := f.fetching[hashes[0]].fetch, hashes + fetchBlocks, fetchHeader, hashes := f.fetching[hashes[0]].fetch61, f.fetching[hashes[0]].fetchHeader, hashes go func() { if f.fetchingHook != nil { f.fetchingHook(hashes) } - fetcher(hashes) + if fetchBlocks != nil { + // Use old eth/61 protocol to retrieve whole blocks + blockFetchMeter.Mark(int64(len(hashes))) + fetchBlocks(hashes) + } else { + // Use new eth/62 protocol to retrieve headers first + for _, hash := range hashes { + headerFetchMeter.Mark(1) + fetchHeader(hash) // Suboptimal, but protocol doesn't allow batch header retrievals + } + } }() } // Schedule the next fetch if blocks are still pending - f.reschedule(fetch) + f.rescheduleFetch(fetchTimer) + + case <-completeTimer.C: + // At least one header's timer ran out, retrieve everything + request := make(map[string][]common.Hash) + + for hash, announces := range f.fetched { + // Pick a random peer to retrieve from, reset all others + announce := announces[rand.Intn(len(announces))] + f.forgetHash(hash) + + // If the block still didn't arrive, queue for completion + if f.getBlock(hash) == nil { + request[announce.origin] = append(request[announce.origin], hash) + f.completing[hash] = announce + } + } + // Send out all block body requests + for peer, hashes := range request { + if glog.V(logger.Detail) && len(hashes) > 0 { + list := "[" + for _, hash := range hashes { + list += fmt.Sprintf("%x…, ", hash[:4]) + } + list = list[:len(list)-2] + "]" + + glog.V(logger.Detail).Infof("[eth/62] Peer %s: fetching bodies %s", peer, list) + } + // Create a closure of the fetch and schedule in on a new thread + if f.completingHook != nil { + f.completingHook(hashes) + } + bodyFetchMeter.Mark(int64(len(hashes))) + go f.completing[hashes[0]].fetchBodies(hashes) + } + // Schedule the next fetch if blocks are still pending + f.rescheduleComplete(completeTimer) - case filter := <-f.filter: + case filter := <-f.blockFilter: // Blocks arrived, extract any explicit fetches, return all else var blocks types.Blocks select { @@ -321,6 +484,7 @@ func (f *Fetcher) loop() { case <-f.quit: return } + blockFilterInMeter.Mark(int64(len(blocks))) explicit, download := []*types.Block{}, []*types.Block{} for _, block := range blocks { @@ -339,6 +503,7 @@ func (f *Fetcher) loop() { } } + blockFilterOutMeter.Mark(int64(len(download))) select { case filter <- download: case <-f.quit: @@ -350,12 +515,146 @@ func (f *Fetcher) loop() { f.enqueue(announce.origin, block) } } + + case filter := <-f.headerFilter: + // Headers arrived from a remote peer. Extract those that were explicitly + // requested by the fetcher, and return everything else so it's delivered + // to other parts of the system. + var task *headerFilterTask + select { + case task = <-filter: + case <-f.quit: + return + } + headerFilterInMeter.Mark(int64(len(task.headers))) + + // Split the batch of headers into unknown ones (to return to the caller), + // known incomplete ones (requiring body retrievals) and completed blocks. + unknown, incomplete, complete := []*types.Header{}, []*announce{}, []*types.Block{} + for _, header := range task.headers { + hash := header.Hash() + + // Filter fetcher-requested headers from other synchronisation algorithms + if announce := f.fetching[hash]; announce != nil && f.fetched[hash] == nil && f.completing[hash] == nil && f.queued[hash] == nil { + // If the delivered header does not match the promised number, drop the announcer + if header.Number.Uint64() != announce.number { + glog.V(logger.Detail).Infof("[eth/62] Peer %s: invalid block number for [%x…]: announced %d, provided %d", announce.origin, header.Hash().Bytes()[:4], announce.number, header.Number.Uint64()) + f.dropPeer(announce.origin) + f.forgetHash(hash) + continue + } + // Only keep if not imported by other means + if f.getBlock(hash) == nil { + announce.header = header + announce.time = task.time + + // If the block is empty (header only), short circuit into the final import queue + if header.TxHash == types.DeriveSha(types.Transactions{}) && header.UncleHash == types.CalcUncleHash([]*types.Header{}) { + glog.V(logger.Detail).Infof("[eth/62] Peer %s: block #%d [%x…] empty, skipping body retrieval", announce.origin, header.Number.Uint64(), header.Hash().Bytes()[:4]) + + block := types.NewBlockWithHeader(header) + block.ReceivedAt = task.time + + complete = append(complete, block) + f.completing[hash] = announce + continue + } + // Otherwise add to the list of blocks needing completion + incomplete = append(incomplete, announce) + } else { + glog.V(logger.Detail).Infof("[eth/62] Peer %s: block #%d [%x…] already imported, discarding header", announce.origin, header.Number.Uint64(), header.Hash().Bytes()[:4]) + f.forgetHash(hash) + } + } else { + // Fetcher doesn't know about it, add to the return list + unknown = append(unknown, header) + } + } + headerFilterOutMeter.Mark(int64(len(unknown))) + select { + case filter <- &headerFilterTask{headers: unknown, time: task.time}: + case <-f.quit: + return + } + // Schedule the retrieved headers for body completion + for _, announce := range incomplete { + hash := announce.header.Hash() + if _, ok := f.completing[hash]; ok { + continue + } + f.fetched[hash] = append(f.fetched[hash], announce) + if len(f.fetched) == 1 { + f.rescheduleComplete(completeTimer) + } + } + // Schedule the header-only blocks for import + for _, block := range complete { + if announce := f.completing[block.Hash()]; announce != nil { + f.enqueue(announce.origin, block) + } + } + + case filter := <-f.bodyFilter: + // Block bodies arrived, extract any explicitly requested blocks, return the rest + var task *bodyFilterTask + select { + case task = <-filter: + case <-f.quit: + return + } + bodyFilterInMeter.Mark(int64(len(task.transactions))) + + blocks := []*types.Block{} + for i := 0; i < len(task.transactions) && i < len(task.uncles); i++ { + // Match up a body to any possible completion request + matched := false + + for hash, announce := range f.completing { + if f.queued[hash] == nil { + txnHash := types.DeriveSha(types.Transactions(task.transactions[i])) + uncleHash := types.CalcUncleHash(task.uncles[i]) + + if txnHash == announce.header.TxHash && uncleHash == announce.header.UncleHash { + // Mark the body matched, reassemble if still unknown + matched = true + + if f.getBlock(hash) == nil { + block := types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i]) + block.ReceivedAt = task.time + + blocks = append(blocks, block) + } else { + f.forgetHash(hash) + } + } + } + } + if matched { + task.transactions = append(task.transactions[:i], task.transactions[i+1:]...) + task.uncles = append(task.uncles[:i], task.uncles[i+1:]...) + i-- + continue + } + } + + bodyFilterOutMeter.Mark(int64(len(task.transactions))) + select { + case filter <- task: + case <-f.quit: + return + } + // Schedule the retrieved blocks for ordered import + for _, block := range blocks { + if announce := f.completing[block.Hash()]; announce != nil { + f.enqueue(announce.origin, block) + } + } } } } -// reschedule resets the specified fetch timer to the next announce timeout. -func (f *Fetcher) reschedule(fetch *time.Timer) { +// rescheduleFetch resets the specified fetch timer to the next announce timeout. +func (f *Fetcher) rescheduleFetch(fetch *time.Timer) { // Short circuit if no blocks are announced if len(f.announced) == 0 { return @@ -370,6 +669,22 @@ func (f *Fetcher) reschedule(fetch *time.Timer) { fetch.Reset(arriveTimeout - time.Since(earliest)) } +// rescheduleComplete resets the specified completion timer to the next fetch timeout. +func (f *Fetcher) rescheduleComplete(complete *time.Timer) { + // Short circuit if no headers are fetched + if len(f.fetched) == 0 { + return + } + // Otherwise find the earliest expiring announcement + earliest := time.Now() + for _, announces := range f.fetched { + if earliest.After(announces[0].time) { + earliest = announces[0].time + } + } + complete.Reset(gatherSlack - time.Since(earliest)) +} + // enqueue schedules a new future import operation, if the block to be imported // has not yet been seen. func (f *Fetcher) enqueue(peer string, block *types.Block) { @@ -378,13 +693,16 @@ func (f *Fetcher) enqueue(peer string, block *types.Block) { // Ensure the peer isn't DOSing us count := f.queues[peer] + 1 if count > blockLimit { - glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x], exceeded allowance (%d)", peer, block.NumberU64(), hash.Bytes()[:4], blockLimit) + glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x…], exceeded allowance (%d)", peer, block.NumberU64(), hash.Bytes()[:4], blockLimit) + propBroadcastDOSMeter.Mark(1) + f.forgetHash(hash) return } // Discard any past or too distant blocks if dist := int64(block.NumberU64()) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { - glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x], distance %d", peer, block.NumberU64(), hash.Bytes()[:4], dist) - discardMeter.Mark(1) + glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x…], distance %d", peer, block.NumberU64(), hash.Bytes()[:4], dist) + propBroadcastDropMeter.Mark(1) + f.forgetHash(hash) return } // Schedule the block for future importing @@ -398,7 +716,7 @@ func (f *Fetcher) enqueue(peer string, block *types.Block) { f.queue.Push(op, -float32(block.NumberU64())) if glog.V(logger.Debug) { - glog.Infof("Peer %s: queued block #%d [%x], total %v", peer, block.NumberU64(), hash.Bytes()[:4], f.queue.Size()) + glog.Infof("Peer %s: queued block #%d [%x…], total %v", peer, block.NumberU64(), hash.Bytes()[:4], f.queue.Size()) } } } @@ -410,39 +728,39 @@ func (f *Fetcher) insert(peer string, block *types.Block) { hash := block.Hash() // Run the import on a new thread - glog.V(logger.Debug).Infof("Peer %s: importing block #%d [%x]", peer, block.NumberU64(), hash[:4]) + glog.V(logger.Debug).Infof("Peer %s: importing block #%d [%x…]", peer, block.NumberU64(), hash[:4]) go func() { defer func() { f.done <- hash }() // If the parent's unknown, abort insertion parent := f.getBlock(block.ParentHash()) if parent == nil { + glog.V(logger.Debug).Infof("Peer %s: parent []%x] of block #%d [%x…] unknown", block.ParentHash().Bytes()[:4], peer, block.NumberU64(), hash[:4]) return } // Quickly validate the header and propagate the block if it passes switch err := f.validateBlock(block, parent); err { case nil: // All ok, quickly propagate to our peers - broadcastTimer.UpdateSince(block.ReceivedAt) + propBroadcastOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, true) case core.BlockFutureErr: - futureMeter.Mark(1) // Weird future block, don't fail, but neither propagate default: // Something went very wrong, drop the peer - glog.V(logger.Debug).Infof("Peer %s: block #%d [%x] verification failed: %v", peer, block.NumberU64(), hash[:4], err) + glog.V(logger.Debug).Infof("Peer %s: block #%d [%x…] verification failed: %v", peer, block.NumberU64(), hash[:4], err) f.dropPeer(peer) return } // Run the actual import and log any issues if _, err := f.insertChain(types.Blocks{block}); err != nil { - glog.V(logger.Warn).Infof("Peer %s: block #%d [%x] import failed: %v", peer, block.NumberU64(), hash[:4], err) + glog.V(logger.Warn).Infof("Peer %s: block #%d [%x…] import failed: %v", peer, block.NumberU64(), hash[:4], err) return } // If import succeeded, broadcast the block - announceTimer.UpdateSince(block.ReceivedAt) + propAnnounceOutTimer.UpdateSince(block.ReceivedAt) go f.broadcastBlock(block, false) // Invoke the testing hook if needed @@ -472,9 +790,27 @@ func (f *Fetcher) forgetHash(hash common.Hash) { } delete(f.fetching, hash) } + + // Remove any pending completion requests and decrement the DOS counters + for _, announce := range f.fetched[hash] { + f.announces[announce.origin]-- + if f.announces[announce.origin] == 0 { + delete(f.announces, announce.origin) + } + } + delete(f.fetched, hash) + + // Remove any pending completions and decrement the DOS counters + if announce := f.completing[hash]; announce != nil { + f.announces[announce.origin]-- + if f.announces[announce.origin] == 0 { + delete(f.announces, announce.origin) + } + delete(f.completing, hash) + } } -// forgetBlock removes all traces of a queued block frmo the fetcher's internal +// forgetBlock removes all traces of a queued block from the fetcher's internal // state. func (f *Fetcher) forgetBlock(hash common.Hash) { if insert := f.queued[hash]; insert != nil { diff --git a/exp/fetcher/fetcher_test.go b/exp/fetcher/fetcher_test.go index b9942061801f..3df79de5325a 100644 --- a/exp/fetcher/fetcher_test.go +++ b/exp/fetcher/fetcher_test.go @@ -24,24 +24,43 @@ import ( "testing" "time" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/params" ) var ( testdb, _ = ethdb.NewMemDatabase() - genesis = core.GenesisBlockForTesting(testdb, common.Address{}, big.NewInt(0)) + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testAddress = crypto.PubkeyToAddress(testKey.PublicKey) + genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit}, nil, nil, nil) ) // makeChain creates a chain of n blocks starting at and including parent. -// the returned hash chain is ordered head->parent. +// the returned hash chain is ordered head->parent. In addition, every 3rd block +// contains a transaction and every 5th an uncle to allow testing correct block +// reassembly. func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common.Hash]*types.Block) { - blocks := core.GenerateChain(parent, testdb, n, func(i int, gen *core.BlockGen) { - gen.SetCoinbase(common.Address{seed}) + blocks := core.GenerateChain(parent, testdb, n, func(i int, block *core.BlockGen) { + block.SetCoinbase(common.Address{seed}) + + // If the block number is multiple of 3, send a bonus transaction to the miner + if parent == genesis && i%3 == 0 { + tx, err := types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(testKey) + if err != nil { + panic(err) + } + block.AddTx(tx) + } + // If the block number is a multiple of 5, add a bonus uncle to the block + if i%5 == 0 { + block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 1).Hash(), Number: big.NewInt(int64(i - 1))}) + } }) hashes := make([]common.Hash, n+1) hashes[len(hashes)-1] = parent.Hash() @@ -60,6 +79,7 @@ type fetcherTester struct { hashes []common.Hash // Hash chain belonging to the tester blocks map[common.Hash]*types.Block // Blocks belonging to the tester + drops map[string]bool // Map of peers dropped by the fetcher lock sync.RWMutex } @@ -69,6 +89,7 @@ func newTester() *fetcherTester { tester := &fetcherTester{ hashes: []common.Hash{genesis.Hash()}, blocks: map[common.Hash]*types.Block{genesis.Hash(): genesis}, + drops: make(map[string]bool), } tester.fetcher = New(tester.getBlock, tester.verifyBlock, tester.broadcastBlock, tester.chainHeight, tester.insertChain, tester.dropPeer) tester.fetcher.Start() @@ -122,12 +143,14 @@ func (f *fetcherTester) insertChain(blocks types.Blocks) (int, error) { return 0, nil } -// dropPeer is a nop placeholder for the peer removal. +// dropPeer is an emulator for the peer removal, simply accumulating the various +// peers dropped by the fetcher. func (f *fetcherTester) dropPeer(peer string) { + f.drops[peer] = true } -// peerFetcher retrieves a fetcher associated with a simulated peer. -func (f *fetcherTester) makeFetcher(blocks map[common.Hash]*types.Block) blockRequesterFn { +// makeBlockFetcher retrieves a block fetcher associated with a simulated peer. +func (f *fetcherTester) makeBlockFetcher(blocks map[common.Hash]*types.Block) blockRequesterFn { closure := make(map[common.Hash]*types.Block) for hash, block := range blocks { closure[hash] = block @@ -142,18 +165,105 @@ func (f *fetcherTester) makeFetcher(blocks map[common.Hash]*types.Block) blockRe } } // Return on a new thread - go f.fetcher.Filter(blocks) + go f.fetcher.FilterBlocks(blocks) + + return nil + } +} + +// makeHeaderFetcher retrieves a block header fetcher associated with a simulated peer. +func (f *fetcherTester) makeHeaderFetcher(blocks map[common.Hash]*types.Block, drift time.Duration) headerRequesterFn { + closure := make(map[common.Hash]*types.Block) + for hash, block := range blocks { + closure[hash] = block + } + // Create a function that return a header from the closure + return func(hash common.Hash) error { + // Gather the blocks to return + headers := make([]*types.Header, 0, 1) + if block, ok := closure[hash]; ok { + headers = append(headers, block.Header()) + } + // Return on a new thread + go f.fetcher.FilterHeaders(headers, time.Now().Add(drift)) return nil } } +// makeBodyFetcher retrieves a block body fetcher associated with a simulated peer. +func (f *fetcherTester) makeBodyFetcher(blocks map[common.Hash]*types.Block, drift time.Duration) bodyRequesterFn { + closure := make(map[common.Hash]*types.Block) + for hash, block := range blocks { + closure[hash] = block + } + // Create a function that returns blocks from the closure + return func(hashes []common.Hash) error { + // Gather the block bodies to return + transactions := make([][]*types.Transaction, 0, len(hashes)) + uncles := make([][]*types.Header, 0, len(hashes)) + + for _, hash := range hashes { + if block, ok := closure[hash]; ok { + transactions = append(transactions, block.Transactions()) + uncles = append(uncles, block.Uncles()) + } + } + // Return on a new thread + go f.fetcher.FilterBodies(transactions, uncles, time.Now().Add(drift)) + + return nil + } +} + +// verifyFetchingEvent verifies that one single event arrive on an fetching channel. +func verifyFetchingEvent(t *testing.T, fetching chan []common.Hash, arrive bool) { + if arrive { + select { + case <-fetching: + case <-time.After(time.Second): + t.Fatalf("fetching timeout") + } + } else { + select { + case <-fetching: + t.Fatalf("fetching invoked") + case <-time.After(10 * time.Millisecond): + } + } +} + +// verifyCompletingEvent verifies that one single event arrive on an completing channel. +func verifyCompletingEvent(t *testing.T, completing chan []common.Hash, arrive bool) { + if arrive { + select { + case <-completing: + case <-time.After(time.Second): + t.Fatalf("completing timeout") + } + } else { + select { + case <-completing: + t.Fatalf("completing invoked") + case <-time.After(10 * time.Millisecond): + } + } +} + // verifyImportEvent verifies that one single event arrive on an import channel. -func verifyImportEvent(t *testing.T, imported chan *types.Block) { - select { - case <-imported: - case <-time.After(time.Second): - t.Fatalf("import timeout") +func verifyImportEvent(t *testing.T, imported chan *types.Block, arrive bool) { + if arrive { + select { + case <-imported: + case <-time.After(time.Second): + t.Fatalf("import timeout") + } + } else { + select { + case <-imported: + t.Fatalf("import invoked") + case <-time.After(10 * time.Millisecond): + } } } @@ -164,7 +274,7 @@ func verifyImportCount(t *testing.T, imported chan *types.Block, count int) { select { case <-imported: case <-time.After(time.Second): - t.Fatalf("block %d: import timeout", i) + t.Fatalf("block %d: import timeout", i+1) } } verifyImportDone(t, imported) @@ -181,51 +291,78 @@ func verifyImportDone(t *testing.T, imported chan *types.Block) { // Tests that a fetcher accepts block announcements and initiates retrievals for // them, successfully importing into the local chain. -func TestSequentialAnnouncements(t *testing.T) { +func TestSequentialAnnouncements61(t *testing.T) { testSequentialAnnouncements(t, 61) } +func TestSequentialAnnouncements62(t *testing.T) { testSequentialAnnouncements(t, 62) } +func TestSequentialAnnouncements63(t *testing.T) { testSequentialAnnouncements(t, 63) } +func TestSequentialAnnouncements64(t *testing.T) { testSequentialAnnouncements(t, 64) } + +func testSequentialAnnouncements(t *testing.T, protocol int) { // Create a chain of blocks to import targetBlocks := 4 * hashLimit hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) // Iteratively announce blocks until all are imported imported := make(chan *types.Block) tester.fetcher.importedHook = func(block *types.Block) { imported <- block } for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher) - verifyImportEvent(t, imported) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } + verifyImportEvent(t, imported, true) } verifyImportDone(t, imported) } // Tests that if blocks are announced by multiple peers (or even the same buggy // peer), they will only get downloaded at most once. -func TestConcurrentAnnouncements(t *testing.T) { +func TestConcurrentAnnouncements61(t *testing.T) { testConcurrentAnnouncements(t, 61) } +func TestConcurrentAnnouncements62(t *testing.T) { testConcurrentAnnouncements(t, 62) } +func TestConcurrentAnnouncements63(t *testing.T) { testConcurrentAnnouncements(t, 63) } +func TestConcurrentAnnouncements64(t *testing.T) { testConcurrentAnnouncements(t, 64) } + +func testConcurrentAnnouncements(t *testing.T, protocol int) { // Create a chain of blocks to import targetBlocks := 4 * hashLimit hashes, blocks := makeChain(targetBlocks, 0, genesis) // Assemble a tester with a built in counter for the requests tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) counter := uint32(0) - wrapper := func(hashes []common.Hash) error { + blockWrapper := func(hashes []common.Hash) error { atomic.AddUint32(&counter, uint32(len(hashes))) - return fetcher(hashes) + return blockFetcher(hashes) + } + headerWrapper := func(hash common.Hash) error { + atomic.AddUint32(&counter, 1) + return headerFetcher(hash) } // Iteratively announce blocks until all are imported imported := make(chan *types.Block) tester.fetcher.importedHook = func(block *types.Block) { imported <- block } for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("first", hashes[i], time.Now().Add(-arriveTimeout), wrapper) - tester.fetcher.Notify("second", hashes[i], time.Now().Add(-arriveTimeout+time.Millisecond), wrapper) - tester.fetcher.Notify("second", hashes[i], time.Now().Add(-arriveTimeout-time.Millisecond), wrapper) - - verifyImportEvent(t, imported) + if protocol < 62 { + tester.fetcher.Notify("first", hashes[i], 0, time.Now().Add(-arriveTimeout), blockWrapper, nil, nil) + tester.fetcher.Notify("second", hashes[i], 0, time.Now().Add(-arriveTimeout+time.Millisecond), blockWrapper, nil, nil) + tester.fetcher.Notify("second", hashes[i], 0, time.Now().Add(-arriveTimeout-time.Millisecond), blockWrapper, nil, nil) + } else { + tester.fetcher.Notify("first", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerWrapper, bodyFetcher) + tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout+time.Millisecond), nil, headerWrapper, bodyFetcher) + tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout-time.Millisecond), nil, headerWrapper, bodyFetcher) + } + verifyImportEvent(t, imported, true) } verifyImportDone(t, imported) @@ -237,56 +374,90 @@ func TestConcurrentAnnouncements(t *testing.T) { // Tests that announcements arriving while a previous is being fetched still // results in a valid import. -func TestOverlappingAnnouncements(t *testing.T) { +func TestOverlappingAnnouncements61(t *testing.T) { testOverlappingAnnouncements(t, 61) } +func TestOverlappingAnnouncements62(t *testing.T) { testOverlappingAnnouncements(t, 62) } +func TestOverlappingAnnouncements63(t *testing.T) { testOverlappingAnnouncements(t, 63) } +func TestOverlappingAnnouncements64(t *testing.T) { testOverlappingAnnouncements(t, 64) } + +func testOverlappingAnnouncements(t *testing.T, protocol int) { // Create a chain of blocks to import targetBlocks := 4 * hashLimit hashes, blocks := makeChain(targetBlocks, 0, genesis) tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) // Iteratively announce blocks, but overlap them continuously - fetching := make(chan []common.Hash) + overlap := 16 imported := make(chan *types.Block, len(hashes)-1) - tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- hashes } + for i := 0; i < overlap; i++ { + imported <- nil + } tester.fetcher.importedHook = func(block *types.Block) { imported <- block } for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } select { - case <-fetching: + case <-imported: case <-time.After(time.Second): - t.Fatalf("hash %d: announce timeout", len(hashes)-i) + t.Fatalf("block %d: import timeout", len(hashes)-i) } } // Wait for all the imports to complete and check count - verifyImportCount(t, imported, len(hashes)-1) + verifyImportCount(t, imported, overlap) } // Tests that announces already being retrieved will not be duplicated. -func TestPendingDeduplication(t *testing.T) { +func TestPendingDeduplication61(t *testing.T) { testPendingDeduplication(t, 61) } +func TestPendingDeduplication62(t *testing.T) { testPendingDeduplication(t, 62) } +func TestPendingDeduplication63(t *testing.T) { testPendingDeduplication(t, 63) } +func TestPendingDeduplication64(t *testing.T) { testPendingDeduplication(t, 64) } + +func testPendingDeduplication(t *testing.T, protocol int) { // Create a hash and corresponding block hashes, blocks := makeChain(1, 0, genesis) // Assemble a tester with a built in counter and delayed fetcher tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) delay := 50 * time.Millisecond counter := uint32(0) - wrapper := func(hashes []common.Hash) error { + blockWrapper := func(hashes []common.Hash) error { atomic.AddUint32(&counter, uint32(len(hashes))) // Simulate a long running fetch go func() { time.Sleep(delay) - fetcher(hashes) + blockFetcher(hashes) + }() + return nil + } + headerWrapper := func(hash common.Hash) error { + atomic.AddUint32(&counter, 1) + + // Simulate a long running fetch + go func() { + time.Sleep(delay) + headerFetcher(hash) }() return nil } // Announce the same block many times until it's fetched (wait for any pending ops) for tester.getBlock(hashes[0]) == nil { - tester.fetcher.Notify("repeater", hashes[0], time.Now().Add(-arriveTimeout), wrapper) + if protocol < 62 { + tester.fetcher.Notify("repeater", hashes[0], 0, time.Now().Add(-arriveTimeout), blockWrapper, nil, nil) + } else { + tester.fetcher.Notify("repeater", hashes[0], 1, time.Now().Add(-arriveTimeout), nil, headerWrapper, bodyFetcher) + } time.Sleep(time.Millisecond) } time.Sleep(delay) @@ -302,14 +473,21 @@ func TestPendingDeduplication(t *testing.T) { // Tests that announcements retrieved in a random order are cached and eventually // imported when all the gaps are filled in. -func TestRandomArrivalImport(t *testing.T) { +func TestRandomArrivalImport61(t *testing.T) { testRandomArrivalImport(t, 61) } +func TestRandomArrivalImport62(t *testing.T) { testRandomArrivalImport(t, 62) } +func TestRandomArrivalImport63(t *testing.T) { testRandomArrivalImport(t, 63) } +func TestRandomArrivalImport64(t *testing.T) { testRandomArrivalImport(t, 64) } + +func testRandomArrivalImport(t *testing.T, protocol int) { // Create a chain of blocks to import, and choose one to delay targetBlocks := maxQueueDist hashes, blocks := makeChain(targetBlocks, 0, genesis) skip := targetBlocks / 2 tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) // Iteratively announce blocks, skipping one entry imported := make(chan *types.Block, len(hashes)-1) @@ -317,25 +495,40 @@ func TestRandomArrivalImport(t *testing.T) { for i := len(hashes) - 1; i >= 0; i-- { if i != skip { - tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } time.Sleep(time.Millisecond) } } // Finally announce the skipped entry and check full import - tester.fetcher.Notify("valid", hashes[skip], time.Now().Add(-arriveTimeout), fetcher) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[skip], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[skip], uint64(len(hashes)-skip-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } verifyImportCount(t, imported, len(hashes)-1) } // Tests that direct block enqueues (due to block propagation vs. hash announce) // are correctly schedule, filling and import queue gaps. -func TestQueueGapFill(t *testing.T) { +func TestQueueGapFill61(t *testing.T) { testQueueGapFill(t, 61) } +func TestQueueGapFill62(t *testing.T) { testQueueGapFill(t, 62) } +func TestQueueGapFill63(t *testing.T) { testQueueGapFill(t, 63) } +func TestQueueGapFill64(t *testing.T) { testQueueGapFill(t, 64) } + +func testQueueGapFill(t *testing.T, protocol int) { // Create a chain of blocks to import, and choose one to not announce at all targetBlocks := maxQueueDist hashes, blocks := makeChain(targetBlocks, 0, genesis) skip := targetBlocks / 2 tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) // Iteratively announce blocks, skipping one entry imported := make(chan *types.Block, len(hashes)-1) @@ -343,7 +536,11 @@ func TestQueueGapFill(t *testing.T) { for i := len(hashes) - 1; i >= 0; i-- { if i != skip { - tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), fetcher) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } time.Sleep(time.Millisecond) } } @@ -354,13 +551,20 @@ func TestQueueGapFill(t *testing.T) { // Tests that blocks arriving from various sources (multiple propagations, hash // announces, etc) do not get scheduled for import multiple times. -func TestImportDeduplication(t *testing.T) { +func TestImportDeduplication61(t *testing.T) { testImportDeduplication(t, 61) } +func TestImportDeduplication62(t *testing.T) { testImportDeduplication(t, 62) } +func TestImportDeduplication63(t *testing.T) { testImportDeduplication(t, 63) } +func TestImportDeduplication64(t *testing.T) { testImportDeduplication(t, 64) } + +func testImportDeduplication(t *testing.T, protocol int) { // Create two blocks to import (one for duplication, the other for stalling) hashes, blocks := makeChain(2, 0, genesis) // Create the tester and wrap the importer with a counter tester := newTester() - fetcher := tester.makeFetcher(blocks) + blockFetcher := tester.makeBlockFetcher(blocks) + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) counter := uint32(0) tester.fetcher.insertChain = func(blocks types.Blocks) (int, error) { @@ -374,7 +578,11 @@ func TestImportDeduplication(t *testing.T) { tester.fetcher.importedHook = func(block *types.Block) { imported <- block } // Announce the duplicating block, wait for retrieval, and also propagate directly - tester.fetcher.Notify("valid", hashes[0], time.Now().Add(-arriveTimeout), fetcher) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[0], 0, time.Now().Add(-arriveTimeout), blockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[0], 1, time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + } <-fetching tester.fetcher.Enqueue("valid", blocks[hashes[0]]) @@ -391,35 +599,157 @@ func TestImportDeduplication(t *testing.T) { } // Tests that blocks with numbers much lower or higher than out current head get -// discarded no prevent wasting resources on useless blocks from faulty peers. -func TestDistantDiscarding(t *testing.T) { - // Create a long chain to import +// discarded to prevent wasting resources on useless blocks from faulty peers. +func TestDistantPropagationDiscarding(t *testing.T) { + // Create a long chain to import and define the discard boundaries hashes, blocks := makeChain(3*maxQueueDist, 0, genesis) head := hashes[len(hashes)/2] + low, high := len(hashes)/2+maxUncleDist+1, len(hashes)/2-maxQueueDist-1 + // Create a tester and simulate a head block being the middle of the above chain tester := newTester() tester.hashes = []common.Hash{head} tester.blocks = map[common.Hash]*types.Block{head: blocks[head]} // Ensure that a block with a lower number than the threshold is discarded - tester.fetcher.Enqueue("lower", blocks[hashes[0]]) + tester.fetcher.Enqueue("lower", blocks[hashes[low]]) time.Sleep(10 * time.Millisecond) if !tester.fetcher.queue.Empty() { t.Fatalf("fetcher queued stale block") } // Ensure that a block with a higher number than the threshold is discarded - tester.fetcher.Enqueue("higher", blocks[hashes[len(hashes)-1]]) + tester.fetcher.Enqueue("higher", blocks[hashes[high]]) time.Sleep(10 * time.Millisecond) if !tester.fetcher.queue.Empty() { t.Fatalf("fetcher queued future block") } } +// Tests that announcements with numbers much lower or higher than out current +// head get discarded to prevent wasting resources on useless blocks from faulty +// peers. +func TestDistantAnnouncementDiscarding62(t *testing.T) { testDistantAnnouncementDiscarding(t, 62) } +func TestDistantAnnouncementDiscarding63(t *testing.T) { testDistantAnnouncementDiscarding(t, 63) } +func TestDistantAnnouncementDiscarding64(t *testing.T) { testDistantAnnouncementDiscarding(t, 64) } + +func testDistantAnnouncementDiscarding(t *testing.T, protocol int) { + // Create a long chain to import and define the discard boundaries + hashes, blocks := makeChain(3*maxQueueDist, 0, genesis) + head := hashes[len(hashes)/2] + + low, high := len(hashes)/2+maxUncleDist+1, len(hashes)/2-maxQueueDist-1 + + // Create a tester and simulate a head block being the middle of the above chain + tester := newTester() + tester.hashes = []common.Hash{head} + tester.blocks = map[common.Hash]*types.Block{head: blocks[head]} + + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) + + fetching := make(chan struct{}, 2) + tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- struct{}{} } + + // Ensure that a block with a lower number than the threshold is discarded + tester.fetcher.Notify("lower", hashes[low], blocks[hashes[low]].NumberU64(), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + select { + case <-time.After(50 * time.Millisecond): + case <-fetching: + t.Fatalf("fetcher requested stale header") + } + // Ensure that a block with a higher number than the threshold is discarded + tester.fetcher.Notify("higher", hashes[high], blocks[hashes[high]].NumberU64(), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + select { + case <-time.After(50 * time.Millisecond): + case <-fetching: + t.Fatalf("fetcher requested future header") + } +} + +// Tests that peers announcing blocks with invalid numbers (i.e. not matching +// the headers provided afterwards) get dropped as malicious. +func TestInvalidNumberAnnouncement62(t *testing.T) { testInvalidNumberAnnouncement(t, 62) } +func TestInvalidNumberAnnouncement63(t *testing.T) { testInvalidNumberAnnouncement(t, 63) } +func TestInvalidNumberAnnouncement64(t *testing.T) { testInvalidNumberAnnouncement(t, 64) } + +func testInvalidNumberAnnouncement(t *testing.T, protocol int) { + // Create a single block to import and check numbers against + hashes, blocks := makeChain(1, 0, genesis) + + tester := newTester() + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) + + imported := make(chan *types.Block) + tester.fetcher.importedHook = func(block *types.Block) { imported <- block } + + // Announce a block with a bad number, check for immediate drop + tester.fetcher.Notify("bad", hashes[0], 2, time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + verifyImportEvent(t, imported, false) + + if !tester.drops["bad"] { + t.Fatalf("peer with invalid numbered announcement not dropped") + } + // Make sure a good announcement passes without a drop + tester.fetcher.Notify("good", hashes[0], 1, time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + verifyImportEvent(t, imported, true) + + if tester.drops["good"] { + t.Fatalf("peer with valid numbered announcement dropped") + } + verifyImportDone(t, imported) +} + +// Tests that if a block is empty (i.e. header only), no body request should be +// made, and instead the header should be assembled into a whole block in itself. +func TestEmptyBlockShortCircuit62(t *testing.T) { testEmptyBlockShortCircuit(t, 62) } +func TestEmptyBlockShortCircuit63(t *testing.T) { testEmptyBlockShortCircuit(t, 63) } +func TestEmptyBlockShortCircuit64(t *testing.T) { testEmptyBlockShortCircuit(t, 64) } + +func testEmptyBlockShortCircuit(t *testing.T, protocol int) { + // Create a chain of blocks to import + hashes, blocks := makeChain(32, 0, genesis) + + tester := newTester() + headerFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + bodyFetcher := tester.makeBodyFetcher(blocks, 0) + + // Add a monitoring hook for all internal events + fetching := make(chan []common.Hash) + tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- hashes } + + completing := make(chan []common.Hash) + tester.fetcher.completingHook = func(hashes []common.Hash) { completing <- hashes } + + imported := make(chan *types.Block) + tester.fetcher.importedHook = func(block *types.Block) { imported <- block } + + // Iteratively announce blocks until all are imported + for i := len(hashes) - 2; i >= 0; i-- { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, headerFetcher, bodyFetcher) + + // All announces should fetch the header + verifyFetchingEvent(t, fetching, true) + + // Only blocks with data contents should request bodies + verifyCompletingEvent(t, completing, len(blocks[hashes[i]].Transactions()) > 0 || len(blocks[hashes[i]].Uncles()) > 0) + + // Irrelevant of the construct, import should succeed + verifyImportEvent(t, imported, true) + } + verifyImportDone(t, imported) +} + // Tests that a peer is unable to use unbounded memory with sending infinite // block announcements to a node, but that even in the face of such an attack, // the fetcher remains operational. -func TestHashMemoryExhaustionAttack(t *testing.T) { +func TestHashMemoryExhaustionAttack61(t *testing.T) { testHashMemoryExhaustionAttack(t, 61) } +func TestHashMemoryExhaustionAttack62(t *testing.T) { testHashMemoryExhaustionAttack(t, 62) } +func TestHashMemoryExhaustionAttack63(t *testing.T) { testHashMemoryExhaustionAttack(t, 63) } +func TestHashMemoryExhaustionAttack64(t *testing.T) { testHashMemoryExhaustionAttack(t, 64) } + +func testHashMemoryExhaustionAttack(t *testing.T, protocol int) { // Create a tester with instrumented import hooks tester := newTester() @@ -429,17 +759,29 @@ func TestHashMemoryExhaustionAttack(t *testing.T) { // Create a valid chain and an infinite junk chain targetBlocks := hashLimit + 2*maxQueueDist hashes, blocks := makeChain(targetBlocks, 0, genesis) - valid := tester.makeFetcher(blocks) + validBlockFetcher := tester.makeBlockFetcher(blocks) + validHeaderFetcher := tester.makeHeaderFetcher(blocks, -gatherSlack) + validBodyFetcher := tester.makeBodyFetcher(blocks, 0) attack, _ := makeChain(targetBlocks, 0, unknownBlock) - attacker := tester.makeFetcher(nil) + attackerBlockFetcher := tester.makeBlockFetcher(nil) + attackerHeaderFetcher := tester.makeHeaderFetcher(nil, -gatherSlack) + attackerBodyFetcher := tester.makeBodyFetcher(nil, 0) // Feed the tester a huge hashset from the attacker, and a limited from the valid peer for i := 0; i < len(attack); i++ { if i < maxQueueDist { - tester.fetcher.Notify("valid", hashes[len(hashes)-2-i], time.Now(), valid) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[len(hashes)-2-i], 0, time.Now(), validBlockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[len(hashes)-2-i], uint64(i+1), time.Now(), nil, validHeaderFetcher, validBodyFetcher) + } + } + if protocol < 62 { + tester.fetcher.Notify("attacker", attack[i], 0, time.Now(), attackerBlockFetcher, nil, nil) + } else { + tester.fetcher.Notify("attacker", attack[i], 1 /* don't distance drop */, time.Now(), nil, attackerHeaderFetcher, attackerBodyFetcher) } - tester.fetcher.Notify("attacker", attack[i], time.Now(), attacker) } if len(tester.fetcher.announced) != hashLimit+maxQueueDist { t.Fatalf("queued announce count mismatch: have %d, want %d", len(tester.fetcher.announced), hashLimit+maxQueueDist) @@ -449,8 +791,12 @@ func TestHashMemoryExhaustionAttack(t *testing.T) { // Feed the remaining valid hashes to ensure DOS protection state remains clean for i := len(hashes) - maxQueueDist - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], time.Now().Add(-arriveTimeout), valid) - verifyImportEvent(t, imported) + if protocol < 62 { + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), validBlockFetcher, nil, nil) + } else { + tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), nil, validHeaderFetcher, validBodyFetcher) + } + verifyImportEvent(t, imported, true) } verifyImportDone(t, imported) } @@ -498,7 +844,7 @@ func TestBlockMemoryExhaustionAttack(t *testing.T) { // Insert the remaining blocks in chunks to ensure clean DOS protection for i := maxQueueDist; i < len(hashes)-1; i++ { tester.fetcher.Enqueue("valid", blocks[hashes[len(hashes)-2-i]]) - verifyImportEvent(t, imported) + verifyImportEvent(t, imported, true) } verifyImportDone(t, imported) } diff --git a/exp/fetcher/metrics.go b/exp/fetcher/metrics.go index 7bb8cd5c4b91..9dad34e6a052 100644 --- a/exp/fetcher/metrics.go +++ b/exp/fetcher/metrics.go @@ -1,18 +1,18 @@ -// Copyright 2015 The go-expanse Authors -// This file is part of the go-expanse library. +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. // -// The go-expanse library is free software: you can redistribute it and/or modify +// The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// The go-expanse library is distributed in the hope that it will be useful, +// The go-ethereum library 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-expanse library. If not, see . +// along with the go-ethereum library. If not, see . // Contains the metrics collected by the fetcher. @@ -23,10 +23,24 @@ import ( ) var ( - announceMeter = metrics.NewMeter("exp/sync/RemoteAnnounces") - announceTimer = metrics.NewTimer("exp/sync/LocalAnnounces") - broadcastMeter = metrics.NewMeter("exp/sync/RemoteBroadcasts") - broadcastTimer = metrics.NewTimer("exp/sync/LocalBroadcasts") - discardMeter = metrics.NewMeter("exp/sync/DiscardedBlocks") - futureMeter = metrics.NewMeter("exp/sync/FutureBlocks") + propAnnounceInMeter = metrics.NewMeter("eth/fetcher/prop/announces/in") + propAnnounceOutTimer = metrics.NewTimer("eth/fetcher/prop/announces/out") + propAnnounceDropMeter = metrics.NewMeter("eth/fetcher/prop/announces/drop") + propAnnounceDOSMeter = metrics.NewMeter("eth/fetcher/prop/announces/dos") + + propBroadcastInMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/in") + propBroadcastOutTimer = metrics.NewTimer("eth/fetcher/prop/broadcasts/out") + propBroadcastDropMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/drop") + propBroadcastDOSMeter = metrics.NewMeter("eth/fetcher/prop/broadcasts/dos") + + blockFetchMeter = metrics.NewMeter("eth/fetcher/fetch/blocks") + headerFetchMeter = metrics.NewMeter("eth/fetcher/fetch/headers") + bodyFetchMeter = metrics.NewMeter("eth/fetcher/fetch/bodies") + + blockFilterInMeter = metrics.NewMeter("eth/fetcher/filter/blocks/in") + blockFilterOutMeter = metrics.NewMeter("eth/fetcher/filter/blocks/out") + headerFilterInMeter = metrics.NewMeter("eth/fetcher/filter/headers/in") + headerFilterOutMeter = metrics.NewMeter("eth/fetcher/filter/headers/out") + bodyFilterInMeter = metrics.NewMeter("eth/fetcher/filter/bodies/in") + bodyFilterOutMeter = metrics.NewMeter("eth/fetcher/filter/bodies/out") ) diff --git a/exp/handler.go b/exp/handler.go index 19826a12c17a..7695b1b2507f 100644 --- a/exp/handler.go +++ b/exp/handler.go @@ -28,6 +28,7 @@ import ( "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/exp/downloader" "github.com/expanse-project/go-expanse/exp/fetcher" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" @@ -36,10 +37,10 @@ import ( "github.com/expanse-project/go-expanse/rlp" ) -// This is the target maximum size of returned blocks for the -// getBlocks message. The reply message may exceed it -// if a single block is larger than the limit. -const maxBlockRespSize = 2 * 1024 * 1024 +const ( + softResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data. + estHeaderRlpSize = 500 // Approximate size of an RLP encoded block header +) func errResp(code errCode, format string, v ...interface{}) error { return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) @@ -59,12 +60,13 @@ func (ep extProt) GetHashes(hash common.Hash) error { return ep.getHashes(has func (ep extProt) GetBlock(hashes []common.Hash) error { return ep.getBlocks(hashes) } type ProtocolManager struct { - protVer, netId int - txpool txPool - chainman *core.ChainManager - downloader *downloader.Downloader - fetcher *fetcher.Fetcher - peers *peerSet + txpool txPool + chainman *core.ChainManager + chaindb ethdb.Database + + downloader *downloader.Downloader + fetcher *fetcher.Fetcher + peers *peerSet SubProtocols []p2p.Protocol @@ -83,19 +85,19 @@ type ProtocolManager struct { quit bool } -// NewProtocolManager returns a new expanse sub protocol manager. The Expanse sub protocol manages peers capable -// with the expanse network. -func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager) *ProtocolManager { +// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable +// with the ethereum network. +func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager, chaindb ethdb.Database) *ProtocolManager { // Create the protocol manager with the base fields manager := &ProtocolManager{ eventMux: mux, txpool: txpool, chainman: chainman, + chaindb: chaindb, peers: newPeerSet(), newPeerCh: make(chan *peer, 1), txsyncCh: make(chan *txsync), quitSync: make(chan struct{}), - netId: networkId, } // Initiate a sub-protocol for every implemented version we can handle manager.SubProtocols = make([]p2p.Protocol, len(ProtocolVersions)) @@ -114,10 +116,10 @@ func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow po } } // Construct the different synchronisation mechanisms - manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.CurrentBlock, manager.chainman.InsertChain, manager.removePeer) + manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.CurrentBlock, manager.chainman.GetTd, manager.chainman.InsertChain, manager.removePeer) validator := func(block *types.Block, parent *types.Block) error { - return core.ValidateHeader(pow, block.Header(), parent, true, false) + return core.ValidateHeader(pow, block.Header(), parent.Header(), true, false) } heighter := func() uint64 { return manager.chainman.CurrentBlock().NumberU64() @@ -176,7 +178,7 @@ func (pm *ProtocolManager) Stop() { } func (pm *ProtocolManager) newPeer(pv, nv int, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { - return newPeer(pv, nv, p, rw) + return newPeer(pv, nv, p, newMeteredMsgWriter(rw)) } // handle is the callback invoked to manage the life cycle of an exp peer. When @@ -190,6 +192,9 @@ func (pm *ProtocolManager) handle(p *peer) error { glog.V(logger.Debug).Infof("%v: handshake failed: %v", p, err) return err } + if rw, ok := p.rw.(*meteredMsgReadWriter); ok { + rw.Init(p.version) + } // Register the peer locally glog.V(logger.Detail).Infof("%v: adding peer", p) if err := pm.peers.Register(p); err != nil { @@ -199,7 +204,9 @@ func (pm *ProtocolManager) handle(p *peer) error { defer pm.removePeer(p.id) // Register the peer in the downloader. If the downloader considers it banned, we disconnect - if err := pm.downloader.RegisterPeer(p.id, p.version, p.Head(), p.RequestHashes, p.RequestHashesFromNumber, p.RequestBlocks); err != nil { + if err := pm.downloader.RegisterPeer(p.id, p.version, p.Head(), + p.RequestHashes, p.RequestHashesFromNumber, p.RequestBlocks, + p.RequestHeadersByHash, p.RequestHeadersByNumber, p.RequestBodies); err != nil { return err } // Propagate existing transactions. new transactions appearing @@ -230,12 +237,12 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { defer msg.Discard() // Handle the message depending on its contents - switch msg.Code { - case StatusMsg: + switch { + case msg.Code == StatusMsg: // Status messages should never arrive after the handshake return errResp(ErrExtraStatusMsg, "uncontrolled status message") - case GetBlockHashesMsg: + case p.version < eth62 && msg.Code == GetBlockHashesMsg: // Retrieve the number of hashes to return and from which origin hash var request getBlockHashesData if err := msg.Decode(&request); err != nil { @@ -251,7 +258,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } return p.SendBlockHashes(hashes) - case GetBlockHashesFromNumberMsg: + case p.version < eth62 && msg.Code == GetBlockHashesFromNumberMsg: // Retrieve and decode the number of hashes to return and from which origin number var request getBlockHashesFromNumberData if err := msg.Decode(&request); err != nil { @@ -278,24 +285,19 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } return p.SendBlockHashes(hashes) - case BlockHashesMsg: + case p.version < eth62 && msg.Code == BlockHashesMsg: // A batch of hashes arrived to one of our previous requests - msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) - reqHashInPacketsMeter.Mark(1) - var hashes []common.Hash - if err := msgStream.Decode(&hashes); err != nil { + if err := msg.Decode(&hashes); err != nil { break } - reqHashInTrafficMeter.Mark(int64(32 * len(hashes))) - // Deliver them all to the downloader for queuing - err := pm.downloader.DeliverHashes(p.id, hashes) + err := pm.downloader.DeliverHashes61(p.id, hashes) if err != nil { glog.V(logger.Debug).Infoln(err) } - case GetBlocksMsg: + case p.version < eth62 && msg.Code == GetBlocksMsg: // Decode the retrieval message msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) if _, err := msgStream.List(); err != nil { @@ -305,94 +307,279 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { var ( hash common.Hash bytes common.StorageSize - hashes []common.Hash blocks []*types.Block ) - for { + for len(blocks) < downloader.MaxBlockFetch && bytes < softResponseLimit { + //Retrieve the hash of the next block err := msgStream.Decode(&hash) if err == rlp.EOL { break } else if err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - hashes = append(hashes, hash) - // Retrieve the requested block, stopping if enough was found if block := pm.chainman.GetBlock(hash); block != nil { blocks = append(blocks, block) bytes += block.Size() - if len(blocks) >= downloader.MaxBlockFetch || bytes > maxBlockRespSize { - break - } - } - } - if glog.V(logger.Detail) && len(blocks) == 0 && len(hashes) > 0 { - list := "[" - for _, hash := range hashes { - list += fmt.Sprintf("%x, ", hash[:4]) } - list = list[:len(list)-2] + "]" - - glog.Infof("%v: no blocks found for requested hashes %s", p, list) } return p.SendBlocks(blocks) - case BlocksMsg: + case p.version < eth62 && msg.Code == BlocksMsg: // Decode the arrived block message - msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) - reqBlockInPacketsMeter.Mark(1) - var blocks []*types.Block - if err := msgStream.Decode(&blocks); err != nil { + if err := msg.Decode(&blocks); err != nil { glog.V(logger.Detail).Infoln("Decode error", err) blocks = nil } // Update the receive timestamp of each block for _, block := range blocks { - reqBlockInTrafficMeter.Mark(block.Size().Int64()) block.ReceivedAt = msg.ReceivedAt } // Filter out any explicitly requested blocks, deliver the rest to the downloader - if blocks := pm.fetcher.Filter(blocks); len(blocks) > 0 { - pm.downloader.DeliverBlocks(p.id, blocks) + if blocks := pm.fetcher.FilterBlocks(blocks); len(blocks) > 0 { + pm.downloader.DeliverBlocks61(p.id, blocks) } - case NewBlockHashesMsg: - // Retrieve and deseralize the remote new block hashes notification + // Block header query, collect the requested headers and reply + case p.version >= eth62 && msg.Code == GetBlockHeadersMsg: + // Decode the complex header query + var query getBlockHeadersData + if err := msg.Decode(&query); err != nil { + return errResp(ErrDecode, "%v: %v", msg, err) + } + // Gather headers until the fetch or network limits is reached + var ( + bytes common.StorageSize + headers []*types.Header + unknown bool + ) + for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit && len(headers) < downloader.MaxHeaderFetch { + // Retrieve the next header satisfying the query + var origin *types.Header + if query.Origin.Hash != (common.Hash{}) { + origin = pm.chainman.GetHeader(query.Origin.Hash) + } else { + origin = pm.chainman.GetHeaderByNumber(query.Origin.Number) + } + if origin == nil { + break + } + headers = append(headers, origin) + bytes += estHeaderRlpSize + + // Advance to the next header of the query + switch { + case query.Origin.Hash != (common.Hash{}) && query.Reverse: + // Hash based traversal towards the genesis block + for i := 0; i < int(query.Skip)+1; i++ { + if header := pm.chainman.GetHeader(query.Origin.Hash); header != nil { + query.Origin.Hash = header.ParentHash + } else { + unknown = true + break + } + } + case query.Origin.Hash != (common.Hash{}) && !query.Reverse: + // Hash based traversal towards the leaf block + if header := pm.chainman.GetHeaderByNumber(origin.Number.Uint64() + query.Skip + 1); header != nil { + if pm.chainman.GetBlockHashesFromHash(header.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash { + query.Origin.Hash = header.Hash() + } else { + unknown = true + } + } else { + unknown = true + } + case query.Reverse: + // Number based traversal towards the genesis block + if query.Origin.Number >= query.Skip+1 { + query.Origin.Number -= (query.Skip + 1) + } else { + unknown = true + } + + case !query.Reverse: + // Number based traversal towards the leaf block + query.Origin.Number += (query.Skip + 1) + } + } + return p.SendBlockHeaders(headers) + + case p.version >= eth62 && msg.Code == BlockHeadersMsg: + // A batch of headers arrived to one of our previous requests + var headers []*types.Header + if err := msg.Decode(&headers); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Filter out any explicitly requested headers, deliver the rest to the downloader + filter := len(headers) == 1 + if filter { + headers = pm.fetcher.FilterHeaders(headers, time.Now()) + } + if len(headers) > 0 || !filter { + err := pm.downloader.DeliverHeaders(p.id, headers) + if err != nil { + glog.V(logger.Debug).Infoln(err) + } + } + + case p.version >= eth62 && msg.Code == BlockBodiesMsg: + // A batch of block bodies arrived to one of our previous requests + var request blockBodiesData + if err := msg.Decode(&request); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Deliver them all to the downloader for queuing + trasactions := make([][]*types.Transaction, len(request)) + uncles := make([][]*types.Header, len(request)) + + for i, body := range request { + trasactions[i] = body.Transactions + uncles[i] = body.Uncles + } + // Filter out any explicitly requested bodies, deliver the rest to the downloader + if trasactions, uncles := pm.fetcher.FilterBodies(trasactions, uncles, time.Now()); len(trasactions) > 0 || len(uncles) > 0 { + err := pm.downloader.DeliverBodies(p.id, trasactions, uncles) + if err != nil { + glog.V(logger.Debug).Infoln(err) + } + } + + case p.version >= eth62 && msg.Code == GetBlockBodiesMsg: + // Decode the retrieval message msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) + if _, err := msgStream.List(); err != nil { + return err + } + // Gather blocks until the fetch or network limits is reached + var ( + hash common.Hash + bytes int + bodies []rlp.RawValue + ) + for bytes < softResponseLimit && len(bodies) < downloader.MaxBlockFetch { + // Retrieve the hash of the next block + if err := msgStream.Decode(&hash); err == rlp.EOL { + break + } else if err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Retrieve the requested block body, stopping if enough was found + if data := pm.chainman.GetBodyRLP(hash); len(data) != 0 { + bodies = append(bodies, data) + bytes += len(data) + } + } + return p.SendBlockBodiesRLP(bodies) - var hashes []common.Hash - if err := msgStream.Decode(&hashes); err != nil { - break + case p.version >= eth63 && msg.Code == GetNodeDataMsg: + // Decode the retrieval message + msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) + if _, err := msgStream.List(); err != nil { + return err + } + // Gather state data until the fetch or network limits is reached + var ( + hash common.Hash + bytes int + data [][]byte + ) + for bytes < softResponseLimit && len(data) < downloader.MaxStateFetch { + // Retrieve the hash of the next state entry + if err := msgStream.Decode(&hash); err == rlp.EOL { + break + } else if err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Retrieve the requested state entry, stopping if enough was found + if entry, err := pm.chaindb.Get(hash.Bytes()); err == nil { + data = append(data, entry) + bytes += len(entry) + } } - propHashInPacketsMeter.Mark(1) - propHashInTrafficMeter.Mark(int64(32 * len(hashes))) + return p.SendNodeData(data) + case p.version >= eth63 && msg.Code == GetReceiptsMsg: + // Decode the retrieval message + msgStream := rlp.NewStream(msg.Payload, uint64(msg.Size)) + if _, err := msgStream.List(); err != nil { + return err + } + // Gather state data until the fetch or network limits is reached + var ( + hash common.Hash + bytes int + receipts []*types.Receipt + ) + for bytes < softResponseLimit && len(receipts) < downloader.MaxReceiptsFetch { + // Retrieve the hash of the next transaction receipt + if err := msgStream.Decode(&hash); err == rlp.EOL { + break + } else if err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Retrieve the requested receipt, stopping if enough was found + if receipt := core.GetReceipt(pm.chaindb, hash); receipt != nil { + receipts = append(receipts, receipt) + bytes += len(receipt.RlpEncode()) + } + } + return p.SendReceipts(receipts) + + case msg.Code == NewBlockHashesMsg: + // Retrieve and deseralize the remote new block hashes notification + type announce struct { + Hash common.Hash + Number uint64 + } + var announces = []announce{} + + if p.version < eth62 { + // We're running the old protocol, make block number unknown (0) + var hashes []common.Hash + if err := msg.Decode(&hashes); err != nil { + return errResp(ErrDecode, "%v: %v", msg, err) + } + for _, hash := range hashes { + announces = append(announces, announce{hash, 0}) + } + } else { + // Otherwise extract both block hash and number + var request newBlockHashesData + if err := msg.Decode(&request); err != nil { + return errResp(ErrDecode, "%v: %v", msg, err) + } + for _, block := range request { + announces = append(announces, announce{block.Hash, block.Number}) + } + } // Mark the hashes as present at the remote node - for _, hash := range hashes { - p.MarkBlock(hash) - p.SetHead(hash) + for _, block := range announces { + p.MarkBlock(block.Hash) + p.SetHead(block.Hash) } // Schedule all the unknown hashes for retrieval - unknown := make([]common.Hash, 0, len(hashes)) - for _, hash := range hashes { - if !pm.chainman.HasBlock(hash) { - unknown = append(unknown, hash) + unknown := make([]announce, 0, len(announces)) + for _, block := range announces { + if !pm.chainman.HasBlock(block.Hash) { + unknown = append(unknown, block) } } - for _, hash := range unknown { - pm.fetcher.Notify(p.id, hash, time.Now(), p.RequestBlocks) + for _, block := range unknown { + if p.version < eth62 { + pm.fetcher.Notify(p.id, block.Hash, block.Number, time.Now(), p.RequestBlocks, nil, nil) + } else { + pm.fetcher.Notify(p.id, block.Hash, block.Number, time.Now(), nil, p.RequestOneHeader, p.RequestBodies) + } } - case NewBlockMsg: + case msg.Code == NewBlockMsg: // Retrieve and decode the propagated block var request newBlockData if err := msg.Decode(&request); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } - propBlockInPacketsMeter.Mark(1) - propBlockInTrafficMeter.Mark(request.Block.Size().Int64()) - if err := request.Block.ValidateFields(); err != nil { return errResp(ErrDecode, "block validation %v: %v", msg, err) } @@ -421,13 +608,12 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } } - case TxMsg: + case msg.Code == TxMsg: // Transactions arrived, parse all of them and deliver to the pool var txs []*types.Transaction if err := msg.Decode(&txs); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - propTxnInPacketsMeter.Mark(1) for i, tx := range txs { // Validate and mark the remote transaction if tx == nil { @@ -436,7 +622,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { p.MarkTransaction(tx.Hash()) // Log it's arrival for later analysis - propTxnInTrafficMeter.Mark(tx.Size().Int64()) jsonlogger.LogJson(&logger.EthTxReceived{ TxHash: tx.Hash().Hex(), RemoteId: p.ID().String(), @@ -461,7 +646,7 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) { // Calculate the TD of the block (it's not imported yet, so block.Td is not valid) var td *big.Int if parent := pm.chainman.GetBlock(block.ParentHash()); parent != nil { - td = new(big.Int).Add(parent.Td, block.Difficulty()) + td = new(big.Int).Add(block.Difficulty(), pm.chainman.GetTd(block.ParentHash())) } else { glog.V(logger.Error).Infof("propagating dangling block #%d [%x]", block.NumberU64(), hash[:4]) return @@ -476,7 +661,11 @@ func (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) { // Otherwise if the block is indeed in out own chain, announce it if pm.chainman.HasBlock(hash) { for _, peer := range peers { - peer.SendNewBlockHashes([]common.Hash{hash}) + if peer.version < eth62 { + peer.SendNewBlockHashes61([]common.Hash{hash}) + } else { + peer.SendNewBlockHashes([]common.Hash{hash}, []uint64{block.NumberU64()}) + } } glog.V(logger.Detail).Infof("announced block %x to %d peers in %v", hash[:4], len(peers), time.Since(block.ReceivedAt)) } diff --git a/exp/handler_test.go b/exp/handler_test.go new file mode 100644 index 000000000000..6d1253972622 --- /dev/null +++ b/exp/handler_test.go @@ -0,0 +1,522 @@ +package exp + +import ( + "fmt" + "math/big" + "math/rand" + "testing" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/state" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/exp/downloader" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/params" +) + +// Tests that hashes can be retrieved from a remote chain by hashes in reverse +// order. +func TestGetBlockHashes61(t *testing.T) { testGetBlockHashes(t, 61) } + +func testGetBlockHashes(t *testing.T, protocol int) { + pm := newTestProtocolManager(downloader.MaxHashFetch+15, nil, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Create a batch of tests for various scenarios + limit := downloader.MaxHashFetch + tests := []struct { + origin common.Hash + number int + result int + }{ + {common.Hash{}, 1, 0}, // Make sure non existent hashes don't return results + {pm.chainman.Genesis().Hash(), 1, 0}, // There are no hashes to retrieve up from the genesis + {pm.chainman.GetBlockByNumber(5).Hash(), 5, 5}, // All the hashes including the genesis requested + {pm.chainman.GetBlockByNumber(5).Hash(), 10, 5}, // More hashes than available till the genesis requested + {pm.chainman.GetBlockByNumber(100).Hash(), 10, 10}, // All hashes available from the middle of the chain + {pm.chainman.CurrentBlock().Hash(), 10, 10}, // All hashes available from the head of the chain + {pm.chainman.CurrentBlock().Hash(), limit, limit}, // Request the maximum allowed hash count + {pm.chainman.CurrentBlock().Hash(), limit + 1, limit}, // Request more than the maximum allowed hash count + } + // Run each of the tests and verify the results against the chain + for i, tt := range tests { + // Assemble the hash response we would like to receive + resp := make([]common.Hash, tt.result) + if len(resp) > 0 { + from := pm.chainman.GetBlock(tt.origin).NumberU64() - 1 + for j := 0; j < len(resp); j++ { + resp[j] = pm.chainman.GetBlockByNumber(uint64(int(from) - j)).Hash() + } + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x03, getBlockHashesData{tt.origin, uint64(tt.number)}) + if err := p2p.ExpectMsg(peer.app, 0x04, resp); err != nil { + t.Errorf("test %d: block hashes mismatch: %v", i, err) + } + } +} + +// Tests that hashes can be retrieved from a remote chain by numbers in forward +// order. +func TestGetBlockHashesFromNumber61(t *testing.T) { testGetBlockHashesFromNumber(t, 61) } + +func testGetBlockHashesFromNumber(t *testing.T, protocol int) { + pm := newTestProtocolManager(downloader.MaxHashFetch+15, nil, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Create a batch of tests for various scenarios + limit := downloader.MaxHashFetch + tests := []struct { + origin uint64 + number int + result int + }{ + {pm.chainman.CurrentBlock().NumberU64() + 1, 1, 0}, // Out of bounds requests should return empty + {pm.chainman.CurrentBlock().NumberU64(), 1, 1}, // Make sure the head hash can be retrieved + {pm.chainman.CurrentBlock().NumberU64() - 4, 5, 5}, // All hashes, including the head hash requested + {pm.chainman.CurrentBlock().NumberU64() - 4, 10, 5}, // More hashes requested than available till the head + {pm.chainman.CurrentBlock().NumberU64() - 100, 10, 10}, // All hashes available from the middle of the chain + {0, 10, 10}, // All hashes available from the root of the chain + {0, limit, limit}, // Request the maximum allowed hash count + {0, limit + 1, limit}, // Request more than the maximum allowed hash count + {0, 1, 1}, // Make sure the genesis hash can be retrieved + } + // Run each of the tests and verify the results against the chain + for i, tt := range tests { + // Assemble the hash response we would like to receive + resp := make([]common.Hash, tt.result) + for j := 0; j < len(resp); j++ { + resp[j] = pm.chainman.GetBlockByNumber(tt.origin + uint64(j)).Hash() + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x08, getBlockHashesFromNumberData{tt.origin, uint64(tt.number)}) + if err := p2p.ExpectMsg(peer.app, 0x04, resp); err != nil { + t.Errorf("test %d: block hashes mismatch: %v", i, err) + } + } +} + +// Tests that blocks can be retrieved from a remote chain based on their hashes. +func TestGetBlocks61(t *testing.T) { testGetBlocks(t, 61) } + +func testGetBlocks(t *testing.T, protocol int) { + pm := newTestProtocolManager(downloader.MaxHashFetch+15, nil, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Create a batch of tests for various scenarios + limit := downloader.MaxBlockFetch + tests := []struct { + random int // Number of blocks to fetch randomly from the chain + explicit []common.Hash // Explicitly requested blocks + available []bool // Availability of explicitly requested blocks + expected int // Total number of existing blocks to expect + }{ + {1, nil, nil, 1}, // A single random block should be retrievable + {10, nil, nil, 10}, // Multiple random blocks should be retrievable + {limit, nil, nil, limit}, // The maximum possible blocks should be retrievable + {limit + 1, nil, nil, limit}, // No more that the possible block count should be returned + {0, []common.Hash{pm.chainman.Genesis().Hash()}, []bool{true}, 1}, // The genesis block should be retrievable + {0, []common.Hash{pm.chainman.CurrentBlock().Hash()}, []bool{true}, 1}, // The chains head block should be retrievable + {0, []common.Hash{common.Hash{}}, []bool{false}, 0}, // A non existent block should not be returned + + // Existing and non-existing blocks interleaved should not cause problems + {0, []common.Hash{ + common.Hash{}, + pm.chainman.GetBlockByNumber(1).Hash(), + common.Hash{}, + pm.chainman.GetBlockByNumber(10).Hash(), + common.Hash{}, + pm.chainman.GetBlockByNumber(100).Hash(), + common.Hash{}, + }, []bool{false, true, false, true, false, true, false}, 3}, + } + // Run each of the tests and verify the results against the chain + for i, tt := range tests { + // Collect the hashes to request, and the response to expect + hashes, seen := []common.Hash{}, make(map[int64]bool) + blocks := []*types.Block{} + + for j := 0; j < tt.random; j++ { + for { + num := rand.Int63n(int64(pm.chainman.CurrentBlock().NumberU64())) + if !seen[num] { + seen[num] = true + + block := pm.chainman.GetBlockByNumber(uint64(num)) + hashes = append(hashes, block.Hash()) + if len(blocks) < tt.expected { + blocks = append(blocks, block) + } + break + } + } + } + for j, hash := range tt.explicit { + hashes = append(hashes, hash) + if tt.available[j] && len(blocks) < tt.expected { + blocks = append(blocks, pm.chainman.GetBlock(hash)) + } + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x05, hashes) + if err := p2p.ExpectMsg(peer.app, 0x06, blocks); err != nil { + t.Errorf("test %d: blocks mismatch: %v", i, err) + } + } +} + +// Tests that block headers can be retrieved from a remote chain based on user queries. +func TestGetBlockHeaders62(t *testing.T) { testGetBlockHeaders(t, 62) } +func TestGetBlockHeaders63(t *testing.T) { testGetBlockHeaders(t, 63) } +func TestGetBlockHeaders64(t *testing.T) { testGetBlockHeaders(t, 64) } + +func testGetBlockHeaders(t *testing.T, protocol int) { + pm := newTestProtocolManager(downloader.MaxHashFetch+15, nil, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Create a "random" unknown hash for testing + var unknown common.Hash + for i, _ := range unknown { + unknown[i] = byte(i) + } + // Create a batch of tests for various scenarios + limit := uint64(downloader.MaxHeaderFetch) + tests := []struct { + query *getBlockHeadersData // The query to execute for header retrieval + expect []common.Hash // The hashes of the block whose headers are expected + }{ + // A single random block should be retrievable by hash and number too + { + &getBlockHeadersData{Origin: hashOrNumber{Hash: pm.chainman.GetBlockByNumber(limit / 2).Hash()}, Amount: 1}, + []common.Hash{pm.chainman.GetBlockByNumber(limit / 2).Hash()}, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 1}, + []common.Hash{pm.chainman.GetBlockByNumber(limit / 2).Hash()}, + }, + // Multiple headers should be retrievable in both directions + { + &getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3}, + []common.Hash{ + pm.chainman.GetBlockByNumber(limit / 2).Hash(), + pm.chainman.GetBlockByNumber(limit/2 + 1).Hash(), + pm.chainman.GetBlockByNumber(limit/2 + 2).Hash(), + }, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Amount: 3, Reverse: true}, + []common.Hash{ + pm.chainman.GetBlockByNumber(limit / 2).Hash(), + pm.chainman.GetBlockByNumber(limit/2 - 1).Hash(), + pm.chainman.GetBlockByNumber(limit/2 - 2).Hash(), + }, + }, + // Multiple headers with skip lists should be retrievable + { + &getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3}, + []common.Hash{ + pm.chainman.GetBlockByNumber(limit / 2).Hash(), + pm.chainman.GetBlockByNumber(limit/2 + 4).Hash(), + pm.chainman.GetBlockByNumber(limit/2 + 8).Hash(), + }, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3, Reverse: true}, + []common.Hash{ + pm.chainman.GetBlockByNumber(limit / 2).Hash(), + pm.chainman.GetBlockByNumber(limit/2 - 4).Hash(), + pm.chainman.GetBlockByNumber(limit/2 - 8).Hash(), + }, + }, + // The chain endpoints should be retrievable + { + &getBlockHeadersData{Origin: hashOrNumber{Number: 0}, Amount: 1}, + []common.Hash{pm.chainman.GetBlockByNumber(0).Hash()}, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: pm.chainman.CurrentBlock().NumberU64()}, Amount: 1}, + []common.Hash{pm.chainman.CurrentBlock().Hash()}, + }, + // Ensure protocol limits are honored + { + &getBlockHeadersData{Origin: hashOrNumber{Number: pm.chainman.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true}, + pm.chainman.GetBlockHashesFromHash(pm.chainman.CurrentBlock().Hash(), limit), + }, + // Check that requesting more than available is handled gracefully + { + &getBlockHeadersData{Origin: hashOrNumber{Number: pm.chainman.CurrentBlock().NumberU64() - 4}, Skip: 3, Amount: 3}, + []common.Hash{ + pm.chainman.GetBlockByNumber(pm.chainman.CurrentBlock().NumberU64() - 4).Hash(), + pm.chainman.GetBlockByNumber(pm.chainman.CurrentBlock().NumberU64()).Hash(), + }, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 3, Amount: 3, Reverse: true}, + []common.Hash{ + pm.chainman.GetBlockByNumber(4).Hash(), + pm.chainman.GetBlockByNumber(0).Hash(), + }, + }, + // Check that requesting more than available is handled gracefully, even if mid skip + { + &getBlockHeadersData{Origin: hashOrNumber{Number: pm.chainman.CurrentBlock().NumberU64() - 4}, Skip: 2, Amount: 3}, + []common.Hash{ + pm.chainman.GetBlockByNumber(pm.chainman.CurrentBlock().NumberU64() - 4).Hash(), + pm.chainman.GetBlockByNumber(pm.chainman.CurrentBlock().NumberU64() - 1).Hash(), + }, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: 4}, Skip: 2, Amount: 3, Reverse: true}, + []common.Hash{ + pm.chainman.GetBlockByNumber(4).Hash(), + pm.chainman.GetBlockByNumber(1).Hash(), + }, + }, + // Check that non existing headers aren't returned + { + &getBlockHeadersData{Origin: hashOrNumber{Hash: unknown}, Amount: 1}, + []common.Hash{}, + }, { + &getBlockHeadersData{Origin: hashOrNumber{Number: pm.chainman.CurrentBlock().NumberU64() + 1}, Amount: 1}, + []common.Hash{}, + }, + } + // Run each of the tests and verify the results against the chain + for i, tt := range tests { + // Collect the headers to expect in the response + headers := []*types.Header{} + for _, hash := range tt.expect { + headers = append(headers, pm.chainman.GetBlock(hash).Header()) + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x03, tt.query) + if err := p2p.ExpectMsg(peer.app, 0x04, headers); err != nil { + t.Errorf("test %d: headers mismatch: %v", i, err) + } + } +} + +// Tests that block contents can be retrieved from a remote chain based on their hashes. +func TestGetBlockBodies62(t *testing.T) { testGetBlockBodies(t, 62) } +func TestGetBlockBodies63(t *testing.T) { testGetBlockBodies(t, 63) } +func TestGetBlockBodies64(t *testing.T) { testGetBlockBodies(t, 64) } + +func testGetBlockBodies(t *testing.T, protocol int) { + pm := newTestProtocolManager(downloader.MaxBlockFetch+15, nil, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Create a batch of tests for various scenarios + limit := downloader.MaxBlockFetch + tests := []struct { + random int // Number of blocks to fetch randomly from the chain + explicit []common.Hash // Explicitly requested blocks + available []bool // Availability of explicitly requested blocks + expected int // Total number of existing blocks to expect + }{ + {1, nil, nil, 1}, // A single random block should be retrievable + {10, nil, nil, 10}, // Multiple random blocks should be retrievable + {limit, nil, nil, limit}, // The maximum possible blocks should be retrievable + {limit + 1, nil, nil, limit}, // No more that the possible block count should be returned + {0, []common.Hash{pm.chainman.Genesis().Hash()}, []bool{true}, 1}, // The genesis block should be retrievable + {0, []common.Hash{pm.chainman.CurrentBlock().Hash()}, []bool{true}, 1}, // The chains head block should be retrievable + {0, []common.Hash{common.Hash{}}, []bool{false}, 0}, // A non existent block should not be returned + + // Existing and non-existing blocks interleaved should not cause problems + {0, []common.Hash{ + common.Hash{}, + pm.chainman.GetBlockByNumber(1).Hash(), + common.Hash{}, + pm.chainman.GetBlockByNumber(10).Hash(), + common.Hash{}, + pm.chainman.GetBlockByNumber(100).Hash(), + common.Hash{}, + }, []bool{false, true, false, true, false, true, false}, 3}, + } + // Run each of the tests and verify the results against the chain + for i, tt := range tests { + // Collect the hashes to request, and the response to expect + hashes, seen := []common.Hash{}, make(map[int64]bool) + bodies := []*blockBody{} + + for j := 0; j < tt.random; j++ { + for { + num := rand.Int63n(int64(pm.chainman.CurrentBlock().NumberU64())) + if !seen[num] { + seen[num] = true + + block := pm.chainman.GetBlockByNumber(uint64(num)) + hashes = append(hashes, block.Hash()) + if len(bodies) < tt.expected { + bodies = append(bodies, &blockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) + } + break + } + } + } + for j, hash := range tt.explicit { + hashes = append(hashes, hash) + if tt.available[j] && len(bodies) < tt.expected { + block := pm.chainman.GetBlock(hash) + bodies = append(bodies, &blockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) + } + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x05, hashes) + if err := p2p.ExpectMsg(peer.app, 0x06, bodies); err != nil { + t.Errorf("test %d: bodies mismatch: %v", i, err) + } + } +} + +// Tests that the node state database can be retrieved based on hashes. +func TestGetNodeData63(t *testing.T) { testGetNodeData(t, 63) } +func TestGetNodeData64(t *testing.T) { testGetNodeData(t, 64) } + +func testGetNodeData(t *testing.T, protocol int) { + // Define three accounts to simulate transactions with + acc1Key, _ := crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") + acc2Key, _ := crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") + acc1Addr := crypto.PubkeyToAddress(acc1Key.PublicKey) + acc2Addr := crypto.PubkeyToAddress(acc2Key.PublicKey) + + // Create a chain generator with some simple transactions (blatantly stolen from @fjl/chain_makerts_test) + generator := func(i int, block *core.BlockGen) { + switch i { + case 0: + // In block 1, the test bank sends account #1 some ether. + tx, _ := types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil).SignECDSA(testBankKey) + block.AddTx(tx) + case 1: + // In block 2, the test bank sends some more ether to account #1. + // acc1Addr passes it on to account #2. + tx1, _ := types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(testBankKey) + tx2, _ := types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(acc1Key) + block.AddTx(tx1) + block.AddTx(tx2) + case 2: + // Block 3 is empty but was mined by account #2. + block.SetCoinbase(acc2Addr) + block.SetExtra([]byte("yeehaw")) + case 3: + // Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data). + b2 := block.PrevBlock(1).Header() + b2.Extra = []byte("foo") + block.AddUncle(b2) + b3 := block.PrevBlock(2).Header() + b3.Extra = []byte("foo") + block.AddUncle(b3) + } + } + // Assemble the test environment + pm := newTestProtocolManager(4, generator, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Fetch for now the entire chain db + hashes := []common.Hash{} + for _, key := range pm.chaindb.(*ethdb.MemDatabase).Keys() { + hashes = append(hashes, common.BytesToHash(key)) + } + p2p.Send(peer.app, 0x0d, hashes) + msg, err := peer.app.ReadMsg() + if err != nil { + t.Fatalf("failed to read node data response: %v", err) + } + if msg.Code != 0x0e { + t.Fatalf("response packet code mismatch: have %x, want %x", msg.Code, 0x0c) + } + var data [][]byte + if err := msg.Decode(&data); err != nil { + t.Fatalf("failed to decode response node data: %v", err) + } + // Verify that all hashes correspond to the requested data, and reconstruct a state tree + for i, want := range hashes { + if hash := crypto.Sha3Hash(data[i]); hash != want { + fmt.Errorf("data hash mismatch: have %x, want %x", hash, want) + } + } + statedb, _ := ethdb.NewMemDatabase() + for i := 0; i < len(data); i++ { + statedb.Put(hashes[i].Bytes(), data[i]) + } + accounts := []common.Address{testBankAddress, acc1Addr, acc2Addr} + for i := uint64(0); i <= pm.chainman.CurrentBlock().NumberU64(); i++ { + trie := state.New(pm.chainman.GetBlockByNumber(i).Root(), statedb) + + for j, acc := range accounts { + bw := pm.chainman.State().GetBalance(acc) + bh := trie.GetBalance(acc) + + if (bw != nil && bh == nil) || (bw == nil && bh != nil) { + t.Errorf("test %d, account %d: balance mismatch: have %v, want %v", i, j, bh, bw) + } + if bw != nil && bh != nil && bw.Cmp(bw) != 0 { + t.Errorf("test %d, account %d: balance mismatch: have %v, want %v", i, j, bh, bw) + } + } + } +} + +// Tests that the transaction receipts can be retrieved based on hashes. +func TestGetReceipt63(t *testing.T) { testGetReceipt(t, 63) } +func TestGetReceipt64(t *testing.T) { testGetReceipt(t, 64) } + +func testGetReceipt(t *testing.T, protocol int) { + // Define three accounts to simulate transactions with + acc1Key, _ := crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") + acc2Key, _ := crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") + acc1Addr := crypto.PubkeyToAddress(acc1Key.PublicKey) + acc2Addr := crypto.PubkeyToAddress(acc2Key.PublicKey) + + // Create a chain generator with some simple transactions (blatantly stolen from @fjl/chain_makerts_test) + generator := func(i int, block *core.BlockGen) { + switch i { + case 0: + // In block 1, the test bank sends account #1 some ether. + tx, _ := types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil).SignECDSA(testBankKey) + block.AddTx(tx) + case 1: + // In block 2, the test bank sends some more ether to account #1. + // acc1Addr passes it on to account #2. + tx1, _ := types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(testBankKey) + tx2, _ := types.NewTransaction(block.TxNonce(acc1Addr), acc2Addr, big.NewInt(1000), params.TxGas, nil, nil).SignECDSA(acc1Key) + block.AddTx(tx1) + block.AddTx(tx2) + case 2: + // Block 3 is empty but was mined by account #2. + block.SetCoinbase(acc2Addr) + block.SetExtra([]byte("yeehaw")) + case 3: + // Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data). + b2 := block.PrevBlock(1).Header() + b2.Extra = []byte("foo") + block.AddUncle(b2) + b3 := block.PrevBlock(2).Header() + b3.Extra = []byte("foo") + block.AddUncle(b3) + } + } + // Assemble the test environment + pm := newTestProtocolManager(4, generator, nil) + peer, _ := newTestPeer("peer", protocol, pm, true) + defer peer.close() + + // Collect the hashes to request, and the response to expect + hashes := []common.Hash{} + for i := uint64(0); i <= pm.chainman.CurrentBlock().NumberU64(); i++ { + for _, tx := range pm.chainman.GetBlockByNumber(i).Transactions() { + hashes = append(hashes, tx.Hash()) + } + } + receipts := make([]*types.Receipt, len(hashes)) + for i, hash := range hashes { + receipts[i] = core.GetReceipt(pm.chaindb, hash) + } + // Send the hash request and verify the response + p2p.Send(peer.app, 0x0f, hashes) + if err := p2p.ExpectMsg(peer.app, 0x10, receipts); err != nil { + t.Errorf("receipts mismatch: %v", err) + } +} diff --git a/exp/helper_test.go b/exp/helper_test.go new file mode 100644 index 000000000000..578c2020dcf7 --- /dev/null +++ b/exp/helper_test.go @@ -0,0 +1,147 @@ +// This file contains some shares testing functionality, common to multiple +// different files and modules being tested. + +package exp + +import ( + "crypto/rand" + "math/big" + "sync" + "testing" + + "github.com/expanse-project/go-expanse/common" + "github.com/expanse-project/go-expanse/core" + "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" + "github.com/expanse-project/go-expanse/event" + "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/p2p/discover" +) + +var ( + testBankKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) + testBankFunds = big.NewInt(1000000) +) + +// newTestProtocolManager creates a new protocol manager for testing purposes, +// with the given number of blocks already known, and potential notification +// channels for different events. +func newTestProtocolManager(blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) *ProtocolManager { + var ( + evmux = new(event.TypeMux) + pow = new(core.FakePow) + db, _ = ethdb.NewMemDatabase() + genesis = core.WriteGenesisBlockForTesting(db, core.GenesisAccount{testBankAddress, testBankFunds}) + chainman, _ = core.NewChainManager(db, pow, evmux) + blockproc = core.NewBlockProcessor(db, pow, chainman, evmux) + ) + chainman.SetProcessor(blockproc) + if _, err := chainman.InsertChain(core.GenerateChain(genesis, db, blocks, generator)); err != nil { + panic(err) + } + pm := NewProtocolManager(NetworkId, evmux, &testTxPool{added: newtx}, pow, chainman, db) + pm.Start() + return pm +} + +// testTxPool is a fake, helper transaction pool for testing purposes +type testTxPool struct { + pool []*types.Transaction // Collection of all transactions + added chan<- []*types.Transaction // Notification channel for new transactions + + lock sync.RWMutex // Protects the transaction pool +} + +// AddTransactions appends a batch of transactions to the pool, and notifies any +// listeners if the addition channel is non nil +func (p *testTxPool) AddTransactions(txs []*types.Transaction) { + p.lock.Lock() + defer p.lock.Unlock() + + p.pool = append(p.pool, txs...) + if p.added != nil { + p.added <- txs + } +} + +// GetTransactions returns all the transactions known to the pool +func (p *testTxPool) GetTransactions() types.Transactions { + p.lock.RLock() + defer p.lock.RUnlock() + + txs := make([]*types.Transaction, len(p.pool)) + copy(txs, p.pool) + + return txs +} + +// newTestTransaction create a new dummy transaction. +func newTestTransaction(from *crypto.Key, nonce uint64, datasize int) *types.Transaction { + tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), big.NewInt(100000), big.NewInt(0), make([]byte, datasize)) + tx, _ = tx.SignECDSA(from.PrivateKey) + + return tx +} + +// testPeer is a simulated peer to allow testing direct network calls. +type testPeer struct { + net p2p.MsgReadWriter // Network layer reader/writer to simulate remote messaging + app *p2p.MsgPipeRW // Application layer reader/writer to simulate the local side + *peer +} + +// newTestPeer creates a new peer registered at the given protocol manager. +func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*testPeer, <-chan error) { + // Create a message pipe to communicate through + app, net := p2p.MsgPipe() + + // Generate a random id and create the peer + var id discover.NodeID + rand.Read(id[:]) + + peer := pm.newPeer(version, NetworkId, p2p.NewPeer(id, name, nil), net) + + // Start the peer on a new thread + errc := make(chan error, 1) + go func() { + pm.newPeerCh <- peer + errc <- pm.handle(peer) + }() + tp := &testPeer{ + app: app, + net: net, + peer: peer, + } + // Execute any implicitly requested handshakes and return + if shake { + td, head, genesis := pm.chainman.Status() + tp.handshake(nil, td, head, genesis) + } + return tp, errc +} + +// handshake simulates a trivial handshake that expects the same state from the +// remote side as we are simulating locally. +func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, genesis common.Hash) { + msg := &statusData{ + ProtocolVersion: uint32(p.version), + NetworkId: uint32(NetworkId), + TD: td, + CurrentBlock: head, + GenesisBlock: genesis, + } + if err := p2p.ExpectMsg(p.app, StatusMsg, msg); err != nil { + t.Fatalf("status recv: %v", err) + } + if err := p2p.Send(p.app, StatusMsg, msg); err != nil { + t.Fatalf("status send: %v", err) + } +} + +// close terminates the local side of the peer, notifying the remote protocol +// manager of termination. +func (p *testPeer) close() { + p.app.Close() +} diff --git a/exp/metrics.go b/exp/metrics.go index 2bce1e89da37..f18d8bcb24f6 100644 --- a/exp/metrics.go +++ b/exp/metrics.go @@ -1,44 +1,157 @@ -// Copyright 2015 The go-expanse Authors -// This file is part of the go-expanse library. +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. // -// The go-expanse library is free software: you can redistribute it and/or modify +// The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // -// The go-expanse library is distributed in the hope that it will be useful, +// The go-ethereum library 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with the go-expanse library. If not, see . +// along with the go-ethereum library. If not, see . package exp import ( "github.com/expanse-project/go-expanse/metrics" + "github.com/expanse-project/go-expanse/p2p" ) var ( - propTxnInPacketsMeter = metrics.NewMeter("exp/prop/txns/in/packets") - propTxnInTrafficMeter = metrics.NewMeter("exp/prop/txns/in/traffic") - propTxnOutPacketsMeter = metrics.NewMeter("exp/prop/txns/out/packets") - propTxnOutTrafficMeter = metrics.NewMeter("exp/prop/txns/out/traffic") - propHashInPacketsMeter = metrics.NewMeter("exp/prop/hashes/in/packets") - propHashInTrafficMeter = metrics.NewMeter("exp/prop/hashes/in/traffic") - propHashOutPacketsMeter = metrics.NewMeter("exp/prop/hashes/out/packets") - propHashOutTrafficMeter = metrics.NewMeter("exp/prop/hashes/out/traffic") - propBlockInPacketsMeter = metrics.NewMeter("exp/prop/blocks/in/packets") - propBlockInTrafficMeter = metrics.NewMeter("exp/prop/blocks/in/traffic") - propBlockOutPacketsMeter = metrics.NewMeter("exp/prop/blocks/out/packets") - propBlockOutTrafficMeter = metrics.NewMeter("exp/prop/blocks/out/traffic") - reqHashInPacketsMeter = metrics.NewMeter("exp/req/hashes/in/packets") - reqHashInTrafficMeter = metrics.NewMeter("exp/req/hashes/in/traffic") - reqHashOutPacketsMeter = metrics.NewMeter("exp/req/hashes/out/packets") - reqHashOutTrafficMeter = metrics.NewMeter("exp/req/hashes/out/traffic") - reqBlockInPacketsMeter = metrics.NewMeter("exp/req/blocks/in/packets") - reqBlockInTrafficMeter = metrics.NewMeter("exp/req/blocks/in/traffic") - reqBlockOutPacketsMeter = metrics.NewMeter("exp/req/blocks/out/packets") - reqBlockOutTrafficMeter = metrics.NewMeter("exp/req/blocks/out/traffic") + propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets") + propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic") + propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets") + propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic") + propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets") + propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic") + propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets") + propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic") + propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets") + propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic") + propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets") + propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic") + reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets") + reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic") + reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets") + reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic") + reqBlockInPacketsMeter = metrics.NewMeter("eth/req/blocks/in/packets") + reqBlockInTrafficMeter = metrics.NewMeter("eth/req/blocks/in/traffic") + reqBlockOutPacketsMeter = metrics.NewMeter("eth/req/blocks/out/packets") + reqBlockOutTrafficMeter = metrics.NewMeter("eth/req/blocks/out/traffic") + reqHeaderInPacketsMeter = metrics.NewMeter("eth/req/headers/in/packets") + reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/headers/in/traffic") + reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/headers/out/packets") + reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/headers/out/traffic") + reqBodyInPacketsMeter = metrics.NewMeter("eth/req/bodies/in/packets") + reqBodyInTrafficMeter = metrics.NewMeter("eth/req/bodies/in/traffic") + reqBodyOutPacketsMeter = metrics.NewMeter("eth/req/bodies/out/packets") + reqBodyOutTrafficMeter = metrics.NewMeter("eth/req/bodies/out/traffic") + reqStateInPacketsMeter = metrics.NewMeter("eth/req/states/in/packets") + reqStateInTrafficMeter = metrics.NewMeter("eth/req/states/in/traffic") + reqStateOutPacketsMeter = metrics.NewMeter("eth/req/states/out/packets") + reqStateOutTrafficMeter = metrics.NewMeter("eth/req/states/out/traffic") + reqReceiptInPacketsMeter = metrics.NewMeter("eth/req/receipts/in/packets") + reqReceiptInTrafficMeter = metrics.NewMeter("eth/req/receipts/in/traffic") + reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipts/out/packets") + reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipts/out/traffic") + miscInPacketsMeter = metrics.NewMeter("eth/misc/in/packets") + miscInTrafficMeter = metrics.NewMeter("eth/misc/in/traffic") + miscOutPacketsMeter = metrics.NewMeter("eth/misc/out/packets") + miscOutTrafficMeter = metrics.NewMeter("eth/misc/out/traffic") ) + +// meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of +// accumulating the above defined metrics based on the data stream contents. +type meteredMsgReadWriter struct { + p2p.MsgReadWriter // Wrapped message stream to meter + version int // Protocol version to select correct meters +} + +// newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the +// metrics system is disabled, this fucntion returns the original object. +func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter { + if !metrics.Enabled { + return rw + } + return &meteredMsgReadWriter{MsgReadWriter: rw} +} + +// Init sets the protocol version used by the stream to know which meters to +// increment in case of overlapping message ids between protocol versions. +func (rw *meteredMsgReadWriter) Init(version int) { + rw.version = version +} + +func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { + // Read the message and short circuit in case of an error + msg, err := rw.MsgReadWriter.ReadMsg() + if err != nil { + return msg, err + } + // Account for the data traffic + packets, traffic := miscInPacketsMeter, miscInTrafficMeter + switch { + case rw.version < eth62 && msg.Code == BlockHashesMsg: + packets, traffic = reqHashInPacketsMeter, reqHashInTrafficMeter + case rw.version < eth62 && msg.Code == BlocksMsg: + packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter + + case rw.version >= eth62 && msg.Code == BlockHeadersMsg: + packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter + case rw.version >= eth62 && msg.Code == BlockBodiesMsg: + packets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter + + case rw.version >= eth63 && msg.Code == NodeDataMsg: + packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter + case rw.version >= eth63 && msg.Code == ReceiptsMsg: + packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter + + case msg.Code == NewBlockHashesMsg: + packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter + case msg.Code == NewBlockMsg: + packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter + case msg.Code == TxMsg: + packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter + } + packets.Mark(1) + traffic.Mark(int64(msg.Size)) + + return msg, err +} + +func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error { + // Account for the data traffic + packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter + switch { + case rw.version < eth62 && msg.Code == BlockHashesMsg: + packets, traffic = reqHashOutPacketsMeter, reqHashOutTrafficMeter + case rw.version < eth62 && msg.Code == BlocksMsg: + packets, traffic = reqBlockOutPacketsMeter, reqBlockOutTrafficMeter + + case rw.version >= eth62 && msg.Code == BlockHeadersMsg: + packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter + case rw.version >= eth62 && msg.Code == BlockBodiesMsg: + packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter + + case rw.version >= eth63 && msg.Code == NodeDataMsg: + packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter + case rw.version >= eth63 && msg.Code == ReceiptsMsg: + packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter + + case msg.Code == NewBlockHashesMsg: + packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter + case msg.Code == NewBlockMsg: + packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter + case msg.Code == TxMsg: + packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter + } + packets.Mark(1) + traffic.Mark(int64(msg.Size)) + + // Send the packet to the p2p layer + return rw.MsgReadWriter.WriteMsg(msg) +} diff --git a/exp/peer.go b/exp/peer.go index 0953981a6599..786963af1384 100644 --- a/exp/peer.go +++ b/exp/peer.go @@ -22,12 +22,14 @@ import ( "math/big" "sync" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/exp/downloader" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/p2p" + "github.com/expanse-project/go-expanse/rlp" "gopkg.in/fatih/set.v0" ) @@ -129,9 +131,7 @@ func (p *peer) MarkTransaction(hash common.Hash) { // SendTransactions sends transactions to the peer and includes the hashes // in its transaction hash set for future reference. func (p *peer) SendTransactions(txs types.Transactions) error { - propTxnOutPacketsMeter.Mark(1) for _, tx := range txs { - propTxnOutTrafficMeter.Mark(tx.Size().Int64()) p.knownTxs.Add(tx.Hash()) } return p2p.Send(p.rw, TxMsg, txs) @@ -139,63 +139,134 @@ func (p *peer) SendTransactions(txs types.Transactions) error { // SendBlockHashes sends a batch of known hashes to the remote peer. func (p *peer) SendBlockHashes(hashes []common.Hash) error { - reqHashOutPacketsMeter.Mark(1) - reqHashOutTrafficMeter.Mark(int64(32 * len(hashes))) - return p2p.Send(p.rw, BlockHashesMsg, hashes) } // SendBlocks sends a batch of blocks to the remote peer. func (p *peer) SendBlocks(blocks []*types.Block) error { - reqBlockOutPacketsMeter.Mark(1) - for _, block := range blocks { - reqBlockOutTrafficMeter.Mark(block.Size().Int64()) - } return p2p.Send(p.rw, BlocksMsg, blocks) } -// SendNewBlockHashes announces the availability of a number of blocks through +// SendNewBlockHashes61 announces the availability of a number of blocks through // a hash notification. -func (p *peer) SendNewBlockHashes(hashes []common.Hash) error { - propHashOutPacketsMeter.Mark(1) - propHashOutTrafficMeter.Mark(int64(32 * len(hashes))) - +func (p *peer) SendNewBlockHashes61(hashes []common.Hash) error { for _, hash := range hashes { p.knownBlocks.Add(hash) } return p2p.Send(p.rw, NewBlockHashesMsg, hashes) } +// SendNewBlockHashes announces the availability of a number of blocks through +// a hash notification. +func (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error { + for _, hash := range hashes { + p.knownBlocks.Add(hash) + } + request := make(newBlockHashesData, len(hashes)) + for i := 0; i < len(hashes); i++ { + request[i].Hash = hashes[i] + request[i].Number = numbers[i] + } + return p2p.Send(p.rw, NewBlockHashesMsg, request) +} + // SendNewBlock propagates an entire block to a remote peer. func (p *peer) SendNewBlock(block *types.Block, td *big.Int) error { - propBlockOutPacketsMeter.Mark(1) - propBlockOutTrafficMeter.Mark(block.Size().Int64()) - p.knownBlocks.Add(block.Hash()) return p2p.Send(p.rw, NewBlockMsg, []interface{}{block, td}) } +// SendBlockHeaders sends a batch of block headers to the remote peer. +func (p *peer) SendBlockHeaders(headers []*types.Header) error { + return p2p.Send(p.rw, BlockHeadersMsg, headers) +} + +// SendBlockBodies sends a batch of block contents to the remote peer. +func (p *peer) SendBlockBodies(bodies []*blockBody) error { + return p2p.Send(p.rw, BlockBodiesMsg, blockBodiesData(bodies)) +} + +// SendBlockBodiesRLP sends a batch of block contents to the remote peer from +// an already RLP encoded format. +func (p *peer) SendBlockBodiesRLP(bodies []rlp.RawValue) error { + return p2p.Send(p.rw, BlockBodiesMsg, bodies) +} + +// SendNodeData sends a batch of arbitrary internal data, corresponding to the +// hashes requested. +func (p *peer) SendNodeData(data [][]byte) error { + return p2p.Send(p.rw, NodeDataMsg, data) +} + +// SendReceipts sends a batch of transaction receipts, corresponding to the ones +// requested. +func (p *peer) SendReceipts(receipts []*types.Receipt) error { + return p2p.Send(p.rw, ReceiptsMsg, receipts) +} + // RequestHashes fetches a batch of hashes from a peer, starting at from, going // towards the genesis block. func (p *peer) RequestHashes(from common.Hash) error { - glog.V(logger.Debug).Infof("Peer [%s] fetching hashes (%d) from %x...\n", p.id, downloader.MaxHashFetch, from[:4]) + glog.V(logger.Debug).Infof("%v fetching hashes (%d) from %x...", p, downloader.MaxHashFetch, from[:4]) return p2p.Send(p.rw, GetBlockHashesMsg, getBlockHashesData{from, uint64(downloader.MaxHashFetch)}) } -// RequestHashesFromNumber fetches a batch of hashes from a peer, starting at the -// requested block number, going upwards towards the genesis block. +// RequestHashesFromNumber fetches a batch of hashes from a peer, starting at +// the requested block number, going upwards towards the genesis block. func (p *peer) RequestHashesFromNumber(from uint64, count int) error { - glog.V(logger.Debug).Infof("Peer [%s] fetching hashes (%d) from #%d...\n", p.id, count, from) + glog.V(logger.Debug).Infof("%v fetching hashes (%d) from #%d...", p, count, from) return p2p.Send(p.rw, GetBlockHashesFromNumberMsg, getBlockHashesFromNumberData{from, uint64(count)}) } // RequestBlocks fetches a batch of blocks corresponding to the specified hashes. func (p *peer) RequestBlocks(hashes []common.Hash) error { - glog.V(logger.Debug).Infof("[%s] fetching %v blocks\n", p.id, len(hashes)) + glog.V(logger.Debug).Infof("%v fetching %v blocks", p, len(hashes)) return p2p.Send(p.rw, GetBlocksMsg, hashes) } -// Handshake executes the exp protocol handshake, negotiating version number, + +// RequestHeaders is a wrapper around the header query functions to fetch a +// single header. It is used solely by the fetcher. +func (p *peer) RequestOneHeader(hash common.Hash) error { + glog.V(logger.Debug).Infof("%v fetching a single header: %x", p, hash) + return p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Hash: hash}, Amount: uint64(1), Skip: uint64(0), Reverse: false}) +} + +// RequestHeadersByHash fetches a batch of blocks' headers corresponding to the +// specified header query, based on the hash of an origin block. +func (p *peer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { + glog.V(logger.Debug).Infof("%v fetching %d headers from %x, skipping %d (reverse = %v)", p, amount, origin[:4], skip, reverse) + return p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Hash: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}) +} + +// RequestHeadersByNumber fetches a batch of blocks' headers corresponding to the +// specified header query, based on the number of an origin block. +func (p *peer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { + glog.V(logger.Debug).Infof("%v fetching %d headers from #%d, skipping %d (reverse = %v)", p, amount, origin, skip, reverse) + return p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Number: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}) +} + +// RequestBodies fetches a batch of blocks' bodies corresponding to the hashes +// specified. +func (p *peer) RequestBodies(hashes []common.Hash) error { + glog.V(logger.Debug).Infof("%v fetching %d block bodies", p, len(hashes)) + return p2p.Send(p.rw, GetBlockBodiesMsg, hashes) +} + +// RequestNodeData fetches a batch of arbitrary data from a node's known state +// data, corresponding to the specified hashes. +func (p *peer) RequestNodeData(hashes []common.Hash) error { + glog.V(logger.Debug).Infof("%v fetching %v state data", p, len(hashes)) + return p2p.Send(p.rw, GetNodeDataMsg, hashes) +} + +// RequestReceipts fetches a batch of transaction receipts from a remote node. +func (p *peer) RequestReceipts(hashes []common.Hash) error { + glog.V(logger.Debug).Infof("%v fetching %v receipts", p, len(hashes)) + return p2p.Send(p.rw, GetReceiptsMsg, hashes) +} + +// Handshake executes the eth protocol handshake, negotiating version number, // network IDs, difficulties, head and genesis blocks. func (p *peer) Handshake(td *big.Int, head common.Hash, genesis common.Hash) error { // Send out own handshake in a new thread diff --git a/exp/protocol.go b/exp/protocol.go index 244bcf34bbee..1aab813270e3 100644 --- a/exp/protocol.go +++ b/exp/protocol.go @@ -17,17 +17,28 @@ package exp import ( + "fmt" + "io" "math/big" "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/rlp" ) -// Supported versions of the exp protocol (first is primary). -var ProtocolVersions = []uint{61, 60} +// Constants to match up protocol versions and messages +const ( + eth61 = 61 + eth62 = 62 + eth63 = 63 + eth64 = 64 +) + +// Supported versions of the eth protocol (first is primary). +var ProtocolVersions = []uint{eth64, eth63, eth62, eth61} // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{9, 8} +var ProtocolLengths = []uint64{15, 12, 8, 9} const ( NetworkId = 1 @@ -36,15 +47,37 @@ const ( // exp protocol message codes const ( - StatusMsg = iota - NewBlockHashesMsg - TxMsg - GetBlockHashesMsg - BlockHashesMsg - GetBlocksMsg - BlocksMsg - NewBlockMsg - GetBlockHashesFromNumberMsg + // Protocol messages belonging to eth/61 + StatusMsg = 0x00 + NewBlockHashesMsg = 0x01 + TxMsg = 0x02 + GetBlockHashesMsg = 0x03 + BlockHashesMsg = 0x04 + GetBlocksMsg = 0x05 + BlocksMsg = 0x06 + NewBlockMsg = 0x07 + GetBlockHashesFromNumberMsg = 0x08 + + // Protocol messages belonging to eth/62 (new protocol from scratch) + // StatusMsg = 0x00 (uncomment after eth/61 deprecation) + // NewBlockHashesMsg = 0x01 (uncomment after eth/61 deprecation) + // TxMsg = 0x02 (uncomment after eth/61 deprecation) + GetBlockHeadersMsg = 0x03 + BlockHeadersMsg = 0x04 + GetBlockBodiesMsg = 0x05 + BlockBodiesMsg = 0x06 + // NewBlockMsg = 0x07 (uncomment after eth/61 deprecation) + + // Protocol messages belonging to eth/63 + GetNodeDataMsg = 0x0d + NodeDataMsg = 0x0e + GetReceiptsMsg = 0x0f + ReceiptsMsg = 0x10 + + // Protocol messages belonging to eth/64 + GetAcctProofMsg = 0x11 + GetStorageDataProof = 0x12 + Proof = 0x13 ) type errCode int @@ -102,22 +135,85 @@ type statusData struct { GenesisBlock common.Hash } -// getBlockHashesData is the network packet for the hash based block retrieval -// message. +// newBlockHashesData is the network packet for the block announcements. +type newBlockHashesData []struct { + Hash common.Hash // Hash of one particular block being announced + Number uint64 // Number of one particular block being announced +} + +// getBlockHashesData is the network packet for the hash based hash retrieval. type getBlockHashesData struct { Hash common.Hash Amount uint64 } -// getBlockHashesFromNumberData is the network packet for the number based block -// retrieval message. +// getBlockHashesFromNumberData is the network packet for the number based hash +// retrieval. type getBlockHashesFromNumberData struct { Number uint64 Amount uint64 } +// getBlockHeadersData represents a block header query. +type getBlockHeadersData struct { + Origin hashOrNumber // Block from which to retrieve headers + Amount uint64 // Maximum number of headers to retrieve + Skip uint64 // Blocks to skip between consecutive headers + Reverse bool // Query direction (false = rising towards latest, true = falling towards genesis) +} + +// hashOrNumber is a combined field for specifying an origin block. +type hashOrNumber struct { + Hash common.Hash // Block hash from which to retrieve headers (excludes Number) + Number uint64 // Block hash from which to retrieve headers (excludes Hash) +} + +// EncodeRLP is a specialized encoder for hashOrNumber to encode only one of the +// two contained union fields. +func (hn *hashOrNumber) EncodeRLP(w io.Writer) error { + if hn.Hash == (common.Hash{}) { + return rlp.Encode(w, hn.Number) + } + if hn.Number != 0 { + return fmt.Errorf("both origin hash (%x) and number (%d) provided", hn.Hash, hn.Number) + } + return rlp.Encode(w, hn.Hash) +} + +// DecodeRLP is a specialized decoder for hashOrNumber to decode the contents +// into either a block hash or a block number. +func (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error { + _, size, _ := s.Kind() + origin, err := s.Raw() + if err == nil { + switch { + case size == 32: + err = rlp.DecodeBytes(origin, &hn.Hash) + case size <= 8: + err = rlp.DecodeBytes(origin, &hn.Number) + default: + err = fmt.Errorf("invalid input size %d for origin", size) + } + } + return err +} + // newBlockData is the network packet for the block propagation message. type newBlockData struct { Block *types.Block TD *big.Int } + +// blockBody represents the data content of a single block. +type blockBody struct { + Transactions []*types.Transaction // Transactions contained within a block + Uncles []*types.Header // Uncles contained within a block +} + +// blockBodiesData is the network packet for block content distribution. +type blockBodiesData []*blockBody + +// nodeDataData is the network response packet for a node data retrieval. +type nodeDataData []struct { + Value []byte +} diff --git a/exp/protocol_test.go b/exp/protocol_test.go index 8593069410fe..e4773090b88a 100644 --- a/exp/protocol_test.go +++ b/exp/protocol_test.go @@ -18,19 +18,16 @@ package exp import ( "crypto/rand" - "math/big" + "fmt" "sync" "testing" "time" "github.com/expanse-project/go-expanse/common" - "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/crypto" - "github.com/expanse-project/go-expanse/ethdb" - "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/p2p" - "github.com/expanse-project/go-expanse/p2p/discover" + "github.com/expanse-project/go-expanse/rlp" ) func init() { @@ -40,8 +37,14 @@ func init() { var testAccount = crypto.NewKey(rand.Reader) -func TestStatusMsgErrors(t *testing.T) { - pm := newProtocolManagerForTesting(nil) +// Tests that handshake failures are detected and reported correctly. +func TestStatusMsgErrors61(t *testing.T) { testStatusMsgErrors(t, 61) } +func TestStatusMsgErrors62(t *testing.T) { testStatusMsgErrors(t, 62) } +func TestStatusMsgErrors63(t *testing.T) { testStatusMsgErrors(t, 63) } +func TestStatusMsgErrors64(t *testing.T) { testStatusMsgErrors(t, 64) } + +func testStatusMsgErrors(t *testing.T, protocol int) { + pm := newTestProtocolManager(0, nil, nil) td, currentBlock, genesis := pm.chainman.Status() defer pm.Stop() @@ -56,23 +59,23 @@ func TestStatusMsgErrors(t *testing.T) { }, { code: StatusMsg, data: statusData{10, NetworkId, td, currentBlock, genesis}, - wantError: errResp(ErrProtocolVersionMismatch, "10 (!= 0)"), + wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol), }, { - code: StatusMsg, data: statusData{uint32(ProtocolVersions[0]), 999, td, currentBlock, genesis}, + code: StatusMsg, data: statusData{uint32(protocol), 999, td, currentBlock, genesis}, wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"), }, { - code: StatusMsg, data: statusData{uint32(ProtocolVersions[0]), NetworkId, td, currentBlock, common.Hash{3}}, + code: StatusMsg, data: statusData{uint32(protocol), NetworkId, td, currentBlock, common.Hash{3}}, wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000000000000000000000000000000000000000000000000000 (!= %x)", genesis), }, } for i, test := range tests { - p, errc := newTestPeer(pm) + p, errc := newTestPeer("peer", protocol, pm, false) // The send call might hang until reset because // the protocol might not read the payload. - go p2p.Send(p, test.code, test.data) + go p2p.Send(p.app, test.code, test.data) select { case err := <-errc: @@ -89,16 +92,20 @@ func TestStatusMsgErrors(t *testing.T) { } // This test checks that received transactions are added to the local pool. -func TestRecvTransactions(t *testing.T) { +func TestRecvTransactions61(t *testing.T) { testRecvTransactions(t, 61) } +func TestRecvTransactions62(t *testing.T) { testRecvTransactions(t, 62) } +func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) } +func TestRecvTransactions64(t *testing.T) { testRecvTransactions(t, 64) } + +func testRecvTransactions(t *testing.T, protocol int) { txAdded := make(chan []*types.Transaction) - pm := newProtocolManagerForTesting(txAdded) - p, _ := newTestPeer(pm) + pm := newTestProtocolManager(0, nil, txAdded) + p, _ := newTestPeer("peer", protocol, pm, true) defer pm.Stop() defer p.close() - p.handshake(t) - tx := newtx(testAccount, 0, 0) - if err := p2p.Send(p, TxMsg, []interface{}{tx}); err != nil { + tx := newTestTransaction(testAccount, 0, 0) + if err := p2p.Send(p.app, TxMsg, []interface{}{tx}); err != nil { t.Fatalf("send error: %v", err) } select { @@ -114,15 +121,20 @@ func TestRecvTransactions(t *testing.T) { } // This test checks that pending transactions are sent. -func TestSendTransactions(t *testing.T) { - pm := newProtocolManagerForTesting(nil) +func TestSendTransactions61(t *testing.T) { testSendTransactions(t, 61) } +func TestSendTransactions62(t *testing.T) { testSendTransactions(t, 62) } +func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) } +func TestSendTransactions64(t *testing.T) { testSendTransactions(t, 64) } + +func testSendTransactions(t *testing.T, protocol int) { + pm := newTestProtocolManager(0, nil, nil) defer pm.Stop() // Fill the pool with big transactions. const txsize = txsyncPackSize / 10 alltxs := make([]*types.Transaction, 100) for nonce := range alltxs { - alltxs[nonce] = newtx(testAccount, uint64(nonce), txsize) + alltxs[nonce] = newTestTransaction(testAccount, uint64(nonce), txsize) } pm.txpool.AddTransactions(alltxs) @@ -137,7 +149,7 @@ func TestSendTransactions(t *testing.T) { } for n := 0; n < len(alltxs) && !t.Failed(); { var txs []*types.Transaction - msg, err := p.ReadMsg() + msg, err := p.app.ReadMsg() if err != nil { t.Errorf("%v: read error: %v", p.Peer, err) } else if msg.Code != TxMsg { @@ -161,97 +173,53 @@ func TestSendTransactions(t *testing.T) { } } for i := 0; i < 3; i++ { - p, _ := newTestPeer(pm) - p.handshake(t) + p, _ := newTestPeer(fmt.Sprintf("peer #%d", i), protocol, pm, true) wg.Add(1) go checktxs(p) } wg.Wait() } -// testPeer wraps all peer-related data for tests. -type testPeer struct { - p2p.MsgReadWriter // writing to the test peer feeds the protocol - pipe *p2p.MsgPipeRW // the protocol read/writes on this end - pm *ProtocolManager - *peer -} - -func newProtocolManagerForTesting(txAdded chan<- []*types.Transaction) *ProtocolManager { - db, _ := ethdb.NewMemDatabase() - core.WriteTestNetGenesisBlock(db, 0) - var ( - em = new(event.TypeMux) - chain, _ = core.NewChainManager(db, core.FakePow{}, em) - txpool = &fakeTxPool{added: txAdded} - pm = NewProtocolManager(NetworkId, em, txpool, core.FakePow{}, chain) - ) - pm.Start() - return pm -} - -func newTestPeer(pm *ProtocolManager) (*testPeer, <-chan error) { - var id discover.NodeID - rand.Read(id[:]) - rw1, rw2 := p2p.MsgPipe() - peer := pm.newPeer(pm.protVer, pm.netId, p2p.NewPeer(id, "test peer", nil), rw2) - errc := make(chan error, 1) - go func() { - pm.newPeerCh <- peer - errc <- pm.handle(peer) - }() - return &testPeer{rw1, rw2, pm, peer}, errc -} - -func (p *testPeer) handshake(t *testing.T) { - td, currentBlock, genesis := p.pm.chainman.Status() - msg := &statusData{ - ProtocolVersion: uint32(p.pm.protVer), - NetworkId: uint32(p.pm.netId), - TD: td, - CurrentBlock: currentBlock, - GenesisBlock: genesis, - } - if err := p2p.ExpectMsg(p, StatusMsg, msg); err != nil { - t.Fatalf("status recv: %v", err) +// Tests that the custom union field encoder and decoder works correctly. +func TestGetBlockHeadersDataEncodeDecode(t *testing.T) { + // Create a "random" hash for testing + var hash common.Hash + for i, _ := range hash { + hash[i] = byte(i) } - if err := p2p.Send(p, StatusMsg, msg); err != nil { - t.Fatalf("status send: %v", err) - } -} - -func (p *testPeer) close() { - p.pipe.Close() -} + // Assemble some table driven tests + tests := []struct { + packet *getBlockHeadersData + fail bool + }{ + // Providing the origin as either a hash or a number should both work + {fail: false, packet: &getBlockHeadersData{Origin: hashOrNumber{Number: 314}}}, + {fail: false, packet: &getBlockHeadersData{Origin: hashOrNumber{Hash: hash}}}, -type fakeTxPool struct { - // all transactions are collected. - mu sync.Mutex - all []*types.Transaction - // if added is non-nil, it receives added transactions. - added chan<- []*types.Transaction -} + // Providing arbitrary query field should also work + {fail: false, packet: &getBlockHeadersData{Origin: hashOrNumber{Number: 314}, Amount: 314, Skip: 1, Reverse: true}}, + {fail: false, packet: &getBlockHeadersData{Origin: hashOrNumber{Hash: hash}, Amount: 314, Skip: 1, Reverse: true}}, -func (pool *fakeTxPool) AddTransactions(txs []*types.Transaction) { - pool.mu.Lock() - defer pool.mu.Unlock() - pool.all = append(pool.all, txs...) - if pool.added != nil { - pool.added <- txs + // Providing both the origin hash and origin number must fail + {fail: true, packet: &getBlockHeadersData{Origin: hashOrNumber{Hash: hash, Number: 314}}}, + } + // Iterate over each of the tests and try to encode and then decode + for i, tt := range tests { + bytes, err := rlp.EncodeToBytes(tt.packet) + if err != nil && !tt.fail { + t.Fatalf("test %d: failed to encode packet: %v", i, err) + } else if err == nil && tt.fail { + t.Fatalf("test %d: encode should have failed", i) + } + if !tt.fail { + packet := new(getBlockHeadersData) + if err := rlp.DecodeBytes(bytes, packet); err != nil { + t.Fatalf("test %d: failed to decode packet: %v", i, err) + } + if packet.Origin.Hash != tt.packet.Origin.Hash || packet.Origin.Number != tt.packet.Origin.Number || packet.Amount != tt.packet.Amount || + packet.Skip != tt.packet.Skip || packet.Reverse != tt.packet.Reverse { + t.Fatalf("test %d: encode decode mismatch: have %+v, want %+v", i, packet, tt.packet) + } + } } -} - -func (pool *fakeTxPool) GetTransactions() types.Transactions { - pool.mu.Lock() - defer pool.mu.Unlock() - txs := make([]*types.Transaction, len(pool.all)) - copy(txs, pool.all) - return types.Transactions(txs) -} - -func newtx(from *crypto.Key, nonce uint64, datasize int) *types.Transaction { - data := make([]byte, datasize) - tx := types.NewTransaction(nonce, common.Address{}, big.NewInt(0), big.NewInt(100000), big.NewInt(0), data) - tx, _ = tx.SignECDSA(from.PrivateKey) - return tx } diff --git a/jsre/ethereum_js.go b/jsre/expanse_js.go similarity index 92% rename from jsre/ethereum_js.go rename to jsre/expanse_js.go index 44d1b213fe75..27e5bf56e985 100644 --- a/jsre/ethereum_js.go +++ b/jsre/expanse_js.go @@ -650,7 +650,7 @@ module.exports = SolidityTypeBytes; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file coder.js * @author Marek Kotewicz * @date 2015 @@ -680,7 +680,7 @@ var SolidityCoder = function (types) { * * @method _requireType * @param {String} type - * @returns {SolidityType} + * @returns {SolidityType} * @throws {Error} throws if no matching type is found */ SolidityCoder.prototype._requireType = function (type) { @@ -726,7 +726,7 @@ SolidityCoder.prototype.encodeParams = function (types, params) { return acc + solidityType.staticPartLength(types[index]); }, 0); - var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset); + var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset); return result; }; @@ -751,7 +751,7 @@ SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, // TODO: figure out nested arrays }); - + types.forEach(function (type, i) { if (isDynamic(i)) { var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); @@ -771,7 +771,7 @@ SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded var nestedName = solidityType.nestedName(type); var nestedStaticPartLength = solidityType.staticPartLength(nestedName); var result = encoded[0]; - + (function () { var previousLength = 2; // in int if (solidityType.isDynamicArray(nestedName)) { @@ -781,7 +781,7 @@ SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded } } })(); - + // first element is length, skip it (function () { for (var i = 0; i < encoded.length - 1; i++) { @@ -792,7 +792,7 @@ SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded return result; })(); - + } else if (solidityType.isStaticArray(type)) { return (function () { var nestedName = solidityType.nestedName(type); @@ -805,7 +805,7 @@ SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded var previousLength = 0; // in int for (var i = 0; i < encoded.length; i++) { // calculate length of previous item - previousLength += +(encoded[i - 1] || [])[0] || 0; + previousLength += +(encoded[i - 1] || [])[0] || 0; result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode(); } })(); @@ -848,7 +848,7 @@ SolidityCoder.prototype.decodeParam = function (type, bytes) { SolidityCoder.prototype.decodeParams = function (types, bytes) { var solidityTypes = this.getSolidityTypes(types); var offsets = this.getOffsets(types, solidityTypes); - + return solidityTypes.map(function (solidityType, index) { return solidityType.decode(bytes, offsets[index], types[index], index); }); @@ -856,10 +856,10 @@ SolidityCoder.prototype.decodeParams = function (types, bytes) { SolidityCoder.prototype.getOffsets = function (types, solidityTypes) { var lengths = solidityTypes.map(function (solidityType, index) { - return solidityType.staticPartLength(types[index]); + return solidityType.staticPartLength(types[index]); // get length }); - + for (var i = 0; i < lengths.length; i++) { // sum with length of previous element var previous = (lengths[i - 1] || 0); @@ -938,7 +938,7 @@ module.exports = SolidityTypeDynamicBytes; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @date 2015 @@ -1002,7 +1002,7 @@ var formatInputDynamicBytes = function (value) { * @returns {SolidityParam} */ var formatInputString = function (value) { - var result = utils.fromAscii(value).substr(2); + var result = utils.fromUtf8(value).substr(2); var length = result.length / 2; var l = Math.floor((result.length + 63) / 64); result = utils.padRight(result, l * 64); @@ -1082,7 +1082,7 @@ var formatOutputUInt = function (param) { * @returns {BigNumber} input bytes formatted to real */ var formatOutputReal = function (param) { - return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -1093,7 +1093,7 @@ var formatOutputReal = function (param) { * @returns {BigNumber} input bytes formatted to ureal */ var formatOutputUReal = function (param) { - return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -1139,7 +1139,7 @@ var formatOutputDynamicBytes = function (param) { */ var formatOutputString = function (param) { var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2; - return utils.toAscii(param.dynamicPart().substr(64, length)); + return utils.toUtf8(param.dynamicPart().substr(64, length)); }; /** @@ -1228,7 +1228,7 @@ module.exports = SolidityTypeInt; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file param.js * @author Marek Kotewicz * @date 2015 @@ -1247,7 +1247,7 @@ var SolidityParam = function (value, offset) { /** * This method should be used to get length of params's dynamic part - * + * * @method dynamicPartLength * @returns {Number} length of dynamic part (in bytes) */ @@ -1275,7 +1275,7 @@ SolidityParam.prototype.withOffset = function (offset) { * @param {SolidityParam} result of combination */ SolidityParam.prototype.combine = function (param) { - return new SolidityParam(this.value + param.value); + return new SolidityParam(this.value + param.value); }; /** @@ -1307,8 +1307,8 @@ SolidityParam.prototype.offsetAsBytes = function () { */ SolidityParam.prototype.staticPart = function () { if (!this.isDynamic()) { - return this.value; - } + return this.value; + } return this.offsetAsBytes(); }; @@ -1340,7 +1340,7 @@ SolidityParam.prototype.encode = function () { * @returns {String} */ SolidityParam.encodeList = function (params) { - + // updating offsets var totalOffset = params.length * 32; var offsetParams = params.map(function (param) { @@ -1466,13 +1466,13 @@ SolidityType.prototype.staticPartLength = function (name) { /** * Should be used to determine if type is dynamic array - * eg: + * eg: * "type[]" => true * "type[4]" => false * * @method isDynamicArray * @param {String} name - * @return {Bool} true if the type is dynamic array + * @return {Bool} true if the type is dynamic array */ SolidityType.prototype.isDynamicArray = function (name) { var nestedTypes = this.nestedTypes(name); @@ -1481,13 +1481,13 @@ SolidityType.prototype.isDynamicArray = function (name) { /** * Should be used to determine if type is static array - * eg: + * eg: * "type[]" => false * "type[4]" => true * * @method isStaticArray * @param {String} name - * @return {Bool} true if the type is static array + * @return {Bool} true if the type is static array */ SolidityType.prototype.isStaticArray = function (name) { var nestedTypes = this.nestedTypes(name); @@ -1496,7 +1496,7 @@ SolidityType.prototype.isStaticArray = function (name) { /** * Should return length of static array - * eg. + * eg. * "int[32]" => 32 * "int256[14]" => 14 * "int[2][3]" => 3 @@ -1571,7 +1571,7 @@ SolidityType.prototype.nestedTypes = function (name) { * Should be used to encode the value * * @method encode - * @param {Object} value + * @param {Object} value * @param {String} name * @return {String} encoded value */ @@ -1585,7 +1585,7 @@ SolidityType.prototype.encode = function (value, name) { var result = []; result.push(f.formatInputInt(length).encode()); - + value.forEach(function (v) { result.push(self.encode(v, nestedName)); }); @@ -1659,12 +1659,12 @@ SolidityType.prototype.decode = function (bytes, offset, name) { return result; })(); } else if (this.isDynamicType(name)) { - + return (function () { var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64)); // in bytes var roundedLength = Math.floor((length + 31) / 32); // in int - + return self._outputFormatter(new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0)); })(); } @@ -1697,7 +1697,7 @@ var SolidityType = require('./type'); */ var SolidityTypeUInt = function () { this._inputFormatter = f.formatInputInt; - this._outputFormatter = f.formatOutputInt; + this._outputFormatter = f.formatOutputUInt; }; SolidityTypeUInt.prototype = new SolidityType({}); @@ -1787,13 +1787,13 @@ if (typeof XMLHttpRequest === 'undefined') { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] config * @constructor */ @@ -1860,7 +1860,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file sha3.js * @author Marek Kotewicz * @date 2015 @@ -1874,9 +1874,9 @@ module.exports = function (str, isNew) { if (str.substr(0, 2) === '0x' && !isNew) { console.warn('requirement of using web3.fromAscii before sha3 is deprecated'); console.warn('new usage: \'web3.sha3("hello")\''); - console.warn('see https://github.com/expanse-project/web3.js/pull/205'); + console.warn('see https://github.com/expanse-org/web3.js/pull/205'); console.warn('if you need to hash hex value, you can do \'sha3("0xfff", true)\''); - str = utils.toAscii(str); + str = utils.toUtf8(str); } return sha3(str, { @@ -1885,7 +1885,7 @@ module.exports = function (str, isNew) { }; -},{"./utils":20,"crypto-js/sha3":47}],20:[function(require,module,exports){ +},{"./utils":20,"crypto-js/sha3":48}],20:[function(require,module,exports){ /* This file is part of expanse.js. @@ -1902,7 +1902,7 @@ module.exports = function (str, isNew) { You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file utils.js * @author Marek Kotewicz * @date 2015 @@ -1910,19 +1910,20 @@ module.exports = function (str, isNew) { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] utils * @constructor */ var BigNumber = require('bignumber.js'); +var utf8 = require('utf8'); var unitMap = { 'wei': '1', @@ -1981,9 +1982,30 @@ var padRight = function (string, chars, sign) { return string + (new Array(chars - string.length + 1).join(sign ? sign : "0")); }; -/** - * Should be called to get sting from it's hex representation - * TODO: it should be called toUTF8 +/** + * Should be called to get utf8 from it's hex representation + * + * @method toUtf8 + * @param {String} string in hex + * @returns {String} ascii string representation of hex value + */ +var toUtf8 = function(hex) { +// Find termination + var str = ""; + var i = 0, l = hex.length; + if (hex.substring(0, 2) === '0x') { + i = 2; + } + for (; i < l; i+=2) { + var code = parseInt(hex.substr(i, 2), 16); + str += String.fromCharCode(code); + } + + return utf8.decode(str); +}; + +/** + * Should be called to get ascii from it's hex representation * * @method toAscii * @param {String} string in hex @@ -2001,40 +2023,44 @@ var toAscii = function(hex) { str += String.fromCharCode(code); } - return decodeURIComponent(escape(str)); // jshint ignore:line + return str; }; - + /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of utf8 string * - * @method toHexNative + * @method fromUtf8 * @param {String} string + * @param {Number} optional padding * @returns {String} hex representation of input string */ -var toHexNative = function(str) { - str = unescape(encodeURIComponent(str)); // jshint ignore:line +var fromUtf8 = function(str) { + str = utf8.encode(str); var hex = ""; for(var i = 0; i < str.length; i++) { var n = str.charCodeAt(i).toString(16); hex += n.length < 2 ? '0' + n : n; } - return hex; + return "0x" + hex; }; /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of ascii string * * @method fromAscii * @param {String} string * @param {Number} optional padding * @returns {String} hex representation of input string */ -var fromAscii = function(str, pad) { - pad = pad === undefined ? 0 : pad; - var hex = toHexNative(str); - while (hex.length < pad*2) - hex += "00"; +var fromAscii = function(str) { + var hex = ""; + for(var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); + var n = code.toString(16); + hex += n.length < 2 ? '0' + n : n; + } + return "0x" + hex; }; @@ -2056,13 +2082,13 @@ var transformToFullName = function (json) { /** * Should be called to get display name of contract function - * + * * @method extractDisplayName * @param {String} name of function/event * @returns {String} display name for function/event eg. multiply(uint256) -> multiply */ var extractDisplayName = function (name) { - var length = name.indexOf('('); + var length = name.indexOf('('); return length !== -1 ? name.substr(0, length) : name; }; @@ -2117,7 +2143,7 @@ var toHex = function (val) { return fromDecimal(val); if (isObject(val)) - return fromAscii(JSON.stringify(val)); + return fromUtf8(JSON.stringify(val)); // if its a negative number, pass it through fromDecimal if (isString(val)) { @@ -2173,7 +2199,7 @@ var getValueOfUnit = function (unit) { var fromWei = function(number, unit) { var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -2200,7 +2226,7 @@ var fromWei = function(number, unit) { var toWei = function(number, unit) { var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -2219,7 +2245,7 @@ var toBigNumber = function(number) { if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { return new BigNumber(number.replace('0x',''), 16); } - + return new BigNumber(number.toString(10), 10); }; @@ -2246,7 +2272,7 @@ var toTwosComplement = function (number) { * @return {Boolean} */ var isStrictAddress = function (address) { - return /^0x[0-9a-f]{40}$/.test(address); + return /^0x[0-9a-f]{40}$/i.test(address); }; /** @@ -2257,7 +2283,7 @@ var isStrictAddress = function (address) { * @return {Boolean} */ var isAddress = function (address) { - return /^(0x)?[0-9a-f]{40}$/.test(address); + return /^(0x)?[0-9a-f]{40}$/i.test(address); }; /** @@ -2271,7 +2297,7 @@ var toAddress = function (address) { if (isStrictAddress(address)) { return address; } - + if (/^[0-9a-f]{40}$/.test(address)) { return '0x' + address; } @@ -2285,7 +2311,7 @@ var toAddress = function (address) { * * @method isBigNumber * @param {Object} - * @return {Boolean} + * @return {Boolean} */ var isBigNumber = function (object) { return object instanceof BigNumber || @@ -2294,7 +2320,7 @@ var isBigNumber = function (object) { /** * Returns true if object is string, otherwise false - * + * * @method isString * @param {Object} * @return {Boolean} @@ -2345,12 +2371,12 @@ var isBoolean = function (object) { * @return {Boolean} */ var isArray = function (object) { - return object instanceof Array; + return object instanceof Array; }; /** * Returns true if given string is valid json object - * + * * @method isJson * @param {String} * @return {Boolean} @@ -2369,7 +2395,9 @@ module.exports = { toHex: toHex, toDecimal: toDecimal, fromDecimal: fromDecimal, + toUtf8: toUtf8, toAscii: toAscii, + fromUtf8: fromUtf8, fromAscii: fromAscii, transformToFullName: transformToFullName, extractDisplayName: extractDisplayName, @@ -2390,10 +2418,9 @@ module.exports = { isJson: isJson }; - -},{"bignumber.js":"bignumber.js"}],21:[function(require,module,exports){ +},{"bignumber.js":"bignumber.js","utf8":50}],21:[function(require,module,exports){ module.exports={ - "version": "0.12.1" + "version": "0.13.0" } },{}],22:[function(require,module,exports){ @@ -2430,6 +2457,7 @@ var db = require('./web3/methods/db'); var shh = require('./web3/methods/shh'); var watches = require('./web3/methods/watches'); var Filter = require('./web3/filter'); +var IsSyncing = require('./web3/syncing'); var utils = require('./utils/utils'); var formatters = require('./web3/formatters'); var RequestManager = require('./web3/requestmanager'); @@ -2484,6 +2512,10 @@ web3.version = {}; web3.version.api = version.version; web3.exp = {}; +web3.exp.isSyncing = function (callback) { + return new IsSyncing(callback); +}; + /*jshint maxparams:4 */ web3.exp.filter = function (fil, callback) { return new Filter(fil, watches.exp(), formatters.outputLogFormatter, callback); @@ -2503,14 +2535,16 @@ web3.setProvider = function (provider) { web3.isConnected = function(){ return (this.currentProvider && this.currentProvider.isConnected()); }; -web3.reset = function () { - RequestManager.getInstance().reset(); +web3.reset = function (keepIsSyncing) { + RequestManager.getInstance().reset(keepIsSyncing); c.defaultBlock = 'latest'; c.defaultAccount = undefined; }; web3.toHex = utils.toHex; web3.toAscii = utils.toAscii; +web3.toUtf8 = utils.toUtf8; web3.fromAscii = utils.fromAscii; +web3.fromUtf8 = utils.fromUtf8; web3.toDecimal = utils.toDecimal; web3.fromDecimal = utils.fromDecimal; web3.toBigNumber = utils.toBigNumber; @@ -2572,8 +2606,7 @@ setupMethods(web3.shh, shh.methods); module.exports = web3; - -},{"./utils/config":18,"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/filter":28,"./web3/formatters":29,"./web3/method":35,"./web3/methods/db":36,"./web3/methods/exp":37,"./web3/methods/net":38,"./web3/methods/shh":39,"./web3/methods/watches":40,"./web3/property":42,"./web3/requestmanager":43}],23:[function(require,module,exports){ +},{"./utils/config":18,"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/filter":28,"./web3/formatters":29,"./web3/method":35,"./web3/methods/db":36,"./web3/methods/exp":37,"./web3/methods/net":38,"./web3/methods/shh":39,"./web3/methods/watches":40,"./web3/property":42,"./web3/requestmanager":43,"./web3/syncing":44}],23:[function(require,module,exports){ /* This file is part of expanse.js. @@ -2590,7 +2623,7 @@ module.exports = web3; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file allevents.js * @author Marek Kotewicz * @date 2014 @@ -2679,7 +2712,7 @@ module.exports = AllSolidityEvents; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file batch.js * @author Marek Kotewicz * @date 2015 @@ -2724,7 +2757,7 @@ Batch.prototype.execute = function () { requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result)); } }); - }); + }); }; module.exports = Batch; @@ -2747,13 +2780,13 @@ module.exports = Batch; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file contract.js * @author Marek Kotewicz * @date 2014 */ -var web3 = require('../web3'); +var web3 = require('../web3'); var utils = require('../utils/utils'); var coder = require('../solidity/coder'); var SolidityEvent = require('./event'); @@ -2810,7 +2843,7 @@ var addEventsToContract = function (contract, abi) { var All = new AllEvents(events, contract.address); All.attachToContract(contract); - + events.map(function (json) { return new SolidityEvent(json, contract.address); }).forEach(function (e) { @@ -2850,7 +2883,7 @@ var checkForContractAddress = function(contract, abi, callback){ // stop watching after 50 blocks (timeout) if(count > 50) { - + filter.stopWatching(); callbackFired = true; @@ -2870,7 +2903,7 @@ var checkForContractAddress = function(contract, abi, callback){ if(callbackFired) return; - + filter.stopWatching(); callbackFired = true; @@ -2914,7 +2947,7 @@ var ContractFactory = function (abi) { /** * Should be called to create new contract on a blockchain - * + * * @method new * @param {Any} contract constructor param1 (optional) * @param {Any} contract constructor param2 (optional) @@ -2988,10 +3021,10 @@ ContractFactory.prototype.at = function (address, callback) { // attach functions addFunctionsToContract(contract, this.abi); addEventsToContract(contract, this.abi); - + if (callback) { callback(null, contract); - } + } return contract; }; @@ -3026,7 +3059,7 @@ module.exports = contract; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file errors.js * @author Marek Kotewicz * @date 2015 @@ -3066,7 +3099,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file event.js * @author Marek Kotewicz * @date 2014 @@ -3136,7 +3169,7 @@ SolidityEvent.prototype.signature = function () { /** * Should be used to encode indexed params and options to one final object - * + * * @method encode * @param {Object} indexed * @param {Object} options @@ -3167,7 +3200,7 @@ SolidityEvent.prototype.encode = function (indexed, options) { if (value === undefined || value === null) { return null; } - + if (utils.isArray(value)) { return value.map(function (v) { return '0x' + coder.encodeParam(i.type, v); @@ -3189,17 +3222,17 @@ SolidityEvent.prototype.encode = function (indexed, options) { * @return {Object} result object with decoded indexed && not indexed params */ SolidityEvent.prototype.decode = function (data) { - + data.data = data.data || ''; data.topics = data.topics || []; var argTopics = this._anonymous ? data.topics : data.topics.slice(1); var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); - var indexedParams = coder.decodeParams(this.types(true), indexedData); + var indexedParams = coder.decodeParams(this.types(true), indexedData); var notIndexedData = data.data.slice(2); var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); - + var result = formatters.outputLogFormatter(data); result.event = this.displayName(); result.address = data.address; @@ -3234,7 +3267,7 @@ SolidityEvent.prototype.execute = function (indexed, options, callback) { indexed = {}; } } - + var o = this.encode(indexed, options); var formatter = this.decode.bind(this); return new Filter(o, watches.exp(), formatter, callback); @@ -3304,7 +3337,7 @@ var toTopic = function(value){ if(value.indexOf('0x') === 0) return value; else - return utils.fromAscii(value); + return utils.fromUtf8(value); }; /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones @@ -3314,7 +3347,7 @@ var getOptions = function (options) { if (utils.isString(options)) { return options; - } + } options = options || {}; @@ -3330,8 +3363,8 @@ var getOptions = function (options) { to: options.to, address: options.address, fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), - toBlock: formatters.inputBlockNumberFormatter(options.toBlock) - }; + toBlock: formatters.inputBlockNumberFormatter(options.toBlock) + }; }; /** @@ -3339,7 +3372,7 @@ Adds the callback and sets up the methods, to iterate over the results. @method getLogsAtStart @param {Object} self -@param {funciton} +@param {funciton} */ var getLogsAtStart = function(self, callback){ // call getFilterLogs for the first watch callback start @@ -3374,12 +3407,14 @@ var pollFilter = function(self) { }); } - messages.forEach(function (message) { - message = self.formatter ? self.formatter(message) : message; - self.callbacks.forEach(function (callback) { - callback(null, message); + if(utils.isArray(messages)) { + messages.forEach(function (message) { + message = self.formatter ? self.formatter(message) : message; + self.callbacks.forEach(function (callback) { + callback(null, message); + }); }); - }); + } }; RequestManager.getInstance().startPolling({ @@ -3399,6 +3434,7 @@ var Filter = function (options, methods, formatter, callback) { this.implementation = implementation; this.filterId = null; this.callbacks = []; + this.getLogsCallbacks = []; this.pollFilters = []; this.formatter = formatter; this.implementation.newFilter(this.options, function(error, id){ @@ -3409,6 +3445,13 @@ var Filter = function (options, methods, formatter, callback) { } else { self.filterId = id; + // check if there are get pending callbacks as a consequence + // of calling get() with filterId unassigned. + self.getLogsCallbacks.forEach(function (cb){ + self.get(cb); + }); + self.getLogsCallbacks = []; + // get filter logs for the already existing watch calls self.callbacks.forEach(function(cb){ getLogsAtStart(self, cb); @@ -3447,16 +3490,25 @@ Filter.prototype.stopWatching = function () { Filter.prototype.get = function (callback) { var self = this; if (utils.isFunction(callback)) { - this.implementation.getLogs(this.filterId, function(err, res){ - if (err) { - callback(err); - } else { - callback(null, res.map(function (log) { - return self.formatter ? self.formatter(log) : log; - })); - } - }); + if (this.filterId === null) { + // If filterId is not set yet, call it back + // when newFilter() assigns it. + this.getLogsCallbacks.push(callback); + } else { + this.implementation.getLogs(this.filterId, function(err, res){ + if (err) { + callback(err); + } else { + callback(null, res.map(function (log) { + return self.formatter ? self.formatter(log) : log; + })); + } + }); + } } else { + if (this.filterId === null) { + throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.'); + } var logs = this.implementation.getLogs(this.filterId); return logs.map(function (log) { return self.formatter ? self.formatter(log) : log; @@ -3486,7 +3538,7 @@ module.exports = Filter; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @author Fabian Vogelsteller @@ -3553,7 +3605,7 @@ var inputCallFormatter = function (options){ options[key] = utils.fromDecimal(options[key]); }); - return options; + return options; }; /** @@ -3578,12 +3630,12 @@ var inputTransactionFormatter = function (options){ options[key] = utils.fromDecimal(options[key]); }); - return options; + return options; }; /** * Formats the output of a transaction to its proper values - * + * * @method outputTransactionFormatter * @param {Object} tx * @returns {Object} @@ -3602,7 +3654,7 @@ var outputTransactionFormatter = function (tx){ /** * Formats the output of a transaction receipt to its proper values - * + * * @method outputTransactionReceiptFormatter * @param {Object} receipt * @returns {Object} @@ -3628,7 +3680,7 @@ var outputTransactionReceiptFormatter = function (receipt){ * Formats the output of a block to its proper values * * @method outputBlockFormatter - * @param {Object} block + * @param {Object} block * @returns {Object} */ var outputBlockFormatter = function(block) { @@ -3656,7 +3708,7 @@ var outputBlockFormatter = function(block) { /** * Formats the output of a log - * + * * @method outputLogFormatter * @param {Object} log object * @returns {Object} log @@ -3693,10 +3745,10 @@ var inputPostFormatter = function(post) { // format the following options post.topics = post.topics.map(function(topic){ - return utils.fromAscii(topic); + return utils.fromUtf8(topic); }); - return post; + return post; }; /** @@ -3713,7 +3765,7 @@ var outputPostFormatter = function(post){ post.ttl = utils.toDecimal(post.ttl); post.workProved = utils.toDecimal(post.workProved); post.payloadRaw = post.payload; - post.payload = utils.toAscii(post.payload); + post.payload = utils.toUtf8(post.payload); if (utils.isJson(post.payload)) { post.payload = JSON.parse(post.payload); @@ -3724,7 +3776,7 @@ var outputPostFormatter = function(post){ post.topics = []; } post.topics = post.topics.map(function(topic){ - return utils.toAscii(topic); + return utils.toUtf8(topic); }); return post; @@ -3742,6 +3794,16 @@ var inputAddressFormatter = function (address) { throw 'invalid address'; }; + +var outputSyncingFormatter = function(result) { + + result.startingBlock = utils.toDecimal(result.startingBlock); + result.currentBlock = utils.toDecimal(result.currentBlock); + result.highestBlock = utils.toDecimal(result.highestBlock); + + return result; +}; + module.exports = { inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter, inputBlockNumberFormatter: inputBlockNumberFormatter, @@ -3754,7 +3816,8 @@ module.exports = { outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, outputBlockFormatter: outputBlockFormatter, outputLogFormatter: outputLogFormatter, - outputPostFormatter: outputPostFormatter + outputPostFormatter: outputPostFormatter, + outputSyncingFormatter: outputSyncingFormatter }; @@ -3872,8 +3935,8 @@ SolidityFunction.prototype.call = function () { if (!callback) { var output = web3.exp.call(payload, defaultBlock); return this.unpackOutput(output); - } - + } + var self = this; web3.exp.call(payload, defaultBlock, function (error, output) { callback(error, self.unpackOutput(output)); @@ -3947,11 +4010,11 @@ SolidityFunction.prototype.request = function () { var callback = this.extractCallback(args); var payload = this.toPayload(args); var format = this.unpackOutput.bind(this); - + return { method: this._constant ? 'eth_call' : 'eth_sendTransaction', callback: callback, - params: [payload], + params: [payload], format: format }; }; @@ -4082,7 +4145,7 @@ HttpProvider.prototype.send = function (payload) { try { result = JSON.parse(result); } catch(e) { - throw errors.InvalidResponse(request.responseText); + throw errors.InvalidResponse(request.responseText); } return result; @@ -4096,7 +4159,7 @@ HttpProvider.prototype.send = function (payload) { * @param {Function} callback triggered on end with (err, result) */ HttpProvider.prototype.sendAsync = function (payload, callback) { - var request = this.prepareRequest(true); + var request = this.prepareRequest(true); request.onreadystatechange = function() { if (request.readyState === 4) { @@ -4106,13 +4169,13 @@ HttpProvider.prototype.sendAsync = function (payload, callback) { try { result = JSON.parse(result); } catch(e) { - error = errors.InvalidResponse(request.responseText); + error = errors.InvalidResponse(request.responseText); } callback(error, result); } }; - + try { request.send(JSON.stringify(payload)); } catch(error) { @@ -4160,7 +4223,7 @@ module.exports = HttpProvider; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file iban.js * @author Marek Kotewicz * @date 2015 @@ -4292,7 +4355,8 @@ Iban.isValid = function (iban) { * @returns {Boolean} true if it is, otherwise false */ Iban.prototype.isValid = function () { - return /^XE[0-9]{2}(EXP[0-9A-Z]{13}|[0-9A-Z]{30})$/.test(this._iban) && + + return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && mod9710(iso13616Prepare(this._iban)) === 1; }; @@ -4360,7 +4424,7 @@ Iban.prototype.address = function () { var base36 = this._iban.substr(4); var asBn = new BigNumber(base36, 36); return padLeft(asBn.toString(16), 20); - } + } return ''; }; @@ -4404,9 +4468,9 @@ var errorTimeout = function (method, id) { var err = { "jsonrpc": "2.0", "error": { - "code": -32603, + "code": -32603, "message": "IPC Request timed out for method \'" + method + "\'" - }, + }, "id": id }; return JSON.stringify(err); @@ -4416,7 +4480,7 @@ var IpcProvider = function (path, net) { var _this = this; this.responseCallbacks = {}; this.path = path; - + this.connection = net.connect({path: this.path}); this.connection.on('error', function(e){ @@ -4426,7 +4490,7 @@ var IpcProvider = function (path, net) { this.connection.on('end', function(){ _this._timeout(); - }); + }); // LISTEN FOR CONNECTION RESPONSES @@ -4465,7 +4529,7 @@ Will parse the response and make an array out of it. IpcProvider.prototype._parseResponse = function(data) { var _this = this, returnValues = []; - + // DE-CHUNKER var dechunkedData = data .replace(/\}\{/g,'}|--|{') // }{ @@ -4569,7 +4633,7 @@ IpcProvider.prototype.send = function (payload) { try { result = JSON.parse(data); } catch(e) { - throw errors.InvalidResponse(data); + throw errors.InvalidResponse(data); } return result; @@ -4746,7 +4810,7 @@ Method.prototype.extractCallback = function (args) { /** * Should be called to check if the number of arguments is correct - * + * * @method validateArgs * @param {Array} arguments * @throws {Error} if it is not @@ -4759,7 +4823,7 @@ Method.prototype.validateArgs = function (args) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -4787,7 +4851,7 @@ Method.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -4801,7 +4865,7 @@ Method.prototype.attachToObject = function (obj) { obj[name[0]] = obj[name[0]] || {}; obj[name[0]][name[1]] = func; } else { - obj[name[0]] = func; + obj[name[0]] = func; } }; @@ -5188,6 +5252,11 @@ var properties = [ getter: 'eth_hashrate', outputFormatter: utils.toDecimal }), + new Property({ + name: 'syncing', + getter: 'eth_syncing', + outputFormatter: formatters.outputSyncingFormatter + }), new Property({ name: 'gasPrice', getter: 'eth_gasPrice', @@ -5287,8 +5356,8 @@ var Method = require('../method'); var formatters = require('../formatters'); var post = new Method({ - name: 'post', - call: 'shh_post', + name: 'post', + call: 'shh_post', params: 1, inputFormatter: [formatters.inputPostFormatter] }); @@ -5463,7 +5532,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file namereg.js * @author Marek Kotewicz * @date 2015 @@ -5519,7 +5588,7 @@ var Property = function (options) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -5554,7 +5623,7 @@ Property.prototype.extractCallback = function (args) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -5571,7 +5640,7 @@ Property.prototype.attachToObject = function (obj) { obj = obj[names[0]]; name = names[1]; } - + Object.defineProperty(obj, name, proto); var toAsyncName = function (prefix, name) { @@ -5651,7 +5720,7 @@ module.exports = Property; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** * @file requestmanager.js * @author Jeffrey Wilcke * @author Marek Kotewicz @@ -5733,7 +5802,7 @@ RequestManager.prototype.sendAsync = function (data, callback) { if (err) { return callback(err); } - + if (!Jsonrpc.getInstance().isValidResponse(result)) { return callback(errors.InvalidResponse(result)); } @@ -5766,7 +5835,7 @@ RequestManager.prototype.sendBatch = function (data, callback) { } callback(err, results); - }); + }); }; /** @@ -5814,11 +5883,15 @@ RequestManager.prototype.stopPolling = function (pollId) { * * @method reset */ -RequestManager.prototype.reset = function () { +RequestManager.prototype.reset = function (keepIsSyncing) { for (var key in this.polls) { - this.polls[key].uninstall(); + // remove all polls, except sync polls, + // they need to be removed manually by calling syncing.stopWatching() + if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) { + this.polls[key].uninstall(); + delete this.polls[key]; + } } - this.polls = {}; if (this.timeout) { clearTimeout(this.timeout); @@ -5846,10 +5919,10 @@ RequestManager.prototype.poll = function () { } var pollsData = []; - var pollsKeys = []; + var pollsIds = []; for (var key in this.polls) { pollsData.push(this.polls[key].data); - pollsKeys.push(key); + pollsIds.push(key); } if (pollsData.length === 0) { @@ -5858,8 +5931,17 @@ RequestManager.prototype.poll = function () { var payload = Jsonrpc.getInstance().toBatchPayload(pollsData); + // map the request id to they poll id + var pollsIdMap = {}; + payload.forEach(function(load, index){ + pollsIdMap[load.id] = pollsIds[index]; + }); + + var self = this; this.provider.sendAsync(payload, function (error, results) { + + // TODO: console log? if (error) { return; @@ -5868,25 +5950,23 @@ RequestManager.prototype.poll = function () { if (!utils.isArray(results)) { throw errors.InvalidResponse(results); } + results.map(function (result) { + var id = pollsIdMap[result.id]; - results.map(function (result, index) { - var key = pollsKeys[index]; // make sure the filter is still installed after arrival of the request - if (self.polls[key]) { - result.callback = self.polls[key].callback; + if (self.polls[id]) { + result.callback = self.polls[id].callback; return result; } else return false; }).filter(function (result) { - return !!result; + return !!result; }).filter(function (result) { var valid = Jsonrpc.getInstance().isValidResponse(result); if (!valid) { result.callback(errors.InvalidResponse(result)); } return valid; - }).filter(function (result) { - return utils.isArray(result.result) && result.result.length > 0; }).forEach(function (result) { result.callback(null, result.result); }); @@ -5913,7 +5993,110 @@ module.exports = RequestManager; You should have received a copy of the GNU Lesser General Public License along with expanse.js. If not, see . */ -/** +/** @file syncing.js + * @authors: + * Fabian Vogelsteller + * @date 2015 + */ + +var RequestManager = require('./requestmanager'); +var Method = require('./method'); +var formatters = require('./formatters'); +var utils = require('../utils/utils'); + + + +/** +Adds the callback and sets up the methods, to iterate over the results. + +@method pollSyncing +@param {Object} self +*/ +var pollSyncing = function(self) { + var lastSyncState = false; + + var onMessage = function (error, sync) { + if (error) { + return self.callbacks.forEach(function (callback) { + callback(error); + }); + } + + if(utils.isObject(sync)) + sync = self.implementation.outputFormatter(sync); + + self.callbacks.forEach(function (callback) { + if(lastSyncState !== sync) { + + // call the callback with true first so the app can stop anything, before receiving the sync data + if(!lastSyncState && utils.isObject(sync)) + callback(null, true); + + // call on the next CPU cycle, so the actions of the sync stop can be processes first + setTimeout(function() { + callback(null, sync); + }, 1); + + lastSyncState = sync; + } + }); + }; + + RequestManager.getInstance().startPolling({ + method: self.implementation.call, + params: [], + }, self.pollId, onMessage, self.stopWatching.bind(self)); + +}; + +var IsSyncing = function (callback) { + this.pollId = 'syncPoll_'+ Math.floor(Math.random() * 1000); + this.callbacks = []; + this.implementation = new Method({ + name: 'isSyncing', + call: 'eth_syncing', + params: 0, + outputFormatter: formatters.outputSyncingFormatter + }); + + this.addCallback(callback); + pollSyncing(this); + + return this; +}; + +IsSyncing.prototype.addCallback = function (callback) { + if(callback) + this.callbacks.push(callback); + return this; +}; + +IsSyncing.prototype.stopWatching = function () { + RequestManager.getInstance().stopPolling(this.pollId); + this.callbacks = []; +}; + +module.exports = IsSyncing; + + +},{"../utils/utils":20,"./formatters":29,"./method":35,"./requestmanager":43}],45:[function(require,module,exports){ +/* + This file is part of expanse.js. + + ethereum.js is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethereum.js 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see . +*/ +/** * @file transfer.js * @author Marek Kotewicz * @date 2015 @@ -5935,7 +6118,7 @@ var exchangeAbi = require('../contracts/SmartExchange.json'); * @param {Function} callback, callback */ var transfer = function (from, to, value, callback) { - var iban = new Iban(to); + var iban = new Iban(to); if (!iban.isValid()) { throw new Error('invalid iban address'); } @@ -5943,7 +6126,7 @@ var transfer = function (from, to, value, callback) { if (iban.isDirect()) { return transferToAddress(from, iban.address(), value, callback); } - + if (!callback) { var address = namereg.addr(iban.institution()); return deposit(from, address, value, iban.client()); @@ -5952,7 +6135,7 @@ var transfer = function (from, to, value, callback) { namereg.addr(iban.institution(), function (err, address) { return deposit(from, address, value, iban.client(), callback); }); - + }; /** @@ -5993,8 +6176,10 @@ var deposit = function (from, to, value, client, callback) { module.exports = transfer; -},{"../contracts/SmartExchange.json":3,"../web3":22,"./contract":25,"./iban":32,"./namereg":41}],45:[function(require,module,exports){ -},{}],46:[function(require,module,exports){ + +},{"../contracts/SmartExchange.json":3,"../web3":22,"./contract":25,"./iban":32,"./namereg":41}],46:[function(require,module,exports){ + +},{}],47:[function(require,module,exports){ ;(function (root, factory) { if (typeof exports === "object") { // CommonJS @@ -6737,7 +6922,7 @@ module.exports = transfer; return CryptoJS; })); -},{}],47:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ ;(function (root, factory, undef) { if (typeof exports === "object") { // CommonJS @@ -7061,7 +7246,7 @@ module.exports = transfer; return CryptoJS.SHA3; })); -},{"./core":46,"./x64-core":48}],48:[function(require,module,exports){ +},{"./core":47,"./x64-core":49}],49:[function(require,module,exports){ ;(function (root, factory) { if (typeof exports === "object") { // CommonJS @@ -7366,7 +7551,253 @@ module.exports = transfer; return CryptoJS; })); -},{"./core":46}],"bignumber.js":[function(require,module,exports){ +},{"./core":47}],50:[function(require,module,exports){ +/*! https://mths.be/utf8js v2.0.0 by @mathias */ +;(function(root) { + + // Detect free variables 'exports' + var freeExports = typeof exports == 'object' && exports; + + // Detect free variable 'module' + var freeModule = typeof module == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable 'global', from Node.js or Browserified code, + // and use it as 'root' + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var stringFromCharCode = String.fromCharCode; + + // Taken from https://mths.be/punycode + function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + var value; + var extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + // Taken from https://mths.be/punycode + function ucs2encode(array) { + var length = array.length; + var index = -1; + var value; + var output = ''; + while (++index < length) { + value = array[index]; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + } + return output; + } + + function checkScalarValue(codePoint) { + if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { + throw Error( + 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + + ' is not a scalar value' + ); + } + } + /*--------------------------------------------------------------------------*/ + + function createByte(codePoint, shift) { + return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); + } + + function encodeCodePoint(codePoint) { + if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence + return stringFromCharCode(codePoint); + } + var symbol = ''; + if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence + symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); + } + else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence + checkScalarValue(codePoint); + symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); + symbol += createByte(codePoint, 6); + } + else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence + symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); + symbol += createByte(codePoint, 12); + symbol += createByte(codePoint, 6); + } + symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); + return symbol; + } + + function utf8encode(string) { + var codePoints = ucs2decode(string); + var length = codePoints.length; + var index = -1; + var codePoint; + var byteString = ''; + while (++index < length) { + codePoint = codePoints[index]; + byteString += encodeCodePoint(codePoint); + } + return byteString; + } + + /*--------------------------------------------------------------------------*/ + + function readContinuationByte() { + if (byteIndex >= byteCount) { + throw Error('Invalid byte index'); + } + + var continuationByte = byteArray[byteIndex] & 0xFF; + byteIndex++; + + if ((continuationByte & 0xC0) == 0x80) { + return continuationByte & 0x3F; + } + + // If we end up here, it’s not a continuation byte + throw Error('Invalid continuation byte'); + } + + function decodeSymbol() { + var byte1; + var byte2; + var byte3; + var byte4; + var codePoint; + + if (byteIndex > byteCount) { + throw Error('Invalid byte index'); + } + + if (byteIndex == byteCount) { + return false; + } + + // Read first byte + byte1 = byteArray[byteIndex] & 0xFF; + byteIndex++; + + // 1-byte sequence (no continuation bytes) + if ((byte1 & 0x80) == 0) { + return byte1; + } + + // 2-byte sequence + if ((byte1 & 0xE0) == 0xC0) { + var byte2 = readContinuationByte(); + codePoint = ((byte1 & 0x1F) << 6) | byte2; + if (codePoint >= 0x80) { + return codePoint; + } else { + throw Error('Invalid continuation byte'); + } + } + + // 3-byte sequence (may include unpaired surrogates) + if ((byte1 & 0xF0) == 0xE0) { + byte2 = readContinuationByte(); + byte3 = readContinuationByte(); + codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; + if (codePoint >= 0x0800) { + checkScalarValue(codePoint); + return codePoint; + } else { + throw Error('Invalid continuation byte'); + } + } + + // 4-byte sequence + if ((byte1 & 0xF8) == 0xF0) { + byte2 = readContinuationByte(); + byte3 = readContinuationByte(); + byte4 = readContinuationByte(); + codePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) | + (byte3 << 0x06) | byte4; + if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { + return codePoint; + } + } + + throw Error('Invalid UTF-8 detected'); + } + + var byteArray; + var byteCount; + var byteIndex; + function utf8decode(byteString) { + byteArray = ucs2decode(byteString); + byteCount = byteArray.length; + byteIndex = 0; + var codePoints = []; + var tmp; + while ((tmp = decodeSymbol()) !== false) { + codePoints.push(tmp); + } + return ucs2encode(codePoints); + } + + /*--------------------------------------------------------------------------*/ + + var utf8 = { + 'version': '2.0.0', + 'encode': utf8encode, + 'decode': utf8decode + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define(function() { + return utf8; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = utf8; + } else { // in Narwhal or RingoJS v0.7.0- + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + for (var key in utf8) { + hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); + } + } + } else { // in Rhino or a web browser + root.utf8 = utf8; + } + +}(this)); + +},{}],"bignumber.js":[function(require,module,exports){ 'use strict'; module.exports = BigNumber; // jshint ignore:line @@ -7393,6 +7824,6 @@ if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') { module.exports = web3; -},{"./lib/web3":22,"./lib/web3/contract":25,"./lib/web3/httpprovider":31,"./lib/web3/iban":32,"./lib/web3/ipcprovider":33,"./lib/web3/namereg":41,"./lib/web3/transfer":44}]},{},["web3"]) +},{"./lib/web3":22,"./lib/web3/contract":25,"./lib/web3/httpprovider":31,"./lib/web3/iban":32,"./lib/web3/ipcprovider":33,"./lib/web3/namereg":41,"./lib/web3/transfer":45}]},{},["web3"]) //# sourceMappingURL=web3-light.js.map ` diff --git a/jsre/jsre.go b/jsre/jsre.go index 4efbaa3dce2d..003a899059a1 100644 --- a/jsre/jsre.go +++ b/jsre/jsre.go @@ -154,7 +154,9 @@ loop: if err != nil { fmt.Println("js error:", err, arguments) } - if timer.interval { + + _, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it + if timer.interval && inreg { timer.timer.Reset(timer.duration) } else { delete(registry, timer) diff --git a/metrics/metrics.go b/metrics/metrics.go index 3b865bff992d..c13f13bd292f 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -31,8 +31,8 @@ import ( // MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. var MetricsEnabledFlag = "metrics" -// enabled is the flag specifying if metrics are enable or not. -var enabled = false +// Enabled is the flag specifying if metrics are enable or not. +var Enabled = false // Init enables or disables the metrics system. Since we need this to run before // any other code gets to create meters and timers, we'll actually do an ugly hack @@ -41,7 +41,7 @@ func init() { for _, arg := range os.Args { if strings.TrimLeft(arg, "-") == MetricsEnabledFlag { glog.V(logger.Info).Infof("Enabling metrics collection") - enabled = true + Enabled = true } } } @@ -49,7 +49,7 @@ func init() { // NewMeter create a new metrics Meter, either a real one of a NOP stub depending // on the metrics flag. func NewMeter(name string) metrics.Meter { - if !enabled { + if !Enabled { return new(metrics.NilMeter) } return metrics.GetOrRegisterMeter(name, metrics.DefaultRegistry) @@ -58,7 +58,7 @@ func NewMeter(name string) metrics.Meter { // NewTimer create a new metrics Timer, either a real one of a NOP stub depending // on the metrics flag. func NewTimer(name string) metrics.Timer { - if !enabled { + if !Enabled { return new(metrics.NilTimer) } return metrics.GetOrRegisterTimer(name, metrics.DefaultRegistry) @@ -68,7 +68,7 @@ func NewTimer(name string) metrics.Timer { // process. func CollectProcessMetrics(refresh time.Duration) { // Short circuit if the metrics system is disabled - if !enabled { + if !Enabled { return } // Create the various data collectors diff --git a/miner/agent.go b/miner/agent.go index f23da4f96df4..7c7390384a52 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -19,6 +19,8 @@ package miner import ( "sync" + "sync/atomic" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" @@ -35,6 +37,8 @@ type CpuAgent struct { index int pow pow.PoW + + isMining int32 // isMining indicates whether the agent is currently mining } func NewCpuAgent(index int, pow pow.PoW) *CpuAgent { @@ -61,6 +65,10 @@ func (self *CpuAgent) Start() { self.mu.Lock() defer self.mu.Unlock() + if !atomic.CompareAndSwapInt32(&self.isMining, 0, 1) { + return // agent already started + } + self.quit = make(chan struct{}) // creating current op ch makes sure we're not closing a nil ch // later on @@ -99,10 +107,11 @@ done: case <-self.workCh: default: close(self.workCh) - break done } } + + atomic.StoreInt32(&self.isMining, 0) } func (self *CpuAgent) mine(work *Work, stop <-chan struct{}) { diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 61bf181ec650..e8275498ecae 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -17,6 +17,7 @@ package miner import ( + "errors" "math/big" "sync" "time" @@ -90,7 +91,7 @@ func (a *RemoteAgent) GetHashRate() (tot int64) { return } -func (a *RemoteAgent) GetWork() [3]string { +func (a *RemoteAgent) GetWork() ([3]string, error) { a.mu.Lock() defer a.mu.Unlock() @@ -110,9 +111,9 @@ func (a *RemoteAgent) GetWork() [3]string { res[2] = common.BytesToHash(n.Bytes()).Hex() a.work[block.HashNoNonce()] = a.currentWork + return res, nil } - - return res + return res, errors.New("No work available yet, don't panic.") } // Returns true or false, but does not indicate if the PoW was correct diff --git a/miner/worker.go b/miner/worker.go index a18f6a8df26c..b64a8eae5255 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -29,6 +29,7 @@ import ( "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" + "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/event" "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" @@ -100,7 +101,7 @@ type worker struct { exp core.Backend chain *core.ChainManager proc *core.BlockProcessor - chainDb common.Database + chainDb ethdb.Database coinbase common.Address gasPrice *big.Int @@ -278,12 +279,13 @@ func (self *worker) wait() { glog.V(logger.Error).Infoln("Invalid block found during mining") continue } - if err := core.ValidateHeader(self.exp.BlockProcessor().Pow, block.Header(), parent, true, false); err != nil && err != core.BlockFutureErr { + + if err := core.ValidateHeader(self.exp.BlockProcessor().Pow, block.Header(), parent.Header(), true, false); err != nil && err != core.BlockFutureErr { glog.V(logger.Error).Infoln("Invalid header on mined block:", err) continue } - stat, err := self.chain.WriteBlock(block, false) + stat, err := self.chain.WriteBlock(block) if err != nil { glog.V(logger.Error).Infoln("error writing block to chain", err) continue @@ -533,14 +535,12 @@ func (self *worker) commitNewWork() { // create the new block whose nonce will be mined. work.Block = types.NewBlock(header, work.txs, uncles, work.receipts) - work.Block.Td = new(big.Int).Set(core.CalcTD(work.Block, self.chain.GetBlock(work.Block.ParentHash()))) // We only care about logging if we're actually mining. if atomic.LoadInt32(&self.mining) == 1 { glog.V(logger.Info).Infof("commit new work on block %v with %d txs & %d uncles. Took %v\n", work.Block.Number(), work.tcount, len(uncles), time.Since(tstart)) self.logLocalMinedBlocks(work, previous) } - self.push(work) } diff --git a/p2p/discover/database.go b/p2p/discover/database.go index 0c182934f9f2..e4ac54f9bc46 100644 --- a/p2p/discover/database.go +++ b/p2p/discover/database.go @@ -21,6 +21,7 @@ package discover import ( "bytes" + "crypto/rand" "encoding/binary" "os" "sync" @@ -46,11 +47,8 @@ var ( // nodeDB stores all nodes we know about. type nodeDB struct { - lvl *leveldb.DB // Interface to the database itself - seeder iterator.Iterator // Iterator for fetching possible seed nodes - - self NodeID // Own node id to prevent adding it into the database - + lvl *leveldb.DB // Interface to the database itself + self NodeID // Own node id to prevent adding it into the database runner sync.Once // Ensures we can start at most one expirer quit chan struct{} // Channel to signal the expiring thread to stop } @@ -302,52 +300,70 @@ func (db *nodeDB) updateFindFails(id NodeID, fails int) error { return db.storeInt64(makeKey(id, nodeDBDiscoverFindFails), int64(fails)) } -// querySeeds retrieves a batch of nodes to be used as potential seed servers -// during bootstrapping the node into the network. -// -// Ideal seeds are the most recently seen nodes (highest probability to be still -// alive), but yet untried. However, since leveldb only supports dumb iteration -// we will instead start pulling in potential seeds that haven't been yet pinged -// since the start of the boot procedure. -// -// If the database runs out of potential seeds, we restart the startup counter -// and start iterating over the peers again. -func (db *nodeDB) querySeeds(n int) []*Node { - // Create a new seed iterator if none exists - if db.seeder == nil { - db.seeder = db.lvl.NewIterator(nil, nil) +// querySeeds retrieves random nodes to be used as potential seed nodes +// for bootstrapping. +func (db *nodeDB) querySeeds(n int, maxAge time.Duration) []*Node { + var ( + now = time.Now() + nodes = make([]*Node, 0, n) + it = db.lvl.NewIterator(nil, nil) + id NodeID + ) + defer it.Release() + +seek: + for seeks := 0; len(nodes) < n && seeks < n*5; seeks++ { + // Seek to a random entry. The first byte is incremented by a + // random amount each time in order to increase the likelihood + // of hitting all existing nodes in very small databases. + ctr := id[0] + rand.Read(id[:]) + id[0] = ctr + id[0]%16 + it.Seek(makeKey(id, nodeDBDiscoverRoot)) + + n := nextNode(it) + if n == nil { + id[0] = 0 + continue seek // iterator exhausted + } + if n.ID == db.self { + continue seek + } + if now.Sub(db.lastPong(n.ID)) > maxAge { + continue seek + } + for i := range nodes { + if nodes[i].ID == n.ID { + continue seek // duplicate + } + } + nodes = append(nodes, n) } - // Iterate over the nodes and find suitable seeds - nodes := make([]*Node, 0, n) - for len(nodes) < n && db.seeder.Next() { - // Iterate until a discovery node is found - id, field := splitKey(db.seeder.Key()) + return nodes +} + +// reads the next node record from the iterator, skipping over other +// database entries. +func nextNode(it iterator.Iterator) *Node { + for end := false; !end; end = !it.Next() { + id, field := splitKey(it.Key()) if field != nodeDBDiscoverRoot { continue } - // Dump it if its a self reference - if bytes.Compare(id[:], db.self[:]) == 0 { - db.deleteNode(id) + var n Node + if err := rlp.DecodeBytes(it.Value(), &n); err != nil { + if glog.V(logger.Warn) { + glog.Errorf("invalid node %x: %v", id, err) + } continue } - // Load it as a potential seed - if node := db.node(id); node != nil { - nodes = append(nodes, node) - } - } - // Release the iterator if we reached the end - if len(nodes) == 0 { - db.seeder.Release() - db.seeder = nil + return &n } - return nodes + return nil } // close flushes and closes the database files. func (db *nodeDB) close() { - if db.seeder != nil { - db.seeder.Release() - } close(db.quit) db.lvl.Close() } diff --git a/p2p/discover/database_test.go b/p2p/discover/database_test.go index 9be85bd66778..9f81f8ab8893 100644 --- a/p2p/discover/database_test.go +++ b/p2p/discover/database_test.go @@ -162,9 +162,33 @@ var nodeDBSeedQueryNodes = []struct { node *Node pong time.Time }{ + // This one should not be in the result set because its last + // pong time is too far in the past. { node: newNode( - MustHexID("0x01d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + MustHexID("0x84d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + net.IP{127, 0, 0, 3}, + 30303, + 30303, + ), + pong: time.Now().Add(-3 * time.Hour), + }, + // This one shouldn't be in in the result set because its + // nodeID is the local node's ID. + { + node: newNode( + MustHexID("0x57d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + net.IP{127, 0, 0, 3}, + 30303, + 30303, + ), + pong: time.Now().Add(-4 * time.Second), + }, + + // These should be in the result set. + { + node: newNode( + MustHexID("0x22d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 1}, 42786, 42786, @@ -173,7 +197,7 @@ var nodeDBSeedQueryNodes = []struct { }, { node: newNode( - MustHexID("0x02d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + MustHexID("0x44d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 2}, 42786, 42786, @@ -182,7 +206,7 @@ var nodeDBSeedQueryNodes = []struct { }, { node: newNode( - MustHexID("0x03d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + MustHexID("0xe2d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 3}, 42786, 42786, @@ -192,7 +216,7 @@ var nodeDBSeedQueryNodes = []struct { } func TestNodeDBSeedQuery(t *testing.T) { - db, _ := newNodeDB("", Version, NodeID{}) + db, _ := newNodeDB("", Version, nodeDBSeedQueryNodes[1].node.ID) defer db.close() // Insert a batch of nodes for querying @@ -200,20 +224,24 @@ func TestNodeDBSeedQuery(t *testing.T) { if err := db.updateNode(seed.node); err != nil { t.Fatalf("node %d: failed to insert: %v", i, err) } + if err := db.updateLastPong(seed.node.ID, seed.pong); err != nil { + t.Fatalf("node %d: failed to insert lastPong: %v", i, err) + } } + // Retrieve the entire batch and check for duplicates - seeds := db.querySeeds(2 * len(nodeDBSeedQueryNodes)) - if len(seeds) != len(nodeDBSeedQueryNodes) { - t.Errorf("seed count mismatch: have %v, want %v", len(seeds), len(nodeDBSeedQueryNodes)) - } + seeds := db.querySeeds(len(nodeDBSeedQueryNodes)*2, time.Hour) have := make(map[NodeID]struct{}) for _, seed := range seeds { have[seed.ID] = struct{}{} } want := make(map[NodeID]struct{}) - for _, seed := range nodeDBSeedQueryNodes { + for _, seed := range nodeDBSeedQueryNodes[2:] { want[seed.node.ID] = struct{}{} } + if len(seeds) != len(want) { + t.Errorf("seed count mismatch: have %v, want %v", len(seeds), len(want)) + } for id, _ := range have { if _, ok := want[id]; !ok { t.Errorf("extra seed: %v", id) @@ -224,63 +252,6 @@ func TestNodeDBSeedQuery(t *testing.T) { t.Errorf("missing seed: %v", id) } } - // Make sure the next batch is empty (seed EOF) - seeds = db.querySeeds(2 * len(nodeDBSeedQueryNodes)) - if len(seeds) != 0 { - t.Errorf("seed count mismatch: have %v, want %v", len(seeds), 0) - } -} - -func TestNodeDBSeedQueryContinuation(t *testing.T) { - db, _ := newNodeDB("", Version, NodeID{}) - defer db.close() - - // Insert a batch of nodes for querying - for i, seed := range nodeDBSeedQueryNodes { - if err := db.updateNode(seed.node); err != nil { - t.Fatalf("node %d: failed to insert: %v", i, err) - } - } - // Iteratively retrieve the batch, checking for an empty batch on reset - for i := 0; i < len(nodeDBSeedQueryNodes); i++ { - if seeds := db.querySeeds(1); len(seeds) != 1 { - t.Errorf("1st iteration %d: seed count mismatch: have %v, want %v", i, len(seeds), 1) - } - } - if seeds := db.querySeeds(1); len(seeds) != 0 { - t.Errorf("reset: seed count mismatch: have %v, want %v", len(seeds), 0) - } - for i := 0; i < len(nodeDBSeedQueryNodes); i++ { - if seeds := db.querySeeds(1); len(seeds) != 1 { - t.Errorf("2nd iteration %d: seed count mismatch: have %v, want %v", i, len(seeds), 1) - } - } -} - -func TestNodeDBSelfSeedQuery(t *testing.T) { - // Assign a node as self to verify evacuation - self := nodeDBSeedQueryNodes[0].node.ID - db, _ := newNodeDB("", Version, self) - defer db.close() - - // Insert a batch of nodes for querying - for i, seed := range nodeDBSeedQueryNodes { - if err := db.updateNode(seed.node); err != nil { - t.Fatalf("node %d: failed to insert: %v", i, err) - } - } - // Retrieve the entire batch and check that self was evacuated - seeds := db.querySeeds(2 * len(nodeDBSeedQueryNodes)) - if len(seeds) != len(nodeDBSeedQueryNodes)-1 { - t.Errorf("seed count mismatch: have %v, want %v", len(seeds), len(nodeDBSeedQueryNodes)-1) - } - have := make(map[NodeID]struct{}) - for _, seed := range seeds { - have[seed.ID] = struct{}{} - } - if _, ok := have[self]; ok { - t.Errorf("self not evacuated") - } } func TestNodeDBPersistency(t *testing.T) { diff --git a/p2p/discover/node.go b/p2p/discover/node.go index 8f93232686ab..bd4744817e3b 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -99,9 +99,9 @@ func (n *Node) String() string { // // In the following example, the node URL describes // a node with IP address 10.3.58.6, TCP listening port 42786 -// and UDP discovery port 30301. +// and UDP discovery port 42787. // -// enode://@10.3.58.6:42786?discport=30301 +// enode://@10.3.58.6:42786?discport=42787 func ParseNode(rawurl string) (*Node, error) { var ( id NodeID diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 62c797aa9c07..d0d23461aede 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -44,6 +44,10 @@ const ( maxBondingPingPongs = 16 maxFindnodeFailures = 5 + + autoRefreshInterval = 1 * time.Hour + seedCount = 30 + seedMaxAge = 5 * 24 * time.Hour ) type Table struct { @@ -52,6 +56,10 @@ type Table struct { nursery []*Node // bootstrap nodes db *nodeDB // database of known nodes + refreshReq chan struct{} + closeReq chan struct{} + closed chan struct{} + bondmu sync.Mutex bonding map[NodeID]*bondproc bondslots chan struct{} // limits total number of active bonding processes @@ -80,10 +88,7 @@ type transport interface { // bucket contains nodes, ordered by their last activity. the entry // that was most recently active is the first element in entries. -type bucket struct { - lastLookup time.Time - entries []*Node -} +type bucket struct{ entries []*Node } func newTable(t transport, ourID NodeID, ourAddr *net.UDPAddr, nodeDBPath string) *Table { // If no node database was given, use an in-memory one @@ -93,11 +98,14 @@ func newTable(t transport, ourID NodeID, ourAddr *net.UDPAddr, nodeDBPath string db, _ = newNodeDB("", Version, ourID) } tab := &Table{ - net: t, - db: db, - self: newNode(ourID, ourAddr.IP, uint16(ourAddr.Port), uint16(ourAddr.Port)), - bonding: make(map[NodeID]*bondproc), - bondslots: make(chan struct{}, maxBondingPingPongs), + net: t, + db: db, + self: newNode(ourID, ourAddr.IP, uint16(ourAddr.Port), uint16(ourAddr.Port)), + bonding: make(map[NodeID]*bondproc), + bondslots: make(chan struct{}, maxBondingPingPongs), + refreshReq: make(chan struct{}), + closeReq: make(chan struct{}), + closed: make(chan struct{}), } for i := 0; i < cap(tab.bondslots); i++ { tab.bondslots <- struct{}{} @@ -105,6 +113,7 @@ func newTable(t transport, ourID NodeID, ourAddr *net.UDPAddr, nodeDBPath string for i := range tab.buckets { tab.buckets[i] = new(bucket) } + go tab.refreshLoop() return tab } @@ -163,10 +172,12 @@ func randUint(max uint32) uint32 { // Close terminates the network listener and flushes the node database. func (tab *Table) Close() { - if tab.net != nil { - tab.net.close() + select { + case <-tab.closed: + // already closed. + case tab.closeReq <- struct{}{}: + <-tab.closed // wait for refreshLoop to end. } - tab.db.close() } // Bootstrap sets the bootstrap nodes. These nodes are used to connect @@ -183,7 +194,7 @@ func (tab *Table) Bootstrap(nodes []*Node) { tab.nursery = append(tab.nursery, &cpy) } tab.mutex.Unlock() - tab.refresh() + tab.requestRefresh() } // Lookup performs a network search for nodes close @@ -204,15 +215,13 @@ func (tab *Table) Lookup(targetID NodeID) []*Node { asked[tab.self.ID] = true tab.mutex.Lock() - // update last lookup stamp (for refresh logic) - tab.buckets[logdist(tab.self.sha, target)].lastLookup = time.Now() // generate initial result set result := tab.closest(target, bucketSize) tab.mutex.Unlock() - // If the result set is empty, all nodes were dropped, refresh + // If the result set is empty, all nodes were dropped, refresh. if len(result.entries) == 0 { - tab.refresh() + tab.requestRefresh() return nil } @@ -257,56 +266,86 @@ func (tab *Table) Lookup(targetID NodeID) []*Node { return result.entries } -// refresh performs a lookup for a random target to keep buckets full, or seeds -// the table if it is empty (initial bootstrap or discarded faulty peers). -func (tab *Table) refresh() { - seed := true +func (tab *Table) requestRefresh() { + select { + case tab.refreshReq <- struct{}{}: + case <-tab.closed: + } +} - // If the discovery table is empty, seed with previously known nodes - tab.mutex.Lock() - for _, bucket := range tab.buckets { - if len(bucket.entries) > 0 { - seed = false - break +func (tab *Table) refreshLoop() { + defer func() { + tab.db.close() + if tab.net != nil { + tab.net.close() } - } - tab.mutex.Unlock() + close(tab.closed) + }() - // If the table is not empty, try to refresh using the live entries - if !seed { - // The Kademlia paper specifies that the bucket refresh should - // perform a refresh in the least recently used bucket. We cannot - // adhere to this because the findnode target is a 512bit value - // (not hash-sized) and it is not easily possible to generate a - // sha3 preimage that falls into a chosen bucket. - // - // We perform a lookup with a random target instead. - var target NodeID - rand.Read(target[:]) - - result := tab.Lookup(target) - if len(result) == 0 { - // Lookup failed, seed after all - seed = true + timer := time.NewTicker(autoRefreshInterval) + var done chan struct{} + for { + select { + case <-timer.C: + if done == nil { + done = make(chan struct{}) + go tab.doRefresh(done) + } + case <-tab.refreshReq: + if done == nil { + done = make(chan struct{}) + go tab.doRefresh(done) + } + case <-done: + done = nil + case <-tab.closeReq: + if done != nil { + <-done + } + return } } +} - if seed { - // Pick a batch of previously know seeds to lookup with - seeds := tab.db.querySeeds(10) - for _, seed := range seeds { - glog.V(logger.Debug).Infoln("Seeding network with", seed) - } - nodes := append(tab.nursery, seeds...) +// doRefresh performs a lookup for a random target to keep buckets +// full. seed nodes are inserted if the table is empty (initial +// bootstrap or discarded faulty peers). +func (tab *Table) doRefresh(done chan struct{}) { + defer close(done) + + // The Kademlia paper specifies that the bucket refresh should + // perform a lookup in the least recently used bucket. We cannot + // adhere to this because the findnode target is a 512bit value + // (not hash-sized) and it is not easily possible to generate a + // sha3 preimage that falls into a chosen bucket. + // We perform a lookup with a random target instead. + var target NodeID + rand.Read(target[:]) + result := tab.Lookup(target) + if len(result) > 0 { + return + } - // Bond with all the seed nodes (will pingpong only if failed recently) - bonded := tab.bondall(nodes) - if len(bonded) > 0 { - tab.Lookup(tab.self.ID) + // The table is empty. Load nodes from the database and insert + // them. This should yield a few previously seen nodes that are + // (hopefully) still alive. + seeds := tab.db.querySeeds(seedCount, seedMaxAge) + seeds = tab.bondall(append(seeds, tab.nursery...)) + if glog.V(logger.Debug) { + if len(seeds) == 0 { + glog.Infof("no seed nodes found") + } + for _, n := range seeds { + age := time.Since(tab.db.lastPong(n.ID)) + glog.Infof("seed node (age %v): %v", age, n) } - // TODO: the Kademlia paper says that we're supposed to perform - // random lookups in all buckets further away than our closest neighbor. } + tab.mutex.Lock() + tab.stuff(seeds) + tab.mutex.Unlock() + + // Finally, do a self lookup to fill up the buckets. + tab.Lookup(tab.self.ID) } // closest returns the n nodes in the table that are closest to the @@ -373,8 +412,9 @@ func (tab *Table) bond(pinged bool, id NodeID, addr *net.UDPAddr, tcpPort uint16 } // If the node is unknown (non-bonded) or failed (remotely unknown), bond from scratch var result error - if node == nil || fails > 0 { - glog.V(logger.Detail).Infof("Bonding %x: known=%v, fails=%v", id[:8], node != nil, fails) + age := time.Since(tab.db.lastPong(id)) + if node == nil || fails > 0 || age > nodeDBNodeExpiration { + glog.V(logger.Detail).Infof("Bonding %x: known=%t, fails=%d age=%v", id[:8], node != nil, fails, age) tab.bondmu.Lock() w := tab.bonding[id] @@ -435,13 +475,17 @@ func (tab *Table) pingpong(w *bondproc, pinged bool, id NodeID, addr *net.UDPAdd // ping a remote endpoint and wait for a reply, also updating the node // database accordingly. func (tab *Table) ping(id NodeID, addr *net.UDPAddr) error { - // Update the last ping and send the message tab.db.updateLastPing(id, time.Now()) if err := tab.net.ping(id, addr); err != nil { return err } - // Pong received, update the database and return tab.db.updateLastPong(id, time.Now()) + + // Start the background expiration goroutine after the first + // successful communication. Subsequent calls have no effect if it + // is already running. We do this here instead of somewhere else + // so that the search for seed nodes also considers older nodes + // that would otherwise be removed by the expiration. tab.db.ensureExpirer() return nil } diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index 1213d4c2774f..c0233c30b2bd 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -514,9 +514,6 @@ func (tn *preminedTestnet) findnode(toid NodeID, toaddr *net.UDPAddr, target Nod if toaddr.Port == 0 { panic("query to node at distance 0") } - if target != tn.target { - panic("findnode with wrong target") - } next := uint16(toaddr.Port) - 1 var result []*Node for i, id := range tn.dists[toaddr.Port] { diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 2bf2faaa330e..83635189a523 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -39,7 +39,6 @@ var ( errPacketTooSmall = errors.New("too small") errBadHash = errors.New("bad hash") errExpired = errors.New("expired") - errBadVersion = errors.New("version mismatch") errUnsolicitedReply = errors.New("unsolicited reply") errUnknownNode = errors.New("unknown node") errTimeout = errors.New("RPC timeout") @@ -52,8 +51,6 @@ const ( respTimeout = 500 * time.Millisecond sendTimeout = 500 * time.Millisecond expiration = 20 * time.Second - - refreshInterval = 1 * time.Hour ) // RPC packet types @@ -312,10 +309,8 @@ func (t *udp) loop() { plist = list.New() timeout = time.NewTimer(0) nextTimeout *pending // head of plist when timeout was last reset - refresh = time.NewTicker(refreshInterval) ) <-timeout.C // ignore first timeout - defer refresh.Stop() defer timeout.Stop() resetTimeout := func() { @@ -344,9 +339,6 @@ func (t *udp) loop() { resetTimeout() select { - case <-refresh.C: - go t.refresh() - case <-t.closing: for el := plist.Front(); el != nil; el = el.Next() { el.Value.(*pending).errc <- errClosed @@ -529,9 +521,6 @@ func (req *ping) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) er if expired(req.Expiration) { return errExpired } - if req.Version != Version { - return errBadVersion - } t.send(from, pongPacket, pong{ To: makeEndpoint(from, req.From.TCP), ReplyTok: mac, diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go index 1dc9d83b2ce8..6879120825fd 100644 --- a/p2p/discover/udp_test.go +++ b/p2p/discover/udp_test.go @@ -122,7 +122,6 @@ func TestUDP_packetErrors(t *testing.T) { defer test.table.Close() test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: Version}) - test.packetIn(errBadVersion, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 99, Expiration: futureExp}) test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp}) test.packetIn(errUnknownNode, findnodePacket, &findnode{Expiration: futureExp}) test.packetIn(errUnsolicitedReply, neighborsPacket, &neighbors{Expiration: futureExp}) @@ -298,7 +297,7 @@ func TestUDP_findnodeMultiReply(t *testing.T) { list := []*Node{ MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:42786?discport=30304"), MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:42786"), - MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17"), + MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:42787?discport=17"), MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:42786"), } rpclist := make([]rpcNode, len(list)) diff --git a/p2p/metrics.go b/p2p/metrics.go index 9eb674038567..dc115e36b05f 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -38,8 +38,14 @@ type meteredConn struct { } // newMeteredConn creates a new metered connection, also bumping the ingress or -// egress connection meter. +// egress connection meter. If the metrics system is disabled, this function +// returns the original object. func newMeteredConn(conn net.Conn, ingress bool) net.Conn { + // Short circuit if metrics are disabled + if !metrics.Enabled { + return conn + } + // Otherwise bump the connection counters and wrap the connection if ingress { ingressConnectMeter.Mark(1) } else { diff --git a/rlp/decode.go b/rlp/decode.go index 0ce56d6488a9..630b23a79cf2 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -173,6 +173,8 @@ var ( func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) { kind := typ.Kind() switch { + case typ == rawValueType: + return decodeRawValue, nil case typ.Implements(decoderInterface): return decodeDecoder, nil case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface): @@ -203,6 +205,15 @@ func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) { } } +func decodeRawValue(s *Stream, val reflect.Value) error { + r, err := s.Raw() + if err != nil { + return err + } + val.SetBytes(r) + return nil +} + func decodeUint(s *Stream, val reflect.Value) error { typ := val.Type() num, err := s.uint(typ.Bits()) diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 16400f84b08f..9ea5f7f8748c 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -24,6 +24,7 @@ import ( "io" "math/big" "reflect" + "strings" "testing" ) @@ -437,6 +438,11 @@ var decodeTests = []decodeTest{ error: "rlp: expected input string or byte for uint, decoding into (rlp.recstruct).Child.I", }, + // RawValue + {input: "01", ptr: new(RawValue), value: RawValue(unhex("01"))}, + {input: "82FFFF", ptr: new(RawValue), value: RawValue(unhex("82FFFF"))}, + {input: "C20102", ptr: new([]RawValue), value: []RawValue{unhex("01"), unhex("02")}}, + // pointers {input: "00", ptr: new(*[]byte), value: &[]byte{0}}, {input: "80", ptr: new(*uint), value: uintp(0)}, @@ -725,7 +731,7 @@ func encodeTestSlice(n uint) []byte { } func unhex(str string) []byte { - b, err := hex.DecodeString(str) + b, err := hex.DecodeString(strings.Replace(str, " ", "", -1)) if err != nil { panic(fmt.Sprintf("invalid hex string: %q", str)) } diff --git a/rlp/encode.go b/rlp/encode.go index cf60ffd392f3..9c3a60722b08 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -45,12 +45,6 @@ type Encoder interface { EncodeRLP(io.Writer) error } -// ListSize returns the encoded size of an RLP list with the given -// content size. -func ListSize(contentSize uint64) uint64 { - return uint64(headsize(contentSize)) + contentSize -} - // Encode writes the RLP encoding of val to w. Note that Encode may // perform many small writes in some cases. Consider making w // buffered. @@ -90,8 +84,8 @@ func Encode(w io.Writer, val interface{}) error { return outer.encode(val) } eb := encbufPool.Get().(*encbuf) - eb.reset() defer encbufPool.Put(eb) + eb.reset() if err := eb.encode(val); err != nil { return err } @@ -102,8 +96,8 @@ func Encode(w io.Writer, val interface{}) error { // Please see the documentation of Encode for the encoding rules. func EncodeToBytes(val interface{}) ([]byte, error) { eb := encbufPool.Get().(*encbuf) - eb.reset() defer encbufPool.Put(eb) + eb.reset() if err := eb.encode(val); err != nil { return nil, err } @@ -288,8 +282,13 @@ type encReader struct { func (r *encReader) Read(b []byte) (n int, err error) { for { if r.piece = r.next(); r.piece == nil { - encbufPool.Put(r.buf) - r.buf = nil + // Put the encode buffer back into the pool at EOF when it + // is first encountered. Subsequent calls still return EOF + // as the error but the buffer is no longer valid. + if r.buf != nil { + encbufPool.Put(r.buf) + r.buf = nil + } return n, io.EOF } nn := copy(b[n:], r.piece) @@ -349,6 +348,8 @@ var ( func makeWriter(typ reflect.Type) (writer, error) { kind := typ.Kind() switch { + case typ == rawValueType: + return writeRawValue, nil case typ.Implements(encoderInterface): return writeEncoder, nil case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(encoderInterface): @@ -384,6 +385,11 @@ func isByte(typ reflect.Type) bool { return typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface) } +func writeRawValue(val reflect.Value, w *encbuf) error { + w.str = append(w.str, val.Bytes()...) + return nil +} + func writeUint(val reflect.Value, w *encbuf) error { i := val.Uint() if i == 0 { diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 07ef8c2df3cc..26bddf7f3055 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -23,6 +23,7 @@ import ( "io" "io/ioutil" "math/big" + "sync" "testing" ) @@ -203,6 +204,11 @@ var encTests = []encTest{ output: "F90200CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376", }, + // RawValue + {val: RawValue(unhex("01")), output: "01"}, + {val: RawValue(unhex("82FFFF")), output: "82FFFF"}, + {val: []RawValue{unhex("01"), unhex("02")}, output: "C20102"}, + // structs {val: simplestruct{}, output: "C28080"}, {val: simplestruct{A: 3, B: "foo"}, output: "C50383666F6F"}, @@ -306,3 +312,25 @@ func TestEncodeToReaderPiecewise(t *testing.T) { return output, nil }) } + +// This is a regression test verifying that encReader +// returns its encbuf to the pool only once. +func TestEncodeToReaderReturnToPool(t *testing.T) { + buf := make([]byte, 50) + wg := new(sync.WaitGroup) + for i := 0; i < 5; i++ { + wg.Add(1) + go func() { + for i := 0; i < 1000; i++ { + _, r, _ := EncodeToReader("foo") + ioutil.ReadAll(r) + r.Read(buf) + r.Read(buf) + r.Read(buf) + r.Read(buf) + } + wg.Done() + }() + } + wg.Wait() +} diff --git a/rlp/raw.go b/rlp/raw.go new file mode 100644 index 000000000000..33aae6ee5399 --- /dev/null +++ b/rlp/raw.go @@ -0,0 +1,156 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rlp + +import ( + "io" + "reflect" +) + +// RawValue represents an encoded RLP value and can be used to delay +// RLP decoding or precompute an encoding. Note that the decoder does +// not verify whether the content of RawValues is valid RLP. +type RawValue []byte + +var rawValueType = reflect.TypeOf(RawValue{}) + +// ListSize returns the encoded size of an RLP list with the given +// content size. +func ListSize(contentSize uint64) uint64 { + return uint64(headsize(contentSize)) + contentSize +} + +// Split returns the content of first RLP value and any +// bytes after the value as subslices of b. +func Split(b []byte) (k Kind, content, rest []byte, err error) { + k, ts, cs, err := readKind(b) + if err != nil { + return 0, nil, b, err + } + return k, b[ts : ts+cs], b[ts+cs:], nil +} + +// SplitString splits b into the content of an RLP string +// and any remaining bytes after the string. +func SplitString(b []byte) (content, rest []byte, err error) { + k, content, rest, err := Split(b) + if err != nil { + return nil, b, err + } + if k == List { + return nil, b, ErrExpectedString + } + return content, rest, nil +} + +// SplitList splits b into the content of a list and any remaining +// bytes after the list. +func SplitList(b []byte) (content, rest []byte, err error) { + k, content, rest, err := Split(b) + if err != nil { + return nil, b, err + } + if k != List { + return nil, b, ErrExpectedList + } + return content, rest, nil +} + +// CountValues counts the number of encoded values in b. +func CountValues(b []byte) (int, error) { + i := 0 + for ; len(b) > 0; i++ { + _, tagsize, size, err := readKind(b) + if err != nil { + return 0, err + } + b = b[tagsize+size:] + } + return i, nil +} + +func readKind(buf []byte) (k Kind, tagsize, contentsize uint64, err error) { + if len(buf) == 0 { + return 0, 0, 0, io.ErrUnexpectedEOF + } + b := buf[0] + switch { + case b < 0x80: + k = Byte + tagsize = 0 + contentsize = 1 + case b < 0xB8: + k = String + tagsize = 1 + contentsize = uint64(b - 0x80) + // Reject strings that should've been single bytes. + if contentsize == 1 && buf[1] < 128 { + return 0, 0, 0, ErrCanonSize + } + case b < 0xC0: + k = String + tagsize = uint64(b-0xB7) + 1 + contentsize, err = readSize(buf[1:], b-0xB7) + case b < 0xF8: + k = List + tagsize = 1 + contentsize = uint64(b - 0xC0) + default: + k = List + tagsize = uint64(b-0xF7) + 1 + contentsize, err = readSize(buf[1:], b-0xF7) + } + if err != nil { + return 0, 0, 0, err + } + // Reject values larger than the input slice. + if contentsize > uint64(len(buf))-tagsize { + return 0, 0, 0, ErrValueTooLarge + } + return k, tagsize, contentsize, err +} + +func readSize(b []byte, slen byte) (uint64, error) { + if int(slen) > len(b) { + return 0, io.ErrUnexpectedEOF + } + var s uint64 + switch slen { + case 1: + s = uint64(b[0]) + case 2: + s = uint64(b[0])<<8 | uint64(b[1]) + case 3: + s = uint64(b[0])<<16 | uint64(b[1])<<8 | uint64(b[2]) + case 4: + s = uint64(b[0])<<24 | uint64(b[1])<<16 | uint64(b[2])<<8 | uint64(b[3]) + case 5: + s = uint64(b[0])<<32 | uint64(b[1])<<24 | uint64(b[2])<<16 | uint64(b[3])<<8 | uint64(b[4]) + case 6: + s = uint64(b[0])<<40 | uint64(b[1])<<32 | uint64(b[2])<<24 | uint64(b[3])<<16 | uint64(b[4])<<8 | uint64(b[5]) + case 7: + s = uint64(b[0])<<48 | uint64(b[1])<<40 | uint64(b[2])<<32 | uint64(b[3])<<24 | uint64(b[4])<<16 | uint64(b[5])<<8 | uint64(b[6]) + case 8: + s = uint64(b[0])<<56 | uint64(b[1])<<48 | uint64(b[2])<<40 | uint64(b[3])<<32 | uint64(b[4])<<24 | uint64(b[5])<<16 | uint64(b[6])<<8 | uint64(b[7]) + } + // Reject sizes < 56 (shouldn't have separate size) and sizes with + // leading zero bytes. + if s < 56 || b[0] == 0 { + return 0, ErrCanonSize + } + return s, nil +} diff --git a/rlp/raw_test.go b/rlp/raw_test.go new file mode 100644 index 000000000000..7d3ca13af9c3 --- /dev/null +++ b/rlp/raw_test.go @@ -0,0 +1,195 @@ +// Copyright 2015 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package rlp + +import ( + "bytes" + "io" + "reflect" + "testing" +) + +func TestCountValues(t *testing.T) { + tests := []struct { + input string // note: spaces in input are stripped by unhex + count int + err error + }{ + // simple cases + {"", 0, nil}, + {"00", 1, nil}, + {"80", 1, nil}, + {"C0", 1, nil}, + {"01 02 03", 3, nil}, + {"01 C406070809 02", 3, nil}, + {"820101 820202 8403030303 04", 4, nil}, + + // size errors + {"8142", 0, ErrCanonSize}, + {"01 01 8142", 0, ErrCanonSize}, + {"02 84020202", 0, ErrValueTooLarge}, + + { + input: "A12000BF49F440A1CD0527E4D06E2765654C0F56452257516D793A9B8D604DCFDF2AB853F851808D10000000000000000000000000A056E81F171BCC55A6FF8345E692C0F86E5B48E01B996CADC001622FB5E363B421A0C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470", + count: 2, + }, + } + for i, test := range tests { + count, err := CountValues(unhex(test.input)) + if count != test.count { + t.Errorf("test %d: count mismatch, got %d want %d\ninput: %s", i, count, test.count, test.input) + } + if !reflect.DeepEqual(err, test.err) { + t.Errorf("test %d: err mismatch, got %q want %q\ninput: %s", i, err, test.err, test.input) + } + } +} + +func TestSplitTypes(t *testing.T) { + if _, _, err := SplitString(unhex("C100")); err != ErrExpectedString { + t.Error("SplitString returned %q, want %q", err, ErrExpectedString) + } + if _, _, err := SplitList(unhex("01")); err != ErrExpectedList { + t.Error("SplitString returned %q, want %q", err, ErrExpectedList) + } + if _, _, err := SplitList(unhex("81FF")); err != ErrExpectedList { + t.Error("SplitString returned %q, want %q", err, ErrExpectedList) + } +} + +func TestSplit(t *testing.T) { + tests := []struct { + input string + kind Kind + val, rest string + err error + }{ + {input: "01FFFF", kind: Byte, val: "01", rest: "FFFF"}, + {input: "80FFFF", kind: String, val: "", rest: "FFFF"}, + {input: "C3010203", kind: List, val: "010203"}, + + // errors + {input: "", err: io.ErrUnexpectedEOF}, + + {input: "8141", err: ErrCanonSize, rest: "8141"}, + {input: "B800", err: ErrCanonSize, rest: "B800"}, + {input: "B802FFFF", err: ErrCanonSize, rest: "B802FFFF"}, + {input: "B90000", err: ErrCanonSize, rest: "B90000"}, + {input: "B90055", err: ErrCanonSize, rest: "B90055"}, + {input: "BA0002FFFF", err: ErrCanonSize, rest: "BA0002FFFF"}, + {input: "F800", err: ErrCanonSize, rest: "F800"}, + {input: "F90000", err: ErrCanonSize, rest: "F90000"}, + {input: "F90055", err: ErrCanonSize, rest: "F90055"}, + {input: "FA0002FFFF", err: ErrCanonSize, rest: "FA0002FFFF"}, + + {input: "8501010101", err: ErrValueTooLarge, rest: "8501010101"}, + {input: "C60607080902", err: ErrValueTooLarge, rest: "C60607080902"}, + + // size check overflow + {input: "BFFFFFFFFFFFFFFFFF", err: ErrValueTooLarge, rest: "BFFFFFFFFFFFFFFFFF"}, + {input: "FFFFFFFFFFFFFFFFFF", err: ErrValueTooLarge, rest: "FFFFFFFFFFFFFFFFFF"}, + + { + input: "B838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + err: ErrValueTooLarge, + rest: "B838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + }, + { + input: "F838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + err: ErrValueTooLarge, + rest: "F838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + }, + + // a few bigger values, just for kicks + { + input: "F839FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + kind: List, + val: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + rest: "", + }, + { + input: "F90211A060EF29F20CC1007AE6E9530AEE16F4B31F8F1769A2D1264EC995C6D1241868D6A07C62AB8AC9838F5F5877B20BB37B387BC2106E97A3D52172CBEDB5EE17C36008A00EAB6B7324AADC0F6047C6AFC8229F09F7CF451B51D67C8DFB08D49BA8C3C626A04453343B2F3A6E42FCF87948F88AF7C8FC16D0C2735CBA7F026836239AB2C15FA024635C7291C882CE4C0763760C1A362DFC3FFCD802A55722236DE058D74202ACA0A220C808DE10F55E40AB25255201CFF009EA181D3906638E944EE2BF34049984A08D325AB26796F1CCB470F69C0F842501DC35D368A0C2575B2D243CFD1E8AB0FDA0B5298FF60DA5069463D610513C9F04F24051348391A143AFFAB7197DFACDEA72A02D2A7058A4463F8FB69378369E11EF33AE3252E2DB86CB545B36D3C26DDECE5AA0888F97BCA8E0BD83DC5B3B91CFF5FAF2F66F9501010682D67EF4A3B4E66115FBA0E8175A60C93BE9ED02921958F0EA55DA0FB5E4802AF5846147BAD92BC2D8AF26A08B3376FF433F3A4250FA64B7F804004CAC5807877D91C4427BD1CD05CF912ED8A09B32EF0F03BD13C37FF950C0CCCEFCCDD6669F2E7F2AA5CB859928E84E29763EA09BBA5E46610C8C8B1F8E921E5691BF8C7E40D75825D5EA3217AA9C3A8A355F39A0EEB95BC78251CCCEC54A97F19755C4A59A293544EEE6119AFA50531211E53C4FA00B6E86FE150BF4A9E0FEEE9C90F5465E617A861BB5E357F942881EE762212E2580", + kind: List, + val: "A060EF29F20CC1007AE6E9530AEE16F4B31F8F1769A2D1264EC995C6D1241868D6A07C62AB8AC9838F5F5877B20BB37B387BC2106E97A3D52172CBEDB5EE17C36008A00EAB6B7324AADC0F6047C6AFC8229F09F7CF451B51D67C8DFB08D49BA8C3C626A04453343B2F3A6E42FCF87948F88AF7C8FC16D0C2735CBA7F026836239AB2C15FA024635C7291C882CE4C0763760C1A362DFC3FFCD802A55722236DE058D74202ACA0A220C808DE10F55E40AB25255201CFF009EA181D3906638E944EE2BF34049984A08D325AB26796F1CCB470F69C0F842501DC35D368A0C2575B2D243CFD1E8AB0FDA0B5298FF60DA5069463D610513C9F04F24051348391A143AFFAB7197DFACDEA72A02D2A7058A4463F8FB69378369E11EF33AE3252E2DB86CB545B36D3C26DDECE5AA0888F97BCA8E0BD83DC5B3B91CFF5FAF2F66F9501010682D67EF4A3B4E66115FBA0E8175A60C93BE9ED02921958F0EA55DA0FB5E4802AF5846147BAD92BC2D8AF26A08B3376FF433F3A4250FA64B7F804004CAC5807877D91C4427BD1CD05CF912ED8A09B32EF0F03BD13C37FF950C0CCCEFCCDD6669F2E7F2AA5CB859928E84E29763EA09BBA5E46610C8C8B1F8E921E5691BF8C7E40D75825D5EA3217AA9C3A8A355F39A0EEB95BC78251CCCEC54A97F19755C4A59A293544EEE6119AFA50531211E53C4FA00B6E86FE150BF4A9E0FEEE9C90F5465E617A861BB5E357F942881EE762212E2580", + rest: "", + }, + { + input: "F877A12000BF49F440A1CD0527E4D06E2765654C0F56452257516D793A9B8D604DCFDF2AB853F851808D10000000000000000000000000A056E81F171BCC55A6FF8345E692C0F86E5B48E01B996CADC001622FB5E363B421A0C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470", + kind: List, + val: "A12000BF49F440A1CD0527E4D06E2765654C0F56452257516D793A9B8D604DCFDF2AB853F851808D10000000000000000000000000A056E81F171BCC55A6FF8345E692C0F86E5B48E01B996CADC001622FB5E363B421A0C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470", + rest: "", + }, + } + + for i, test := range tests { + kind, val, rest, err := Split(unhex(test.input)) + if kind != test.kind { + t.Errorf("test %d: kind mismatch: got %v, want %v", i, kind, test.kind) + } + if !bytes.Equal(val, unhex(test.val)) { + t.Errorf("test %d: val mismatch: got %x, want %s", i, val, test.val) + } + if !bytes.Equal(rest, unhex(test.rest)) { + t.Errorf("test %d: rest mismatch: got %x, want %s", i, rest, test.rest) + } + if err != test.err { + t.Errorf("test %d: error mismatch: got %q, want %q", i, err, test.err) + } + } +} + +func TestReadSize(t *testing.T) { + tests := []struct { + input string + slen byte + size uint64 + err error + }{ + {input: "", slen: 1, err: io.ErrUnexpectedEOF}, + {input: "FF", slen: 2, err: io.ErrUnexpectedEOF}, + {input: "00", slen: 1, err: ErrCanonSize}, + {input: "36", slen: 1, err: ErrCanonSize}, + {input: "37", slen: 1, err: ErrCanonSize}, + {input: "38", slen: 1, size: 0x38}, + {input: "FF", slen: 1, size: 0xFF}, + {input: "FFFF", slen: 2, size: 0xFFFF}, + {input: "FFFFFF", slen: 3, size: 0xFFFFFF}, + {input: "FFFFFFFF", slen: 4, size: 0xFFFFFFFF}, + {input: "FFFFFFFFFF", slen: 5, size: 0xFFFFFFFFFF}, + {input: "FFFFFFFFFFFF", slen: 6, size: 0xFFFFFFFFFFFF}, + {input: "FFFFFFFFFFFFFF", slen: 7, size: 0xFFFFFFFFFFFFFF}, + {input: "FFFFFFFFFFFFFFFF", slen: 8, size: 0xFFFFFFFFFFFFFFFF}, + {input: "0102", slen: 2, size: 0x0102}, + {input: "010203", slen: 3, size: 0x010203}, + {input: "01020304", slen: 4, size: 0x01020304}, + {input: "0102030405", slen: 5, size: 0x0102030405}, + {input: "010203040506", slen: 6, size: 0x010203040506}, + {input: "01020304050607", slen: 7, size: 0x01020304050607}, + {input: "0102030405060708", slen: 8, size: 0x0102030405060708}, + } + + for _, test := range tests { + size, err := readSize(unhex(test.input), test.slen) + if err != test.err { + t.Errorf("readSize(%s, %d): error mismatch: got %q, want %q", test.input, test.slen, err, test.err) + continue + } + if size != test.size { + t.Errorf("readSize(%s, %d): size mismatch: got %#x, want %#x", test.input, test.slen, size, test.size) + } + } +} diff --git a/rpc/api/admin.go b/rpc/api/admin.go index 15ff1f96a0e0..0d01c7c2ebf1 100644 --- a/rpc/api/admin.go +++ b/rpc/api/admin.go @@ -55,7 +55,6 @@ var ( "admin_exportChain": (*adminApi).ExportChain, "admin_importChain": (*adminApi).ImportChain, "admin_verbosity": (*adminApi).Verbosity, - "admin_chainSyncStatus": (*adminApi).ChainSyncStatus, "admin_setSolc": (*adminApi).SetSolc, "admin_datadir": (*adminApi).DataDir, "admin_startRPC": (*adminApi).StartRPC, @@ -232,17 +231,6 @@ func (self *adminApi) Verbosity(req *shared.Request) (interface{}, error) { return true, nil } -func (self *adminApi) ChainSyncStatus(req *shared.Request) (interface{}, error) { - pending, cached, importing, estimate := self.expanse.Downloader().Stats() - - return map[string]interface{}{ - "blocksAvailable": pending, - "blocksWaitingForImport": cached, - "importing": importing, - "estimate": estimate.String(), - }, nil -} - func (self *adminApi) SetSolc(req *shared.Request) (interface{}, error) { args := new(SetSolcArgs) if err := self.coder.Decode(req.Params, &args); err != nil { diff --git a/rpc/api/admin_js.go b/rpc/api/admin_js.go index fb27e35eeb96..539b21a6f4b3 100644 --- a/rpc/api/admin_js.go +++ b/rpc/api/admin_js.go @@ -143,10 +143,6 @@ web3._extend({ new web3._extend.Property({ name: 'datadir', getter: 'admin_datadir' - }), - new web3._extend.Property({ - name: 'chainSyncStatus', - getter: 'admin_chainSyncStatus' }) ] }); diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 6f7734b9d424..443452408967 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -55,6 +55,7 @@ var ( "eth_protocolVersion": (*ethApi).ProtocolVersion, "eth_coinbase": (*ethApi).Coinbase, "eth_mining": (*ethApi).IsMining, + "eth_syncing": (*ethApi).IsSyncing, "eth_gasPrice": (*ethApi).GasPrice, "eth_getStorage": (*ethApi).GetStorage, "eth_storageAt": (*ethApi).GetStorage, @@ -96,6 +97,54 @@ var ( "eth_resend": (*ethApi).Resend, "eth_pendingTransactions": (*ethApi).PendingTransactions, "eth_getTransactionReceipt": (*ethApi).GetTransactionReceipt, + "exp_accounts": (*ethApi).Accounts, + "exp_blockNumber": (*ethApi).BlockNumber, + "exp_getBalance": (*ethApi).GetBalance, + "exp_protocolVersion": (*ethApi).ProtocolVersion, + "exp_coinbase": (*ethApi).Coinbase, + "exp_mining": (*ethApi).IsMining, + "exp_syncing": (*ethApi).IsSyncing, + "exp_gasPrice": (*ethApi).GasPrice, + "exp_getStorage": (*ethApi).GetStorage, + "exp_storageAt": (*ethApi).GetStorage, + "exp_getStorageAt": (*ethApi).GetStorageAt, + "exp_getTransactionCount": (*ethApi).GetTransactionCount, + "exp_getBlockTransactionCountByHash": (*ethApi).GetBlockTransactionCountByHash, + "exp_getBlockTransactionCountByNumber": (*ethApi).GetBlockTransactionCountByNumber, + "exp_getUncleCountByBlockHash": (*ethApi).GetUncleCountByBlockHash, + "exp_getUncleCountByBlockNumber": (*ethApi).GetUncleCountByBlockNumber, + "exp_getData": (*ethApi).GetData, + "exp_getCode": (*ethApi).GetData, + "exp_sign": (*ethApi).Sign, + "exp_sendRawTransaction": (*ethApi).SendRawTransaction, + "exp_sendTransaction": (*ethApi).SendTransaction, + "exp_transact": (*ethApi).SendTransaction, + "exp_estimateGas": (*ethApi).EstimateGas, + "exp_call": (*ethApi).Call, + "exp_flush": (*ethApi).Flush, + "exp_getBlockByHash": (*ethApi).GetBlockByHash, + "exp_getBlockByNumber": (*ethApi).GetBlockByNumber, + "exp_getTransactionByHash": (*ethApi).GetTransactionByHash, + "exp_getTransactionByBlockNumberAndIndex": (*ethApi).GetTransactionByBlockNumberAndIndex, + "exp_getTransactionByBlockHashAndIndex": (*ethApi).GetTransactionByBlockHashAndIndex, + "exp_getUncleByBlockHashAndIndex": (*ethApi).GetUncleByBlockHashAndIndex, + "exp_getUncleByBlockNumberAndIndex": (*ethApi).GetUncleByBlockNumberAndIndex, + "exp_getCompilers": (*ethApi).GetCompilers, + "exp_compileSolidity": (*ethApi).CompileSolidity, + "exp_newFilter": (*ethApi).NewFilter, + "exp_newBlockFilter": (*ethApi).NewBlockFilter, + "exp_newPendingTransactionFilter": (*ethApi).NewPendingTransactionFilter, + "exp_uninstallFilter": (*ethApi).UninstallFilter, + "exp_getFilterChanges": (*ethApi).GetFilterChanges, + "exp_getFilterLogs": (*ethApi).GetFilterLogs, + "exp_getLogs": (*ethApi).GetLogs, + "exp_hashrate": (*ethApi).Hashrate, + "exp_getWork": (*ethApi).GetWork, + "exp_submitWork": (*ethApi).SubmitWork, + "exp_submitHashrate": (*ethApi).SubmitHashrate, + "exp_resend": (*ethApi).Resend, + "exp_pendingTransactions": (*ethApi).PendingTransactions, + "exp_getTransactionReceipt": (*ethApi).GetTransactionReceipt, } ) @@ -166,6 +215,20 @@ func (self *ethApi) IsMining(req *shared.Request) (interface{}, error) { return self.xeth.IsMining(), nil } +func (self *ethApi) IsSyncing(req *shared.Request) (interface{}, error) { + current := self.expanse.ChainManager().CurrentBlock().NumberU64() + origin, height := self.expanse.Downloader().Boundaries() + + if current < height { + return map[string]interface{}{ + "startingBlock": newHexNum(big.NewInt(int64(origin)).Bytes()), + "currentBlock": newHexNum(big.NewInt(int64(current)).Bytes()), + "highestBlock": newHexNum(big.NewInt(int64(height)).Bytes()), + }, nil + } + return false, nil +} + func (self *ethApi) GasPrice(req *shared.Request) (interface{}, error) { return newHexNum(self.xeth.DefaultGasPrice().Bytes()), nil } @@ -195,7 +258,7 @@ func (self *ethApi) GetTransactionCount(req *shared.Request) (interface{}, error } count := self.xeth.AtStateNum(args.BlockNumber).TxCountAt(args.Address) - return newHexNum(big.NewInt(int64(count)).Bytes()), nil + return fmt.Sprintf("%#x", count), nil } func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interface{}, error) { @@ -203,13 +266,11 @@ func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interfa if err := self.codec.Decode(req.Params, &args); err != nil { return nil, shared.NewDecodeParamError(err.Error()) } - - block := NewBlockRes(self.xeth.EthBlockByHash(args.Hash), false) + block := self.xeth.EthBlockByHash(args.Hash) if block == nil { return nil, nil - } else { - return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil } + return fmt.Sprintf("%#x", len(block.Transactions())), nil } func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (interface{}, error) { @@ -218,12 +279,11 @@ func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (inter return nil, shared.NewDecodeParamError(err.Error()) } - block := NewBlockRes(self.xeth.EthBlockByNumber(args.BlockNumber), false) + block := self.xeth.EthBlockByNumber(args.BlockNumber) if block == nil { return nil, nil - } else { - return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil } + return fmt.Sprintf("%#x", len(block.Transactions())), nil } func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, error) { @@ -233,11 +293,10 @@ func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, } block := self.xeth.EthBlockByHash(args.Hash) - br := NewBlockRes(block, false) - if br == nil { + if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}, error) { @@ -247,11 +306,10 @@ func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{} } block := self.xeth.EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block, false) - if br == nil { + if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetData(req *shared.Request) (interface{}, error) { @@ -360,9 +418,11 @@ func (self *ethApi) GetBlockByHash(req *shared.Request) (interface{}, error) { if err := self.codec.Decode(req.Params, &args); err != nil { return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByHash(args.BlockHash) - return NewBlockRes(block, args.IncludeTxs), nil + if block == nil { + return nil, nil + } + return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { @@ -372,8 +432,10 @@ func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { } block := self.xeth.EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block, args.IncludeTxs) - return br, nil + if block == nil { + return nil, nil + } + return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } func (self *ethApi) GetTransactionByHash(req *shared.Request) (interface{}, error) { @@ -402,16 +464,15 @@ func (self *ethApi) GetTransactionByBlockHashAndIndex(req *shared.Request) (inte return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByHash(args.Hash) - br := NewBlockRes(block, true) - if br == nil { + raw := self.xeth.EthBlockByHash(args.Hash) + if raw == nil { return nil, nil } - - if args.Index >= int64(len(br.Transactions)) || args.Index < 0 { + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if args.Index >= int64(len(block.Transactions)) || args.Index < 0 { return nil, nil } else { - return br.Transactions[args.Index], nil + return block.Transactions[args.Index], nil } } @@ -421,17 +482,16 @@ func (self *ethApi) GetTransactionByBlockNumberAndIndex(req *shared.Request) (in return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByNumber(args.BlockNumber) - v := NewBlockRes(block, true) - if v == nil { + raw := self.xeth.EthBlockByNumber(args.BlockNumber) + if raw == nil { return nil, nil } - - if args.Index >= int64(len(v.Transactions)) || args.Index < 0 { + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if args.Index >= int64(len(block.Transactions)) || args.Index < 0 { // return NewValidationError("Index", "does not exist") return nil, nil } - return v.Transactions[args.Index], nil + return block.Transactions[args.Index], nil } func (self *ethApi) GetUncleByBlockHashAndIndex(req *shared.Request) (interface{}, error) { @@ -440,17 +500,16 @@ func (self *ethApi) GetUncleByBlockHashAndIndex(req *shared.Request) (interface{ return nil, shared.NewDecodeParamError(err.Error()) } - br := NewBlockRes(self.xeth.EthBlockByHash(args.Hash), false) - if br == nil { + raw := self.xeth.EthBlockByHash(args.Hash) + if raw == nil { return nil, nil } - - if args.Index >= int64(len(br.Uncles)) || args.Index < 0 { + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + if args.Index >= int64(len(block.Uncles)) || args.Index < 0 { // return NewValidationError("Index", "does not exist") return nil, nil } - - return br.Uncles[args.Index], nil + return block.Uncles[args.Index], nil } func (self *ethApi) GetUncleByBlockNumberAndIndex(req *shared.Request) (interface{}, error) { @@ -459,17 +518,15 @@ func (self *ethApi) GetUncleByBlockNumberAndIndex(req *shared.Request) (interfac return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByNumber(args.BlockNumber) - v := NewBlockRes(block, true) - - if v == nil { + raw := self.xeth.EthBlockByNumber(args.BlockNumber) + if raw == nil { return nil, nil } - - if args.Index >= int64(len(v.Uncles)) || args.Index < 0 { + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if args.Index >= int64(len(block.Uncles)) || args.Index < 0 { return nil, nil } else { - return v.Uncles[args.Index], nil + return block.Uncles[args.Index], nil } } @@ -563,7 +620,12 @@ func (self *ethApi) GetLogs(req *shared.Request) (interface{}, error) { func (self *ethApi) GetWork(req *shared.Request) (interface{}, error) { self.xeth.SetMining(true, 0) - return self.xeth.RemoteMining().GetWork(), nil + ret, err := self.xeth.RemoteMining().GetWork() + if err != nil { + return nil, shared.NewNotReadyError("mining work") + } else { + return ret, nil + } } func (self *ethApi) SubmitWork(req *shared.Request) (interface{}, error) { diff --git a/rpc/api/parsing.go b/rpc/api/parsing.go index cd73a6009041..745df3882817 100644 --- a/rpc/api/parsing.go +++ b/rpc/api/parsing.go @@ -169,6 +169,7 @@ type BlockRes struct { LogsBloom *hexdata `json:"logsBloom"` TransactionRoot *hexdata `json:"transactionsRoot"` StateRoot *hexdata `json:"stateRoot"` + ReceiptRoot *hexdata `json:"receiptRoot"` Miner *hexdata `json:"miner"` Difficulty *hexnum `json:"difficulty"` TotalDifficulty *hexnum `json:"totalDifficulty"` @@ -192,6 +193,7 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) { LogsBloom *hexdata `json:"logsBloom"` TransactionRoot *hexdata `json:"transactionsRoot"` StateRoot *hexdata `json:"stateRoot"` + ReceiptRoot *hexdata `json:"receiptRoot"` Miner *hexdata `json:"miner"` Difficulty *hexnum `json:"difficulty"` TotalDifficulty *hexnum `json:"totalDifficulty"` @@ -212,6 +214,7 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) { ext.LogsBloom = b.LogsBloom ext.TransactionRoot = b.TransactionRoot ext.StateRoot = b.StateRoot + ext.ReceiptRoot = b.ReceiptRoot ext.Miner = b.Miner ext.Difficulty = b.Difficulty ext.TotalDifficulty = b.TotalDifficulty @@ -236,6 +239,7 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) { LogsBloom *hexdata `json:"logsBloom"` TransactionRoot *hexdata `json:"transactionsRoot"` StateRoot *hexdata `json:"stateRoot"` + ReceiptRoot *hexdata `json:"receiptRoot"` Miner *hexdata `json:"miner"` Difficulty *hexnum `json:"difficulty"` TotalDifficulty *hexnum `json:"totalDifficulty"` @@ -256,6 +260,7 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) { ext.LogsBloom = b.LogsBloom ext.TransactionRoot = b.TransactionRoot ext.StateRoot = b.StateRoot + ext.ReceiptRoot = b.ReceiptRoot ext.Miner = b.Miner ext.Difficulty = b.Difficulty ext.TotalDifficulty = b.TotalDifficulty @@ -276,7 +281,7 @@ func (b *BlockRes) MarshalJSON() ([]byte, error) { } } -func NewBlockRes(block *types.Block, fullTx bool) *BlockRes { +func NewBlockRes(block *types.Block, td *big.Int, fullTx bool) *BlockRes { if block == nil { return nil } @@ -291,9 +296,10 @@ func NewBlockRes(block *types.Block, fullTx bool) *BlockRes { res.LogsBloom = newHexData(block.Bloom()) res.TransactionRoot = newHexData(block.TxHash()) res.StateRoot = newHexData(block.Root()) + res.ReceiptRoot = newHexData(block.ReceiptHash()) res.Miner = newHexData(block.Coinbase()) res.Difficulty = newHexNum(block.Difficulty()) - res.TotalDifficulty = newHexNum(block.Td) + res.TotalDifficulty = newHexNum(td) res.Size = newHexNum(block.Size().Int64()) res.ExtraData = newHexData(block.Extra()) res.GasLimit = newHexNum(block.GasLimit()) diff --git a/rpc/api/personal.go b/rpc/api/personal.go index 40ba0ab83047..4f397e127b85 100644 --- a/rpc/api/personal.go +++ b/rpc/api/personal.go @@ -36,7 +36,6 @@ var ( personalMapping = map[string]personalhandler{ "personal_listAccounts": (*personalApi).ListAccounts, "personal_newAccount": (*personalApi).NewAccount, - "personal_deleteAccount": (*personalApi).DeleteAccount, "personal_unlockAccount": (*personalApi).UnlockAccount, } ) @@ -105,28 +104,13 @@ func (self *personalApi) NewAccount(req *shared.Request) (interface{}, error) { return acc.Address.Hex(), err } -func (self *personalApi) DeleteAccount(req *shared.Request) (interface{}, error) { - args := new(DeleteAccountArgs) - if err := self.codec.Decode(req.Params, &args); err != nil { - return nil, shared.NewDecodeParamError(err.Error()) - } - - addr := common.HexToAddress(args.Address) - am := self.expanse.AccountManager() - if err := am.DeleteAccount(addr, args.Passphrase); err == nil { - return true, nil - } else { - return false, err - } -} - func (self *personalApi) UnlockAccount(req *shared.Request) (interface{}, error) { args := new(UnlockAccountArgs) if err := self.codec.Decode(req.Params, &args); err != nil { return nil, shared.NewDecodeParamError(err.Error()) } - if len(args.Passphrase) == 0 { + if args.Passphrase == nil { fe := self.xeth.Frontend() if fe == nil { return false, fmt.Errorf("No password provided") @@ -137,6 +121,6 @@ func (self *personalApi) UnlockAccount(req *shared.Request) (interface{}, error) am := self.expanse.AccountManager() addr := common.HexToAddress(args.Address) - err := am.TimedUnlock(addr, args.Passphrase, time.Duration(args.Duration)*time.Second) + err := am.TimedUnlock(addr, *args.Passphrase, time.Duration(args.Duration)*time.Second) return err == nil, err } diff --git a/rpc/api/personal_args.go b/rpc/api/personal_args.go index cf14942489b8..86eca56423c7 100644 --- a/rpc/api/personal_args.go +++ b/rpc/api/personal_args.go @@ -44,39 +44,9 @@ func (args *NewAccountArgs) UnmarshalJSON(b []byte) (err error) { return shared.NewInvalidTypeError("passhrase", "not a string") } -type DeleteAccountArgs struct { - Address string - Passphrase string -} - -func (args *DeleteAccountArgs) UnmarshalJSON(b []byte) (err error) { - var obj []interface{} - if err := json.Unmarshal(b, &obj); err != nil { - return shared.NewDecodeParamError(err.Error()) - } - - if len(obj) < 2 { - return shared.NewInsufficientParamsError(len(obj), 2) - } - - if addr, ok := obj[0].(string); ok { - args.Address = addr - } else { - return shared.NewInvalidTypeError("address", "not a string") - } - - if passhrase, ok := obj[1].(string); ok { - args.Passphrase = passhrase - } else { - return shared.NewInvalidTypeError("passhrase", "not a string") - } - - return nil -} - type UnlockAccountArgs struct { Address string - Passphrase string + Passphrase *string Duration int } @@ -100,7 +70,7 @@ func (args *UnlockAccountArgs) UnmarshalJSON(b []byte) (err error) { if len(obj) >= 2 && obj[1] != nil { if passphrasestr, ok := obj[1].(string); ok { - args.Passphrase = passphrasestr + args.Passphrase = &passphrasestr } else { return shared.NewInvalidTypeError("passphrase", "not a string") } diff --git a/rpc/api/shh.go b/rpc/api/shh.go index 747bc9e9759a..d86ffbee4c23 100644 --- a/rpc/api/shh.go +++ b/rpc/api/shh.go @@ -38,6 +38,7 @@ var ( "shh_newIdentity": (*shhApi).NewIdentity, "shh_newFilter": (*shhApi).NewFilter, "shh_uninstallFilter": (*shhApi).UninstallFilter, + "shh_getMessages": (*shhApi).GetMessages, "shh_getFilterChanges": (*shhApi).GetFilterChanges, } ) diff --git a/rpc/api/utils.go b/rpc/api/utils.go index 78573473655e..8d99e4c09b36 100644 --- a/rpc/api/utils.go +++ b/rpc/api/utils.go @@ -32,7 +32,6 @@ var ( AutoCompletion = map[string][]string{ "admin": []string{ "addPeer", - "chainSyncStatus", "datadir", "exportChain", "getContractInfo", @@ -99,6 +98,7 @@ var ( "sendRawTransaction", "sendTransaction", "sign", + "syncing", }, "miner": []string{ "hashrate", @@ -118,7 +118,6 @@ var ( "personal": []string{ "listAccounts", "newAccount", - "deleteAccount", "unlockAccount", }, "shh": []string{ diff --git a/rpc/comms/http.go b/rpc/comms/http.go index 26fcde11c44f..6d7993f87b22 100644 --- a/rpc/comms/http.go +++ b/rpc/comms/http.go @@ -271,13 +271,13 @@ func (self *httpClient) Send(req interface{}) error { reply, _ := ioutil.ReadAll(resp.Body) var rpcSuccessResponse shared.SuccessResponse if err = self.codec.Decode(reply, &rpcSuccessResponse); err == nil { - self.lastRes = rpcSuccessResponse.Result + self.lastRes = &rpcSuccessResponse self.lastErr = err return nil } else { var rpcErrorResponse shared.ErrorResponse if err = self.codec.Decode(reply, &rpcErrorResponse); err == nil { - self.lastRes = rpcErrorResponse.Error + self.lastRes = &rpcErrorResponse self.lastErr = err return nil } else { diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 9badc7e02f2a..d5e1552867a8 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -21,6 +21,8 @@ package comms import ( "net" "os" + "path/filepath" + "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" @@ -68,8 +70,13 @@ func (self *ipcClient) reconnect() error { return err } + func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.ExpanseApi, error)) error { - os.Remove(cfg.Endpoint) // in case it still exists from a previous run + // Ensure the IPC path exists and remove any previous leftover + if err := os.MkdirAll(filepath.Dir(cfg.Endpoint), 0751); err != nil { + return err + } + os.Remove(cfg.Endpoint) l, err := net.ListenUnix("unix", &net.UnixAddr{Name: cfg.Endpoint, Net: "unix"}) if err != nil { diff --git a/rpc/comms/ipc_windows.go b/rpc/comms/ipc_windows.go index 48b20664f999..1d5dfa44d30b 100644 --- a/rpc/comms/ipc_windows.go +++ b/rpc/comms/ipc_windows.go @@ -28,6 +28,7 @@ import ( "time" "unsafe" + "github.com/expanse-project/go-expanse/logger" "github.com/expanse-project/go-expanse/logger/glog" "github.com/expanse-project/go-expanse/rpc/codec" diff --git a/rpc/jeth.go b/rpc/jeth.go index f9429e7294dd..479a937fc0b1 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -39,16 +39,18 @@ type Jeth struct { fe xeth.Frontend } + func NewJeth(ethApi shared.ExpanseApi, re *jsre.JSRE, client comms.ExpanseClient, fe xeth.Frontend) *Jeth { return &Jeth{ethApi, re, client, fe} } func (self *Jeth) err(call otto.FunctionCall, code int, msg string, id interface{}) (response otto.Value) { - errObj := fmt.Sprintf("{\"message\": \"%s\", \"code\": %d}", msg, code) - retResponse := fmt.Sprintf("ret_response = JSON.parse('{\"jsonrpc\": \"%s\", \"id\": %v, \"error\": %s}');", shared.JsonRpcVersion, id, errObj) + m := shared.NewRpcErrorResponse(id, shared.JsonRpcVersion, code, fmt.Errorf(msg)) + errObj, _ := json.Marshal(m.Error) + errRes, _ := json.Marshal(m) - call.Otto.Run("ret_error = " + errObj) - res, _ := call.Otto.Run(retResponse) + call.Otto.Run("ret_error = " + string(errObj)) + res, _ := call.Otto.Run("ret_response = " + string(errRes)) return res } diff --git a/rpc/shared/errors.go b/rpc/shared/errors.go index 5df8996c30ee..edb32a706928 100644 --- a/rpc/shared/errors.go +++ b/rpc/shared/errors.go @@ -64,6 +64,20 @@ func NewNotImplementedError(method string) *NotImplementedError { } } +type NotReadyError struct { + Resource string +} + +func (e *NotReadyError) Error() string { + return fmt.Sprintf("%s not ready", e.Resource) +} + +func NewNotReadyError(resource string) *NotReadyError { + return &NotReadyError{ + Resource: resource, + } +} + type DecodeParamError struct { err string } diff --git a/rpc/shared/types.go b/rpc/shared/types.go index 8dba495de4d5..2bb31069da7f 100644 --- a/rpc/shared/types.go +++ b/rpc/shared/types.go @@ -74,11 +74,9 @@ type ErrorObject struct { } // Create RPC error response, this allows for custom error codes -func NewRpcErrorResponse(id interface{}, jsonrpcver string, errCode int, err error) *interface{} { - var response interface{} - +func NewRpcErrorResponse(id interface{}, jsonrpcver string, errCode int, err error) *ErrorResponse { jsonerr := &ErrorObject{errCode, err.Error()} - response = ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} + response := ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} glog.V(logger.Detail).Infof("Generated error response: %s", response) return &response @@ -94,6 +92,9 @@ func NewRpcResponse(id interface{}, jsonrpcver string, reply interface{}, err er case *NotImplementedError: jsonerr := &ErrorObject{-32601, err.Error()} response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} + case *NotReadyError: + jsonerr := &ErrorObject{-32000, err.Error()} + response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} case *DecodeParamError, *InsufficientParamsError, *ValidationError, *InvalidTypeError: jsonerr := &ErrorObject{-32602, err.Error()} response = &ErrorResponse{Jsonrpc: jsonrpcver, Id: id, Error: jsonerr} diff --git a/tests/block_test.go b/tests/block_test.go index 80a9f6609c1e..a6dcc6070f67 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -42,6 +42,14 @@ func TestBcUncleTests(t *testing.T) { } } + +func TestBcForkUncleTests(t *testing.T) { + err := RunBlockTest(filepath.Join(blockTestDir, "bcForkUncle.json"), BlockSkipTests) + if err != nil { + t.Fatal(err) + } +} + func TestBcInvalidHeaderTests(t *testing.T) { err := RunBlockTest(filepath.Join(blockTestDir, "bcInvalidHeaderTest.json"), BlockSkipTests) if err != nil { diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 616f0e26f6b7..536af3fcab43 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -44,8 +44,10 @@ import ( type BlockTest struct { Genesis *types.Block - Json *btJSON - preAccounts map[string]btAccount + Json *btJSON + preAccounts map[string]btAccount + postAccounts map[string]btAccount + lastblockhash string } type btJSON struct { @@ -53,6 +55,7 @@ type btJSON struct { GenesisBlockHeader btHeader Pre map[string]btAccount PostState map[string]btAccount + Lastblockhash string } type btBlock struct { @@ -76,6 +79,7 @@ type btHeader struct { MixHash string Nonce string Number string + Hash string ParentHash string ReceiptTrie string SeedHash string @@ -147,7 +151,6 @@ func runBlockTests(bt map[string]*BlockTest, skipTests []string) error { glog.Infoln("Skipping block test", name) continue } - // test the block if err := runBlockTest(test); err != nil { return fmt.Errorf("%s: %v", name, err) @@ -173,20 +176,31 @@ func runBlockTest(test *BlockTest) error { } // import pre accounts - statedb, err := test.InsertPreState(expanse) + + _, err = test.InsertPreState(expanse) if err != nil { return fmt.Errorf("InsertPreState: %v", err) } - err = test.TryBlocksInsert(expanse.ChainManager()) + + cm := expanse.ChainManager() + validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return err } - if err = test.ValidatePostState(statedb); err != nil { + lastblockhash := common.HexToHash(test.lastblockhash) + cmlast := cm.LastBlockHash() + if lastblockhash != cmlast { + return fmt.Errorf("lastblockhash validation mismatch: want: %x, have: %x", lastblockhash, cmlast) + } + + newDB := cm.State() + if err = test.ValidatePostState(newDB); err != nil { return fmt.Errorf("post state validation failed: %v", err) } - return nil + + return test.ValidateImportedHeaders(cm, validBlocks) } func (test *BlockTest) makeEthConfig() *exp.Config { @@ -197,7 +211,7 @@ func (test *BlockTest) makeEthConfig() *exp.Config { Verbosity: 5, Etherbase: common.Address{}, AccountManager: accounts.NewManager(ks), - NewDB: func(path string) (common.Database, error) { return ethdb.NewMemDatabase() }, + NewDB: func(path string) (ethdb.Database, error) { return ethdb.NewMemDatabase() }, } } @@ -264,7 +278,8 @@ func (t *BlockTest) InsertPreState(expanse *exp.Expanse) (*state.StateDB, error) expected we are expected to ignore it and continue processing and then validate the post state. */ -func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { +func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) ([]btBlock, error) { + validBlocks := make([]btBlock, 0) // insert the test blocks, which will execute all transactions for _, b := range t.Json.Blocks { cb, err := mustConvertBlock(b) @@ -272,7 +287,7 @@ func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return fmt.Errorf("Block RLP decoding failed when expected to succeed: %v", err) + return nil, fmt.Errorf("Block RLP decoding failed when expected to succeed: %v", err) } } // RLP decoding worked, try to insert into chain: @@ -281,100 +296,104 @@ func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return fmt.Errorf("Block insertion into chain failed: %v", err) + return nil, fmt.Errorf("Block insertion into chain failed: %v", err) } } if b.BlockHeader == nil { - return fmt.Errorf("Block insertion should have failed") + return nil, fmt.Errorf("Block insertion should have failed") } - err = t.validateBlockHeader(b.BlockHeader, cb.Header()) - if err != nil { - return fmt.Errorf("Block header validation failed: %v", err) + + // validate RLP decoding by checking all values against test file JSON + if err = validateHeader(b.BlockHeader, cb.Header()); err != nil { + return nil, fmt.Errorf("Deserialised block header validation failed: %v", err) } + validBlocks = append(validBlocks, b) } - return nil + return validBlocks, nil } -func (s *BlockTest) validateBlockHeader(h *btHeader, h2 *types.Header) error { +func validateHeader(h *btHeader, h2 *types.Header) error { expectedBloom := mustConvertBytes(h.Bloom) if !bytes.Equal(expectedBloom, h2.Bloom.Bytes()) { - return fmt.Errorf("Bloom: expected: %v, decoded: %v", expectedBloom, h2.Bloom.Bytes()) + return fmt.Errorf("Bloom: want: %x have: %x", expectedBloom, h2.Bloom.Bytes()) } expectedCoinbase := mustConvertBytes(h.Coinbase) if !bytes.Equal(expectedCoinbase, h2.Coinbase.Bytes()) { - return fmt.Errorf("Coinbase: expected: %v, decoded: %v", expectedCoinbase, h2.Coinbase.Bytes()) + return fmt.Errorf("Coinbase: want: %x have: %x", expectedCoinbase, h2.Coinbase.Bytes()) } expectedMixHashBytes := mustConvertBytes(h.MixHash) if !bytes.Equal(expectedMixHashBytes, h2.MixDigest.Bytes()) { - return fmt.Errorf("MixHash: expected: %v, decoded: %v", expectedMixHashBytes, h2.MixDigest.Bytes()) + return fmt.Errorf("MixHash: want: %x have: %x", expectedMixHashBytes, h2.MixDigest.Bytes()) } expectedNonce := mustConvertBytes(h.Nonce) if !bytes.Equal(expectedNonce, h2.Nonce[:]) { - return fmt.Errorf("Nonce: expected: %v, decoded: %v", expectedNonce, h2.Nonce) + return fmt.Errorf("Nonce: want: %x have: %x", expectedNonce, h2.Nonce) } expectedNumber := mustConvertBigInt(h.Number, 16) if expectedNumber.Cmp(h2.Number) != 0 { - return fmt.Errorf("Number: expected: %v, decoded: %v", expectedNumber, h2.Number) + return fmt.Errorf("Number: want: %v have: %v", expectedNumber, h2.Number) } expectedParentHash := mustConvertBytes(h.ParentHash) if !bytes.Equal(expectedParentHash, h2.ParentHash.Bytes()) { - return fmt.Errorf("Parent hash: expected: %v, decoded: %v", expectedParentHash, h2.ParentHash.Bytes()) + return fmt.Errorf("Parent hash: want: %x have: %x", expectedParentHash, h2.ParentHash.Bytes()) } expectedReceiptHash := mustConvertBytes(h.ReceiptTrie) if !bytes.Equal(expectedReceiptHash, h2.ReceiptHash.Bytes()) { - return fmt.Errorf("Receipt hash: expected: %v, decoded: %v", expectedReceiptHash, h2.ReceiptHash.Bytes()) + return fmt.Errorf("Receipt hash: want: %x have: %x", expectedReceiptHash, h2.ReceiptHash.Bytes()) } expectedTxHash := mustConvertBytes(h.TransactionsTrie) if !bytes.Equal(expectedTxHash, h2.TxHash.Bytes()) { - return fmt.Errorf("Tx hash: expected: %v, decoded: %v", expectedTxHash, h2.TxHash.Bytes()) + return fmt.Errorf("Tx hash: want: %x have: %x", expectedTxHash, h2.TxHash.Bytes()) } expectedStateHash := mustConvertBytes(h.StateRoot) if !bytes.Equal(expectedStateHash, h2.Root.Bytes()) { - return fmt.Errorf("State hash: expected: %v, decoded: %v", expectedStateHash, h2.Root.Bytes()) + return fmt.Errorf("State hash: want: %x have: %x", expectedStateHash, h2.Root.Bytes()) } expectedUncleHash := mustConvertBytes(h.UncleHash) if !bytes.Equal(expectedUncleHash, h2.UncleHash.Bytes()) { - return fmt.Errorf("Uncle hash: expected: %v, decoded: %v", expectedUncleHash, h2.UncleHash.Bytes()) + return fmt.Errorf("Uncle hash: want: %x have: %x", expectedUncleHash, h2.UncleHash.Bytes()) } expectedExtraData := mustConvertBytes(h.ExtraData) if !bytes.Equal(expectedExtraData, h2.Extra) { - return fmt.Errorf("Extra data: expected: %v, decoded: %v", expectedExtraData, h2.Extra) + return fmt.Errorf("Extra data: want: %x have: %x", expectedExtraData, h2.Extra) } expectedDifficulty := mustConvertBigInt(h.Difficulty, 16) if expectedDifficulty.Cmp(h2.Difficulty) != 0 { - return fmt.Errorf("Difficulty: expected: %v, decoded: %v", expectedDifficulty, h2.Difficulty) + return fmt.Errorf("Difficulty: want: %v have: %v", expectedDifficulty, h2.Difficulty) } expectedGasLimit := mustConvertBigInt(h.GasLimit, 16) if expectedGasLimit.Cmp(h2.GasLimit) != 0 { - return fmt.Errorf("GasLimit: expected: %v, decoded: %v", expectedGasLimit, h2.GasLimit) + return fmt.Errorf("GasLimit: want: %v have: %v", expectedGasLimit, h2.GasLimit) } expectedGasUsed := mustConvertBigInt(h.GasUsed, 16) if expectedGasUsed.Cmp(h2.GasUsed) != 0 { - return fmt.Errorf("GasUsed: expected: %v, decoded: %v", expectedGasUsed, h2.GasUsed) + return fmt.Errorf("GasUsed: want: %v have: %v", expectedGasUsed, h2.GasUsed) } expectedTimestamp := mustConvertBigInt(h.Timestamp, 16) if expectedTimestamp.Cmp(h2.Time) != 0 { - return fmt.Errorf("Timestamp: expected: %v, decoded: %v", expectedTimestamp, h2.Time) + + return fmt.Errorf("Timestamp: want: %v have: %v", expectedTimestamp, h2.Time) } return nil } func (t *BlockTest) ValidatePostState(statedb *state.StateDB) error { - for addrString, acct := range t.preAccounts { + // validate post state accounts in test file against what we have in state db + for addrString, acct := range t.postAccounts { // XXX: is is worth it checking for errors here? addr, err := hex.DecodeString(addrString) if err != nil { @@ -398,13 +417,34 @@ func (t *BlockTest) ValidatePostState(statedb *state.StateDB) error { balance2 := statedb.GetBalance(common.BytesToAddress(addr)) nonce2 := statedb.GetNonce(common.BytesToAddress(addr)) if !bytes.Equal(code2, code) { - return fmt.Errorf("account code mismatch, addr, found, expected: ", addrString, hex.EncodeToString(code2), hex.EncodeToString(code)) + return fmt.Errorf("account code mismatch for addr: %s want: %s have: %s", addrString, hex.EncodeToString(code), hex.EncodeToString(code2)) } if balance2.Cmp(balance) != 0 { - return fmt.Errorf("account balance mismatch, addr, found, expected: ", addrString, balance2, balance) + return fmt.Errorf("account balance mismatch for addr: %s, want: %d, have: %d", addrString, balance, balance2) } if nonce2 != nonce { - return fmt.Errorf("account nonce mismatch, addr, found, expected: ", addrString, nonce2, nonce) + return fmt.Errorf("account nonce mismatch for addr: %s want: %d have: %d", addrString, nonce, nonce2) + } + } + return nil +} + +func (test *BlockTest) ValidateImportedHeaders(cm *core.ChainManager, validBlocks []btBlock) error { + // to get constant lookup when verifying block headers by hash (some tests have many blocks) + bmap := make(map[string]btBlock, len(test.Json.Blocks)) + for _, b := range validBlocks { + bmap[b.BlockHeader.Hash] = b + } + + // iterate over blocks backwards from HEAD and validate imported + // headers vs test file. some tests have reorgs, and we import + // block-by-block, so we can only validate imported headers after + // all blocks have been processed by ChainManager, as they may not + // be part of the longest chain until last block is imported. + for b := cm.CurrentBlock(); b != nil && b.NumberU64() != 0; b = cm.GetBlock(b.Header().ParentHash) { + bHash := common.Bytes2Hex(b.Hash().Bytes()) // hex without 0x prefix + if err := validateHeader(bmap[bHash].BlockHeader, b.Header()); err != nil { + return fmt.Errorf("Imported block header validation failed: %v", err) } } return nil @@ -432,7 +472,7 @@ func convertBlockTest(in *btJSON) (out *BlockTest, err error) { err = fmt.Errorf("%v\n%s", recovered, buf) } }() - out = &BlockTest{preAccounts: in.Pre, Json: in} + out = &BlockTest{preAccounts: in.Pre, postAccounts: in.PostState, Json: in, lastblockhash: in.Lastblockhash} out.Genesis = mustConvertGenesis(in.GenesisBlockHeader) return out, err } @@ -440,9 +480,8 @@ func convertBlockTest(in *btJSON) (out *BlockTest, err error) { func mustConvertGenesis(testGenesis btHeader) *types.Block { hdr := mustConvertHeader(testGenesis) hdr.Number = big.NewInt(0) - b := types.NewBlockWithHeader(hdr) - b.Td = new(big.Int) - return b + + return types.NewBlockWithHeader(hdr) } func mustConvertHeader(in btHeader) *types.Header { diff --git a/tests/files/ABITests/basic_abi_tests.json b/tests/files/ABITests/basic_abi_tests.json old mode 100755 new mode 100644 diff --git a/tests/files/BasicTests/blockgenesistest.json b/tests/files/BasicTests/blockgenesistest.json old mode 100755 new mode 100644 diff --git a/tests/files/BasicTests/crypto.json b/tests/files/BasicTests/crypto.json old mode 100755 new mode 100644 diff --git a/tests/files/BasicTests/difficulty.json b/tests/files/BasicTests/difficulty.json index 44beac5f540b..8e71898a7bb8 100644 --- a/tests/files/BasicTests/difficulty.json +++ b/tests/files/BasicTests/difficulty.json @@ -96,5 +96,12526 @@ "currentTimestamp" : "60", "currentBlockNumber" : "2302400", "currentDifficulty" : "3096664" + }, + + "DifficultyTest3" : { + "parentTimestamp" : "483213444", + "parentDifficulty" : "1300683497", + "currentTimestamp" : "483213444", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1301318596" + }, + + "DifficultyTest4" : { + "parentTimestamp" : "106975388", + "parentDifficulty" : "658255882", + "currentTimestamp" : "106975388", + "currentBlockNumber" : "225001", + "currentDifficulty" : "658577297" + }, + + "DifficultyTest6" : { + "parentTimestamp" : "1636817360", + "parentDifficulty" : "1469545234", + "currentTimestamp" : "1636817360", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1470262787" + }, + + "DifficultyTest7" : { + "parentTimestamp" : "1088823006", + "parentDifficulty" : "1764026919", + "currentTimestamp" : "1088823006", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1764888264" + }, + + "DifficultyTest9" : { + "parentTimestamp" : "1860574257", + "parentDifficulty" : "1637989180", + "currentTimestamp" : "1860574257", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1638788995" + }, + + "DifficultyTest12" : { + "parentTimestamp" : "952797538", + "parentDifficulty" : "1704656478", + "currentTimestamp" : "952797538", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1705488893" + }, + + "DifficultyTest13" : { + "parentTimestamp" : "366904528", + "parentDifficulty" : "259300468", + "currentTimestamp" : "366904528", + "currentBlockNumber" : "900001", + "currentDifficulty" : "259427207" + }, + + "DifficultyTest14" : { + "parentTimestamp" : "914118578", + "parentDifficulty" : "648631701", + "currentTimestamp" : "914118578", + "currentBlockNumber" : "975001", + "currentDifficulty" : "648948543" + }, + + "DifficultyTest16" : { + "parentTimestamp" : "1210954246", + "parentDifficulty" : "770266994", + "currentTimestamp" : "1210954246", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "770643612" + }, + + "DifficultyTest17" : { + "parentTimestamp" : "721211674", + "parentDifficulty" : "1486475733", + "currentTimestamp" : "721211674", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "1487202575" + }, + + "DifficultyTest18" : { + "parentTimestamp" : "1601935456", + "parentDifficulty" : "197195530", + "currentTimestamp" : "1601935456", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "197292840" + }, + + "DifficultyTest20" : { + "parentTimestamp" : "1805291143", + "parentDifficulty" : "281511142", + "currentTimestamp" : "1805291143", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "281652694" + }, + + "DifficultyTest22" : { + "parentTimestamp" : "450623147", + "parentDifficulty" : "1063209920", + "currentTimestamp" : "450623147", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "1063737257" + }, + + "DifficultyTest25" : { + "parentTimestamp" : "99838081", + "parentDifficulty" : "1484962780", + "currentTimestamp" : "99838081", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1485753395" + }, + + "DifficultyTest27" : { + "parentTimestamp" : "1400307030", + "parentDifficulty" : "93947571", + "currentTimestamp" : "1400307030", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "94124515" + }, + + "DifficultyTest31" : { + "parentTimestamp" : "2012125043", + "parentDifficulty" : "69389920", + "currentTimestamp" : "2012125043", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "70472377" + }, + + "DifficultyTest32" : { + "parentTimestamp" : "898081404", + "parentDifficulty" : "1659413192", + "currentTimestamp" : "898081404", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "1662320604" + }, + + "DifficultyTest33" : { + "parentTimestamp" : "1608126573", + "parentDifficulty" : "1149397930", + "currentTimestamp" : "1608126573", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1154153463" + }, + + "DifficultyTest34" : { + "parentTimestamp" : "1564514209", + "parentDifficulty" : "1736716085", + "currentTimestamp" : "1564514209", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1741758394" + }, + + "DifficultyTest35" : { + "parentTimestamp" : "1484191964", + "parentDifficulty" : "2089957525", + "currentTimestamp" : "1484191964", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "2099366620" + }, + + "DifficultyTest38" : { + "parentTimestamp" : "2035443301", + "parentDifficulty" : "1447016050", + "currentTimestamp" : "2035443301", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "1481277032" + }, + + "DifficultyTest40" : { + "parentTimestamp" : "1211120127", + "parentDifficulty" : "1937311812", + "currentTimestamp" : "1211120127", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "2072475493" + }, + + "DifficultyTest46" : { + "parentTimestamp" : "647127376", + "parentDifficulty" : "1210633283", + "currentTimestamp" : "647127376", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "3358708060" + }, + + "DifficultyTest47" : { + "parentTimestamp" : "715694660", + "parentDifficulty" : "152690362", + "currentTimestamp" : "715694660", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4447732213" + }, + + "DifficultyTest50" : { + "parentTimestamp" : "1734461805", + "parentDifficulty" : "1281428484", + "currentTimestamp" : "1734461805", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "18461923365" + }, + + "DifficultyTest51" : { + "parentTimestamp" : "88851578", + "parentDifficulty" : "1331042220", + "currentTimestamp" : "88851578", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35691430510" + }, + + "DifficultyTest52" : { + "parentTimestamp" : "407324683", + "parentDifficulty" : "1880074472", + "currentTimestamp" : "407324683", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70600469213" + }, + + "DifficultyTest53" : { + "parentTimestamp" : "1171665980", + "parentDifficulty" : "602921282", + "currentTimestamp" : "1171665980", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "138042169149" + }, + + "DifficultyTest61" : { + "parentTimestamp" : "1028325634", + "parentDifficulty" : "62045881", + "currentTimestamp" : "1028325634", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8796155098384" + }, + + "DifficultyTest65" : { + "parentTimestamp" : "242516036", + "parentDifficulty" : "1314612224", + "currentTimestamp" : "242516036", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370059431788" + }, + + "DifficultyTest66" : { + "parentTimestamp" : "1170613539", + "parentDifficulty" : "699085394", + "currentTimestamp" : "1170613539", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369443604408" + }, + + "DifficultyTest68" : { + "parentTimestamp" : "595744993", + "parentDifficulty" : "1306026146", + "currentTimestamp" : "595744993", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281476283374510" + }, + + "DifficultyTest74" : { + "parentTimestamp" : "1815216680", + "parentDifficulty" : "618144752", + "currentTimestamp" : "1815216680", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600245817076" + }, + + "DifficultyTest77" : { + "parentTimestamp" : "417166402", + "parentDifficulty" : "1666062559", + "currentTimestamp" : "417166402", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798685840034" + }, + + "DifficultyTest80" : { + "parentTimestamp" : "1034991013", + "parentDifficulty" : "239967428", + "currentTimestamp" : "1034991013", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115188315940471" + }, + + "DifficultyTest82" : { + "parentTimestamp" : "1746315610", + "parentDifficulty" : "1553446333", + "currentTimestamp" : "1746315610", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377705916595" + }, + + "DifficultyTest83" : { + "parentTimestamp" : "1357996484", + "parentDifficulty" : "997722112", + "currentTimestamp" : "1357996484", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753301632769" + }, + + "DifficultyTest86" : { + "parentTimestamp" : "982723283", + "parentDifficulty" : "284308799", + "currentTimestamp" : "982723283", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843009498141573" + }, + + "DifficultyTest88" : { + "parentTimestamp" : "554839784", + "parentDifficulty" : "1670695584", + "currentTimestamp" : "554839784", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038526287161" + }, + + "DifficultyTest90" : { + "parentTimestamp" : "1695607444", + "parentDifficulty" : "95320202", + "currentTimestamp" : "1695607444", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744073804918361" + }, + + "DifficultyTest91" : { + "parentTimestamp" : "1772624713", + "parentDifficulty" : "1796157553", + "currentTimestamp" : "1772624713", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488149216137815" + }, + + "DifficultyTest92" : { + "parentTimestamp" : "464310420", + "parentDifficulty" : "1364629204", + "currentTimestamp" : "464310420", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296203501990" + }, + + "DifficultyTest93" : { + "parentTimestamp" : "782593085", + "parentDifficulty" : "2122043796", + "currentTimestamp" : "782593085", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952591799492878" + }, + + "DifficultyTest96" : { + "parentTimestamp" : "75835492", + "parentDifficulty" : "1593014023", + "currentTimestamp" : "75835492", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810360299443573" + }, + + "DifficultyTest97" : { + "parentTimestamp" : "1410956451", + "parentDifficulty" : "1091305059", + "currentTimestamp" : "1410956451", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718503141346" + }, + + "DifficultyTest98" : { + "parentTimestamp" : "1323157421", + "parentDifficulty" : "483701885", + "currentTimestamp" : "1323157421", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717895241491" + }, + + "DifficultyTest99" : { + "parentTimestamp" : "129528681", + "parentDifficulty" : "1281048929", + "currentTimestamp" : "129528681", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436104281289" + }, + + "DifficultyTest100" : { + "parentTimestamp" : "720435141", + "parentDifficulty" : "1868229059", + "currentTimestamp" : "720435141", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871514354976" + }, + + "DifficultyTest102" : { + "parentTimestamp" : "583477645", + "parentDifficulty" : "2061226690", + "currentTimestamp" : "583477645", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965741352660540" + }, + + "DifficultyTest103" : { + "parentTimestamp" : "963382584", + "parentDifficulty" : "667319032", + "currentTimestamp" : "963382584", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931479248499655" + }, + + "DifficultyTest108" : { + "parentTimestamp" : "1033848319", + "parentDifficulty" : "836043084", + "currentTimestamp" : "1033848319", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658130127852" + }, + + "DifficultyTest110" : { + "parentTimestamp" : "37507558", + "parentDifficulty" : "453132832", + "currentTimestamp" : "37507558", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807315040707176" + }, + + "DifficultyTest111" : { + "parentTimestamp" : "229073917", + "parentDifficulty" : "1217099616", + "currentTimestamp" : "229073917", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614630392400078" + }, + + "DifficultyTest113" : { + "parentTimestamp" : "301709646", + "parentDifficulty" : "162457810", + "currentTimestamp" : "301709646", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458516861361839" + }, + + "DifficultyTest114" : { + "parentTimestamp" : "874061794", + "parentDifficulty" : "1091929809", + "currentTimestamp" : "874061794", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517791287681" + }, + + "DifficultyTest115" : { + "parentTimestamp" : "1041104610", + "parentDifficulty" : "670874610", + "currentTimestamp" : "1041104610", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034068851593" + }, + + "DifficultyTest117" : { + "parentTimestamp" : "2072074540", + "parentDifficulty" : "1488509951", + "currentTimestamp" : "2072074540", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135079834394" + }, + + "DifficultyTest118" : { + "parentTimestamp" : "1453962804", + "parentDifficulty" : "1497523090", + "currentTimestamp" : "1453962804", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668135088851934" + }, + + "DifficultyTest120" : { + "parentTimestamp" : "1562116226", + "parentDifficulty" : "1712184264", + "currentTimestamp" : "1562116226", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672536075410819" + }, + + "DifficultyTest121" : { + "parentTimestamp" : "1750311064", + "parentDifficulty" : "390223104", + "currentTimestamp" : "1750311064", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069115194698" + }, + + "DifficultyTest122" : { + "parentTimestamp" : "1790665889", + "parentDifficulty" : "224699765", + "currentTimestamp" : "1790665889", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068949590537" + }, + + "DifficultyTest126" : { + "parentTimestamp" : "1790106490", + "parentDifficulty" : "1596246723", + "currentTimestamp" : "1790106490", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551395274588" + }, + + "DifficultyTest127" : { + "parentTimestamp" : "472464086", + "parentDifficulty" : "1936628698", + "currentTimestamp" : "472464086", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101534071213" + }, + + "DifficultyTest129" : { + "parentTimestamp" : "1963741341", + "parentDifficulty" : "1969196040", + "currentTimestamp" : "1963741341", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084400356145145" + }, + + "DifficultyTest132" : { + "parentTimestamp" : "1091712611", + "parentDifficulty" : "904084786", + "currentTimestamp" : "1091712611", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594448476569" + }, + + "DifficultyTest133" : { + "parentTimestamp" : "1074523505", + "parentDifficulty" : "1351092132", + "currentTimestamp" : "1074523505", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675188439652516" + }, + + "DifficultyTest134" : { + "parentTimestamp" : "1082067424", + "parentDifficulty" : "1745251194", + "currentTimestamp" : "1082067424", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188834004039" + }, + + "DifficultyTest137" : { + "parentTimestamp" : "735441529", + "parentDifficulty" : "1523346586", + "currentTimestamp" : "735441530", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1524090407" + }, + + "DifficultyTest139" : { + "parentTimestamp" : "1773330576", + "parentDifficulty" : "438800855", + "currentTimestamp" : "1773330577", + "currentBlockNumber" : "300001", + "currentDifficulty" : "439015115" + }, + + "DifficultyTest140" : { + "parentTimestamp" : "561312434", + "parentDifficulty" : "937681702", + "currentTimestamp" : "561312435", + "currentBlockNumber" : "375001", + "currentDifficulty" : "938139556" + }, + + "DifficultyTest141" : { + "parentTimestamp" : "1474261685", + "parentDifficulty" : "1515027512", + "currentTimestamp" : "1474261686", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1515767275" + }, + + "DifficultyTest142" : { + "parentTimestamp" : "691276175", + "parentDifficulty" : "2031681814", + "currentTimestamp" : "691276176", + "currentBlockNumber" : "525001", + "currentDifficulty" : "2032673854" + }, + + "DifficultyTest143" : { + "parentTimestamp" : "1330372615", + "parentDifficulty" : "1218232322", + "currentTimestamp" : "1330372616", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1218827178" + }, + + "DifficultyTest144" : { + "parentTimestamp" : "1314511544", + "parentDifficulty" : "808250720", + "currentTimestamp" : "1314511545", + "currentBlockNumber" : "675001", + "currentDifficulty" : "808645389" + }, + + "DifficultyTest145" : { + "parentTimestamp" : "1216034255", + "parentDifficulty" : "577482816", + "currentTimestamp" : "1216034256", + "currentBlockNumber" : "750001", + "currentDifficulty" : "577764822" + }, + + "DifficultyTest148" : { + "parentTimestamp" : "1220956331", + "parentDifficulty" : "1691826055", + "currentTimestamp" : "1220956332", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1692652269" + }, + + "DifficultyTest149" : { + "parentTimestamp" : "1274901925", + "parentDifficulty" : "1995763980", + "currentTimestamp" : "1274901926", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1996738730" + }, + + "DifficultyTest153" : { + "parentTimestamp" : "387431813", + "parentDifficulty" : "357914364", + "currentTimestamp" : "387431814", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "358091174" + }, + + "DifficultyTest154" : { + "parentTimestamp" : "688190974", + "parentDifficulty" : "1542709696", + "currentTimestamp" : "688190975", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1543467068" + }, + + "DifficultyTest159" : { + "parentTimestamp" : "1302871419", + "parentDifficulty" : "330834402", + "currentTimestamp" : "1302871420", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "331061478" + }, + + "DifficultyTest162" : { + "parentTimestamp" : "61682499", + "parentDifficulty" : "842250576", + "currentTimestamp" : "61682500", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "842923975" + }, + + "DifficultyTest164" : { + "parentTimestamp" : "1801039113", + "parentDifficulty" : "749146612", + "currentTimestamp" : "1801039114", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "750036694" + }, + + "DifficultyTest166" : { + "parentTimestamp" : "1901960393", + "parentDifficulty" : "558788782", + "currentTimestamp" : "1901960394", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "561158780" + }, + + "DifficultyTest169" : { + "parentTimestamp" : "761874518", + "parentDifficulty" : "1058430572", + "currentTimestamp" : "761874519", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1067335991" + }, + + "DifficultyTest175" : { + "parentTimestamp" : "1930367057", + "parentDifficulty" : "1768990276", + "currentTimestamp" : "1930367058", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "2038289496" + }, + + "DifficultyTest177" : { + "parentTimestamp" : "1288874041", + "parentDifficulty" : "673159724", + "currentTimestamp" : "1288874042", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "1210359327" + }, + + "DifficultyTest178" : { + "parentTimestamp" : "776170216", + "parentDifficulty" : "748784148", + "currentTimestamp" : "776170217", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1822891589" + }, + + "DifficultyTest179" : { + "parentTimestamp" : "574378705", + "parentDifficulty" : "1129881328", + "currentTimestamp" : "574378706", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "3277916675" + }, + + "DifficultyTest180" : { + "parentTimestamp" : "27599854", + "parentDifficulty" : "248338056", + "currentTimestamp" : "27599855", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "2395942962" + }, + + "DifficultyTest181" : { + "parentTimestamp" : "520665331", + "parentDifficulty" : "673640364", + "currentTimestamp" : "520665332", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4968936585" + }, + + "DifficultyTest182" : { + "parentTimestamp" : "171581341", + "parentDifficulty" : "85610846", + "currentTimestamp" : "171581342", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "8675587240" + }, + + "DifficultyTest183" : { + "parentTimestamp" : "1313982462", + "parentDifficulty" : "1483249683", + "currentTimestamp" : "1313982463", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "18663843110" + }, + + "DifficultyTest187" : { + "parentTimestamp" : "504622055", + "parentDifficulty" : "470789691", + "currentTimestamp" : "504622056", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "137909973040" + }, + + "DifficultyTest189" : { + "parentTimestamp" : "882260219", + "parentDifficulty" : "612192184", + "currentTimestamp" : "882260220", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275490398049" + }, + + "DifficultyTest190" : { + "parentTimestamp" : "2038782473", + "parentDifficulty" : "942344410", + "currentTimestamp" : "2038782474", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550698618427" + }, + + "DifficultyTest195" : { + "parentTimestamp" : "1983466664", + "parentDifficulty" : "1786684396", + "currentTimestamp" : "1983466665", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797880579008" + }, + + "DifficultyTest200" : { + "parentTimestamp" : "2077450631", + "parentDifficulty" : "1883616612", + "currentTimestamp" : "2077450632", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370628714010" + }, + + "DifficultyTest202" : { + "parentTimestamp" : "1288589590", + "parentDifficulty" : "518061342", + "currentTimestamp" : "1288589591", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475495024957" + }, + + "DifficultyTest204" : { + "parentTimestamp" : "304238725", + "parentDifficulty" : "994496440", + "currentTimestamp" : "304238726", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950948403345" + }, + + "DifficultyTest205" : { + "parentTimestamp" : "1511357601", + "parentDifficulty" : "255950604", + "currentTimestamp" : "1511357602", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900162918203" + }, + + "DifficultyTest207" : { + "parentTimestamp" : "1267027844", + "parentDifficulty" : "661035255", + "currentTimestamp" : "1267027845", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600288728522" + }, + + "DifficultyTest208" : { + "parentTimestamp" : "1267866020", + "parentDifficulty" : "1595235540", + "currentTimestamp" : "1267866021", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503601223384959" + }, + + "DifficultyTest209" : { + "parentTimestamp" : "492883943", + "parentDifficulty" : "690138088", + "currentTimestamp" : "492883944", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199945216061" + }, + + "DifficultyTest211" : { + "parentTimestamp" : "258388253", + "parentDifficulty" : "1411054901", + "currentTimestamp" : "258388254", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798430707860" + }, + + "DifficultyTest212" : { + "parentTimestamp" : "224762781", + "parentDifficulty" : "2099493344", + "currentTimestamp" : "224762782", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028799119482455" + }, + + "DifficultyTest213" : { + "parentTimestamp" : "2094083326", + "parentDifficulty" : "1551865210", + "currentTimestamp" : "2094083327", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595590550892" + }, + + "DifficultyTest216" : { + "parentTimestamp" : "748286438", + "parentDifficulty" : "640831596", + "currentTimestamp" : "748286439", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376792856246" + }, + + "DifficultyTest218" : { + "parentTimestamp" : "1076900177", + "parentDifficulty" : "1191477108", + "currentTimestamp" : "1076900178", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921505798905859" + }, + + "DifficultyTest222" : { + "parentTimestamp" : "507683813", + "parentDifficulty" : "1707872486", + "currentTimestamp" : "507683814", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038563482216" + }, + + "DifficultyTest229" : { + "parentTimestamp" : "2078849815", + "parentDifficulty" : "722685139", + "currentTimestamp" : "2078849816", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905180075863868" + }, + + "DifficultyTest231" : { + "parentTimestamp" : "904328861", + "parentDifficulty" : "975363078", + "currentTimestamp" : "904328862", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718387142753" + }, + + "DifficultyTest234" : { + "parentTimestamp" : "1499395131", + "parentDifficulty" : "2108458812", + "currentTimestamp" : "1499395132", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871754702028" + }, + + "DifficultyTest239" : { + "parentTimestamp" : "682178597", + "parentDifficulty" : "1960786006", + "currentTimestamp" : "682178598", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725916285162557" + }, + + "DifficultyTest242" : { + "parentTimestamp" : "781905846", + "parentDifficulty" : "1987928069", + "currentTimestamp" : "781905847", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903659282575281" + }, + + "DifficultyTest243" : { + "parentTimestamp" : "172683329", + "parentDifficulty" : "271951916", + "currentTimestamp" : "172683330", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807314859437793" + }, + + "DifficultyTest245" : { + "parentTimestamp" : "92633624", + "parentDifficulty" : "552631620", + "currentTimestamp" : "92633625", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629727607635" + }, + + "DifficultyTest246" : { + "parentTimestamp" : "1388320631", + "parentDifficulty" : "633582126", + "currentTimestamp" : "1388320632", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229258983303844" + }, + + "DifficultyTest248" : { + "parentTimestamp" : "2046357604", + "parentDifficulty" : "897314508", + "currentTimestamp" : "2046357605", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517596577353" + }, + + "DifficultyTest249" : { + "parentTimestamp" : "1023125297", + "parentDifficulty" : "734242432", + "currentTimestamp" : "1023125298", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034132250356" + }, + + "DifficultyTest250" : { + "parentTimestamp" : "1095307208", + "parentDifficulty" : "177851099", + "currentTimestamp" : "1095307209", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834066973236756" + }, + + "DifficultyTest251" : { + "parentTimestamp" : "1435005381", + "parentDifficulty" : "900617686", + "currentTimestamp" : "1435005382", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668134491655072" + }, + + "DifficultyTest252" : { + "parentTimestamp" : "2036058551", + "parentDifficulty" : "518968928", + "currentTimestamp" : "2036058552", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668134109819962" + }, + + "DifficultyTest255" : { + "parentTimestamp" : "1593421513", + "parentDifficulty" : "168210760", + "currentTimestamp" : "1593421514", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345068893073950" + }, + + "DifficultyTest256" : { + "parentTimestamp" : "746393783", + "parentDifficulty" : "1990657693", + "currentTimestamp" : "746393784", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345070716410749" + }, + + "DifficultyTest257" : { + "parentTimestamp" : "1222323606", + "parentDifficulty" : "421323492", + "currentTimestamp" : "1222323607", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690137871091328" + }, + + "DifficultyTest258" : { + "parentTimestamp" : "1327690662", + "parentDifficulty" : "490828358", + "currentTimestamp" : "1327690663", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380275390192244" + }, + + "DifficultyTest259" : { + "parentTimestamp" : "1834243055", + "parentDifficulty" : "1425151186", + "currentTimestamp" : "1834243056", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551224095508" + }, + + "DifficultyTest261" : { + "parentTimestamp" : "931390833", + "parentDifficulty" : "1322783881", + "currentTimestamp" : "931390834", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521100919926667" + }, + + "DifficultyTest263" : { + "parentTimestamp" : "1820349411", + "parentDifficulty" : "2010459174", + "currentTimestamp" : "1820349412", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084400397428427" + }, + + "DifficultyTest264" : { + "parentTimestamp" : "2124730677", + "parentDifficulty" : "635322687", + "currentTimestamp" : "2124730678", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084399021620487" + }, + + "DifficultyTest265" : { + "parentTimestamp" : "1564642913", + "parentDifficulty" : "1626892875", + "currentTimestamp" : "1564642914", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798399662424" + }, + + "DifficultyTest267" : { + "parentTimestamp" : "2076889890", + "parentDifficulty" : "572178233", + "currentTimestamp" : "2076889891", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675187660358288" + }, + + "DifficultyTest271" : { + "parentTimestamp" : "39259121", + "parentDifficulty" : "1767785506", + "currentTimestamp" : "39259123", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1768648682" + }, + + "DifficultyTest273" : { + "parentTimestamp" : "1024963173", + "parentDifficulty" : "710444303", + "currentTimestamp" : "1024963175", + "currentBlockNumber" : "300001", + "currentDifficulty" : "710791201" + }, + + "DifficultyTest274" : { + "parentTimestamp" : "62885317", + "parentDifficulty" : "165285148", + "currentTimestamp" : "62885319", + "currentBlockNumber" : "375001", + "currentDifficulty" : "165365855" + }, + + "DifficultyTest276" : { + "parentTimestamp" : "2112294027", + "parentDifficulty" : "1359711184", + "currentTimestamp" : "2112294029", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1360375113" + }, + + "DifficultyTest277" : { + "parentTimestamp" : "64495122", + "parentDifficulty" : "968599600", + "currentTimestamp" : "64495124", + "currentBlockNumber" : "600001", + "currentDifficulty" : "969072565" + }, + + "DifficultyTest278" : { + "parentTimestamp" : "77896186", + "parentDifficulty" : "1253039330", + "currentTimestamp" : "77896188", + "currentBlockNumber" : "675001", + "currentDifficulty" : "1253651181" + }, + + "DifficultyTest280" : { + "parentTimestamp" : "1128919648", + "parentDifficulty" : "101280532", + "currentTimestamp" : "1128919650", + "currentBlockNumber" : "825001", + "currentDifficulty" : "101330049" + }, + + "DifficultyTest281" : { + "parentTimestamp" : "2100742251", + "parentDifficulty" : "940878624", + "currentTimestamp" : "2100742253", + "currentBlockNumber" : "900001", + "currentDifficulty" : "941338165" + }, + + "DifficultyTest282" : { + "parentTimestamp" : "2075219709", + "parentDifficulty" : "739259096", + "currentTimestamp" : "2075219711", + "currentBlockNumber" : "975001", + "currentDifficulty" : "739620190" + }, + + "DifficultyTest283" : { + "parentTimestamp" : "713480506", + "parentDifficulty" : "1366518490", + "currentTimestamp" : "713480508", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1367185991" + }, + + "DifficultyTest284" : { + "parentTimestamp" : "1173455212", + "parentDifficulty" : "152594020", + "currentTimestamp" : "1173455214", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "152669040" + }, + + "DifficultyTest287" : { + "parentTimestamp" : "559483364", + "parentDifficulty" : "1353067899", + "currentTimestamp" : "559483366", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "1353730624" + }, + + "DifficultyTest288" : { + "parentTimestamp" : "723760470", + "parentDifficulty" : "1835580785", + "currentTimestamp" : "723760472", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1836481160" + }, + + "DifficultyTest289" : { + "parentTimestamp" : "1238631406", + "parentDifficulty" : "407138104", + "currentTimestamp" : "1238631408", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "407345093" + }, + + "DifficultyTest290" : { + "parentTimestamp" : "692452065", + "parentDifficulty" : "308954460", + "currentTimestamp" : "692452067", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "309113508" + }, + + "DifficultyTest291" : { + "parentTimestamp" : "1237773190", + "parentDifficulty" : "2047397941", + "currentTimestamp" : "1237773192", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "2048414031" + }, + + "DifficultyTest292" : { + "parentTimestamp" : "575433717", + "parentDifficulty" : "1296317086", + "currentTimestamp" : "575433719", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1296982821" + }, + + "DifficultyTest301" : { + "parentTimestamp" : "29932457", + "parentDifficulty" : "1289780048", + "currentTimestamp" : "29932459", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1294604127" + }, + + "DifficultyTest302" : { + "parentTimestamp" : "1337827312", + "parentDifficulty" : "591515154", + "currentTimestamp" : "1337827314", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "595998283" + }, + + "DifficultyTest304" : { + "parentTimestamp" : "1899093929", + "parentDifficulty" : "1787543516", + "currentTimestamp" : "1899093931", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1805193555" + }, + + "DifficultyTest305" : { + "parentTimestamp" : "293371204", + "parentDifficulty" : "155036214", + "currentTimestamp" : "293371206", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "188666347" + }, + + "DifficultyTest307" : { + "parentTimestamp" : "1555908064", + "parentDifficulty" : "1966350942", + "currentTimestamp" : "1555908066", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "2034419938" + }, + + "DifficultyTest309" : { + "parentTimestamp" : "367529329", + "parentDifficulty" : "296006028", + "currentTimestamp" : "367529331", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "564586018" + }, + + "DifficultyTest315" : { + "parentTimestamp" : "223194580", + "parentDifficulty" : "609161856", + "currentTimestamp" : "223194582", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4904426594" + }, + + "DifficultyTest319" : { + "parentTimestamp" : "696467799", + "parentDifficulty" : "195995600", + "currentTimestamp" : "696467801", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "34555829668" + }, + + "DifficultyTest322" : { + "parentTimestamp" : "820006838", + "parentDifficulty" : "1465880106", + "currentTimestamp" : "820006840", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "138905549339" + }, + + "DifficultyTest323" : { + "parentTimestamp" : "2063219591", + "parentDifficulty" : "612552694", + "currentTimestamp" : "2063219593", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275490758735" + }, + + "DifficultyTest325" : { + "parentTimestamp" : "1614462639", + "parentDifficulty" : "777476997", + "currentTimestamp" : "1614462641", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1100289484400" + }, + + "DifficultyTest329" : { + "parentTimestamp" : "362207874", + "parentDifficulty" : "886593224", + "currentTimestamp" : "362207876", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8796980048338" + }, + + "DifficultyTest330" : { + "parentTimestamp" : "1162697434", + "parentDifficulty" : "1038178536", + "currentTimestamp" : "1162697436", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797131707667" + }, + + "DifficultyTest331" : { + "parentTimestamp" : "1162455475", + "parentDifficulty" : "335241540", + "currentTimestamp" : "1162455477", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592521449648" + }, + + "DifficultyTest333" : { + "parentTimestamp" : "982495357", + "parentDifficulty" : "1665171670", + "currentTimestamp" : "982495359", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370410162406" + }, + + "DifficultyTest334" : { + "parentTimestamp" : "1318253422", + "parentDifficulty" : "2019956596", + "currentTimestamp" : "1318253424", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370765120566" + }, + + "DifficultyTest337" : { + "parentTimestamp" : "892242572", + "parentDifficulty" : "853189312", + "currentTimestamp" : "892242574", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562950807027220" + }, + + "DifficultyTest338" : { + "parentTimestamp" : "673789875", + "parentDifficulty" : "1481237509", + "currentTimestamp" : "673789877", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951435382081" + }, + + "DifficultyTest339" : { + "parentTimestamp" : "894115268", + "parentDifficulty" : "660705885", + "currentTimestamp" : "894115270", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900567871119" + }, + + "DifficultyTest342" : { + "parentTimestamp" : "202483575", + "parentDifficulty" : "1887873066", + "currentTimestamp" : "202483577", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503601516165375" + }, + + "DifficultyTest343" : { + "parentTimestamp" : "258037428", + "parentDifficulty" : "798118360", + "currentTimestamp" : "258037430", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007200053249058" + }, + + "DifficultyTest344" : { + "parentTimestamp" : "1965675891", + "parentDifficulty" : "839491128", + "currentTimestamp" : "1965675893", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399349383019" + }, + + "DifficultyTest346" : { + "parentTimestamp" : "950572888", + "parentDifficulty" : "2088567770", + "currentTimestamp" : "950572890", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028799108551546" + }, + + "DifficultyTest347" : { + "parentTimestamp" : "1011166743", + "parentDifficulty" : "2044014688", + "currentTimestamp" : "1011166745", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057596082940678" + }, + + "DifficultyTest350" : { + "parentTimestamp" : "8508320", + "parentDifficulty" : "107557511", + "currentTimestamp" : "8508322", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376259321773" + }, + + "DifficultyTest351" : { + "parentTimestamp" : "1346033126", + "parentDifficulty" : "373483732", + "currentTimestamp" : "1346033128", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460752677089585" + }, + + "DifficultyTest352" : { + "parentTimestamp" : "1397315787", + "parentDifficulty" : "1750384960", + "currentTimestamp" : "1397315789", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921506358086616" + }, + + "DifficultyTest355" : { + "parentTimestamp" : "1513144684", + "parentDifficulty" : "1049632173", + "currentTimestamp" : "1513144686", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019477532592" + }, + + "DifficultyTest357" : { + "parentTimestamp" : "1130206640", + "parentDifficulty" : "545769888", + "currentTimestamp" : "1130206642", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074255587993" + }, + + "DifficultyTest360" : { + "parentTimestamp" : "199349982", + "parentDifficulty" : "1284824368", + "currentTimestamp" : "199349984", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296123658187" + }, + + "DifficultyTest362" : { + "parentTimestamp" : "2141970997", + "parentDifficulty" : "1057056056", + "currentTimestamp" : "2141970999", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952590733985124" + }, + + "DifficultyTest363" : { + "parentTimestamp" : "1274625785", + "parentDifficulty" : "243915756", + "currentTimestamp" : "1274625787", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179596860711" + }, + + "DifficultyTest364" : { + "parentTimestamp" : "1541168288", + "parentDifficulty" : "567609335", + "currentTimestamp" : "1541168290", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810359273538199" + }, + + "DifficultyTest365" : { + "parentTimestamp" : "135480264", + "parentDifficulty" : "769169524", + "currentTimestamp" : "135480266", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718180848519" + }, + + "DifficultyTest366" : { + "parentTimestamp" : "212028371", + "parentDifficulty" : "931728708", + "currentTimestamp" : "212028373", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620718343487077" + }, + + "DifficultyTest367" : { + "parentTimestamp" : "931485083", + "parentDifficulty" : "1313250258", + "currentTimestamp" : "931485085", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436136498341" + }, + + "DifficultyTest368" : { + "parentTimestamp" : "822182200", + "parentDifficulty" : "1537112834", + "currentTimestamp" : "822182202", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871183077073" + }, + + "DifficultyTest369" : { + "parentTimestamp" : "2069045469", + "parentDifficulty" : "713380442", + "currentTimestamp" : "2069045471", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965740004156164" + }, + + "DifficultyTest370" : { + "parentTimestamp" : "1102490592", + "parentDifficulty" : "1428825148", + "currentTimestamp" : "1102490594", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965740719950208" + }, + + "DifficultyTest378" : { + "parentTimestamp" : "73882265", + "parentDifficulty" : "2042944223", + "currentTimestamp" : "73882267", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316631294842" + }, + + "DifficultyTest382" : { + "parentTimestamp" : "2004903902", + "parentDifficulty" : "572564710", + "currentTimestamp" : "2004903904", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517271668986" + }, + + "DifficultyTest383" : { + "parentTimestamp" : "1154636784", + "parentDifficulty" : "221839157", + "currentTimestamp" : "1154636786", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917033619596884" + }, + + "DifficultyTest384" : { + "parentTimestamp" : "209524589", + "parentDifficulty" : "421860937", + "currentTimestamp" : "209524591", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834067217365739" + }, + + "DifficultyTest389" : { + "parentTimestamp" : "162328470", + "parentDifficulty" : "569026256", + "currentTimestamp" : "162328472", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069294085156" + }, + + "DifficultyTest390" : { + "parentTimestamp" : "1006886228", + "parentDifficulty" : "1105778756", + "currentTimestamp" : "1006886230", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345069831099743" + }, + + "DifficultyTest396" : { + "parentTimestamp" : "1538574882", + "parentDifficulty" : "1530405378", + "currentTimestamp" : "1538574884", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200724146438" + }, + + "DifficultyTest398" : { + "parentTimestamp" : "1908953555", + "parentDifficulty" : "2130301950", + "currentTimestamp" : "1908953557", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084400517329720" + }, + + + "DifficultyTest400" : { + "parentTimestamp" : "146235693", + "parentDifficulty" : "177739168", + "currentTimestamp" : "146235695", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337593721776290" + }, + + "DifficultyTest403" : { + "parentTimestamp" : "379455082", + "parentDifficulty" : "2116450046", + "currentTimestamp" : "379455085", + "currentBlockNumber" : "1", + "currentDifficulty" : "2117483468" + }, + + "DifficultyTest406" : { + "parentTimestamp" : "1733149481", + "parentDifficulty" : "1796828313", + "currentTimestamp" : "1733149484", + "currentBlockNumber" : "225001", + "currentDifficulty" : "1797705671" + }, + + "DifficultyTest407" : { + "parentTimestamp" : "822527541", + "parentDifficulty" : "1478676344", + "currentTimestamp" : "822527544", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1479398355" + }, + + "DifficultyTest408" : { + "parentTimestamp" : "367409412", + "parentDifficulty" : "1240624020", + "currentTimestamp" : "367409415", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1241229795" + }, + + "DifficultyTest409" : { + "parentTimestamp" : "887504380", + "parentDifficulty" : "1292935008", + "currentTimestamp" : "887504383", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1293566327" + }, + + "DifficultyTest410" : { + "parentTimestamp" : "1404974161", + "parentDifficulty" : "1304935701", + "currentTimestamp" : "1404974164", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1305572884" + }, + + "DifficultyTest412" : { + "parentTimestamp" : "1440821257", + "parentDifficulty" : "354921425", + "currentTimestamp" : "1440821260", + "currentBlockNumber" : "675001", + "currentDifficulty" : "355094742" + }, + + "DifficultyTest416" : { + "parentTimestamp" : "1789058136", + "parentDifficulty" : "205168583", + "currentTimestamp" : "1789058139", + "currentBlockNumber" : "975001", + "currentDifficulty" : "205268890" + }, + + "DifficultyTest417" : { + "parentTimestamp" : "321219525", + "parentDifficulty" : "323373714", + "currentTimestamp" : "321219528", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "323531867" + }, + + "DifficultyTest418" : { + "parentTimestamp" : "1178085860", + "parentDifficulty" : "49752944", + "currentTimestamp" : "1178085863", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "49777749" + }, + + "DifficultyTest422" : { + "parentTimestamp" : "2111478726", + "parentDifficulty" : "1395195366", + "currentTimestamp" : "2111478729", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1395880709" + }, + + "DifficultyTest423" : { + "parentTimestamp" : "39164349", + "parentDifficulty" : "401604103", + "currentTimestamp" : "39164352", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "401808390" + }, + + "DifficultyTest425" : { + "parentTimestamp" : "1579220826", + "parentDifficulty" : "398667332", + "currentTimestamp" : "1579220829", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "398878377" + }, + + "DifficultyTest426" : { + "parentTimestamp" : "1105354395", + "parentDifficulty" : "1943413639", + "currentTimestamp" : "1105354398", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1944395339" + }, + + "DifficultyTest427" : { + "parentTimestamp" : "1243742296", + "parentDifficulty" : "1942741070", + "currentTimestamp" : "1243742299", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1943755210" + }, + + "DifficultyTest430" : { + "parentTimestamp" : "171732689", + "parentDifficulty" : "355409994", + "currentTimestamp" : "171732692", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "355845678" + }, + + "DifficultyTest433" : { + "parentTimestamp" : "1759007775", + "parentDifficulty" : "648550220", + "currentTimestamp" : "1759007778", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "649915470" + }, + + "DifficultyTest435" : { + "parentTimestamp" : "979885504", + "parentDifficulty" : "318724626", + "currentTimestamp" : "979885507", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "323074557" + }, + + "DifficultyTest437" : { + "parentTimestamp" : "296314215", + "parentDifficulty" : "1602112746", + "currentTimestamp" : "296314218", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1611283635" + }, + + "DifficultyTest439" : { + "parentTimestamp" : "1076577192", + "parentDifficulty" : "670119403", + "currentTimestamp" : "1076577195", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "704001041" + }, + + "DifficultyTest440" : { + "parentTimestamp" : "556881746", + "parentDifficulty" : "1030994760", + "currentTimestamp" : "556881749", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "1065052607" + }, + + "DifficultyTest441" : { + "parentTimestamp" : "1454454525", + "parentDifficulty" : "288997533", + "currentTimestamp" : "1454454528", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "356247509" + }, + + "DifficultyTest442" : { + "parentTimestamp" : "1842456441", + "parentDifficulty" : "367813457", + "currentTimestamp" : "1842456444", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "502210781" + }, + + "DifficultyTest443" : { + "parentTimestamp" : "1406906939", + "parentDifficulty" : "697435312", + "currentTimestamp" : "1406906942", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "966211312" + }, + + "DifficultyTest448" : { + "parentTimestamp" : "1283799487", + "parentDifficulty" : "1281091526", + "currentTimestamp" : "1283799490", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "3429200706" + }, + + "DifficultyTest449" : { + "parentTimestamp" : "1651710845", + "parentDifficulty" : "1024801387", + "currentTimestamp" : "1651710848", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5320269074" + }, + + "DifficultyTest451" : { + "parentTimestamp" : "2095232361", + "parentDifficulty" : "1081486128", + "currentTimestamp" : "2095232364", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "18261883381" + }, + + "DifficultyTest452" : { + "parentTimestamp" : "1902965263", + "parentDifficulty" : "899106163", + "currentTimestamp" : "1902965266", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "18079414363" + }, + + "DifficultyTest453" : { + "parentTimestamp" : "1474060258", + "parentDifficulty" : "1310167440", + "currentTimestamp" : "1474060261", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35670545538" + }, + + "DifficultyTest454" : { + "parentTimestamp" : "693536656", + "parentDifficulty" : "1790561152", + "currentTimestamp" : "693536659", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70510912185" + }, + + "DifficultyTest459" : { + "parentTimestamp" : "385201264", + "parentDifficulty" : "1488131658", + "currentTimestamp" : "385201267", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1101000486060" + }, + + "DifficultyTest461" : { + "parentTimestamp" : "1752639769", + "parentDifficulty" : "261647580", + "currentTimestamp" : "1752639772", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199285030889" + }, + + "DifficultyTest462" : { + "parentTimestamp" : "2090002292", + "parentDifficulty" : "1354834228", + "currentTimestamp" : "2090002295", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399402006872" + }, + + "DifficultyTest465" : { + "parentTimestamp" : "1272093138", + "parentDifficulty" : "1257165195", + "currentTimestamp" : "1272093141", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17593443823461" + }, + + "DifficultyTest468" : { + "parentTimestamp" : "1646820644", + "parentDifficulty" : "1872001277", + "currentTimestamp" : "1646820647", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370617093004" + }, + + "DifficultyTest470" : { + "parentTimestamp" : "1369883276", + "parentDifficulty" : "749937000", + "currentTimestamp" : "1369883279", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475727013836" + }, + + "DifficultyTest471" : { + "parentTimestamp" : "158909320", + "parentDifficulty" : "1962652298", + "currentTimestamp" : "158909323", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562951917031936" + }, + + "DifficultyTest472" : { + "parentTimestamp" : "5710199", + "parentDifficulty" : "582816751", + "currentTimestamp" : "5710202", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950536522641" + }, + + "DifficultyTest475" : { + "parentTimestamp" : "1554554376", + "parentDifficulty" : "1692120876", + "currentTimestamp" : "1554554379", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601320317602" + }, + + "DifficultyTest478" : { + "parentTimestamp" : "1847006348", + "parentDifficulty" : "714200248", + "currentTimestamp" : "1847006351", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399224030962" + }, + + "DifficultyTest479" : { + "parentTimestamp" : "1149182847", + "parentDifficulty" : "62656650", + "currentTimestamp" : "1149182850", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028797081651212" + }, + + "DifficultyTest481" : { + "parentTimestamp" : "320511975", + "parentDifficulty" : "1614509157", + "currentTimestamp" : "320511978", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595653225427" + }, + + "DifficultyTest482" : { + "parentTimestamp" : "1296769420", + "parentDifficulty" : "1257337160", + "currentTimestamp" : "1296769423", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115189333806966" + }, + + "DifficultyTest483" : { + "parentTimestamp" : "1261141152", + "parentDifficulty" : "1390238960", + "currentTimestamp" : "1261141155", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377542629531" + }, + + "DifficultyTest486" : { + "parentTimestamp" : "278370642", + "parentDifficulty" : "1525824673", + "currentTimestamp" : "278370645", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921506133416680" + }, + + "DifficultyTest488" : { + "parentTimestamp" : "147602027", + "parentDifficulty" : "1355923784", + "currentTimestamp" : "147602030", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843010570279808" + }, + + "DifficultyTest491" : { + "parentTimestamp" : "139864592", + "parentDifficulty" : "696886655", + "currentTimestamp" : "139864595", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074406778547" + }, + + "DifficultyTest492" : { + "parentTimestamp" : "252030981", + "parentDifficulty" : "1104975508", + "currentTimestamp" : "252030984", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074815066662" + }, + + "DifficultyTest493" : { + "parentTimestamp" : "209177480", + "parentDifficulty" : "1474885580", + "currentTimestamp" : "209177483", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148894708970" + }, + + "DifficultyTest494" : { + "parentTimestamp" : "1467242967", + "parentDifficulty" : "1488647196", + "currentTimestamp" : "1467242970", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296327580538" + }, + + "DifficultyTest496" : { + "parentTimestamp" : "1537523507", + "parentDifficulty" : "1166487439", + "currentTimestamp" : "1537523510", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952590843469940" + }, + + "DifficultyTest501" : { + "parentTimestamp" : "464779434", + "parentDifficulty" : "1891985176", + "currentTimestamp" : "464779437", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436715515844" + }, + + "DifficultyTest503" : { + "parentTimestamp" : "1022000651", + "parentDifficulty" : "1810990380", + "currentTimestamp" : "1022000654", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965741102302044" + }, + + "DifficultyTest505" : { + "parentTimestamp" : "1444183363", + "parentDifficulty" : "2018410407", + "currentTimestamp" : "1444183366", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480600250742" + }, + + "DifficultyTest506" : { + "parentTimestamp" : "1027430833", + "parentDifficulty" : "322312648", + "currentTimestamp" : "1027430836", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957484179595" + }, + + "DifficultyTest508" : { + "parentTimestamp" : "401412102", + "parentDifficulty" : "1553502863", + "currentTimestamp" : "401412105", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725915877680545" + }, + + "DifficultyTest511" : { + "parentTimestamp" : "1724336303", + "parentDifficulty" : "1115410900", + "currentTimestamp" : "1724336306", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807315703308622" + }, + + "DifficultyTest512" : { + "parentTimestamp" : "48190951", + "parentDifficulty" : "1696682223", + "currentTimestamp" : "48190954", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316284863769" + }, + + "DifficultyTest513" : { + "parentTimestamp" : "2063303577", + "parentDifficulty" : "1975761990", + "currentTimestamp" : "2063303580", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614631151432893" + }, + + "DifficultyTest516" : { + "parentTimestamp" : "220268525", + "parentDifficulty" : "754052608", + "currentTimestamp" : "220268528", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517453245501" + }, + + "DifficultyTest519" : { + "parentTimestamp" : "1008899327", + "parentDifficulty" : "89880944", + "currentTimestamp" : "1008899330", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668133680522463" + }, + + "DifficultyTest523" : { + "parentTimestamp" : "803270037", + "parentDifficulty" : "434402373", + "currentTimestamp" : "803270040", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069159395539" + }, + + "DifficultyTest524" : { + "parentTimestamp" : "1765510935", + "parentDifficulty" : "1616321203", + "currentTimestamp" : "1765510938", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345070341891478" + }, + + "DifficultyTest526" : { + "parentTimestamp" : "1723711983", + "parentDifficulty" : "2105931848", + "currentTimestamp" : "1723711986", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380277006084359" + }, + + "DifficultyTest530" : { + "parentTimestamp" : "1528845471", + "parentDifficulty" : "1025746872", + "currentTimestamp" : "1528845474", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200219241516" + }, + + "DifficultyTest531" : { + "parentTimestamp" : "74756715", + "parentDifficulty" : "616393290", + "currentTimestamp" : "74756718", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084399002681847" + }, + + "DifficultyTest533" : { + "parentTimestamp" : "815709232", + "parentDifficulty" : "916961074", + "currentTimestamp" : "815709235", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797689383976" + }, + + "DifficultyTest534" : { + "parentTimestamp" : "1837505743", + "parentDifficulty" : "1444116649", + "currentTimestamp" : "1837505746", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594988772120" + }, + + "DifficultyTest535" : { + "parentTimestamp" : "1582202358", + "parentDifficulty" : "1915974198", + "currentTimestamp" : "1582202361", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675189004810404" + }, + + "DifficultyTest537" : { + "parentTimestamp" : "1727467979", + "parentDifficulty" : "543429038", + "currentTimestamp" : "1727467983", + "currentBlockNumber" : "1", + "currentDifficulty" : "543694384" + }, + + "DifficultyTest539" : { + "parentTimestamp" : "712737063", + "parentDifficulty" : "247966686", + "currentTimestamp" : "712737067", + "currentBlockNumber" : "150001", + "currentDifficulty" : "248087763" + }, + + "DifficultyTest540" : { + "parentTimestamp" : "1463390959", + "parentDifficulty" : "1337906023", + "currentTimestamp" : "1463390963", + "currentBlockNumber" : "225001", + "currentDifficulty" : "1338559298" + }, + + "DifficultyTest542" : { + "parentTimestamp" : "1535308297", + "parentDifficulty" : "876349802", + "currentTimestamp" : "1535308301", + "currentBlockNumber" : "375001", + "currentDifficulty" : "876777709" + }, + + "DifficultyTest543" : { + "parentTimestamp" : "575204761", + "parentDifficulty" : "595041634", + "currentTimestamp" : "575204765", + "currentBlockNumber" : "450001", + "currentDifficulty" : "595332185" + }, + + "DifficultyTest544" : { + "parentTimestamp" : "906457252", + "parentDifficulty" : "1174234382", + "currentTimestamp" : "906457256", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1174807746" + }, + + "DifficultyTest548" : { + "parentTimestamp" : "941902238", + "parentDifficulty" : "527275796", + "currentTimestamp" : "941902242", + "currentBlockNumber" : "825001", + "currentDifficulty" : "527533318" + }, + + "DifficultyTest549" : { + "parentTimestamp" : "58343780", + "parentDifficulty" : "2044428900", + "currentTimestamp" : "58343784", + "currentBlockNumber" : "900001", + "currentDifficulty" : "2045427284" + }, + + "DifficultyTest555" : { + "parentTimestamp" : "1610706618", + "parentDifficulty" : "173809682", + "currentTimestamp" : "1610706622", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "173896598" + }, + + "DifficultyTest557" : { + "parentTimestamp" : "623485482", + "parentDifficulty" : "1483818518", + "currentTimestamp" : "623485486", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "1484551230" + }, + + "DifficultyTest558" : { + "parentTimestamp" : "1908755236", + "parentDifficulty" : "861606860", + "currentTimestamp" : "1908755240", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "862035758" + }, + + "DifficultyTest559" : { + "parentTimestamp" : "200483739", + "parentDifficulty" : "1101347681", + "currentTimestamp" : "200483743", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1101901832" + }, + + "DifficultyTest560" : { + "parentTimestamp" : "555456802", + "parentDifficulty" : "1385518505", + "currentTimestamp" : "555456806", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1386227795" + }, + + "DifficultyTest563" : { + "parentTimestamp" : "1487466513", + "parentDifficulty" : "570956288", + "currentTimestamp" : "1487466517", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "571366147" + }, + + "DifficultyTest565" : { + "parentTimestamp" : "1332261191", + "parentDifficulty" : "1721537123", + "currentTimestamp" : "1332261195", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1722902005" + }, + + "DifficultyTest568" : { + "parentTimestamp" : "1842451956", + "parentDifficulty" : "2070913959", + "currentTimestamp" : "1842451960", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "2074022299" + }, + + "DifficultyTest569" : { + "parentTimestamp" : "1621538112", + "parentDifficulty" : "1263005438", + "currentTimestamp" : "1621538116", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1267816443" + }, + + "DifficultyTest570" : { + "parentTimestamp" : "257026336", + "parentDifficulty" : "635103876", + "currentTimestamp" : "257026340", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "639608289" + }, + + "DifficultyTest573" : { + "parentTimestamp" : "756250", + "parentDifficulty" : "1933052240", + "currentTimestamp" : "756254", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "1967550545" + }, + + "DifficultyTest575" : { + "parentTimestamp" : "1285495109", + "parentDifficulty" : "812815340", + "currentTimestamp" : "1285495113", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "880321086" + }, + + "DifficultyTest576" : { + "parentTimestamp" : "1057656361", + "parentDifficulty" : "422928836", + "currentTimestamp" : "1057656365", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "557353072" + }, + + "DifficultyTest579" : { + "parentTimestamp" : "1508663297", + "parentDifficulty" : "319257925", + "currentTimestamp" : "1508663301", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "856284724" + }, + + "DifficultyTest582" : { + "parentTimestamp" : "1978964816", + "parentDifficulty" : "552047520", + "currentTimestamp" : "1978964820", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "2699800722" + }, + + "DifficultyTest583" : { + "parentTimestamp" : "406919578", + "parentDifficulty" : "1404781641", + "currentTimestamp" : "406919582", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5700434865" + }, + + "DifficultyTest588" : { + "parentTimestamp" : "1564419282", + "parentDifficulty" : "1957856516", + "currentTimestamp" : "1564419286", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70678289236" + }, + + "DifficultyTest590" : { + "parentTimestamp" : "1035211953", + "parentDifficulty" : "2027054651", + "currentTimestamp" : "1035211957", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "139466997895" + }, + + "DifficultyTest591" : { + "parentTimestamp" : "248092662", + "parentDifficulty" : "934344250", + "currentTimestamp" : "248092666", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275812707416" + }, + + "DifficultyTest596" : { + "parentTimestamp" : "2123639446", + "parentDifficulty" : "828927740", + "currentTimestamp" : "2123639450", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4398875843593" + }, + + "DifficultyTest599" : { + "parentTimestamp" : "1975322145", + "parentDifficulty" : "687306008", + "currentTimestamp" : "1975322149", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592873686022" + }, + + "DifficultyTest601" : { + "parentTimestamp" : "566803048", + "parentDifficulty" : "306851561", + "currentTimestamp" : "566803052", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70369051179054" + }, + + "DifficultyTest603" : { + "parentTimestamp" : "1453412438", + "parentDifficulty" : "397983976", + "currentTimestamp" : "1453412442", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140737886533632" + }, + + "DifficultyTest604" : { + "parentTimestamp" : "1638918119", + "parentDifficulty" : "695993461", + "currentTimestamp" : "1638918123", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475673043957" + }, + + "DifficultyTest606" : { + "parentTimestamp" : "1413417564", + "parentDifficulty" : "1168291374", + "currentTimestamp" : "1413417568", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951122283140" + }, + + "DifficultyTest609" : { + "parentTimestamp" : "1540762109", + "parentDifficulty" : "623037187", + "currentTimestamp" : "1540762113", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600250711900" + }, + + "DifficultyTest616" : { + "parentTimestamp" : "992024699", + "parentDifficulty" : "1661652132", + "currentTimestamp" : "992024703", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115189738319357" + }, + + "DifficultyTest617" : { + "parentTimestamp" : "667675945", + "parentDifficulty" : "1926214662", + "currentTimestamp" : "667675949", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230378078866940" + }, + + "DifficultyTest620" : { + "parentTimestamp" : "239482944", + "parentDifficulty" : "1239366219", + "currentTimestamp" : "239482948", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921505846818354" + }, + + "DifficultyTest624" : { + "parentTimestamp" : "1181365105", + "parentDifficulty" : "1219405268", + "currentTimestamp" : "1181365109", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038074776488" + }, + + "DifficultyTest626" : { + "parentTimestamp" : "447797068", + "parentDifficulty" : "1170216011", + "currentTimestamp" : "447797072", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074880339021" + }, + + "DifficultyTest628" : { + "parentTimestamp" : "1810140104", + "parentDifficulty" : "652283033", + "currentTimestamp" : "1810140108", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976295490807994" + }, + + "DifficultyTest629" : { + "parentTimestamp" : "1555163161", + "parentDifficulty" : "138215868", + "currentTimestamp" : "1555163165", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952589814696284" + }, + + "DifficultyTest631" : { + "parentTimestamp" : "922532636", + "parentDifficulty" : "1487638313", + "currentTimestamp" : "922532640", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905180841190554" + }, + + "DifficultyTest634" : { + "parentTimestamp" : "403436956", + "parentDifficulty" : "473888904", + "currentTimestamp" : "403436960", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717885423719" + }, + + "DifficultyTest636" : { + "parentTimestamp" : "1177643719", + "parentDifficulty" : "127237612", + "currentTimestamp" : "1177643723", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482869772513435" + }, + + "DifficultyTest637" : { + "parentTimestamp" : "2095132417", + "parentDifficulty" : "166600763", + "currentTimestamp" : "2095132421", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965739457109503" + }, + + "DifficultyTest640" : { + "parentTimestamp" : "1495451997", + "parentDifficulty" : "1696924548", + "currentTimestamp" : "1495452001", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958859462692" + }, + + "DifficultyTest642" : { + "parentTimestamp" : "529161561", + "parentDifficulty" : "2120950769", + "currentTimestamp" : "529161565", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725916445405525" + }, + + "DifficultyTest643" : { + "parentTimestamp" : "403859583", + "parentDifficulty" : "1959622245", + "currentTimestamp" : "403859587", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451830607417363" + }, + + "DifficultyTest645" : { + "parentTimestamp" : "402428058", + "parentDifficulty" : "322977964", + "currentTimestamp" : "402428062", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807314910488756" + }, + + "DifficultyTest646" : { + "parentTimestamp" : "1044852854", + "parentDifficulty" : "171121508", + "currentTimestamp" : "1044852858", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807314758558151" + }, + + "DifficultyTest653" : { + "parentTimestamp" : "889588018", + "parentDifficulty" : "1829960462", + "currentTimestamp" : "889588022", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135421451629" + }, + + "DifficultyTest656" : { + "parentTimestamp" : "1309713294", + "parentDifficulty" : "1786174219", + "currentTimestamp" : "1309713298", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672536149436902" + }, + + "DifficultyTest657" : { + "parentTimestamp" : "1883115794", + "parentDifficulty" : "27050803", + "currentTimestamp" : "1883115798", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345068751845067" + }, + + "DifficultyTest658" : { + "parentTimestamp" : "104083693", + "parentDifficulty" : "172820252", + "currentTimestamp" : "104083697", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068897685692" + }, + + "DifficultyTest659" : { + "parentTimestamp" : "1209283444", + "parentDifficulty" : "611418504", + "currentTimestamp" : "1209283448", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138061279160" + }, + + "DifficultyTest660" : { + "parentTimestamp" : "1244467591", + "parentDifficulty" : "1994511975", + "currentTimestamp" : "1244467595", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276894610081" + }, + + "DifficultyTest661" : { + "parentTimestamp" : "1203324858", + "parentDifficulty" : "2049973482", + "currentTimestamp" : "1203324862", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551849222893" + }, + + "DifficultyTest662" : { + "parentTimestamp" : "1352568058", + "parentDifficulty" : "1467926282", + "currentTimestamp" : "1352568062", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551266891490" + }, + + "DifficultyTest666" : { + "parentTimestamp" : "1462785776", + "parentDifficulty" : "457133580", + "currentTimestamp" : "1462785780", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084398843344373" + }, + + "DifficultyTest672" : { + "parentTimestamp" : "543271243", + "parentDifficulty" : "403226232", + "currentTimestamp" : "543271248", + "currentBlockNumber" : "75001", + "currentDifficulty" : "403423119" + }, + + "DifficultyTest677" : { + "parentTimestamp" : "959131219", + "parentDifficulty" : "944661851", + "currentTimestamp" : "959131224", + "currentBlockNumber" : "450001", + "currentDifficulty" : "945123115" + }, + + "DifficultyTest678" : { + "parentTimestamp" : "1043652891", + "parentDifficulty" : "1211615500", + "currentTimestamp" : "1043652896", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1212207117" + }, + + "DifficultyTest679" : { + "parentTimestamp" : "153831867", + "parentDifficulty" : "1641860032", + "currentTimestamp" : "153831872", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1642661737" + }, + + "DifficultyTest681" : { + "parentTimestamp" : "144349053", + "parentDifficulty" : "1831188162", + "currentTimestamp" : "144349058", + "currentBlockNumber" : "750001", + "currentDifficulty" : "1832082328" + }, + + "DifficultyTest682" : { + "parentTimestamp" : "39258619", + "parentDifficulty" : "264670484", + "currentTimestamp" : "39258624", + "currentBlockNumber" : "825001", + "currentDifficulty" : "264799781" + }, + + "DifficultyTest683" : { + "parentTimestamp" : "1860141118", + "parentDifficulty" : "1263703815", + "currentTimestamp" : "1860141123", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1264320985" + }, + + "DifficultyTest684" : { + "parentTimestamp" : "1106606491", + "parentDifficulty" : "1883688768", + "currentTimestamp" : "1106606496", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1884608665" + }, + + "DifficultyTest688" : { + "parentTimestamp" : "2042507646", + "parentDifficulty" : "792527547", + "currentTimestamp" : "2042507651", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "792915547" + }, + + "DifficultyTest689" : { + "parentTimestamp" : "1328309006", + "parentDifficulty" : "854870209", + "currentTimestamp" : "1328309011", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "855289674" + }, + + "DifficultyTest690" : { + "parentTimestamp" : "781456799", + "parentDifficulty" : "1914477270", + "currentTimestamp" : "781456804", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1915416169" + }, + + "DifficultyTest693" : { + "parentTimestamp" : "1272986981", + "parentDifficulty" : "1875679164", + "currentTimestamp" : "1272986986", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1876611406" + }, + + "DifficultyTest695" : { + "parentTimestamp" : "182642367", + "parentDifficulty" : "1554148680", + "currentTimestamp" : "182642372", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1554973077" + }, + + "DifficultyTest696" : { + "parentTimestamp" : "857405729", + "parentDifficulty" : "931769376", + "currentTimestamp" : "857405734", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "932289877" + }, + + "DifficultyTest699" : { + "parentTimestamp" : "159456995", + "parentDifficulty" : "135982785", + "currentTimestamp" : "159457000", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "136573470" + }, + + "DifficultyTest703" : { + "parentTimestamp" : "1635377729", + "parentDifficulty" : "922500352", + "currentTimestamp" : "1635377734", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "927145095" + }, + + "DifficultyTest706" : { + "parentTimestamp" : "467548237", + "parentDifficulty" : "519317886", + "currentTimestamp" : "467548242", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "536348675" + }, + + "DifficultyTest708" : { + "parentTimestamp" : "2005433760", + "parentDifficulty" : "110398369", + "currentTimestamp" : "2005433765", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "144006706" + }, + + "DifficultyTest709" : { + "parentTimestamp" : "237005997", + "parentDifficulty" : "1284118779", + "currentTimestamp" : "237006002", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1351854654" + }, + + "DifficultyTest710" : { + "parentTimestamp" : "1602165533", + "parentDifficulty" : "1127782916", + "currentTimestamp" : "1602165538", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "1262551319" + }, + + "DifficultyTest711" : { + "parentTimestamp" : "1154357883", + "parentDifficulty" : "58910162", + "currentTimestamp" : "1154357888", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "327374382" + }, + + "DifficultyTest712" : { + "parentTimestamp" : "187630342", + "parentDifficulty" : "1304611468", + "currentTimestamp" : "187630347", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "1573683941" + }, + + "DifficultyTest713" : { + "parentTimestamp" : "163949526", + "parentDifficulty" : "1541103412", + "currentTimestamp" : "163949531", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "2078726815" + }, + + "DifficultyTest715" : { + "parentTimestamp" : "1306495402", + "parentDifficulty" : "1684156456", + "currentTimestamp" : "1306495407", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "3832462446" + }, + + "DifficultyTest717" : { + "parentTimestamp" : "819543329", + "parentDifficulty" : "278790262", + "currentTimestamp" : "819543334", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4573893686" + }, + + "DifficultyTest719" : { + "parentTimestamp" : "779508615", + "parentDifficulty" : "1528654626", + "currentTimestamp" : "779508620", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "18709270223" + }, + + "DifficultyTest721" : { + "parentTimestamp" : "932764834", + "parentDifficulty" : "495720361", + "currentTimestamp" : "932764839", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "34855700779" + }, + + "DifficultyTest722" : { + "parentTimestamp" : "1251845007", + "parentDifficulty" : "1829527840", + "currentTimestamp" : "1251845012", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70549897900" + }, + + "DifficultyTest726" : { + "parentTimestamp" : "573084496", + "parentDifficulty" : "1204904450", + "currentTimestamp" : "573084501", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550961306670" + }, + + "DifficultyTest727" : { + "parentTimestamp" : "687818543", + "parentDifficulty" : "1727391766", + "currentTimestamp" : "687818548", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1101239862995" + }, + + "DifficultyTest730" : { + "parentTimestamp" : "177192490", + "parentDifficulty" : "1163322231", + "currentTimestamp" : "177192495", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399210401363" + }, + + "DifficultyTest733" : { + "parentTimestamp" : "116196402", + "parentDifficulty" : "1799587092", + "currentTimestamp" : "116196407", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17593986510212" + }, + + "DifficultyTest736" : { + "parentTimestamp" : "1875725938", + "parentDifficulty" : "70060250", + "currentTimestamp" : "1875725943", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70368814272123" + }, + + "DifficultyTest737" : { + "parentTimestamp" : "561471163", + "parentDifficulty" : "1747883244", + "currentTimestamp" : "561471168", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140739237092030" + }, + + "DifficultyTest738" : { + "parentTimestamp" : "1186225979", + "parentDifficulty" : "1312391514", + "currentTimestamp" : "1186225984", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281476289742986" + }, + + "DifficultyTest739" : { + "parentTimestamp" : "760213599", + "parentDifficulty" : "648158607", + "currentTimestamp" : "760213604", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562950601896402" + }, + + "DifficultyTest740" : { + "parentTimestamp" : "1177566101", + "parentDifficulty" : "552170108", + "currentTimestamp" : "1177566106", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950505861034" + }, + + "DifficultyTest741" : { + "parentTimestamp" : "1132524684", + "parentDifficulty" : "429168932", + "currentTimestamp" : "1132524689", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900336221111" + }, + + "DifficultyTest742" : { + "parentTimestamp" : "825319686", + "parentDifficulty" : "2037717758", + "currentTimestamp" : "825319691", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251801852397985" + }, + + "DifficultyTest743" : { + "parentTimestamp" : "929301809", + "parentDifficulty" : "1772836608", + "currentTimestamp" : "929301814", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601401072746" + }, + + "DifficultyTest744" : { + "parentTimestamp" : "173913241", + "parentDifficulty" : "738837729", + "currentTimestamp" : "173913246", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600366568985" + }, + + "DifficultyTest745" : { + "parentTimestamp" : "327855388", + "parentDifficulty" : "1584866650", + "currentTimestamp" : "327855393", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007200840381502" + }, + + "DifficultyTest747" : { + "parentTimestamp" : "21112284", + "parentDifficulty" : "980000353", + "currentTimestamp" : "21112289", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028797999442836" + }, + + "DifficultyTest750" : { + "parentTimestamp" : "1839575307", + "parentDifficulty" : "600749604", + "currentTimestamp" : "1839575312", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115188676898810" + }, + + "DifficultyTest752" : { + "parentTimestamp" : "731301973", + "parentDifficulty" : "1558492396", + "currentTimestamp" : "731301978", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377710965122" + }, + + "DifficultyTest753" : { + "parentTimestamp" : "250078284", + "parentDifficulty" : "2131497456", + "currentTimestamp" : "250078289", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460754435961714" + }, + + "DifficultyTest755" : { + "parentTimestamp" : "1863987421", + "parentDifficulty" : "1271017908", + "currentTimestamp" : "1863987426", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010485332474" + }, + + "DifficultyTest756" : { + "parentTimestamp" : "1519722630", + "parentDifficulty" : "452582743", + "currentTimestamp" : "1519722635", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843009666497682" + }, + + "DifficultyTest759" : { + "parentTimestamp" : "179646175", + "parentDifficulty" : "1301319520", + "currentTimestamp" : "179646180", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075011506545" + }, + + "DifficultyTest760" : { + "parentTimestamp" : "483066932", + "parentDifficulty" : "1147804324", + "currentTimestamp" : "483066937", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074857916391" + }, + + "DifficultyTest764" : { + "parentTimestamp" : "1309502773", + "parentDifficulty" : "1789067767", + "currentTimestamp" : "1309502778", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952591466354263" + }, + + "DifficultyTest766" : { + "parentTimestamp" : "598916701", + "parentDifficulty" : "895129611", + "currentTimestamp" : "598916706", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810359601218398" + }, + + "DifficultyTest768" : { + "parentTimestamp" : "1026636112", + "parentDifficulty" : "337639216", + "currentTimestamp" : "1026636117", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717749107502" + }, + + "DifficultyTest769" : { + "parentTimestamp" : "1803670505", + "parentDifficulty" : "1983607792", + "currentTimestamp" : "1803670510", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436807183198" + }, + + "DifficultyTest770" : { + "parentTimestamp" : "2133632301", + "parentDifficulty" : "633593988", + "currentTimestamp" : "2133632306", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482870279117056" + }, + + "DifficultyTest772" : { + "parentTimestamp" : "498915411", + "parentDifficulty" : "1127084914", + "currentTimestamp" : "498915416", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965740418062640" + }, + + "DifficultyTest773" : { + "parentTimestamp" : "606750787", + "parentDifficulty" : "1300027424", + "currentTimestamp" : "606750792", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931479881516987" + }, + + "DifficultyTest775" : { + "parentTimestamp" : "2052115333", + "parentDifficulty" : "1352719190", + "currentTimestamp" : "2052115338", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915676798833" + }, + + "DifficultyTest778" : { + "parentTimestamp" : "1727521513", + "parentDifficulty" : "1216726215", + "currentTimestamp" : "1727521518", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658510996863" + }, + + "DifficultyTest786" : { + "parentTimestamp" : "1557707226", + "parentDifficulty" : "428542648", + "currentTimestamp" : "1557707231", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834067224050713" + }, + + "DifficultyTest789" : { + "parentTimestamp" : "1019994548", + "parentDifficulty" : "731387426", + "currentTimestamp" : "1019994553", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336267912939812" + }, + + "DifficultyTest795" : { + "parentTimestamp" : "178701409", + "parentDifficulty" : "1304757657", + "currentTimestamp" : "178701414", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551103643193" + }, + + "DifficultyTest798" : { + "parentTimestamp" : "2056757908", + "parentDifficulty" : "2050165886", + "currentTimestamp" : "2056757913", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042201244160735" + }, + + "DifficultyTest799" : { + "parentTimestamp" : "1566291561", + "parentDifficulty" : "514062288", + "currentTimestamp" : "1566291566", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398900300878" + }, + + "DifficultyTest800" : { + "parentTimestamp" : "1680161064", + "parentDifficulty" : "204369288", + "currentTimestamp" : "1680161069", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084398590456661" + }, + + "DifficultyTest801" : { + "parentTimestamp" : "958732016", + "parentDifficulty" : "383572594", + "currentTimestamp" : "958732021", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797155735053" + }, + + "DifficultyTest805" : { + "parentTimestamp" : "1233248727", + "parentDifficulty" : "1239699257", + "currentTimestamp" : "1233248733", + "currentBlockNumber" : "1", + "currentDifficulty" : "1240304578" + }, + + "DifficultyTest806" : { + "parentTimestamp" : "814507784", + "parentDifficulty" : "1258896067", + "currentTimestamp" : "814507790", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1259510762" + }, + + "DifficultyTest807" : { + "parentTimestamp" : "402356930", + "parentDifficulty" : "891315520", + "currentTimestamp" : "402356936", + "currentBlockNumber" : "150001", + "currentDifficulty" : "891750732" + }, + + "DifficultyTest808" : { + "parentTimestamp" : "1206902987", + "parentDifficulty" : "405807204", + "currentTimestamp" : "1206902993", + "currentBlockNumber" : "225001", + "currentDifficulty" : "406005353" + }, + + "DifficultyTest813" : { + "parentTimestamp" : "1164201804", + "parentDifficulty" : "1966252092", + "currentTimestamp" : "1164201810", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1967212192" + }, + + "DifficultyTest817" : { + "parentTimestamp" : "1082110081", + "parentDifficulty" : "1717029612", + "currentTimestamp" : "1082110087", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1717868133" + }, + + "DifficultyTest820" : { + "parentTimestamp" : "1044142408", + "parentDifficulty" : "388262534", + "currentTimestamp" : "1044142414", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "388452627" + }, + + "DifficultyTest824" : { + "parentTimestamp" : "1044932425", + "parentDifficulty" : "864227399", + "currentTimestamp" : "1044932431", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "864653481" + }, + + "DifficultyTest827" : { + "parentTimestamp" : "621121231", + "parentDifficulty" : "1240561780", + "currentTimestamp" : "621121237", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1241183907" + }, + + "DifficultyTest831" : { + "parentTimestamp" : "138413657", + "parentDifficulty" : "865190007", + "currentTimestamp" : "138413663", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "865743535" + }, + + "DifficultyTest834" : { + "parentTimestamp" : "1373329580", + "parentDifficulty" : "1344210216", + "currentTimestamp" : "1373329586", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "1345390856" + }, + + "DifficultyTest835" : { + "parentTimestamp" : "743767471", + "parentDifficulty" : "1080414024", + "currentTimestamp" : "743767477", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "1081990145" + }, + + "DifficultyTest838" : { + "parentTimestamp" : "2130277751", + "parentDifficulty" : "264140624", + "currentTimestamp" : "2130277757", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "268463902" + }, + + "DifficultyTest840" : { + "parentTimestamp" : "1691293044", + "parentDifficulty" : "637216681", + "currentTimestamp" : "1691293050", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "654305037" + }, + + "DifficultyTest841" : { + "parentTimestamp" : "544442134", + "parentDifficulty" : "1667498892", + "currentTimestamp" : "544442140", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "1701867532" + }, + + "DifficultyTest843" : { + "parentTimestamp" : "750040926", + "parentDifficulty" : "1520593787", + "currentTimestamp" : "750040932", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1588445128" + }, + + "DifficultyTest845" : { + "parentTimestamp" : "1040620881", + "parentDifficulty" : "1262888589", + "currentTimestamp" : "1040620887", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "1531940689" + }, + + "DifficultyTest849" : { + "parentTimestamp" : "1193208362", + "parentDifficulty" : "602542904", + "currentTimestamp" : "1193208368", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "2750320762" + }, + + "DifficultyTest850" : { + "parentTimestamp" : "1460783733", + "parentDifficulty" : "314770433", + "currentTimestamp" : "1460783739", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "2462407777" + }, + + "DifficultyTest851" : { + "parentTimestamp" : "1281922823", + "parentDifficulty" : "95017196", + "currentTimestamp" : "1281922829", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4390030887" + }, + + "DifficultyTest852" : { + "parentTimestamp" : "1677536672", + "parentDifficulty" : "619930976", + "currentTimestamp" : "1677536678", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9210168268" + }, + + "DifficultyTest853" : { + "parentTimestamp" : "1949846834", + "parentDifficulty" : "1565502128", + "currentTimestamp" : "1949846840", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "18746135717" + }, + + "DifficultyTest854" : { + "parentTimestamp" : "1076539191", + "parentDifficulty" : "554013337", + "currentTimestamp" : "1076539197", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "17734153035" + }, + + "DifficultyTest856" : { + "parentTimestamp" : "2031000326", + "parentDifficulty" : "1088091741", + "currentTimestamp" : "2031000332", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69808099771" + }, + + "DifficultyTest859" : { + "parentTimestamp" : "890266262", + "parentDifficulty" : "189993372", + "currentTimestamp" : "890266268", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275067993086" + }, + + "DifficultyTest860" : { + "parentTimestamp" : "163111279", + "parentDifficulty" : "476930688", + "currentTimestamp" : "163111285", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550232977452" + }, + + "DifficultyTest861" : { + "parentTimestamp" : "1124241706", + "parentDifficulty" : "701924034", + "currentTimestamp" : "1124241712", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1100213894546" + }, + + "DifficultyTest862" : { + "parentTimestamp" : "619554754", + "parentDifficulty" : "1142659608", + "currentTimestamp" : "619554760", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1100654845323" + }, + + "DifficultyTest866" : { + "parentTimestamp" : "1014539466", + "parentDifficulty" : "1334342213", + "currentTimestamp" : "1014539472", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797428015955" + }, + + "DifficultyTest869" : { + "parentTimestamp" : "1680308757", + "parentDifficulty" : "1264329968", + "currentTimestamp" : "1680308763", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370009124980" + }, + + "DifficultyTest870" : { + "parentTimestamp" : "1180439471", + "parentDifficulty" : "645376659", + "currentTimestamp" : "1180439477", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369389869448" + }, + + "DifficultyTest872" : { + "parentTimestamp" : "487079632", + "parentDifficulty" : "841971319", + "currentTimestamp" : "487079638", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475819093093" + }, + + "DifficultyTest876" : { + "parentTimestamp" : "929428653", + "parentDifficulty" : "1524804353", + "currentTimestamp" : "929428659", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251801339234134" + }, + + "DifficultyTest880" : { + "parentTimestamp" : "1991645973", + "parentDifficulty" : "365300992", + "currentTimestamp" : "1991645979", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014398874961345" + }, + + "DifficultyTest881" : { + "parentTimestamp" : "618589478", + "parentDifficulty" : "1974144562", + "currentTimestamp" : "618589484", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798994072467" + }, + + "DifficultyTest884" : { + "parentTimestamp" : "1036330810", + "parentDifficulty" : "1263306379", + "currentTimestamp" : "1036330816", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115189339779099" + }, + + "DifficultyTest885" : { + "parentTimestamp" : "2015481884", + "parentDifficulty" : "1677379576", + "currentTimestamp" : "2015481890", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377829910352" + }, + + "DifficultyTest887" : { + "parentTimestamp" : "1415577845", + "parentDifficulty" : "1248658467", + "currentTimestamp" : "1415577851", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753552691651" + }, + + "DifficultyTest888" : { + "parentTimestamp" : "1003871110", + "parentDifficulty" : "1110385425", + "currentTimestamp" : "1003871116", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921505717774581" + }, + + "DifficultyTest889" : { + "parentTimestamp" : "416161472", + "parentDifficulty" : "1807663190", + "currentTimestamp" : "416161478", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843011022239790" + }, + + "DifficultyTest891" : { + "parentTimestamp" : "2075425432", + "parentDifficulty" : "83187145", + "currentTimestamp" : "2075425438", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686018510615667" + }, + + "DifficultyTest893" : { + "parentTimestamp" : "40861600", + "parentDifficulty" : "1584423680", + "currentTimestamp" : "40861606", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075294748940" + }, + + "DifficultyTest895" : { + "parentTimestamp" : "1517798666", + "parentDifficulty" : "1584645553", + "currentTimestamp" : "1517798672", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488149004522537" + }, + + "DifficultyTest901" : { + "parentTimestamp" : "1554850976", + "parentDifficulty" : "524585968", + "currentTimestamp" : "1554850982", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620717936145537" + }, + + "DifficultyTest906" : { + "parentTimestamp" : "1411509655", + "parentDifficulty" : "1631811816", + "currentTimestamp" : "1411509661", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965740923035991" + }, + + "DifficultyTest908" : { + "parentTimestamp" : "1938703713", + "parentDifficulty" : "58533596", + "currentTimestamp" : "1938703719", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957220271744" + }, + + "DifficultyTest910" : { + "parentTimestamp" : "568509815", + "parentDifficulty" : "119276506", + "currentTimestamp" : "568509821", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725914442753882" + }, + + "DifficultyTest911" : { + "parentTimestamp" : "818222375", + "parentDifficulty" : "1340695992", + "currentTimestamp" : "818222381", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451829988188900" + }, + + "DifficultyTest912" : { + "parentTimestamp" : "1883424754", + "parentDifficulty" : "776597168", + "currentTimestamp" : "1883424760", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658070652909" + }, + + "DifficultyTest913" : { + "parentTimestamp" : "227569711", + "parentDifficulty" : "1688136864", + "currentTimestamp" : "227569717", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807316276314237" + }, + + "DifficultyTest915" : { + "parentTimestamp" : "1530281999", + "parentDifficulty" : "820188254", + "currentTimestamp" : "1530282005", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629995294912" + }, + + "DifficultyTest918" : { + "parentTimestamp" : "829134096", + "parentDifficulty" : "1797248415", + "currentTimestamp" : "829134102", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458518496950681" + }, + + "DifficultyTest920" : { + "parentTimestamp" : "170798852", + "parentDifficulty" : "669398286", + "currentTimestamp" : "170798858", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834067465023956" + }, + + "DifficultyTest923" : { + "parentTimestamp" : "647541463", + "parentDifficulty" : "1410465388", + "currentTimestamp" : "647541469", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336268592349355" + }, + + "DifficultyTest924" : { + "parentTimestamp" : "693453006", + "parentDifficulty" : "91497397", + "currentTimestamp" : "693453012", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672534453932601" + }, + + "DifficultyTest929" : { + "parentTimestamp" : "861267534", + "parentDifficulty" : "568286863", + "currentTimestamp" : "861267540", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550366812794" + }, + + "DifficultyTest931" : { + "parentTimestamp" : "625017647", + "parentDifficulty" : "2060676382", + "currentTimestamp" : "625017653", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101658179467" + }, + + "DifficultyTest932" : { + "parentTimestamp" : "891119861", + "parentDifficulty" : "1671093578", + "currentTimestamp" : "891119867", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200864903333" + }, + + "DifficultyTest933" : { + "parentTimestamp" : "1044212417", + "parentDifficulty" : "128645802", + "currentTimestamp" : "1044212423", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398514696201" + }, + + "DifficultyTest935" : { + "parentTimestamp" : "206244320", + "parentDifficulty" : "2066814094", + "currentTimestamp" : "206244326", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798839798448" + }, + + "DifficultyTest937" : { + "parentTimestamp" : "1876043211", + "parentDifficulty" : "2104982002", + "currentTimestamp" : "1876043217", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675189193910497" + }, + + "DifficultyTest941" : { + "parentTimestamp" : "1407735712", + "parentDifficulty" : "1695610871", + "currentTimestamp" : "1407735719", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1696438805" + }, + + "DifficultyTest942" : { + "parentTimestamp" : "239203093", + "parentDifficulty" : "137168190", + "currentTimestamp" : "239203100", + "currentBlockNumber" : "225001", + "currentDifficulty" : "137235167" + }, + + "DifficultyTest944" : { + "parentTimestamp" : "1653918572", + "parentDifficulty" : "1344579487", + "currentTimestamp" : "1653918579", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1345236021" + }, + + "DifficultyTest946" : { + "parentTimestamp" : "1031104526", + "parentDifficulty" : "2035936350", + "currentTimestamp" : "1031104533", + "currentBlockNumber" : "525001", + "currentDifficulty" : "2036930467" + }, + + "DifficultyTest947" : { + "parentTimestamp" : "1599321985", + "parentDifficulty" : "777554940", + "currentTimestamp" : "1599321992", + "currentBlockNumber" : "600001", + "currentDifficulty" : "777934621" + }, + + "DifficultyTest949" : { + "parentTimestamp" : "1699602962", + "parentDifficulty" : "392240128", + "currentTimestamp" : "1699602969", + "currentBlockNumber" : "750001", + "currentDifficulty" : "392431683" + }, + + "DifficultyTest950" : { + "parentTimestamp" : "1773271186", + "parentDifficulty" : "808494146", + "currentTimestamp" : "1773271193", + "currentBlockNumber" : "825001", + "currentDifficulty" : "808888982" + }, + + "DifficultyTest951" : { + "parentTimestamp" : "1966323372", + "parentDifficulty" : "1902798838", + "currentTimestamp" : "1966323379", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1903728066" + }, + + "DifficultyTest954" : { + "parentTimestamp" : "987218566", + "parentDifficulty" : "2042042136", + "currentTimestamp" : "987218573", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "2043039738" + }, + + "DifficultyTest956" : { + "parentTimestamp" : "1377530287", + "parentDifficulty" : "1617855071", + "currentTimestamp" : "1377530294", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "1618646063" + }, + + "DifficultyTest958" : { + "parentTimestamp" : "518175458", + "parentDifficulty" : "1870213234", + "currentTimestamp" : "518175465", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1871130520" + }, + + "DifficultyTest959" : { + "parentTimestamp" : "1792292106", + "parentDifficulty" : "644260892", + "currentTimestamp" : "1792292113", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "644583664" + }, + + "DifficultyTest961" : { + "parentTimestamp" : "1591540937", + "parentDifficulty" : "217022791", + "currentTimestamp" : "1591540944", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "217145143" + }, + + "DifficultyTest962" : { + "parentTimestamp" : "1524484721", + "parentDifficulty" : "750879396", + "currentTimestamp" : "1524484728", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "751278804" + }, + + "DifficultyTest964" : { + "parentTimestamp" : "1537554197", + "parentDifficulty" : "402053780", + "currentTimestamp" : "1537554204", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "402315631" + }, + + "DifficultyTest965" : { + "parentTimestamp" : "1295179289", + "parentDifficulty" : "527532166", + "currentTimestamp" : "1295179296", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "527920822" + }, + + "DifficultyTest966" : { + "parentTimestamp" : "931738777", + "parentDifficulty" : "2093096378", + "currentTimestamp" : "931738784", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "2094380541" + }, + + "DifficultyTest968" : { + "parentTimestamp" : "1402712836", + "parentDifficulty" : "394026494", + "currentTimestamp" : "1402712843", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "394743177" + }, + + "DifficultyTest969" : { + "parentTimestamp" : "408954090", + "parentDifficulty" : "797900220", + "currentTimestamp" : "408954097", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "799338395" + }, + + "DifficultyTest972" : { + "parentTimestamp" : "1954843292", + "parentDifficulty" : "1882645609", + "currentTimestamp" : "1954843299", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1887759173" + }, + + "DifficultyTest973" : { + "parentTimestamp" : "865430241", + "parentDifficulty" : "1906799408", + "currentTimestamp" : "865430248", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1916119070" + }, + + "DifficultyTest977" : { + "parentTimestamp" : "1527999671", + "parentDifficulty" : "878683282", + "currentTimestamp" : "1527999678", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "946221190" + }, + + "DifficultyTest978" : { + "parentTimestamp" : "1545590679", + "parentDifficulty" : "1645026496", + "currentTimestamp" : "1545590686", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "1780047459" + }, + + "DifficultyTest980" : { + "parentTimestamp" : "687881620", + "parentDifficulty" : "1122540864", + "currentTimestamp" : "687881627", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "1391524435" + }, + + "DifficultyTest982" : { + "parentTimestamp" : "1542520248", + "parentDifficulty" : "1962850950", + "currentTimestamp" : "1542520255", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "3037551197" + }, + + "DifficultyTest983" : { + "parentTimestamp" : "1028799829", + "parentDifficulty" : "1279818391", + "currentTimestamp" : "1028799836", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "3427926950" + }, + + "DifficultyTest985" : { + "parentTimestamp" : "640006741", + "parentDifficulty" : "1980055803", + "currentTimestamp" : "640006748", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "6275989923" + }, + + "DifficultyTest986" : { + "parentTimestamp" : "262660442", + "parentDifficulty" : "949937944", + "currentTimestamp" : "262660449", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9540336372" + }, + + "DifficultyTest989" : { + "parentTimestamp" : "190782124", + "parentDifficulty" : "1339487390", + "currentTimestamp" : "190782131", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35699879804" + }, + + "DifficultyTest990" : { + "parentTimestamp" : "2080559452", + "parentDifficulty" : "1329013736", + "currentTimestamp" : "2080559459", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70049139404" + }, + + "DifficultyTest994" : { + "parentTimestamp" : "1978994139", + "parentDifficulty" : "388552536", + "currentTimestamp" : "1978994146", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550144556146" + }, + + "DifficultyTest998" : { + "parentTimestamp" : "221730458", + "parentDifficulty" : "745597530", + "currentTimestamp" : "221730465", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4398792472695" + }, + + "DifficultyTest999" : { + "parentTimestamp" : "1874044890", + "parentDifficulty" : "1238404192", + "currentTimestamp" : "1874044897", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797332031089" + }, + + "DifficultyTest1000" : { + "parentTimestamp" : "1710209670", + "parentDifficulty" : "1411733215", + "currentTimestamp" : "1710209677", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797505444745" + }, + + "DifficultyTest1001" : { + "parentTimestamp" : "1230500675", + "parentDifficulty" : "1776905824", + "currentTimestamp" : "1230500682", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17593963817869" + }, + + "DifficultyTest1003" : { + "parentTimestamp" : "2014516303", + "parentDifficulty" : "1597947006", + "currentTimestamp" : "2014516310", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370342904917" + }, + + "DifficultyTest1004" : { + "parentTimestamp" : "239111090", + "parentDifficulty" : "509340221", + "currentTimestamp" : "239111097", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369253766586" + }, + + "DifficultyTest1005" : { + "parentTimestamp" : "1869758234", + "parentDifficulty" : "1855752075", + "currentTimestamp" : "1869758241", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140739345013531" + }, + + "DifficultyTest1008" : { + "parentTimestamp" : "179182852", + "parentDifficulty" : "1953199513", + "currentTimestamp" : "179182859", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951907574535" + }, + + "DifficultyTest1010" : { + "parentTimestamp" : "2142206389", + "parentDifficulty" : "1076581493", + "currentTimestamp" : "2142206396", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800890792415" + }, + + "DifficultyTest1012" : { + "parentTimestamp" : "401306556", + "parentDifficulty" : "789345270", + "currentTimestamp" : "401306563", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600417101188" + }, + + "DifficultyTest1015" : { + "parentTimestamp" : "1847825343", + "parentDifficulty" : "1042279486", + "currentTimestamp" : "1847825350", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798061752379" + }, + + "DifficultyTest1016" : { + "parentTimestamp" : "164908672", + "parentDifficulty" : "867009798", + "currentTimestamp" : "164908679", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797886397110" + }, + + "DifficultyTest1018" : { + "parentTimestamp" : "1845734270", + "parentDifficulty" : "191361859", + "currentTimestamp" : "1845734277", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115188267311169" + }, + + "DifficultyTest1019" : { + "parentTimestamp" : "1964853569", + "parentDifficulty" : "1575627536", + "currentTimestamp" : "1964853576", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377728108629" + }, + + "DifficultyTest1022" : { + "parentTimestamp" : "1329761998", + "parentDifficulty" : "1150494168", + "currentTimestamp" : "1329762005", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921505757902908" + }, + + "DifficultyTest1027" : { + "parentTimestamp" : "759678507", + "parentDifficulty" : "163357780", + "currentTimestamp" : "759678514", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744073872989160" + }, + + "DifficultyTest1029" : { + "parentTimestamp" : "1081001736", + "parentDifficulty" : "1066267217", + "currentTimestamp" : "1081001743", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148485891087" + }, + + "DifficultyTest1030" : { + "parentTimestamp" : "1773568327", + "parentDifficulty" : "1067851678", + "currentTimestamp" : "1773568334", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976295906579553" + }, + + "DifficultyTest1031" : { + "parentTimestamp" : "681115536", + "parentDifficulty" : "1826194720", + "currentTimestamp" : "681115543", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952591503499344" + }, + + "DifficultyTest1033" : { + "parentTimestamp" : "274726594", + "parentDifficulty" : "76025270", + "currentTimestamp" : "274726601", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179428888247" + }, + + "DifficultyTest1034" : { + "parentTimestamp" : "1344690493", + "parentDifficulty" : "1855715151", + "currentTimestamp" : "1344690500", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810360562272973" + }, + + "DifficultyTest1037" : { + "parentTimestamp" : "1483930347", + "parentDifficulty" : "2086706597", + "currentTimestamp" : "1483930354", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436910332344" + }, + + "DifficultyTest1039" : { + "parentTimestamp" : "815576102", + "parentDifficulty" : "238178380", + "currentTimestamp" : "815576109", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965739528722070" + }, + + "DifficultyTest1040" : { + "parentTimestamp" : "574906684", + "parentDifficulty" : "1494774794", + "currentTimestamp" : "574906691", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965740785932056" + }, + + "DifficultyTest1041" : { + "parentTimestamp" : "595755134", + "parentDifficulty" : "1723840150", + "currentTimestamp" : "595755141", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480305536652" + }, + + "DifficultyTest1042" : { + "parentTimestamp" : "1037339416", + "parentDifficulty" : "1495415070", + "currentTimestamp" : "1037339423", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958657854821" + }, + + "DifficultyTest1048" : { + "parentTimestamp" : "341074061", + "parentDifficulty" : "599671428", + "currentTimestamp" : "341074068", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807315187317324" + }, + + "DifficultyTest1050" : { + "parentTimestamp" : "1675799658", + "parentDifficulty" : "214416169", + "currentTimestamp" : "1675799665", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229258563933216" + }, + + "DifficultyTest1051" : { + "parentTimestamp" : "1171096135", + "parentDifficulty" : "1129629780", + "currentTimestamp" : "1171096142", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458517829006061" + }, + + "DifficultyTest1052" : { + "parentTimestamp" : "1314793862", + "parentDifficulty" : "2001669078", + "currentTimestamp" : "1314793869", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458518701471159" + }, + + "DifficultyTest1054" : { + "parentTimestamp" : "883395647", + "parentDifficulty" : "1826606196", + "currentTimestamp" : "883395654", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068622796909" + }, + + "DifficultyTest1055" : { + "parentTimestamp" : "1325121218", + "parentDifficulty" : "1988990467", + "currentTimestamp" : "1325121225", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135580559285" + }, + + "DifficultyTest1057" : { + "parentTimestamp" : "1075524269", + "parentDifficulty" : "1445654522", + "currentTimestamp" : "1075524276", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336268627555671" + }, + + "DifficultyTest1060" : { + "parentTimestamp" : "2096520921", + "parentDifficulty" : "2135936328", + "currentTimestamp" : "2096520928", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345070861760321" + }, + + "DifficultyTest1061" : { + "parentTimestamp" : "1698172168", + "parentDifficulty" : "690352594", + "currentTimestamp" : "1698172175", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138140251792" + }, + + "DifficultyTest1062" : { + "parentTimestamp" : "1864729534", + "parentDifficulty" : "963690440", + "currentTimestamp" : "1864729541", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380275863285215" + }, + + "DifficultyTest1063" : { + "parentTimestamp" : "1124325517", + "parentDifficulty" : "1104164749", + "currentTimestamp" : "1124325524", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550902952339" + }, + + "DifficultyTest1065" : { + "parentTimestamp" : "811621051", + "parentDifficulty" : "649074678", + "currentTimestamp" : "811621058", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521100245888504" + }, + + "DifficultyTest1069" : { + "parentTimestamp" : "1636528048", + "parentDifficulty" : "268397074", + "currentTimestamp" : "1636528055", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797040503295" + }, + + "DifficultyTest1070" : { + "parentTimestamp" : "1687514725", + "parentDifficulty" : "1410565833", + "currentTimestamp" : "1687514732", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594955204921" + }, + + "DifficultyTest1071" : { + "parentTimestamp" : "1149929080", + "parentDifficulty" : "442731040", + "currentTimestamp" : "1149929087", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675187530847889" + }, + + "DifficultyTest1072" : { + "parentTimestamp" : "724441342", + "parentDifficulty" : "1409163103", + "currentTimestamp" : "724441349", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188497751842" + }, + + "DifficultyTest1073" : { + "parentTimestamp" : "1667335872", + "parentDifficulty" : "153453292", + "currentTimestamp" : "1667335880", + "currentBlockNumber" : "1", + "currentDifficulty" : "153528220" + }, + + "DifficultyTest1076" : { + "parentTimestamp" : "1016333024", + "parentDifficulty" : "2030417544", + "currentTimestamp" : "1016333032", + "currentBlockNumber" : "225001", + "currentDifficulty" : "2031408959" + }, + + "DifficultyTest1077" : { + "parentTimestamp" : "11431880", + "parentDifficulty" : "253755640", + "currentTimestamp" : "11431888", + "currentBlockNumber" : "300001", + "currentDifficulty" : "253879546" + }, + + "DifficultyTest1080" : { + "parentTimestamp" : "2079193804", + "parentDifficulty" : "931331225", + "currentTimestamp" : "2079193812", + "currentBlockNumber" : "525001", + "currentDifficulty" : "931785984" + }, + + "DifficultyTest1083" : { + "parentTimestamp" : "716690879", + "parentDifficulty" : "1429337368", + "currentTimestamp" : "716690887", + "currentBlockNumber" : "750001", + "currentDifficulty" : "1430035318" + }, + + "DifficultyTest1085" : { + "parentTimestamp" : "596547977", + "parentDifficulty" : "190773057", + "currentTimestamp" : "596547985", + "currentBlockNumber" : "900001", + "currentDifficulty" : "190866335" + }, + + "DifficultyTest1086" : { + "parentTimestamp" : "1417705041", + "parentDifficulty" : "1751740588", + "currentTimestamp" : "1417705049", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1752596058" + }, + + "DifficultyTest1088" : { + "parentTimestamp" : "62972816", + "parentDifficulty" : "1488066388", + "currentTimestamp" : "62972824", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1488793494" + }, + + "DifficultyTest1091" : { + "parentTimestamp" : "282257316", + "parentDifficulty" : "1052536188", + "currentTimestamp" : "282257324", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "1053052169" + }, + + "DifficultyTest1095" : { + "parentTimestamp" : "1905911374", + "parentDifficulty" : "1152080475", + "currentTimestamp" : "1905911382", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1152659398" + }, + + "DifficultyTest1096" : { + "parentTimestamp" : "1933082905", + "parentDifficulty" : "2055771076", + "currentTimestamp" : "1933082913", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "2056807638" + }, + + "DifficultyTest1099" : { + "parentTimestamp" : "1886002687", + "parentDifficulty" : "134757660", + "currentTimestamp" : "1886002695", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "134954531" + }, + + "DifficultyTest1100" : { + "parentTimestamp" : "736004445", + "parentDifficulty" : "658156293", + "currentTimestamp" : "736004453", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "658739802" + }, + + "DifficultyTest1101" : { + "parentTimestamp" : "1534267999", + "parentDifficulty" : "1134190032", + "currentTimestamp" : "1534268007", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1135268123" + }, + + "DifficultyTest1104" : { + "parentTimestamp" : "1322874409", + "parentDifficulty" : "482425826", + "currentTimestamp" : "1322874417", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "484758537" + }, + + "DifficultyTest1106" : { + "parentTimestamp" : "483100446", + "parentDifficulty" : "567322989", + "currentTimestamp" : "483100454", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "571794306" + }, + + "DifficultyTest1107" : { + "parentTimestamp" : "1802263114", + "parentDifficulty" : "2114755988", + "currentTimestamp" : "1802263122", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "2124177191" + }, + + "DifficultyTest1108" : { + "parentTimestamp" : "474291947", + "parentDifficulty" : "50499205", + "currentTimestamp" : "474291955", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "67301078" + }, + + "DifficultyTest1109" : { + "parentTimestamp" : "775114288", + "parentDifficulty" : "499144910", + "currentTimestamp" : "775114296", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "532943065" + }, + + "DifficultyTest1110" : { + "parentTimestamp" : "337522582", + "parentDifficulty" : "1290730658", + "currentTimestamp" : "337522590", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "1324915329" + }, + + "DifficultyTest1111" : { + "parentTimestamp" : "291105671", + "parentDifficulty" : "1257149248", + "currentTimestamp" : "291105679", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1324871954" + }, + + "DifficultyTest1113" : { + "parentTimestamp" : "1388548541", + "parentDifficulty" : "310600394", + "currentTimestamp" : "1388548549", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "579187510" + }, + + "DifficultyTest1115" : { + "parentTimestamp" : "2092422449", + "parentDifficulty" : "743085072", + "currentTimestamp" : "2092422457", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "1280318818" + }, + + "DifficultyTest1116" : { + "parentTimestamp" : "1952136537", + "parentDifficulty" : "1699132480", + "currentTimestamp" : "1952136545", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "2773703958" + }, + + "DifficultyTest1117" : { + "parentTimestamp" : "1736006266", + "parentDifficulty" : "2071755468", + "currentTimestamp" : "1736006274", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "4220250715" + }, + + "DifficultyTest1119" : { + "parentTimestamp" : "1405485878", + "parentDifficulty" : "651472664", + "currentTimestamp" : "1405485886", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4946758061" + }, + + "DifficultyTest1120" : { + "parentTimestamp" : "1867455236", + "parentDifficulty" : "1124909469", + "currentTimestamp" : "1867455244", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9715393333" + }, + + "DifficultyTest1123" : { + "parentTimestamp" : "1478740666", + "parentDifficulty" : "1962224248", + "currentTimestamp" : "1478740674", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "36322920733" + }, + + "DifficultyTest1124" : { + "parentTimestamp" : "112962330", + "parentDifficulty" : "1774399972", + "currentTimestamp" : "112962338", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70494743114" + }, + + "DifficultyTest1127" : { + "parentTimestamp" : "395146151", + "parentDifficulty" : "462373932", + "currentTimestamp" : "395146159", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275340506644" + }, + + "DifficultyTest1128" : { + "parentTimestamp" : "28431940", + "parentDifficulty" : "270352291", + "currentTimestamp" : "28431948", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550026298186" + }, + + "DifficultyTest1129" : { + "parentTimestamp" : "1724672458", + "parentDifficulty" : "797084784", + "currentTimestamp" : "1724672466", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1100309101761" + }, + + "DifficultyTest1130" : { + "parentTimestamp" : "1735788435", + "parentDifficulty" : "249003745", + "currentTimestamp" : "1735788443", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1099760753104" + }, + + "DifficultyTest1134" : { + "parentTimestamp" : "2028449077", + "parentDifficulty" : "1903844191", + "currentTimestamp" : "2028449085", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797997796010" + }, + + "DifficultyTest1137" : { + "parentTimestamp" : "1669743569", + "parentDifficulty" : "565847128", + "currentTimestamp" : "1669743577", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70369310301084" + }, + + "DifficultyTest1138" : { + "parentTimestamp" : "1821325253", + "parentDifficulty" : "408849424", + "currentTimestamp" : "1821325261", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369153226721" + }, + + "DifficultyTest1140" : { + "parentTimestamp" : "371985502", + "parentDifficulty" : "2084091261", + "currentTimestamp" : "371985510", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281477061819539" + }, + + "DifficultyTest1142" : { + "parentTimestamp" : "2041727182", + "parentDifficulty" : "1087575424", + "currentTimestamp" : "2041727190", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951041527778" + }, + + "DifficultyTest1143" : { + "parentTimestamp" : "1487286441", + "parentDifficulty" : "1199684864", + "currentTimestamp" : "1487286449", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125901107113271" + }, + + "DifficultyTest1144" : { + "parentTimestamp" : "342774047", + "parentDifficulty" : "93495604", + "currentTimestamp" : "342774055", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251799907226504" + }, + + "DifficultyTest1145" : { + "parentTimestamp" : "189799828", + "parentDifficulty" : "993352050", + "currentTimestamp" : "189799836", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600621207581" + }, + + "DifficultyTest1147" : { + "parentTimestamp" : "991543020", + "parentDifficulty" : "354369795", + "currentTimestamp" : "991543028", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199609283819" + }, + + "DifficultyTest1148" : { + "parentTimestamp" : "107888149", + "parentDifficulty" : "591206058", + "currentTimestamp" : "107888157", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399100976716" + }, + + "DifficultyTest1150" : { + "parentTimestamp" : "1022225184", + "parentDifficulty" : "909441922", + "currentTimestamp" : "1022225192", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797928849953" + }, + + "DifficultyTest1154" : { + "parentTimestamp" : "719719522", + "parentDifficulty" : "138430401", + "currentTimestamp" : "719719530", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376290209737" + }, + + "DifficultyTest1155" : { + "parentTimestamp" : "2064773759", + "parentDifficulty" : "2034190098", + "currentTimestamp" : "2064773767", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460754338606842" + }, + + "DifficultyTest1157" : { + "parentTimestamp" : "1263379074", + "parentDifficulty" : "1455412000", + "currentTimestamp" : "1263379082", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010669816602" + }, + + "DifficultyTest1158" : { + "parentTimestamp" : "510413686", + "parentDifficulty" : "324944717", + "currentTimestamp" : "510413694", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843009538797333" + }, + + "DifficultyTest1160" : { + "parentTimestamp" : "358616248", + "parentDifficulty" : "941700634", + "currentTimestamp" : "358616256", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372037796936256" + }, + + "DifficultyTest1161" : { + "parentTimestamp" : "1478311738", + "parentDifficulty" : "616867309", + "currentTimestamp" : "1478311746", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074326720129" + }, + + "DifficultyTest1163" : { + "parentTimestamp" : "1953894181", + "parentDifficulty" : "1911805432", + "currentTimestamp" : "1953894189", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488149331842162" + }, + + "DifficultyTest1164" : { + "parentTimestamp" : "229449036", + "parentDifficulty" : "6778652", + "currentTimestamp" : "229449044", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976294844988425" + }, + + "DifficultyTest1166" : { + "parentTimestamp" : "1462426788", + "parentDifficulty" : "75200083", + "currentTimestamp" : "1462426796", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952589751649729" + }, + + "DifficultyTest1167" : { + "parentTimestamp" : "242754377", + "parentDifficulty" : "291339144", + "currentTimestamp" : "242754385", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179644307255" + }, + + "DifficultyTest1169" : { + "parentTimestamp" : "1448286192", + "parentDifficulty" : "2137738694", + "currentTimestamp" : "1448286200", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620719550085935" + }, + + "DifficultyTest1170" : { + "parentTimestamp" : "750962559", + "parentDifficulty" : "213110397", + "currentTimestamp" : "750962567", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717624517878" + }, + + "DifficultyTest1172" : { + "parentTimestamp" : "744511724", + "parentDifficulty" : "615251046", + "currentTimestamp" : "744511732", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482870260765157" + }, + + "DifficultyTest1173" : { + "parentTimestamp" : "1582233588", + "parentDifficulty" : "369449392", + "currentTimestamp" : "1582233596", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965739660057179" + }, + + "DifficultyTest1175" : { + "parentTimestamp" : "1926288687", + "parentDifficulty" : "1893460531", + "currentTimestamp" : "1926288695", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480475239856" + }, + + "DifficultyTest1176" : { + "parentTimestamp" : "549788469", + "parentDifficulty" : "501841364", + "currentTimestamp" : "549788477", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957663795971" + }, + + "DifficultyTest1180" : { + "parentTimestamp" : "516827180", + "parentDifficulty" : "816207648", + "currentTimestamp" : "516827188", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658110282730" + }, + + "DifficultyTest1182" : { + "parentTimestamp" : "1621473655", + "parentDifficulty" : "1867397141", + "currentTimestamp" : "1621473663", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316455662044" + }, + + "DifficultyTest1186" : { + "parentTimestamp" : "1150073938", + "parentDifficulty" : "1020110118", + "currentTimestamp" : "1150073946", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517719432922" + }, + + "DifficultyTest1187" : { + "parentTimestamp" : "2067570766", + "parentDifficulty" : "1373197916", + "currentTimestamp" : "2067570774", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034771517830" + }, + + "DifficultyTest1189" : { + "parentTimestamp" : "1378491052", + "parentDifficulty" : "1899623402", + "currentTimestamp" : "1378491060", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135491148584" + }, + + "DifficultyTest1193" : { + "parentTimestamp" : "1884867462", + "parentDifficulty" : "844074176", + "currentTimestamp" : "1884867470", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069569267377" + }, + + "DifficultyTest1196" : { + "parentTimestamp" : "1942369011", + "parentDifficulty" : "1578961824", + "currentTimestamp" : "1942369019", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276478857025" + }, + + "DifficultyTest1198" : { + "parentTimestamp" : "653912817", + "parentDifficulty" : "1875969608", + "currentTimestamp" : "653912825", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551675134056" + }, + + "DifficultyTest1201" : { + "parentTimestamp" : "145420106", + "parentDifficulty" : "406044996", + "currentTimestamp" : "145420114", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398792230844" + }, + + "DifficultyTest1203" : { + "parentTimestamp" : "1743131706", + "parentDifficulty" : "1518796296", + "currentTimestamp" : "1743131714", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798291513063" + }, + + "DifficultyTest1204" : { + "parentTimestamp" : "1524306409", + "parentDifficulty" : "1763464339", + "currentTimestamp" : "1524306417", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337595308275741" + }, + + "DifficultyTest1206" : { + "parentTimestamp" : "1622410242", + "parentDifficulty" : "1035480956", + "currentTimestamp" : "1622410250", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188123887233" + }, + + "DifficultyTest1210" : { + "parentTimestamp" : "494525504", + "parentDifficulty" : "585319555", + "currentTimestamp" : "494525513", + "currentBlockNumber" : "225001", + "currentDifficulty" : "585605356" + }, + + "DifficultyTest1211" : { + "parentTimestamp" : "1105111797", + "parentDifficulty" : "779025458", + "currentTimestamp" : "1105111806", + "currentBlockNumber" : "300001", + "currentDifficulty" : "779405843" + }, + + "DifficultyTest1212" : { + "parentTimestamp" : "741364345", + "parentDifficulty" : "1359960304", + "currentTimestamp" : "741364354", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1360624349" + }, + + "DifficultyTest1213" : { + "parentTimestamp" : "56858076", + "parentDifficulty" : "948690324", + "currentTimestamp" : "56858085", + "currentBlockNumber" : "450001", + "currentDifficulty" : "949153555" + }, + + "DifficultyTest1215" : { + "parentTimestamp" : "1174322920", + "parentDifficulty" : "1172551808", + "currentTimestamp" : "1174322929", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1173124359" + }, + + "DifficultyTest1216" : { + "parentTimestamp" : "444766926", + "parentDifficulty" : "1480964516", + "currentTimestamp" : "444766935", + "currentBlockNumber" : "675001", + "currentDifficulty" : "1481687659" + }, + + "DifficultyTest1217" : { + "parentTimestamp" : "1446725839", + "parentDifficulty" : "1592627633", + "currentTimestamp" : "1446725848", + "currentBlockNumber" : "750001", + "currentDifficulty" : "1593405315" + }, + + "DifficultyTest1218" : { + "parentTimestamp" : "59048961", + "parentDifficulty" : "1081708126", + "currentTimestamp" : "59048970", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1082236367" + }, + + "DifficultyTest1219" : { + "parentTimestamp" : "1955028289", + "parentDifficulty" : "747812414", + "currentTimestamp" : "1955028298", + "currentBlockNumber" : "900001", + "currentDifficulty" : "748177684" + }, + + "DifficultyTest1220" : { + "parentTimestamp" : "1061392036", + "parentDifficulty" : "387740710", + "currentTimestamp" : "1061392045", + "currentBlockNumber" : "975001", + "currentDifficulty" : "387930164" + }, + + "DifficultyTest1222" : { + "parentTimestamp" : "107473438", + "parentDifficulty" : "1607105946", + "currentTimestamp" : "107473447", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1607891177" + }, + + "DifficultyTest1229" : { + "parentTimestamp" : "1559657560", + "parentDifficulty" : "307835789", + "currentTimestamp" : "1559657569", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "308002483" + }, + + "DifficultyTest1232" : { + "parentTimestamp" : "217052995", + "parentDifficulty" : "1149689296", + "currentTimestamp" : "217053004", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "1150316203" + }, + + "DifficultyTest1233" : { + "parentTimestamp" : "1194845197", + "parentDifficulty" : "1450284736", + "currentTimestamp" : "1194845206", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "1451123954" + }, + + "DifficultyTest1234" : { + "parentTimestamp" : "1442186824", + "parentDifficulty" : "364076636", + "currentTimestamp" : "1442186833", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "364516551" + }, + + "DifficultyTest1235" : { + "parentTimestamp" : "32134677", + "parentDifficulty" : "1392715452", + "currentTimestamp" : "32134686", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1393919776" + }, + + "DifficultyTest1237" : { + "parentTimestamp" : "1042680087", + "parentDifficulty" : "778247320", + "currentTimestamp" : "1042680096", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "779675899" + }, + + "DifficultyTest1238" : { + "parentTimestamp" : "1935947649", + "parentDifficulty" : "921824318", + "currentTimestamp" : "1935947658", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "924371579" + }, + + "DifficultyTest1241" : { + "parentTimestamp" : "1347257891", + "parentDifficulty" : "299661506", + "currentTimestamp" : "1347257900", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "308196433" + }, + + "DifficultyTest1245" : { + "parentTimestamp" : "694850950", + "parentDifficulty" : "814173017", + "currentTimestamp" : "694850959", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "881679426" + }, + + "DifficultyTest1246" : { + "parentTimestamp" : "238915846", + "parentDifficulty" : "238773701", + "currentTimestamp" : "238915855", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "373108017" + }, + + "DifficultyTest1247" : { + "parentTimestamp" : "420044867", + "parentDifficulty" : "317245850", + "currentTimestamp" : "420044876", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "585836211" + }, + + "DifficultyTest1248" : { + "parentTimestamp" : "1759183267", + "parentDifficulty" : "1996564821", + "currentTimestamp" : "1759183276", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "2265975162" + }, + + "DifficultyTest1253" : { + "parentTimestamp" : "916981050", + "parentDifficulty" : "1691066584", + "currentTimestamp" : "916981059", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5986859596" + }, + + "DifficultyTest1255" : { + "parentTimestamp" : "544633918", + "parentDifficulty" : "87119925", + "currentTimestamp" : "544633927", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "17267031648" + }, + + "DifficultyTest1256" : { + "parentTimestamp" : "789215304", + "parentDifficulty" : "1380467898", + "currentTimestamp" : "789215313", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "18561011138" + }, + + "DifficultyTest1257" : { + "parentTimestamp" : "490061344", + "parentDifficulty" : "894112778", + "currentTimestamp" : "490061353", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35254287724" + }, + + "DifficultyTest1261" : { + "parentTimestamp" : "230195625", + "parentDifficulty" : "412780150", + "currentTimestamp" : "230195634", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275290888646" + }, + + "DifficultyTest1263" : { + "parentTimestamp" : "1297009044", + "parentDifficulty" : "1450042996", + "currentTimestamp" : "1297009053", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1100962378800" + }, + + "DifficultyTest1267" : { + "parentTimestamp" : "2045552136", + "parentDifficulty" : "312663736", + "currentTimestamp" : "2045552145", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8796405838611" + }, + + "DifficultyTest1268" : { + "parentTimestamp" : "237546080", + "parentDifficulty" : "227996053", + "currentTimestamp" : "237546089", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8796321129587" + }, + + "DifficultyTest1271" : { + "parentTimestamp" : "406534020", + "parentDifficulty" : "1301473548", + "currentTimestamp" : "406534029", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370046286697" + }, + + "DifficultyTest1272" : { + "parentTimestamp" : "1334506808", + "parentDifficulty" : "1734474432", + "currentTimestamp" : "1334506817", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370479499007" + }, + + "DifficultyTest1273" : { + "parentTimestamp" : "1389026610", + "parentDifficulty" : "460851951", + "currentTimestamp" : "1389026619", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140737949432304" + }, + + "DifficultyTest1279" : { + "parentTimestamp" : "1316098048", + "parentDifficulty" : "987586749", + "currentTimestamp" : "1316098057", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600615439465" + }, + + "DifficultyTest1280" : { + "parentTimestamp" : "285233429", + "parentDifficulty" : "1541270989", + "currentTimestamp" : "285233438", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503601169394058" + }, + + "DifficultyTest1283" : { + "parentTimestamp" : "1942879429", + "parentDifficulty" : "1894614099", + "currentTimestamp" : "1942879438", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798914503171" + }, + + "DifficultyTest1286" : { + "parentTimestamp" : "115462800", + "parentDifficulty" : "1884975500", + "currentTimestamp" : "115462809", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115189961751770" + }, + + "DifficultyTest1287" : { + "parentTimestamp" : "1641157274", + "parentDifficulty" : "1553265763", + "currentTimestamp" : "1641157283", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377705735937" + }, + + "DifficultyTest1289" : { + "parentTimestamp" : "971493903", + "parentDifficulty" : "23131991", + "currentTimestamp" : "971493912", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460752326566773" + }, + + "DifficultyTest1290" : { + "parentTimestamp" : "1691419074", + "parentDifficulty" : "110045008", + "currentTimestamp" : "1691419083", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921504716945716" + }, + + "DifficultyTest1291" : { + "parentTimestamp" : "1457471634", + "parentDifficulty" : "1515178355", + "currentTimestamp" : "1457471643", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010729612140" + }, + + "DifficultyTest1295" : { + "parentTimestamp" : "1697253836", + "parentDifficulty" : "1107756041", + "currentTimestamp" : "1697253845", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074817848553" + }, + + "DifficultyTest1298" : { + "parentTimestamp" : "898954470", + "parentDifficulty" : "1381885569", + "currentTimestamp" : "898954479", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296220766781" + }, + + "DifficultyTest1300" : { + "parentTimestamp" : "780632253", + "parentDifficulty" : "535596600", + "currentTimestamp" : "780632262", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952590212271049" + }, + + "DifficultyTest1301" : { + "parentTimestamp" : "671003012", + "parentDifficulty" : "150628662", + "currentTimestamp" : "671003021", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179503528067" + }, + + "DifficultyTest1305" : { + "parentTimestamp" : "403213020", + "parentDifficulty" : "1025134330", + "currentTimestamp" : "403213029", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241435848241731" + }, + + "DifficultyTest1308" : { + "parentTimestamp" : "278484964", + "parentDifficulty" : "640055834", + "currentTimestamp" : "278484973", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739930795753" + }, + + "DifficultyTest1311" : { + "parentTimestamp" : "1219542600", + "parentDifficulty" : "1027393609", + "currentTimestamp" : "1219542609", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915351314402" + }, + + "DifficultyTest1314" : { + "parentTimestamp" : "1441893754", + "parentDifficulty" : "1987158928", + "currentTimestamp" : "1441893763", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903659281805764" + }, + + "DifficultyTest1316" : { + "parentTimestamp" : "2022768627", + "parentDifficulty" : "905170464", + "currentTimestamp" : "2022768636", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807315492965529" + }, + + "DifficultyTest1323" : { + "parentTimestamp" : "1529972545", + "parentDifficulty" : "1899106308", + "currentTimestamp" : "1529972554", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135490631238" + }, + + "DifficultyTest1326" : { + "parentTimestamp" : "1498500746", + "parentDifficulty" : "1904876176", + "currentTimestamp" : "1498500755", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672536268196819" + }, + + "DifficultyTest1327" : { + "parentTimestamp" : "843103082", + "parentDifficulty" : "668622559", + "currentTimestamp" : "843103091", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069393730090" + }, + + "DifficultyTest1329" : { + "parentTimestamp" : "1500783345", + "parentDifficulty" : "1738550816", + "currentTimestamp" : "1500783354", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690139188961829" + }, + + "DifficultyTest1332" : { + "parentTimestamp" : "1519312173", + "parentDifficulty" : "331203416", + "currentTimestamp" : "1519312182", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760550129613584" + }, + + "DifficultyTest1333" : { + "parentTimestamp" : "832518465", + "parentDifficulty" : "1340233440", + "currentTimestamp" : "832518474", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521100937384746" + }, + + "DifficultyTest1334" : { + "parentTimestamp" : "276895629", + "parentDifficulty" : "95954653", + "currentTimestamp" : "276895638", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042199288995297" + }, + + "DifficultyTest1337" : { + "parentTimestamp" : "1232428745", + "parentDifficulty" : "892859665", + "currentTimestamp" : "1232428754", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797665270799" + }, + + "DifficultyTest1341" : { + "parentTimestamp" : "269659787", + "parentDifficulty" : "876234233", + "currentTimestamp" : "269659797", + "currentBlockNumber" : "1", + "currentDifficulty" : "876662081" + }, + + "DifficultyTest1343" : { + "parentTimestamp" : "831776413", + "parentDifficulty" : "1838754790", + "currentTimestamp" : "831776423", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1839652619" + }, + + "DifficultyTest1345" : { + "parentTimestamp" : "1346169100", + "parentDifficulty" : "1732109896", + "currentTimestamp" : "1346169110", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1732955654" + }, + + "DifficultyTest1346" : { + "parentTimestamp" : "2022765611", + "parentDifficulty" : "1527686754", + "currentTimestamp" : "2022765621", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1528432696" + }, + + "DifficultyTest1347" : { + "parentTimestamp" : "1559772682", + "parentDifficulty" : "1601082006", + "currentTimestamp" : "1559772692", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1601863788" + }, + + "DifficultyTest1349" : { + "parentTimestamp" : "1277821545", + "parentDifficulty" : "637536678", + "currentTimestamp" : "1277821555", + "currentBlockNumber" : "600001", + "currentDifficulty" : "637847991" + }, + + "DifficultyTest1351" : { + "parentTimestamp" : "830193725", + "parentDifficulty" : "886810437", + "currentTimestamp" : "830193735", + "currentBlockNumber" : "750001", + "currentDifficulty" : "887243481" + }, + + "DifficultyTest1352" : { + "parentTimestamp" : "782924377", + "parentDifficulty" : "1256312944", + "currentTimestamp" : "782924387", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1256926442" + }, + + "DifficultyTest1355" : { + "parentTimestamp" : "1765689905", + "parentDifficulty" : "572425174", + "currentTimestamp" : "1765689915", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "572704934" + }, + + "DifficultyTest1357" : { + "parentTimestamp" : "1413525807", + "parentDifficulty" : "2022118785", + "currentTimestamp" : "1413525817", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "2023107171" + }, + + "DifficultyTest1360" : { + "parentTimestamp" : "591577271", + "parentDifficulty" : "1040690344", + "currentTimestamp" : "591577281", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1041202589" + }, + + "DifficultyTest1362" : { + "parentTimestamp" : "1852958648", + "parentDifficulty" : "5889171", + "currentTimestamp" : "1852958658", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "5900238" + }, + + "DifficultyTest1363" : { + "parentTimestamp" : "33835325", + "parentDifficulty" : "947313088", + "currentTimestamp" : "33835335", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "947792027" + }, + + "DifficultyTest1364" : { + "parentTimestamp" : "821491673", + "parentDifficulty" : "1083209309", + "currentTimestamp" : "821491683", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1083770987" + }, + + "DifficultyTest1366" : { + "parentTimestamp" : "554320169", + "parentDifficulty" : "572259899", + "currentTimestamp" : "554320179", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "572604858" + }, + + "DifficultyTest1367" : { + "parentTimestamp" : "612461737", + "parentDifficulty" : "1300083869", + "currentTimestamp" : "612461747", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "1300849747" + }, + + "DifficultyTest1372" : { + "parentTimestamp" : "1098471467", + "parentDifficulty" : "1720593164", + "currentTimestamp" : "1098471477", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "1723530449" + }, + + "DifficultyTest1374" : { + "parentTimestamp" : "36079253", + "parentDifficulty" : "1203624928", + "currentTimestamp" : "36079263", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1208406939" + }, + + "DifficultyTest1375" : { + "parentTimestamp" : "1072255190", + "parentDifficulty" : "1634142950", + "currentTimestamp" : "1072255200", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1643329479" + }, + + "DifficultyTest1376" : { + "parentTimestamp" : "716983110", + "parentDifficulty" : "2142193804", + "currentTimestamp" : "716983120", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "2160017013" + }, + + "DifficultyTest1378" : { + "parentTimestamp" : "1093007126", + "parentDifficulty" : "1579585785", + "currentTimestamp" : "1093007136", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "1613911499" + }, + + "DifficultyTest1382" : { + "parentTimestamp" : "199447570", + "parentDifficulty" : "47708752", + "currentTimestamp" : "199447580", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "316167503" + }, + + "DifficultyTest1384" : { + "parentTimestamp" : "1250220422", + "parentDifficulty" : "980348584", + "currentTimestamp" : "1250220432", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "2054569093" + }, + + "DifficultyTest1387" : { + "parentTimestamp" : "152219862", + "parentDifficulty" : "974519682", + "currentTimestamp" : "152219872", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5269962817" + }, + + "DifficultyTest1388" : { + "parentTimestamp" : "193477288", + "parentDifficulty" : "742375144", + "currentTimestamp" : "193477298", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9332672223" + }, + + "DifficultyTest1392" : { + "parentTimestamp" : "1950743804", + "parentDifficulty" : "1336281932", + "currentTimestamp" : "1950743814", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "70056411149" + }, + + "DifficultyTest1393" : { + "parentTimestamp" : "760518762", + "parentDifficulty" : "248693920", + "currentTimestamp" : "760518772", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "137687768824" + }, + + "DifficultyTest1394" : { + "parentTimestamp" : "1024748270", + "parentDifficulty" : "687079317", + "currentTimestamp" : "1024748280", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "138126368276" + }, + + "DifficultyTest1395" : { + "parentTimestamp" : "696155836", + "parentDifficulty" : "752466758", + "currentTimestamp" : "696155846", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275630741117" + }, + + "DifficultyTest1398" : { + "parentTimestamp" : "913844853", + "parentDifficulty" : "592307748", + "currentTimestamp" : "913844863", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1100104224736" + }, + + "DifficultyTest1399" : { + "parentTimestamp" : "1583676824", + "parentDifficulty" : "794556646", + "currentTimestamp" : "1583676834", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199818200165" + }, + + "DifficultyTest1400" : { + "parentTimestamp" : "370312367", + "parentDifficulty" : "155797210", + "currentTimestamp" : "370312377", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4398202384386" + }, + + "DifficultyTest1401" : { + "parentTimestamp" : "856620875", + "parentDifficulty" : "489882317", + "currentTimestamp" : "856620885", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8796583143725" + }, + + "DifficultyTest1402" : { + "parentTimestamp" : "2093807255", + "parentDifficulty" : "399022368", + "currentTimestamp" : "2093807265", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8796492239411" + }, + + "DifficultyTest1404" : { + "parentTimestamp" : "2048485583", + "parentDifficulty" : "278065466", + "currentTimestamp" : "2048485593", + "currentBlockNumber" : "4725001", + "currentDifficulty" : "35184650290072" + }, + + "DifficultyTest1405" : { + "parentTimestamp" : "1806270679", + "parentDifficulty" : "1036070416", + "currentTimestamp" : "1806270689", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70369780753973" + }, + + "DifficultyTest1406" : { + "parentTimestamp" : "531728323", + "parentDifficulty" : "583617392", + "currentTimestamp" : "531728333", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369328080025" + }, + + "DifficultyTest1409" : { + "parentTimestamp" : "307810395", + "parentDifficulty" : "162246667", + "currentTimestamp" : "307810405", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562950115747201" + }, + + "DifficultyTest1410" : { + "parentTimestamp" : "699605515", + "parentDifficulty" : "17423132", + "currentTimestamp" : "699605525", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562949970852951" + }, + + "DifficultyTest1411" : { + "parentTimestamp" : "1372677798", + "parentDifficulty" : "1558858456", + "currentTimestamp" : "1372677808", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125901466462241" + }, + + "DifficultyTest1412" : { + "parentTimestamp" : "1121140310", + "parentDifficulty" : "1172806059", + "currentTimestamp" : "1121140320", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800987063966" + }, + + "DifficultyTest1417" : { + "parentTimestamp" : "1365584843", + "parentDifficulty" : "1389215786", + "currentTimestamp" : "1365584853", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798408858082" + }, + + "DifficultyTest1418" : { + "parentTimestamp" : "1494245333", + "parentDifficulty" : "896683625", + "currentTimestamp" : "1494245343", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797916085426" + }, + + "DifficultyTest1419" : { + "parentTimestamp" : "662308988", + "parentDifficulty" : "1711585764", + "currentTimestamp" : "662308998", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595750349435" + }, + + "DifficultyTest1421" : { + "parentTimestamp" : "791184990", + "parentDifficulty" : "1439333608", + "currentTimestamp" : "791185000", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377591748151" + }, + + "DifficultyTest1422" : { + "parentTimestamp" : "1979941052", + "parentDifficulty" : "1178420112", + "currentTimestamp" : "1979941062", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377330707256" + }, + + "DifficultyTest1423" : { + "parentTimestamp" : "1328160969", + "parentDifficulty" : "2055883000", + "currentTimestamp" : "1328160979", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460754360310337" + }, + + "DifficultyTest1424" : { + "parentTimestamp" : "423999013", + "parentDifficulty" : "1910282106", + "currentTimestamp" : "423999023", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921506518061836" + }, + + "DifficultyTest1426" : { + "parentTimestamp" : "1029839844", + "parentDifficulty" : "977306870", + "currentTimestamp" : "1029839854", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843010191478022" + }, + + "DifficultyTest1428" : { + "parentTimestamp" : "1398512634", + "parentDifficulty" : "1995984162", + "currentTimestamp" : "1398512644", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038851734571" + }, + + "DifficultyTest1432" : { + "parentTimestamp" : "2146869928", + "parentDifficulty" : "1873117138", + "currentTimestamp" : "2146869938", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296712238209" + }, + + "DifficultyTest1434" : { + "parentTimestamp" : "1813179124", + "parentDifficulty" : "1381886324", + "currentTimestamp" : "1813179134", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952591058974001" + }, + + "DifficultyTest1435" : { + "parentTimestamp" : "353151130", + "parentDifficulty" : "510523168", + "currentTimestamp" : "353151140", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179863598302" + }, + + "DifficultyTest1436" : { + "parentTimestamp" : "1222395584", + "parentDifficulty" : "1508847076", + "currentTimestamp" : "1222395594", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810360215235529" + }, + + "DifficultyTest1437" : { + "parentTimestamp" : "1332754867", + "parentDifficulty" : "656944140", + "currentTimestamp" : "1332754877", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718068568337" + }, + + "DifficultyTest1438" : { + "parentTimestamp" : "705420120", + "parentDifficulty" : "645777870", + "currentTimestamp" : "705420130", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620718057396615" + }, + + "DifficultyTest1439" : { + "parentTimestamp" : "2113446240", + "parentDifficulty" : "66887956", + "currentTimestamp" : "2113446250", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241434889527464" + }, + + "DifficultyTest1440" : { + "parentTimestamp" : "1862397642", + "parentDifficulty" : "697003116", + "currentTimestamp" : "1862397652", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482870342557145" + }, + + "DifficultyTest1444" : { + "parentTimestamp" : "1646510708", + "parentDifficulty" : "213623484", + "currentTimestamp" : "1646510718", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957375437360" + }, + + "DifficultyTest1445" : { + "parentTimestamp" : "1252826752", + "parentDifficulty" : "929471744", + "currentTimestamp" : "1252826762", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915253344723" + }, + + "DifficultyTest1449" : { + "parentTimestamp" : "581177543", + "parentDifficulty" : "340049460", + "currentTimestamp" : "581177553", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807314927568587" + }, + + "DifficultyTest1450" : { + "parentTimestamp" : "822680964", + "parentDifficulty" : "1145095072", + "currentTimestamp" : "822680974", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807315733007288" + }, + + "DifficultyTest1452" : { + "parentTimestamp" : "349183094", + "parentDifficulty" : "1983072807", + "currentTimestamp" : "349183104", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229260333453456" + }, + + "DifficultyTest1453" : { + "parentTimestamp" : "1032609581", + "parentDifficulty" : "1722506704", + "currentTimestamp" : "1032609591", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458518422172475" + }, + + "DifficultyTest1454" : { + "parentTimestamp" : "413563049", + "parentDifficulty" : "356015168", + "currentTimestamp" : "413563059", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517055013707" + }, + + "DifficultyTest1455" : { + "parentTimestamp" : "1693543689", + "parentDifficulty" : "351397680", + "currentTimestamp" : "1693543699", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917033749218668" + }, + + "DifficultyTest1457" : { + "parentTimestamp" : "1257851597", + "parentDifficulty" : "2141251117", + "currentTimestamp" : "1257851607", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135732894281" + }, + + "DifficultyTest1459" : { + "parentTimestamp" : "1439406969", + "parentDifficulty" : "850556056", + "currentTimestamp" : "1439406979", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336268032166630" + }, + + "DifficultyTest1460" : { + "parentTimestamp" : "1153952497", + "parentDifficulty" : "1747869336", + "currentTimestamp" : "1153952507", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672536111113315" + }, + + "DifficultyTest1462" : { + "parentTimestamp" : "887565340", + "parentDifficulty" : "247158224", + "currentTimestamp" : "887565350", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068972059962" + }, + + "DifficultyTest1463" : { + "parentTimestamp" : "471646394", + "parentDifficulty" : "969986908", + "currentTimestamp" : "471646404", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138420022646" + }, + + "DifficultyTest1465" : { + "parentTimestamp" : "1584993607", + "parentDifficulty" : "1295850180", + "currentTimestamp" : "1584993617", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551094731367" + }, + + "DifficultyTest1466" : { + "parentTimestamp" : "1693017134", + "parentDifficulty" : "410613384", + "currentTimestamp" : "1693017144", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760550209062326" + }, + + "DifficultyTest1467" : { + "parentTimestamp" : "628589759", + "parentDifficulty" : "1535815253", + "currentTimestamp" : "628589769", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101133062058" + }, + + "DifficultyTest1468" : { + "parentTimestamp" : "170311186", + "parentDifficulty" : "1575080194", + "currentTimestamp" : "170311196", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200768843068" + }, + + "DifficultyTest1470" : { + "parentTimestamp" : "616400560", + "parentDifficulty" : "959690839", + "currentTimestamp" : "616400570", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084399346147022" + }, + + "DifficultyTest1471" : { + "parentTimestamp" : "839127417", + "parentDifficulty" : "2048087405", + "currentTimestamp" : "839127427", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798821062615" + }, + + "DifficultyTest1472" : { + "parentTimestamp" : "1161576880", + "parentDifficulty" : "1699292756", + "currentTimestamp" : "1161576890", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337595244072824" + }, + + "DifficultyTest1474" : { + "parentTimestamp" : "930814167", + "parentDifficulty" : "1277303328", + "currentTimestamp" : "930814177", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188365827683" + }, + + "DifficultyTest1475" : { + "parentTimestamp" : "524353108", + "parentDifficulty" : "458390042", + "currentTimestamp" : "524353119", + "currentBlockNumber" : "1", + "currentDifficulty" : "458613865" + }, + + "DifficultyTest1477" : { + "parentTimestamp" : "1253055423", + "parentDifficulty" : "1862931086", + "currentTimestamp" : "1253055434", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1863840720" + }, + + "DifficultyTest1478" : { + "parentTimestamp" : "1507233369", + "parentDifficulty" : "1208795015", + "currentTimestamp" : "1507233380", + "currentBlockNumber" : "225001", + "currentDifficulty" : "1209385247" + }, + + "DifficultyTest1479" : { + "parentTimestamp" : "246063481", + "parentDifficulty" : "997892823", + "currentTimestamp" : "246063492", + "currentBlockNumber" : "300001", + "currentDifficulty" : "998380077" + }, + + "DifficultyTest1480" : { + "parentTimestamp" : "399829341", + "parentDifficulty" : "427509156", + "currentTimestamp" : "399829352", + "currentBlockNumber" : "375001", + "currentDifficulty" : "427717902" + }, + + "DifficultyTest1481" : { + "parentTimestamp" : "691879707", + "parentDifficulty" : "1660324614", + "currentTimestamp" : "691879718", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1661135323" + }, + + "DifficultyTest1485" : { + "parentTimestamp" : "1872359618", + "parentDifficulty" : "918610998", + "currentTimestamp" : "1872359629", + "currentBlockNumber" : "750001", + "currentDifficulty" : "919059570" + }, + + "DifficultyTest1488" : { + "parentTimestamp" : "714360308", + "parentDifficulty" : "1267579442", + "currentTimestamp" : "714360319", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1268198505" + }, + + "DifficultyTest1489" : { + "parentTimestamp" : "546824635", + "parentDifficulty" : "904773928", + "currentTimestamp" : "546824646", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "905215968" + }, + + "DifficultyTest1491" : { + "parentTimestamp" : "1207312274", + "parentDifficulty" : "184907568", + "currentTimestamp" : "1207312285", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "184998878" + }, + + "DifficultyTest1492" : { + "parentTimestamp" : "1316860458", + "parentDifficulty" : "494307410", + "currentTimestamp" : "1316860469", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "494549795" + }, + + "DifficultyTest1495" : { + "parentTimestamp" : "1004949035", + "parentDifficulty" : "266041490", + "currentTimestamp" : "1004949046", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "266179585" + }, + + "DifficultyTest1496" : { + "parentTimestamp" : "694935000", + "parentDifficulty" : "636079600", + "currentTimestamp" : "694935011", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "636398377" + }, + + "DifficultyTest1497" : { + "parentTimestamp" : "1959386695", + "parentDifficulty" : "1952550412", + "currentTimestamp" : "1959386706", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1953520189" + }, + + "DifficultyTest1498" : { + "parentTimestamp" : "1273179413", + "parentDifficulty" : "489846704", + "currentTimestamp" : "1273179424", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "490118654" + }, + + "DifficultyTest1499" : { + "parentTimestamp" : "2087053787", + "parentDifficulty" : "1086216137", + "currentTimestamp" : "2087053798", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1086812051" + }, + + "DifficultyTest1504" : { + "parentTimestamp" : "478072775", + "parentDifficulty" : "1537596544", + "currentTimestamp" : "478072786", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "1538871611" + }, + + "DifficultyTest1505" : { + "parentTimestamp" : "2101512233", + "parentDifficulty" : "250948492", + "currentTimestamp" : "2101512244", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "252119601" + }, + + "DifficultyTest1508" : { + "parentTimestamp" : "321389998", + "parentDifficulty" : "192329118", + "currentTimestamp" : "321390009", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "196617332" + }, + + "DifficultyTest1510" : { + "parentTimestamp" : "695282020", + "parentDifficulty" : "227428676", + "currentTimestamp" : "695282031", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "244316941" + }, + + "DifficultyTest1514" : { + "parentTimestamp" : "1438189093", + "parentDifficulty" : "857643596", + "currentTimestamp" : "1438189104", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "992280095" + }, + + "DifficultyTest1518" : { + "parentTimestamp" : "696177956", + "parentDifficulty" : "132415648", + "currentTimestamp" : "696177967", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1206222128" + }, + + "DifficultyTest1521" : { + "parentTimestamp" : "2054376684", + "parentDifficulty" : "287943168", + "currentTimestamp" : "2054376695", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "4583051061" + }, + + "DifficultyTest1525" : { + "parentTimestamp" : "1269614870", + "parentDifficulty" : "539689728", + "currentTimestamp" : "1269614881", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "34899691616" + }, + + "DifficultyTest1526" : { + "parentTimestamp" : "1577126468", + "parentDifficulty" : "35475103", + "currentTimestamp" : "1577126479", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "68754969160" + }, + + "DifficultyTest1527" : { + "parentTimestamp" : "1808691539", + "parentDifficulty" : "256697344", + "currentTimestamp" : "1808691550", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "137695776156" + }, + + "DifficultyTest1528" : { + "parentTimestamp" : "1940439684", + "parentDifficulty" : "1908137984", + "currentTimestamp" : "1940439695", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "139348023164" + }, + + "DifficultyTest1530" : { + "parentTimestamp" : "1499103492", + "parentDifficulty" : "1031793516", + "currentTimestamp" : "1499103503", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550788111209" + }, + + "DifficultyTest1533" : { + "parentTimestamp" : "770350287", + "parentDifficulty" : "42954700", + "currentTimestamp" : "770350298", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199066231225" + }, + + "DifficultyTest1537" : { + "parentTimestamp" : "329297618", + "parentDifficulty" : "1430858818", + "currentTimestamp" : "329297629", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17593617601895" + }, + + "DifficultyTest1540" : { + "parentTimestamp" : "725769189", + "parentDifficulty" : "1861272502", + "currentTimestamp" : "725769200", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370606358990" + }, + + "DifficultyTest1542" : { + "parentTimestamp" : "547796061", + "parentDifficulty" : "838484268", + "currentTimestamp" : "547796072", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475815604340" + }, + + "DifficultyTest1543" : { + "parentTimestamp" : "694990332", + "parentDifficulty" : "1936276776", + "currentTimestamp" : "694990343", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562951890643535" + }, + + "DifficultyTest1544" : { + "parentTimestamp" : "1296105427", + "parentDifficulty" : "344279315", + "currentTimestamp" : "1296105438", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950297868732" + }, + + "DifficultyTest1546" : { + "parentTimestamp" : "86254690", + "parentDifficulty" : "986609972", + "currentTimestamp" : "86254701", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800800776963" + }, + + "DifficultyTest1551" : { + "parentTimestamp" : "1799695658", + "parentDifficulty" : "1630850796", + "currentTimestamp" : "1799695669", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798650611077" + }, + + "DifficultyTest1552" : { + "parentTimestamp" : "277852472", + "parentDifficulty" : "1425824530", + "currentTimestamp" : "277852483", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028798445484701" + }, + + "DifficultyTest1553" : { + "parentTimestamp" : "191951033", + "parentDifficulty" : "1027341570", + "currentTimestamp" : "191951044", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595065771137" + }, + + "DifficultyTest1555" : { + "parentTimestamp" : "1868720064", + "parentDifficulty" : "1101478096", + "currentTimestamp" : "1868720075", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377253727671" + }, + + "DifficultyTest1556" : { + "parentTimestamp" : "770764900", + "parentDifficulty" : "1488075942", + "currentTimestamp" : "770764911", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377640514285" + }, + + "DifficultyTest1557" : { + "parentTimestamp" : "1618463962", + "parentDifficulty" : "705488944", + "currentTimestamp" : "1618463973", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753009256909" + }, + + "DifficultyTest1558" : { + "parentTimestamp" : "653808891", + "parentDifficulty" : "1716519186", + "currentTimestamp" : "653808902", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921506324204306" + }, + + "DifficultyTest1559" : { + "parentTimestamp" : "1625197095", + "parentDifficulty" : "1010873868", + "currentTimestamp" : "1625197106", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010225061410" + }, + + "DifficultyTest1560" : { + "parentTimestamp" : "1635952442", + "parentDifficulty" : "854310528", + "currentTimestamp" : "1635952453", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843010068421623" + }, + + "DifficultyTest1562" : { + "parentTimestamp" : "973815501", + "parentDifficulty" : "2002263024", + "currentTimestamp" : "973815512", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038858016499" + }, + + "DifficultyTest1566" : { + "parentTimestamp" : "1131278845", + "parentDifficulty" : "1142841556", + "currentTimestamp" : "1131278856", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976295981606048" + }, + + "DifficultyTest1567" : { + "parentTimestamp" : "1143735651", + "parentDifficulty" : "240215020", + "currentTimestamp" : "1143735662", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952589916745240" + }, + + "DifficultyTest1571" : { + "parentTimestamp" : "81671897", + "parentDifficulty" : "1081438021", + "currentTimestamp" : "81671908", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718493269490" + }, + + "DifficultyTest1572" : { + "parentTimestamp" : "1745825580", + "parentDifficulty" : "2125947731", + "currentTimestamp" : "1745825591", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620719538289215" + }, + + "DifficultyTest1574" : { + "parentTimestamp" : "681926053", + "parentDifficulty" : "640684087", + "currentTimestamp" : "681926064", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482870286210617" + }, + + "DifficultyTest1576" : { + "parentTimestamp" : "463784697", + "parentDifficulty" : "221191396", + "currentTimestamp" : "463784708", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739511726791" + }, + + "DifficultyTest1577" : { + "parentTimestamp" : "1590282304", + "parentDifficulty" : "1003064209", + "currentTimestamp" : "1590282315", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931479584408770" + }, + + "DifficultyTest1579" : { + "parentTimestamp" : "2103709912", + "parentDifficulty" : "741823403", + "currentTimestamp" : "2103709923", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915065604757" + }, + + "DifficultyTest1580" : { + "parentTimestamp" : "458980198", + "parentDifficulty" : "1675198352", + "currentTimestamp" : "458980209", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725915999435455" + }, + + "DifficultyTest1581" : { + "parentTimestamp" : "681970785", + "parentDifficulty" : "887985210", + "currentTimestamp" : "681970796", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451829535257068" + }, + + "DifficultyTest1584" : { + "parentTimestamp" : "2070074426", + "parentDifficulty" : "65831658", + "currentTimestamp" : "2070074437", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807314653216890" + }, + + "DifficultyTest1585" : { + "parentTimestamp" : "1448846538", + "parentDifficulty" : "649858933", + "currentTimestamp" : "1448846549", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629824882422" + }, + + "DifficultyTest1586" : { + "parentTimestamp" : "1141764494", + "parentDifficulty" : "493208900", + "currentTimestamp" : "1141764505", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229258842862076" + }, + + "DifficultyTest1588" : { + "parentTimestamp" : "1648165202", + "parentDifficulty" : "176575016", + "currentTimestamp" : "1648165213", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458516875485938" + }, + + "DifficultyTest1590" : { + "parentTimestamp" : "420251646", + "parentDifficulty" : "1345833962", + "currentTimestamp" : "420251657", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068141789923" + }, + + "DifficultyTest1591" : { + "parentTimestamp" : "2078246047", + "parentDifficulty" : "378389681", + "currentTimestamp" : "2078246058", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668133969172073" + }, + + "DifficultyTest1592" : { + "parentTimestamp" : "842398522", + "parentDifficulty" : "1527687324", + "currentTimestamp" : "842398533", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668135119030897" + }, + + "DifficultyTest1594" : { + "parentTimestamp" : "1396799246", + "parentDifficulty" : "62586958", + "currentTimestamp" : "1396799257", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672534425008046" + }, + + "DifficultyTest1596" : { + "parentTimestamp" : "1236516919", + "parentDifficulty" : "181136712", + "currentTimestamp" : "1236516930", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068906006213" + }, + + "DifficultyTest1597" : { + "parentTimestamp" : "1204564542", + "parentDifficulty" : "299651545", + "currentTimestamp" : "1204564553", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690137749359971" + }, + + "DifficultyTest1598" : { + "parentTimestamp" : "1536768996", + "parentDifficulty" : "1143718295", + "currentTimestamp" : "1536769007", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276043400975" + }, + + "DifficultyTest1599" : { + "parentTimestamp" : "295509243", + "parentDifficulty" : "676406180", + "currentTimestamp" : "295509254", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550474984904" + }, + + "DifficultyTest1600" : { + "parentTimestamp" : "821687648", + "parentDifficulty" : "1495943698", + "currentTimestamp" : "821687659", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551294922587" + }, + + "DifficultyTest1601" : { + "parentTimestamp" : "755144873", + "parentDifficulty" : "1351185984", + "currentTimestamp" : "755144884", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521100948342638" + }, + + "DifficultyTest1602" : { + "parentTimestamp" : "1830986980", + "parentDifficulty" : "1099297994", + "currentTimestamp" : "1830986991", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200292828552" + }, + + "DifficultyTest1603" : { + "parentTimestamp" : "614913272", + "parentDifficulty" : "373108529", + "currentTimestamp" : "614913283", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398759278294" + }, + + "DifficultyTest1604" : { + "parentTimestamp" : "1613315055", + "parentDifficulty" : "1042746288", + "currentTimestamp" : "1613315066", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084399429243025" + }, + + "DifficultyTest1605" : { + "parentTimestamp" : "597314378", + "parentDifficulty" : "440635007", + "currentTimestamp" : "597314389", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797212825328" + }, + + "DifficultyTest1607" : { + "parentTimestamp" : "222116245", + "parentDifficulty" : "644826784", + "currentTimestamp" : "222116256", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675187733042312" + }, + + "DifficultyTest1608" : { + "parentTimestamp" : "1553656719", + "parentDifficulty" : "282863665", + "currentTimestamp" : "1553656730", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675187370902454" + }, + + "DifficultyTest1610" : { + "parentTimestamp" : "382218928", + "parentDifficulty" : "1057528204", + "currentTimestamp" : "382218940", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1058044575" + }, + + "DifficultyTest1612" : { + "parentTimestamp" : "954203621", + "parentDifficulty" : "523266704", + "currentTimestamp" : "954203633", + "currentBlockNumber" : "225001", + "currentDifficulty" : "523522206" + }, + + "DifficultyTest1613" : { + "parentTimestamp" : "2119801041", + "parentDifficulty" : "1250460140", + "currentTimestamp" : "2119801053", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1251070718" + }, + + "DifficultyTest1614" : { + "parentTimestamp" : "273418770", + "parentDifficulty" : "696394552", + "currentTimestamp" : "273418782", + "currentBlockNumber" : "375001", + "currentDifficulty" : "696734590" + }, + + "DifficultyTest1619" : { + "parentTimestamp" : "830153403", + "parentDifficulty" : "27171611", + "currentTimestamp" : "830153415", + "currentBlockNumber" : "750001", + "currentDifficulty" : "27184910" + }, + + "DifficultyTest1620" : { + "parentTimestamp" : "632255905", + "parentDifficulty" : "1583872509", + "currentTimestamp" : "632255917", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1584645948" + }, + + "DifficultyTest1622" : { + "parentTimestamp" : "1922525369", + "parentDifficulty" : "279711461", + "currentTimestamp" : "1922525381", + "currentBlockNumber" : "975001", + "currentDifficulty" : "279848166" + }, + + "DifficultyTest1626" : { + "parentTimestamp" : "1237768918", + "parentDifficulty" : "975772096", + "currentTimestamp" : "1237768930", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "976249571" + }, + + "DifficultyTest1633" : { + "parentTimestamp" : "2084578321", + "parentDifficulty" : "670805974", + "currentTimestamp" : "2084578333", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "671199051" + }, + + "DifficultyTest1634" : { + "parentTimestamp" : "1801763260", + "parentDifficulty" : "1863885176", + "currentTimestamp" : "1801763272", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "1864860812" + }, + + "DifficultyTest1637" : { + "parentTimestamp" : "273168059", + "parentDifficulty" : "1237027591", + "currentTimestamp" : "273168071", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1238155896" + }, + + "DifficultyTest1641" : { + "parentTimestamp" : "1205465810", + "parentDifficulty" : "1036299486", + "currentTimestamp" : "1205465822", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1040999795" + }, + + "DifficultyTest1642" : { + "parentTimestamp" : "1126450583", + "parentDifficulty" : "626385428", + "currentTimestamp" : "1126450595", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "630885584" + }, + + "DifficultyTest1643" : { + "parentTimestamp" : "855721884", + "parentDifficulty" : "1218752744", + "currentTimestamp" : "855721896", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1227736446" + }, + + "DifficultyTest1647" : { + "parentTimestamp" : "1318055578", + "parentDifficulty" : "1148222506", + "currentTimestamp" : "1318055590", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1215892025" + }, + + "DifficultyTest1651" : { + "parentTimestamp" : "1924810134", + "parentDifficulty" : "1503841120", + "currentTimestamp" : "1924810146", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "2041446329" + }, + + "DifficultyTest1654" : { + "parentTimestamp" : "551386580", + "parentDifficulty" : "799522762", + "currentTimestamp" : "551386592", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "2947396801" + }, + + "DifficultyTest1656" : { + "parentTimestamp" : "223506213", + "parentDifficulty" : "440466965", + "currentTimestamp" : "223506225", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9030616628" + }, + + "DifficultyTest1658" : { + "parentTimestamp" : "1148592739", + "parentDifficulty" : "749084888", + "currentTimestamp" : "1148592751", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "17929319836" + }, + + "DifficultyTest1660" : { + "parentTimestamp" : "403991560", + "parentDifficulty" : "1004305648", + "currentTimestamp" : "403991572", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69724272767" + }, + + "DifficultyTest1661" : { + "parentTimestamp" : "525960102", + "parentDifficulty" : "1856269936", + "currentTimestamp" : "525960114", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "139296129789" + }, + + "DifficultyTest1662" : { + "parentTimestamp" : "967200167", + "parentDifficulty" : "492219456", + "currentTimestamp" : "967200179", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "137931413269" + }, + + "DifficultyTest1667" : { + "parentTimestamp" : "432120264", + "parentDifficulty" : "391695992", + "currentTimestamp" : "432120276", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199415142801" + }, + + "DifficultyTest1668" : { + "parentTimestamp" : "733432471", + "parentDifficulty" : "1484696792", + "currentTimestamp" : "733432483", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399531932845" + }, + + "DifficultyTest1669" : { + "parentTimestamp" : "9661308", + "parentDifficulty" : "1458035958", + "currentTimestamp" : "9661320", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797551770097" + }, + + "DifficultyTest1673" : { + "parentTimestamp" : "711402076", + "parentDifficulty" : "909600402", + "currentTimestamp" : "711402088", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70369654222206" + }, + + "DifficultyTest1676" : { + "parentTimestamp" : "980101556", + "parentDifficulty" : "442972495", + "currentTimestamp" : "980101568", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475419899446" + }, + + "DifficultyTest1679" : { + "parentTimestamp" : "468560958", + "parentDifficulty" : "1052092326", + "currentTimestamp" : "468560970", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900959448666" + }, + + "DifficultyTest1680" : { + "parentTimestamp" : "583272362", + "parentDifficulty" : "304885690", + "currentTimestamp" : "583272374", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800118719807" + }, + + "DifficultyTest1684" : { + "parentTimestamp" : "1966088024", + "parentDifficulty" : "1947363863", + "currentTimestamp" : "1966088036", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014400457796708" + }, + + "DifficultyTest1685" : { + "parentTimestamp" : "1491721145", + "parentDifficulty" : "1173025775", + "currentTimestamp" : "1491721157", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798192562509" + }, + + "DifficultyTest1692" : { + "parentTimestamp" : "287811250", + "parentDifficulty" : "1176925728", + "currentTimestamp" : "287811262", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921505784347374" + }, + + "DifficultyTest1693" : { + "parentTimestamp" : "771093472", + "parentDifficulty" : "1431855164", + "currentTimestamp" : "771093484", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010646248264" + }, + + "DifficultyTest1694" : { + "parentTimestamp" : "684054770", + "parentDifficulty" : "214154524", + "currentTimestamp" : "684054782", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843009427953043" + }, + + "DifficultyTest1696" : { + "parentTimestamp" : "918531412", + "parentDifficulty" : "1300404259", + "currentTimestamp" : "918531424", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038155815030" + }, + + "DifficultyTest1697" : { + "parentTimestamp" : "1606284015", + "parentDifficulty" : "2004652864", + "currentTimestamp" : "1606284027", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075715183314" + }, + + "DifficultyTest1703" : { + "parentTimestamp" : "1461409359", + "parentDifficulty" : "792481958", + "currentTimestamp" : "1461409371", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905180145694768" + }, + + "DifficultyTest1704" : { + "parentTimestamp" : "581874402", + "parentDifficulty" : "1760353840", + "currentTimestamp" : "581874414", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810360466865099" + }, + + "DifficultyTest1705" : { + "parentTimestamp" : "1385215842", + "parentDifficulty" : "1495034479", + "currentTimestamp" : "1385215854", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718907067900" + }, + + "DifficultyTest1707" : { + "parentTimestamp" : "102878003", + "parentDifficulty" : "762484560", + "currentTimestamp" : "102878015", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241435585463714" + }, + + "DifficultyTest1708" : { + "parentTimestamp" : "626997079", + "parentDifficulty" : "1965447551", + "currentTimestamp" : "626997091", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871611620938" + }, + + "DifficultyTest1710" : { + "parentTimestamp" : "2065930354", + "parentDifficulty" : "594824696", + "currentTimestamp" : "2065930366", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739885542529" + }, + + "DifficultyTest1712" : { + "parentTimestamp" : "1461138228", + "parentDifficulty" : "1830795396", + "currentTimestamp" : "1461138240", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958993398907" + }, + + "DifficultyTest1713" : { + "parentTimestamp" : "47129465", + "parentDifficulty" : "996225344", + "currentTimestamp" : "47129477", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915320130918" + }, + + "DifficultyTest1714" : { + "parentTimestamp" : "1371112241", + "parentDifficulty" : "993001129", + "currentTimestamp" : "1371112253", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725915316905128" + }, + + "DifficultyTest1715" : { + "parentTimestamp" : "1563844241", + "parentDifficulty" : "2038775928", + "currentTimestamp" : "1563844253", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451830686609696" + }, + + "DifficultyTest1716" : { + "parentTimestamp" : "1030922835", + "parentDifficulty" : "1047561624", + "currentTimestamp" : "1030922847", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658341749672" + }, + + "DifficultyTest1717" : { + "parentTimestamp" : "170084386", + "parentDifficulty" : "617324596", + "currentTimestamp" : "170084398", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807315204979112" + }, + + "DifficultyTest1718" : { + "parentTimestamp" : "952317856", + "parentDifficulty" : "1593061466", + "currentTimestamp" : "952317868", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316181192416" + }, + + "DifficultyTest1719" : { + "parentTimestamp" : "330082255", + "parentDifficulty" : "579630008", + "currentTimestamp" : "330082267", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629754619206" + }, + + "DifficultyTest1721" : { + "parentTimestamp" : "111134611", + "parentDifficulty" : "452190272", + "currentTimestamp" : "111134623", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458517151235772" + }, + + "DifficultyTest1722" : { + "parentTimestamp" : "145343389", + "parentDifficulty" : "661018385", + "currentTimestamp" : "145343401", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517360165851" + }, + + "DifficultyTest1724" : { + "parentTimestamp" : "2026247164", + "parentDifficulty" : "1765786325", + "currentTimestamp" : "2026247176", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068561947341" + }, + + "DifficultyTest1728" : { + "parentTimestamp" : "1804410418", + "parentDifficulty" : "718768044", + "currentTimestamp" : "1804410430", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672535081509532" + }, + + "DifficultyTest1729" : { + "parentTimestamp" : "733015402", + "parentDifficulty" : "1995078921", + "currentTimestamp" : "733015414", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345070720834136" + }, + + "DifficultyTest1731" : { + "parentTimestamp" : "224127822", + "parentDifficulty" : "499683700", + "currentTimestamp" : "224127834", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690137949489798" + }, + + "DifficultyTest1732" : { + "parentTimestamp" : "1309479217", + "parentDifficulty" : "1165287536", + "currentTimestamp" : "1309479229", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276064980748" + }, + + "DifficultyTest1733" : { + "parentTimestamp" : "1569087858", + "parentDifficulty" : "1593761866", + "currentTimestamp" : "1569087870", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551392788518" + }, + + "DifficultyTest1739" : { + "parentTimestamp" : "1035457883", + "parentDifficulty" : "1828852822", + "currentTimestamp" : "1035457895", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798601720984" + }, + + "DifficultyTest1741" : { + "parentTimestamp" : "444278730", + "parentDifficulty" : "16227026", + "currentTimestamp" : "444278742", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675187104135621" + }, + + "DifficultyTest1747" : { + "parentTimestamp" : "813575250", + "parentDifficulty" : "1091520738", + "currentTimestamp" : "813575263", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1090987771" + }, + + "DifficultyTest1748" : { + "parentTimestamp" : "1490564899", + "parentDifficulty" : "1604070340", + "currentTimestamp" : "1490564912", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1603287105" + }, + + "DifficultyTest1750" : { + "parentTimestamp" : "1793273421", + "parentDifficulty" : "455767456", + "currentTimestamp" : "1793273434", + "currentBlockNumber" : "525001", + "currentDifficulty" : "455544922" + }, + + "DifficultyTest1756" : { + "parentTimestamp" : "1216539604", + "parentDifficulty" : "1708625373", + "currentTimestamp" : "1216539617", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1707791212" + }, + + "DifficultyTest1757" : { + "parentTimestamp" : "1144202615", + "parentDifficulty" : "593209231", + "currentTimestamp" : "1144202628", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "592919835" + }, + + "DifficultyTest1758" : { + "parentTimestamp" : "856963293", + "parentDifficulty" : "761182656", + "currentTimestamp" : "856963306", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "760811497" + }, + + "DifficultyTest1759" : { + "parentTimestamp" : "541300202", + "parentDifficulty" : "1307410012", + "currentTimestamp" : "541300215", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "1306772653" + }, + + "DifficultyTest1761" : { + "parentTimestamp" : "360651129", + "parentDifficulty" : "1984402634", + "currentTimestamp" : "360651142", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "1983435736" + }, + + "DifficultyTest1762" : { + "parentTimestamp" : "1262498400", + "parentDifficulty" : "9681744", + "currentTimestamp" : "1262498413", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "9681113" + }, + + "DifficultyTest1763" : { + "parentTimestamp" : "1861770271", + "parentDifficulty" : "1739024877", + "currentTimestamp" : "1861770284", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "1738183936" + }, + + "DifficultyTest1767" : { + "parentTimestamp" : "341644657", + "parentDifficulty" : "405383128", + "currentTimestamp" : "341644670", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "405250724" + }, + + "DifficultyTest1768" : { + "parentTimestamp" : "1702364242", + "parentDifficulty" : "2033873149", + "currentTimestamp" : "1702364255", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "2032945583" + }, + + "DifficultyTest1769" : { + "parentTimestamp" : "278415166", + "parentDifficulty" : "768158256", + "currentTimestamp" : "278415179", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "767914251" + }, + + "DifficultyTest1770" : { + "parentTimestamp" : "1976238633", + "parentDifficulty" : "662402742", + "currentTimestamp" : "1976238646", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "662341448" + }, + + "DifficultyTest1773" : { + "parentTimestamp" : "1522814496", + "parentDifficulty" : "1944793072", + "currentTimestamp" : "1522814509", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "1944892043" + }, + + "DifficultyTest1774" : { + "parentTimestamp" : "1175253977", + "parentDifficulty" : "329843424", + "currentTimestamp" : "1175253990", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "331779520" + }, + + "DifficultyTest1775" : { + "parentTimestamp" : "2038247928", + "parentDifficulty" : "1858981016", + "currentTimestamp" : "2038247941", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1862267615" + }, + + "DifficultyTest1776" : { + "parentTimestamp" : "2125540614", + "parentDifficulty" : "61863313", + "currentTimestamp" : "2125540627", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "66027411" + }, + + "DifficultyTest1777" : { + "parentTimestamp" : "1724364114", + "parentDifficulty" : "1550348512", + "currentTimestamp" : "1724364127", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1557980114" + }, + + "DifficultyTest1778" : { + "parentTimestamp" : "937333219", + "parentDifficulty" : "1830139589", + "currentTimestamp" : "937333232", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1846023183" + }, + + "DifficultyTest1779" : { + "parentTimestamp" : "106227960", + "parentDifficulty" : "1857178048", + "currentTimestamp" : "106227973", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "1889825655" + }, + + "DifficultyTest1780" : { + "parentTimestamp" : "1748933669", + "parentDifficulty" : "384704256", + "currentTimestamp" : "1748933682", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "418070845" + }, + + "DifficultyTest1784" : { + "parentTimestamp" : "1293582942", + "parentDifficulty" : "94889668", + "currentTimestamp" : "1293582955", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "363278792" + }, + + "DifficultyTest1786" : { + "parentTimestamp" : "870017804", + "parentDifficulty" : "453645726", + "currentTimestamp" : "870017817", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1527166044" + }, + + "DifficultyTest1787" : { + "parentTimestamp" : "146973838", + "parentDifficulty" : "528849588", + "currentTimestamp" : "146973851", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "2676075009" + }, + + "DifficultyTest1791" : { + "parentTimestamp" : "441581375", + "parentDifficulty" : "74920482", + "currentTimestamp" : "441581388", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "17254753084" + }, + + "DifficultyTest1792" : { + "parentTimestamp" : "1596515732", + "parentDifficulty" : "1147895184", + "currentTimestamp" : "1596515745", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "18327203873" + }, + + "DifficultyTest1795" : { + "parentTimestamp" : "288493348", + "parentDifficulty" : "1413334382", + "currentTimestamp" : "288493361", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "138851597750" + }, + + "DifficultyTest1796" : { + "parentTimestamp" : "410781425", + "parentDifficulty" : "755118208", + "currentTimestamp" : "410781438", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "138193702970" + }, + + "DifficultyTest1797" : { + "parentTimestamp" : "2092922073", + "parentDifficulty" : "1927194020", + "currentTimestamp" : "2092922086", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "276804159952" + }, + + "DifficultyTest1798" : { + "parentTimestamp" : "1875342223", + "parentDifficulty" : "1394599671", + "currentTimestamp" : "1875342236", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "551149732603" + }, + + "DifficultyTest1801" : { + "parentTimestamp" : "1504823545", + "parentDifficulty" : "1346789382", + "currentTimestamp" : "1504823558", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2200369387322" + }, + + "DifficultyTest1802" : { + "parentTimestamp" : "175823123", + "parentDifficulty" : "1843404424", + "currentTimestamp" : "175823136", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399889015429" + }, + + "DifficultyTest1804" : { + "parentTimestamp" : "1655584505", + "parentDifficulty" : "1336235650", + "currentTimestamp" : "1655584518", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797428605400" + }, + + "DifficultyTest1808" : { + "parentTimestamp" : "2008779064", + "parentDifficulty" : "1636727860", + "currentTimestamp" : "2008779077", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370380106341" + }, + + "DifficultyTest1809" : { + "parentTimestamp" : "421392311", + "parentDifficulty" : "1007907481", + "currentTimestamp" : "421392324", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140738495770667" + }, + + "DifficultyTest1815" : { + "parentTimestamp" : "11831244", + "parentDifficulty" : "1634755527", + "currentTimestamp" : "11831257", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601261327803" + }, + + "DifficultyTest1817" : { + "parentTimestamp" : "610125718", + "parentDifficulty" : "209880785", + "currentTimestamp" : "610125731", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199464519297" + }, + + "DifficultyTest1821" : { + "parentTimestamp" : "2104046593", + "parentDifficulty" : "975164101", + "currentTimestamp" : "2104046606", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595012615883" + }, + + "DifficultyTest1823" : { + "parentTimestamp" : "80363807", + "parentDifficulty" : "665541738", + "currentTimestamp" : "80363820", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230376816928511" + }, + + "DifficultyTest1824" : { + "parentTimestamp" : "254797261", + "parentDifficulty" : "537441392", + "currentTimestamp" : "254797274", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376688890714" + }, + + "DifficultyTest1827" : { + "parentTimestamp" : "1365909244", + "parentDifficulty" : "1335865168", + "currentTimestamp" : "1365909257", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010548906843" + }, + + "DifficultyTest1829" : { + "parentTimestamp" : "968229734", + "parentDifficulty" : "1487998457", + "currentTimestamp" : "968229747", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019914659800" + }, + + "DifficultyTest1831" : { + "parentTimestamp" : "509435517", + "parentDifficulty" : "1312712524", + "currentTimestamp" : "509435530", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075021623168" + }, + + "DifficultyTest1835" : { + "parentTimestamp" : "250496374", + "parentDifficulty" : "1328901788", + "currentTimestamp" : "250496387", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952591004665839" + }, + + "DifficultyTest1837" : { + "parentTimestamp" : "133716994", + "parentDifficulty" : "1137372046", + "currentTimestamp" : "133717007", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905180489642545" + }, + + "DifficultyTest1841" : { + "parentTimestamp" : "1918071064", + "parentDifficulty" : "1945761148", + "currentTimestamp" : "1918071077", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436767417918" + }, + + "DifficultyTest1842" : { + "parentTimestamp" : "1562349844", + "parentDifficulty" : "1202147831", + "currentTimestamp" : "1562349857", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482870846774541" + }, + + "DifficultyTest1843" : { + "parentTimestamp" : "24665906", + "parentDifficulty" : "672492204", + "currentTimestamp" : "24665919", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965739962591231" + }, + + "DifficultyTest1846" : { + "parentTimestamp" : "309920016", + "parentDifficulty" : "1160195856", + "currentTimestamp" : "309920029", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958321338923" + }, + + "DifficultyTest1847" : { + "parentTimestamp" : "471209175", + "parentDifficulty" : "1843668391", + "currentTimestamp" : "471209188", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725916166187299" + }, + + "DifficultyTest1848" : { + "parentTimestamp" : "1800785881", + "parentDifficulty" : "344899712", + "currentTimestamp" : "1800785894", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725914668150440" + }, + + "DifficultyTest1849" : { + "parentTimestamp" : "403834458", + "parentDifficulty" : "1649364348", + "currentTimestamp" : "403834471", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451830295397267" + }, + + "DifficultyTest1851" : { + "parentTimestamp" : "390394875", + "parentDifficulty" : "825257948", + "currentTimestamp" : "390394888", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807315412208079" + }, + + "DifficultyTest1853" : { + "parentTimestamp" : "2088430254", + "parentDifficulty" : "1031485824", + "currentTimestamp" : "2088430267", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614630205688345" + }, + + "DifficultyTest1855" : { + "parentTimestamp" : "1064338915", + "parentDifficulty" : "1951602848", + "currentTimestamp" : "1064338928", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458518649474621" + }, + + "DifficultyTest1856" : { + "parentTimestamp" : "1848907742", + "parentDifficulty" : "1819260497", + "currentTimestamp" : "1848907755", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458518517196891" + }, + + "DifficultyTest1861" : { + "parentTimestamp" : "502566431", + "parentDifficulty" : "884194114", + "currentTimestamp" : "502566444", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336268064957643" + }, + + "DifficultyTest1863" : { + "parentTimestamp" : "414903995", + "parentDifficulty" : "808262383", + "currentTimestamp" : "414904008", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069532648780" + }, + + "DifficultyTest1867" : { + "parentTimestamp" : "1726827280", + "parentDifficulty" : "709397038", + "currentTimestamp" : "1726827293", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550507299101" + }, + + "DifficultyTest1869" : { + "parentTimestamp" : "1643968527", + "parentDifficulty" : "1430824044", + "currentTimestamp" : "1643968540", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101026622296" + }, + + "DifficultyTest1871" : { + "parentTimestamp" : "2061462249", + "parentDifficulty" : "1352164832", + "currentTimestamp" : "2061462262", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084399737492180" + }, + + "DifficultyTest1872" : { + "parentTimestamp" : "781537584", + "parentDifficulty" : "1220175692", + "currentTimestamp" : "781537597", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084399605567488" + }, + + "DifficultyTest1873" : { + "parentTimestamp" : "1065250194", + "parentDifficulty" : "159125570", + "currentTimestamp" : "1065250207", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168796931023040" + }, + + "DifficultyTest1874" : { + "parentTimestamp" : "1487511409", + "parentDifficulty" : "1874729604", + "currentTimestamp" : "1487511422", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337595417764545" + }, + + "DifficultyTest1876" : { + "parentTimestamp" : "1371578776", + "parentDifficulty" : "1803922159", + "currentTimestamp" : "1371578789", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188890942010" + }, + + "DifficultyTest1881" : { + "parentTimestamp" : "750913992", + "parentDifficulty" : "972997254", + "currentTimestamp" : "750914006", + "currentBlockNumber" : "300001", + "currentDifficulty" : "972522160" + }, + + "DifficultyTest1882" : { + "parentTimestamp" : "1698347500", + "parentDifficulty" : "2119344091", + "currentTimestamp" : "1698347514", + "currentBlockNumber" : "375001", + "currentDifficulty" : "2118309258" + }, + + "DifficultyTest1883" : { + "parentTimestamp" : "1251102882", + "parentDifficulty" : "78646564", + "currentTimestamp" : "1251102896", + "currentBlockNumber" : "450001", + "currentDifficulty" : "78608167" + }, + + "DifficultyTest1885" : { + "parentTimestamp" : "1417955946", + "parentDifficulty" : "1207584608", + "currentTimestamp" : "1417955960", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1206994984" + }, + + "DifficultyTest1888" : { + "parentTimestamp" : "1768907490", + "parentDifficulty" : "1298701926", + "currentTimestamp" : "1768907504", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1298067859" + }, + + "DifficultyTest1889" : { + "parentTimestamp" : "912050230", + "parentDifficulty" : "1438670776", + "currentTimestamp" : "912050244", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1437968429" + }, + + "DifficultyTest1890" : { + "parentTimestamp" : "547521668", + "parentDifficulty" : "293344716", + "currentTimestamp" : "547521682", + "currentBlockNumber" : "975001", + "currentDifficulty" : "293201610" + }, + + "DifficultyTest1892" : { + "parentTimestamp" : "69264795", + "parentDifficulty" : "1026674586", + "currentTimestamp" : "69264809", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1026173793" + }, + + "DifficultyTest1893" : { + "parentTimestamp" : "2102020759", + "parentDifficulty" : "152817837", + "currentTimestamp" : "2102020773", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "152744243" + }, + + "DifficultyTest1894" : { + "parentTimestamp" : "159489736", + "parentDifficulty" : "1614958522", + "currentTimestamp" : "159489750", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "1614170993" + }, + + "DifficultyTest1898" : { + "parentTimestamp" : "1800962699", + "parentDifficulty" : "582448234", + "currentTimestamp" : "1800962713", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "582172028" + }, + + "DifficultyTest1899" : { + "parentTimestamp" : "695033466", + "parentDifficulty" : "109662188", + "currentTimestamp" : "695033480", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "109625027" + }, + + "DifficultyTest1900" : { + "parentTimestamp" : "1871067502", + "parentDifficulty" : "716493422", + "currentTimestamp" : "1871067516", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "716176340" + }, + + "DifficultyTest1905" : { + "parentTimestamp" : "159049797", + "parentDifficulty" : "1900811549", + "currentTimestamp" : "159049811", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1900407707" + }, + + "DifficultyTest1908" : { + "parentTimestamp" : "328221730", + "parentDifficulty" : "390623096", + "currentTimestamp" : "328221744", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "392529515" + }, + + "DifficultyTest1909" : { + "parentTimestamp" : "755029414", + "parentDifficulty" : "889155751", + "currentTimestamp" : "755029428", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "892915897" + }, + + "DifficultyTest1910" : { + "parentTimestamp" : "1697398307", + "parentDifficulty" : "1250817408", + "currentTimestamp" : "1697398321", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1254400962" + }, + + "DifficultyTest1911" : { + "parentTimestamp" : "1739638907", + "parentDifficulty" : "810726505", + "currentTimestamp" : "1739638921", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "818719251" + }, + + "DifficultyTest1912" : { + "parentTimestamp" : "758714235", + "parentDifficulty" : "1477867143", + "currentTimestamp" : "758714249", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1493922745" + }, + + "DifficultyTest1913" : { + "parentTimestamp" : "919416654", + "parentDifficulty" : "825538241", + "currentTimestamp" : "919416668", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "858689579" + }, + + "DifficultyTest1915" : { + "parentTimestamp" : "1505069437", + "parentDifficulty" : "748705000", + "currentTimestamp" : "1505069451", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "815448286" + }, + + "DifficultyTest1918" : { + "parentTimestamp" : "508619341", + "parentDifficulty" : "1885029512", + "currentTimestamp" : "508619355", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "2152544544" + }, + + "DifficultyTest1919" : { + "parentTimestamp" : "592522662", + "parentDifficulty" : "529316392", + "currentTimestamp" : "592522676", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "1065928849" + }, + + "DifficultyTest1922" : { + "parentTimestamp" : "1848548982", + "parentDifficulty" : "1807154968", + "currentTimestamp" : "1848548996", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "3953756217" + }, + + "DifficultyTest1924" : { + "parentTimestamp" : "359374486", + "parentDifficulty" : "539694607", + "currentTimestamp" : "359374500", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9129365677" + }, + + "DifficultyTest1926" : { + "parentTimestamp" : "1019818038", + "parentDifficulty" : "484347351", + "currentTimestamp" : "1019818052", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "17663980038" + }, + + "DifficultyTest1928" : { + "parentTimestamp" : "222161113", + "parentDifficulty" : "1221344880", + "currentTimestamp" : "222161127", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69940225257" + }, + + "DifficultyTest1930" : { + "parentTimestamp" : "202370890", + "parentDifficulty" : "2089172377", + "currentTimestamp" : "202370904", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "139527105746" + }, + + "DifficultyTest1932" : { + "parentTimestamp" : "1942245700", + "parentDifficulty" : "695070474", + "currentTimestamp" : "1942245714", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550450544973" + }, + + "DifficultyTest1934" : { + "parentTimestamp" : "407054920", + "parentDifficulty" : "1585231800", + "currentTimestamp" : "407054934", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1101096085538" + }, + + "DifficultyTest1935" : { + "parentTimestamp" : "1471650606", + "parentDifficulty" : "2015910108", + "currentTimestamp" : "1471650620", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2201038181329" + }, + + "DifficultyTest1936" : { + "parentTimestamp" : "2074489751", + "parentDifficulty" : "1440569376", + "currentTimestamp" : "2074489765", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399486377077" + }, + + "DifficultyTest1946" : { + "parentTimestamp" : "1688746490", + "parentDifficulty" : "1086942345", + "currentTimestamp" : "1688746504", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951039832924" + }, + + "DifficultyTest1948" : { + "parentTimestamp" : "1223584644", + "parentDifficulty" : "600155207", + "currentTimestamp" : "1223584658", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800413547411" + }, + + "DifficultyTest1949" : { + "parentTimestamp" : "766716302", + "parentDifficulty" : "1075210372", + "currentTimestamp" : "766716316", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600702055863" + }, + + "DifficultyTest1951" : { + "parentTimestamp" : "351714554", + "parentDifficulty" : "560043232", + "currentTimestamp" : "351714568", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199814510766" + }, + + "DifficultyTest1952" : { + "parentTimestamp" : "711823930", + "parentDifficulty" : "201761950", + "currentTimestamp" : "711823944", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014398711145418" + }, + + "DifficultyTest1954" : { + "parentTimestamp" : "767988789", + "parentDifficulty" : "581699353", + "currentTimestamp" : "767988803", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797600379289" + }, + + "DifficultyTest1955" : { + "parentTimestamp" : "555840515", + "parentDifficulty" : "1626039456", + "currentTimestamp" : "555840529", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595663173428" + }, + + "DifficultyTest1957" : { + "parentTimestamp" : "1569602360", + "parentDifficulty" : "66770408", + "currentTimestamp" : "1569602374", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230376218449550" + }, + + "DifficultyTest1959" : { + "parentTimestamp" : "927911066", + "parentDifficulty" : "1514743130", + "currentTimestamp" : "927911080", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753817426998" + }, + + "DifficultyTest1962" : { + "parentTimestamp" : "1769318603", + "parentDifficulty" : "884425004", + "currentTimestamp" : "1769318617", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843010097687108" + }, + + "DifficultyTest1964" : { + "parentTimestamp" : "1980615188", + "parentDifficulty" : "1576035146", + "currentTimestamp" : "1980615202", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038430041406" + }, + + "DifficultyTest1967" : { + "parentTimestamp" : "348346704", + "parentDifficulty" : "1470915704", + "currentTimestamp" : "348346718", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148889300716" + }, + + "DifficultyTest1968" : { + "parentTimestamp" : "581159827", + "parentDifficulty" : "1441808610", + "currentTimestamp" : "581159841", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296279311066" + }, + + "DifficultyTest1970" : { + "parentTimestamp" : "1820082664", + "parentDifficulty" : "305844564", + "currentTimestamp" : "1820082678", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952589982108154" + }, + + "DifficultyTest1979" : { + "parentTimestamp" : "2048368827", + "parentDifficulty" : "667427444", + "currentTimestamp" : "2048368841", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931479247956336" + }, + + "DifficultyTest1980" : { + "parentTimestamp" : "751591562", + "parentDifficulty" : "1395147649", + "currentTimestamp" : "751591576", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958556175993" + }, + + "DifficultyTest1984" : { + "parentTimestamp" : "1528875577", + "parentDifficulty" : "1983795184", + "currentTimestamp" : "1528875591", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903659276503079" + }, + + "DifficultyTest1987" : { + "parentTimestamp" : "1815819378", + "parentDifficulty" : "2122568604", + "currentTimestamp" : "1815819392", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614631296238370" + }, + + "DifficultyTest1988" : { + "parentTimestamp" : "1525942007", + "parentDifficulty" : "1415737934", + "currentTimestamp" : "1525942021", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229259764459008" + }, + + "DifficultyTest1989" : { + "parentTimestamp" : "1599433829", + "parentDifficulty" : "1778923556", + "currentTimestamp" : "1599433843", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458518476879645" + }, + + "DifficultyTest1992" : { + "parentTimestamp" : "1560804953", + "parentDifficulty" : "130277420", + "currentTimestamp" : "1560804967", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834066925512624" + }, + + "DifficultyTest1997" : { + "parentTimestamp" : "1654026584", + "parentDifficulty" : "1327727328", + "currentTimestamp" : "1654026598", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345070051860080" + }, + + "DifficultyTest1999" : { + "parentTimestamp" : "814702990", + "parentDifficulty" : "2029086771", + "currentTimestamp" : "814703004", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690139477658118" + }, + + "DifficultyTest2002" : { + "parentTimestamp" : "1327960275", + "parentDifficulty" : "720210955", + "currentTimestamp" : "1327960289", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760550518107738" + }, + + "DifficultyTest2003" : { + "parentTimestamp" : "1969894470", + "parentDifficulty" : "987231672", + "currentTimestamp" : "1969894484", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521100583246522" + }, + + "DifficultyTest2005" : { + "parentTimestamp" : "695343498", + "parentDifficulty" : "693460311", + "currentTimestamp" : "695343512", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084399079109292" + }, + + "DifficultyTest2007" : { + "parentTimestamp" : "1762348535", + "parentDifficulty" : "1841831072", + "currentTimestamp" : "1762348549", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798612906909" + }, + + "DifficultyTest2011" : { + "parentTimestamp" : "417792598", + "parentDifficulty" : "1609589498", + "currentTimestamp" : "417792613", + "currentBlockNumber" : "1", + "currentDifficulty" : "1608803566" + }, + + "DifficultyTest2012" : { + "parentTimestamp" : "1810031100", + "parentDifficulty" : "1599466120", + "currentTimestamp" : "1810031115", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1598685131" + }, + + "DifficultyTest2013" : { + "parentTimestamp" : "2131453100", + "parentDifficulty" : "1096402166", + "currentTimestamp" : "2131453115", + "currentBlockNumber" : "150001", + "currentDifficulty" : "1095866814" + }, + + "DifficultyTest2015" : { + "parentTimestamp" : "1355518721", + "parentDifficulty" : "1121429152", + "currentTimestamp" : "1355518736", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1120881582" + }, + + "DifficultyTest2016" : { + "parentTimestamp" : "398648840", + "parentDifficulty" : "1949793616", + "currentTimestamp" : "398648855", + "currentBlockNumber" : "375001", + "currentDifficulty" : "1948841571" + }, + + "DifficultyTest2017" : { + "parentTimestamp" : "281762348", + "parentDifficulty" : "1613269022", + "currentTimestamp" : "281762363", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1612481297" + }, + + "DifficultyTest2018" : { + "parentTimestamp" : "612911872", + "parentDifficulty" : "2071842877", + "currentTimestamp" : "612911887", + "currentBlockNumber" : "525001", + "currentDifficulty" : "2070831243" + }, + + "DifficultyTest2020" : { + "parentTimestamp" : "1919056528", + "parentDifficulty" : "1009948012", + "currentTimestamp" : "1919056543", + "currentBlockNumber" : "675001", + "currentDifficulty" : "1009454890" + }, + + "DifficultyTest2021" : { + "parentTimestamp" : "1018121159", + "parentDifficulty" : "947189248", + "currentTimestamp" : "1018121174", + "currentBlockNumber" : "750001", + "currentDifficulty" : "946726786" + }, + + "DifficultyTest2023" : { + "parentTimestamp" : "895487304", + "parentDifficulty" : "1352949280", + "currentTimestamp" : "895487319", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1352288789" + }, + + "DifficultyTest2025" : { + "parentTimestamp" : "1349856507", + "parentDifficulty" : "1384231676", + "currentTimestamp" : "1349856522", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1383556038" + }, + + "DifficultyTest2026" : { + "parentTimestamp" : "1704431746", + "parentDifficulty" : "1950799632", + "currentTimestamp" : "1704431761", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1949847606" + }, + + "DifficultyTest2027" : { + "parentTimestamp" : "1859892660", + "parentDifficulty" : "1997128261", + "currentTimestamp" : "1859892675", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "1996154125" + }, + + "DifficultyTest2033" : { + "parentTimestamp" : "218621788", + "parentDifficulty" : "495095612", + "currentTimestamp" : "218621803", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "494870251" + }, + + "DifficultyTest2034" : { + "parentTimestamp" : "794480274", + "parentDifficulty" : "1203745994", + "currentTimestamp" : "794480289", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1203190996" + }, + + "DifficultyTest2035" : { + "parentTimestamp" : "222208976", + "parentDifficulty" : "1207935466", + "currentTimestamp" : "222208991", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1207411190" + }, + + "DifficultyTest2037" : { + "parentTimestamp" : "1024105139", + "parentDifficulty" : "226722002", + "currentTimestamp" : "1024105154", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "226742370" + }, + + "DifficultyTest2045" : { + "parentTimestamp" : "649418999", + "parentDifficulty" : "1658113472", + "currentTimestamp" : "649419014", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1665692455" + }, + + "DifficultyTest2047" : { + "parentTimestamp" : "195556177", + "parentDifficulty" : "2132695478", + "currentTimestamp" : "195556192", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "2165208555" + }, + + "DifficultyTest2049" : { + "parentTimestamp" : "549320067", + "parentDifficulty" : "562827548", + "currentTimestamp" : "549320082", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "629661594" + }, + + "DifficultyTest2052" : { + "parentTimestamp" : "474784185", + "parentDifficulty" : "1557350874", + "currentTimestamp" : "474784200", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "1825025905" + }, + + "DifficultyTest2053" : { + "parentTimestamp" : "1891311965", + "parentDifficulty" : "445057294", + "currentTimestamp" : "1891311980", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "981710893" + }, + + "DifficultyTest2058" : { + "parentTimestamp" : "1420184559", + "parentDifficulty" : "1918419114", + "currentTimestamp" : "1420184574", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "10507416978" + }, + + "DifficultyTest2060" : { + "parentTimestamp" : "657495105", + "parentDifficulty" : "1920060734", + "currentTimestamp" : "657495120", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "19098992389" + }, + + "DifficultyTest2064" : { + "parentTimestamp" : "1784268030", + "parentDifficulty" : "2091198844", + "currentTimestamp" : "1784268045", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "139529131223" + }, + + "DifficultyTest2066" : { + "parentTimestamp" : "1942912633", + "parentDifficulty" : "2087695955", + "currentTimestamp" : "1942912648", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "551842490461" + }, + + "DifficultyTest2067" : { + "parentTimestamp" : "621633524", + "parentDifficulty" : "287386024", + "currentTimestamp" : "621633539", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1099798873475" + }, + + "DifficultyTest2068" : { + "parentTimestamp" : "647748664", + "parentDifficulty" : "54355280", + "currentTimestamp" : "647748679", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1099565956516" + }, + + "DifficultyTest2069" : { + "parentTimestamp" : "323702642", + "parentDifficulty" : "865739564", + "currentTimestamp" : "323702657", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199888572392" + }, + + "DifficultyTest2071" : { + "parentTimestamp" : "961429740", + "parentDifficulty" : "1758962953", + "currentTimestamp" : "961429755", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797851126293" + }, + + "DifficultyTest2072" : { + "parentTimestamp" : "487297749", + "parentDifficulty" : "96662249", + "currentTimestamp" : "487297764", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8796189637259" + }, + + "DifficultyTest2073" : { + "parentTimestamp" : "1644630047", + "parentDifficulty" : "290680525", + "currentTimestamp" : "1644630062", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592476583008" + }, + + "DifficultyTest2076" : { + "parentTimestamp" : "539401628", + "parentDifficulty" : "639779594", + "currentTimestamp" : "539401643", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369383644866" + }, + + "DifficultyTest2077" : { + "parentTimestamp" : "308506111", + "parentDifficulty" : "717183544", + "currentTimestamp" : "308506126", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140738205188685" + }, + + "DifficultyTest2082" : { + "parentTimestamp" : "2055044041", + "parentDifficulty" : "823833371", + "currentTimestamp" : "2055044056", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800637116357" + }, + + "DifficultyTest2083" : { + "parentTimestamp" : "105340880", + "parentDifficulty" : "1862340560", + "currentTimestamp" : "105340895", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601488801711" + }, + + "DifficultyTest2086" : { + "parentTimestamp" : "31000425", + "parentDifficulty" : "495826799", + "currentTimestamp" : "31000440", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399005066681" + }, + + "DifficultyTest2089" : { + "parentTimestamp" : "1172350819", + "parentDifficulty" : "1918433489", + "currentTimestamp" : "1172350834", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595955424690" + }, + + "DifficultyTest2090" : { + "parentTimestamp" : "1319023191", + "parentDifficulty" : "2114903354", + "currentTimestamp" : "1319023206", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115190189726559" + }, + + "DifficultyTest2091" : { + "parentTimestamp" : "892625072", + "parentDifficulty" : "1607366952", + "currentTimestamp" : "892625087", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377758293849" + }, + + "DifficultyTest2092" : { + "parentTimestamp" : "444401725", + "parentDifficulty" : "439715408", + "currentTimestamp" : "444401740", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376591212448" + }, + + "DifficultyTest2093" : { + "parentTimestamp" : "198593380", + "parentDifficulty" : "1321482673", + "currentTimestamp" : "198593395", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753624260906" + }, + + "DifficultyTest2094" : { + "parentTimestamp" : "800689702", + "parentDifficulty" : "362672304", + "currentTimestamp" : "800689717", + "currentBlockNumber" : "6225001", + "currentDifficulty" : "1152921504969342194" + }, + + "DifficultyTest2095" : { + "parentTimestamp" : "1748740933", + "parentDifficulty" : "1517918738", + "currentTimestamp" : "1748740948", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010730871519" + }, + + "DifficultyTest2097" : { + "parentTimestamp" : "1808565250", + "parentDifficulty" : "1803744470", + "currentTimestamp" : "1808565265", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686020230251640" + }, + + "DifficultyTest2099" : { + "parentTimestamp" : "1727456599", + "parentDifficulty" : "363965032", + "currentTimestamp" : "1727456614", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074073338931" + }, + + "DifficultyTest2100" : { + "parentTimestamp" : "584607067", + "parentDifficulty" : "808204224", + "currentTimestamp" : "584607082", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074517361210" + }, + + "DifficultyTest2102" : { + "parentTimestamp" : "740262989", + "parentDifficulty" : "708466642", + "currentTimestamp" : "740263004", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976295546327176" + }, + + "DifficultyTest2106" : { + "parentTimestamp" : "1244643540", + "parentDifficulty" : "304337344", + "currentTimestamp" : "1244643555", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810359009840454" + }, + + "DifficultyTest2107" : { + "parentTimestamp" : "401649458", + "parentDifficulty" : "2045700306", + "currentTimestamp" : "401649473", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620719456004853" + }, + + "DifficultyTest2109" : { + "parentTimestamp" : "1955661608", + "parentDifficulty" : "615659042", + "currentTimestamp" : "1955661623", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241435437965276" + }, + + "DifficultyTest2110" : { + "parentTimestamp" : "892750167", + "parentDifficulty" : "200827562", + "currentTimestamp" : "892750182", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482869845943198" + }, + + "DifficultyTest2112" : { + "parentTimestamp" : "611742821", + "parentDifficulty" : "2013002536", + "currentTimestamp" : "611742836", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965741302447017" + }, + + "DifficultyTest2113" : { + "parentTimestamp" : "131175816", + "parentDifficulty" : "1496395344", + "currentTimestamp" : "131175831", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480076519467" + }, + + "DifficultyTest2114" : { + "parentTimestamp" : "301680072", + "parentDifficulty" : "2137191439", + "currentTimestamp" : "301680087", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862959297857457" + }, + + "DifficultyTest2115" : { + "parentTimestamp" : "2012879243", + "parentDifficulty" : "1087251207", + "currentTimestamp" : "2012879258", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915410139459" + }, + + "DifficultyTest2116" : { + "parentTimestamp" : "1575445408", + "parentDifficulty" : "623766236", + "currentTimestamp" : "1575445423", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725914946880799" + }, + + "DifficultyTest2118" : { + "parentTimestamp" : "1037871816", + "parentDifficulty" : "1913191927", + "currentTimestamp" : "1037871831", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903659205934296" + }, + + "DifficultyTest2119" : { + "parentTimestamp" : "1391546113", + "parentDifficulty" : "40031946", + "currentTimestamp" : "1391546128", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807314627365488" + }, + + "DifficultyTest2122" : { + "parentTimestamp" : "1642645620", + "parentDifficulty" : "50078843", + "currentTimestamp" : "1642645635", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229258399466743" + }, + + "DifficultyTest2126" : { + "parentTimestamp" : "1849286969", + "parentDifficulty" : "1871143852", + "currentTimestamp" : "1849286984", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068665529024" + }, + + "DifficultyTest2129" : { + "parentTimestamp" : "1405761178", + "parentDifficulty" : "480555587", + "currentTimestamp" : "1405761193", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336267661516205" + }, + + "DifficultyTest2132" : { + "parentTimestamp" : "127682949", + "parentDifficulty" : "76172974", + "currentTimestamp" : "127682964", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068800916837" + }, + + "DifficultyTest2133" : { + "parentTimestamp" : "338921621", + "parentDifficulty" : "90781209", + "currentTimestamp" : "338921636", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690137540298995" + }, + + "DifficultyTest2134" : { + "parentTimestamp" : "1262153786", + "parentDifficulty" : "1779015532", + "currentTimestamp" : "1262153801", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276677271097" + }, + + "DifficultyTest2138" : { + "parentTimestamp" : "526933517", + "parentDifficulty" : "188804024", + "currentTimestamp" : "526933532", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042199381705627" + }, + + "DifficultyTest2139" : { + "parentTimestamp" : "732720200", + "parentDifficulty" : "355361696", + "currentTimestamp" : "732720215", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398741175764" + }, + + "DifficultyTest2140" : { + "parentTimestamp" : "467465722", + "parentDifficulty" : "27737136", + "currentTimestamp" : "467465737", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084398413711177" + }, + + "DifficultyTest2141" : { + "parentTimestamp" : "1024042424", + "parentDifficulty" : "524882088", + "currentTimestamp" : "1024042439", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797296600966" + }, + + "DifficultyTest2142" : { + "parentTimestamp" : "1564827500", + "parentDifficulty" : "1411070684", + "currentTimestamp" : "1564827515", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594954332021" + }, + + "DifficultyTest2143" : { + "parentTimestamp" : "305395647", + "parentDifficulty" : "1620409676", + "currentTimestamp" : "305395662", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675188707519133" + }, + + "DifficultyTest2144" : { + "parentTimestamp" : "1450159722", + "parentDifficulty" : "708571004", + "currentTimestamp" : "1450159737", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675187796125695" + }, + + "DifficultyTest2145" : { + "parentTimestamp" : "1203518873", + "parentDifficulty" : "652578068", + "currentTimestamp" : "1203518889", + "currentBlockNumber" : "1", + "currentDifficulty" : "652259427" + }, + + "DifficultyTest2146" : { + "parentTimestamp" : "1082912764", + "parentDifficulty" : "1086542100", + "currentTimestamp" : "1082912780", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1086011562" + }, + + "DifficultyTest2151" : { + "parentTimestamp" : "78371974", + "parentDifficulty" : "1191974752", + "currentTimestamp" : "78371990", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1191392738" + }, + + "DifficultyTest2157" : { + "parentTimestamp" : "2043258735", + "parentDifficulty" : "1044419932", + "currentTimestamp" : "2043258751", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1043910090" + }, + + "DifficultyTest2158" : { + "parentTimestamp" : "314764983", + "parentDifficulty" : "84075424", + "currentTimestamp" : "314764999", + "currentBlockNumber" : "975001", + "currentDifficulty" : "84034500" + }, + + "DifficultyTest2159" : { + "parentTimestamp" : "272706463", + "parentDifficulty" : "1889232749", + "currentTimestamp" : "272706479", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1888310529" + }, + + "DifficultyTest2160" : { + "parentTimestamp" : "20777917", + "parentDifficulty" : "1540936687", + "currentTimestamp" : "20777933", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1540184789" + }, + + "DifficultyTest2162" : { + "parentTimestamp" : "1203316232", + "parentDifficulty" : "134467136", + "currentTimestamp" : "1203316248", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "134402503" + }, + + "DifficultyTest2165" : { + "parentTimestamp" : "1109038508", + "parentDifficulty" : "1100064810", + "currentTimestamp" : "1109038524", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "1099535861" + }, + + "DifficultyTest2166" : { + "parentTimestamp" : "1989536402", + "parentDifficulty" : "1554783810", + "currentTimestamp" : "1989536418", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "1554032831" + }, + + "DifficultyTest2167" : { + "parentTimestamp" : "809249081", + "parentDifficulty" : "407303980", + "currentTimestamp" : "809249097", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "407121486" + }, + + "DifficultyTest2168" : { + "parentTimestamp" : "1505618007", + "parentDifficulty" : "1103748624", + "currentTimestamp" : "1505618023", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1103242453" + }, + + "DifficultyTest2170" : { + "parentTimestamp" : "1261556148", + "parentDifficulty" : "1106409192", + "currentTimestamp" : "1261556164", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "1105934490" + }, + + "DifficultyTest2175" : { + "parentTimestamp" : "1819059001", + "parentDifficulty" : "1987199661", + "currentTimestamp" : "1819059017", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "1987277925" + }, + + "DifficultyTest2179" : { + "parentTimestamp" : "736876868", + "parentDifficulty" : "2020569041", + "currentTimestamp" : "736876884", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "2027971044" + }, + + "DifficultyTest2180" : { + "parentTimestamp" : "1172281455", + "parentDifficulty" : "32110368", + "currentTimestamp" : "1172281471", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "48871906" + }, + + "DifficultyTest2181" : { + "parentTimestamp" : "919763961", + "parentDifficulty" : "206880014", + "currentTimestamp" : "919763977", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "240333431" + }, + + "DifficultyTest2183" : { + "parentTimestamp" : "1941035646", + "parentDifficulty" : "625833152", + "currentTimestamp" : "1941035662", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "692636434" + }, + + "DifficultyTest2184" : { + "parentTimestamp" : "1880809699", + "parentDifficulty" : "1931828340", + "currentTimestamp" : "1880809715", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "2065102793" + }, + + "DifficultyTest2186" : { + "parentTimestamp" : "2094994176", + "parentDifficulty" : "1514425694", + "currentTimestamp" : "2094994192", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "1782121685" + }, + + "DifficultyTest2188" : { + "parentTimestamp" : "1159467409", + "parentDifficulty" : "574108855", + "currentTimestamp" : "1159467425", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1647570353" + }, + + "DifficultyTest2191" : { + "parentTimestamp" : "1769442239", + "parentDifficulty" : "1049721960", + "currentTimestamp" : "1769442255", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5344176697" + }, + + "DifficultyTest2192" : { + "parentTimestamp" : "637966634", + "parentDifficulty" : "733581009", + "currentTimestamp" : "637966650", + "currentBlockNumber" : "3525001", + "currentDifficulty" : "9323157408" + }, + + "DifficultyTest2193" : { + "parentTimestamp" : "367248417", + "parentDifficulty" : "2064040838", + "currentTimestamp" : "367248433", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "19242902190" + }, + + "DifficultyTest2197" : { + "parentTimestamp" : "1176843973", + "parentDifficulty" : "1204353712", + "currentTimestamp" : "1176843989", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "138642719121" + }, + + "DifficultyTest2201" : { + "parentTimestamp" : "1111605937", + "parentDifficulty" : "1702697224", + "currentTimestamp" : "1111605953", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1101213493605" + }, + + "DifficultyTest2204" : { + "parentTimestamp" : "971823982", + "parentDifficulty" : "1648124864", + "currentTimestamp" : "971823998", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399693831220" + }, + + "DifficultyTest2205" : { + "parentTimestamp" : "1030076294", + "parentDifficulty" : "1510785582", + "currentTimestamp" : "1030076310", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797603070102" + }, + + "DifficultyTest2206" : { + "parentTimestamp" : "1247766314", + "parentDifficulty" : "1726787548", + "currentTimestamp" : "1247766330", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797818966599" + }, + + "DifficultyTest2207" : { + "parentTimestamp" : "1670551041", + "parentDifficulty" : "360788001", + "currentTimestamp" : "1670551057", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592546656251" + }, + + "DifficultyTest2215" : { + "parentTimestamp" : "1626193917", + "parentDifficulty" : "1176046804", + "currentTimestamp" : "1626193933", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125901082315187" + }, + + "DifficultyTest2217" : { + "parentTimestamp" : "806730451", + "parentDifficulty" : "1359200099", + "currentTimestamp" : "806730467", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503600985906924" + }, + + "DifficultyTest2219" : { + "parentTimestamp" : "2135643231", + "parentDifficulty" : "969406119", + "currentTimestamp" : "2135643247", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007200223673769" + }, + + "DifficultyTest2220" : { + "parentTimestamp" : "1843578793", + "parentDifficulty" : "35483110", + "currentTimestamp" : "1843578809", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014398544947769" + }, + + "DifficultyTest2221" : { + "parentTimestamp" : "144350501", + "parentDifficulty" : "1607603563", + "currentTimestamp" : "144350517", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798625782569" + }, + + "DifficultyTest2222" : { + "parentTimestamp" : "658946426", + "parentDifficulty" : "230441674", + "currentTimestamp" : "658946442", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797249293122" + }, + + "DifficultyTest2223" : { + "parentTimestamp" : "1960795846", + "parentDifficulty" : "1300460276", + "currentTimestamp" : "1960795862", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595337753222" + }, + + "DifficultyTest2224" : { + "parentTimestamp" : "1014600717", + "parentDifficulty" : "155782290", + "currentTimestamp" : "1014600733", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115188231562097" + }, + + "DifficultyTest2226" : { + "parentTimestamp" : "814389778", + "parentDifficulty" : "2053686232", + "currentTimestamp" : "814389794", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230378204395200" + }, + + "DifficultyTest2227" : { + "parentTimestamp" : "1808527961", + "parentDifficulty" : "122030128", + "currentTimestamp" : "1808527977", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460752425394031" + }, + + "DifficultyTest2231" : { + "parentTimestamp" : "1157940357", + "parentDifficulty" : "1317358736", + "currentTimestamp" : "1157940373", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019744103399" + }, + + "DifficultyTest2232" : { + "parentTimestamp" : "580818995", + "parentDifficulty" : "80730925", + "currentTimestamp" : "580819011", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372036935467314" + }, + + "DifficultyTest2234" : { + "parentTimestamp" : "1540822923", + "parentDifficulty" : "1059975969", + "currentTimestamp" : "1540822939", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074769010019" + }, + + "DifficultyTest2235" : { + "parentTimestamp" : "631841981", + "parentDifficulty" : "1457259584", + "currentTimestamp" : "631841997", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148875651264" + }, + + "DifficultyTest2236" : { + "parentTimestamp" : "1979376252", + "parentDifficulty" : "1795467000", + "currentTimestamp" : "1979376268", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296632796772" + }, + + "DifficultyTest2238" : { + "parentTimestamp" : "1252922111", + "parentDifficulty" : "1962443845", + "currentTimestamp" : "1252922127", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952591637898549" + }, + + "DifficultyTest2243" : { + "parentTimestamp" : "1879338160", + "parentDifficulty" : "1459095332", + "currentTimestamp" : "1879338176", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436280989732" + }, + + "DifficultyTest2248" : { + "parentTimestamp" : "1175851260", + "parentDifficulty" : "464601772", + "currentTimestamp" : "1175851276", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957626084484" + }, + + "DifficultyTest2249" : { + "parentTimestamp" : "450608960", + "parentDifficulty" : "1081445232", + "currentTimestamp" : "450608976", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725915404336319" + }, + + "DifficultyTest2252" : { + "parentTimestamp" : "679676291", + "parentDifficulty" : "2145727890", + "currentTimestamp" : "679676307", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903659438356716" + }, + + "DifficultyTest2255" : { + "parentTimestamp" : "1381106133", + "parentDifficulty" : "342330698", + "currentTimestamp" : "1381106149", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629516869721" + }, + + "DifficultyTest2256" : { + "parentTimestamp" : "1567042167", + "parentDifficulty" : "1722999306", + "currentTimestamp" : "1567042183", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229260071570350" + }, + + "DifficultyTest2257" : { + "parentTimestamp" : "1312105150", + "parentDifficulty" : "831157740", + "currentTimestamp" : "1312105166", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458517529576606" + }, + + "DifficultyTest2258" : { + "parentTimestamp" : "2117762914", + "parentDifficulty" : "667687552", + "currentTimestamp" : "2117762930", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517366186237" + }, + + "DifficultyTest2259" : { + "parentTimestamp" : "1497991131", + "parentDifficulty" : "57539462", + "currentTimestamp" : "1497991147", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917033455160775" + }, + + "DifficultyTest2260" : { + "parentTimestamp" : "1187416656", + "parentDifficulty" : "1627891534", + "currentTimestamp" : "1187416672", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068422395482" + }, + + "DifficultyTest2262" : { + "parentTimestamp" : "1020014305", + "parentDifficulty" : "2141560911", + "currentTimestamp" : "1020014321", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668135731112859" + }, + + "DifficultyTest2265" : { + "parentTimestamp" : "130576439", + "parentDifficulty" : "1208286473", + "currentTimestamp" : "130576455", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069932477546" + }, + + "DifficultyTest2267" : { + "parentTimestamp" : "1452780049", + "parentDifficulty" : "459686046", + "currentTimestamp" : "1452780065", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690137909023702" + }, + + "DifficultyTest2269" : { + "parentTimestamp" : "596466015", + "parentDifficulty" : "1467054152", + "currentTimestamp" : "596466031", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760551264586265" + }, + + "DifficultyTest2271" : { + "parentTimestamp" : "1115958891", + "parentDifficulty" : "10195315", + "currentTimestamp" : "1115958907", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521099606687233" + }, + + "DifficultyTest2274" : { + "parentTimestamp" : "1865785525", + "parentDifficulty" : "1992233552", + "currentTimestamp" : "1865785541", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084400377248366" + }, + + "DifficultyTest2275" : { + "parentTimestamp" : "129181104", + "parentDifficulty" : "1470530988", + "currentTimestamp" : "129181120", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798241788124" + }, + + "DifficultyTest2276" : { + "parentTimestamp" : "941697967", + "parentDifficulty" : "896863476", + "currentTimestamp" : "941697983", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594440375891" + }, + + "DifficultyTest2278" : { + "parentTimestamp" : "1549352275", + "parentDifficulty" : "1986876405", + "currentTimestamp" : "1549352291", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675189073806923" + }, + + "DifficultyTest2280" : { + "parentTimestamp" : "234937120", + "parentDifficulty" : "1890336962", + "currentTimestamp" : "234937137", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1889413946" + }, + + "DifficultyTest2285" : { + "parentTimestamp" : "1902730801", + "parentDifficulty" : "567585092", + "currentTimestamp" : "1902730818", + "currentBlockNumber" : "450001", + "currentDifficulty" : "567307955" + }, + + "DifficultyTest2286" : { + "parentTimestamp" : "1483967176", + "parentDifficulty" : "889731272", + "currentTimestamp" : "1483967193", + "currentBlockNumber" : "525001", + "currentDifficulty" : "889296841" + }, + + "DifficultyTest2287" : { + "parentTimestamp" : "1422095894", + "parentDifficulty" : "228756162", + "currentTimestamp" : "1422095911", + "currentBlockNumber" : "600001", + "currentDifficulty" : "228644481" + }, + + "DifficultyTest2292" : { + "parentTimestamp" : "889304187", + "parentDifficulty" : "1833877169", + "currentTimestamp" : "889304204", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1832981850" + }, + + "DifficultyTest2293" : { + "parentTimestamp" : "840834150", + "parentDifficulty" : "1445159181", + "currentTimestamp" : "840834167", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1444453793" + }, + + "DifficultyTest2294" : { + "parentTimestamp" : "353013232", + "parentDifficulty" : "219714075", + "currentTimestamp" : "353013249", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "219607305" + }, + + "DifficultyTest2297" : { + "parentTimestamp" : "2036390238", + "parentDifficulty" : "602371268", + "currentTimestamp" : "2036390255", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "602079190" + }, + + "DifficultyTest2302" : { + "parentTimestamp" : "973556429", + "parentDifficulty" : "1642807782", + "currentTimestamp" : "973556446", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1642038398" + }, + + "DifficultyTest2303" : { + "parentTimestamp" : "1668675890", + "parentDifficulty" : "1989755029", + "currentTimestamp" : "1668675907", + "currentBlockNumber" : "1800001", + "currentDifficulty" : "1988849005" + }, + + "DifficultyTest2304" : { + "parentTimestamp" : "102005370", + "parentDifficulty" : "150463952", + "currentTimestamp" : "102005387", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "150456020" + }, + + "DifficultyTest2305" : { + "parentTimestamp" : "652368711", + "parentDifficulty" : "925308856", + "currentTimestamp" : "652368728", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "924988118" + }, + + "DifficultyTest2307" : { + "parentTimestamp" : "1337688092", + "parentDifficulty" : "820355348", + "currentTimestamp" : "1337688109", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "820479072" + }, + + "DifficultyTest2308" : { + "parentTimestamp" : "782840338", + "parentDifficulty" : "1444520151", + "currentTimestamp" : "782840355", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "1444339107" + }, + + "DifficultyTest2310" : { + "parentTimestamp" : "79066097", + "parentDifficulty" : "2034365864", + "currentTimestamp" : "79066114", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "2035469674" + }, + + "DifficultyTest2312" : { + "parentTimestamp" : "748949441", + "parentDifficulty" : "1824967572", + "currentTimestamp" : "748949458", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1828270779" + }, + + "DifficultyTest2313" : { + "parentTimestamp" : "853291703", + "parentDifficulty" : "10477448", + "currentTimestamp" : "853291720", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "18860941" + }, + + "DifficultyTest2314" : { + "parentTimestamp" : "138420458", + "parentDifficulty" : "1816963395", + "currentTimestamp" : "138420475", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1832853422" + }, + + "DifficultyTest2315" : { + "parentTimestamp" : "474184070", + "parentDifficulty" : "733563009", + "currentTimestamp" : "474184087", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "766759256" + }, + + "DifficultyTest2317" : { + "parentTimestamp" : "936159490", + "parentDifficulty" : "1639771327", + "currentTimestamp" : "936159507", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1706079522" + }, + + "DifficultyTest2319" : { + "parentTimestamp" : "1894303896", + "parentDifficulty" : "2041032012", + "currentTimestamp" : "1894303913", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "2308470871" + }, + + "DifficultyTest2320" : { + "parentTimestamp" : "1834631425", + "parentDifficulty" : "1425664372", + "currentTimestamp" : "1834631442", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "1693403703" + }, + + "DifficultyTest2322" : { + "parentTimestamp" : "1979889590", + "parentDifficulty" : "1308613764", + "currentTimestamp" : "1979889607", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "2381716617" + }, + + "DifficultyTest2324" : { + "parentTimestamp" : "1789204385", + "parentDifficulty" : "601784990", + "currentTimestamp" : "1789204402", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "2748974798" + }, + + "DifficultyTest2325" : { + "parentTimestamp" : "2075557860", + "parentDifficulty" : "816425746", + "currentTimestamp" : "2075557877", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5110994397" + }, + + "DifficultyTest2329" : { + "parentTimestamp" : "1814082067", + "parentDifficulty" : "957572109", + "currentTimestamp" : "1814082084", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35316842913" + }, + + "DifficultyTest2330" : { + "parentTimestamp" : "1388833979", + "parentDifficulty" : "749822754", + "currentTimestamp" : "1388833996", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69468933366" + }, + + "DifficultyTest2335" : { + "parentTimestamp" : "36345226", + "parentDifficulty" : "587302350", + "currentTimestamp" : "36345243", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1100098643358" + }, + + "DifficultyTest2336" : { + "parentTimestamp" : "1292601898", + "parentDifficulty" : "411270410", + "currentTimestamp" : "1292601915", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1099922697371" + }, + + "DifficultyTest2338" : { + "parentTimestamp" : "1818491715", + "parentDifficulty" : "1479521712", + "currentTimestamp" : "1818491732", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399525310394" + }, + + "DifficultyTest2341" : { + "parentTimestamp" : "1177756747", + "parentDifficulty" : "638047256", + "currentTimestamp" : "1177756764", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592823780126" + }, + + "DifficultyTest2342" : { + "parentTimestamp" : "1499107085", + "parentDifficulty" : "455367472", + "currentTimestamp" : "1499107102", + "currentBlockNumber" : "4725001", + "currentDifficulty" : "35184827233957" + }, + + "DifficultyTest2344" : { + "parentTimestamp" : "1755159291", + "parentDifficulty" : "676926418", + "currentTimestamp" : "1755159308", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369420773552" + }, + + "DifficultyTest2345" : { + "parentTimestamp" : "1486335797", + "parentDifficulty" : "393387471", + "currentTimestamp" : "1486335814", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140737881550716" + }, + + "DifficultyTest2346" : { + "parentTimestamp" : "1361393922", + "parentDifficulty" : "2029648324", + "currentTimestamp" : "1361393939", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281477005367941" + }, + + "DifficultyTest2347" : { + "parentTimestamp" : "19320476", + "parentDifficulty" : "1359842766", + "currentTimestamp" : "19320493", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562951312600093" + }, + + "DifficultyTest2348" : { + "parentTimestamp" : "978587178", + "parentDifficulty" : "1154823580", + "currentTimestamp" : "978587195", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951107681014" + }, + + "DifficultyTest2349" : { + "parentTimestamp" : "1855562241", + "parentDifficulty" : "678601760", + "currentTimestamp" : "1855562258", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900585113036" + }, + + "DifficultyTest2350" : { + "parentTimestamp" : "1769926804", + "parentDifficulty" : "1230098807", + "currentTimestamp" : "1769926821", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251801043183421" + }, + + "DifficultyTest2352" : { + "parentTimestamp" : "338555286", + "parentDifficulty" : "1085890152", + "currentTimestamp" : "338555303", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600712730429" + }, + + "DifficultyTest2354" : { + "parentTimestamp" : "1430566771", + "parentDifficulty" : "2112762802", + "currentTimestamp" : "1430566788", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014400621213164" + }, + + "DifficultyTest2355" : { + "parentTimestamp" : "2039895107", + "parentDifficulty" : "647256264", + "currentTimestamp" : "2039895124", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028797665904189" + }, + + "DifficultyTest2356" : { + "parentTimestamp" : "2043450005", + "parentDifficulty" : "847547737", + "currentTimestamp" : "2043450022", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797866097864" + }, + + "DifficultyTest2358" : { + "parentTimestamp" : "1533854758", + "parentDifficulty" : "1065881364", + "currentTimestamp" : "1533854775", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115189141216787" + }, + + "DifficultyTest2359" : { + "parentTimestamp" : "1815931434", + "parentDifficulty" : "1272865970", + "currentTimestamp" : "1815931451", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377423956198" + }, + + "DifficultyTest2360" : { + "parentTimestamp" : "650853782", + "parentDifficulty" : "186847018", + "currentTimestamp" : "650853799", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376338467529" + }, + + "DifficultyTest2361" : { + "parentTimestamp" : "1089533668", + "parentDifficulty" : "195123964", + "currentTimestamp" : "1089533685", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460752498452177" + }, + + "DifficultyTest2365" : { + "parentTimestamp" : "1811842761", + "parentDifficulty" : "735249204", + "currentTimestamp" : "1811842778", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019162278100" + }, + + "DifficultyTest2366" : { + "parentTimestamp" : "354718108", + "parentDifficulty" : "1894300929", + "currentTimestamp" : "354718125", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038748151786" + }, + + "DifficultyTest2367" : { + "parentTimestamp" : "205205478", + "parentDifficulty" : "1788641176", + "currentTimestamp" : "205205495", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075497319433" + }, + + "DifficultyTest2368" : { + "parentTimestamp" : "503381322", + "parentDifficulty" : "227601343", + "currentTimestamp" : "503381339", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744073937041826" + }, + + "DifficultyTest2370" : { + "parentTimestamp" : "2058790305", + "parentDifficulty" : "109103623", + "currentTimestamp" : "2058790322", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976294947256814" + }, + + "DifficultyTest2372" : { + "parentTimestamp" : "2021956029", + "parentDifficulty" : "1432445424", + "currentTimestamp" : "2021956046", + "currentBlockNumber" : "6975001", + "currentDifficulty" : "147573952591108158916" + }, + + "DifficultyTest2373" : { + "parentTimestamp" : "546636494", + "parentDifficulty" : "1999268336", + "currentTimestamp" : "546636511", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905181351117987" + }, + + "DifficultyTest2376" : { + "parentTimestamp" : "412119894", + "parentDifficulty" : "465880438", + "currentTimestamp" : "412119911", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717876956382" + }, + + "DifficultyTest2377" : { + "parentTimestamp" : "61458763", + "parentDifficulty" : "1537597070", + "currentTimestamp" : "61458780", + "currentBlockNumber" : "7350001", + "currentDifficulty" : "2361183241436359453139" + }, + + "DifficultyTest2380" : { + "parentTimestamp" : "813997375", + "parentDifficulty" : "88500643", + "currentTimestamp" : "813997392", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739378884822" + }, + + "DifficultyTest2381" : { + "parentTimestamp" : "92633714", + "parentDifficulty" : "1692766362", + "currentTimestamp" : "92633731", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480272794600" + }, + + "DifficultyTest2382" : { + "parentTimestamp" : "1423233238", + "parentDifficulty" : "966985278", + "currentTimestamp" : "1423233255", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958128222686" + }, + + "DifficultyTest2386" : { + "parentTimestamp" : "435130125", + "parentDifficulty" : "431527265", + "currentTimestamp" : "435130142", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903657724993103" + }, + + "DifficultyTest2389" : { + "parentTimestamp" : "899719670", + "parentDifficulty" : "131145792", + "currentTimestamp" : "899719687", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629305787932" + }, + + "DifficultyTest2392" : { + "parentTimestamp" : "1683975748", + "parentDifficulty" : "303634958", + "currentTimestamp" : "1683975765", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517002311403" + }, + + "DifficultyTest2393" : { + "parentTimestamp" : "4063853", + "parentDifficulty" : "1437201802", + "currentTimestamp" : "4063870", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034834149452" + }, + + "DifficultyTest2394" : { + "parentTimestamp" : "15913584", + "parentDifficulty" : "777673864", + "currentTimestamp" : "15913601", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834067572592957" + }, + + "DifficultyTest2395" : { + "parentTimestamp" : "84945484", + "parentDifficulty" : "229032416", + "currentTimestamp" : "84945501", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668133819518216" + }, + + "DifficultyTest2396" : { + "parentTimestamp" : "1538138872", + "parentDifficulty" : "1996683486", + "currentTimestamp" : "1538138889", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668135586306175" + }, + + "DifficultyTest2398" : { + "parentTimestamp" : "2073286715", + "parentDifficulty" : "1573773196", + "currentTimestamp" : "2073286732", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672535935395281" + }, + + "DifficultyTest2401" : { + "parentTimestamp" : "717539637", + "parentDifficulty" : "1005887152", + "currentTimestamp" : "717539654", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138454958109" + }, + + "DifficultyTest2404" : { + "parentTimestamp" : "1166535676", + "parentDifficulty" : "28084537", + "currentTimestamp" : "1166535693", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760549826319272" + }, + + "DifficultyTest2408" : { + "parentTimestamp" : "559060173", + "parentDifficulty" : "55548127", + "currentTimestamp" : "559060190", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084398441508588" + }, + + "DifficultyTest2409" : { + "parentTimestamp" : "1226381978", + "parentDifficulty" : "1934037291", + "currentTimestamp" : "1226381995", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798705068105" + }, + + "DifficultyTest2411" : { + "parentTimestamp" : "1493741977", + "parentDifficulty" : "1065166058", + "currentTimestamp" : "1493741994", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675188152546630" + }, + + "DifficultyTest2413" : { + "parentTimestamp" : "2083506237", + "parentDifficulty" : "641082720", + "currentTimestamp" : "2083506255", + "currentBlockNumber" : "1", + "currentDifficulty" : "640769692" + }, + + "DifficultyTest2414" : { + "parentTimestamp" : "867594872", + "parentDifficulty" : "659233788", + "currentTimestamp" : "867594890", + "currentBlockNumber" : "75001", + "currentDifficulty" : "658911897" + }, + + "DifficultyTest2415" : { + "parentTimestamp" : "1955784318", + "parentDifficulty" : "10073850", + "currentTimestamp" : "1955784336", + "currentBlockNumber" : "150001", + "currentDifficulty" : "10068932" + }, + + "DifficultyTest2416" : { + "parentTimestamp" : "1674238916", + "parentDifficulty" : "767720240", + "currentTimestamp" : "1674238934", + "currentBlockNumber" : "225001", + "currentDifficulty" : "767345378" + }, + + "DifficultyTest2417" : { + "parentTimestamp" : "754246227", + "parentDifficulty" : "2007933380", + "currentTimestamp" : "754246245", + "currentBlockNumber" : "300001", + "currentDifficulty" : "2006952946" + }, + + "DifficultyTest2418" : { + "parentTimestamp" : "1772014401", + "parentDifficulty" : "32759176", + "currentTimestamp" : "1772014419", + "currentBlockNumber" : "375001", + "currentDifficulty" : "32743183" + }, + + "DifficultyTest2419" : { + "parentTimestamp" : "898990671", + "parentDifficulty" : "1499452694", + "currentTimestamp" : "898990689", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1498720544" + }, + + "DifficultyTest2421" : { + "parentTimestamp" : "1493969959", + "parentDifficulty" : "1970552736", + "currentTimestamp" : "1493969977", + "currentBlockNumber" : "600001", + "currentDifficulty" : "1969590569" + }, + + "DifficultyTest2423" : { + "parentTimestamp" : "1002064943", + "parentDifficulty" : "191553163", + "currentTimestamp" : "1002064961", + "currentBlockNumber" : "750001", + "currentDifficulty" : "191459664" + }, + + "DifficultyTest2424" : { + "parentTimestamp" : "1890901501", + "parentDifficulty" : "266967840", + "currentTimestamp" : "1890901519", + "currentBlockNumber" : "825001", + "currentDifficulty" : "266837549" + }, + + "DifficultyTest2425" : { + "parentTimestamp" : "1053243703", + "parentDifficulty" : "557657176", + "currentTimestamp" : "1053243721", + "currentBlockNumber" : "900001", + "currentDifficulty" : "557385011" + }, + + "DifficultyTest2426" : { + "parentTimestamp" : "2009610343", + "parentDifficulty" : "1015639915", + "currentTimestamp" : "2009610361", + "currentBlockNumber" : "975001", + "currentDifficulty" : "1015144126" + }, + + "DifficultyTest2427" : { + "parentTimestamp" : "1465686104", + "parentDifficulty" : "2021566736", + "currentTimestamp" : "1465686122", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "2020579899" + }, + + "DifficultyTest2428" : { + "parentTimestamp" : "311262314", + "parentDifficulty" : "1952166136", + "currentTimestamp" : "311262332", + "currentBlockNumber" : "1125001", + "currentDifficulty" : "1951213442" + }, + + "DifficultyTest2430" : { + "parentTimestamp" : "1430874663", + "parentDifficulty" : "1183270486", + "currentTimestamp" : "1430874681", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "1182693742" + }, + + "DifficultyTest2431" : { + "parentTimestamp" : "1326063386", + "parentDifficulty" : "251223738", + "currentTimestamp" : "1326063404", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "251103119" + }, + + "DifficultyTest2432" : { + "parentTimestamp" : "364468576", + "parentDifficulty" : "869645432", + "currentTimestamp" : "364468594", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "869224897" + }, + + "DifficultyTest2433" : { + "parentTimestamp" : "1736184543", + "parentDifficulty" : "1313933620", + "currentTimestamp" : "1736184561", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "1313300243" + }, + + "DifficultyTest2434" : { + "parentTimestamp" : "95036000", + "parentDifficulty" : "1848512308", + "currentTimestamp" : "95036018", + "currentBlockNumber" : "1575001", + "currentDifficulty" : "1847617907" + }, + + "DifficultyTest2435" : { + "parentTimestamp" : "2010913997", + "parentDifficulty" : "1554780208", + "currentTimestamp" : "2010914015", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1554037422" + }, + + "DifficultyTest2436" : { + "parentTimestamp" : "133606674", + "parentDifficulty" : "1693702472", + "currentTimestamp" : "133606692", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1692908237" + }, + + "DifficultyTest2440" : { + "parentTimestamp" : "276319708", + "parentDifficulty" : "688666951", + "currentTimestamp" : "276319726", + "currentBlockNumber" : "2025001", + "currentDifficulty" : "688592832" + }, + + "DifficultyTest2441" : { + "parentTimestamp" : "1811499353", + "parentDifficulty" : "1139025684", + "currentTimestamp" : "1811499371", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "1138993808" + }, + + "DifficultyTest2446" : { + "parentTimestamp" : "1836231778", + "parentDifficulty" : "828812690", + "currentTimestamp" : "1836231796", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "832602301" + }, + + "DifficultyTest2447" : { + "parentTimestamp" : "697272653", + "parentDifficulty" : "1231210832", + "currentTimestamp" : "697272671", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1238998263" + }, + + "DifficultyTest2448" : { + "parentTimestamp" : "445627647", + "parentDifficulty" : "379339270", + "currentTimestamp" : "445627665", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "395931262" + }, + + "DifficultyTest2449" : { + "parentTimestamp" : "935274575", + "parentDifficulty" : "1987709968", + "currentTimestamp" : "935274593", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "2020293839" + }, + + "DifficultyTest2451" : { + "parentTimestamp" : "2094182135", + "parentDifficulty" : "2091968255", + "currentTimestamp" : "2094182153", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "2158055651" + }, + + "DifficultyTest2452" : { + "parentTimestamp" : "430508645", + "parentDifficulty" : "130135404", + "currentTimestamp" : "430508663", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "264289590" + }, + + "DifficultyTest2455" : { + "parentTimestamp" : "1432466914", + "parentDifficulty" : "1072784055", + "currentTimestamp" : "1432466932", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "1609131147" + }, + + "DifficultyTest2457" : { + "parentTimestamp" : "1054426876", + "parentDifficulty" : "1227547911", + "currentTimestamp" : "1054426894", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "3374432171" + }, + + "DifficultyTest2458" : { + "parentTimestamp" : "1747109964", + "parentDifficulty" : "1055895949", + "currentTimestamp" : "1747109982", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "3202864023" + }, + + "DifficultyTest2462" : { + "parentTimestamp" : "552699103", + "parentDifficulty" : "782357406", + "currentTimestamp" : "552699121", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "17961844580" + }, + + "DifficultyTest2464" : { + "parentTimestamp" : "348715570", + "parentDifficulty" : "798028791", + "currentTimestamp" : "348715588", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69517115865" + }, + + "DifficultyTest2465" : { + "parentTimestamp" : "1036976550", + "parentDifficulty" : "1403141969", + "currentTimestamp" : "1036976568", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "138841410314" + }, + + "DifficultyTest2469" : { + "parentTimestamp" : "1479368186", + "parentDifficulty" : "311590594", + "currentTimestamp" : "1479368204", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1099823066227" + }, + + "DifficultyTest2470" : { + "parentTimestamp" : "1929398678", + "parentDifficulty" : "1566155336", + "currentTimestamp" : "1929398696", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1101077018388" + }, + + "DifficultyTest2471" : { + "parentTimestamp" : "1407575835", + "parentDifficulty" : "1892916914", + "currentTimestamp" : "1407575853", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2200915248191" + }, + + "DifficultyTest2472" : { + "parentTimestamp" : "560013286", + "parentDifficulty" : "1740928990", + "currentTimestamp" : "560013304", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4399786590032" + }, + + "DifficultyTest2474" : { + "parentTimestamp" : "2003175886", + "parentDifficulty" : "147991616", + "currentTimestamp" : "2003175904", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8796240941563" + }, + + "DifficultyTest2478" : { + "parentTimestamp" : "457878406", + "parentDifficulty" : "496972560", + "currentTimestamp" : "457878424", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369240907562" + }, + + "DifficultyTest2479" : { + "parentTimestamp" : "1872225481", + "parentDifficulty" : "545609769", + "currentTimestamp" : "1872225499", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140738033698686" + }, + + "DifficultyTest2482" : { + "parentTimestamp" : "1957423677", + "parentDifficulty" : "761482512", + "currentTimestamp" : "1957423695", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950714532007" + }, + + "DifficultyTest2485" : { + "parentTimestamp" : "1346972410", + "parentDifficulty" : "113289792", + "currentTimestamp" : "1346972428", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503599740604971" + }, + + "DifficultyTest2486" : { + "parentTimestamp" : "230872971", + "parentDifficulty" : "634731457", + "currentTimestamp" : "230872989", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600261792026" + }, + + "DifficultyTest2487" : { + "parentTimestamp" : "1240574337", + "parentDifficulty" : "31990077", + "currentTimestamp" : "1240574355", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199286715449" + }, + + "DifficultyTest2489" : { + "parentTimestamp" : "2023565265", + "parentDifficulty" : "1269808133", + "currentTimestamp" : "2023565283", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798288152078" + }, + + "DifficultyTest2490" : { + "parentTimestamp" : "1255093058", + "parentDifficulty" : "1227390720", + "currentTimestamp" : "1255093076", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028798245755377" + }, + + "DifficultyTest2491" : { + "parentTimestamp" : "1211336053", + "parentDifficulty" : "547196284", + "currentTimestamp" : "1211336071", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057594584857035" + }, + + "DifficultyTest2494" : { + "parentTimestamp" : "63961348", + "parentDifficulty" : "917105834", + "currentTimestamp" : "63961366", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377068369773" + }, + + "DifficultyTest2495" : { + "parentTimestamp" : "268569388", + "parentDifficulty" : "876396251", + "currentTimestamp" : "268569406", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753179391812" + }, + + "DifficultyTest2497" : { + "parentTimestamp" : "2035088005", + "parentDifficulty" : "351606272", + "currentTimestamp" : "2035088023", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843009565128542" + }, + + "DifficultyTest2499" : { + "parentTimestamp" : "1018897678", + "parentDifficulty" : "1114762260", + "currentTimestamp" : "1018897696", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019541605847" + }, + + "DifficultyTest2501" : { + "parentTimestamp" : "1686403415", + "parentDifficulty" : "873276834", + "currentTimestamp" : "1686403433", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074582402046" + }, + + "DifficultyTest2503" : { + "parentTimestamp" : "763547770", + "parentDifficulty" : "1851353016", + "currentTimestamp" : "763547788", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488149269552268" + }, + + "DifficultyTest2504" : { + "parentTimestamp" : "2087866625", + "parentDifficulty" : "1479222665", + "currentTimestamp" : "2087866643", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976296316706853" + }, + + "DifficultyTest2505" : { + "parentTimestamp" : "2032705355", + "parentDifficulty" : "1857543270", + "currentTimestamp" : "2032705373", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952591533049195" + }, + + "DifficultyTest2507" : { + "parentTimestamp" : "1738164312", + "parentDifficulty" : "23243759", + "currentTimestamp" : "1738164330", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905179376058266" + }, + + "DifficultyTest2508" : { + "parentTimestamp" : "1878641193", + "parentDifficulty" : "1491187982", + "currentTimestamp" : "1878641211", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810360196111575" + }, + + "DifficultyTest2509" : { + "parentTimestamp" : "542996077", + "parentDifficulty" : "909662879", + "currentTimestamp" : "542996095", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620718320522132" + }, + + "DifficultyTest2512" : { + "parentTimestamp" : "1524825447", + "parentDifficulty" : "1390910368", + "currentTimestamp" : "1524825465", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871035444909" + }, + + "DifficultyTest2514" : { + "parentTimestamp" : "906232675", + "parentDifficulty" : "23071416", + "currentTimestamp" : "906232693", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739313487543" + }, + + "DifficultyTest2515" : { + "parentTimestamp" : "1012745064", + "parentDifficulty" : "444119824", + "currentTimestamp" : "1012745082", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931479024757753" + }, + + "DifficultyTest2516" : { + "parentTimestamp" : "511106212", + "parentDifficulty" : "249013170", + "currentTimestamp" : "511106230", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957410601150" + }, + + "DifficultyTest2517" : { + "parentTimestamp" : "1619098982", + "parentDifficulty" : "2139665257", + "currentTimestamp" : "1619099000", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725916462039635" + }, + + "DifficultyTest2519" : { + "parentTimestamp" : "1648242856", + "parentDifficulty" : "1799415960", + "currentTimestamp" : "1648242874", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451830445375611" + }, + + "DifficultyTest2521" : { + "parentTimestamp" : "1661977661", + "parentDifficulty" : "1203509075", + "currentTimestamp" : "1661977679", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807315790274513" + }, + + "DifficultyTest2522" : { + "parentTimestamp" : "97505196", + "parentDifficulty" : "1097207776", + "currentTimestamp" : "97505214", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807315684025119" + }, + + "DifficultyTest2523" : { + "parentTimestamp" : "844835473", + "parentDifficulty" : "408083946", + "currentTimestamp" : "844835491", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629582590863" + }, + + "DifficultyTest2525" : { + "parentTimestamp" : "2110858647", + "parentDifficulty" : "1074030194", + "currentTimestamp" : "2110858665", + "currentBlockNumber" : "8400001", + "currentDifficulty" : "4835703278458517772330470" + }, + + "DifficultyTest2526" : { + "parentTimestamp" : "1063887190", + "parentDifficulty" : "1486297538", + "currentTimestamp" : "1063887208", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458518184396511" + }, + + "DifficultyTest2527" : { + "parentTimestamp" : "1326541612", + "parentDifficulty" : "204406417", + "currentTimestamp" : "1326541630", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917033601956018" + }, + + "DifficultyTest2528" : { + "parentTimestamp" : "1908656441", + "parentDifficulty" : "2024476184", + "currentTimestamp" : "1908656459", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068818786487" + }, + + "DifficultyTest2529" : { + "parentTimestamp" : "444636574", + "parentDifficulty" : "348515214", + "currentTimestamp" : "444636592", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668133938942673" + }, + + "DifficultyTest2531" : { + "parentTimestamp" : "1288841353", + "parentDifficulty" : "810584961", + "currentTimestamp" : "1288841371", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336267991384432" + }, + + "DifficultyTest2537" : { + "parentTimestamp" : "883795578", + "parentDifficulty" : "431344503", + "currentTimestamp" : "883795596", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550229382334" + }, + + "DifficultyTest2538" : { + "parentTimestamp" : "42846444", + "parentDifficulty" : "1957511056", + "currentTimestamp" : "42846462", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551754803689" + }, + + "DifficultyTest2540" : { + "parentTimestamp" : "914228837", + "parentDifficulty" : "583032", + "currentTimestamp" : "914228855", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042199193576540" + }, + + "DifficultyTest2541" : { + "parentTimestamp" : "544040946", + "parentDifficulty" : "1625107583", + "currentTimestamp" : "544040964", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084400010301658" + }, + + "DifficultyTest2543" : { + "parentTimestamp" : "1779089461", + "parentDifficulty" : "137593224", + "currentTimestamp" : "1779089479", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168796909501208" + }, + + "DifficultyTest2546" : { + "parentTimestamp" : "448972506", + "parentDifficulty" : "390620918", + "currentTimestamp" : "448972524", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675187478330858" + }, + + "DifficultyTest2548" : { + "parentTimestamp" : "1899981047", + "parentDifficulty" : "696401546", + "currentTimestamp" : "1899981066", + "currentBlockNumber" : "75001", + "currentDifficulty" : "696061507" + }, + + "DifficultyTest2549" : { + "parentTimestamp" : "1203927899", + "parentDifficulty" : "267597972", + "currentTimestamp" : "1203927918", + "currentBlockNumber" : "150001", + "currentDifficulty" : "267467309" + }, + + "DifficultyTest2550" : { + "parentTimestamp" : "33952036", + "parentDifficulty" : "1887981958", + "currentTimestamp" : "33952055", + "currentBlockNumber" : "225001", + "currentDifficulty" : "1887060093" + }, + + "DifficultyTest2551" : { + "parentTimestamp" : "354352822", + "parentDifficulty" : "1051069568", + "currentTimestamp" : "354352841", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1050556353" + }, + + "DifficultyTest2552" : { + "parentTimestamp" : "806608600", + "parentDifficulty" : "627094960", + "currentTimestamp" : "806608619", + "currentBlockNumber" : "375001", + "currentDifficulty" : "626788764" + }, + + "DifficultyTest2553" : { + "parentTimestamp" : "350787441", + "parentDifficulty" : "403792366", + "currentTimestamp" : "350787460", + "currentBlockNumber" : "450001", + "currentDifficulty" : "403595206" + }, + + "DifficultyTest2556" : { + "parentTimestamp" : "676895854", + "parentDifficulty" : "1750285193", + "currentTimestamp" : "676895873", + "currentBlockNumber" : "675001", + "currentDifficulty" : "1749430578" + }, + + "DifficultyTest2558" : { + "parentTimestamp" : "883984240", + "parentDifficulty" : "99236390", + "currentTimestamp" : "883984259", + "currentBlockNumber" : "825001", + "currentDifficulty" : "99187999" + }, + + "DifficultyTest2560" : { + "parentTimestamp" : "1660453101", + "parentDifficulty" : "345210343", + "currentTimestamp" : "1660453120", + "currentBlockNumber" : "975001", + "currentDifficulty" : "345041912" + }, + + "DifficultyTest2561" : { + "parentTimestamp" : "640997841", + "parentDifficulty" : "328180608", + "currentTimestamp" : "640997860", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "328020620" + }, + + "DifficultyTest2564" : { + "parentTimestamp" : "1996665580", + "parentDifficulty" : "1063722025", + "currentTimestamp" : "1996665599", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "1063203654" + }, + + "DifficultyTest2566" : { + "parentTimestamp" : "1841419761", + "parentDifficulty" : "88104538", + "currentTimestamp" : "1841419780", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "88065615" + }, + + "DifficultyTest2569" : { + "parentTimestamp" : "1790907171", + "parentDifficulty" : "1711000", + "currentTimestamp" : "1790907190", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "1726549" + }, + + "DifficultyTest2573" : { + "parentTimestamp" : "1876394571", + "parentDifficulty" : "437788694", + "currentTimestamp" : "1876394590", + "currentBlockNumber" : "1950001", + "currentDifficulty" : "437706002" + }, + + "DifficultyTest2575" : { + "parentTimestamp" : "838244038", + "parentDifficulty" : "756169013", + "currentTimestamp" : "838244057", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "756324078" + }, + + "DifficultyTest2576" : { + "parentTimestamp" : "1358774049", + "parentDifficulty" : "162660839", + "currentTimestamp" : "1358774068", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "163105703" + }, + + "DifficultyTest2577" : { + "parentTimestamp" : "1999648273", + "parentDifficulty" : "822396254", + "currentTimestamp" : "1999648292", + "currentBlockNumber" : "2250001", + "currentDifficulty" : "823043270" + }, + + "DifficultyTest2578" : { + "parentTimestamp" : "298765407", + "parentDifficulty" : "210302533", + "currentTimestamp" : "298765426", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "212296999" + }, + + "DifficultyTest2579" : { + "parentTimestamp" : "1475757178", + "parentDifficulty" : "230251792", + "currentTimestamp" : "1475757197", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "234333669" + }, + + "DifficultyTest2582" : { + "parentTimestamp" : "337392653", + "parentDifficulty" : "1681873632", + "currentTimestamp" : "337392672", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1697829621" + }, + + "DifficultyTest2583" : { + "parentTimestamp" : "320023267", + "parentDifficulty" : "1102189360", + "currentTimestamp" : "320023286", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "1135205614" + }, + + "DifficultyTest2585" : { + "parentTimestamp" : "1943899096", + "parentDifficulty" : "1539473348", + "currentTimestamp" : "1943899115", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "1605830517" + }, + + "DifficultyTest2586" : { + "parentTimestamp" : "1386934523", + "parentDifficulty" : "1443711240", + "currentTimestamp" : "1386934542", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "1577224031" + }, + + "DifficultyTest2587" : { + "parentTimestamp" : "649973903", + "parentDifficulty" : "1828824504", + "currentTimestamp" : "649973922", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "2096366980" + }, + + "DifficultyTest2588" : { + "parentTimestamp" : "350004282", + "parentDifficulty" : "2084066256", + "currentTimestamp" : "350004301", + "currentBlockNumber" : "3075001", + "currentDifficulty" : "2351484102" + }, + + "DifficultyTest2589" : { + "parentTimestamp" : "754289357", + "parentDifficulty" : "1710332776", + "currentTimestamp" : "754289376", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "2246368565" + }, + + "DifficultyTest2590" : { + "parentTimestamp" : "1811690787", + "parentDifficulty" : "161570920", + "currentTimestamp" : "1811690806", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1235233852" + }, + + "DifficultyTest2592" : { + "parentTimestamp" : "880673001", + "parentDifficulty" : "1983640540", + "currentTimestamp" : "880673020", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "4130155614" + }, + + "DifficultyTest2595" : { + "parentTimestamp" : "700583810", + "parentDifficulty" : "1880845728", + "currentTimestamp" : "700583829", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "19059796531" + }, + + "DifficultyTest2597" : { + "parentTimestamp" : "1175587211", + "parentDifficulty" : "1283692929", + "currentTimestamp" : "1175587230", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35642804494" + }, + + "DifficultyTest2598" : { + "parentTimestamp" : "651359912", + "parentDifficulty" : "1119645708", + "currentTimestamp" : "651359931", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69838575742" + }, + + "DifficultyTest2599" : { + "parentTimestamp" : "597986678", + "parentDifficulty" : "1398413925", + "currentTimestamp" : "597986697", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "138836684578" + }, + + "DifficultyTest2600" : { + "parentTimestamp" : "532312347", + "parentDifficulty" : "1494663444", + "currentTimestamp" : "532312366", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "138932887100" + }, + + "DifficultyTest2602" : { + "parentTimestamp" : "299567900", + "parentDifficulty" : "2061646447", + "currentTimestamp" : "299567919", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "551816453672" + }, + + "DifficultyTest2605" : { + "parentTimestamp" : "1344727044", + "parentDifficulty" : "249451808", + "currentTimestamp" : "1344727063", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199272585558" + }, + + "DifficultyTest2606" : { + "parentTimestamp" : "1439220375", + "parentDifficulty" : "143416908", + "currentTimestamp" : "1439220394", + "currentBlockNumber" : "4425001", + "currentDifficulty" : "4398189857985" + }, + + "DifficultyTest2608" : { + "parentTimestamp" : "1095357067", + "parentDifficulty" : "1239647428", + "currentTimestamp" : "1095357086", + "currentBlockNumber" : "4575001", + "currentDifficulty" : "8797332064340" + }, + + "DifficultyTest2609" : { + "parentTimestamp" : "41601291", + "parentDifficulty" : "1434449034", + "currentTimestamp" : "41601310", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17593619793036" + }, + + "DifficultyTest2610" : { + "parentTimestamp" : "383151532", + "parentDifficulty" : "1120053154", + "currentTimestamp" : "383151551", + "currentBlockNumber" : "4725001", + "currentDifficulty" : "35185491595086" + }, + + "DifficultyTest2611" : { + "parentTimestamp" : "181126200", + "parentDifficulty" : "1623882824", + "currentTimestamp" : "181126219", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70370367267577" + }, + + "DifficultyTest2613" : { + "parentTimestamp" : "1565190213", + "parentDifficulty" : "1033483960", + "currentTimestamp" : "1565190232", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140738521334658" + }, + + "DifficultyTest2614" : { + "parentTimestamp" : "1478643044", + "parentDifficulty" : "1521863632", + "currentTimestamp" : "1478643063", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281476497831191" + }, + + "DifficultyTest2615" : { + "parentTimestamp" : "565547723", + "parentDifficulty" : "1107428444", + "currentTimestamp" : "565547742", + "currentBlockNumber" : "5100001", + "currentDifficulty" : "562951060309020" + }, + + "DifficultyTest2616" : { + "parentTimestamp" : "1214406416", + "parentDifficulty" : "629405448", + "currentTimestamp" : "1214406435", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562950582519434" + }, + + "DifficultyTest2617" : { + "parentTimestamp" : "629904539", + "parentDifficulty" : "194082566", + "currentTimestamp" : "629904558", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900100830424" + }, + + "DifficultyTest2619" : { + "parentTimestamp" : "2030588712", + "parentDifficulty" : "244259322", + "currentTimestamp" : "2030588731", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503599871510551" + }, + + "DifficultyTest2620" : { + "parentTimestamp" : "1960220738", + "parentDifficulty" : "406923901", + "currentTimestamp" : "1960220757", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503600034095704" + }, + + "DifficultyTest2621" : { + "parentTimestamp" : "1699027019", + "parentDifficulty" : "1272416326", + "currentTimestamp" : "1699027038", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007200526536021" + }, + + "DifficultyTest2622" : { + "parentTimestamp" : "656217194", + "parentDifficulty" : "94989671", + "currentTimestamp" : "656217213", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014398604425274" + }, + + "DifficultyTest2624" : { + "parentTimestamp" : "1800823519", + "parentDifficulty" : "1689930302", + "currentTimestamp" : "1800823538", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028798708069109" + }, + + "DifficultyTest2625" : { + "parentTimestamp" : "1478282598", + "parentDifficulty" : "891397636", + "currentTimestamp" : "1478282617", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057594928890320" + }, + + "DifficultyTest2627" : { + "parentTimestamp" : "100698788", + "parentDifficulty" : "241285460", + "currentTimestamp" : "100698807", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230376392879389" + }, + + "DifficultyTest2631" : { + "parentTimestamp" : "992484874", + "parentDifficulty" : "172613173", + "currentTimestamp" : "992484893", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843009386222842" + }, + + "DifficultyTest2632" : { + "parentTimestamp" : "1211713148", + "parentDifficulty" : "1981809060", + "currentTimestamp" : "1211713167", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843011194535332" + }, + + "DifficultyTest2634" : { + "parentTimestamp" : "1258661296", + "parentDifficulty" : "1731694640", + "currentTimestamp" : "1258661315", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038585624894" + }, + + "DifficultyTest2635" : { + "parentTimestamp" : "1461986058", + "parentDifficulty" : "1845841805", + "currentTimestamp" : "1461986077", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075554492132" + }, + + "DifficultyTest2637" : { + "parentTimestamp" : "534574643", + "parentDifficulty" : "1187254016", + "currentTimestamp" : "534574662", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148605777535" + }, + + "DifficultyTest2644" : { + "parentTimestamp" : "1680148779", + "parentDifficulty" : "1539973310", + "currentTimestamp" : "1680148798", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620718950524794" + }, + + "DifficultyTest2647" : { + "parentTimestamp" : "1361130468", + "parentDifficulty" : "2134985600", + "currentTimestamp" : "1361130487", + "currentBlockNumber" : "7500001", + "currentDifficulty" : "9444732965741424370519" + }, + + "DifficultyTest2649" : { + "parentTimestamp" : "1579807676", + "parentDifficulty" : "1632655786", + "currentTimestamp" : "1579807695", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480212713375" + }, + + "DifficultyTest2650" : { + "parentTimestamp" : "1389207705", + "parentDifficulty" : "226223206", + "currentTimestamp" : "1389207724", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862957387822314" + }, + + "DifficultyTest2651" : { + "parentTimestamp" : "511636788", + "parentDifficulty" : "1810259854", + "currentTimestamp" : "511636807", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725916132795075" + }, + + "DifficultyTest2653" : { + "parentTimestamp" : "666080006", + "parentDifficulty" : "626208514", + "currentTimestamp" : "666080025", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451829272741021" + }, + + "DifficultyTest2654" : { + "parentTimestamp" : "1059977354", + "parentDifficulty" : "1201883047", + "currentTimestamp" : "1059977373", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903658494972735" + }, + + "DifficultyTest2655" : { + "parentTimestamp" : "1058831003", + "parentDifficulty" : "1476601370", + "currentTimestamp" : "1058831022", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807316063233462" + }, + + "DifficultyTest2663" : { + "parentTimestamp" : "117461763", + "parentDifficulty" : "1711719520", + "currentTimestamp" : "117461782", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135301481352" + }, + + "DifficultyTest2669" : { + "parentTimestamp" : "143358301", + "parentDifficulty" : "830832917", + "currentTimestamp" : "143358320", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138279989349" + }, + + "DifficultyTest2673" : { + "parentTimestamp" : "137244973", + "parentDifficulty" : "1792876860", + "currentTimestamp" : "137244992", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101388498328" + }, + + "DifficultyTest2674" : { + "parentTimestamp" : "1572856268", + "parentDifficulty" : "143298679", + "currentTimestamp" : "1572856287", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042199336222501" + }, + + "DifficultyTest2675" : { + "parentTimestamp" : "1492592679", + "parentDifficulty" : "1633592576", + "currentTimestamp" : "1492592698", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084400018782508" + }, + + "DifficultyTest2679" : { + "parentTimestamp" : "2065947640", + "parentDifficulty" : "1921053753", + "currentTimestamp" : "2065947659", + "currentBlockNumber" : "9900001", + "currentDifficulty" : "158456325028528675189008016411" + }, + + "DifficultyTest2680" : { + "parentTimestamp" : "389687176", + "parentDifficulty" : "1869845896", + "currentTimestamp" : "389687195", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188956833558" + }, + + "DifficultyTest2681" : { + "parentTimestamp" : "2115964250", + "parentDifficulty" : "73132811", + "currentTimestamp" : "2115964270", + "currentBlockNumber" : "1", + "currentDifficulty" : "73097102" + }, + + "DifficultyTest2682" : { + "parentTimestamp" : "1493198474", + "parentDifficulty" : "1540300774", + "currentTimestamp" : "1493198494", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1539548675" + }, + + "DifficultyTest2684" : { + "parentTimestamp" : "1304965725", + "parentDifficulty" : "387961980", + "currentTimestamp" : "1304965745", + "currentBlockNumber" : "225001", + "currentDifficulty" : "387772547" + }, + + "DifficultyTest2685" : { + "parentTimestamp" : "1069649180", + "parentDifficulty" : "1856869909", + "currentTimestamp" : "1069649200", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1855963237" + }, + + "DifficultyTest2687" : { + "parentTimestamp" : "538970122", + "parentDifficulty" : "1884199816", + "currentTimestamp" : "538970142", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1883279801" + }, + + "DifficultyTest2688" : { + "parentTimestamp" : "309896218", + "parentDifficulty" : "1815626161", + "currentTimestamp" : "309896238", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1814739633" + }, + + "DifficultyTest2691" : { + "parentTimestamp" : "1363254293", + "parentDifficulty" : "524105746", + "currentTimestamp" : "1363254313", + "currentBlockNumber" : "750001", + "currentDifficulty" : "523849867" + }, + + "DifficultyTest2693" : { + "parentTimestamp" : "1204171", + "parentDifficulty" : "445341576", + "currentTimestamp" : "1204191", + "currentBlockNumber" : "900001", + "currentDifficulty" : "445124253" + }, + + "DifficultyTest2695" : { + "parentTimestamp" : "719030671", + "parentDifficulty" : "140642233", + "currentTimestamp" : "719030691", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "140573817" + }, + + "DifficultyTest2698" : { + "parentTimestamp" : "605884769", + "parentDifficulty" : "177699688", + "currentTimestamp" : "605884789", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "177613945" + }, + + "DifficultyTest2699" : { + "parentTimestamp" : "370947694", + "parentDifficulty" : "996167489", + "currentTimestamp" : "370947714", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "995683128" + }, + + "DifficultyTest2703" : { + "parentTimestamp" : "1667792457", + "parentDifficulty" : "985086319", + "currentTimestamp" : "1667792477", + "currentBlockNumber" : "1650001", + "currentDifficulty" : "984621704" + }, + + "DifficultyTest2704" : { + "parentTimestamp" : "1230553582", + "parentDifficulty" : "703222072", + "currentTimestamp" : "1230553602", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "702911470" + }, + + "DifficultyTest2706" : { + "parentTimestamp" : "1682026230", + "parentDifficulty" : "533766864", + "currentTimestamp" : "1682026250", + "currentBlockNumber" : "1875001", + "currentDifficulty" : "533571772" + }, + + "DifficultyTest2709" : { + "parentTimestamp" : "1394216771", + "parentDifficulty" : "909383287", + "currentTimestamp" : "1394216791", + "currentBlockNumber" : "2100001", + "currentDifficulty" : "909463541" + }, + + "DifficultyTest2710" : { + "parentTimestamp" : "564401680", + "parentDifficulty" : "1669793519", + "currentTimestamp" : "564401700", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "1669502479" + }, + + "DifficultyTest2713" : { + "parentTimestamp" : "960132675", + "parentDifficulty" : "1383947009", + "currentTimestamp" : "960132695", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1387465558" + }, + + "DifficultyTest2715" : { + "parentTimestamp" : "447247923", + "parentDifficulty" : "189940716", + "currentTimestamp" : "447247943", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "198236580" + }, + + "DifficultyTest2716" : { + "parentTimestamp" : "1024012358", + "parentDifficulty" : "482324559", + "currentTimestamp" : "1024012378", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "498866265" + }, + + "DifficultyTest2717" : { + "parentTimestamp" : "2061211483", + "parentDifficulty" : "961608606", + "currentTimestamp" : "2061211503", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "994693503" + }, + + "DifficultyTest2720" : { + "parentTimestamp" : "172728154", + "parentDifficulty" : "1483372939", + "currentTimestamp" : "172728174", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "1616866364" + }, + + "DifficultyTest2721" : { + "parentTimestamp" : "42001003", + "parentDifficulty" : "727900025", + "currentTimestamp" : "42001023", + "currentBlockNumber" : "3000001", + "currentDifficulty" : "995980062" + }, + + "DifficultyTest2723" : { + "parentTimestamp" : "1415941013", + "parentDifficulty" : "2084917268", + "currentTimestamp" : "1415941033", + "currentBlockNumber" : "3150001", + "currentDifficulty" : "2620770154" + }, + + "DifficultyTest2724" : { + "parentTimestamp" : "255654677", + "parentDifficulty" : "674914208", + "currentTimestamp" : "255654697", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1748326485" + }, + + "DifficultyTest2725" : { + "parentTimestamp" : "620212587", + "parentDifficulty" : "1454166892", + "currentTimestamp" : "620212607", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "3600940498" + }, + + "DifficultyTest2730" : { + "parentTimestamp" : "2050745750", + "parentDifficulty" : "1795900352", + "currentTimestamp" : "2050745770", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "18974892632" + }, + + "DifficultyTest2731" : { + "parentTimestamp" : "201898073", + "parentDifficulty" : "933087128", + "currentTimestamp" : "201898093", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35292369888" + }, + + "DifficultyTest2734" : { + "parentTimestamp" : "997999653", + "parentDifficulty" : "418137362", + "currentTimestamp" : "997999673", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "137856886666" + }, + + "DifficultyTest2738" : { + "parentTimestamp" : "376654828", + "parentDifficulty" : "1484735848", + "currentTimestamp" : "376654848", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1100995638656" + }, + + "DifficultyTest2739" : { + "parentTimestamp" : "937788371", + "parentDifficulty" : "1030792872", + "currentTimestamp" : "937788391", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2200053545108" + }, + + "DifficultyTest2741" : { + "parentTimestamp" : "1569395274", + "parentDifficulty" : "1736684405", + "currentTimestamp" : "1569395294", + "currentBlockNumber" : "4500001", + "currentDifficulty" : "8797828858623" + }, + + "DifficultyTest2743" : { + "parentTimestamp" : "1309621419", + "parentDifficulty" : "1898283950", + "currentTimestamp" : "1309621439", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17594083401470" + }, + + "DifficultyTest2744" : { + "parentTimestamp" : "1235780437", + "parentDifficulty" : "99129606", + "currentTimestamp" : "1235780457", + "currentBlockNumber" : "4725001", + "currentDifficulty" : "35184471170035" + }, + + "DifficultyTest2746" : { + "parentTimestamp" : "614167539", + "parentDifficulty" : "989335554", + "currentTimestamp" : "614167559", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70369733030144" + }, + + "DifficultyTest2747" : { + "parentTimestamp" : "617450257", + "parentDifficulty" : "34733505", + "currentTimestamp" : "617450277", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140737523071874" + }, + + "DifficultyTest2751" : { + "parentTimestamp" : "2061235152", + "parentDifficulty" : "354288626", + "currentTimestamp" : "2061235172", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900260958258" + }, + + "DifficultyTest2752" : { + "parentTimestamp" : "1074717620", + "parentDifficulty" : "1199046636", + "currentTimestamp" : "1074717640", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251801012146413" + }, + + "DifficultyTest2756" : { + "parentTimestamp" : "832451577", + "parentDifficulty" : "981353062", + "currentTimestamp" : "832451597", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399490355870" + }, + + "DifficultyTest2757" : { + "parentTimestamp" : "1901624292", + "parentDifficulty" : "761244328", + "currentTimestamp" : "1901624312", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028797779836595" + }, + + "DifficultyTest2761" : { + "parentTimestamp" : "1598052467", + "parentDifficulty" : "1354168896", + "currentTimestamp" : "1598052487", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230377505219425" + }, + + "DifficultyTest2762" : { + "parentTimestamp" : "559920347", + "parentDifficulty" : "1719046888", + "currentTimestamp" : "559920367", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230377869919254" + }, + + "DifficultyTest2763" : { + "parentTimestamp" : "2116850028", + "parentDifficulty" : "1584583756", + "currentTimestamp" : "2116850048", + "currentBlockNumber" : "6150001", + "currentDifficulty" : "576460753887233522" + }, + + "DifficultyTest2766" : { + "parentTimestamp" : "1177069046", + "parentDifficulty" : "641701458", + "currentTimestamp" : "1177069066", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843009855082080" + }, + + "DifficultyTest2767" : { + "parentTimestamp" : "846539702", + "parentDifficulty" : "581843264", + "currentTimestamp" : "846539722", + "currentBlockNumber" : "6450001", + "currentDifficulty" : "4611686019008947065" + }, + + "DifficultyTest2769" : { + "parentTimestamp" : "1390776201", + "parentDifficulty" : "292451911", + "currentTimestamp" : "1390776221", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744074001860729" + }, + + "DifficultyTest2770" : { + "parentTimestamp" : "1386536696", + "parentDifficulty" : "2015164992", + "currentTimestamp" : "1386536716", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744075723732641" + }, + + "DifficultyTest2771" : { + "parentTimestamp" : "86838729", + "parentDifficulty" : "299709968", + "currentTimestamp" : "86838749", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488147718666858" + }, + + "DifficultyTest2773" : { + "parentTimestamp" : "315432795", + "parentDifficulty" : "1292158886", + "currentTimestamp" : "315432815", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952590967940878" + }, + + "DifficultyTest2776" : { + "parentTimestamp" : "1994152907", + "parentDifficulty" : "745038976", + "currentTimestamp" : "1994152927", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810359450326900" + }, + + "DifficultyTest2780" : { + "parentTimestamp" : "404933814", + "parentDifficulty" : "1704905545", + "currentTimestamp" : "404933834", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871349286768" + }, + + "DifficultyTest2784" : { + "parentTimestamp" : "944038570", + "parentDifficulty" : "1133905430", + "currentTimestamp" : "944038590", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958295061334" + }, + + "DifficultyTest2785" : { + "parentTimestamp" : "1511519986", + "parentDifficulty" : "490064560", + "currentTimestamp" : "1511520006", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725914813244407" + }, + + "DifficultyTest2786" : { + "parentTimestamp" : "1321745813", + "parentDifficulty" : "304983840", + "currentTimestamp" : "1321745833", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725914628254059" + }, + + "DifficultyTest2787" : { + "parentTimestamp" : "2062411640", + "parentDifficulty" : "1312006540", + "currentTimestamp" : "2062411660", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451829958204184" + }, + + "DifficultyTest2788" : { + "parentTimestamp" : "598272811", + "parentDifficulty" : "348849676", + "currentTimestamp" : "598272831", + "currentBlockNumber" : "8025001", + "currentDifficulty" : "302231454903657642355884" + }, + + "DifficultyTest2789" : { + "parentTimestamp" : "1796340782", + "parentDifficulty" : "1147585488", + "currentTimestamp" : "1796340802", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807315734378232" + }, + + "DifficultyTest2790" : { + "parentTimestamp" : "381891389", + "parentDifficulty" : "2081376676", + "currentTimestamp" : "381891409", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316667713467" + }, + + "DifficultyTest2795" : { + "parentTimestamp" : "199581897", + "parentDifficulty" : "528123", + "currentTimestamp" : "199581917", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917033398177274" + }, + + "DifficultyTest2796" : { + "parentTimestamp" : "1590282008", + "parentDifficulty" : "1697335558", + "currentTimestamp" : "1590282028", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068491805597" + }, + + "DifficultyTest2798" : { + "parentTimestamp" : "246268838", + "parentDifficulty" : "1550295810", + "currentTimestamp" : "246268858", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668135140136462" + }, + + "DifficultyTest2800" : { + "parentTimestamp" : "1650422037", + "parentDifficulty" : "910150953", + "currentTimestamp" : "1650422057", + "currentBlockNumber" : "8925001", + "currentDifficulty" : "154742504910672535272097072" + }, + + "DifficultyTest2801" : { + "parentTimestamp" : "1976113330", + "parentDifficulty" : "267751008", + "currentTimestamp" : "1976113350", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345068992401327" + }, + + "DifficultyTest2802" : { + "parentTimestamp" : "830046513", + "parentDifficulty" : "99241367", + "currentTimestamp" : "830046533", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345068823973966" + }, + + "DifficultyTest2803" : { + "parentTimestamp" : "1004908134", + "parentDifficulty" : "1477335131", + "currentTimestamp" : "1004908154", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138926175888" + }, + + "DifficultyTest2804" : { + "parentTimestamp" : "1587145364", + "parentDifficulty" : "1885500279", + "currentTimestamp" : "1587145384", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276783703849" + }, + + "DifficultyTest2805" : { + "parentTimestamp" : "713006370", + "parentDifficulty" : "973203648", + "currentTimestamp" : "713006390", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550770976899" + }, + + "DifficultyTest2806" : { + "parentTimestamp" : "1259751408", + "parentDifficulty" : "1750650119", + "currentTimestamp" : "1259751428", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760551548043758" + }, + + "DifficultyTest2808" : { + "parentTimestamp" : "1604424678", + "parentDifficulty" : "744180360", + "currentTimestamp" : "1604424698", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042199936810783" + }, + + "DifficultyTest2810" : { + "parentTimestamp" : "173750844", + "parentDifficulty" : "1502612254", + "currentTimestamp" : "173750864", + "currentBlockNumber" : "9675001", + "currentDifficulty" : "19807040628566084399887866141" + }, + + "DifficultyTest2811" : { + "parentTimestamp" : "85376531", + "parentDifficulty" : "1843637377", + "currentTimestamp" : "85376551", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168798614712332" + }, + + "DifficultyTest2812" : { + "parentTimestamp" : "134128398", + "parentDifficulty" : "1153019790", + "currentTimestamp" : "134128418", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594696407129" + }, + + "DifficultyTest2814" : { + "parentTimestamp" : "1495976956", + "parentDifficulty" : "1687881641", + "currentTimestamp" : "1495976976", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675188774958153" + }, + + "DifficultyTest2815" : { + "parentTimestamp" : "1825548017", + "parentDifficulty" : "322178086", + "currentTimestamp" : "1825548038", + "currentBlockNumber" : "1", + "currentDifficulty" : "322020773" + }, + + "DifficultyTest2816" : { + "parentTimestamp" : "1899406244", + "parentDifficulty" : "1983069086", + "currentTimestamp" : "1899406265", + "currentBlockNumber" : "75001", + "currentDifficulty" : "1982100791" + }, + + "DifficultyTest2819" : { + "parentTimestamp" : "963681121", + "parentDifficulty" : "1240109456", + "currentTimestamp" : "963681142", + "currentBlockNumber" : "300001", + "currentDifficulty" : "1239503936" + }, + + "DifficultyTest2821" : { + "parentTimestamp" : "1016386435", + "parentDifficulty" : "1806768464", + "currentTimestamp" : "1016386456", + "currentBlockNumber" : "450001", + "currentDifficulty" : "1805886257" + }, + + "DifficultyTest2822" : { + "parentTimestamp" : "1515378105", + "parentDifficulty" : "1214882918", + "currentTimestamp" : "1515378126", + "currentBlockNumber" : "525001", + "currentDifficulty" : "1214289722" + }, + + "DifficultyTest2827" : { + "parentTimestamp" : "244524657", + "parentDifficulty" : "1357746319", + "currentTimestamp" : "244524678", + "currentBlockNumber" : "900001", + "currentDifficulty" : "1357083485" + }, + + "DifficultyTest2828" : { + "parentTimestamp" : "1302256745", + "parentDifficulty" : "784958028", + "currentTimestamp" : "1302256766", + "currentBlockNumber" : "975001", + "currentDifficulty" : "784574876" + }, + + "DifficultyTest2829" : { + "parentTimestamp" : "507014976", + "parentDifficulty" : "1710037222", + "currentTimestamp" : "507014997", + "currentBlockNumber" : "1050001", + "currentDifficulty" : "1709202499" + }, + + "DifficultyTest2832" : { + "parentTimestamp" : "1976732633", + "parentDifficulty" : "2110031788", + "currentTimestamp" : "1976732654", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "2109002524" + }, + + "DifficultyTest2834" : { + "parentTimestamp" : "31935654", + "parentDifficulty" : "1931284366", + "currentTimestamp" : "31935675", + "currentBlockNumber" : "1425001", + "currentDifficulty" : "1930345453" + }, + + "DifficultyTest2844" : { + "parentTimestamp" : "188420354", + "parentDifficulty" : "1664350999", + "currentTimestamp" : "188420375", + "currentBlockNumber" : "2175001", + "currentDifficulty" : "1664062616" + }, + + "DifficultyTest2846" : { + "parentTimestamp" : "233703664", + "parentDifficulty" : "1547509049", + "currentTimestamp" : "233703685", + "currentBlockNumber" : "2325001", + "currentDifficulty" : "1548850582" + }, + + "DifficultyTest2847" : { + "parentTimestamp" : "908267754", + "parentDifficulty" : "1683480884", + "currentTimestamp" : "908267775", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1686853176" + }, + + "DifficultyTest2849" : { + "parentTimestamp" : "654893751", + "parentDifficulty" : "1921784068", + "currentTimestamp" : "654893772", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1929234305" + }, + + "DifficultyTest2853" : { + "parentTimestamp" : "1319296752", + "parentDifficulty" : "580835848", + "currentTimestamp" : "1319296773", + "currentBlockNumber" : "2850001", + "currentDifficulty" : "647661101" + }, + + "DifficultyTest2854" : { + "parentTimestamp" : "1778996408", + "parentDifficulty" : "280404864", + "currentTimestamp" : "1778996429", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "414485676" + }, + + "DifficultyTest2863" : { + "parentTimestamp" : "72366883", + "parentDifficulty" : "1083026662", + "currentTimestamp" : "72366904", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "18262367025" + }, + + "DifficultyTest2864" : { + "parentTimestamp" : "385431637", + "parentDifficulty" : "1986364461", + "currentTimestamp" : "385431658", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "19165263741" + }, + + "DifficultyTest2865" : { + "parentTimestamp" : "9911652", + "parentDifficulty" : "57294718", + "currentTimestamp" : "9911673", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "34417005111" + }, + + "DifficultyTest2866" : { + "parentTimestamp" : "1544068140", + "parentDifficulty" : "954296663", + "currentTimestamp" : "1544068161", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69673307434" + }, + + "DifficultyTest2872" : { + "parentTimestamp" : "1734399807", + "parentDifficulty" : "1517770936", + "currentTimestamp" : "1734399828", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1101028657613" + }, + + "DifficultyTest2873" : { + "parentTimestamp" : "1791828338", + "parentDifficulty" : "250416956", + "currentTimestamp" : "1791828359", + "currentBlockNumber" : "4350001", + "currentDifficulty" : "2199273550235" + }, + + "DifficultyTest2877" : { + "parentTimestamp" : "2112195712", + "parentDifficulty" : "258165576", + "currentTimestamp" : "2112195733", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592444083935" + }, + + "DifficultyTest2881" : { + "parentTimestamp" : "508329873", + "parentDifficulty" : "121486560", + "currentTimestamp" : "508329894", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140737609782569" + }, + + "DifficultyTest2882" : { + "parentTimestamp" : "374905274", + "parentDifficulty" : "419541167", + "currentTimestamp" : "374905295", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475396046969" + }, + + "DifficultyTest2884" : { + "parentTimestamp" : "104058162", + "parentDifficulty" : "1650530766", + "currentTimestamp" : "104058183", + "currentBlockNumber" : "5175001", + "currentDifficulty" : "562951603146155" + }, + + "DifficultyTest2885" : { + "parentTimestamp" : "1952631306", + "parentDifficulty" : "785997306", + "currentTimestamp" : "1952631327", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900692456143" + }, + + "DifficultyTest2886" : { + "parentTimestamp" : "493202270", + "parentDifficulty" : "2132155312", + "currentTimestamp" : "493202291", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251801944799469" + }, + + "DifficultyTest2887" : { + "parentTimestamp" : "1150464147", + "parentDifficulty" : "2014437472", + "currentTimestamp" : "1150464168", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601640824356" + }, + + "DifficultyTest2889" : { + "parentTimestamp" : "1909596396", + "parentDifficulty" : "383035688", + "currentTimestamp" : "1909596417", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007199637589651" + }, + + "DifficultyTest2890" : { + "parentTimestamp" : "1063535962", + "parentDifficulty" : "346588810", + "currentTimestamp" : "1063535983", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014398855901562" + }, + + "DifficultyTest2892" : { + "parentTimestamp" : "1170974688", + "parentDifficulty" : "385224619", + "currentTimestamp" : "1170974709", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028797404000490" + }, + + "DifficultyTest2893" : { + "parentTimestamp" : "1780089069", + "parentDifficulty" : "1861725070", + "currentTimestamp" : "1780089090", + "currentBlockNumber" : "5850001", + "currentDifficulty" : "72057595898743961" + }, + + "DifficultyTest2894" : { + "parentTimestamp" : "59935395", + "parentDifficulty" : "1941844716", + "currentTimestamp" : "59935416", + "currentBlockNumber" : "5925001", + "currentDifficulty" : "144115190016752422" + }, + + "DifficultyTest2896" : { + "parentTimestamp" : "1306913451", + "parentDifficulty" : "346649904", + "currentTimestamp" : "1306913472", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376498192386" + }, + + "DifficultyTest2899" : { + "parentTimestamp" : "69019403", + "parentDifficulty" : "206257392", + "currentTimestamp" : "69019424", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843009419850633" + }, + + "DifficultyTest2904" : { + "parentTimestamp" : "1008237520", + "parentDifficulty" : "422776924", + "currentTimestamp" : "1008237541", + "currentBlockNumber" : "6675001", + "currentDifficulty" : "18446744074132122106" + }, + + "DifficultyTest2905" : { + "parentTimestamp" : "1255347838", + "parentDifficulty" : "1362796952", + "currentTimestamp" : "1255347859", + "currentBlockNumber" : "6750001", + "currentDifficulty" : "36893488148781234756" + }, + + "DifficultyTest2907" : { + "parentTimestamp" : "1988685690", + "parentDifficulty" : "2044927170", + "currentTimestamp" : "1988685711", + "currentBlockNumber" : "6900001", + "currentDifficulty" : "147573952591720341599" + }, + + "DifficultyTest2910" : { + "parentTimestamp" : "1110073607", + "parentDifficulty" : "867914807", + "currentTimestamp" : "1110073628", + "currentBlockNumber" : "7125001", + "currentDifficulty" : "590295810359573142733" + }, + + "DifficultyTest2911" : { + "parentTimestamp" : "706642531", + "parentDifficulty" : "451533472", + "currentTimestamp" : "706642552", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620717862616421" + }, + + "DifficultyTest2912" : { + "parentTimestamp" : "573729330", + "parentDifficulty" : "1156976184", + "currentTimestamp" : "573729351", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620718567714679" + }, + + "DifficultyTest2916" : { + "parentTimestamp" : "198822994", + "parentDifficulty" : "653840096", + "currentTimestamp" : "198823015", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965739943948231" + }, + + "DifficultyTest2919" : { + "parentTimestamp" : "962010819", + "parentDifficulty" : "617205277", + "currentTimestamp" : "962010840", + "currentBlockNumber" : "7800001", + "currentDifficulty" : "75557863725914940323044" + }, + + "DifficultyTest2920" : { + "parentTimestamp" : "810256985", + "parentDifficulty" : "447373744", + "currentTimestamp" : "810257006", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725914770574436" + }, + + "DifficultyTest2921" : { + "parentTimestamp" : "91970031", + "parentDifficulty" : "963817256", + "currentTimestamp" : "91970052", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451829610184915" + }, + + "DifficultyTest2923" : { + "parentTimestamp" : "1894580695", + "parentDifficulty" : "1890804764", + "currentTimestamp" : "1894580716", + "currentBlockNumber" : "8100001", + "currentDifficulty" : "604462909807316477234608" + }, + + "DifficultyTest2924" : { + "parentTimestamp" : "1229192126", + "parentDifficulty" : "1541226909", + "currentTimestamp" : "1229192147", + "currentBlockNumber" : "8175001", + "currentDifficulty" : "604462909807316127827445" + }, + + "DifficultyTest2926" : { + "parentTimestamp" : "1185742250", + "parentDifficulty" : "1750758832", + "currentTimestamp" : "1185742271", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229260099316322" + }, + + "DifficultyTest2928" : { + "parentTimestamp" : "962287101", + "parentDifficulty" : "606118212", + "currentTimestamp" : "962287122", + "currentBlockNumber" : "8475001", + "currentDifficulty" : "4835703278458517304646960" + }, + + "DifficultyTest2929" : { + "parentTimestamp" : "1718233319", + "parentDifficulty" : "816833824", + "currentTimestamp" : "1718233340", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034214084388" + }, + + "DifficultyTest2930" : { + "parentTimestamp" : "402141826", + "parentDifficulty" : "1493288852", + "currentTimestamp" : "402141847", + "currentBlockNumber" : "8625001", + "currentDifficulty" : "19342813113834068287858524" + }, + + "DifficultyTest2931" : { + "parentTimestamp" : "545824900", + "parentDifficulty" : "1611029850", + "currentTimestamp" : "545824921", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135200840847" + }, + + "DifficultyTest2933" : { + "parentTimestamp" : "962501429", + "parentDifficulty" : "728022604", + "currentTimestamp" : "962501450", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336267908862389" + }, + + "DifficultyTest2936" : { + "parentTimestamp" : "1677202144", + "parentDifficulty" : "654072005", + "currentTimestamp" : "1677202165", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345069378533690" + }, + + "DifficultyTest2937" : { + "parentTimestamp" : "528157040", + "parentDifficulty" : "699401996", + "currentTimestamp" : "528157061", + "currentBlockNumber" : "9150001", + "currentDifficulty" : "618970019642690138148622604" + }, + + "DifficultyTest2938" : { + "parentTimestamp" : "985193507", + "parentDifficulty" : "1626233712", + "currentTimestamp" : "985193528", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276524563877" + }, + + "DifficultyTest2940" : { + "parentTimestamp" : "442588621", + "parentDifficulty" : "706857856", + "currentTimestamp" : "442588642", + "currentBlockNumber" : "9375001", + "currentDifficulty" : "2475880078570760550504761159" + }, + + "DifficultyTest2941" : { + "parentTimestamp" : "2024590022", + "parentDifficulty" : "1559795100", + "currentTimestamp" : "2024590043", + "currentBlockNumber" : "9450001", + "currentDifficulty" : "4951760157141521101155530378" + }, + + "DifficultyTest2942" : { + "parentTimestamp" : "764953210", + "parentDifficulty" : "966996013", + "currentTimestamp" : "764953231", + "currentBlockNumber" : "9525001", + "currentDifficulty" : "9903520314283042200159517639" + }, + + "DifficultyTest2943" : { + "parentTimestamp" : "1706454717", + "parentDifficulty" : "179924453", + "currentTimestamp" : "1706454738", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084398565824184" + }, + + "DifficultyTest2945" : { + "parentTimestamp" : "357818703", + "parentDifficulty" : "639782710", + "currentTimestamp" : "357818724", + "currentBlockNumber" : "9750001", + "currentDifficulty" : "39614081257132168797411445485" + }, + + "DifficultyTest2949" : { + "parentTimestamp" : "2076211975", + "parentDifficulty" : "1066436240", + "currentTimestamp" : "2076211997", + "currentBlockNumber" : "1", + "currentDifficulty" : "1065915520" + }, + + "DifficultyTest2954" : { + "parentTimestamp" : "322924575", + "parentDifficulty" : "350537573", + "currentTimestamp" : "322924597", + "currentBlockNumber" : "375001", + "currentDifficulty" : "350366415" + }, + + "DifficultyTest2959" : { + "parentTimestamp" : "1925472566", + "parentDifficulty" : "23398495", + "currentTimestamp" : "1925472588", + "currentBlockNumber" : "750001", + "currentDifficulty" : "23387102" + }, + + "DifficultyTest2960" : { + "parentTimestamp" : "1372648731", + "parentDifficulty" : "1990862760", + "currentTimestamp" : "1372648753", + "currentBlockNumber" : "825001", + "currentDifficulty" : "1989890724" + }, + + "DifficultyTest2961" : { + "parentTimestamp" : "1761563737", + "parentDifficulty" : "900261712", + "currentTimestamp" : "1761563759", + "currentBlockNumber" : "900001", + "currentDifficulty" : "899822260" + }, + + "DifficultyTest2965" : { + "parentTimestamp" : "66263916", + "parentDifficulty" : "410110640", + "currentTimestamp" : "66263938", + "currentBlockNumber" : "1200001", + "currentDifficulty" : "409911415" + }, + + "DifficultyTest2966" : { + "parentTimestamp" : "1932551949", + "parentDifficulty" : "1407175800", + "currentTimestamp" : "1932551971", + "currentBlockNumber" : "1275001", + "currentDifficulty" : "1406489727" + }, + + "DifficultyTest2967" : { + "parentTimestamp" : "985719665", + "parentDifficulty" : "233086210", + "currentTimestamp" : "985719687", + "currentBlockNumber" : "1350001", + "currentDifficulty" : "232974447" + }, + + "DifficultyTest2969" : { + "parentTimestamp" : "1065269862", + "parentDifficulty" : "1781210699", + "currentTimestamp" : "1065269884", + "currentBlockNumber" : "1500001", + "currentDifficulty" : "1780349160" + }, + + "DifficultyTest2972" : { + "parentTimestamp" : "1254027217", + "parentDifficulty" : "1186430305", + "currentTimestamp" : "1254027239", + "currentBlockNumber" : "1725001", + "currentDifficulty" : "1185883762" + }, + + "DifficultyTest2981" : { + "parentTimestamp" : "108895599", + "parentDifficulty" : "1227517294", + "currentTimestamp" : "108895621", + "currentBlockNumber" : "2400001", + "currentDifficulty" : "1231112225" + }, + + "DifficultyTest2982" : { + "parentTimestamp" : "1410759812", + "parentDifficulty" : "1459649030", + "currentTimestamp" : "1410759834", + "currentBlockNumber" : "2475001", + "currentDifficulty" : "1463130615" + }, + + "DifficultyTest2983" : { + "parentTimestamp" : "2097381850", + "parentDifficulty" : "1690377712", + "currentTimestamp" : "2097381872", + "currentBlockNumber" : "2550001", + "currentDifficulty" : "1697940941" + }, + + "DifficultyTest2984" : { + "parentTimestamp" : "1901746596", + "parentDifficulty" : "1155269282", + "currentTimestamp" : "1901746618", + "currentBlockNumber" : "2625001", + "currentDifficulty" : "1171482402" + }, + + "DifficultyTest2985" : { + "parentTimestamp" : "2023186282", + "parentDifficulty" : "1554152068", + "currentTimestamp" : "2023186304", + "currentBlockNumber" : "2700001", + "currentDifficulty" : "1586947637" + }, + + "DifficultyTest2986" : { + "parentTimestamp" : "2049284092", + "parentDifficulty" : "705315742", + "currentTimestamp" : "2049284114", + "currentBlockNumber" : "2775001", + "currentDifficulty" : "738525782" + }, + + "DifficultyTest2988" : { + "parentTimestamp" : "335784491", + "parentDifficulty" : "1762462832", + "currentTimestamp" : "335784513", + "currentBlockNumber" : "2925001", + "currentDifficulty" : "1895819983" + }, + + "DifficultyTest2992" : { + "parentTimestamp" : "1016416142", + "parentDifficulty" : "855249624", + "currentTimestamp" : "1016416164", + "currentBlockNumber" : "3225001", + "currentDifficulty" : "1928573846" + }, + + "DifficultyTest2993" : { + "parentTimestamp" : "223538587", + "parentDifficulty" : "545724901", + "currentTimestamp" : "223538609", + "currentBlockNumber" : "3300001", + "currentDifficulty" : "2692942082" + }, + + "DifficultyTest2994" : { + "parentTimestamp" : "1790965099", + "parentDifficulty" : "1989952540", + "currentTimestamp" : "1790965121", + "currentBlockNumber" : "3375001", + "currentDifficulty" : "4136464532" + }, + + "DifficultyTest2995" : { + "parentTimestamp" : "44579327", + "parentDifficulty" : "1092643400", + "currentTimestamp" : "44579349", + "currentBlockNumber" : "3450001", + "currentDifficulty" : "5387077179" + }, + + "DifficultyTest2997" : { + "parentTimestamp" : "566835108", + "parentDifficulty" : "201297150", + "currentTimestamp" : "566835130", + "currentBlockNumber" : "3600001", + "currentDifficulty" : "17381068045" + }, + + "DifficultyTest2998" : { + "parentTimestamp" : "587105969", + "parentDifficulty" : "743025184", + "currentTimestamp" : "587105991", + "currentBlockNumber" : "3675001", + "currentDifficulty" : "17922531563" + }, + + "DifficultyTest2999" : { + "parentTimestamp" : "165666709", + "parentDifficulty" : "1031705176", + "currentTimestamp" : "165666731", + "currentBlockNumber" : "3750001", + "currentDifficulty" : "35390939782" + }, + + "DifficultyTest3000" : { + "parentTimestamp" : "556525390", + "parentDifficulty" : "923792924", + "currentTimestamp" : "556525412", + "currentBlockNumber" : "3825001", + "currentDifficulty" : "69642818590" + }, + + "DifficultyTest3001" : { + "parentTimestamp" : "1789394390", + "parentDifficulty" : "166907612", + "currentTimestamp" : "1789394412", + "currentBlockNumber" : "3900001", + "currentDifficulty" : "137605779587" + }, + + "DifficultyTest3002" : { + "parentTimestamp" : "1990568064", + "parentDifficulty" : "1086419360", + "currentTimestamp" : "1990568086", + "currentBlockNumber" : "3975001", + "currentDifficulty" : "138524842354" + }, + + "DifficultyTest3003" : { + "parentTimestamp" : "69076768", + "parentDifficulty" : "799964148", + "currentTimestamp" : "69076790", + "currentBlockNumber" : "4050001", + "currentDifficulty" : "275677480485" + }, + + "DifficultyTest3004" : { + "parentTimestamp" : "728351263", + "parentDifficulty" : "1002819078", + "currentTimestamp" : "728351285", + "currentBlockNumber" : "4125001", + "currentDifficulty" : "550758143309" + }, + + "DifficultyTest3005" : { + "parentTimestamp" : "1105686818", + "parentDifficulty" : "237852473", + "currentTimestamp" : "1105686840", + "currentBlockNumber" : "4200001", + "currentDifficulty" : "1099749364111" + }, + + "DifficultyTest3006" : { + "parentTimestamp" : "2088632830", + "parentDifficulty" : "1424948646", + "currentTimestamp" : "2088632852", + "currentBlockNumber" : "4275001", + "currentDifficulty" : "1100935880647" + }, + + "DifficultyTest3011" : { + "parentTimestamp" : "389272083", + "parentDifficulty" : "115125467", + "currentTimestamp" : "389272105", + "currentBlockNumber" : "4650001", + "currentDifficulty" : "17592301113670" + }, + + "DifficultyTest3012" : { + "parentTimestamp" : "1088877101", + "parentDifficulty" : "1882877410", + "currentTimestamp" : "1088877123", + "currentBlockNumber" : "4725001", + "currentDifficulty" : "35186254046869" + }, + + "DifficultyTest3013" : { + "parentTimestamp" : "1066265763", + "parentDifficulty" : "704530986", + "currentTimestamp" : "1066265785", + "currentBlockNumber" : "4800001", + "currentDifficulty" : "70369448364641" + }, + + "DifficultyTest3014" : { + "parentTimestamp" : "1688384610", + "parentDifficulty" : "1661809569", + "currentTimestamp" : "1688384632", + "currentBlockNumber" : "4875001", + "currentDifficulty" : "70370405175803" + }, + + "DifficultyTest3015" : { + "parentTimestamp" : "2068645396", + "parentDifficulty" : "1447835707", + "currentTimestamp" : "2068645418", + "currentBlockNumber" : "4950001", + "currentDifficulty" : "140738935484084" + }, + + "DifficultyTest3016" : { + "parentTimestamp" : "1193785186", + "parentDifficulty" : "80985998", + "currentTimestamp" : "1193785208", + "currentBlockNumber" : "5025001", + "currentDifficulty" : "281475057657111" + }, + + "DifficultyTest3019" : { + "parentTimestamp" : "903447743", + "parentDifficulty" : "631982576", + "currentTimestamp" : "903447765", + "currentBlockNumber" : "5250001", + "currentDifficulty" : "1125900538516615" + }, + + "DifficultyTest3020" : { + "parentTimestamp" : "112252687", + "parentDifficulty" : "974600932", + "currentTimestamp" : "112252709", + "currentBlockNumber" : "5325001", + "currentDifficulty" : "2251800787810301" + }, + + "DifficultyTest3021" : { + "parentTimestamp" : "2139804147", + "parentDifficulty" : "1639599038", + "currentTimestamp" : "2139804169", + "currentBlockNumber" : "5400001", + "currentDifficulty" : "4503601266168949" + }, + + "DifficultyTest3022" : { + "parentTimestamp" : "579394515", + "parentDifficulty" : "1667788730", + "currentTimestamp" : "579394537", + "currentBlockNumber" : "5475001", + "currentDifficulty" : "4503601294344877" + }, + + "DifficultyTest3023" : { + "parentTimestamp" : "665141337", + "parentDifficulty" : "797745728", + "currentTimestamp" : "665141359", + "currentBlockNumber" : "5550001", + "currentDifficulty" : "9007200052097196" + }, + + "DifficultyTest3024" : { + "parentTimestamp" : "1998639336", + "parentDifficulty" : "906557376", + "currentTimestamp" : "1998639358", + "currentBlockNumber" : "5625001", + "currentDifficulty" : "18014399415596706" + }, + + "DifficultyTest3025" : { + "parentTimestamp" : "2085735393", + "parentDifficulty" : "1862148132", + "currentTimestamp" : "2085735415", + "currentBlockNumber" : "5700001", + "currentDifficulty" : "36028798880202848" + }, + + "DifficultyTest3026" : { + "parentTimestamp" : "19126304", + "parentDifficulty" : "1912047252", + "currentTimestamp" : "19126326", + "currentBlockNumber" : "5775001", + "currentDifficulty" : "36028798930077604" + }, + + "DifficultyTest3029" : { + "parentTimestamp" : "1508416706", + "parentDifficulty" : "215063161", + "currentTimestamp" : "1508416728", + "currentBlockNumber" : "6000001", + "currentDifficulty" : "288230376366669894" + }, + + "DifficultyTest3030" : { + "parentTimestamp" : "817104228", + "parentDifficulty" : "415735541", + "currentTimestamp" : "817104250", + "currentBlockNumber" : "6075001", + "currentDifficulty" : "288230376567244290" + }, + + "DifficultyTest3033" : { + "parentTimestamp" : "1072746135", + "parentDifficulty" : "1599970417", + "currentTimestamp" : "1072746157", + "currentBlockNumber" : "6300001", + "currentDifficulty" : "2305843010812883134" + }, + + "DifficultyTest3034" : { + "parentTimestamp" : "1863161462", + "parentDifficulty" : "2099788405", + "currentTimestamp" : "1863161484", + "currentBlockNumber" : "6375001", + "currentDifficulty" : "2305843011312457070" + }, + + "DifficultyTest3036" : { + "parentTimestamp" : "106136823", + "parentDifficulty" : "1959019776", + "currentTimestamp" : "106136845", + "currentBlockNumber" : "6525001", + "currentDifficulty" : "9223372038812839032" + }, + + "DifficultyTest3037" : { + "parentTimestamp" : "717026699", + "parentDifficulty" : "1845502704", + "currentTimestamp" : "717026721", + "currentBlockNumber" : "6600001", + "currentDifficulty" : "18446744075554153196" + }, + + "DifficultyTest3040" : { + "parentTimestamp" : "397344973", + "parentDifficulty" : "448809852", + "currentTimestamp" : "397344995", + "currentBlockNumber" : "6825001", + "currentDifficulty" : "73786976295286797171" + }, + + "DifficultyTest3043" : { + "parentTimestamp" : "1154875669", + "parentDifficulty" : "1060052592", + "currentTimestamp" : "1154875691", + "currentBlockNumber" : "7050001", + "currentDifficulty" : "295147905180412360845" + }, + + "DifficultyTest3045" : { + "parentTimestamp" : "115056243", + "parentDifficulty" : "2062675363", + "currentTimestamp" : "115056265", + "currentBlockNumber" : "7200001", + "currentDifficulty" : "1180591620719472971622" + }, + + "DifficultyTest3046" : { + "parentTimestamp" : "1586073925", + "parentDifficulty" : "575268017", + "currentTimestamp" : "1586073947", + "currentBlockNumber" : "7275001", + "currentDifficulty" : "1180591620717986290549" + }, + + "DifficultyTest3048" : { + "parentTimestamp" : "339444660", + "parentDifficulty" : "1665210503", + "currentTimestamp" : "339444682", + "currentBlockNumber" : "7425001", + "currentDifficulty" : "4722366482871309611108" + }, + + "DifficultyTest3050" : { + "parentTimestamp" : "1149574277", + "parentDifficulty" : "1473432064", + "currentTimestamp" : "1149574299", + "currentBlockNumber" : "7575001", + "currentDifficulty" : "9444732965740763140007" + }, + + "DifficultyTest3051" : { + "parentTimestamp" : "452070738", + "parentDifficulty" : "1510162536", + "currentTimestamp" : "452070760", + "currentBlockNumber" : "7650001", + "currentDifficulty" : "18889465931480090279936" + }, + + "DifficultyTest3052" : { + "parentTimestamp" : "24203251", + "parentDifficulty" : "882287718", + "currentTimestamp" : "24203273", + "currentBlockNumber" : "7725001", + "currentDifficulty" : "37778931862958043566482" + }, + + "DifficultyTest3054" : { + "parentTimestamp" : "104721161", + "parentDifficulty" : "764121716", + "currentTimestamp" : "104721183", + "currentBlockNumber" : "7875001", + "currentDifficulty" : "75557863725915087167746" + }, + + "DifficultyTest3055" : { + "parentTimestamp" : "694895077", + "parentDifficulty" : "78393862", + "currentTimestamp" : "694895099", + "currentBlockNumber" : "7950001", + "currentDifficulty" : "151115727451828725193856" + }, + + "DifficultyTest3059" : { + "parentTimestamp" : "1209124709", + "parentDifficulty" : "309429840", + "currentTimestamp" : "1209124731", + "currentBlockNumber" : "8250001", + "currentDifficulty" : "1208925819614629483984928" + }, + + "DifficultyTest3060" : { + "parentTimestamp" : "811682595", + "parentDifficulty" : "362209987", + "currentTimestamp" : "811682617", + "currentBlockNumber" : "8325001", + "currentDifficulty" : "2417851639229258711445479" + }, + + "DifficultyTest3063" : { + "parentTimestamp" : "1467188932", + "parentDifficulty" : "1522487099", + "currentTimestamp" : "1467188954", + "currentBlockNumber" : "8550001", + "currentDifficulty" : "9671406556917034919393106" + }, + + "DifficultyTest3065" : { + "parentTimestamp" : "1312551216", + "parentDifficulty" : "1938318506", + "currentTimestamp" : "1312551238", + "currentBlockNumber" : "8700001", + "currentDifficulty" : "38685626227668135527969694" + }, + + "DifficultyTest3066" : { + "parentTimestamp" : "384030560", + "parentDifficulty" : "1179266612", + "currentTimestamp" : "384030582", + "currentBlockNumber" : "8775001", + "currentDifficulty" : "38685626227668134769288431" + }, + + "DifficultyTest3067" : { + "parentTimestamp" : "600675553", + "parentDifficulty" : "1039615254", + "currentTimestamp" : "600675575", + "currentBlockNumber" : "8850001", + "currentDifficulty" : "77371252455336268220302894" + }, + + "DifficultyTest3069" : { + "parentTimestamp" : "260221825", + "parentDifficulty" : "1145422528", + "currentTimestamp" : "260221847", + "currentBlockNumber" : "9000001", + "currentDifficulty" : "309485009821345069869644296" + }, + + "DifficultyTest3070" : { + "parentTimestamp" : "156131498", + "parentDifficulty" : "1739618853", + "currentTimestamp" : "156131520", + "currentBlockNumber" : "9075001", + "currentDifficulty" : "309485009821345070463550486" + }, + + "DifficultyTest3072" : { + "parentTimestamp" : "687067996", + "parentDifficulty" : "1263655050", + "currentTimestamp" : "687068018", + "currentBlockNumber" : "9225001", + "currentDifficulty" : "1237940039285380276162162255" + }, + + "DifficultyTest3073" : { + "parentTimestamp" : "1001880499", + "parentDifficulty" : "764173890", + "currentTimestamp" : "1001880521", + "currentBlockNumber" : "9300001", + "currentDifficulty" : "2475880078570760550562049207" + }, + + "DifficultyTest3077" : { + "parentTimestamp" : "1618877729", + "parentDifficulty" : "1122849554", + "currentTimestamp" : "1618877751", + "currentBlockNumber" : "9600001", + "currentDifficulty" : "19807040628566084399508288872" + }, + + "DifficultyTest3080" : { + "parentTimestamp" : "1417428364", + "parentDifficulty" : "1112942352", + "currentTimestamp" : "1417428386", + "currentBlockNumber" : "9825001", + "currentDifficulty" : "79228162514264337594656349260" + }, + + "DifficultyTest3082" : { + "parentTimestamp" : "1533343394", + "parentDifficulty" : "405819058", + "currentTimestamp" : "1533343416", + "currentBlockNumber" : "9975001", + "currentDifficulty" : "158456325028528675187493521577" } } diff --git a/tests/files/BasicTests/genesishashestest.json b/tests/files/BasicTests/genesishashestest.json old mode 100755 new mode 100644 index 4687cab9bf9b..ff17b1539818 --- a/tests/files/BasicTests/genesishashestest.json +++ b/tests/files/BasicTests/genesishashestest.json @@ -1,5 +1,5 @@ { - "genesis_rlp_hex": "f901f8f901f3a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a09178d0f23c965d81f0834a4c72c6253ce6830f4022b1359aaebfc1ecba442d4ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808080a0000000000000000000000000000000000000000000000000000000000000000088000000000000002ac0c0", - "genesis_state_root": "9178d0f23c965d81f0834a4c72c6253ce6830f4022b1359aaebfc1ecba442d4e", - "genesis_hash": "fd4af92a79c7fc2fd8bf0d342f2e832e1d4f485c85b9152d2039e03bc604fdca" + "genesis_rlp_hex": "f90219f90214a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850400000000808213888080a011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82faa00000000000000000000000000000000000000000000000000000000000000000880000000000000042c0c0", + "genesis_state_root": "d7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544", + "genesis_hash": "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3" } diff --git a/tests/files/BasicTests/hexencodetest.json b/tests/files/BasicTests/hexencodetest.json old mode 100755 new mode 100644 diff --git a/tests/files/BasicTests/keyaddrtest.json b/tests/files/BasicTests/keyaddrtest.json old mode 100755 new mode 100644 diff --git a/tests/files/BasicTests/txtest.json b/tests/files/BasicTests/txtest.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/RandomTests/bl10251623GO.json b/tests/files/BlockchainTests/RandomTests/bl10251623GO.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/RandomTests/bl201507071825GO.json b/tests/files/BlockchainTests/RandomTests/bl201507071825GO.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcBlockGasLimitTest.json b/tests/files/BlockchainTests/bcBlockGasLimitTest.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcForkBlockTest.json b/tests/files/BlockchainTests/bcForkBlockTest.json old mode 100755 new mode 100644 index d7d45e89012d..0215e9bae936 --- a/tests/files/BlockchainTests/bcForkBlockTest.json +++ b/tests/files/BlockchainTests/bcForkBlockTest.json @@ -1,321 +1,261 @@ { - "SimpleTxCosts20000" : { - "blocks" : [ - { - "rlp" : "0xf90260f901f9a0e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0414135f01c4de156a9f2bc01a42ed827e1042f859aea4b1a00dd0713a4e8c696a08da0fbf1adcf4cacf92376e5d04d9a27c12241aec440fa650da14ffe53cbc811a0e60c1a8e6afacd80b169c0b7b970bca5bd532f50549e8a525b2d7bfd5fd90270b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8824e2084551f121980a0e90230ef822cf25172ec98a598fa15e0395fbff5a41a8edb075fbf3a1c243fdf8898997592fb8a3fa7f861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca08457f38c821af59f4e088a0cc693070670ea540209a33cf17b174cdc2364c5a8a09590e57e474e6428079057e4ab7135a73168c28b2dd32a1b0fb9e5bb72e45d24c0" - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x20000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733", - "mixHash" : "79a516ea16b8b0071c9a83c89ebfd96d29e614f1bd519f733ea82cb76287ca6c", - "nonce" : "3c37bc117e5135d8", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "lastblockhash" : "e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733", - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a079a516ea16b8b0071c9a83c89ebfd96d29e614f1bd519f733ea82cb76287ca6c883c37bc117e5135d8c0c0", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x14d1120d7b160000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - } - } + "SimpleTxCosts20000": { + "blocks": [{ + "rlp": "0xf90260f901f9a0e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0414135f01c4de156a9f2bc01a42ed827e1042f859aea4b1a00dd0713a4e8c696a08da0fbf1adcf4cacf92376e5d04d9a27c12241aec440fa650da14ffe53cbc811a0e60c1a8e6afacd80b169c0b7b970bca5bd532f50549e8a525b2d7bfd5fd90270b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8824e2084551f121980a0e90230ef822cf25172ec98a598fa15e0395fbff5a41a8edb075fbf3a1c243fdf8898997592fb8a3fa7f861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca08457f38c821af59f4e088a0cc693070670ea540209a33cf17b174cdc2364c5a8a09590e57e474e6428079057e4ab7135a73168c28b2dd32a1b0fb9e5bb72e45d24c0" + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x20000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733", + "mixHash": "79a516ea16b8b0071c9a83c89ebfd96d29e614f1bd519f733ea82cb76287ca6c", + "nonce": "3c37bc117e5135d8", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - - "BlockExtraData25" : { - "blocks" : [ - { - "rlp" : "0xf90663f905fca055e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a09ee6c6d3ba44b01327c41171dd5316e04f0f71f8286960fe8408e06fe156438fa0bc37d79753ad738a6dac4921e57392f145d8887476de3f783dfa7edae9283e52b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455200109b904010102030405060708091011121314151617181920212223242510000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a0a0fdabfa4034aea18f6b722643f1611f33a4da71804367cec161946f5308ceae8803c6884fb3570f4af861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0e172fae6bbd140fdce64cb80776b0a70488646c1bce1caf94dfba74975d14414a03b55ce283b425c4c37219148f4b057fd67018096f5feef8dc7afafdfc91df442c0" - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x20000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "55e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00", - "mixHash" : "2afb8dc82d0d45cce72967ed9c00892fb808bb92e9ff22fe1c51a6b842c783e5", - "nonce" : "f9d04b2fcc151a74", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "lastblockhash" : "55e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00", - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a02afb8dc82d0d45cce72967ed9c00892fb808bb92e9ff22fe1c51a6b842c783e588f9d04b2fcc151a74c0c0", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x14d1120d7b160000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "1", - "storage" : { - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - } - } + "lastblockhash": "e6b9733f0b922036b3ba8de0e077c160b553fef8935f5a0f1d8dd46325b26733", + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a079a516ea16b8b0071c9a83c89ebfd96d29e614f1bd519f733ea82cb76287ca6c883c37bc117e5135d8c0c0", + "postState": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } + } + }, - "BlockWrongStoreSetGas" : { - "blocks" : [ - { - "rlp" : "0xf90260f901f9a0fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0fa43a6918249a341c9dc2ac6901c65206245c2a1913d108adf9ee896b86b72d8a0499e7f409b56dad6f79d7cc5b25083ae73a8942bac5a49baa23d70a19263c419a073a67c5782873d66dc97e72fdcccd005e47ebf9b19450ca38f923bb69dc036ffb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252d6845520589c00a04b510481836fcfc589dbc1480a88394fc3800c1ba1e3540d74b22abe0867f0a188ef8d43e412b29332f861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ca0ef1f1816a506f56b5260c709f34c311903fa24ee7d1a4cc9be26f6c7b12ed570a0e2377a1966e346733505bc42fb65ed854a9323f846c16a139bfabab3dc9b717ac0" - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x20000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6", - "mixHash" : "e49f57f3c1eec112b86bf41733f03a1d82f402941c11219e250574514627e577", - "nonce" : "aa40d3c520d10cc8", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "781413a37d7ceb31dd5e02ed699bb19f875904a6cd46e003a5238121fdef623b", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "lastblockhash" : "fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6", - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0781413a37d7ceb31dd5e02ed699bb19f875904a6cd46e003a5238121fdef623ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0e49f57f3c1eec112b86bf41733f03a1d82f402941c11219e250574514627e57788aa40d3c520d10cc8c0c0", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x14d1120d7b160000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x6012600055", - "nonce" : "0x00", - "storage" : { - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x6012600055", - "nonce" : "0x00", - "storage" : { - } - } + "BlockExtraData25": { + "blocks": [{ + "rlp": "0xf90663f905fca055e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017a09ee6c6d3ba44b01327c41171dd5316e04f0f71f8286960fe8408e06fe156438fa0bc37d79753ad738a6dac4921e57392f145d8887476de3f783dfa7edae9283e52b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455200109b904010102030405060708091011121314151617181920212223242510000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a0a0fdabfa4034aea18f6b722643f1611f33a4da71804367cec161946f5308ceae8803c6884fb3570f4af861f85f800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba0e172fae6bbd140fdce64cb80776b0a70488646c1bce1caf94dfba74975d14414a03b55ce283b425c4c37219148f4b057fd67018096f5feef8dc7afafdfc91df442c0" + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x20000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "55e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00", + "mixHash": "2afb8dc82d0d45cce72967ed9c00892fb808bb92e9ff22fe1c51a6b842c783e5", + "nonce": "f9d04b2fcc151a74", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "lastblockhash": "55e75bec293d5d5f38213bded3d27435ca91cee285c1f76a658ddccdccd08d00", + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a02afb8dc82d0d45cce72967ed9c00892fb808bb92e9ff22fe1c51a6b842c783e588f9d04b2fcc151a74c0c0", + "postState": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } + }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } + } + }, + "BlockWrongStoreSetGas": { + "blocks": [{ + "rlp": "0xf90260f901f9a0fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0fa43a6918249a341c9dc2ac6901c65206245c2a1913d108adf9ee896b86b72d8a0499e7f409b56dad6f79d7cc5b25083ae73a8942bac5a49baa23d70a19263c419a073a67c5782873d66dc97e72fdcccd005e47ebf9b19450ca38f923bb69dc036ffb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252d6845520589c00a04b510481836fcfc589dbc1480a88394fc3800c1ba1e3540d74b22abe0867f0a188ef8d43e412b29332f861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ca0ef1f1816a506f56b5260c709f34c311903fa24ee7d1a4cc9be26f6c7b12ed570a0e2377a1966e346733505bc42fb65ed854a9323f846c16a139bfabab3dc9b717ac0" + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x20000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6", + "mixHash": "e49f57f3c1eec112b86bf41733f03a1d82f402941c11219e250574514627e577", + "nonce": "aa40d3c520d10cc8", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "781413a37d7ceb31dd5e02ed699bb19f875904a6cd46e003a5238121fdef623b", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "lastblockhash": "fe8971aa67f2b822d705da25733a5915216649b723157e72cde735fdd0bbbfe6", + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0781413a37d7ceb31dd5e02ed699bb19f875904a6cd46e003a5238121fdef623ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0e49f57f3c1eec112b86bf41733f03a1d82f402941c11219e250574514627e57788aa40d3c520d10cc8c0c0", + "postState": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x6012600055", + "nonce": "0x00", + "storage": {} + } + }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x6012600055", + "nonce": "0x00", + "storage": {} + } + } + }, + "BlockWrongResetGas": { + "blocks": [{ + "rlp": "0xf90260f901f9a0e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a00c4e05cfc93ec92cbfb6ff3f07b9ccba294e13f8881ca3b695a47691725e9d52a039e2a46254e21f73fb52b7754e6494dca6d1bae60e194628fff47ca3dea11518a05272b11fc2171a6cf2d6dcdc701cca353310245e9a1f1777602e7ff025d96aabb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252138455205cb500a0b183084eabf791848551bb954dea9bc9cbb3dede738209d98f2d09e93a660d0e8845f9bffe0a8c2ad2f861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ba0879aba7b6048f06a581f904fefeaa8557c9a7eb83eb63af6938aa3cc90733a76a0b92eca3949cc83e4bb8069f65b09894eb4f6ee3a2c144df899c557c63f0d24a3c0" + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x20000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63", + "mixHash": "27e9f3fd3617f1c02782709eba97fe7920b03961de1bd88dabc4a8c431facdad", + "nonce": "be030eed4ae24d69", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "5b53ecce92ad44bada5b97cdfc139c770a9d253d4e3c72e925cc1ea11cfe6082", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "lastblockhash": "e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63", + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05b53ecce92ad44bada5b97cdfc139c770a9d253d4e3c72e925cc1ea11cfe6082a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a027e9f3fd3617f1c02782709eba97fe7920b03961de1bd88dabc4a8c431facdad88be030eed4ae24d69c0c0", + "postState": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x6032600055", + "nonce": "0x00", + "storage": { + "0x": "0x12" } + } }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x6032600055", + "nonce": "0x00", + "storage": { + "0x": "0x12" + } + } + } + }, - "BlockWrongResetGas" : { - "blocks" : [ - { - "rlp" : "0xf90260f901f9a0e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a00c4e05cfc93ec92cbfb6ff3f07b9ccba294e13f8881ca3b695a47691725e9d52a039e2a46254e21f73fb52b7754e6494dca6d1bae60e194628fff47ca3dea11518a05272b11fc2171a6cf2d6dcdc701cca353310245e9a1f1777602e7ff025d96aabb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252138455205cb500a0b183084eabf791848551bb954dea9bc9cbb3dede738209d98f2d09e93a660d0e8845f9bffe0a8c2ad2f861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ba0879aba7b6048f06a581f904fefeaa8557c9a7eb83eb63af6938aa3cc90733a76a0b92eca3949cc83e4bb8069f65b09894eb4f6ee3a2c144df899c557c63f0d24a3c0" - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x20000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63", - "mixHash" : "27e9f3fd3617f1c02782709eba97fe7920b03961de1bd88dabc4a8c431facdad", - "nonce" : "be030eed4ae24d69", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "5b53ecce92ad44bada5b97cdfc139c770a9d253d4e3c72e925cc1ea11cfe6082", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "lastblockhash" : "e58728c5c414ab020e2ea1afc57c6d568d59c15da6e865fba417ffeff4194c63", - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a05b53ecce92ad44bada5b97cdfc139c770a9d253d4e3c72e925cc1ea11cfe6082a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a027e9f3fd3617f1c02782709eba97fe7920b03961de1bd88dabc4a8c431facdad88be030eed4ae24d69c0c0", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x14d1120d7b160000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "1", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x6032600055", - "nonce" : "0x00", - "storage" : { - "0x" : "0x12" - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x6032600055", - "nonce" : "0x00", - "storage" : { - "0x" : "0x12" - } - } + "BlockWrongStoreClears": { + "blocks": [{ + "rlp": "0xf90260f901f9a0b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a022acf357764b1a92bad08aa2b892c4fb202603a7c5d93715f264fcfc0006560aa0fa47fec4460036c6adadad7abf8dcca6351745fff036fb9d6509d1fffa9c47b5a0bb944e3499f51548f6d37e04f9d918d8510954760cd4c0262507733f60e6432fb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882292084552064c700a02340ad0249a1e6bbe4c6a880d7aa95cef5ceb6cea6e63fa6a50ad8319822d61688936bfd96de95375ff861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ba02388d4327dec4a133b3b8e558d25e7a117f6c7d2f5b1431014b69cae7496f758a0542851efe150eba1c3d9bae8778f41db144bb65fa71bee41915fc03d3ecfe1a4c0" + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x20000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551", + "mixHash": "99d5457ad6de954e86e0c80f56ca1fbc81c692766cd2206d2038b1880f98ff38", + "nonce": "99f1656c715f2fa8", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "309e578cb5523a22eb5b4580ae2faa53906d5637f6fd9fd171211ef3c503a5e6", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "lastblockhash": "b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551", + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0309e578cb5523a22eb5b4580ae2faa53906d5637f6fd9fd171211ef3c503a5e6a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a099d5457ad6de954e86e0c80f56ca1fbc81c692766cd2206d2038b1880f98ff388899f1656c715f2fa8c0c0", + "postState": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x60006000556000600155600060025560006003556000600455", + "nonce": "0x00", + "storage": { + "0x": "0x12", + "0x01": "0x12", + "0x02": "0x12", + "0x03": "0x12", + "0x04": "0x12" } + } }, - - "BlockWrongStoreClears" : { - "blocks" : [ - { - "rlp" : "0xf90260f901f9a0b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a022acf357764b1a92bad08aa2b892c4fb202603a7c5d93715f264fcfc0006560aa0fa47fec4460036c6adadad7abf8dcca6351745fff036fb9d6509d1fffa9c47b5a0bb944e3499f51548f6d37e04f9d918d8510954760cd4c0262507733f60e6432fb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882292084552064c700a02340ad0249a1e6bbe4c6a880d7aa95cef5ceb6cea6e63fa6a50ad8319822d61688936bfd96de95375ff861f85f800a82c35094b94f5374fce5edbc8e2a8697c15331677e6ebf0b80801ba02388d4327dec4a133b3b8e558d25e7a117f6c7d2f5b1431014b69cae7496f758a0542851efe150eba1c3d9bae8778f41db144bb65fa71bee41915fc03d3ecfe1a4c0" - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x20000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551", - "mixHash" : "99d5457ad6de954e86e0c80f56ca1fbc81c692766cd2206d2038b1880f98ff38", - "nonce" : "99f1656c715f2fa8", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "309e578cb5523a22eb5b4580ae2faa53906d5637f6fd9fd171211ef3c503a5e6", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "lastblockhash" : "b3eb70baa54ac60fb26770e2bd62108db9f2e189375660af7f47ef276f520551", - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0309e578cb5523a22eb5b4580ae2faa53906d5637f6fd9fd171211ef3c503a5e6a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a099d5457ad6de954e86e0c80f56ca1fbc81c692766cd2206d2038b1880f98ff388899f1656c715f2fa8c0c0", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x14d1120d7b160000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "1", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x60006000556000600155600060025560006003556000600455", - "nonce" : "0x00", - "storage" : { - "0x" : "0x12", - "0x01" : "0x12", - "0x02" : "0x12", - "0x03" : "0x12", - "0x04" : "0x12" - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x2540be400", - "code" : "0x60006000556000600155600060025560006003556000600455", - "nonce" : "0x00", - "storage" : { - "0x" : "0x12", - "0x01" : "0x12", - "0x02" : "0x12", - "0x03" : "0x12", - "0x04" : "0x12" - } - } + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x2540be400", + "code": "0x60006000556000600155600060025560006003556000600455", + "nonce": "0x00", + "storage": { + "0x": "0x12", + "0x01": "0x12", + "0x02": "0x12", + "0x03": "0x12", + "0x04": "0x12" } + } } + } } - diff --git a/tests/files/BlockchainTests/bcForkUncle.json b/tests/files/BlockchainTests/bcForkUncle.json new file mode 100644 index 000000000000..176611d80d12 --- /dev/null +++ b/tests/files/BlockchainTests/bcForkUncle.json @@ -0,0 +1,445 @@ +{ + "ForkUncle" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "6a6f1738c264cf6b2593cd5f898ef374f2c0e5c68355442d0db07c5e5af4cdd1", + "mixHash" : "dfad10d0715a6249fd0b5b329f98d0f47ad7532641edc487eead74bcc9ef6630", + "nonce" : "eb6d6f709e656c22", + "number" : "0x01", + "parentHash" : "9354621d3746a792238486dd92f324fe177e798ffab4a75ac4bf726bd6aa56fd", + "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0x55dc522e", + "transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "1", + "rlp" : "0xf90261f901f9a09354621d3746a792238486dd92f324fe177e798ffab4a75ac4bf726bd6aa56fda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455dc522e80a0dfad10d0715a6249fd0b5b329f98d0f47ad7532641edc487eead74bcc9ef663088eb6d6f709e656c22f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x00", + "r" : "0x77c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8", + "s" : "0x3f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288d", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1b", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020040", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "0e88b2745616725a516d5d4f164f0512733c25446daf5090719c6395d211e4f1", + "mixHash" : "edd8ba9e2f966ba71514aae3e3f96e430c4ffd9a0e18e4b71bbe888a369c3b72", + "nonce" : "3c94753a44f7019d", + "number" : "0x02", + "parentHash" : "6a6f1738c264cf6b2593cd5f898ef374f2c0e5c68355442d0db07c5e5af4cdd1", + "receiptTrie" : "5ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6b", + "stateRoot" : "e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70e", + "timestamp" : "0x55dc5230", + "transactionsTrie" : "c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "2", + "rlp" : "0xf90260f901f9a06a6f1738c264cf6b2593cd5f898ef374f2c0e5c68355442d0db07c5e5af4cdd1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70ea0c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5a05ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88252088455dc523080a0edd8ba9e2f966ba71514aae3e3f96e430c4ffd9a0e18e4b71bbe888a369c3b72883c94753a44f7019df861f85f01018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f239f1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cfc0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x01", + "r" : "0x33c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f23", + "s" : "0x1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cf", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1b", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020080", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "06b2c962d95277f736161392c0c27e4de1164373e86dd0d53111bf232bfe0b25", + "mixHash" : "a32890c554be111aa2a916b8e29e0eb767598413a8b8a17f8ff4268e54deadc1", + "nonce" : "27f62560ab1038f0", + "number" : "0x03", + "parentHash" : "0e88b2745616725a516d5d4f164f0512733c25446daf5090719c6395d211e4f1", + "receiptTrie" : "4ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920af", + "stateRoot" : "611bfab1015d8c54765dff6be143b5ac81757633aa8859a72262099e1d848ce8", + "timestamp" : "0x55dc5232", + "transactionsTrie" : "1722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1a", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "3", + "rlp" : "0xf90261f901f9a00e88b2745616725a516d5d4f164f0512733c25446daf5090719c6395d211e4f1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0611bfab1015d8c54765dff6be143b5ac81757633aa8859a72262099e1d848ce8a01722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1aa04ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920afb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd88252088455dc523280a0a32890c554be111aa2a916b8e29e0eb767598413a8b8a17f8ff4268e54deadc18827f62560ab1038f0f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca015eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0eea05d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38c0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x02", + "r" : "0x15eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0ee", + "s" : "0x5d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1c", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x0200c0", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "326971f0690f5557832ba60190f1f84010c4b18f4fb17e91d99e821e2cff2a2d", + "mixHash" : "a8699388624b3bc306284973cf08a18921e28c6d0ea9226608962d9ba701b781", + "nonce" : "24c228a43ecc63aa", + "number" : "0x04", + "parentHash" : "06b2c962d95277f736161392c0c27e4de1164373e86dd0d53111bf232bfe0b25", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "c96d00af4e2c8271db8585a98bf46fc87d73a861d0eec2efbf61345c3651201b", + "timestamp" : "0x55dc5233", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "4", + "rlp" : "0xf901fcf901f7a006b2c962d95277f736161392c0c27e4de1164373e86dd0d53111bf232bfe0b25a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c96d00af4e2c8271db8585a98bf46fc87d73a861d0eec2efbf61345c3651201ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c004832fefd8808455dc523380a0a8699388624b3bc306284973cf08a18921e28c6d0ea9226608962d9ba701b7818824c228a43ecc63aac0c0", + "transactions" : [ + ], + "uncleHeaders" : [ + ] + }, + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020080", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "7ddc8d36f94d8baa29d7ab1908c86adbbd6815afcbbd22c27f0e0da18ad0f7eb", + "mixHash" : "8000180e91d10eb8ed6353345975179a385c1c436b86ab072c5de35e1fcc271d", + "nonce" : "d49f4d53681fd879", + "number" : "0x03", + "parentHash" : "0e88b2745616725a516d5d4f164f0512733c25446daf5090719c6395d211e4f1", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "f9c18298c8beb11c13bfe48b0ed5f227e7a4a7fc7ab1b8293f7d8264322306af", + "timestamp" : "0x55dc5235", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "3", + "rlp" : "0xf901fcf901f7a00e88b2745616725a516d5d4f164f0512733c25446daf5090719c6395d211e4f1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f9c18298c8beb11c13bfe48b0ed5f227e7a4a7fc7ab1b8293f7d8264322306afa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8808455dc523580a08000180e91d10eb8ed6353345975179a385c1c436b86ab072c5de35e1fcc271d88d49f4d53681fd879c0c0", + "transactions" : [ + ], + "uncleHeaders" : [ + ] + }, + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x0200c0", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "a307f8d0c778cdf3eda56bd70b0dbe217906c412de5ce0f21687e4805fefa575", + "mixHash" : "95401ab8e562cb74eb5cf674b9e3247eb945d3ef8f6c1bc686e304ef21ae9756", + "nonce" : "7b3e1c164c8193ff", + "number" : "0x04", + "parentHash" : "7ddc8d36f94d8baa29d7ab1908c86adbbd6815afcbbd22c27f0e0da18ad0f7eb", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "a6623b7af1b50fec6f00440ffb1bae5add128da884b8d5f3f732d274c4a67dab", + "timestamp" : "0x55dc5237", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "4", + "rlp" : "0xf901fcf901f7a07ddc8d36f94d8baa29d7ab1908c86adbbd6815afcbbd22c27f0e0da18ad0f7eba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0a6623b7af1b50fec6f00440ffb1bae5add128da884b8d5f3f732d274c4a67daba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c004832fefd8808455dc523780a095401ab8e562cb74eb5cf674b9e3247eb945d3ef8f6c1bc686e304ef21ae9756887b3e1c164c8193ffc0c0", + "transactions" : [ + ], + "uncleHeaders" : [ + ] + }, + { + "blocknumber" : "5", + "rlp" : "0xf903f8f901f7a0a307f8d0c778cdf3eda56bd70b0dbe217906c412de5ce0f21687e4805fefa575a034ee639f95bc69207473aeb7c42d188b7462cdfab260c2c786ed48935004ddc1948888f1f195afa192cfee860698584c030f4c9db1a08ff9619b4768083fb4edc4e9b8bd72dcfcf4c3d7ab8df9a2c3b812fe73da3c13a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302010005832fefd8808455dc523a80a0c43fac821357e5ea7a9851b4225e975ad40a2bb35c6fc3e01c2d885694c1550b8880f14ad89cf443a0c0f901faf901f7a006b2c962d95277f736161392c0c27e4de1164373e86dd0d53111bf232bfe0b25a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c96d00af4e2c8271db8585a98bf46fc87d73a861d0eec2efbf61345c3651201ba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c004832fefd8808455dc523380a0a8699388624b3bc306284973cf08a18921e28c6d0ea9226608962d9ba701b7818824c228a43ecc63aa" + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "9354621d3746a792238486dd92f324fe177e798ffab4a75ac4bf726bd6aa56fd", + "mixHash" : "cb3c6a9307bc6953f14e8019f095c9c2bc851692cc06c56421dab8409cf98c12", + "nonce" : "90d57dfafa7520bb", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0cb3c6a9307bc6953f14e8019f095c9c2bc851692cc06c56421dab8409cf98c128890d57dfafa7520bbc0c0", + "lastblockhash" : "326971f0690f5557832ba60190f1f84010c4b18f4fb17e91d99e821e2cff2a2d", + "postState" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x1e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x01158e460913d0f618", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e71a9ca", + "code" : "0x", + "nonce" : "0x03", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e72a000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "reusePreviousBlockAsUncleIgnoringLeadingZerosInNonce" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "2964de62c08a553dbea6b483751beb325dd72bf93ce2a3e5c9db878536bd64bb", + "mixHash" : "5fcb88b6f0dcbbcf4bf13aecccc9db4b9823a650fdb63429bb56ba2357c0a3f8", + "nonce" : "00000000000144a8", + "number" : "0x01", + "parentHash" : "679bda385c2b8d60f7310fb7b1eb0c94f1eb9b68cf49ea654b83b65656be9bf4", + "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0x55dd9271", + "transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "1", + "rlp" : "0xf90261f901f9a0679bda385c2b8d60f7310fb7b1eb0c94f1eb9b68cf49ea654b83b65656be9bf4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455dd927180a05fcb88b6f0dcbbcf4bf13aecccc9db4b9823a650fdb63429bb56ba2357c0a3f88800000000000144a8f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x00", + "r" : "0x77c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8", + "s" : "0x3f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288d", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1b", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "blocknumber" : "2", + "rlp" : "f90464f901f9a02964de62c08a553dbea6b483751beb325dd72bf93ce2a3e5c9db878536bd64bba046e2e5e5f6fed9d3ac230140cabd376687760d341052b10a1eb77d84f221fda4948888f1f195afa192cfee860698584c030f4c9db1a007c07f7286a054076739d4669547f161cf8c0739eeaa145ef8a18b5890200801a03211575401f242db6ce9fc34e10dbc9d5da1b39ecac52f36759e0ba59d0308f5a0fb8221322bae40f5782c3fb51d3162e286b120757362fd9eac56abe38f593ddfb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd98253188455dd927680a087ff9a75ecda508ec466c7455617c3990c34fe526119d159381b082a7c89439a88000000000006723cf868f86601018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d8782019084446346341ca06e6ea71356871ac706ee7c60780ba1cd96d04d1edd028815503de5a60e6490fba07c3403ae526d25a73f8e233c46698e39aa649f7981c59657ad7be8acac5e9ca7f901fbf901f8a0679bda385c2b8d60f7310fb7b1eb0c94f1eb9b68cf49ea654b83b65656be9bf4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455dd927180a05fcb88b6f0dcbbcf4bf13aecccc9db4b9823a650fdb63429bb56ba2357c0a3f887000000000144a8" + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "679bda385c2b8d60f7310fb7b1eb0c94f1eb9b68cf49ea654b83b65656be9bf4", + "mixHash" : "5a248955beee0d2a531018d175f187ec533146f52c23f94a0278ad76219d947e", + "nonce" : "000000000002031e", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a05a248955beee0d2a531018d175f187ec533146f52c23f94a0278ad76219d947e88000000000002031ec0c0", + "lastblockhash" : "2964de62c08a553dbea6b483751beb325dd72bf93ce2a3e5c9db878536bd64bb", + "postState" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x4563918244f45208", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e724dee", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e72a000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "reusePreviousBlockAsUncleIgnoringLeadingZerosInMixHash" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "55622e11fa174549352498f7d89d6245a3a371739c52935dea35d778fddc26cb", + "mixHash" : "003b25c6e21a79739cc10ddc2098a0d1c44be2bf13f470b08e3131292dcc7e53", + "nonce" : "000000000001055c", + "number" : "0x01", + "parentHash" : "3cf070599075c8897197520e08ccdb21f8c74e1cac516545f4452b7289f1397f", + "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0x55dde5a6", + "transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "blocknumber" : "1", + "rlp" : "0xf90261f901f9a03cf070599075c8897197520e08ccdb21f8c74e1cac516545f4452b7289f1397fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455dde5a680a0003b25c6e21a79739cc10ddc2098a0d1c44be2bf13f470b08e3131292dcc7e5388000000000001055cf862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x00", + "r" : "0x77c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8", + "s" : "0x3f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288d", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1b", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "blocknumber" : "2", + "rlp" : "f90464f901f9a055622e11fa174549352498f7d89d6245a3a371739c52935dea35d778fddc26cba03a68e67b0fc6afdfb1414199c46d7495fd9dfea3929c2e921fd7cf7432db9155948888f1f195afa192cfee860698584c030f4c9db1a007c07f7286a054076739d4669547f161cf8c0739eeaa145ef8a18b5890200801a03211575401f242db6ce9fc34e10dbc9d5da1b39ecac52f36759e0ba59d0308f5a0fb8221322bae40f5782c3fb51d3162e286b120757362fd9eac56abe38f593ddfb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88253188455dde5ab80a0fe6a80f9a18b96a986663cca661b10c8c6ea9c7732efded06734afc418895b75880000000000020c68f868f86601018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d8782019084446346341ca06e6ea71356871ac706ee7c60780ba1cd96d04d1edd028815503de5a60e6490fba07c3403ae526d25a73f8e233c46698e39aa649f7981c59657ad7be8acac5e9ca7f901fbf901f8a03cf070599075c8897197520e08ccdb21f8c74e1cac516545f4452b7289f1397fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455dde5a6809f3b25c6e21a79739cc10ddc2098a0d1c44be2bf13f470b08e3131292dcc7e5388000000000001055c" + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x00", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "3cf070599075c8897197520e08ccdb21f8c74e1cac516545f4452b7289f1397f", + "mixHash" : "fcf685a091c9c5b2e64c5dd74729165ba000856ded52bf8b7a978996f8623f77", + "nonce" : "000000000000301c", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8100a0fcf685a091c9c5b2e64c5dd74729165ba000856ded52bf8b7a978996f8623f7788000000000000301cc0c0", + "lastblockhash" : "55622e11fa174549352498f7d89d6245a3a371739c52935dea35d778fddc26cb", + "postState" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x4563918244f45208", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e724dee", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e72a000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + } +} diff --git a/tests/files/BlockchainTests/bcGasPricerTest.json b/tests/files/BlockchainTests/bcGasPricerTest.json old mode 100755 new mode 100644 index 536f466b11b3..8601cf99d54b --- a/tests/files/BlockchainTests/bcGasPricerTest.json +++ b/tests/files/BlockchainTests/bcGasPricerTest.json @@ -1,1117 +1,990 @@ { - "highGasUsage" : { - "blocks" : [ - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x", - "gasLimit" : "0x01dee69a", - "gasUsed" : "0x53a0", - "hash" : "51141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9", - "mixHash" : "55edf4d762c74ed37868666a28e9dbcbfc8ee2121766915fa461722ba91ea56f", - "nonce" : "346921996dcbb61f", - "number" : "0x01", - "parentHash" : "a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6b", - "receiptTrie" : "08ffbde000912f7a562428e6750194b5862548d98ee02739e8d8671290d49abe", - "stateRoot" : "8a9df04183e28fc7c26e4a40e359b2322bf77737a1592fe3a6f400651fb8979b", - "timestamp" : "0x55b7e6f5", - "transactionsTrie" : "bdb25a2e5860522e943625b58a5429571aaf3123038ffff0922fe58753e51b83", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08a9df04183e28fc7c26e4a40e359b2322bf77737a1592fe3a6f400651fb8979ba0bdb25a2e5860522e943625b58a5429571aaf3123038ffff0922fe58753e51b83a008ffbde000912f7a562428e6750194b5862548d98ee02739e8d8671290d49abeb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018401dee69a8253a08455b7e6f580a055edf4d762c74ed37868666a28e9dbcbfc8ee2121766915fa461722ba91ea56f88346921996dcbb61ff86ef86c808609184e72a000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca019b72b9fb71e156dc46b934987514054bf7c6ba1b3f0030a2645d31d51f92979a01f60971cd6a647c763d70e81fbd3fdc8ad1c9a2b93771397040c2842042ae10dc0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x09184e72a000", - "nonce" : "0x00", - "r" : "0x19b72b9fb71e156dc46b934987514054bf7c6ba1b3f0030a2645d31d51f92979", - "s" : "0x1f60971cd6a647c763d70e81fbd3fdc8ad1c9a2b93771397040c2842042ae10d", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020040", - "extraData" : "0x", - "gasLimit" : "0x01de6efb", - "gasUsed" : "0x53a0", - "hash" : "3df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631", - "mixHash" : "e6326297bef00fd014818446c6c03cd05456ecbeea7d1f87d788d9a8d063b601", - "nonce" : "835a76a0c05f1953", - "number" : "0x02", - "parentHash" : "51141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9", - "receiptTrie" : "dc4a27b2af103a3b9b7e00b8cbad790b61ac0f69603a3dfaf927d7f53bcb7dc9", - "stateRoot" : "6137d35876b8d905a62931f0815fa5a92910ec5241862a75d44d097a6405925b", - "timestamp" : "0x55b7e6f6", - "transactionsTrie" : "17db9a3dd5b472429bd1b90821461a18b829a3b9c2a9fca3ad191f0b661cc407", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa051141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a06137d35876b8d905a62931f0815fa5a92910ec5241862a75d44d097a6405925ba017db9a3dd5b472429bd1b90821461a18b829a3b9c2a9fca3ad191f0b661cc407a0dc4a27b2af103a3b9b7e00b8cbad790b61ac0f69603a3dfaf927d7f53bcb7dc9b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020040028401de6efb8253a08455b7e6f680a0e6326297bef00fd014818446c6c03cd05456ecbeea7d1f87d788d9a8d063b60188835a76a0c05f1953f86ef86c01860ae9f7bcc000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0b4ab3eb88ca16e29f56e151a20ea5ee639ae06675f09fb6c6e16c4bc1e959626a002489e2fd69bffcb8da9fef04e8392fc0d54cae04d2b0d7b97eaa1a2da10c4b3c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x0ae9f7bcc000", - "nonce" : "0x01", - "r" : "0xb4ab3eb88ca16e29f56e151a20ea5ee639ae06675f09fb6c6e16c4bc1e959626", - "s" : "0x02489e2fd69bffcb8da9fef04e8392fc0d54cae04d2b0d7b97eaa1a2da10c4b3", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020080", - "extraData" : "0x", - "gasLimit" : "0x01ddf77a", - "gasUsed" : "0x53a0", - "hash" : "23f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70", - "mixHash" : "94b9cd95199ca0be589e97fa3258e8fa84384d3864deda1cfcc6774ea7b0962d", - "nonce" : "81d71d4f50745853", - "number" : "0x03", - "parentHash" : "3df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631", - "receiptTrie" : "619cfe23ac6efecd3c57c2ff1aad604c9f7a62e4b4220c7854bdd8af33a814f8", - "stateRoot" : "2e04b92acd81faf0cdce0d94d9870c3cabcf7a734ea96c3891bba6df11d071af", - "timestamp" : "0x55b7e6f8", - "transactionsTrie" : "d57c128083300688fb576176b64642c73923b044aac86cfd7a1ebbe06c05eb96", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026df901faa03df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02e04b92acd81faf0cdce0d94d9870c3cabcf7a734ea96c3891bba6df11d071afa0d57c128083300688fb576176b64642c73923b044aac86cfd7a1ebbe06c05eb96a0619cfe23ac6efecd3c57c2ff1aad604c9f7a62e4b4220c7854bdd8af33a814f8b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020080038401ddf77a8253a08455b7e6f880a094b9cd95199ca0be589e97fa3258e8fa84384d3864deda1cfcc6774ea7b0962d8881d71d4f50745853f86df86b02860cbba106e000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0a3a2bcd3060ce8c9dc7581366dd6b8aed226741ff0bd3cdbdbaaf91aef5e9bd89f4812314cce53dc10fcc9176b981858bc806b5fcb42a72fd5675027750ff925c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x0cbba106e000", - "nonce" : "0x02", - "r" : "0xa3a2bcd3060ce8c9dc7581366dd6b8aed226741ff0bd3cdbdbaaf91aef5e9bd8", - "s" : "0x4812314cce53dc10fcc9176b981858bc806b5fcb42a72fd5675027750ff925", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0200c0", - "extraData" : "0x", - "gasLimit" : "0x01dd8017", - "gasUsed" : "0x53a0", - "hash" : "1512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9", - "mixHash" : "4ad5b0a6fd54a9b8293aef0706950ea145df2005d3bd28db9c10136926639df8", - "nonce" : "395630a7c6b3c131", - "number" : "0x04", - "parentHash" : "23f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70", - "receiptTrie" : "c45511afcf389dd4cd16dd9ccc2e8c0e94a98dc4f65461346582fd45d6c5bd53", - "stateRoot" : "fc3425bcae459c9c17419fca2d3dbdcb7afc96c3cdd48b7017e40947960a0ee4", - "timestamp" : "0x55b7e6fb", - "transactionsTrie" : "d78763945db011d5419eec1a4ec20ae122a9e1360b5ba7bd255ae495d73be17f", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa023f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0fc3425bcae459c9c17419fca2d3dbdcb7afc96c3cdd48b7017e40947960a0ee4a0d78763945db011d5419eec1a4ec20ae122a9e1360b5ba7bd255ae495d73be17fa0c45511afcf389dd4cd16dd9ccc2e8c0e94a98dc4f65461346582fd45d6c5bd53b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c0048401dd80178253a08455b7e6fb80a04ad5b0a6fd54a9b8293aef0706950ea145df2005d3bd28db9c10136926639df888395630a7c6b3c131f86ef86c03860e8d4a510000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0f9cc20ee2874dce3b534d35149f43b4a0f3356d833d9d445fa8c161a6b622e6ba06543b736231a6d85107c7e6083e9067a0d00aaad744816646e16115445f908cac0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x0e8d4a510000", - "nonce" : "0x03", - "r" : "0xf9cc20ee2874dce3b534d35149f43b4a0f3356d833d9d445fa8c161a6b622e6b", - "s" : "0x6543b736231a6d85107c7e6083e9067a0d00aaad744816646e16115445f908ca", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020100", - "extraData" : "0x", - "gasLimit" : "0x01dd08d1", - "gasUsed" : "0x53a0", - "hash" : "aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017", - "mixHash" : "e13ef23b8e939b58a044d291bf14cc01a23f68389940d6cc38dd95809adabb76", - "nonce" : "bd9aa907a816f269", - "number" : "0x05", - "parentHash" : "1512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9", - "receiptTrie" : "d2544e6a9719ec49333a83efbc4683019674a314c37c855d40dc95bb9080b3b9", - "stateRoot" : "e118728dc0a21436632eb492cecab305940c0782da9cdc3bf2cea9f2d67f0257", - "timestamp" : "0x55b7e6ff", - "transactionsTrie" : "066a7ed4bb74feca3008a9dcfda7ad4291fe4124dd335ada65989ab27a776af9", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa01512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e118728dc0a21436632eb492cecab305940c0782da9cdc3bf2cea9f2d67f0257a0066a7ed4bb74feca3008a9dcfda7ad4291fe4124dd335ada65989ab27a776af9a0d2544e6a9719ec49333a83efbc4683019674a314c37c855d40dc95bb9080b3b9b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020100058401dd08d18253a08455b7e6ff80a0e13ef23b8e939b58a044d291bf14cc01a23f68389940d6cc38dd95809adabb7688bd9aa907a816f269f86ef86c0486105ef39b2000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca06cda2e6b92c549ee2fb1c1078ad116315093eae7b06d54dd6ad8f3d4d1d246e5a026b9d1b5dfe1480b3b8f1cdccb06714f61631dcac3680f3b45ac9a84928b78a3c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x105ef39b2000", - "nonce" : "0x04", - "r" : "0x6cda2e6b92c549ee2fb1c1078ad116315093eae7b06d54dd6ad8f3d4d1d246e5", - "s" : "0x26b9d1b5dfe1480b3b8f1cdccb06714f61631dcac3680f3b45ac9a84928b78a3", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020140", - "extraData" : "0x", - "gasLimit" : "0x01dc91a9", - "gasUsed" : "0x53a0", - "hash" : "025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15", - "mixHash" : "36462deee79c6bba8c835d66cf690d4a5e972c524d256cb07a1138a007f0d568", - "nonce" : "afd358c3806197aa", - "number" : "0x06", - "parentHash" : "aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017", - "receiptTrie" : "e42cc2b210e3b2cfb811ce2d9afa2207a03c3ec827ac68ade1d47551e5ce3148", - "stateRoot" : "bbd6012af885d075e4d469716846b92cf80fb0184fbb2570d1c79f19737132b6", - "timestamp" : "0x55b7e700", - "transactionsTrie" : "1f4f6fa6c6d35a4af215a996cfcdcfb8eb3df22f0f6ab2f57ec58d6ad6a4e57d", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bbd6012af885d075e4d469716846b92cf80fb0184fbb2570d1c79f19737132b6a01f4f6fa6c6d35a4af215a996cfcdcfb8eb3df22f0f6ab2f57ec58d6ad6a4e57da0e42cc2b210e3b2cfb811ce2d9afa2207a03c3ec827ac68ade1d47551e5ce3148b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020140068401dc91a98253a08455b7e70080a036462deee79c6bba8c835d66cf690d4a5e972c524d256cb07a1138a007f0d56888afd358c3806197aaf86ef86c058612309ce54000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0d2b6a9d3c6286c1a71d88ef2e3d3889352311a9348ee7c7256c2af3db4b048dca00e3f13618132ebefdf2e207668c6fff0b2b3f2bbe95f2b1528e2d267a24cade2c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x12309ce54000", - "nonce" : "0x05", - "r" : "0xd2b6a9d3c6286c1a71d88ef2e3d3889352311a9348ee7c7256c2af3db4b048dc", - "s" : "0x0e3f13618132ebefdf2e207668c6fff0b2b3f2bbe95f2b1528e2d267a24cade2", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020180", - "extraData" : "0x", - "gasLimit" : "0x01dc1a9f", - "gasUsed" : "0x53a0", - "hash" : "fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610d", - "mixHash" : "a93600adb203da0f92017553b2c88fe18ebebfd93da90158e00c56d81a316666", - "nonce" : "aefa3ed3e9eb83e9", - "number" : "0x07", - "parentHash" : "025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15", - "receiptTrie" : "86d5cd24252cfe39096df1568affa38e5295232d5b2349792d195113f9b8d455", - "stateRoot" : "8ccd601c1ae4548de690c21306ba4e9dd5a1ff03a31f8c08af968ffa7a6902fd", - "timestamp" : "0x55b7e702", - "transactionsTrie" : "71e64105f752773f43221dd85e44d299d08b229cdbcea166536fb48f72de8b73", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08ccd601c1ae4548de690c21306ba4e9dd5a1ff03a31f8c08af968ffa7a6902fda071e64105f752773f43221dd85e44d299d08b229cdbcea166536fb48f72de8b73a086d5cd24252cfe39096df1568affa38e5295232d5b2349792d195113f9b8d455b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020180078401dc1a9f8253a08455b7e70280a0a93600adb203da0f92017553b2c88fe18ebebfd93da90158e00c56d81a31666688aefa3ed3e9eb83e9f86ef86c06861402462f6000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca07dbb1abd6964f8167ff9d79b438a83137eda9ee4d8d5e73b6088113249846956a03de1e4e462f720df0f4d7012c0f3be32cb908b309d70642fcf8175f2ca3b0c8fc0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x1402462f6000", - "nonce" : "0x06", - "r" : "0x7dbb1abd6964f8167ff9d79b438a83137eda9ee4d8d5e73b6088113249846956", - "s" : "0x3de1e4e462f720df0f4d7012c0f3be32cb908b309d70642fcf8175f2ca3b0c8f", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1c", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0201c0", - "extraData" : "0x", - "gasLimit" : "0x01dba3b3", - "gasUsed" : "0x53a0", - "hash" : "b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780", - "mixHash" : "437c435a14a4a1918ad7a2ba37dd5dbefb071e41a2cea3c75505b937c5e2255c", - "nonce" : "15c846a65edd10f4", - "number" : "0x08", - "parentHash" : "fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610d", - "receiptTrie" : "f14192d5dd2ea1aa08314fbc05d61656cb37aff2396de80e8ff541080d540ae8", - "stateRoot" : "84d881a23122ed0a46baac83083d3f2e46b3531c7cf35d08fd533f9015fdf35a", - "timestamp" : "0x55b7e703", - "transactionsTrie" : "5292f0bb53c9ff642471ea0098f045c8871914dc62bc44123f7db66adc83e925", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a084d881a23122ed0a46baac83083d3f2e46b3531c7cf35d08fd533f9015fdf35aa05292f0bb53c9ff642471ea0098f045c8871914dc62bc44123f7db66adc83e925a0f14192d5dd2ea1aa08314fbc05d61656cb37aff2396de80e8ff541080d540ae8b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830201c0088401dba3b38253a08455b7e70380a0437c435a14a4a1918ad7a2ba37dd5dbefb071e41a2cea3c75505b937c5e2255c8815c846a65edd10f4f86ef86c078615d3ef798000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba0a4d2b7612da4b7493213decb120ea2826e72adac5e605bc9a889d287df4e6a50a04b08a8ee68b2e984220db524a5e6c5fa93b083bafb728734a5ddad91ee51b41fc0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x15d3ef798000", - "nonce" : "0x07", - "r" : "0xa4d2b7612da4b7493213decb120ea2826e72adac5e605bc9a889d287df4e6a50", - "s" : "0x4b08a8ee68b2e984220db524a5e6c5fa93b083bafb728734a5ddad91ee51b41f", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1b", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020200", - "extraData" : "0x", - "gasLimit" : "0x01db2ce5", - "gasUsed" : "0x53a0", - "hash" : "ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2", - "mixHash" : "5c05372757a88c9536533fc454a7aacb1ed0b366828650dbeea09362ab35bf87", - "nonce" : "8ed6b0b09318ad1d", - "number" : "0x09", - "parentHash" : "b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780", - "receiptTrie" : "a06a1b861f74a7c1e8876e7dbb74d7e62d7c991c32ac84ff2774b88b5842cbdb", - "stateRoot" : "aeb1fbf45a3bec7db72e65ead9d4237e7628be3e836df050c401c26614bb876f", - "timestamp" : "0x55b7e704", - "transactionsTrie" : "874dabcca653170e57fe4d0241cddcd6f9ef93c07765e1635de159cff6c4e753", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0aeb1fbf45a3bec7db72e65ead9d4237e7628be3e836df050c401c26614bb876fa0874dabcca653170e57fe4d0241cddcd6f9ef93c07765e1635de159cff6c4e753a0a06a1b861f74a7c1e8876e7dbb74d7e62d7c991c32ac84ff2774b88b5842cbdbb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020200098401db2ce58253a08455b7e70480a05c05372757a88c9536533fc454a7aacb1ed0b366828650dbeea09362ab35bf87888ed6b0b09318ad1df86ef86c088617a598c3a000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba09d1e6336a3acb8cf03efb4ab7e187a8bcaa125bbbe195997ac6fe2664b1ccce7a027d556535661b74e4453f54e6921117abbf541de92cbe791c463037bec440285c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x17a598c3a000", - "nonce" : "0x08", - "r" : "0x9d1e6336a3acb8cf03efb4ab7e187a8bcaa125bbbe195997ac6fe2664b1ccce7", - "s" : "0x27d556535661b74e4453f54e6921117abbf541de92cbe791c463037bec440285", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1b", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020240", - "extraData" : "0x", - "gasLimit" : "0x01dab634", - "gasUsed" : "0x53a0", - "hash" : "0cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5", - "mixHash" : "b57aa704d7d2d3c17312e6e0295f16474226441a752afffde9381b6369a53ba0", - "nonce" : "13e30b4419905574", - "number" : "0x0a", - "parentHash" : "ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2", - "receiptTrie" : "dbedecbd6f556073b0fa43fb71b4c69df5384b6d4f43bd4cd0a0a97f4d43fbe8", - "stateRoot" : "4b56583cd2308b5424ad7a632022073beabdfe282931019dac676ecb162cb23c", - "timestamp" : "0x55b7e706", - "transactionsTrie" : "557fb34c4e06a92e14a8dbf88f43c139ae7cfee4654b01f159509179eb86f17e", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa0ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a04b56583cd2308b5424ad7a632022073beabdfe282931019dac676ecb162cb23ca0557fb34c4e06a92e14a8dbf88f43c139ae7cfee4654b01f159509179eb86f17ea0dbedecbd6f556073b0fa43fb71b4c69df5384b6d4f43bd4cd0a0a97f4d43fbe8b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202400a8401dab6348253a08455b7e70680a0b57aa704d7d2d3c17312e6e0295f16474226441a752afffde9381b6369a53ba08813e30b4419905574f86ef86c09861977420dc000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba03e0d159c71bddaf7507905a0f97fb2c86b773a56460d3c3ae461fdb2593a0d4ea02deec822756dddc958ce784740a503cf4895e632502c6c7966a5c662cf6a3561c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x1977420dc000", - "nonce" : "0x09", - "r" : "0x3e0d159c71bddaf7507905a0f97fb2c86b773a56460d3c3ae461fdb2593a0d4e", - "s" : "0x2deec822756dddc958ce784740a503cf4895e632502c6c7966a5c662cf6a3561", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1b", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020280", - "extraData" : "0x", - "gasLimit" : "0x01da3fa1", - "gasUsed" : "0x53a0", - "hash" : "fc594b924f162e21e84d67b27eebd532227a2d61dc8a8e50ce5f656da0916afe", - "mixHash" : "05f16acc9747f7d21872b0dcbf9c0037fd45f8a87386d69781980abb1750f32e", - "nonce" : "17fa1270c59bcdd1", - "number" : "0x0b", - "parentHash" : "0cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5", - "receiptTrie" : "0a1936375f87b646a5a18839f658fa8b9af039f22d609fd5c6a0df4d52ce3bbb", - "stateRoot" : "44ee2a97efc07fdf2af1ce9181f00b3b99feb92de903bc1ab26fc4db39f4bc9c", - "timestamp" : "0x55b7e708", - "transactionsTrie" : "54541930d62573205e70bcfd40bc51c131e79d9f038a85b84d20203381407e21", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf9026ef901faa00cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a044ee2a97efc07fdf2af1ce9181f00b3b99feb92de903bc1ab26fc4db39f4bc9ca054541930d62573205e70bcfd40bc51c131e79d9f038a85b84d20203381407e21a00a1936375f87b646a5a18839f658fa8b9af039f22d609fd5c6a0df4d52ce3bbbb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202800b8401da3fa18253a08455b7e70880a005f16acc9747f7d21872b0dcbf9c0037fd45f8a87386d69781980abb1750f32e8817fa1270c59bcdd1f86ef86c0a861b48eb57e000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba0a4ce64813530f35e4c45168988a82aaa5dd4ffec2e1325e8edc99b428dc390a8a0270598015d7aa6d92aacaad70a4c72f9022db2642c77b06cd068e28ba80a5a68c0", - "transactions" : [ - { - "data" : "0xffffffffffff", - "gasLimit" : "0x0cf850", - "gasPrice" : "0x1b48eb57e000", - "nonce" : "0x0a", - "r" : "0xa4ce64813530f35e4c45168988a82aaa5dd4ffec2e1325e8edc99b428dc390a8", - "s" : "0x270598015d7aa6d92aacaad70a4c72f9022db2642c77b06cd068e28ba80a5a68", - "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "v" : "0x1b", - "value" : "0x0a" - } - ], - "uncleHeaders" : [ - ] - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x42", - "gasLimit" : "0x01df5e70", - "gasUsed" : "0x00", - "hash" : "a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6b", - "mixHash" : "1fbb1c0dd4a71d0d6451d87118e8615e997c89ee002d412824166a471e4b487b", - "nonce" : "64500fc0c924577b", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "71f7c8fb1ecac2ee69cd5aa02564d358fc641845977fa4e30c65be195167bb45", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "genesisRLP" : "0xf901fdf901f8a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a071f7c8fb1ecac2ee69cd5aa02564d358fc641845977fa4e30c65be195167bb45a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000808401df5e70808454c98c8142a01fbb1c0dd4a71d0d6451d87118e8615e997c89ee002d412824166a471e4b487b8864500fc0c924577bc0c0", - "lastblockhash" : "fc594b924f162e21e84d67b27eebd532227a2d61dc8a8e50ce5f656da0916afe", - "postState" : { - "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { - "balance" : "0x6e", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x033ca3ae5d37d40000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x1d14a0215cf8145fe6a7ff92", - "code" : "0x", - "nonce" : "0x0b", - "storage" : { - } - }, - "aaaf5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02540be400", - "code" : "0x60003551", - "nonce" : "0x00", - "storage" : { - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x1d14a0219e54822428000000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "aaaf5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02540be400", - "code" : "0x60003551", - "nonce" : "0x00", - "storage" : { - } - } - } + "highGasUsage": { + "blocks": [{ + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020000", + "extraData": "0x", + "gasLimit": "0x01dee69a", + "gasUsed": "0x53a0", + "hash": "51141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9", + "mixHash": "55edf4d762c74ed37868666a28e9dbcbfc8ee2121766915fa461722ba91ea56f", + "nonce": "346921996dcbb61f", + "number": "0x01", + "parentHash": "a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6b", + "receiptTrie": "08ffbde000912f7a562428e6750194b5862548d98ee02739e8d8671290d49abe", + "stateRoot": "8a9df04183e28fc7c26e4a40e359b2322bf77737a1592fe3a6f400651fb8979b", + "timestamp": "0x55b7e6f5", + "transactionsTrie": "bdb25a2e5860522e943625b58a5429571aaf3123038ffff0922fe58753e51b83", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08a9df04183e28fc7c26e4a40e359b2322bf77737a1592fe3a6f400651fb8979ba0bdb25a2e5860522e943625b58a5429571aaf3123038ffff0922fe58753e51b83a008ffbde000912f7a562428e6750194b5862548d98ee02739e8d8671290d49abeb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018401dee69a8253a08455b7e6f580a055edf4d762c74ed37868666a28e9dbcbfc8ee2121766915fa461722ba91ea56f88346921996dcbb61ff86ef86c808609184e72a000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca019b72b9fb71e156dc46b934987514054bf7c6ba1b3f0030a2645d31d51f92979a01f60971cd6a647c763d70e81fbd3fdc8ad1c9a2b93771397040c2842042ae10dc0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x09184e72a000", + "nonce": "0x00", + "r": "0x19b72b9fb71e156dc46b934987514054bf7c6ba1b3f0030a2645d31d51f92979", + "s": "0x1f60971cd6a647c763d70e81fbd3fdc8ad1c9a2b93771397040c2842042ae10d", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020040", + "extraData": "0x", + "gasLimit": "0x01de6efb", + "gasUsed": "0x53a0", + "hash": "3df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631", + "mixHash": "e6326297bef00fd014818446c6c03cd05456ecbeea7d1f87d788d9a8d063b601", + "nonce": "835a76a0c05f1953", + "number": "0x02", + "parentHash": "51141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9", + "receiptTrie": "dc4a27b2af103a3b9b7e00b8cbad790b61ac0f69603a3dfaf927d7f53bcb7dc9", + "stateRoot": "6137d35876b8d905a62931f0815fa5a92910ec5241862a75d44d097a6405925b", + "timestamp": "0x55b7e6f6", + "transactionsTrie": "17db9a3dd5b472429bd1b90821461a18b829a3b9c2a9fca3ad191f0b661cc407", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa051141aba6504ab86b86f61709c4660028633c252692e6f30778ea1915b87dbb9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a06137d35876b8d905a62931f0815fa5a92910ec5241862a75d44d097a6405925ba017db9a3dd5b472429bd1b90821461a18b829a3b9c2a9fca3ad191f0b661cc407a0dc4a27b2af103a3b9b7e00b8cbad790b61ac0f69603a3dfaf927d7f53bcb7dc9b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020040028401de6efb8253a08455b7e6f680a0e6326297bef00fd014818446c6c03cd05456ecbeea7d1f87d788d9a8d063b60188835a76a0c05f1953f86ef86c01860ae9f7bcc000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0b4ab3eb88ca16e29f56e151a20ea5ee639ae06675f09fb6c6e16c4bc1e959626a002489e2fd69bffcb8da9fef04e8392fc0d54cae04d2b0d7b97eaa1a2da10c4b3c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x0ae9f7bcc000", + "nonce": "0x01", + "r": "0xb4ab3eb88ca16e29f56e151a20ea5ee639ae06675f09fb6c6e16c4bc1e959626", + "s": "0x02489e2fd69bffcb8da9fef04e8392fc0d54cae04d2b0d7b97eaa1a2da10c4b3", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020080", + "extraData": "0x", + "gasLimit": "0x01ddf77a", + "gasUsed": "0x53a0", + "hash": "23f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70", + "mixHash": "94b9cd95199ca0be589e97fa3258e8fa84384d3864deda1cfcc6774ea7b0962d", + "nonce": "81d71d4f50745853", + "number": "0x03", + "parentHash": "3df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631", + "receiptTrie": "619cfe23ac6efecd3c57c2ff1aad604c9f7a62e4b4220c7854bdd8af33a814f8", + "stateRoot": "2e04b92acd81faf0cdce0d94d9870c3cabcf7a734ea96c3891bba6df11d071af", + "timestamp": "0x55b7e6f8", + "transactionsTrie": "d57c128083300688fb576176b64642c73923b044aac86cfd7a1ebbe06c05eb96", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026df901faa03df5da46728c26f2deff76b656984b232a2633854eb083aedab1c70a5c7a6631a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02e04b92acd81faf0cdce0d94d9870c3cabcf7a734ea96c3891bba6df11d071afa0d57c128083300688fb576176b64642c73923b044aac86cfd7a1ebbe06c05eb96a0619cfe23ac6efecd3c57c2ff1aad604c9f7a62e4b4220c7854bdd8af33a814f8b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020080038401ddf77a8253a08455b7e6f880a094b9cd95199ca0be589e97fa3258e8fa84384d3864deda1cfcc6774ea7b0962d8881d71d4f50745853f86df86b02860cbba106e000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0a3a2bcd3060ce8c9dc7581366dd6b8aed226741ff0bd3cdbdbaaf91aef5e9bd89f4812314cce53dc10fcc9176b981858bc806b5fcb42a72fd5675027750ff925c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x0cbba106e000", + "nonce": "0x02", + "r": "0xa3a2bcd3060ce8c9dc7581366dd6b8aed226741ff0bd3cdbdbaaf91aef5e9bd8", + "s": "0x4812314cce53dc10fcc9176b981858bc806b5fcb42a72fd5675027750ff925", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0200c0", + "extraData": "0x", + "gasLimit": "0x01dd8017", + "gasUsed": "0x53a0", + "hash": "1512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9", + "mixHash": "4ad5b0a6fd54a9b8293aef0706950ea145df2005d3bd28db9c10136926639df8", + "nonce": "395630a7c6b3c131", + "number": "0x04", + "parentHash": "23f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70", + "receiptTrie": "c45511afcf389dd4cd16dd9ccc2e8c0e94a98dc4f65461346582fd45d6c5bd53", + "stateRoot": "fc3425bcae459c9c17419fca2d3dbdcb7afc96c3cdd48b7017e40947960a0ee4", + "timestamp": "0x55b7e6fb", + "transactionsTrie": "d78763945db011d5419eec1a4ec20ae122a9e1360b5ba7bd255ae495d73be17f", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa023f47e461d0d980edcc5f2017aac3a86f376817b142c90dae493b255bc634a70a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0fc3425bcae459c9c17419fca2d3dbdcb7afc96c3cdd48b7017e40947960a0ee4a0d78763945db011d5419eec1a4ec20ae122a9e1360b5ba7bd255ae495d73be17fa0c45511afcf389dd4cd16dd9ccc2e8c0e94a98dc4f65461346582fd45d6c5bd53b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c0048401dd80178253a08455b7e6fb80a04ad5b0a6fd54a9b8293aef0706950ea145df2005d3bd28db9c10136926639df888395630a7c6b3c131f86ef86c03860e8d4a510000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0f9cc20ee2874dce3b534d35149f43b4a0f3356d833d9d445fa8c161a6b622e6ba06543b736231a6d85107c7e6083e9067a0d00aaad744816646e16115445f908cac0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x0e8d4a510000", + "nonce": "0x03", + "r": "0xf9cc20ee2874dce3b534d35149f43b4a0f3356d833d9d445fa8c161a6b622e6b", + "s": "0x6543b736231a6d85107c7e6083e9067a0d00aaad744816646e16115445f908ca", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020100", + "extraData": "0x", + "gasLimit": "0x01dd08d1", + "gasUsed": "0x53a0", + "hash": "aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017", + "mixHash": "e13ef23b8e939b58a044d291bf14cc01a23f68389940d6cc38dd95809adabb76", + "nonce": "bd9aa907a816f269", + "number": "0x05", + "parentHash": "1512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9", + "receiptTrie": "d2544e6a9719ec49333a83efbc4683019674a314c37c855d40dc95bb9080b3b9", + "stateRoot": "e118728dc0a21436632eb492cecab305940c0782da9cdc3bf2cea9f2d67f0257", + "timestamp": "0x55b7e6ff", + "transactionsTrie": "066a7ed4bb74feca3008a9dcfda7ad4291fe4124dd335ada65989ab27a776af9", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa01512a800fae4c6cdddec175e5977d421c8c139de08a608c94579affa091f34a9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e118728dc0a21436632eb492cecab305940c0782da9cdc3bf2cea9f2d67f0257a0066a7ed4bb74feca3008a9dcfda7ad4291fe4124dd335ada65989ab27a776af9a0d2544e6a9719ec49333a83efbc4683019674a314c37c855d40dc95bb9080b3b9b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020100058401dd08d18253a08455b7e6ff80a0e13ef23b8e939b58a044d291bf14cc01a23f68389940d6cc38dd95809adabb7688bd9aa907a816f269f86ef86c0486105ef39b2000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca06cda2e6b92c549ee2fb1c1078ad116315093eae7b06d54dd6ad8f3d4d1d246e5a026b9d1b5dfe1480b3b8f1cdccb06714f61631dcac3680f3b45ac9a84928b78a3c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x105ef39b2000", + "nonce": "0x04", + "r": "0x6cda2e6b92c549ee2fb1c1078ad116315093eae7b06d54dd6ad8f3d4d1d246e5", + "s": "0x26b9d1b5dfe1480b3b8f1cdccb06714f61631dcac3680f3b45ac9a84928b78a3", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020140", + "extraData": "0x", + "gasLimit": "0x01dc91a9", + "gasUsed": "0x53a0", + "hash": "025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15", + "mixHash": "36462deee79c6bba8c835d66cf690d4a5e972c524d256cb07a1138a007f0d568", + "nonce": "afd358c3806197aa", + "number": "0x06", + "parentHash": "aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017", + "receiptTrie": "e42cc2b210e3b2cfb811ce2d9afa2207a03c3ec827ac68ade1d47551e5ce3148", + "stateRoot": "bbd6012af885d075e4d469716846b92cf80fb0184fbb2570d1c79f19737132b6", + "timestamp": "0x55b7e700", + "transactionsTrie": "1f4f6fa6c6d35a4af215a996cfcdcfb8eb3df22f0f6ab2f57ec58d6ad6a4e57d", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0aa774115aa8cb0e0f4f94d3337a034bf54b36214a54f1658053d292d5c31a017a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bbd6012af885d075e4d469716846b92cf80fb0184fbb2570d1c79f19737132b6a01f4f6fa6c6d35a4af215a996cfcdcfb8eb3df22f0f6ab2f57ec58d6ad6a4e57da0e42cc2b210e3b2cfb811ce2d9afa2207a03c3ec827ac68ade1d47551e5ce3148b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020140068401dc91a98253a08455b7e70080a036462deee79c6bba8c835d66cf690d4a5e972c524d256cb07a1138a007f0d56888afd358c3806197aaf86ef86c058612309ce54000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca0d2b6a9d3c6286c1a71d88ef2e3d3889352311a9348ee7c7256c2af3db4b048dca00e3f13618132ebefdf2e207668c6fff0b2b3f2bbe95f2b1528e2d267a24cade2c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x12309ce54000", + "nonce": "0x05", + "r": "0xd2b6a9d3c6286c1a71d88ef2e3d3889352311a9348ee7c7256c2af3db4b048dc", + "s": "0x0e3f13618132ebefdf2e207668c6fff0b2b3f2bbe95f2b1528e2d267a24cade2", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020180", + "extraData": "0x", + "gasLimit": "0x01dc1a9f", + "gasUsed": "0x53a0", + "hash": "fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610d", + "mixHash": "a93600adb203da0f92017553b2c88fe18ebebfd93da90158e00c56d81a316666", + "nonce": "aefa3ed3e9eb83e9", + "number": "0x07", + "parentHash": "025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15", + "receiptTrie": "86d5cd24252cfe39096df1568affa38e5295232d5b2349792d195113f9b8d455", + "stateRoot": "8ccd601c1ae4548de690c21306ba4e9dd5a1ff03a31f8c08af968ffa7a6902fd", + "timestamp": "0x55b7e702", + "transactionsTrie": "71e64105f752773f43221dd85e44d299d08b229cdbcea166536fb48f72de8b73", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0025e2faea5cd11c83fe99d1b3d6547d049609018146931d6266a4a4de0cc1a15a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08ccd601c1ae4548de690c21306ba4e9dd5a1ff03a31f8c08af968ffa7a6902fda071e64105f752773f43221dd85e44d299d08b229cdbcea166536fb48f72de8b73a086d5cd24252cfe39096df1568affa38e5295232d5b2349792d195113f9b8d455b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020180078401dc1a9f8253a08455b7e70280a0a93600adb203da0f92017553b2c88fe18ebebfd93da90158e00c56d81a31666688aefa3ed3e9eb83e9f86ef86c06861402462f6000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ca07dbb1abd6964f8167ff9d79b438a83137eda9ee4d8d5e73b6088113249846956a03de1e4e462f720df0f4d7012c0f3be32cb908b309d70642fcf8175f2ca3b0c8fc0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x1402462f6000", + "nonce": "0x06", + "r": "0x7dbb1abd6964f8167ff9d79b438a83137eda9ee4d8d5e73b6088113249846956", + "s": "0x3de1e4e462f720df0f4d7012c0f3be32cb908b309d70642fcf8175f2ca3b0c8f", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1c", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0201c0", + "extraData": "0x", + "gasLimit": "0x01dba3b3", + "gasUsed": "0x53a0", + "hash": "b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780", + "mixHash": "437c435a14a4a1918ad7a2ba37dd5dbefb071e41a2cea3c75505b937c5e2255c", + "nonce": "15c846a65edd10f4", + "number": "0x08", + "parentHash": "fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610d", + "receiptTrie": "f14192d5dd2ea1aa08314fbc05d61656cb37aff2396de80e8ff541080d540ae8", + "stateRoot": "84d881a23122ed0a46baac83083d3f2e46b3531c7cf35d08fd533f9015fdf35a", + "timestamp": "0x55b7e703", + "transactionsTrie": "5292f0bb53c9ff642471ea0098f045c8871914dc62bc44123f7db66adc83e925", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0fcdac3fbf1838f533533908d71d54fd0cf0f506730615755ada63303bf40610da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a084d881a23122ed0a46baac83083d3f2e46b3531c7cf35d08fd533f9015fdf35aa05292f0bb53c9ff642471ea0098f045c8871914dc62bc44123f7db66adc83e925a0f14192d5dd2ea1aa08314fbc05d61656cb37aff2396de80e8ff541080d540ae8b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830201c0088401dba3b38253a08455b7e70380a0437c435a14a4a1918ad7a2ba37dd5dbefb071e41a2cea3c75505b937c5e2255c8815c846a65edd10f4f86ef86c078615d3ef798000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba0a4d2b7612da4b7493213decb120ea2826e72adac5e605bc9a889d287df4e6a50a04b08a8ee68b2e984220db524a5e6c5fa93b083bafb728734a5ddad91ee51b41fc0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x15d3ef798000", + "nonce": "0x07", + "r": "0xa4d2b7612da4b7493213decb120ea2826e72adac5e605bc9a889d287df4e6a50", + "s": "0x4b08a8ee68b2e984220db524a5e6c5fa93b083bafb728734a5ddad91ee51b41f", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1b", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020200", + "extraData": "0x", + "gasLimit": "0x01db2ce5", + "gasUsed": "0x53a0", + "hash": "ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2", + "mixHash": "5c05372757a88c9536533fc454a7aacb1ed0b366828650dbeea09362ab35bf87", + "nonce": "8ed6b0b09318ad1d", + "number": "0x09", + "parentHash": "b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780", + "receiptTrie": "a06a1b861f74a7c1e8876e7dbb74d7e62d7c991c32ac84ff2774b88b5842cbdb", + "stateRoot": "aeb1fbf45a3bec7db72e65ead9d4237e7628be3e836df050c401c26614bb876f", + "timestamp": "0x55b7e704", + "transactionsTrie": "874dabcca653170e57fe4d0241cddcd6f9ef93c07765e1635de159cff6c4e753", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0b0cad190b0a2a78cd23f5e62dd67acf8a01aef876b8479be680cf45c23fc5780a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0aeb1fbf45a3bec7db72e65ead9d4237e7628be3e836df050c401c26614bb876fa0874dabcca653170e57fe4d0241cddcd6f9ef93c07765e1635de159cff6c4e753a0a06a1b861f74a7c1e8876e7dbb74d7e62d7c991c32ac84ff2774b88b5842cbdbb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020200098401db2ce58253a08455b7e70480a05c05372757a88c9536533fc454a7aacb1ed0b366828650dbeea09362ab35bf87888ed6b0b09318ad1df86ef86c088617a598c3a000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba09d1e6336a3acb8cf03efb4ab7e187a8bcaa125bbbe195997ac6fe2664b1ccce7a027d556535661b74e4453f54e6921117abbf541de92cbe791c463037bec440285c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x17a598c3a000", + "nonce": "0x08", + "r": "0x9d1e6336a3acb8cf03efb4ab7e187a8bcaa125bbbe195997ac6fe2664b1ccce7", + "s": "0x27d556535661b74e4453f54e6921117abbf541de92cbe791c463037bec440285", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1b", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020240", + "extraData": "0x", + "gasLimit": "0x01dab634", + "gasUsed": "0x53a0", + "hash": "0cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5", + "mixHash": "b57aa704d7d2d3c17312e6e0295f16474226441a752afffde9381b6369a53ba0", + "nonce": "13e30b4419905574", + "number": "0x0a", + "parentHash": "ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2", + "receiptTrie": "dbedecbd6f556073b0fa43fb71b4c69df5384b6d4f43bd4cd0a0a97f4d43fbe8", + "stateRoot": "4b56583cd2308b5424ad7a632022073beabdfe282931019dac676ecb162cb23c", + "timestamp": "0x55b7e706", + "transactionsTrie": "557fb34c4e06a92e14a8dbf88f43c139ae7cfee4654b01f159509179eb86f17e", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa0ec3ee4b1446cf5baea491311aaf8d68ba71a7c540ee71334afa08556a24fc0c2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a04b56583cd2308b5424ad7a632022073beabdfe282931019dac676ecb162cb23ca0557fb34c4e06a92e14a8dbf88f43c139ae7cfee4654b01f159509179eb86f17ea0dbedecbd6f556073b0fa43fb71b4c69df5384b6d4f43bd4cd0a0a97f4d43fbe8b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202400a8401dab6348253a08455b7e70680a0b57aa704d7d2d3c17312e6e0295f16474226441a752afffde9381b6369a53ba08813e30b4419905574f86ef86c09861977420dc000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba03e0d159c71bddaf7507905a0f97fb2c86b773a56460d3c3ae461fdb2593a0d4ea02deec822756dddc958ce784740a503cf4895e632502c6c7966a5c662cf6a3561c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x1977420dc000", + "nonce": "0x09", + "r": "0x3e0d159c71bddaf7507905a0f97fb2c86b773a56460d3c3ae461fdb2593a0d4e", + "s": "0x2deec822756dddc958ce784740a503cf4895e632502c6c7966a5c662cf6a3561", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1b", + "value": "0x0a" + }], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020280", + "extraData": "0x", + "gasLimit": "0x01da3fa1", + "gasUsed": "0x53a0", + "hash": "fc594b924f162e21e84d67b27eebd532227a2d61dc8a8e50ce5f656da0916afe", + "mixHash": "05f16acc9747f7d21872b0dcbf9c0037fd45f8a87386d69781980abb1750f32e", + "nonce": "17fa1270c59bcdd1", + "number": "0x0b", + "parentHash": "0cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5", + "receiptTrie": "0a1936375f87b646a5a18839f658fa8b9af039f22d609fd5c6a0df4d52ce3bbb", + "stateRoot": "44ee2a97efc07fdf2af1ce9181f00b3b99feb92de903bc1ab26fc4db39f4bc9c", + "timestamp": "0x55b7e708", + "transactionsTrie": "54541930d62573205e70bcfd40bc51c131e79d9f038a85b84d20203381407e21", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf9026ef901faa00cfebf2a15a40d1fa85b7232cec7cb80f83fd15f64ba0a5001b3d65c30a223e5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a044ee2a97efc07fdf2af1ce9181f00b3b99feb92de903bc1ab26fc4db39f4bc9ca054541930d62573205e70bcfd40bc51c131e79d9f038a85b84d20203381407e21a00a1936375f87b646a5a18839f658fa8b9af039f22d609fd5c6a0df4d52ce3bbbb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202800b8401da3fa18253a08455b7e70880a005f16acc9747f7d21872b0dcbf9c0037fd45f8a87386d69781980abb1750f32e8817fa1270c59bcdd1f86ef86c0a861b48eb57e000830cf85094095e7baea6a6c7c4c2dfeb977efac326af552d870a86ffffffffffff1ba0a4ce64813530f35e4c45168988a82aaa5dd4ffec2e1325e8edc99b428dc390a8a0270598015d7aa6d92aacaad70a4c72f9022db2642c77b06cd068e28ba80a5a68c0", + "transactions": [{ + "data": "0xffffffffffff", + "gasLimit": "0x0cf850", + "gasPrice": "0x1b48eb57e000", + "nonce": "0x0a", + "r": "0xa4ce64813530f35e4c45168988a82aaa5dd4ffec2e1325e8edc99b428dc390a8", + "s": "0x270598015d7aa6d92aacaad70a4c72f9022db2642c77b06cd068e28ba80a5a68", + "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v": "0x1b", + "value": "0x0a" + }], + "uncleHeaders": [] + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020000", + "extraData": "0x42", + "gasLimit": "0x01df5e70", + "gasUsed": "0x00", + "hash": "a07e6e83984a8c98e83439eb737b429d8cbc0e6c8b37ba3e5ac5faebcf78db6b", + "mixHash": "1fbb1c0dd4a71d0d6451d87118e8615e997c89ee002d412824166a471e4b487b", + "nonce": "64500fc0c924577b", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "71f7c8fb1ecac2ee69cd5aa02564d358fc641845977fa4e30c65be195167bb45", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "notxs" : { - "blocks" : [ - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271", - "mixHash" : "ac1254b4ec97b116e2975d4506093015d4470ed3a6fcc602e5f2403c7b3bb594", - "nonce" : "341281600b5abd48", - "number" : "0x01", - "parentHash" : "de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "8503769bb14067be7c5e438c353094e5a9a6c72f375fad4a76878a8882ceb496", - "timestamp" : "0x55b7e70a", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08503769bb14067be7c5e438c353094e5a9a6c72f375fad4a76878a8882ceb496a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8808455b7e70a80a0ac1254b4ec97b116e2975d4506093015d4470ed3a6fcc602e5f2403c7b3bb59488341281600b5abd48c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020040", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdf", - "mixHash" : "0c1daf93f42a09d560a9d113363f46bddc4d9fecafc2c864099d5be7c707b51c", - "nonce" : "afa6dc2e6f49e535", - "number" : "0x02", - "parentHash" : "729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "326587c5310ecdbd0c8d36c471eef6595a6046ad46ee90bf0db88e691223ee38", - "timestamp" : "0x55b7e70b", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0326587c5310ecdbd0c8d36c471eef6595a6046ad46ee90bf0db88e691223ee38a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd8808455b7e70b80a00c1daf93f42a09d560a9d113363f46bddc4d9fecafc2c864099d5be7c707b51c88afa6dc2e6f49e535c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020080", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53", - "mixHash" : "8ca62f80830ae7cd98a723aca64f79916c1c11d5853e940fc19561274fe7c835", - "nonce" : "eb6e065fa2b84f3c", - "number" : "0x03", - "parentHash" : "134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdf", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "c662553363b8624b50cd8f83a2a28ec38b6cf0c029db61cb21e06d7df87fb256", - "timestamp" : "0x55b7e70c", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdfa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c662553363b8624b50cd8f83a2a28ec38b6cf0c029db61cb21e06d7df87fb256a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8808455b7e70c80a08ca62f80830ae7cd98a723aca64f79916c1c11d5853e940fc19561274fe7c83588eb6e065fa2b84f3cc0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0200c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541", - "mixHash" : "c01b6e1ab7d2e1093cc4983328ef9e79fd7de14ea821094daaa9d695e17532a5", - "nonce" : "ae81718595b5701e", - "number" : "0x04", - "parentHash" : "f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "6b6c82551219d30f4168674006e3e1ece38eb055d9575f63e6dcce05f4a610af", - "timestamp" : "0x55b7e70f", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a06b6c82551219d30f4168674006e3e1ece38eb055d9575f63e6dcce05f4a610afa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c004832fefd8808455b7e70f80a0c01b6e1ab7d2e1093cc4983328ef9e79fd7de14ea821094daaa9d695e17532a588ae81718595b5701ec0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020100", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afee", - "mixHash" : "947e445ea4fa307dd46513f99adc2e7f4c205345d4de1ac6a1e6592e739f2120", - "nonce" : "6371252c7807f456", - "number" : "0x05", - "parentHash" : "cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "d7fbf4bf063a6e4a506777007a071e16d4dc6cc18f9ced7b29261942b35409a3", - "timestamp" : "0x55b7e711", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d7fbf4bf063a6e4a506777007a071e16d4dc6cc18f9ced7b29261942b35409a3a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302010005832fefd8808455b7e71180a0947e445ea4fa307dd46513f99adc2e7f4c205345d4de1ac6a1e6592e739f2120886371252c7807f456c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020140", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "1c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7ed", - "mixHash" : "528d4436d147a02a8ed551fae5f1f57413862617d8227cb4cf966cb952249463", - "nonce" : "046fa7968c8cd601", - "number" : "0x06", - "parentHash" : "d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afee", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "d7073aa8551fa3daa4aa5472bb3e43f5bb5e573b201e808036ad7e495f55c42e", - "timestamp" : "0x55b7e713", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afeea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d7073aa8551fa3daa4aa5472bb3e43f5bb5e573b201e808036ad7e495f55c42ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302014006832fefd8808455b7e71380a0528d4436d147a02a8ed551fae5f1f57413862617d8227cb4cf966cb95224946388046fa7968c8cd601c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020180", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "33e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23", - "mixHash" : "95edd26ffdf4ac20cfa92d1c7cf4c05c6105afd5d95eb595cd72f03a8ab5f5cf", - "nonce" : "b14cea1c427ed752", - "number" : "0x07", - "parentHash" : "1c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7ed", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "793912478fd35f247f64d392e8bcaead8ab614be3fd987264a173b68b879c58c", - "timestamp" : "0x55b7e715", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a01c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7eda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0793912478fd35f247f64d392e8bcaead8ab614be3fd987264a173b68b879c58ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302018007832fefd8808455b7e71580a095edd26ffdf4ac20cfa92d1c7cf4c05c6105afd5d95eb595cd72f03a8ab5f5cf88b14cea1c427ed752c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0201c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41ed", - "mixHash" : "feb26554b9f283bc91ecbbcaeea8385ddcccce61871299c18d9164d7da57813b", - "nonce" : "d6337c1635671082", - "number" : "0x08", - "parentHash" : "33e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "dcb04aa3695e496be9d1d0e6d2de0303f330e4f7f201b340f642da3714e648fa", - "timestamp" : "0x55b7e717", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a033e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0dcb04aa3695e496be9d1d0e6d2de0303f330e4f7f201b340f642da3714e648faa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830201c008832fefd8808455b7e71780a0feb26554b9f283bc91ecbbcaeea8385ddcccce61871299c18d9164d7da57813b88d6337c1635671082c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020200", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "7641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154", - "mixHash" : "af5b02f45319575287bf82e566e527960ddec57456ca3b125684450ca4bdd1e0", - "nonce" : "5b98740615bed5fb", - "number" : "0x09", - "parentHash" : "fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41ed", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "3ecc35b803ca5469044004746738b563022ee32f55a47bee84b1cbbc8aec7038", - "timestamp" : "0x55b7e719", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41eda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a03ecc35b803ca5469044004746738b563022ee32f55a47bee84b1cbbc8aec7038a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302020009832fefd8808455b7e71980a0af5b02f45319575287bf82e566e527960ddec57456ca3b125684450ca4bdd1e0885b98740615bed5fbc0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020240", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "7278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31f", - "mixHash" : "6b77228c3e37f1cfcac744570927355dc8977a0d5a07fef5bafc8dac09be66f9", - "nonce" : "c8ae382f1e04738e", - "number" : "0x0a", - "parentHash" : "7641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "82deda184becc41323eae64a6074f111e0cb35cd322f404f6b2a5adb5a34c6e5", - "timestamp" : "0x55b7e71a", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a07641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a082deda184becc41323eae64a6074f111e0cb35cd322f404f6b2a5adb5a34c6e5a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202400a832fefd8808455b7e71a80a06b77228c3e37f1cfcac744570927355dc8977a0d5a07fef5bafc8dac09be66f988c8ae382f1e04738ec0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020280", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "4301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7", - "mixHash" : "4c4b6f6d157c9b21e6503d43f51bf5fa795057dff76cfb5c3101c562a58e3075", - "nonce" : "4b662bc13bd8eb3e", - "number" : "0x0b", - "parentHash" : "7278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31f", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "f156db8814724a583ca59380610df31556ef5c0d1902232d5682265582b1ddcc", - "timestamp" : "0x55b7e71c", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a07278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f156db8814724a583ca59380610df31556ef5c0d1902232d5682265582b1ddcca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202800b832fefd8808455b7e71c80a04c4b6f6d157c9b21e6503d43f51bf5fa795057dff76cfb5c3101c562a58e3075884b662bc13bd8eb3ec0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0202c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "89b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2", - "mixHash" : "3caa350b0c80933c44ff1fce1207771382b7ddceab1fe29ace45ef36c2d1a4f8", - "nonce" : "1cd1a30ad25263a2", - "number" : "0x0c", - "parentHash" : "4301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "27a822b12eb549a47e54bfbfed10435ba5e7ac2b6570e3a55a946ab4459ef565", - "timestamp" : "0x55b7e71d", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a04301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a027a822b12eb549a47e54bfbfed10435ba5e7ac2b6570e3a55a946ab4459ef565a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202c00c832fefd8808455b7e71d80a03caa350b0c80933c44ff1fce1207771382b7ddceab1fe29ace45ef36c2d1a4f8881cd1a30ad25263a2c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020300", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1", - "mixHash" : "e0c86b7656ebeb87b9637ae65f0b844675b5e3ea60074ad9df783139fa6c7ab6", - "nonce" : "4a715e52a6d3c641", - "number" : "0x0d", - "parentHash" : "89b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "b0d8ef7663253d7b802a040678d7c2dbec2ff212cbdf21fa1b4ab3b0096d7b29", - "timestamp" : "0x55b7e71f", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a089b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b0d8ef7663253d7b802a040678d7c2dbec2ff212cbdf21fa1b4ab3b0096d7b29a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203000d832fefd8808455b7e71f80a0e0c86b7656ebeb87b9637ae65f0b844675b5e3ea60074ad9df783139fa6c7ab6884a715e52a6d3c641c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020340", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782b", - "mixHash" : "e9002b6cd5c35f7dc0cf84264130db0f478581cc42d771d750b2498bd06205ad", - "nonce" : "6df69ea0cdaaf1fc", - "number" : "0x0e", - "parentHash" : "f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "bcdf88f6700cebabc1092b5a663aae4e3c414e9cbc5c6ec862c310d810971145", - "timestamp" : "0x55b7e721", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bcdf88f6700cebabc1092b5a663aae4e3c414e9cbc5c6ec862c310d810971145a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203400e832fefd8808455b7e72180a0e9002b6cd5c35f7dc0cf84264130db0f478581cc42d771d750b2498bd06205ad886df69ea0cdaaf1fcc0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020380", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238c", - "mixHash" : "2738ce46b148eb08c0ba8a1276828282e82e2b5b4d0c26a6872129d939ddba6a", - "nonce" : "8365e8d13580479f", - "number" : "0x0f", - "parentHash" : "e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782b", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "584e007c60cac97af14794fbf7ac16f2b7c2a2050da896711c97d4c162a32f66", - "timestamp" : "0x55b7e722", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0584e007c60cac97af14794fbf7ac16f2b7c2a2050da896711c97d4c162a32f66a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203800f832fefd8808455b7e72280a02738ce46b148eb08c0ba8a1276828282e82e2b5b4d0c26a6872129d939ddba6a888365e8d13580479fc0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0203c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6", - "mixHash" : "f009294be3192196796e9188ade1e8b9cd29aeac8fc1ba60898c8543997cfce1", - "nonce" : "ddd31cbcf7c06cb0", - "number" : "0x10", - "parentHash" : "ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238c", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "40018894b5b4ed58f3645029eb67a7bbdbc17403ea03c2c9ad31da2fbfbda54a", - "timestamp" : "0x55b7e724", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a040018894b5b4ed58f3645029eb67a7bbdbc17403ea03c2c9ad31da2fbfbda54aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203c010832fefd8808455b7e72480a0f009294be3192196796e9188ade1e8b9cd29aeac8fc1ba60898c8543997cfce188ddd31cbcf7c06cb0c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020400", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111", - "mixHash" : "f9848a47ad2db2af447313cf466d9ad1e3bdec77f9e42059111f7413fba67271", - "nonce" : "b86889cf6a60454e", - "number" : "0x11", - "parentHash" : "132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "8f5c35386979fce489741a660bbb307fbf031d37228accfcdf8b172c8751b5d7", - "timestamp" : "0x55b7e726", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08f5c35386979fce489741a660bbb307fbf031d37228accfcdf8b172c8751b5d7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302040011832fefd8808455b7e72680a0f9848a47ad2db2af447313cf466d9ad1e3bdec77f9e42059111f7413fba6727188b86889cf6a60454ec0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020440", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "8d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0", - "mixHash" : "2267ffcb65b55160f312f0766036f23b6bdf131d2e658ba09884664484f3bfc2", - "nonce" : "1c36744758652660", - "number" : "0x12", - "parentHash" : "c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "558046f5f6d5c25f9dc3073feff56cfeb2d298cc305556507c438df83b9bb455", - "timestamp" : "0x55b7e728", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0558046f5f6d5c25f9dc3073feff56cfeb2d298cc305556507c438df83b9bb455a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302044012832fefd8808455b7e72880a02267ffcb65b55160f312f0766036f23b6bdf131d2e658ba09884664484f3bfc2881c36744758652660c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020480", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071", - "mixHash" : "3881843b368cdef308cd5d79b6286383e98b32ae136a80ed7300d6a6895cc4dc", - "nonce" : "d57c46d9d26f4748", - "number" : "0x13", - "parentHash" : "8d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "797f2c1a9d1412fba9a4c568345a153226cc515c29a975b07e14d87844c41077", - "timestamp" : "0x55b7e729", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a08d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0797f2c1a9d1412fba9a4c568345a153226cc515c29a975b07e14d87844c41077a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302048013832fefd8808455b7e72980a03881843b368cdef308cd5d79b6286383e98b32ae136a80ed7300d6a6895cc4dc88d57c46d9d26f4748c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0204c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087", - "mixHash" : "7ae4ed651c7a6e495e6f9cd3ba595da0b31dee931ca6e8ae8de4cbabb1b3ec3d", - "nonce" : "bbebf5b64f3d6f87", - "number" : "0x14", - "parentHash" : "cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "b8d26292009aac0ac6fb3f27dfbe37417a4986e7eac92b087fc483163231455f", - "timestamp" : "0x55b7e72b", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b8d26292009aac0ac6fb3f27dfbe37417a4986e7eac92b087fc483163231455fa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830204c014832fefd8808455b7e72b80a07ae4ed651c7a6e495e6f9cd3ba595da0b31dee931ca6e8ae8de4cbabb1b3ec3d88bbebf5b64f3d6f87c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020500", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0", - "mixHash" : "e1e3e7773546606ae5b16bc539b426ca19ce92c690d70a47b596d3a560e3f43a", - "nonce" : "c663712d7a706c71", - "number" : "0x15", - "parentHash" : "e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "263ee0071da205fb88b8bfc6905ec4a382e004a16be57e328db7d5f6fe2ef094", - "timestamp" : "0x55b7e72d", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0263ee0071da205fb88b8bfc6905ec4a382e004a16be57e328db7d5f6fe2ef094a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302050015832fefd8808455b7e72d80a0e1e3e7773546606ae5b16bc539b426ca19ce92c690d70a47b596d3a560e3f43a88c663712d7a706c71c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020540", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718", - "mixHash" : "1f0a1b1a6dbd0fdf145cb9e0c9b4826562f0e75e9b96d5e42902a7a4222224f3", - "nonce" : "1f8b9f0d6951ae05", - "number" : "0x16", - "parentHash" : "baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "cb18f938d431b97f2da9da22d4ee0e7f5683bcd40b334d10a3c8a2c500f44172", - "timestamp" : "0x55b7e72e", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb18f938d431b97f2da9da22d4ee0e7f5683bcd40b334d10a3c8a2c500f44172a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302054016832fefd8808455b7e72e80a01f0a1b1a6dbd0fdf145cb9e0c9b4826562f0e75e9b96d5e42902a7a4222224f3881f8b9f0d6951ae05c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020580", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "86c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0", - "mixHash" : "aeb9d07869fa0ca0b5acc071b0bd71171ab80c840fc1e2e207d77ff35b3ba847", - "nonce" : "5579a65ec808c4b0", - "number" : "0x17", - "parentHash" : "b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "e43f761aec2f7c501460707beeb9cfdc327167de802b66bfe4fc242c445198c4", - "timestamp" : "0x55b7e72f", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a0b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e43f761aec2f7c501460707beeb9cfdc327167de802b66bfe4fc242c445198c4a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302058017832fefd8808455b7e72f80a0aeb9d07869fa0ca0b5acc071b0bd71171ab80c840fc1e2e207d77ff35b3ba847885579a65ec808c4b0c0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - }, - { - "blockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x0205c0", - "extraData" : "0x", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "09d85cfb5f6d1dd01166312c7065f5398b62cb3238eb8b253203b1a7c6103130", - "mixHash" : "3e65f4e43fdefc8580e0cb4060fdf42499b2f5693ace121555c55230a0bd9542", - "nonce" : "741ed4886c1bdc2d", - "number" : "0x18", - "parentHash" : "86c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "d03041a321e09270a4b492eb94e244a1b4517a76d6bfb59031aa7003eb287cf4", - "timestamp" : "0x55b7e731", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "rlp" : "0xf901fcf901f7a086c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d03041a321e09270a4b492eb94e244a1b4517a76d6bfb59031aa7003eb287cf4a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830205c018832fefd8808455b7e73180a03e65f4e43fdefc8580e0cb4060fdf42499b2f5693ace121555c55230a0bd954288741ed4886c1bdc2dc0c0", - "transactions" : [ - ], - "uncleHeaders" : [ - ] - } - ], - "genesisBlockHeader" : { - "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", - "difficulty" : "0x020000", - "extraData" : "0x42", - "gasLimit" : "0x2fefd8", - "gasUsed" : "0x00", - "hash" : "de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81", - "mixHash" : "73c1f97c35c8e8a9658b87b77c2059f8d0aba2a59325c3b17e8e8aa86ca13ba5", - "nonce" : "6b8f68474b6896fb", - "number" : "0x00", - "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", - "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "stateRoot" : "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", - "timestamp" : "0x54c98c81", - "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" - }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a073c1f97c35c8e8a9658b87b77c2059f8d0aba2a59325c3b17e8e8aa86ca13ba5886b8f68474b6896fbc0c0", - "lastblockhash" : "09d85cfb5f6d1dd01166312c7065f5398b62cb3238eb8b253203b1a7c6103130", - "postState" : { - "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x068155a43676e00000", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - } - }, - "pre" : { - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02540be400", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - } - } + "genesisRLP": "0xf901fdf901f8a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a071f7c8fb1ecac2ee69cd5aa02564d358fc641845977fa4e30c65be195167bb45a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000808401df5e70808454c98c8142a01fbb1c0dd4a71d0d6451d87118e8615e997c89ee002d412824166a471e4b487b8864500fc0c924577bc0c0", + "lastblockhash": "fc594b924f162e21e84d67b27eebd532227a2d61dc8a8e50ce5f656da0916afe", + "postState": { + "095e7baea6a6c7c4c2dfeb977efac326af552d87": { + "balance": "0x6e", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "8888f1f195afa192cfee860698584c030f4c9db1": { + "balance": "0x033ca3ae5d37d40000", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x1d14a0215cf8145fe6a7ff92", + "code": "0x", + "nonce": "0x0b", + "storage": {} + }, + "aaaf5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x02540be400", + "code": "0x60003551", + "nonce": "0x00", + "storage": {} + } + }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x1d14a0219e54822428000000", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "aaaf5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x02540be400", + "code": "0x60003551", + "nonce": "0x00", + "storage": {} + } + } + }, + "notxs": { + "blocks": [{ + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020000", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271", + "mixHash": "ac1254b4ec97b116e2975d4506093015d4470ed3a6fcc602e5f2403c7b3bb594", + "nonce": "341281600b5abd48", + "number": "0x01", + "parentHash": "de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "8503769bb14067be7c5e438c353094e5a9a6c72f375fad4a76878a8882ceb496", + "timestamp": "0x55b7e70a", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08503769bb14067be7c5e438c353094e5a9a6c72f375fad4a76878a8882ceb496a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd8808455b7e70a80a0ac1254b4ec97b116e2975d4506093015d4470ed3a6fcc602e5f2403c7b3bb59488341281600b5abd48c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020040", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdf", + "mixHash": "0c1daf93f42a09d560a9d113363f46bddc4d9fecafc2c864099d5be7c707b51c", + "nonce": "afa6dc2e6f49e535", + "number": "0x02", + "parentHash": "729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "326587c5310ecdbd0c8d36c471eef6595a6046ad46ee90bf0db88e691223ee38", + "timestamp": "0x55b7e70b", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0729b522b9852bf4141ca028b686ea22347b625c755be14fdf73c7a4eac642271a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0326587c5310ecdbd0c8d36c471eef6595a6046ad46ee90bf0db88e691223ee38a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd8808455b7e70b80a00c1daf93f42a09d560a9d113363f46bddc4d9fecafc2c864099d5be7c707b51c88afa6dc2e6f49e535c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020080", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53", + "mixHash": "8ca62f80830ae7cd98a723aca64f79916c1c11d5853e940fc19561274fe7c835", + "nonce": "eb6e065fa2b84f3c", + "number": "0x03", + "parentHash": "134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdf", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "c662553363b8624b50cd8f83a2a28ec38b6cf0c029db61cb21e06d7df87fb256", + "timestamp": "0x55b7e70c", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0134171eb12ebe3c4f37be41376fd7abf9f5d826940e9cbaf3a7f03fc3a6acbdfa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0c662553363b8624b50cd8f83a2a28ec38b6cf0c029db61cb21e06d7df87fb256a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd8808455b7e70c80a08ca62f80830ae7cd98a723aca64f79916c1c11d5853e940fc19561274fe7c83588eb6e065fa2b84f3cc0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0200c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541", + "mixHash": "c01b6e1ab7d2e1093cc4983328ef9e79fd7de14ea821094daaa9d695e17532a5", + "nonce": "ae81718595b5701e", + "number": "0x04", + "parentHash": "f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "6b6c82551219d30f4168674006e3e1ece38eb055d9575f63e6dcce05f4a610af", + "timestamp": "0x55b7e70f", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0f0296e94640614da9c901fedeae61ffb6b6f60323360e5904282f191f71b8c53a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a06b6c82551219d30f4168674006e3e1ece38eb055d9575f63e6dcce05f4a610afa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200c004832fefd8808455b7e70f80a0c01b6e1ab7d2e1093cc4983328ef9e79fd7de14ea821094daaa9d695e17532a588ae81718595b5701ec0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020100", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afee", + "mixHash": "947e445ea4fa307dd46513f99adc2e7f4c205345d4de1ac6a1e6592e739f2120", + "nonce": "6371252c7807f456", + "number": "0x05", + "parentHash": "cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "d7fbf4bf063a6e4a506777007a071e16d4dc6cc18f9ced7b29261942b35409a3", + "timestamp": "0x55b7e711", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0cb3efe8324b8b2cbf944248971ea534c6300bdb76cd346c9e3be163688f6a541a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d7fbf4bf063a6e4a506777007a071e16d4dc6cc18f9ced7b29261942b35409a3a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302010005832fefd8808455b7e71180a0947e445ea4fa307dd46513f99adc2e7f4c205345d4de1ac6a1e6592e739f2120886371252c7807f456c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020140", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "1c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7ed", + "mixHash": "528d4436d147a02a8ed551fae5f1f57413862617d8227cb4cf966cb952249463", + "nonce": "046fa7968c8cd601", + "number": "0x06", + "parentHash": "d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afee", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "d7073aa8551fa3daa4aa5472bb3e43f5bb5e573b201e808036ad7e495f55c42e", + "timestamp": "0x55b7e713", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0d5a9bfaacb5a003efa38df0b96469686a8de51aed9ce191add1cc9741484afeea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d7073aa8551fa3daa4aa5472bb3e43f5bb5e573b201e808036ad7e495f55c42ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302014006832fefd8808455b7e71380a0528d4436d147a02a8ed551fae5f1f57413862617d8227cb4cf966cb95224946388046fa7968c8cd601c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020180", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "33e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23", + "mixHash": "95edd26ffdf4ac20cfa92d1c7cf4c05c6105afd5d95eb595cd72f03a8ab5f5cf", + "nonce": "b14cea1c427ed752", + "number": "0x07", + "parentHash": "1c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7ed", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "793912478fd35f247f64d392e8bcaead8ab614be3fd987264a173b68b879c58c", + "timestamp": "0x55b7e715", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a01c3245b5a38e2c3f7fa083a6de7873e74692087f5841abe622c0ac0cfef1d7eda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0793912478fd35f247f64d392e8bcaead8ab614be3fd987264a173b68b879c58ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302018007832fefd8808455b7e71580a095edd26ffdf4ac20cfa92d1c7cf4c05c6105afd5d95eb595cd72f03a8ab5f5cf88b14cea1c427ed752c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0201c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41ed", + "mixHash": "feb26554b9f283bc91ecbbcaeea8385ddcccce61871299c18d9164d7da57813b", + "nonce": "d6337c1635671082", + "number": "0x08", + "parentHash": "33e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "dcb04aa3695e496be9d1d0e6d2de0303f330e4f7f201b340f642da3714e648fa", + "timestamp": "0x55b7e717", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a033e92cdfabc54cb3c3772b38d484fa1d46cd2e99c889b421d128b900503eaa23a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0dcb04aa3695e496be9d1d0e6d2de0303f330e4f7f201b340f642da3714e648faa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830201c008832fefd8808455b7e71780a0feb26554b9f283bc91ecbbcaeea8385ddcccce61871299c18d9164d7da57813b88d6337c1635671082c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020200", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "7641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154", + "mixHash": "af5b02f45319575287bf82e566e527960ddec57456ca3b125684450ca4bdd1e0", + "nonce": "5b98740615bed5fb", + "number": "0x09", + "parentHash": "fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41ed", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "3ecc35b803ca5469044004746738b563022ee32f55a47bee84b1cbbc8aec7038", + "timestamp": "0x55b7e719", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0fa4af3e332531c73dd2ca020a831fd9568b88134087349d521fa177c17bc41eda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a03ecc35b803ca5469044004746738b563022ee32f55a47bee84b1cbbc8aec7038a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302020009832fefd8808455b7e71980a0af5b02f45319575287bf82e566e527960ddec57456ca3b125684450ca4bdd1e0885b98740615bed5fbc0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020240", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "7278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31f", + "mixHash": "6b77228c3e37f1cfcac744570927355dc8977a0d5a07fef5bafc8dac09be66f9", + "nonce": "c8ae382f1e04738e", + "number": "0x0a", + "parentHash": "7641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "82deda184becc41323eae64a6074f111e0cb35cd322f404f6b2a5adb5a34c6e5", + "timestamp": "0x55b7e71a", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a07641d38a440222358cbf9c1150263abcea34e053dc13d0e3c23d1f7d1e061154a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a082deda184becc41323eae64a6074f111e0cb35cd322f404f6b2a5adb5a34c6e5a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202400a832fefd8808455b7e71a80a06b77228c3e37f1cfcac744570927355dc8977a0d5a07fef5bafc8dac09be66f988c8ae382f1e04738ec0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020280", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "4301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7", + "mixHash": "4c4b6f6d157c9b21e6503d43f51bf5fa795057dff76cfb5c3101c562a58e3075", + "nonce": "4b662bc13bd8eb3e", + "number": "0x0b", + "parentHash": "7278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31f", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "f156db8814724a583ca59380610df31556ef5c0d1902232d5682265582b1ddcc", + "timestamp": "0x55b7e71c", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a07278bbf2c40207fa684588682eb21b80d67fbb394442dc847ef724fb9ad6e31fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f156db8814724a583ca59380610df31556ef5c0d1902232d5682265582b1ddcca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202800b832fefd8808455b7e71c80a04c4b6f6d157c9b21e6503d43f51bf5fa795057dff76cfb5c3101c562a58e3075884b662bc13bd8eb3ec0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0202c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "89b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2", + "mixHash": "3caa350b0c80933c44ff1fce1207771382b7ddceab1fe29ace45ef36c2d1a4f8", + "nonce": "1cd1a30ad25263a2", + "number": "0x0c", + "parentHash": "4301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "27a822b12eb549a47e54bfbfed10435ba5e7ac2b6570e3a55a946ab4459ef565", + "timestamp": "0x55b7e71d", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a04301eea57e9eaec99c810d76250878a2d2044a98f2c4d99692d33ed11ab000f7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a027a822b12eb549a47e54bfbfed10435ba5e7ac2b6570e3a55a946ab4459ef565a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830202c00c832fefd8808455b7e71d80a03caa350b0c80933c44ff1fce1207771382b7ddceab1fe29ace45ef36c2d1a4f8881cd1a30ad25263a2c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020300", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1", + "mixHash": "e0c86b7656ebeb87b9637ae65f0b844675b5e3ea60074ad9df783139fa6c7ab6", + "nonce": "4a715e52a6d3c641", + "number": "0x0d", + "parentHash": "89b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "b0d8ef7663253d7b802a040678d7c2dbec2ff212cbdf21fa1b4ab3b0096d7b29", + "timestamp": "0x55b7e71f", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a089b180d2b7872dc62732450a266f5e38ff7fb24d9ef2d922ae1e4802e11b6df2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b0d8ef7663253d7b802a040678d7c2dbec2ff212cbdf21fa1b4ab3b0096d7b29a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203000d832fefd8808455b7e71f80a0e0c86b7656ebeb87b9637ae65f0b844675b5e3ea60074ad9df783139fa6c7ab6884a715e52a6d3c641c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020340", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782b", + "mixHash": "e9002b6cd5c35f7dc0cf84264130db0f478581cc42d771d750b2498bd06205ad", + "nonce": "6df69ea0cdaaf1fc", + "number": "0x0e", + "parentHash": "f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "bcdf88f6700cebabc1092b5a663aae4e3c414e9cbc5c6ec862c310d810971145", + "timestamp": "0x55b7e721", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0f04fa681d5b06ab134e47ff6160a84ab7ffffaa3de9bbd19de4853db1ce0d4f1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0bcdf88f6700cebabc1092b5a663aae4e3c414e9cbc5c6ec862c310d810971145a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203400e832fefd8808455b7e72180a0e9002b6cd5c35f7dc0cf84264130db0f478581cc42d771d750b2498bd06205ad886df69ea0cdaaf1fcc0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020380", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238c", + "mixHash": "2738ce46b148eb08c0ba8a1276828282e82e2b5b4d0c26a6872129d939ddba6a", + "nonce": "8365e8d13580479f", + "number": "0x0f", + "parentHash": "e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782b", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "584e007c60cac97af14794fbf7ac16f2b7c2a2050da896711c97d4c162a32f66", + "timestamp": "0x55b7e722", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0e2762b21aac868b8104e50b0bbdf103cc01c02d416356f050cc98c064b8b782ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0584e007c60cac97af14794fbf7ac16f2b7c2a2050da896711c97d4c162a32f66a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203800f832fefd8808455b7e72280a02738ce46b148eb08c0ba8a1276828282e82e2b5b4d0c26a6872129d939ddba6a888365e8d13580479fc0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0203c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6", + "mixHash": "f009294be3192196796e9188ade1e8b9cd29aeac8fc1ba60898c8543997cfce1", + "nonce": "ddd31cbcf7c06cb0", + "number": "0x10", + "parentHash": "ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238c", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "40018894b5b4ed58f3645029eb67a7bbdbc17403ea03c2c9ad31da2fbfbda54a", + "timestamp": "0x55b7e724", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0ebed191766695e96925702f64521f5e2e00d58ce209e38ca417b479bb451238ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a040018894b5b4ed58f3645029eb67a7bbdbc17403ea03c2c9ad31da2fbfbda54aa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830203c010832fefd8808455b7e72480a0f009294be3192196796e9188ade1e8b9cd29aeac8fc1ba60898c8543997cfce188ddd31cbcf7c06cb0c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020400", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111", + "mixHash": "f9848a47ad2db2af447313cf466d9ad1e3bdec77f9e42059111f7413fba67271", + "nonce": "b86889cf6a60454e", + "number": "0x11", + "parentHash": "132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "8f5c35386979fce489741a660bbb307fbf031d37228accfcdf8b172c8751b5d7", + "timestamp": "0x55b7e726", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0132466cbb22aaadaa07f87f92576de6abb180c3e3a70361444168a20a059cdb6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a08f5c35386979fce489741a660bbb307fbf031d37228accfcdf8b172c8751b5d7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302040011832fefd8808455b7e72680a0f9848a47ad2db2af447313cf466d9ad1e3bdec77f9e42059111f7413fba6727188b86889cf6a60454ec0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020440", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "8d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0", + "mixHash": "2267ffcb65b55160f312f0766036f23b6bdf131d2e658ba09884664484f3bfc2", + "nonce": "1c36744758652660", + "number": "0x12", + "parentHash": "c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "558046f5f6d5c25f9dc3073feff56cfeb2d298cc305556507c438df83b9bb455", + "timestamp": "0x55b7e728", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0c7a7db96d87a3372ac435803f32041658e5cab4f343d0f14d3353fc632962111a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0558046f5f6d5c25f9dc3073feff56cfeb2d298cc305556507c438df83b9bb455a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302044012832fefd8808455b7e72880a02267ffcb65b55160f312f0766036f23b6bdf131d2e658ba09884664484f3bfc2881c36744758652660c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020480", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071", + "mixHash": "3881843b368cdef308cd5d79b6286383e98b32ae136a80ed7300d6a6895cc4dc", + "nonce": "d57c46d9d26f4748", + "number": "0x13", + "parentHash": "8d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "797f2c1a9d1412fba9a4c568345a153226cc515c29a975b07e14d87844c41077", + "timestamp": "0x55b7e729", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a08d204098e2ad9632c0966377a2b407166fd45db8a32969d8756b0f2441ccf1b0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0797f2c1a9d1412fba9a4c568345a153226cc515c29a975b07e14d87844c41077a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302048013832fefd8808455b7e72980a03881843b368cdef308cd5d79b6286383e98b32ae136a80ed7300d6a6895cc4dc88d57c46d9d26f4748c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0204c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087", + "mixHash": "7ae4ed651c7a6e495e6f9cd3ba595da0b31dee931ca6e8ae8de4cbabb1b3ec3d", + "nonce": "bbebf5b64f3d6f87", + "number": "0x14", + "parentHash": "cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "b8d26292009aac0ac6fb3f27dfbe37417a4986e7eac92b087fc483163231455f", + "timestamp": "0x55b7e72b", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0cdc71b5d68cd899a436c02ec9f0b330bd8e08ad97d844bf6dc2c4d22413cf071a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b8d26292009aac0ac6fb3f27dfbe37417a4986e7eac92b087fc483163231455fa056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830204c014832fefd8808455b7e72b80a07ae4ed651c7a6e495e6f9cd3ba595da0b31dee931ca6e8ae8de4cbabb1b3ec3d88bbebf5b64f3d6f87c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020500", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0", + "mixHash": "e1e3e7773546606ae5b16bc539b426ca19ce92c690d70a47b596d3a560e3f43a", + "nonce": "c663712d7a706c71", + "number": "0x15", + "parentHash": "e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "263ee0071da205fb88b8bfc6905ec4a382e004a16be57e328db7d5f6fe2ef094", + "timestamp": "0x55b7e72d", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0e41a4111822ebda2fe7274859b936e502ec358718406950c7d86325dfd211087a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0263ee0071da205fb88b8bfc6905ec4a382e004a16be57e328db7d5f6fe2ef094a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302050015832fefd8808455b7e72d80a0e1e3e7773546606ae5b16bc539b426ca19ce92c690d70a47b596d3a560e3f43a88c663712d7a706c71c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020540", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718", + "mixHash": "1f0a1b1a6dbd0fdf145cb9e0c9b4826562f0e75e9b96d5e42902a7a4222224f3", + "nonce": "1f8b9f0d6951ae05", + "number": "0x16", + "parentHash": "baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "cb18f938d431b97f2da9da22d4ee0e7f5683bcd40b334d10a3c8a2c500f44172", + "timestamp": "0x55b7e72e", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0baea77a3f112f38343d2213447f0f3c409bc159da44ab550f266f7b3846c78d0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb18f938d431b97f2da9da22d4ee0e7f5683bcd40b334d10a3c8a2c500f44172a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302054016832fefd8808455b7e72e80a01f0a1b1a6dbd0fdf145cb9e0c9b4826562f0e75e9b96d5e42902a7a4222224f3881f8b9f0d6951ae05c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020580", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "86c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0", + "mixHash": "aeb9d07869fa0ca0b5acc071b0bd71171ab80c840fc1e2e207d77ff35b3ba847", + "nonce": "5579a65ec808c4b0", + "number": "0x17", + "parentHash": "b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "e43f761aec2f7c501460707beeb9cfdc327167de802b66bfe4fc242c445198c4", + "timestamp": "0x55b7e72f", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a0b2634e0349df4e261245cce5d138ec361da14f8519dd6cdbe9d407ae2138f718a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e43f761aec2f7c501460707beeb9cfdc327167de802b66bfe4fc242c445198c4a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302058017832fefd8808455b7e72f80a0aeb9d07869fa0ca0b5acc071b0bd71171ab80c840fc1e2e207d77ff35b3ba847885579a65ec808c4b0c0c0", + "transactions": [], + "uncleHeaders": [] + }, { + "blockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x0205c0", + "extraData": "0x", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "09d85cfb5f6d1dd01166312c7065f5398b62cb3238eb8b253203b1a7c6103130", + "mixHash": "3e65f4e43fdefc8580e0cb4060fdf42499b2f5693ace121555c55230a0bd9542", + "nonce": "741ed4886c1bdc2d", + "number": "0x18", + "parentHash": "86c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "d03041a321e09270a4b492eb94e244a1b4517a76d6bfb59031aa7003eb287cf4", + "timestamp": "0x55b7e731", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp": "0xf901fcf901f7a086c993998a620791696827e69ae9706f559130ec35d27af56660eae1ac5d52f0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0d03041a321e09270a4b492eb94e244a1b4517a76d6bfb59031aa7003eb287cf4a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830205c018832fefd8808455b7e73180a03e65f4e43fdefc8580e0cb4060fdf42499b2f5693ace121555c55230a0bd954288741ed4886c1bdc2dc0c0", + "transactions": [], + "uncleHeaders": [] + }], + "genesisBlockHeader": { + "bloom": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty": "0x020000", + "extraData": "0x42", + "gasLimit": "0x2fefd8", + "gasUsed": "0x00", + "hash": "de68deceb6f907a67e0bbc2dc5cbe3114ddadf66a771abfc2b8c5619e86f1b81", + "mixHash": "73c1f97c35c8e8a9658b87b77c2059f8d0aba2a59325c3b17e8e8aa86ca13ba5", + "nonce": "6b8f68474b6896fb", + "number": "0x00", + "parentHash": "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7", + "timestamp": "0x54c98c81", + "transactionsTrie": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash": "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP": "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cafd881ab193703b83816c49ff6c2bf6ba6f464a1be560c42106128c8dbc35e7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a073c1f97c35c8e8a9658b87b77c2059f8d0aba2a59325c3b17e8e8aa86ca13ba5886b8f68474b6896fbc0c0", + "lastblockhash": "09d85cfb5f6d1dd01166312c7065f5398b62cb3238eb8b253203b1a7c6103130", + "postState": { + "8888f1f195afa192cfee860698584c030f4c9db1": { + "balance": "0x068155a43676e00000", + "code": "0x", + "nonce": "0x00", + "storage": {} + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x02540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } + }, + "pre": { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x02540be400", + "code": "0x", + "nonce": "0x00", + "storage": {} + } } -} \ No newline at end of file + } +} diff --git a/tests/files/BlockchainTests/bcInvalidHeaderTest.json b/tests/files/BlockchainTests/bcInvalidHeaderTest.json old mode 100755 new mode 100644 index 03635616467c..02db226f8644 --- a/tests/files/BlockchainTests/bcInvalidHeaderTest.json +++ b/tests/files/BlockchainTests/bcInvalidHeaderTest.json @@ -2,7 +2,7 @@ "DifferentExtraData1025" : { "blocks" : [ { - "rlp" : "0xf90665f905fca0f2df82c592edbf4ddacb42b96856641484e1dc7e569ad5a4faf7d80e283c95daa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0f7de2b8f7bde12fac856bd9aed6edabb998a2d215a684f18840d67ef81ae87c0a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b8455800847b904010101020304050607080910111213141516171819202122232410000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a033640cb9a11598e0fadce2c87f9f5f7d230a773f037ae74ea20a8b6a8e7c5ecc8872d6fe13f2b7e84af863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0d8ea4f45bc954612046851fb2500fa493e03fe16b69cc3f255983778c6943a4aa0236ec6196ca23ace9377bc8d21abb8d51adc96f82fc9397384249a72c43ee4dac0" + "rlp" : "0xf90665f905fca0440d4a979c681ec0a00aee46da06536fc0505d9e327cefb1914b815caa5736e9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16b6b904010101020304050607080910111213141516171819202122232410000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000100000000000000000002000000000000000000030000000000000000000400000000000000000005000000000000000000060000000000000000000700000000000000000008000000000000000000090000000000000000000100000000000000000001000000000000000000020000000000000000000300000000000000000004000000000000000000050000000000000000000600000000000000000007000000000000000000080000000000000000000900000000000000000001000000000000000000010000000000000000000200000000000000000003000000000000000000040000000000000000000500000000000000000006000000000000000000070000000000000000000800000000000000000009000000000000000000010000000000000000000a03faac4772687ad06f5ab15b5b447dd9846c49c0d94aa7de74016e8092bddb072883202011578ff6eb9f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -12,9 +12,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "f2df82c592edbf4ddacb42b96856641484e1dc7e569ad5a4faf7d80e283c95da", - "mixHash" : "3fa47be9efa6aec036f21237f44475a82f0f3e36fa841284e50dd2b785cd8eda", - "nonce" : "7658452a151e0c18", + "hash" : "440d4a979c681ec0a00aee46da06536fc0505d9e327cefb1914b815caa5736e9", + "mixHash" : "78acdf9b4ec043511bc153c172adf8befc0c9291cb05af932918000dea58336e", + "nonce" : "9bc45aa6aa1d8ebe", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -23,8 +23,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a03fa47be9efa6aec036f21237f44475a82f0f3e36fa841284e50dd2b785cd8eda887658452a151e0c18c0c0", - "lastblockhash" : "f2df82c592edbf4ddacb42b96856641484e1dc7e569ad5a4faf7d80e283c95da", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a078acdf9b4ec043511bc153c172adf8befc0c9291cb05af932918000dea58336e889bc45aa6aa1d8ebec0c0", + "lastblockhash" : "440d4a979c681ec0a00aee46da06536fc0505d9e327cefb1914b815caa5736e9", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -61,7 +61,7 @@ "DifficultyIsZero" : { "blocks" : [ { - "rlp" : "0xf9025ff901f6a04efc2b6b144b10f2b2135c366987d6cb555dd0fead6fd882473ab147322b1dd4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0e9182d73ae54a19133317d6d9e79cb553a808ea77a011e9c96dd0103ad694382a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008001832fefd882560b845580084980a05bc208495337a5f0cb8b9b46ea8f913b1524e9b7d2ef75bb6d9fa95bae112a498896b338dc74a778c6f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca00a14e437cc02b72178261f95942743b6973cb0a0710af72b4d3d0672d45ba5f9a05ea4e42817b98f870cea2a735aa9a777134d139284c4241dd262b79faccbde5ec0" + "rlp" : "0xf9025ff901f6a09debf1786a0c0f5d4d94b8c968ae670f7bb32dcccf8ccdb1bfbb4a2bf84c50e6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008001832fe3de82560b8455ba16bb80a00000000000000000000000000000000000000000000000000000000000000000880000000000000000f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -71,9 +71,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "4efc2b6b144b10f2b2135c366987d6cb555dd0fead6fd882473ab147322b1dd4", - "mixHash" : "bcbaf3f0c8118e37456bb28cd013e88d8dc2dfbacac80b56d367561f262229d8", - "nonce" : "5793175f47637584", + "hash" : "9debf1786a0c0f5d4d94b8c968ae670f7bb32dcccf8ccdb1bfbb4a2bf84c50e6", + "mixHash" : "adcc734c5110e9b7d30dc4cbc71d102d8db67d94b6a3abf44c2c090f4ad285b6", + "nonce" : "2571928c70c163c6", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -82,8 +82,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0bcbaf3f0c8118e37456bb28cd013e88d8dc2dfbacac80b56d367561f262229d8885793175f47637584c0c0", - "lastblockhash" : "4efc2b6b144b10f2b2135c366987d6cb555dd0fead6fd882473ab147322b1dd4", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0adcc734c5110e9b7d30dc4cbc71d102d8db67d94b6a3abf44c2c090f4ad285b6882571928c70c163c6c0c0", + "lastblockhash" : "9debf1786a0c0f5d4d94b8c968ae670f7bb32dcccf8ccdb1bfbb4a2bf84c50e6", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -120,7 +120,7 @@ "GasLimitIsZero" : { "blocks" : [ { - "rlp" : "0xf9025ff901f6a06117295771e58087b01113f0713e61b69cf3d3aca70ad65a6a68009c5b3027dda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0d64fc98b44a9b4f15353ad30793d2c129ee30f0d30c02de4cd24a6ccbd45c9afa05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000083020000018082560b845580084c80a0c3b39b50f343269b63e34c0ba6499f5c8857cc40b81314553d51ec9334cc62f088abbdbd9520846324f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0889eac0ecc0e3b7a77b82d16af0223437b94c5c777f480d322b790b62d77bbcda080ba813d53d5c867ebf7bf9389ff59c157372c6da24909b80e7660f7e5f0f725c0" + "rlp" : "0xf9025ff901f6a0cd57f848b4ea69b0d4a50fb4e8e2f7de285283ee23eb4ba3ccbb968cf82cebada01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000083020000018082560b8455ba16bf80a017e567f85cb6da76152d4009440abf5e3210fa21884987e427207c7c0a3af75488b82be0ac08a4847af863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -130,9 +130,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "6117295771e58087b01113f0713e61b69cf3d3aca70ad65a6a68009c5b3027dd", - "mixHash" : "564c77bd01aff933da09b1f5df3924af34f6c7321cdb2a7271bc18f0e820ec9d", - "nonce" : "c853e269579f97f4", + "hash" : "cd57f848b4ea69b0d4a50fb4e8e2f7de285283ee23eb4ba3ccbb968cf82cebad", + "mixHash" : "ad9c4d0e7f1f1a7f895c0502c3421426808810342231cc585ffb1a6161c70ec4", + "nonce" : "8acb2c0ccced1aa7", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -141,8 +141,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0564c77bd01aff933da09b1f5df3924af34f6c7321cdb2a7271bc18f0e820ec9d88c853e269579f97f4c0c0", - "lastblockhash" : "6117295771e58087b01113f0713e61b69cf3d3aca70ad65a6a68009c5b3027dd", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0ad9c4d0e7f1f1a7f895c0502c3421426808810342231cc585ffb1a6161c70ec4888acb2c0ccced1aa7c0c0", + "lastblockhash" : "cd57f848b4ea69b0d4a50fb4e8e2f7de285283ee23eb4ba3ccbb968cf82cebad", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -179,7 +179,7 @@ "log1_wrongBlockNumber" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a02dcf0ccb6e901540cf88deda20f5bd15aa949b44da371ab64f1880517dabf9e1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa066be40d9d0d16a4cc61763a7b1cc38eb239cc5e7c170b15af22cc4a0bb7f10ada05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000002832fefd882560b845580085080a05166bbfcc4cf9b9e345a11a0e7168f69bf1f43574a0f324dda36c6e3a4106b0c88ebd598f84d5177fff863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba03c651b4a8a56701d07a51225f454c6dc23a40e46c6d153434fb0fafc3e51982ca07f14fbb8b155fa6342ca60f6eb5a510a88b311e58bee5e76b7c69972b139af8cc0" + "rlp" : "0xf90262f901f9a0696d4ea34d3d2277d4c53f97fb1f8abeb5236649862d32f598b91e416c622357a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000002832fe3de82560b8455ba16c280a06a662b70e1cc52ea863516c0d8d96c85e2166d2bf3d1383d6ae3890b540e08ff88544ef79dbe912546f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -189,9 +189,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "2dcf0ccb6e901540cf88deda20f5bd15aa949b44da371ab64f1880517dabf9e1", - "mixHash" : "bda860a39cc929d3d39fb0c2e15725ad61ea2cbbb3efed8cc7b4bb8b401040cc", - "nonce" : "e21965d1308a6c9b", + "hash" : "696d4ea34d3d2277d4c53f97fb1f8abeb5236649862d32f598b91e416c622357", + "mixHash" : "ec9a575b6c584aa458ae490040300bb7169cba89e3aa67e2f94db5b13198eea5", + "nonce" : "f67e90bc34850b10", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -200,8 +200,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0bda860a39cc929d3d39fb0c2e15725ad61ea2cbbb3efed8cc7b4bb8b401040cc88e21965d1308a6c9bc0c0", - "lastblockhash" : "2dcf0ccb6e901540cf88deda20f5bd15aa949b44da371ab64f1880517dabf9e1", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0ec9a575b6c584aa458ae490040300bb7169cba89e3aa67e2f94db5b13198eea588f67e90bc34850b10c0c0", + "lastblockhash" : "696d4ea34d3d2277d4c53f97fb1f8abeb5236649862d32f598b91e416c622357", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -238,7 +238,7 @@ "log1_wrongBloom" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a0cc5bc79a736ec0ad1699dd73ab77112734de1ea792157e91ce9935b83bc21deaa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa07476267ff3457850f6d613f8b92a9ae957cfd67193fb264fc1f4267a63eace0ca05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580085480a02397352bac153f3ca8d05efd1a89739eceee838a3b4731a1d71e1c46a0b37cf488c692af15dcf799a5f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca08a2c157de4eac26537d0be0376b21fe1b0d698b94ce240f6b3e95ad72e97797fa0dca636858489f5ba346bb8672b4022cf10b29d3d33bcbc09fdcfd536a9a12050c0" + "rlp" : "0xf90262f901f9a03872ccb17632c8dbf0f8cc67a24f83409c1e65ba1decf8b669f18b179fb6d3e1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16c880a08eab54e52b33ecf39381ec0c701b2f95a59f755dfaf6ffcaa2e37d1dadb2f76288f0e87dab24926ca9f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -248,9 +248,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "cc5bc79a736ec0ad1699dd73ab77112734de1ea792157e91ce9935b83bc21dea", - "mixHash" : "1f1dddbe4d3a8b309dadf982b448a1cfe5e4b46348d22f66e31ae87144c56e59", - "nonce" : "8fda695e58f532d2", + "hash" : "3872ccb17632c8dbf0f8cc67a24f83409c1e65ba1decf8b669f18b179fb6d3e1", + "mixHash" : "7d35dfcae03d73d90602b5e8b5be301fce945ad2c1d6d3cb074adcf67679ea33", + "nonce" : "02f3632b96b923e9", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -259,8 +259,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a01f1dddbe4d3a8b309dadf982b448a1cfe5e4b46348d22f66e31ae87144c56e59888fda695e58f532d2c0c0", - "lastblockhash" : "cc5bc79a736ec0ad1699dd73ab77112734de1ea792157e91ce9935b83bc21dea", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a07d35dfcae03d73d90602b5e8b5be301fce945ad2c1d6d3cb074adcf67679ea338802f3632b96b923e9c0c0", + "lastblockhash" : "3872ccb17632c8dbf0f8cc67a24f83409c1e65ba1decf8b669f18b179fb6d3e1", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -297,7 +297,7 @@ "wrongCoinbase" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a00a70aa945840114b42bbb5e6836109dfb646121aa595f99b2dcd07a18e6b5e00a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa071f875b55a0693e1eaa279b770a61d95422685ffec4f75d3f03cfa43a85dc16ea05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580085680a022c207a0b02d52f36880b90ba5d86a36c52264eb5b396b59ff9574a51e21d5c988a0641e41838c1ce2f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba05586d876cea5773348816f58a1c8448120fa1aaea0230ffaf3b44380fe49cccaa0ef768dcab00378ee77791711b35f4470a632ef9e9a3c4b73fc2ec1094677c1b8c0" + "rlp" : "0xf90262f901f9a0e1a12b1d7f8d97cba8894187f93eb7a04e0372f50c9320c43b623421e1b40372a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347949888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16cc80a055cd7cfd5878cc450708f704f4bc04717f611d062b74edebe850a62f5c9a6a4b8898de985c345027e2f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -307,9 +307,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "0a70aa945840114b42bbb5e6836109dfb646121aa595f99b2dcd07a18e6b5e00", - "mixHash" : "9a0df7f98f85563c59f10cb9963770bebd6b14191db7a2270eb556b72bbbf3c2", - "nonce" : "883b6eb4ef09a367", + "hash" : "e1a12b1d7f8d97cba8894187f93eb7a04e0372f50c9320c43b623421e1b40372", + "mixHash" : "d403f1c0af34e2f146e1d045b07fcf93615b96a6e5d8b3f58a4026ba83e5d438", + "nonce" : "8fbd78e25debad8f", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -318,8 +318,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a09a0df7f98f85563c59f10cb9963770bebd6b14191db7a2270eb556b72bbbf3c288883b6eb4ef09a367c0c0", - "lastblockhash" : "0a70aa945840114b42bbb5e6836109dfb646121aa595f99b2dcd07a18e6b5e00", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0d403f1c0af34e2f146e1d045b07fcf93615b96a6e5d8b3f58a4026ba83e5d438888fbd78e25debad8fc0c0", + "lastblockhash" : "e1a12b1d7f8d97cba8894187f93eb7a04e0372f50c9320c43b623421e1b40372", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -356,7 +356,7 @@ "wrongDifficulty" : { "blocks" : [ { - "rlp" : "0xf90261f901f8a09607334834720d2868bbf844718a3251e1402d1c309306b67bd49d3f6f3a9b2ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa060d31ad940b25fa51ab3af787be6196620709c19dbc485ac05ab1b698da453cea05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000082271001832fefd882560b845580085980a0576a6142032d0a0b1baf0e485659834bead8fb3041f9b8d1c4140646af5b11428829dbc563ef0fa59df863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca004897eeb8b02f06c7c621be84da533459238edcfa2e11aa97f5f4f2bd0261065a0694b87b243818d6eea8e12efe8e5d4d78860e5c8b0a052ffa9e5e1af88badbd5c0" + "rlp" : "0xf90261f901f8a0e3e7e6758e87ee1a483fde54e5a5a2f31f35f33cf6375b4ae58908e66d806700a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b901000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000004000000000000000000000000000000000000000000000000000000082271001832fe3de82560b8455ba16cf80a09d38baaed89aa2f79d743d5242fbdf7abf6ea9abb8f791a3ae6874963a2fc933887738c6ec6a110040f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -366,9 +366,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "9607334834720d2868bbf844718a3251e1402d1c309306b67bd49d3f6f3a9b2e", - "mixHash" : "ab34ab179ac18c54cc4472bc3f82563ced95db14a0f86a85f5a229c842804b32", - "nonce" : "1556220ed8b865ef", + "hash" : "e3e7e6758e87ee1a483fde54e5a5a2f31f35f33cf6375b4ae58908e66d806700", + "mixHash" : "bf5f8db70cb57f838ff0989acf36d241fb4048c7dd028a5ff707c481db9ac564", + "nonce" : "4abddd659c93a8e1", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -377,8 +377,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0ab34ab179ac18c54cc4472bc3f82563ced95db14a0f86a85f5a229c842804b32881556220ed8b865efc0c0", - "lastblockhash" : "9607334834720d2868bbf844718a3251e1402d1c309306b67bd49d3f6f3a9b2e", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0bf5f8db70cb57f838ff0989acf36d241fb4048c7dd028a5ff707c481db9ac564884abddd659c93a8e1c0c0", + "lastblockhash" : "e3e7e6758e87ee1a483fde54e5a5a2f31f35f33cf6375b4ae58908e66d806700", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -415,7 +415,7 @@ "wrongGasLimit" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a0514147c3b1f629ef4cf60ff39ef538f4c9f5748f5ba8444e41d5d9164875d481a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa06d235ce90b45dbba00a431f064796ff58bd66c6ffaddca9c540d4601471164cca05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001830186a082560b845580085c80a087e809fc8d77aaadab95297a6a6933f634b7cbaf6a77d937ae64afc49d7537f888c0744f48abfdf9b2f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0403a338b092033ae519eace003746c2a5dbf56f076440fc9151266146ba23e40a0191583f085949b046424f4c2262ecb5df5e64ad7d921e517fd5b7eb59cbc248ac0" + "rlp" : "0xf90262f901f9a0642f145cc532ca38cc0b82f9eaa54c7eaabfccaa345103b7f969533207ed0239a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001830186a082560b8455ba16d280a0cdd1ae28284550924d66a61f8c97f004bf467f0ec25794ac25d33fa08bb7f225887b495ed3670e2ba5f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -425,9 +425,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "514147c3b1f629ef4cf60ff39ef538f4c9f5748f5ba8444e41d5d9164875d481", - "mixHash" : "466beebb6b34ee6e945b2b3c2714a0962274742600e6d6931873986dd7eef85a", - "nonce" : "c4baed9c9955f8ec", + "hash" : "642f145cc532ca38cc0b82f9eaa54c7eaabfccaa345103b7f969533207ed0239", + "mixHash" : "fbd8db99324134010f1a333a909091902722c7e09d671d0470c310491f984175", + "nonce" : "4329fc5921e3d391", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -436,8 +436,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0466beebb6b34ee6e945b2b3c2714a0962274742600e6d6931873986dd7eef85a88c4baed9c9955f8ecc0c0", - "lastblockhash" : "514147c3b1f629ef4cf60ff39ef538f4c9f5748f5ba8444e41d5d9164875d481", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0fbd8db99324134010f1a333a909091902722c7e09d671d0470c310491f984175884329fc5921e3d391c0c0", + "lastblockhash" : "642f145cc532ca38cc0b82f9eaa54c7eaabfccaa345103b7f969533207ed0239", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -474,7 +474,7 @@ "wrongGasUsed" : { "blocks" : [ { - "rlp" : "0xf90260f901f7a00d76833d6a375f38be538c51f36db8be646549cdfcc7091434cd9368088199f5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa000040f9d47e05d71e7f4fb27bbff396b795dca920b9047db30d682aa0f7ac702a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd880845580085f80a071e97bbc34f48a185827fe90b629eb66104828d420000c75ca8322edb09598a58875c311e6572dfd47f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0e1667ac0d091aa81081df965cdba35ee56ef8c5f16c477aa713241c200f6b959a053f4084793e3dd38ec7a2fca9e57139a5fa8b8545312587605ad82d3ce134981c0" + "rlp" : "0xf90260f901f7a093b57d3fb3a6603526db90b8b721455ffdfb897ebeb61f2ec3e8018e21f25b59a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de808455ba16d880a0b05f2da35205f175362667f198441135348ed811f03a0dc044077ee431ce116c883dd0fe42f9487603f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -484,9 +484,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "0d76833d6a375f38be538c51f36db8be646549cdfcc7091434cd9368088199f5", - "mixHash" : "123be1d12fec65d2b6e649e2e4b69bbd1e8a2981773810ee264155927ae4a341", - "nonce" : "25d37433409555df", + "hash" : "93b57d3fb3a6603526db90b8b721455ffdfb897ebeb61f2ec3e8018e21f25b59", + "mixHash" : "846e1edef05637687c60f1b608e536cd267aae5f188071ac0aa6ce8dc0f0f1cd", + "nonce" : "ef6ad02020125c01", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -495,8 +495,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0123be1d12fec65d2b6e649e2e4b69bbd1e8a2981773810ee264155927ae4a3418825d37433409555dfc0c0", - "lastblockhash" : "0d76833d6a375f38be538c51f36db8be646549cdfcc7091434cd9368088199f5", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0846e1edef05637687c60f1b608e536cd267aae5f188071ac0aa6ce8dc0f0f1cd88ef6ad02020125c01c0c0", + "lastblockhash" : "93b57d3fb3a6603526db90b8b721455ffdfb897ebeb61f2ec3e8018e21f25b59", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -533,7 +533,7 @@ "wrongMixHash" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a095ecab43d8e58e74aba8e41d872b0c737fdd38856ee9b73adba7264ead771b7aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa079bcae8f675be0b9c9f42d722b4d1fb1f67db13181831b77d87b09046ecf8dc7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580086580a0bad81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218802343185552f08baf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca00efb9f69c284ce3a9724e4fd02e832c8eb13725e0d82cb1995b7f283ab540668a06345a2c4c23355763de6f7d08176001d86f09fc414962c3aa838b7c3158eec61c0" + "rlp" : "0xf90262f901f9a0cf43c17e91148df2fa2e28eee7268e58456cec839ecd232a63b096ad0b3a3a5ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16dd80a0bad81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421880000000000000000f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -543,9 +543,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "95ecab43d8e58e74aba8e41d872b0c737fdd38856ee9b73adba7264ead771b7a", - "mixHash" : "c4a5a1e102f00ee6bbd14cb709393974cf92d582dd87b6107af51b278cf013c1", - "nonce" : "dae383a3bcb463f4", + "hash" : "cf43c17e91148df2fa2e28eee7268e58456cec839ecd232a63b096ad0b3a3a5e", + "mixHash" : "6269053d8763df925bf8fb3d33bf99138edd1901c0a3ab31d89e8c57fa6aa5b1", + "nonce" : "8c3fd62c2fa589fc", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -554,8 +554,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0c4a5a1e102f00ee6bbd14cb709393974cf92d582dd87b6107af51b278cf013c188dae383a3bcb463f4c0c0", - "lastblockhash" : "95ecab43d8e58e74aba8e41d872b0c737fdd38856ee9b73adba7264ead771b7a", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a06269053d8763df925bf8fb3d33bf99138edd1901c0a3ab31d89e8c57fa6aa5b1888c3fd62c2fa589fcc0c0", + "lastblockhash" : "cf43c17e91148df2fa2e28eee7268e58456cec839ecd232a63b096ad0b3a3a5e", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -592,7 +592,7 @@ "wrongNonce" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a05a2ab57bc5dc222f521de0d5cc1e49469019f989235f82c475253d5db6656fcca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0665f3db02fa03b0cc1c7fba2fb3f9d2ef4e309de73a966f88207e542f3bd67f0a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580086980a0f96def921818962e16267c228f3781edb5e5ad80ceeeea042834a4dd1b000421880102030405060708f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0e484433ad0626add65420d33579a590e34124b64e530082d759c415d1a23fa8aa032cc56cd8f144496dd351ea847a4108d7bfd191c68b86260efe23e9ed051d6a0c0" + "rlp" : "0xf90262f901f9a07c23787f2495c483f590912abd5aa27742530fea821142baa4a5e966fcf4d591a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16df80a00000000000000000000000000000000000000000000000000000000000000000880102030405060708f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -602,9 +602,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "5a2ab57bc5dc222f521de0d5cc1e49469019f989235f82c475253d5db6656fcc", - "mixHash" : "862066b5a444f2559cc5140db8bd69b8632afe4fdc83e526716209cb92a4810e", - "nonce" : "ce813f205b1b7559", + "hash" : "7c23787f2495c483f590912abd5aa27742530fea821142baa4a5e966fcf4d591", + "mixHash" : "7d6d24ea9b740a4048701a3aa9f7221b9699c8e1464403219ae91c64e4b1dbf6", + "nonce" : "c9b38f2e0e510c9e", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -613,8 +613,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0862066b5a444f2559cc5140db8bd69b8632afe4fdc83e526716209cb92a4810e88ce813f205b1b7559c0c0", - "lastblockhash" : "5a2ab57bc5dc222f521de0d5cc1e49469019f989235f82c475253d5db6656fcc", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a07d6d24ea9b740a4048701a3aa9f7221b9699c8e1464403219ae91c64e4b1dbf688c9b38f2e0e510c9ec0c0", + "lastblockhash" : "7c23787f2495c483f590912abd5aa27742530fea821142baa4a5e966fcf4d591", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -651,7 +651,7 @@ "wrongNumber" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a05e4fb1654ae8f9a32c458fb449f596b5d600a669e27f1f0c0fa067ff4598d54fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0425b074e9da4241a68732ae50fa3d3f2acb56b1ca1170f1965ef375e0ec62c54a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000080832fefd882560b845580086c80a04d1f8b361a5f4443143ac2ac27bb53964d4c48462d3fec19e2519f2d1dea0cd3884ea6731f2800324df863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0b7fa143e0d51b1e6d49f56a3325507242b7858c56e79287d91d04686304335e3a091290444af585b3d1a9017e73fb7a372c68c08f69b2c58285df979a82f5b1bd7c0" + "rlp" : "0xf90262f901f9a08a8e1f09431f67f08ce8161cf16bdf931abdef25fb21fd1fbe35581e5e374d6aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000080832fe3de82560b8455ba16e280a0786329cc57f4337f6bd3e93c2249db1fc3a1e0a2bfe83d77507909a2f4a282d788db020fc109d92a54f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -661,9 +661,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "5e4fb1654ae8f9a32c458fb449f596b5d600a669e27f1f0c0fa067ff4598d54f", - "mixHash" : "5bcefb1f3e7c5ccaf0d84bc63c907de380ad3c75600f7867c699010026134edc", - "nonce" : "9db829b4cb087473", + "hash" : "8a8e1f09431f67f08ce8161cf16bdf931abdef25fb21fd1fbe35581e5e374d6a", + "mixHash" : "40b110792cc49ce285e481d4f1c7ef34a4a9f6f1de22be955034e0aeb53e6c57", + "nonce" : "f087b08b6c1f959e", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -672,8 +672,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a05bcefb1f3e7c5ccaf0d84bc63c907de380ad3c75600f7867c699010026134edc889db829b4cb087473c0c0", - "lastblockhash" : "5e4fb1654ae8f9a32c458fb449f596b5d600a669e27f1f0c0fa067ff4598d54f", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a040b110792cc49ce285e481d4f1c7ef34a4a9f6f1de22be955034e0aeb53e6c5788f087b08b6c1f959ec0c0", + "lastblockhash" : "8a8e1f09431f67f08ce8161cf16bdf931abdef25fb21fd1fbe35581e5e374d6a", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -710,7 +710,7 @@ "wrongParentHash" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa09bcef24279d734ec0f5151448d92728101bbbb71b7c1ba3adce079bf655328a4a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580086f80a00866e96be83d0237c593eee154fecd6b25aa482efe22b3d88b5b9c3affbc878588ee154394248920a0f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba04f54d5080a085c2a62afd4b98a32d1c2a654c2cb9a08ad77184f3f2a176e6585a0dd9f28fb91941ebd2c010e8bc90a78b02ed25747998f20137651b4906c9c38acc0" + "rlp" : "0xf90262f901f9a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16e580a0bd9070a592a59069472e213f01bbdade128dad49d39d829a42f3e287a6ab6d2888a032d328ecae865df863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -720,9 +720,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "364fda1ab2268356c2b62c535175f3f34e9c13e7efe080c77c55c06d5b96160a", - "mixHash" : "18a9fbd004aab480e4524113be86ec637754e1686ae6ea3720feb79c19e09daf", - "nonce" : "a3c68869e5eeee96", + "hash" : "c1f0e909afc9458be0e80e6d3a53bcc65d6c7c2d2cb7e99a5a0ee211a07e2f36", + "mixHash" : "47146a0254e65ab6df1cd2f428e282c3e38889344d044553cec29d6aaeb4fda8", + "nonce" : "f3c5cae3b080dd7f", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -731,8 +731,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a018a9fbd004aab480e4524113be86ec637754e1686ae6ea3720feb79c19e09daf88a3c68869e5eeee96c0c0", - "lastblockhash" : "364fda1ab2268356c2b62c535175f3f34e9c13e7efe080c77c55c06d5b96160a", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a047146a0254e65ab6df1cd2f428e282c3e38889344d044553cec29d6aaeb4fda888f3c5cae3b080dd7fc0c0", + "lastblockhash" : "c1f0e909afc9458be0e80e6d3a53bcc65d6c7c2d2cb7e99a5a0ee211a07e2f36", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -769,7 +769,7 @@ "wrongParentHash2" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a06151889c8f14ab46e32ee0b1894bc276416385d068a1ade000d0dadef9b08b18a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa06000aacffdd01c3b296e1219bad0986d9a1d89b91047383e926f352c8644b64fa05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580087280a0d9bf2ce6631f9d17925e22bb359ad29286fc5c9bf6ebccf9814bc4adbfc92ddc88e27271ef80a5cff5f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca0ca1a5b328644f9e429d97671643acd200e1455cc37e93eb12ffcec1110101a8ba05a2b98a506cb70cfc8841ffa27cdfbb8d6c2804f79671e1fea15207b5d56c14bc0" + "rlp" : "0xf90262f901f9a06151889c8f14ab46e32ee0b1894bc276416385d068a1ade000d0dadef9b08b18a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16e980a0370b23757b9eb458446c61dfd41159b3d1a08671281d154eaa672215169d47fc88a03b9f26927cad00f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -779,9 +779,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "59c8cb6d65b73e8cb894a6f20542e2ff242a291b6267ed3db62a43247d240c41", - "mixHash" : "f0bf8c7437ccb8d5223a6c1ba259ec9f480c66a75aa19ffe1e69c5aa1504e3e2", - "nonce" : "e90cf83a53a88bf4", + "hash" : "423747387cd22d510c588253fc80af4bc517ebd3044d05474d3ad2a3011065c2", + "mixHash" : "67a528cf6e58ddf8e94f433a09a6f3c7c20f9ed0b2e72504fcf927bcd014d6b1", + "nonce" : "a060c9ea8115bb9f", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -790,8 +790,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0f0bf8c7437ccb8d5223a6c1ba259ec9f480c66a75aa19ffe1e69c5aa1504e3e288e90cf83a53a88bf4c0c0", - "lastblockhash" : "59c8cb6d65b73e8cb894a6f20542e2ff242a291b6267ed3db62a43247d240c41", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a067a528cf6e58ddf8e94f433a09a6f3c7c20f9ed0b2e72504fcf927bcd014d6b188a060c9ea8115bb9fc0c0", + "lastblockhash" : "423747387cd22d510c588253fc80af4bc517ebd3044d05474d3ad2a3011065c2", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -828,7 +828,7 @@ "wrongReceiptTrie" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a03ed497b84bb6be18a3caa02c3aeb9271b9367ebc227033e8ab780cf66c1d9062a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0d547257434c73520b2958de3368feecaadaec13fe2ed7c1841c51eb65ee85388a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580087580a04bafa084097d4dec7a1ce4b445e7569481bef76f1d173d82e02e0e009b13bdaf886f4b992147f4acccf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0be6a87a493597aeeb164fa15708b879023dd8f52411bd4bd3bc51d20f8b6a1fca059277aac4b6bfda0e63352237ff10a057dad8a431020d58f8d36fccf1da55168c0" + "rlp" : "0xf90262f901f9a0f8e6f19063f229bd6845c63bba1826834b94eaa24785e241eb611767979d59b8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16ec80a0ec5857b4203992ffcf33bb3f924ca92a2bda18b94f6842ba00396d96de8043dd885a6f6371dd028d51f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -838,9 +838,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "3ed497b84bb6be18a3caa02c3aeb9271b9367ebc227033e8ab780cf66c1d9062", - "mixHash" : "4c9b926ce017c4e50ba066437a89d814f95bed53f5326c5a610847b03222a078", - "nonce" : "668c2e238f9a096c", + "hash" : "f8e6f19063f229bd6845c63bba1826834b94eaa24785e241eb611767979d59b8", + "mixHash" : "c1c2632bf0669c0723e9084c33fa77da182e18a6705e3017b3c309de395739d7", + "nonce" : "4e9d39524608117a", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -849,8 +849,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a04c9b926ce017c4e50ba066437a89d814f95bed53f5326c5a610847b03222a07888668c2e238f9a096cc0c0", - "lastblockhash" : "3ed497b84bb6be18a3caa02c3aeb9271b9367ebc227033e8ab780cf66c1d9062", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0c1c2632bf0669c0723e9084c33fa77da182e18a6705e3017b3c309de395739d7884e9d39524608117ac0c0", + "lastblockhash" : "f8e6f19063f229bd6845c63bba1826834b94eaa24785e241eb611767979d59b8", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -887,7 +887,7 @@ "wrongStateRoot" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a0af0b430f986c9eaa44096cfbdaec6af6f7e85dc5321d9d41773caaa159faefc4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f99eb1626cfa6db435c0836235942d7ccaa935f1ae247d3f1c21e495685f903aa021103590c059df97971664e2655eefd20db46fd711bcecb691eadf3844d0b355a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580087980a0440d000bf14d0a72eb1e5fc528942ffaff7917946c0156eaf41d4b94c9d2fd998891b1ed3a9d8d9edef863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba02b554cbe7f00eef1a6e328e1982cbb0b73350c9c6cd7ecab52abf9c35837f3dda02417a809ed67dbac0cd5e2a1f7da3c132b3ab89ff770985aae5948036d29e27bc0" + "rlp" : "0xf90262f901f9a0de09b5652d059af8c01f596827ae060e6aedd8d5155642f94ec3e700a1031c00a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0f99eb1626cfa6db435c0836235942d7ccaa935f1ae247d3f1c21e495685f903aa0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba16f380a038184894b75645f283875e7613b9d8fe26b18bc135acad52e0c5b280367b1048884cd05359ee80e922f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -897,9 +897,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "af0b430f986c9eaa44096cfbdaec6af6f7e85dc5321d9d41773caaa159faefc4", - "mixHash" : "1895fae398d313e792b4bb6780f602b71d93f36db891b687fbb53189440fac90", - "nonce" : "ba308a91e503ff4a", + "hash" : "de09b5652d059af8c01f596827ae060e6aedd8d5155642f94ec3e700a1031c00", + "mixHash" : "f63248ea4ebccee0f146fb6ed766d1bdca67db1522ab1b9580c2130e8ef384f1", + "nonce" : "308bf9067641cb34", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -908,8 +908,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a01895fae398d313e792b4bb6780f602b71d93f36db891b687fbb53189440fac9088ba308a91e503ff4ac0c0", - "lastblockhash" : "af0b430f986c9eaa44096cfbdaec6af6f7e85dc5321d9d41773caaa159faefc4", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0f63248ea4ebccee0f146fb6ed766d1bdca67db1522ab1b9580c2130e8ef384f188308bf9067641cb34c0c0", + "lastblockhash" : "de09b5652d059af8c01f596827ae060e6aedd8d5155642f94ec3e700a1031c00", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -946,7 +946,7 @@ "wrongTimestamp" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a07e0c4dc229e760d17ca0f8a8375886881a964125cd4cc5518730ab2b97340122a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0d3cbc67fa7558e25e25631956d9a2eef49a3ae080707349e5ef6ce1ccca31ce1a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b8454c98c8080a026845b0a63445af7d7430f8851ff9bccfd6fd0e0e957ac8f89469378200a54aa883ef67d58d5523d1bf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0e6e9bea53437519889644cf8701e1addeb88994ec1c0f1dffdf9f44386a8eb68a062ecb4acf823edea6f690284f9d4863b07222d830e15e8ac95025ba624187b39c0" + "rlp" : "0xf90262f901f9a0b3f894e29025906db0b5619afc2a912e4454998c6c9b03d9f131e1b7621b9acea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8454c98c8080a02eb8ed82ea879cf3a0c97da87896f246dcdb908d8e715f03c30cef3e565351e788092b842ae710fa0bf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -956,9 +956,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "7e0c4dc229e760d17ca0f8a8375886881a964125cd4cc5518730ab2b97340122", - "mixHash" : "f5dd7227023cc3e42cd2dfeffbbaf182129677c36dd00a804fbf25b8e90b4c69", - "nonce" : "ea1a64cbda5dd7f9", + "hash" : "b3f894e29025906db0b5619afc2a912e4454998c6c9b03d9f131e1b7621b9ace", + "mixHash" : "98078e1dd48a45cbe4c3e0e514792b63567757c62c31469533af77258ac85250", + "nonce" : "25f903b333f1d549", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -967,8 +967,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0f5dd7227023cc3e42cd2dfeffbbaf182129677c36dd00a804fbf25b8e90b4c6988ea1a64cbda5dd7f9c0c0", - "lastblockhash" : "7e0c4dc229e760d17ca0f8a8375886881a964125cd4cc5518730ab2b97340122", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a098078e1dd48a45cbe4c3e0e514792b63567757c62c31469533af77258ac852508825f903b333f1d549c0c0", + "lastblockhash" : "b3f894e29025906db0b5619afc2a912e4454998c6c9b03d9f131e1b7621b9ace", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -1005,7 +1005,7 @@ "wrongTransactionsTrie" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a03b19ebcfaeb573a81c87c0f5645755b408ff7ac9d51716f707962ec4ffaeb0f9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa055e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580088180a04380d8e8ed2a1130f4adc14d7c60f77ad4eea8e0d2084da440a6ef8ff5e1141a8880d245443bdba17cf863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0d4d2fe5bb107a11bc741a4d6649e2ce616d3fc1d618bd3ae8eefd8ba588e6b3ca0c106cdd9670273cfefead66a425b2e84861e319efa36cc119bc26bdc04a25878c0" + "rlp" : "0xf90262f901f9a0ee31c25701e0df6cd6734423d3f1316923775992bc1c996026d2ddca258f5538a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a055e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba170180a08f718c110542703616a6dfe43939b600487307fb2ad4f561c7251a9e153eb1af88adbcfb985b4a26c0f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -1015,9 +1015,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "3b19ebcfaeb573a81c87c0f5645755b408ff7ac9d51716f707962ec4ffaeb0f9", - "mixHash" : "8db646afe41ccfb281ceee822d83bcb206fae519fc33928cbb2237c9ec54e5cc", - "nonce" : "a7da800b080801c2", + "hash" : "ee31c25701e0df6cd6734423d3f1316923775992bc1c996026d2ddca258f5538", + "mixHash" : "89197d75dd93b9b2697ccfb5e060c777512dc25b1bd0721de6938775452957cc", + "nonce" : "12623ec7f28dd452", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -1026,8 +1026,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a08db646afe41ccfb281ceee822d83bcb206fae519fc33928cbb2237c9ec54e5cc88a7da800b080801c2c0c0", - "lastblockhash" : "3b19ebcfaeb573a81c87c0f5645755b408ff7ac9d51716f707962ec4ffaeb0f9", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a089197d75dd93b9b2697ccfb5e060c777512dc25b1bd0721de6938775452957cc8812623ec7f28dd452c0c0", + "lastblockhash" : "ee31c25701e0df6cd6734423d3f1316923775992bc1c996026d2ddca258f5538", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", @@ -1064,7 +1064,7 @@ "wrongUncleHash" : { "blocks" : [ { - "rlp" : "0xf90262f901f9a0f86a84d48f2b23a69dd4d6089d19be8ef8a8e6f6c918e80628593eb9d6bffb16a00dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b3afc95220fb6e2df7fca71206d36e81b458ecfaff6c18b1c3414d30ad6b64efa0bdb4ee73274ec0a6b488ec9053da8e5776d0e8e74dd30defebbe0ab8b7915fd4a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fefd882560b845580088380a028219f11c12eb335867a29722e677158b49751866db3cda447658de07e9521e288ceede1e19a136236f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ca07882718cb4b1a3fd98c2335718e9e6e9cb8fa9d9f35e6b5e1c2e95c6b140747aa0d24721e675983de4e66e3cf7685801b186b3150545ec4e31de1c2437d8fe34b5c0" + "rlp" : "0xf90262f901f9a0f9da45c585379390c05c37ec616af2b35e7c5db88e83dad4f750577101fd7f31a00dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0201eacb02252d150f7f1a1dc2440f7fab2f468329953051836f81bae65e26914a0c590d5598e571c0acebad12175f241738803400f57cfb272e595999dbbfd08d7a05e7d8bf8bc817405813b0866e3bfa1ad048f982be5b81ab17b4db03266b24b26b90100000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000008302000001832fe3de82560b8455ba170680a05b3497fce967dfc51e757c7d42502f7b19599d4303a2f529b784172401d49db48846a17f7388ad6c21f863f861800a82c35094095e7baea6a6c7c4c2dfeb977efac326af552d87821388801ba0149dedccf5d524176aa17525074acf56f17cd7b472a9860c9d3ec4d87a6d0393a03cf6326d11c57d8b558c21c63fc848f8d0b76582060044e8e48d9d0d29054a36c0" } ], "genesisBlockHeader" : { @@ -1074,9 +1074,9 @@ "extraData" : "0x42", "gasLimit" : "0x2fefd8", "gasUsed" : "0x00", - "hash" : "f86a84d48f2b23a69dd4d6089d19be8ef8a8e6f6c918e80628593eb9d6bffb16", - "mixHash" : "5b997f0654da65676b318bbf1a9e942910b72027f8d675684a1e9a1ffe00344e", - "nonce" : "185358fefb4cca5d", + "hash" : "f9da45c585379390c05c37ec616af2b35e7c5db88e83dad4f750577101fd7f31", + "mixHash" : "ee5d608425df12733976b378d7f0e29942f118d177d4e3d05c5c3d5a8f9c58b2", + "nonce" : "e67b514e882c4562", "number" : "0x00", "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", @@ -1085,8 +1085,8 @@ "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, - "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a05b997f0654da65676b318bbf1a9e942910b72027f8d675684a1e9a1ffe00344e88185358fefb4cca5dc0c0", - "lastblockhash" : "f86a84d48f2b23a69dd4d6089d19be8ef8a8e6f6c918e80628593eb9d6bffb16", + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0b7829295a16db7cae65a071afbb272390f893dc1b0d3f098504148a7056f8056a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0ee5d608425df12733976b378d7f0e29942f118d177d4e3d05c5c3d5a8f9c58b288e67b514e882c4562c0c0", + "lastblockhash" : "f9da45c585379390c05c37ec616af2b35e7c5db88e83dad4f750577101fd7f31", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x64", diff --git a/tests/files/BlockchainTests/bcInvalidRLPTest.json b/tests/files/BlockchainTests/bcInvalidRLPTest.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcRPC_API_Test.json b/tests/files/BlockchainTests/bcRPC_API_Test.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcTotalDifficultyTest.json b/tests/files/BlockchainTests/bcTotalDifficultyTest.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcUncleHeaderValiditiy.json b/tests/files/BlockchainTests/bcUncleHeaderValiditiy.json old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcUncleTest.json b/tests/files/BlockchainTests/bcUncleTest.json index 0d0e83c0c168..05001ed1d967 100755 --- a/tests/files/BlockchainTests/bcUncleTest.json +++ b/tests/files/BlockchainTests/bcUncleTest.json @@ -4826,23 +4826,25 @@ "lastblockhash" : "eed1b4da708283370856fc76352d68f36d9766b7f366da372e2992ced9a1f663", "postState" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { - "balance" : "0x14", + + "balance" : "0x1e", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "8888f1f195afa192cfee860698584c030f4c9db1" : { - "balance" : "0x8ac7230489e8a410", + "balance" : "0xd255d112e1049618", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x09184e71fbdc", + + "balance" : "0x09184e71a9ca", "code" : "0x", - "nonce" : "0x02", + "nonce" : "0x03", "storage" : { } } diff --git a/tests/files/BlockchainTests/bcValidBlockTest.json b/tests/files/BlockchainTests/bcValidBlockTest.json old mode 100755 new mode 100644 index 66b3c25eb59b..8c29d465e5bc --- a/tests/files/BlockchainTests/bcValidBlockTest.json +++ b/tests/files/BlockchainTests/bcValidBlockTest.json @@ -375,6 +375,252 @@ } } }, + "SuicideCoinbase" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0xcdc7", + "hash" : "b1ff798f6f2a8c617f75b265e00ec67fab2f1e6076359d3332d99e8f69688850", + "mixHash" : "f9192b11328b47b77fc4765f3ec74ab433d63a01095ed77e3f82627766a491bc", + "nonce" : "97c55a07ab25b5fe", + "number" : "0x01", + "parentHash" : "363315d12ad724ec43a5400affb35e66e0b94bc40c6150b2870f76563a7703a7", + "receiptTrie" : "56e592ae6cf92b6c205e50d9cdbf1d3c5fe7f9fbc2bf219b93855107518e7e7f", + "stateRoot" : "7564aa479e81b3f9a05b0f99193fdd7367ccc0e74d140249d943ce0df904ba02", + "timestamp" : "0x55e5b3e8", + "transactionsTrie" : "fcfe9f2203bd98342867117fa3de299a09578371efd04fc9e76a46f7f1fda4bb", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf9032ef901f9a0363315d12ad724ec43a5400affb35e66e0b94bc40c6150b2870f76563a7703a7a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07564aa479e81b3f9a05b0f99193fdd7367ccc0e74d140249d943ce0df904ba02a0fcfe9f2203bd98342867117fa3de299a09578371efd04fc9e76a46f7f1fda4bba056e592ae6cf92b6c205e50d9cdbf1d3c5fe7f9fbc2bf219b93855107518e7e7fb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd882cdc78455e5b3e880a0f9192b11328b47b77fc4765f3ec74ab433d63a01095ed77e3f82627766a491bc8897c55a07ab25b5fef9012ef866800a8307a120948888f1f195afa192cfee860698584c030f4c9db18203e9840c55699c1ba091fc4c402ced19b984e953546d3fc786c46a79c9f0c7918b8f3343dc529ef0e5a0546d89230c90ca8bf7988a826430d4771ab3a67cc0f3cb8019d67ab10ec10524f861010a82c3509400000000000000000000000000000000000000008203e8801ba0b03ab16ed211bf447ac030216ab088f18367ee51303545d2957990e9d3a28f10a07f18dd055139f7ac5558997b80ccae799ab6fbad2326799db509a9d4e5a52d72f861020a82c3509400000000000000000000000000000000000000008203ea801ba00925abd1221d388622138f4bae46803313f297001e96fec22dc4268fca5b5a82a055cd8142bcec39f80b359aa089f6a70568d23a67048026703981fad9339ef5d4c0", + "transactions" : [ + { + "data" : "0x0c55699c", + "gasLimit" : "0x07a120", + "gasPrice" : "0x0a", + "nonce" : "0x00", + "r" : "0x91fc4c402ced19b984e953546d3fc786c46a79c9f0c7918b8f3343dc529ef0e5", + "s" : "0x546d89230c90ca8bf7988a826430d4771ab3a67cc0f3cb8019d67ab10ec10524", + "to" : "8888f1f195afa192cfee860698584c030f4c9db1", + "v" : "0x1b", + "value" : "0x03e9" + }, + { + "data" : "0x", + "gasLimit" : "0xc350", + "gasPrice" : "0x0a", + "nonce" : "0x01", + "r" : "0xb03ab16ed211bf447ac030216ab088f18367ee51303545d2957990e9d3a28f10", + "s" : "0x7f18dd055139f7ac5558997b80ccae799ab6fbad2326799db509a9d4e5a52d72", + "to" : "0000000000000000000000000000000000000000", + "v" : "0x1b", + "value" : "0x03e8" + }, + { + "data" : "0x", + "gasLimit" : "0xc350", + "gasPrice" : "0x0a", + "nonce" : "0x02", + "r" : "0x0925abd1221d388622138f4bae46803313f297001e96fec22dc4268fca5b5a82", + "s" : "0x55cd8142bcec39f80b359aa089f6a70568d23a67048026703981fad9339ef5d4", + "to" : "0000000000000000000000000000000000000000", + "v" : "0x1b", + "value" : "0x03ea" + } + ], + "uncleHeaders" : [ + ] + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "363315d12ad724ec43a5400affb35e66e0b94bc40c6150b2870f76563a7703a7", + "mixHash" : "d45a667aa8d50bd136d83b1b86bf38fe3cabfb78c47022e67bb6cfcb76529f7b", + "nonce" : "5350f90a8c5a106a", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "4941fba20142b10d43d0a893dfa4f5eedcbcb4b55c8554efd71e226624d9b37c", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a04941fba20142b10d43d0a893dfa4f5eedcbcb4b55c8554efd71e226624d9b37ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0d45a667aa8d50bd136d83b1b86bf38fe3cabfb78c47022e67bb6cfcb76529f7b885350f90a8c5a106ac0c0", + "lastblockhash" : "b1ff798f6f2a8c617f75b265e00ec67fab2f1e6076359d3332d99e8f69688850", + "postState" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x07d2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x4563918244fa68a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x025403d650", + "code" : "0x", + "nonce" : "0x03", + "storage" : { + } + } + }, + "pre" : { + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x03e8", + "code" : "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480630c55699c146037576035565b005b60406004506042565b005b3373ffffffffffffffffffffffffffffffffffffffff16ff5b56", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x02540be400", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "OOGStateCopyContainingDeletedContract" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x092a08", + "gasUsed" : "0x021ed0", + "hash" : "e6289f0826f8b8998cf5cb3747b95f8e3252a11e5eb930f139bf591b38b3f272", + "mixHash" : "d1fbf3b3e6c0189e04fa100c3d2e78889ffbec16553d50153b3f400fcd2b0589", + "nonce" : "9f2f26d826716c43", + "number" : "0x01", + "parentHash" : "d8eb76ceb37b640d4e0aae5ea85dca3989fe3b2616d2a7b333379c8a315e4fe1", + "receiptTrie" : "3e21fb330e6981a4657f97fc2ace223c75f17d83f0fa017586d5b872b48b4824", + "stateRoot" : "042cf0272a105f572ee8a5a3014aef7fff760fc3ce18c2aedac0cc55c152a4b9", + "timestamp" : "0x55edb8c0", + "transactionsTrie" : "5c3eb7e26c39308ede0b5a0b9b403fb89c3369deda106c32faf7d0def6f421d2", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf902eef901faa0d8eb76ceb37b640d4e0aae5ea85dca3989fe3b2616d2a7b333379c8a315e4fe1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0042cf0272a105f572ee8a5a3014aef7fff760fc3ce18c2aedac0cc55c152a4b9a05c3eb7e26c39308ede0b5a0b9b403fb89c3369deda106c32faf7d0def6f421d2a03e21fb330e6981a4657f97fc2ace223c75f17d83f0fa017586d5b872b48b4824b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200000183092a0883021ed08455edb8c080a0d1fbf3b3e6c0189e04fa100c3d2e78889ffbec16553d50153b3f400fcd2b0589889f2f26d826716c43f8eef864800a830493e09464306ec3f51a26dcf19f5da0c043040f54f4eca501840c5feb5d1ba00cf2cc4de3013273d0aae3cf36cdb6cf152573f7a5b99fe2c514a845bbb98a93a048f4aa20b37303bf4f2c0e7e5f6c178814f99ab4d3d98cf9382185f1ae256b7ff886010a830493e0942e0de3fc10a88911ff857126db1a5f0da6f251738203eaa4fc49c80e00000000000000000000000064306ec3f51a26dcf19f5da0c043040f54f4eca51ca0c9f11f1b4aedd9c1d99a6e2aea6f9ce90bdd6bb6063193715fdb43e77029346fa03440044e3aa54293e887f1751146bf915e73c39eae7da82b75a6d2c7a31d252bc0", + "transactions" : [ + { + "data" : "0x0c5feb5d", + "gasLimit" : "0x0493e0", + "gasPrice" : "0x0a", + "nonce" : "0x00", + "r" : "0x0cf2cc4de3013273d0aae3cf36cdb6cf152573f7a5b99fe2c514a845bbb98a93", + "s" : "0x48f4aa20b37303bf4f2c0e7e5f6c178814f99ab4d3d98cf9382185f1ae256b7f", + "to" : "64306ec3f51a26dcf19f5da0c043040f54f4eca5", + "v" : "0x1b", + "value" : "0x01" + }, + { + "data" : "0xfc49c80e00000000000000000000000064306ec3f51a26dcf19f5da0c043040f54f4eca5", + "gasLimit" : "0x0493e0", + "gasPrice" : "0x0a", + "nonce" : "0x01", + "r" : "0xc9f11f1b4aedd9c1d99a6e2aea6f9ce90bdd6bb6063193715fdb43e77029346f", + "s" : "0x3440044e3aa54293e887f1751146bf915e73c39eae7da82b75a6d2c7a31d252b", + "to" : "2e0de3fc10a88911ff857126db1a5f0da6f25173", + "v" : "0x1c", + "value" : "0x03ea" + } + ], + "uncleHeaders" : [ + ] + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x0927c0", + "gasUsed" : "0x00", + "hash" : "d8eb76ceb37b640d4e0aae5ea85dca3989fe3b2616d2a7b333379c8a315e4fe1", + "mixHash" : "c29e85e09cf8a71fbf0151f492eb89d135ed3515a6d7bf792978eab16c55e87c", + "nonce" : "02427e36fe1c0e09", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "2b9f478fe39744a8c17eb48ae7bf86f6a47031a823a632f9bd661b59978aeefd", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a02b9f478fe39744a8c17eb48ae7bf86f6a47031a823a632f9bd661b59978aeefda056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830927c0808454c98c8142a0c29e85e09cf8a71fbf0151f492eb89d135ed3515a6d7bf792978eab16c55e87c8802427e36fe1c0e09c0c0", + "lastblockhash" : "e6289f0826f8b8998cf5cb3747b95f8e3252a11e5eb930f139bf591b38b3f272", + "postState" : { + "2e0de3fc10a88911ff857126db1a5f0da6f25173" : { + "balance" : "0x03eb", + "code" : "0x60606040526000357c01000000000000000000000000000000000000000000000000000000009004806342e90c3314610044578063fc49c80e1461005157610042565b005b61004f600450610064565b005b6100626004803590602001506100a4565b005b6000600090505b600a8160ff1610156100a057602a600060005082600a81101561000257909001600050819055505b808060010191505061006b565b5b50565b3073ffffffffffffffffffffffffffffffffffffffff1661ea6060405180807f53746f7265282900000000000000000000000000000000000000000000000000815260200150600701905060405180910390207c0100000000000000000000000000000000000000000000000000000000809104027c0100000000000000000000000000000000000000000000000000000000900490604051827c010000000000000000000000000000000000000000000000000000000002815260040180905060006040518083038160008887f19350505050508073ffffffffffffffffffffffffffffffffffffffff166326c6a34c604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506020604051808303816000876161da5a03f115610002575050506040515160006000506009600a81101561000257909001600050819055505b5056", + "nonce" : "0x00", + "storage" : { + "0x09" : "0x26c6a34c00000000000000000000000000000000000000000000000000000000" + } + }, + "64306ec3f51a26dcf19f5da0c043040f54f4eca5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x4563918245093420", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x174861aff7", + "code" : "0x", + "nonce" : "0x02", + "storage" : { + } + } + }, + "pre" : { + "2e0de3fc10a88911ff857126db1a5f0da6f25173" : { + "balance" : "0x01", + "code" : "0x60606040526000357c01000000000000000000000000000000000000000000000000000000009004806342e90c3314610044578063fc49c80e1461005157610042565b005b61004f600450610064565b005b6100626004803590602001506100a4565b005b6000600090505b600a8160ff1610156100a057602a600060005082600a81101561000257909001600050819055505b808060010191505061006b565b5b50565b3073ffffffffffffffffffffffffffffffffffffffff1661ea6060405180807f53746f7265282900000000000000000000000000000000000000000000000000815260200150600701905060405180910390207c0100000000000000000000000000000000000000000000000000000000809104027c0100000000000000000000000000000000000000000000000000000000900490604051827c010000000000000000000000000000000000000000000000000000000002815260040180905060006040518083038160008887f19350505050508073ffffffffffffffffffffffffffffffffffffffff166326c6a34c604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506020604051808303816000876161da5a03f115610002575050506040515160006000506009600a81101561000257909001600050819055505b5056", + "nonce" : "0x00", + "storage" : { + } + }, + "64306ec3f51a26dcf19f5da0c043040f54f4eca5" : { + "balance" : "0x01", + "code" : "0x60606040526000357c0100000000000000000000000000000000000000000000000000000000900480630c5feb5d14604157806326c6a34c14604c57603f565b005b604a600450606b565b005b60556004506086565b6040518082815260200191505060405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff16ff5b565b600061053990506091565b9056", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x174876e800", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "SimpleTx" : { "blocks" : [ { @@ -1848,4 +2094,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/files/BlockchainTests/bcWalletTest.json b/tests/files/BlockchainTests/bcWalletTest.json old mode 100755 new mode 100644 diff --git a/tests/files/GenesisTests/basic_genesis_tests.json b/tests/files/GenesisTests/basic_genesis_tests.json old mode 100755 new mode 100644 diff --git a/tests/files/KeyStoreTests/basic_tests.json b/tests/files/KeyStoreTests/basic_tests.json old mode 100755 new mode 100644 diff --git a/tests/files/PoWTests/ethash_tests.json b/tests/files/PoWTests/ethash_tests.json old mode 100755 new mode 100644 diff --git a/tests/files/README.md b/tests/files/README.md old mode 100755 new mode 100644 diff --git a/tests/files/RLPTests/RandomRLPTests/example.json b/tests/files/RLPTests/RandomRLPTests/example.json old mode 100755 new mode 100644 diff --git a/tests/files/RLPTests/invalidRLPTest.json b/tests/files/RLPTests/invalidRLPTest.json old mode 100755 new mode 100644 diff --git a/tests/files/RLPTests/rlptest.json b/tests/files/RLPTests/rlptest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121803PYTHON.json b/tests/files/StateTests/RandomTests/st201503121803PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121806PYTHON.json b/tests/files/StateTests/RandomTests/st201503121806PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121848GO.json b/tests/files/StateTests/RandomTests/st201503121848GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121849GO.json b/tests/files/StateTests/RandomTests/st201503121849GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121850GO.json b/tests/files/StateTests/RandomTests/st201503121850GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121851GO.json b/tests/files/StateTests/RandomTests/st201503121851GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503121953GO.json b/tests/files/StateTests/RandomTests/st201503121953GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122023GO.json b/tests/files/StateTests/RandomTests/st201503122023GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122023PYTHON.json b/tests/files/StateTests/RandomTests/st201503122023PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122027GO.json b/tests/files/StateTests/RandomTests/st201503122027GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122054GO.json b/tests/files/StateTests/RandomTests/st201503122054GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122055GO.json b/tests/files/StateTests/RandomTests/st201503122055GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122115CPPJIT.json b/tests/files/StateTests/RandomTests/st201503122115CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122115GO.json b/tests/files/StateTests/RandomTests/st201503122115GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122123GO.json b/tests/files/StateTests/RandomTests/st201503122123GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122124GO.json b/tests/files/StateTests/RandomTests/st201503122124GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122128PYTHON.json b/tests/files/StateTests/RandomTests/st201503122128PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122140GO.json b/tests/files/StateTests/RandomTests/st201503122140GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122159GO.json b/tests/files/StateTests/RandomTests/st201503122159GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122204GO.json b/tests/files/StateTests/RandomTests/st201503122204GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122212GO.json b/tests/files/StateTests/RandomTests/st201503122212GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122231GO.json b/tests/files/StateTests/RandomTests/st201503122231GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122238GO.json b/tests/files/StateTests/RandomTests/st201503122238GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122252GO.json b/tests/files/StateTests/RandomTests/st201503122252GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122316GO.json b/tests/files/StateTests/RandomTests/st201503122316GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122324GO.json b/tests/files/StateTests/RandomTests/st201503122324GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503122358GO.json b/tests/files/StateTests/RandomTests/st201503122358GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130002GO.json b/tests/files/StateTests/RandomTests/st201503130002GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130005GO.json b/tests/files/StateTests/RandomTests/st201503130005GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130007GO.json b/tests/files/StateTests/RandomTests/st201503130007GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130010GO.json b/tests/files/StateTests/RandomTests/st201503130010GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130023PYTHON.json b/tests/files/StateTests/RandomTests/st201503130023PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130059GO.json b/tests/files/StateTests/RandomTests/st201503130059GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130101GO.json b/tests/files/StateTests/RandomTests/st201503130101GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130109GO.json b/tests/files/StateTests/RandomTests/st201503130109GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130117GO.json b/tests/files/StateTests/RandomTests/st201503130117GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130122GO.json b/tests/files/StateTests/RandomTests/st201503130122GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130156GO.json b/tests/files/StateTests/RandomTests/st201503130156GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130156PYTHON.json b/tests/files/StateTests/RandomTests/st201503130156PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130207GO.json b/tests/files/StateTests/RandomTests/st201503130207GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130219CPPJIT.json b/tests/files/StateTests/RandomTests/st201503130219CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130219GO.json b/tests/files/StateTests/RandomTests/st201503130219GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130243GO.json b/tests/files/StateTests/RandomTests/st201503130243GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130246GO.json b/tests/files/StateTests/RandomTests/st201503130246GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130321GO.json b/tests/files/StateTests/RandomTests/st201503130321GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130322GO.json b/tests/files/StateTests/RandomTests/st201503130322GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130332GO.json b/tests/files/StateTests/RandomTests/st201503130332GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130359GO.json b/tests/files/StateTests/RandomTests/st201503130359GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130405GO.json b/tests/files/StateTests/RandomTests/st201503130405GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130408GO.json b/tests/files/StateTests/RandomTests/st201503130408GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130411GO.json b/tests/files/StateTests/RandomTests/st201503130411GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130431GO.json b/tests/files/StateTests/RandomTests/st201503130431GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130437GO.json b/tests/files/StateTests/RandomTests/st201503130437GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130450GO.json b/tests/files/StateTests/RandomTests/st201503130450GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130512CPPJIT.json b/tests/files/StateTests/RandomTests/st201503130512CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130512GO.json b/tests/files/StateTests/RandomTests/st201503130512GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130615GO.json b/tests/files/StateTests/RandomTests/st201503130615GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130705GO.json b/tests/files/StateTests/RandomTests/st201503130705GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130733CPPJIT.json b/tests/files/StateTests/RandomTests/st201503130733CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130733GO.json b/tests/files/StateTests/RandomTests/st201503130733GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130747GO.json b/tests/files/StateTests/RandomTests/st201503130747GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130751GO.json b/tests/files/StateTests/RandomTests/st201503130751GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130752PYTHON.json b/tests/files/StateTests/RandomTests/st201503130752PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503130757PYTHON.json b/tests/files/StateTests/RandomTests/st201503130757PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503131658GO.json b/tests/files/StateTests/RandomTests/st201503131658GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503131739GO.json b/tests/files/StateTests/RandomTests/st201503131739GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503131755CPPJIT.json b/tests/files/StateTests/RandomTests/st201503131755CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503131755GO.json b/tests/files/StateTests/RandomTests/st201503131755GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503132001CPPJIT.json b/tests/files/StateTests/RandomTests/st201503132001CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503132127PYTHON.json b/tests/files/StateTests/RandomTests/st201503132127PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503132201CPPJIT.json b/tests/files/StateTests/RandomTests/st201503132201CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503132201GO.json b/tests/files/StateTests/RandomTests/st201503132201GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503132202PYTHON.json b/tests/files/StateTests/RandomTests/st201503132202PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503140002PYTHON.json b/tests/files/StateTests/RandomTests/st201503140002PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503140240PYTHON.json b/tests/files/StateTests/RandomTests/st201503140240PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503140522PYTHON.json b/tests/files/StateTests/RandomTests/st201503140522PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503140756PYTHON.json b/tests/files/StateTests/RandomTests/st201503140756PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503141144PYTHON.json b/tests/files/StateTests/RandomTests/st201503141144PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503141510PYTHON.json b/tests/files/StateTests/RandomTests/st201503141510PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503150427PYTHON.json b/tests/files/StateTests/RandomTests/st201503150427PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503150716PYTHON.json b/tests/files/StateTests/RandomTests/st201503150716PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503151450PYTHON.json b/tests/files/StateTests/RandomTests/st201503151450PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503151516PYTHON.json b/tests/files/StateTests/RandomTests/st201503151516PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503151753PYTHON.json b/tests/files/StateTests/RandomTests/st201503151753PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503152057PYTHON.json b/tests/files/StateTests/RandomTests/st201503152057PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503152241PYTHON.json b/tests/files/StateTests/RandomTests/st201503152241PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503160014PYTHON.json b/tests/files/StateTests/RandomTests/st201503160014PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503160733PYTHON.json b/tests/files/StateTests/RandomTests/st201503160733PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503170051PYTHON.json b/tests/files/StateTests/RandomTests/st201503170051PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503170433PYTHON.json b/tests/files/StateTests/RandomTests/st201503170433PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503170523PYTHON.json b/tests/files/StateTests/RandomTests/st201503170523PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503171108PYTHON.json b/tests/files/StateTests/RandomTests/st201503171108PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181223GO.json b/tests/files/StateTests/RandomTests/st201503181223GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181225GO.json b/tests/files/StateTests/RandomTests/st201503181225GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181226CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181226CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181227CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181227CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181227GO.json b/tests/files/StateTests/RandomTests/st201503181227GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181229GO.json b/tests/files/StateTests/RandomTests/st201503181229GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181230CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181230CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181230GO.json b/tests/files/StateTests/RandomTests/st201503181230GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181231GO.json b/tests/files/StateTests/RandomTests/st201503181231GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181232CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181232CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181232GO.json b/tests/files/StateTests/RandomTests/st201503181232GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181233GO.json b/tests/files/StateTests/RandomTests/st201503181233GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181234CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181234CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181234GO.json b/tests/files/StateTests/RandomTests/st201503181234GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181235CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181235CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181235GO.json b/tests/files/StateTests/RandomTests/st201503181235GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181236GO.json b/tests/files/StateTests/RandomTests/st201503181236GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181237GO.json b/tests/files/StateTests/RandomTests/st201503181237GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181239GO.json b/tests/files/StateTests/RandomTests/st201503181239GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181241CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181241CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181241GO.json b/tests/files/StateTests/RandomTests/st201503181241GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181243GO.json b/tests/files/StateTests/RandomTests/st201503181243GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181244GO.json b/tests/files/StateTests/RandomTests/st201503181244GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181245CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181245CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181245GO.json b/tests/files/StateTests/RandomTests/st201503181245GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181246CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181246CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181246GO.json b/tests/files/StateTests/RandomTests/st201503181246GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181247GO.json b/tests/files/StateTests/RandomTests/st201503181247GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181248GO.json b/tests/files/StateTests/RandomTests/st201503181248GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181249GO.json b/tests/files/StateTests/RandomTests/st201503181249GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181250CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181250CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181250GO.json b/tests/files/StateTests/RandomTests/st201503181250GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181251GO.json b/tests/files/StateTests/RandomTests/st201503181251GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181252CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181252CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181253GO.json b/tests/files/StateTests/RandomTests/st201503181253GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181255CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181255CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181255GO.json b/tests/files/StateTests/RandomTests/st201503181255GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181257GO.json b/tests/files/StateTests/RandomTests/st201503181257GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181258CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181258CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181258GO.json b/tests/files/StateTests/RandomTests/st201503181258GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181301CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181301CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181301GO.json b/tests/files/StateTests/RandomTests/st201503181301GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181303GO.json b/tests/files/StateTests/RandomTests/st201503181303GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181304GO.json b/tests/files/StateTests/RandomTests/st201503181304GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181305GO.json b/tests/files/StateTests/RandomTests/st201503181305GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181306GO.json b/tests/files/StateTests/RandomTests/st201503181306GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181307CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181307CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181307GO.json b/tests/files/StateTests/RandomTests/st201503181307GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181308GO.json b/tests/files/StateTests/RandomTests/st201503181308GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181309GO.json b/tests/files/StateTests/RandomTests/st201503181309GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181310GO.json b/tests/files/StateTests/RandomTests/st201503181310GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181311GO.json b/tests/files/StateTests/RandomTests/st201503181311GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181313GO.json b/tests/files/StateTests/RandomTests/st201503181313GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181314GO.json b/tests/files/StateTests/RandomTests/st201503181314GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181315CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181315CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181315GO.json b/tests/files/StateTests/RandomTests/st201503181315GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181316CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181316CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181316PYTHON.json b/tests/files/StateTests/RandomTests/st201503181316PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181317GO.json b/tests/files/StateTests/RandomTests/st201503181317GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181318CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181318CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181318GO.json b/tests/files/StateTests/RandomTests/st201503181318GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181319GO.json b/tests/files/StateTests/RandomTests/st201503181319GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181319PYTHON.json b/tests/files/StateTests/RandomTests/st201503181319PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181322GO.json b/tests/files/StateTests/RandomTests/st201503181322GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181323CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181323CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181323GO.json b/tests/files/StateTests/RandomTests/st201503181323GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181324GO.json b/tests/files/StateTests/RandomTests/st201503181324GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181325GO.json b/tests/files/StateTests/RandomTests/st201503181325GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181326CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181326CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181326GO.json b/tests/files/StateTests/RandomTests/st201503181326GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181327GO.json b/tests/files/StateTests/RandomTests/st201503181327GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181329CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181329CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181329GO.json b/tests/files/StateTests/RandomTests/st201503181329GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181330GO.json b/tests/files/StateTests/RandomTests/st201503181330GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181332GO.json b/tests/files/StateTests/RandomTests/st201503181332GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181333GO.json b/tests/files/StateTests/RandomTests/st201503181333GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181334GO.json b/tests/files/StateTests/RandomTests/st201503181334GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181336CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181336CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181337GO.json b/tests/files/StateTests/RandomTests/st201503181337GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181338GO.json b/tests/files/StateTests/RandomTests/st201503181338GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181339CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181339CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181339GO.json b/tests/files/StateTests/RandomTests/st201503181339GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181340GO.json b/tests/files/StateTests/RandomTests/st201503181340GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181341CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181341CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181342CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181342CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181342GO.json b/tests/files/StateTests/RandomTests/st201503181342GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181345GO.json b/tests/files/StateTests/RandomTests/st201503181345GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181346GO.json b/tests/files/StateTests/RandomTests/st201503181346GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181347CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181347CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181347GO.json b/tests/files/StateTests/RandomTests/st201503181347GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181347PYTHON.json b/tests/files/StateTests/RandomTests/st201503181347PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181350CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181350CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181352GO.json b/tests/files/StateTests/RandomTests/st201503181352GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181353GO.json b/tests/files/StateTests/RandomTests/st201503181353GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181354CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181354CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181354GO.json b/tests/files/StateTests/RandomTests/st201503181354GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181355GO.json b/tests/files/StateTests/RandomTests/st201503181355GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181356CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181356CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181357CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181357CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181358CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181358CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181358GO.json b/tests/files/StateTests/RandomTests/st201503181358GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181359GO.json b/tests/files/StateTests/RandomTests/st201503181359GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181402CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181402CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181403GO.json b/tests/files/StateTests/RandomTests/st201503181403GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181406CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181406CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181406GO.json b/tests/files/StateTests/RandomTests/st201503181406GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181410GO.json b/tests/files/StateTests/RandomTests/st201503181410GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181412CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181412CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181413GO.json b/tests/files/StateTests/RandomTests/st201503181413GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181415GO.json b/tests/files/StateTests/RandomTests/st201503181415GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181416GO.json b/tests/files/StateTests/RandomTests/st201503181416GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181417CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181417CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181417GO.json b/tests/files/StateTests/RandomTests/st201503181417GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181418CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181418CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181422GO.json b/tests/files/StateTests/RandomTests/st201503181422GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181423CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181423CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181424GO.json b/tests/files/StateTests/RandomTests/st201503181424GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181426CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181426CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181426GO.json b/tests/files/StateTests/RandomTests/st201503181426GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181428GO.json b/tests/files/StateTests/RandomTests/st201503181428GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181430CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181430CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181435GO.json b/tests/files/StateTests/RandomTests/st201503181435GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181436GO.json b/tests/files/StateTests/RandomTests/st201503181436GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181437CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181437CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181437GO.json b/tests/files/StateTests/RandomTests/st201503181437GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181438CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181438CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181438GO.json b/tests/files/StateTests/RandomTests/st201503181438GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181439CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181439CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181439GO.json b/tests/files/StateTests/RandomTests/st201503181439GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181439PYTHON.json b/tests/files/StateTests/RandomTests/st201503181439PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181440GO.json b/tests/files/StateTests/RandomTests/st201503181440GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181441GO.json b/tests/files/StateTests/RandomTests/st201503181441GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181442GO.json b/tests/files/StateTests/RandomTests/st201503181442GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181445CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181445CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181446GO.json b/tests/files/StateTests/RandomTests/st201503181446GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181447GO.json b/tests/files/StateTests/RandomTests/st201503181447GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181450GO.json b/tests/files/StateTests/RandomTests/st201503181450GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181451CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181451CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181453GO.json b/tests/files/StateTests/RandomTests/st201503181453GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181455GO.json b/tests/files/StateTests/RandomTests/st201503181455GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181456CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181456CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181457GO.json b/tests/files/StateTests/RandomTests/st201503181457GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181458GO.json b/tests/files/StateTests/RandomTests/st201503181458GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181459GO.json b/tests/files/StateTests/RandomTests/st201503181459GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181500GO.json b/tests/files/StateTests/RandomTests/st201503181500GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181501GO.json b/tests/files/StateTests/RandomTests/st201503181501GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181503GO.json b/tests/files/StateTests/RandomTests/st201503181503GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181504GO.json b/tests/files/StateTests/RandomTests/st201503181504GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181505GO.json b/tests/files/StateTests/RandomTests/st201503181505GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181506CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181506CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181507GO.json b/tests/files/StateTests/RandomTests/st201503181507GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181509CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181509CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181509GO.json b/tests/files/StateTests/RandomTests/st201503181509GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181510GO.json b/tests/files/StateTests/RandomTests/st201503181510GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181511GO.json b/tests/files/StateTests/RandomTests/st201503181511GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181512GO.json b/tests/files/StateTests/RandomTests/st201503181512GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181513CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181513CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181513GO.json b/tests/files/StateTests/RandomTests/st201503181513GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181514CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181514CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181514GO.json b/tests/files/StateTests/RandomTests/st201503181514GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181517CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181517CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181517GO.json b/tests/files/StateTests/RandomTests/st201503181517GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181519CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181519CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181519GO.json b/tests/files/StateTests/RandomTests/st201503181519GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181520CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181520CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181520GO.json b/tests/files/StateTests/RandomTests/st201503181520GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181521GO.json b/tests/files/StateTests/RandomTests/st201503181521GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181522GO.json b/tests/files/StateTests/RandomTests/st201503181522GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181524CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181524CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181524GO.json b/tests/files/StateTests/RandomTests/st201503181524GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181526GO.json b/tests/files/StateTests/RandomTests/st201503181526GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181527GO.json b/tests/files/StateTests/RandomTests/st201503181527GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181528CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181528CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181528GO.json b/tests/files/StateTests/RandomTests/st201503181528GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181528PYTHON.json b/tests/files/StateTests/RandomTests/st201503181528PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181529GO.json b/tests/files/StateTests/RandomTests/st201503181529GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181531CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181531CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181533GO.json b/tests/files/StateTests/RandomTests/st201503181533GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181534CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181534CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181534GO.json b/tests/files/StateTests/RandomTests/st201503181534GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181536CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181536CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181536GO.json b/tests/files/StateTests/RandomTests/st201503181536GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181537GO.json b/tests/files/StateTests/RandomTests/st201503181537GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181538GO.json b/tests/files/StateTests/RandomTests/st201503181538GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181539GO.json b/tests/files/StateTests/RandomTests/st201503181539GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181540CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181540CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181540PYTHON.json b/tests/files/StateTests/RandomTests/st201503181540PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181543GO.json b/tests/files/StateTests/RandomTests/st201503181543GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181544CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181544CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181544GO.json b/tests/files/StateTests/RandomTests/st201503181544GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181547GO.json b/tests/files/StateTests/RandomTests/st201503181547GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181548CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181548CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181548GO.json b/tests/files/StateTests/RandomTests/st201503181548GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181551GO.json b/tests/files/StateTests/RandomTests/st201503181551GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181552CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181552CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181553GO.json b/tests/files/StateTests/RandomTests/st201503181553GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181555CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181555CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181555GO.json b/tests/files/StateTests/RandomTests/st201503181555GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181557GO.json b/tests/files/StateTests/RandomTests/st201503181557GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181559GO.json b/tests/files/StateTests/RandomTests/st201503181559GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181601CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181601CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181601GO.json b/tests/files/StateTests/RandomTests/st201503181601GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181602GO.json b/tests/files/StateTests/RandomTests/st201503181602GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181603GO.json b/tests/files/StateTests/RandomTests/st201503181603GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181604GO.json b/tests/files/StateTests/RandomTests/st201503181604GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181605GO.json b/tests/files/StateTests/RandomTests/st201503181605GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181606GO.json b/tests/files/StateTests/RandomTests/st201503181606GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181607GO.json b/tests/files/StateTests/RandomTests/st201503181607GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181608CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181608CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181608GO.json b/tests/files/StateTests/RandomTests/st201503181608GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181609GO.json b/tests/files/StateTests/RandomTests/st201503181609GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181610CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181610CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181610GO.json b/tests/files/StateTests/RandomTests/st201503181610GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181611CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181611CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181611GO.json b/tests/files/StateTests/RandomTests/st201503181611GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181612GO.json b/tests/files/StateTests/RandomTests/st201503181612GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181614CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181614CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181614GO.json b/tests/files/StateTests/RandomTests/st201503181614GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181616CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181616CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181616GO.json b/tests/files/StateTests/RandomTests/st201503181616GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181617GO.json b/tests/files/StateTests/RandomTests/st201503181617GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181618GO.json b/tests/files/StateTests/RandomTests/st201503181618GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181619GO.json b/tests/files/StateTests/RandomTests/st201503181619GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181620CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181620CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181620GO.json b/tests/files/StateTests/RandomTests/st201503181620GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181621GO.json b/tests/files/StateTests/RandomTests/st201503181621GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181625GO.json b/tests/files/StateTests/RandomTests/st201503181625GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181626CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181626CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181626GO.json b/tests/files/StateTests/RandomTests/st201503181626GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181627GO.json b/tests/files/StateTests/RandomTests/st201503181627GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181628GO.json b/tests/files/StateTests/RandomTests/st201503181628GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181629GO.json b/tests/files/StateTests/RandomTests/st201503181629GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181630CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181630CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181630GO.json b/tests/files/StateTests/RandomTests/st201503181630GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181630PYTHON.json b/tests/files/StateTests/RandomTests/st201503181630PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181632GO.json b/tests/files/StateTests/RandomTests/st201503181632GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181634CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181634CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181635GO.json b/tests/files/StateTests/RandomTests/st201503181635GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181636GO.json b/tests/files/StateTests/RandomTests/st201503181636GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181638GO.json b/tests/files/StateTests/RandomTests/st201503181638GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181639CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181639CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181641GO.json b/tests/files/StateTests/RandomTests/st201503181641GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181645GO.json b/tests/files/StateTests/RandomTests/st201503181645GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181646GO.json b/tests/files/StateTests/RandomTests/st201503181646GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181647CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181647CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181649CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181649CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181650GO.json b/tests/files/StateTests/RandomTests/st201503181650GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181652CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181652CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181653GO.json b/tests/files/StateTests/RandomTests/st201503181653GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181654GO.json b/tests/files/StateTests/RandomTests/st201503181654GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181655CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181655CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181655GO.json b/tests/files/StateTests/RandomTests/st201503181655GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181656CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181656CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181656GO.json b/tests/files/StateTests/RandomTests/st201503181656GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181657GO.json b/tests/files/StateTests/RandomTests/st201503181657GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181658GO.json b/tests/files/StateTests/RandomTests/st201503181658GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181700GO.json b/tests/files/StateTests/RandomTests/st201503181700GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181702GO.json b/tests/files/StateTests/RandomTests/st201503181702GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181703CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181703CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181703GO.json b/tests/files/StateTests/RandomTests/st201503181703GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181704GO.json b/tests/files/StateTests/RandomTests/st201503181704GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181706GO.json b/tests/files/StateTests/RandomTests/st201503181706GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181709GO.json b/tests/files/StateTests/RandomTests/st201503181709GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181711CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181711CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181711GO.json b/tests/files/StateTests/RandomTests/st201503181711GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181713CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181713CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181713GO.json b/tests/files/StateTests/RandomTests/st201503181713GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181714GO.json b/tests/files/StateTests/RandomTests/st201503181714GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181715CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181715CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181715GO.json b/tests/files/StateTests/RandomTests/st201503181715GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181716GO.json b/tests/files/StateTests/RandomTests/st201503181716GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181717GO.json b/tests/files/StateTests/RandomTests/st201503181717GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181720CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181720CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181722GO.json b/tests/files/StateTests/RandomTests/st201503181722GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181723CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181723CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181723GO.json b/tests/files/StateTests/RandomTests/st201503181723GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181724CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181724CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181724GO.json b/tests/files/StateTests/RandomTests/st201503181724GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181725GO.json b/tests/files/StateTests/RandomTests/st201503181725GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181728GO.json b/tests/files/StateTests/RandomTests/st201503181728GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181729GO.json b/tests/files/StateTests/RandomTests/st201503181729GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181730GO.json b/tests/files/StateTests/RandomTests/st201503181730GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181731CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181731CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181732GO.json b/tests/files/StateTests/RandomTests/st201503181732GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181734CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181734CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181734GO.json b/tests/files/StateTests/RandomTests/st201503181734GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181735GO.json b/tests/files/StateTests/RandomTests/st201503181735GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181737CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181737CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181737GO.json b/tests/files/StateTests/RandomTests/st201503181737GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181738CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181738CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181738GO.json b/tests/files/StateTests/RandomTests/st201503181738GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181739GO.json b/tests/files/StateTests/RandomTests/st201503181739GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181740CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181740CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181740GO.json b/tests/files/StateTests/RandomTests/st201503181740GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181742CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181742CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181743GO.json b/tests/files/StateTests/RandomTests/st201503181743GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181744GO.json b/tests/files/StateTests/RandomTests/st201503181744GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181745CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181745CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181746GO.json b/tests/files/StateTests/RandomTests/st201503181746GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181747GO.json b/tests/files/StateTests/RandomTests/st201503181747GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181748GO.json b/tests/files/StateTests/RandomTests/st201503181748GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181749GO.json b/tests/files/StateTests/RandomTests/st201503181749GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181750CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181750CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181750GO.json b/tests/files/StateTests/RandomTests/st201503181750GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181752GO.json b/tests/files/StateTests/RandomTests/st201503181752GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181753CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181753CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181754CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181754CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181754GO.json b/tests/files/StateTests/RandomTests/st201503181754GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181755CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181755CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181755GO.json b/tests/files/StateTests/RandomTests/st201503181755GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181756GO.json b/tests/files/StateTests/RandomTests/st201503181756GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181757CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181757CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181757GO.json b/tests/files/StateTests/RandomTests/st201503181757GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181759GO.json b/tests/files/StateTests/RandomTests/st201503181759GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181800GO.json b/tests/files/StateTests/RandomTests/st201503181800GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181801GO.json b/tests/files/StateTests/RandomTests/st201503181801GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181802GO.json b/tests/files/StateTests/RandomTests/st201503181802GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181803CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181803CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181803GO.json b/tests/files/StateTests/RandomTests/st201503181803GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181804GO.json b/tests/files/StateTests/RandomTests/st201503181804GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181806GO.json b/tests/files/StateTests/RandomTests/st201503181806GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181808GO.json b/tests/files/StateTests/RandomTests/st201503181808GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181809CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181809CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181812CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181812CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181812GO.json b/tests/files/StateTests/RandomTests/st201503181812GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181814CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181814CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181815GO.json b/tests/files/StateTests/RandomTests/st201503181815GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181816CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181816CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181817CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181817CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181819GO.json b/tests/files/StateTests/RandomTests/st201503181819GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181821GO.json b/tests/files/StateTests/RandomTests/st201503181821GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181822GO.json b/tests/files/StateTests/RandomTests/st201503181822GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181823GO.json b/tests/files/StateTests/RandomTests/st201503181823GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181824GO.json b/tests/files/StateTests/RandomTests/st201503181824GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181825GO.json b/tests/files/StateTests/RandomTests/st201503181825GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181829GO.json b/tests/files/StateTests/RandomTests/st201503181829GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181830CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181830CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181833GO.json b/tests/files/StateTests/RandomTests/st201503181833GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181834CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181834CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181834GO.json b/tests/files/StateTests/RandomTests/st201503181834GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181837GO.json b/tests/files/StateTests/RandomTests/st201503181837GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181840GO.json b/tests/files/StateTests/RandomTests/st201503181840GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181842GO.json b/tests/files/StateTests/RandomTests/st201503181842GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181843GO.json b/tests/files/StateTests/RandomTests/st201503181843GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181844GO.json b/tests/files/StateTests/RandomTests/st201503181844GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181845GO.json b/tests/files/StateTests/RandomTests/st201503181845GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181846GO.json b/tests/files/StateTests/RandomTests/st201503181846GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181847GO.json b/tests/files/StateTests/RandomTests/st201503181847GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181848GO.json b/tests/files/StateTests/RandomTests/st201503181848GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181849GO.json b/tests/files/StateTests/RandomTests/st201503181849GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181850GO.json b/tests/files/StateTests/RandomTests/st201503181850GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181851CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181851CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181851GO.json b/tests/files/StateTests/RandomTests/st201503181851GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181852CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181852CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181854GO.json b/tests/files/StateTests/RandomTests/st201503181854GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181855CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181855CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181857PYTHON.json b/tests/files/StateTests/RandomTests/st201503181857PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181859GO.json b/tests/files/StateTests/RandomTests/st201503181859GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181900GO.json b/tests/files/StateTests/RandomTests/st201503181900GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181903GO.json b/tests/files/StateTests/RandomTests/st201503181903GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181904GO.json b/tests/files/StateTests/RandomTests/st201503181904GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181906GO.json b/tests/files/StateTests/RandomTests/st201503181906GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181907GO.json b/tests/files/StateTests/RandomTests/st201503181907GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181910GO.json b/tests/files/StateTests/RandomTests/st201503181910GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181915GO.json b/tests/files/StateTests/RandomTests/st201503181915GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181919CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181919CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181919PYTHON.json b/tests/files/StateTests/RandomTests/st201503181919PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181920GO.json b/tests/files/StateTests/RandomTests/st201503181920GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181922GO.json b/tests/files/StateTests/RandomTests/st201503181922GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181926GO.json b/tests/files/StateTests/RandomTests/st201503181926GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181929GO.json b/tests/files/StateTests/RandomTests/st201503181929GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181931CPPJIT.json b/tests/files/StateTests/RandomTests/st201503181931CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181931GO.json b/tests/files/StateTests/RandomTests/st201503181931GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503181931PYTHON.json b/tests/files/StateTests/RandomTests/st201503181931PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503191646GO.json b/tests/files/StateTests/RandomTests/st201503191646GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503200837JS.json b/tests/files/StateTests/RandomTests/st201503200837JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503200838JS.json b/tests/files/StateTests/RandomTests/st201503200838JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503200841JS.json b/tests/files/StateTests/RandomTests/st201503200841JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503200848JS.json b/tests/files/StateTests/RandomTests/st201503200848JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503240609JS.json b/tests/files/StateTests/RandomTests/st201503240609JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302200JS.json b/tests/files/StateTests/RandomTests/st201503302200JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302202JS.json b/tests/files/StateTests/RandomTests/st201503302202JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302206JS.json b/tests/files/StateTests/RandomTests/st201503302206JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302208JS.json b/tests/files/StateTests/RandomTests/st201503302208JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302210JS.json b/tests/files/StateTests/RandomTests/st201503302210JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201503302211JS.json b/tests/files/StateTests/RandomTests/st201503302211JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504011535GO.json b/tests/files/StateTests/RandomTests/st201504011535GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504011536GO.json b/tests/files/StateTests/RandomTests/st201504011536GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504011547GO.json b/tests/files/StateTests/RandomTests/st201504011547GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504011916JS.json b/tests/files/StateTests/RandomTests/st201504011916JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504012130JS.json b/tests/files/StateTests/RandomTests/st201504012130JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504012259JS.json b/tests/files/StateTests/RandomTests/st201504012259JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504012359JS.json b/tests/files/StateTests/RandomTests/st201504012359JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020305JS.json b/tests/files/StateTests/RandomTests/st201504020305JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020400JS.json b/tests/files/StateTests/RandomTests/st201504020400JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020428JS.json b/tests/files/StateTests/RandomTests/st201504020428JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020431JS.json b/tests/files/StateTests/RandomTests/st201504020431JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020444JS.json b/tests/files/StateTests/RandomTests/st201504020444JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020538JS.json b/tests/files/StateTests/RandomTests/st201504020538JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020639JS.json b/tests/files/StateTests/RandomTests/st201504020639JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020836JS.json b/tests/files/StateTests/RandomTests/st201504020836JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504020910JS.json b/tests/files/StateTests/RandomTests/st201504020910JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021057JS.json b/tests/files/StateTests/RandomTests/st201504021057JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021104JS.json b/tests/files/StateTests/RandomTests/st201504021104JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021237CPPJIT.json b/tests/files/StateTests/RandomTests/st201504021237CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021237GO.json b/tests/files/StateTests/RandomTests/st201504021237GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021237JS.json b/tests/files/StateTests/RandomTests/st201504021237JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021237PYTHON.json b/tests/files/StateTests/RandomTests/st201504021237PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504021949JS.json b/tests/files/StateTests/RandomTests/st201504021949JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504022003CPPJIT.json b/tests/files/StateTests/RandomTests/st201504022003CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504022124JS.json b/tests/files/StateTests/RandomTests/st201504022124JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504030138JS.json b/tests/files/StateTests/RandomTests/st201504030138JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504030646JS.json b/tests/files/StateTests/RandomTests/st201504030646JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504030709JS.json b/tests/files/StateTests/RandomTests/st201504030709JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504031133JS.json b/tests/files/StateTests/RandomTests/st201504031133JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504031446JS.json b/tests/files/StateTests/RandomTests/st201504031446JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504031841JS.json b/tests/files/StateTests/RandomTests/st201504031841JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504041605JS.json b/tests/files/StateTests/RandomTests/st201504041605JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504042052JS.json b/tests/files/StateTests/RandomTests/st201504042052JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504042226CPPJIT.json b/tests/files/StateTests/RandomTests/st201504042226CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504042355CPPJIT.json b/tests/files/StateTests/RandomTests/st201504042355CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504050059JS.json b/tests/files/StateTests/RandomTests/st201504050059JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504050733JS.json b/tests/files/StateTests/RandomTests/st201504050733JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504051540JS.json b/tests/files/StateTests/RandomTests/st201504051540JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504051944CPPJIT.json b/tests/files/StateTests/RandomTests/st201504051944CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504052008CPPJIT.json b/tests/files/StateTests/RandomTests/st201504052008CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504052014GO.json b/tests/files/StateTests/RandomTests/st201504052014GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504052031CPPJIT.json b/tests/files/StateTests/RandomTests/st201504052031CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504060057CPPJIT.json b/tests/files/StateTests/RandomTests/st201504060057CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504060418CPPJIT.json b/tests/files/StateTests/RandomTests/st201504060418CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504061106CPPJIT.json b/tests/files/StateTests/RandomTests/st201504061106CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504061134CPPJIT.json b/tests/files/StateTests/RandomTests/st201504061134CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504062033CPPJIT.json b/tests/files/StateTests/RandomTests/st201504062033CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504062046CPPJIT.json b/tests/files/StateTests/RandomTests/st201504062046CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504062314CPPJIT.json b/tests/files/StateTests/RandomTests/st201504062314CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504070746JS.json b/tests/files/StateTests/RandomTests/st201504070746JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504070816CPPJIT.json b/tests/files/StateTests/RandomTests/st201504070816CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504070836CPPJIT.json b/tests/files/StateTests/RandomTests/st201504070836CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504070839CPPJIT.json b/tests/files/StateTests/RandomTests/st201504070839CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071041CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071041CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071056CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071056CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071621CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071621CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071653CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071653CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071750CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071750CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504071905CPPJIT.json b/tests/files/StateTests/RandomTests/st201504071905CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504080454CPPJIT.json b/tests/files/StateTests/RandomTests/st201504080454CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504080457CPPJIT.json b/tests/files/StateTests/RandomTests/st201504080457CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504080650CPPJIT.json b/tests/files/StateTests/RandomTests/st201504080650CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504080840CPPJIT.json b/tests/files/StateTests/RandomTests/st201504080840CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504080948CPPJIT.json b/tests/files/StateTests/RandomTests/st201504080948CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081100CPPJIT.json b/tests/files/StateTests/RandomTests/st201504081100CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081134CPPJIT.json b/tests/files/StateTests/RandomTests/st201504081134CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081138CPPJIT.json b/tests/files/StateTests/RandomTests/st201504081138CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081611CPPJIT.json b/tests/files/StateTests/RandomTests/st201504081611CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081841JAVA.json b/tests/files/StateTests/RandomTests/st201504081841JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081842JAVA.json b/tests/files/StateTests/RandomTests/st201504081842JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081843JAVA.json b/tests/files/StateTests/RandomTests/st201504081843JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081928CPPJIT.json b/tests/files/StateTests/RandomTests/st201504081928CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081953JAVA.json b/tests/files/StateTests/RandomTests/st201504081953JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081954JAVA.json b/tests/files/StateTests/RandomTests/st201504081954JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081955JAVA.json b/tests/files/StateTests/RandomTests/st201504081955JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081956JAVA.json b/tests/files/StateTests/RandomTests/st201504081956JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504081957JAVA.json b/tests/files/StateTests/RandomTests/st201504081957JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504082000JAVA.json b/tests/files/StateTests/RandomTests/st201504082000JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504082001JAVA.json b/tests/files/StateTests/RandomTests/st201504082001JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504082002JAVA.json b/tests/files/StateTests/RandomTests/st201504082002JAVA.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504090553CPPJIT.json b/tests/files/StateTests/RandomTests/st201504090553CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504090657CPPJIT.json b/tests/files/StateTests/RandomTests/st201504090657CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504091403CPPJIT.json b/tests/files/StateTests/RandomTests/st201504091403CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504091641CPPJIT.json b/tests/files/StateTests/RandomTests/st201504091641CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504092303CPPJIT.json b/tests/files/StateTests/RandomTests/st201504092303CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100125CPPJIT.json b/tests/files/StateTests/RandomTests/st201504100125CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100215CPPJIT.json b/tests/files/StateTests/RandomTests/st201504100215CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100226PYTHON.json b/tests/files/StateTests/RandomTests/st201504100226PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100308CPPJIT.json b/tests/files/StateTests/RandomTests/st201504100308CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100337CPPJIT.json b/tests/files/StateTests/RandomTests/st201504100337CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504100341CPPJIT.json b/tests/files/StateTests/RandomTests/st201504100341CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504101009CPPJIT.json b/tests/files/StateTests/RandomTests/st201504101009CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504101150CPPJIT.json b/tests/files/StateTests/RandomTests/st201504101150CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504101223CPPJIT.json b/tests/files/StateTests/RandomTests/st201504101223CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504101338CPPJIT.json b/tests/files/StateTests/RandomTests/st201504101338CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504101754PYTHON.json b/tests/files/StateTests/RandomTests/st201504101754PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504111554CPPJIT.json b/tests/files/StateTests/RandomTests/st201504111554CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504130653JS.json b/tests/files/StateTests/RandomTests/st201504130653JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504131821CPPJIT.json b/tests/files/StateTests/RandomTests/st201504131821CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140229CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140229CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140236CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140236CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140359CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140359CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140750CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140750CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140818CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140818CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504140900CPPJIT.json b/tests/files/StateTests/RandomTests/st201504140900CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504150854CPPJIT.json b/tests/files/StateTests/RandomTests/st201504150854CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504151057CPPJIT.json b/tests/files/StateTests/RandomTests/st201504151057CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504202124CPPJIT.json b/tests/files/StateTests/RandomTests/st201504202124CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504210245CPPJIT.json b/tests/files/StateTests/RandomTests/st201504210245CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504210957CPPJIT.json b/tests/files/StateTests/RandomTests/st201504210957CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504211739CPPJIT.json b/tests/files/StateTests/RandomTests/st201504211739CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504212038CPPJIT.json b/tests/files/StateTests/RandomTests/st201504212038CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504230729CPPJIT.json b/tests/files/StateTests/RandomTests/st201504230729CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504231639CPPJIT.json b/tests/files/StateTests/RandomTests/st201504231639CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504231710CPPJIT.json b/tests/files/StateTests/RandomTests/st201504231710CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504231742CPPJIT.json b/tests/files/StateTests/RandomTests/st201504231742CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504232350CPPJIT.json b/tests/files/StateTests/RandomTests/st201504232350CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504240140CPPJIT.json b/tests/files/StateTests/RandomTests/st201504240140CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504240220CPPJIT.json b/tests/files/StateTests/RandomTests/st201504240220CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504240351CPPJIT.json b/tests/files/StateTests/RandomTests/st201504240351CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504240817CPPJIT.json b/tests/files/StateTests/RandomTests/st201504240817CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201504241118CPPJIT.json b/tests/files/StateTests/RandomTests/st201504241118CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505021810CPPJIT.json b/tests/files/StateTests/RandomTests/st201505021810CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505050557JS.json b/tests/files/StateTests/RandomTests/st201505050557JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505050929GO.json b/tests/files/StateTests/RandomTests/st201505050929GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505050942PYTHON.json b/tests/files/StateTests/RandomTests/st201505050942PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051004PYTHON.json b/tests/files/StateTests/RandomTests/st201505051004PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051016PYTHON.json b/tests/files/StateTests/RandomTests/st201505051016PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051114GO.json b/tests/files/StateTests/RandomTests/st201505051114GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051238GO.json b/tests/files/StateTests/RandomTests/st201505051238GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051249GO.json b/tests/files/StateTests/RandomTests/st201505051249GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051558PYTHON.json b/tests/files/StateTests/RandomTests/st201505051558PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051611PYTHON.json b/tests/files/StateTests/RandomTests/st201505051611PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051648JS.json b/tests/files/StateTests/RandomTests/st201505051648JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505051710GO.json b/tests/files/StateTests/RandomTests/st201505051710GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052013GO.json b/tests/files/StateTests/RandomTests/st201505052013GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052102JS.json b/tests/files/StateTests/RandomTests/st201505052102JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052235GO.json b/tests/files/StateTests/RandomTests/st201505052235GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052238JS.json b/tests/files/StateTests/RandomTests/st201505052238JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052242PYTHON.json b/tests/files/StateTests/RandomTests/st201505052242PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505052343PYTHON.json b/tests/files/StateTests/RandomTests/st201505052343PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505060120GO.json b/tests/files/StateTests/RandomTests/st201505060120GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505060121GO.json b/tests/files/StateTests/RandomTests/st201505060121GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505060136PYTHON.json b/tests/files/StateTests/RandomTests/st201505060136PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505060646JS.json b/tests/files/StateTests/RandomTests/st201505060646JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505252314CPPJIT.json b/tests/files/StateTests/RandomTests/st201505252314CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201505272131CPPJIT.json b/tests/files/StateTests/RandomTests/st201505272131CPPJIT.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506040034GO.json b/tests/files/StateTests/RandomTests/st201506040034GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506040157GO.json b/tests/files/StateTests/RandomTests/st201506040157GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506052130GO.json b/tests/files/StateTests/RandomTests/st201506052130GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506060929GO.json b/tests/files/StateTests/RandomTests/st201506060929GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506061255GO.json b/tests/files/StateTests/RandomTests/st201506061255GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506062331GO.json b/tests/files/StateTests/RandomTests/st201506062331GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506070548GO.json b/tests/files/StateTests/RandomTests/st201506070548GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506071050GO.json b/tests/files/StateTests/RandomTests/st201506071050GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506071624GO.json b/tests/files/StateTests/RandomTests/st201506071624GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506071819GO.json b/tests/files/StateTests/RandomTests/st201506071819GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506072007GO.json b/tests/files/StateTests/RandomTests/st201506072007GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506080556GO.json b/tests/files/StateTests/RandomTests/st201506080556GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506080721GO.json b/tests/files/StateTests/RandomTests/st201506080721GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506091836GO.json b/tests/files/StateTests/RandomTests/st201506091836GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506092032GO.json b/tests/files/StateTests/RandomTests/st201506092032GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201506101359JS.json b/tests/files/StateTests/RandomTests/st201506101359JS.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/RandomTests/st201507030359GO.json b/tests/files/StateTests/RandomTests/st201507030359GO.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stBlockHashTest.json b/tests/files/StateTests/stBlockHashTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stCallCodes.json b/tests/files/StateTests/stCallCodes.json new file mode 100644 index 000000000000..31fec452964a --- /dev/null +++ b/tests/files/StateTests/stCallCodes.json @@ -0,0 +1,6798 @@ +{ + "callcall_00" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013cfa", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c306", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "52f9d60984e3ed2c3e73ce7f61f3ce8d4c6ba1e5394440b69402342a8141a04e", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcall_00_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "3171e6d7f5ec3753ec3136b91072cf818ecdf832ecd48b2ae9127d7272f55c2c", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcall_00_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xdf3d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76320c3", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "6edf980c4ea12c7909b073b2fd8902d00bb24a0b9df2142eb415aa31e4c7edda", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "1e4e9bb87b70efadec88e07680ef43a1071f36fe03860d93e6416ebe536f7f49", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "114dfa58628f348ecb38052e6d912f9abd2705c425a26811c7d571d496210589", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "82929fe6196eb5ccc21a2d3eaf392e5ea45bd9654f6f3db27f56e41378b942c1", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "db6a8d357e83569b40b2a956ea01857c310290261af6f595e7fc644630806488", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x04a817c800", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "b2cc70b5c91805a7ba65d849ab2f2977354a5ed97458fa5481daaa78dd01783f", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_000_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "23f8f86852e3e4a2e279acb10d051dda77dcf6af0c37ce21c97d73ece5af9951", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcall_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f9904c46ff09c63f9864b18ef1acc3fa7ddda90e80b87f197500e40be0f61e54", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01", + "0x03" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f852f9fb9609b6520d486b3a7349c4558eff41b41919fe8ee30109be0ea0d6a2", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "c81b3f4f15ffbc2ea51439704986ce61933c065b92ef9313f57c11b949856164", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "cb602245eb68a8e280581c91188049a5349c667fbfe0a636d88603e8821f1191", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "db6a8d357e83569b40b2a956ea01857c310290261af6f595e7fc644630806488", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x04a817c800", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5ee6eeb669c1d7a7e71592eb8cb5a34c0375a8996d698e02f565fbf18da69705", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_001_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "23f8f86852e3e4a2e279acb10d051dda77dcf6af0c37ce21c97d73ece5af9951", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcallcode_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5cfc164fa79f7a1ed6e4c96e479a96efdb50a7c14eb59af4016b1f0de169504e", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcode_01" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013cfa", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c306", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "7bcdcef928e940403041fa78be959d797aa3781c68b52c9f60bb6233251c533a", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcode_01_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "4a7005e8db1b88559a801ae1d71fbafcb7382345e0250e12edbf5413a7a4d821", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcode_01_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xdf3d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76320c3", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "3618f0634e258733a71ad69de3d642b67e8eb7d30ed210514e7fd231c80e7370", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5b1015952b3d38437f6b201a1a6418e469d994a10f85262440052ba67865c6fb", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f63a2a1e0064faebba67d53594aa2e588b4735c9b537926a58a5f46df915e933", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "82929fe6196eb5ccc21a2d3eaf392e5ea45bd9654f6f3db27f56e41378b942c1", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "c4e47cb0a4fdec76c7e5b8995f705c4eb5981856d4d171f627163471cc20be06", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "308b378d2e435c0692646066af5f00b554ff5b3a2c9ebfee622d34231ded98fc", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_010_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "3a27bc9c6ffc87178ee9169ce24b0e291ae54c4e53de670eec5c145008543f0d", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecall_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "28b46965732d9fed6925f56bd10ae0df42205d903c9c0b51f8c6b6295f6ead44", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "2cb56c74efbe56527fe7e0269157bc5e37535a5892cda16331cc3146e2a0090b", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "91cc2d4dc118bc8d26e330573460197bdbd078e5bf9d193bcecbbdce81c523cf", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "cb602245eb68a8e280581c91188049a5349c667fbfe0a636d88603e8821f1191", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "c4e47cb0a4fdec76c7e5b8995f705c4eb5981856d4d171f627163471cc20be06", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f43c5e45844f6bbb7b0a55cef021b13121fecab88793bdf5dea426825d17f9e5", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_011_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5c2affc615e1f96d419f1765f106f5794982ad8c394895709e6192f04a3887f5", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcallcodecallcode_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "e3ad647f45f66170708956d7148b3e3b7a092def6a2399d27be7fbfbdea4230f", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f1600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecall_10" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013cfa", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c306", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d730f911e6e0400f6050f02e5ecfccf335a73831ba8a4543b1b6d2a234507e7a", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecall_10_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "88f322f71f7e7a5986baec25288251bb47e823b913d370b0ff0037e1c40dac7a", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecall_10_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xdf3d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76320c3", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "6232a655eb075819b41b8c54e2c83c8730b5f42ff7f3820a58c13cf9ce1aa981", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f1600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "64bdb7e0270513e2f748dee8d432e9a72ad24ae34ca6a8c0661fa2ce8913daec", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "09428ab6acb12570eef3dbb5e9649260845a63a7e586b4541de8bc1a5e502ff6", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d5897fcd0a35fa0bbc0371ae19ac6cae85819f8ab8d93e84c9352c344494925d", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "47cf508a818f4c87796040fd503c0362a320c2eca86cc360bd3454511bca60e6", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x04a817c800", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "8de9ffdf6b2b0f4048d30b61853c0ef89c4499a1d6a1846251d8d6d7cbddbd88", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_100_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "294042dda3ede82ea72313a788267340fcf9aea60f81ca9ee880a2bc7b814d01", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcall_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "a8670ec8bd38fd68db357ce1257b4ba7e9892058ace8f14b056bec60429c24cc", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01", + "0x03" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "51dd063160edd57746af7908fb943ab6f0f85eab4e3763a4aea474f38d1ea759", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "db8607c73cbe254c7e0eebe92e9f603c557b1c2a933360c1198c5268e3492372", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f83ae2724136b45495ef4fc740c1e57d24f8a40d8004f74de7354d6f13a1c0b1", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "47cf508a818f4c87796040fd503c0362a320c2eca86cc360bd3454511bca60e6", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x04a817c800", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "36322aecd24ccc418a4542b24ef71f7a067927b59f62e71835e62f984f8a28e9", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_101_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "294042dda3ede82ea72313a788267340fcf9aea60f81ca9ee880a2bc7b814d01", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcallcode_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "843fc7bc4ac97ee198931f09665467525e5846bf6674622420f0e0173b89bba4", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f1600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcode_11" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013cfa", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c306", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "bbcd8ef7b56db46784fb09b60d2eee02e8542d61c7642b822cd3a3ff1cf63952", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcode_11_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d65e968cc3649794d5f50924868a5d1b212401aa0298e7f811fa27d1cd9d44ea", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcode_11_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xdf3d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76320c3", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "77a4a1939bcb8b911d5b69a23096e346391cca0cefd06ef641b170fe26b76a15", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000261c350f2600155731000000000000000000000000000000000000000ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6001600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d5a9dec8b89dcb61b585d6e679cb5ceb461469caaac3b97a343c10ac570aa5bb", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d2abaf24ff786c06d898d9432e7b81a3da4e9c57f15f5f7476e4a97f47f148b5", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "d5897fcd0a35fa0bbc0371ae19ac6cae85819f8ab8d93e84c9352c344494925d", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "e9d6cf67715dfd126cd0b0e2cec6183489a796e6dc48d3e51c2d7337815abdb6", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + "0x03" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "58797699a95dcbbc5692efe394ff177bb2bff2ac3a6846cb9480eeb49a4efaec", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f1600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_110_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "a9f074d01db22b4876c62d5a772b7e92f7f182d8ffff0aec50d664eb589306d8", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecall_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "2bba4d9c82761de3e6014ee9ed7d1f97fd6e4c6819034126d611e8a273509a1b", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f1600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01", + "0x02" : "0x01", + "0x03" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x018b60", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76274a0", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "3f0c6caf2fc13f50a3a83ebd4be91db4a3b2336fda97ef9db480634976e31ee3", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111_OOGE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01", + "0x02" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x013d3a", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762c2c6", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "a2bba64b5d6bf9af2f0b0277999d33cfb2d83586a2b9c5499ff7984b0beb59fc", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111_OOGMAfter" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xa06e", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7635f92", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "f83ae2724136b45495ef4fc740c1e57d24f8a40d8004f74de7354d6f13a1c0b1", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111_OOGMBefore" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xeed4", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a763112c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "e9d6cf67715dfd126cd0b0e2cec6183489a796e6dc48d3e51c2d7337815abdb6", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x00", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x00", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x029fe0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111_SuicideEnd" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x0de0b6b5fb6fe400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x012da3", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a762d25d", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "403b618a588daef088c707e25def251aa42c083092904234db5cccfff1689a7e", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000361c350f2600255731000000000000000000000000000000000000001ff", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_111_SuicideMiddle" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x01c9c380", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x9117", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7636ee9", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "3795e19ed3276a737d84a353cbfa755a217005574bd7ee4934f9c1627d8603dd", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60406000604060006000731000000000000000000000000000000000000001620249f0f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620186a0f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x731000000000000000000000000000000000000000ff6040600060406000600073100000000000000000000000000000000000000361c350f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000003" : { + "balance" : "0x02540be400", + "code" : "0x6001600355", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + }, + "callcodecallcodecallcode_ABCB_RECURSIVE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0xb2d05e00", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01", + "0x01" : "0x01" + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x08a3c2", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a75b5c3e", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "a62ec476ec7b2c034e5ddb7d512640e509e8f000c306f596881163fb6ac48ad0", + "pre" : { + "1000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6040600060406000600073100000000000000000000000000000000000000163017d7840f2600055", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000001" : { + "balance" : "0x02540be400", + "code" : "0x60406000604060006000731000000000000000000000000000000000000002620f4240f2600155", + "nonce" : "0x00", + "storage" : { + } + }, + "1000000000000000000000000000000000000002" : { + "balance" : "0x02540be400", + "code" : "0x604060006040600060007310000000000000000000000000000000000000016207a120f2600255", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x01c9c380", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "1000000000000000000000000000000000000000", + "value" : "0x00" + } + } +} \ No newline at end of file diff --git a/tests/files/StateTests/stCallCreateCallCodeTest.json b/tests/files/StateTests/stCallCreateCallCodeTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stExample.json b/tests/files/StateTests/stExample.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stInitCodeTest.json b/tests/files/StateTests/stInitCodeTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stLogTests.json b/tests/files/StateTests/stLogTests.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stMemoryStressTest.json b/tests/files/StateTests/stMemoryStressTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stMemoryTest.json b/tests/files/StateTests/stMemoryTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stPreCompiledContracts.json b/tests/files/StateTests/stPreCompiledContracts.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stQuadraticComplexityTest.json b/tests/files/StateTests/stQuadraticComplexityTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stRefundTest.json b/tests/files/StateTests/stRefundTest.json old mode 100755 new mode 100644 index 932fe239f011..ee92f9610145 --- a/tests/files/StateTests/stRefundTest.json +++ b/tests/files/StateTests/stRefundTest.json @@ -813,6 +813,78 @@ "value" : "0x0a" } }, + "refund_multiple_internal_call_plus_suicide" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x989680", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "aaae7baea6a6c7c4c2dfeb977efac326af552aaa" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x73095e7baea6a6c7c4c2dfeb977efac326af552d87ff", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x2d1a1", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0xde0b6a99d572455", + "code" : "0x", + "nonce" : "0x02", + "storage" : { + } + } + }, + "postStateRoot" : "37c66597ede8e84f30922a801be6c54cf985c984352becfd20deb5814598998d", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x", + "code" : "0x60606040526000357c010000000000000000000000000000000000000000000000000000000090048063c6542cdb14610044578063f8b0a0701461005157610042565b005b61004f600450610079565b005b61005c60045061005e565b005b3373ffffffffffffffffffffffffffffffffffffffff16ff5b565b60006000309150600090505b600a8160ff1610156100bc578060ff16600060005082600a81101561000257909001600050819055505b8080600101915050610085565b8173ffffffffffffffffffffffffffffffffffffffff1663f8b0a070604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506000604051808303816000876161da5a03f115610002575050508173ffffffffffffffffffffffffffffffffffffffff1663f8b0a070604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506000604051808303816000876161da5a03f115610002575050508173ffffffffffffffffffffffffffffffffffffffff1663f8b0a070604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506000604051808303816000876161da5a03f115610002575050508173ffffffffffffffffffffffffffffffffffffffff1663f8b0a070604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506000604051808303816000876161da5a03f115610002575050505b505056", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + }, + "aaae7baea6a6c7c4c2dfeb977efac326af552aaa" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x73095e7baea6a6c7c4c2dfeb977efac326af552d87ff", + "nonce" : "0x00", + "storage" : { + "0x01" : "0x01" + } + } + }, + "transaction" : { + "data" : "0xc6542cdb", + "gasLimit" : "0x989680", + "gasPrice" : "0x01", + "nonce" : "0x01", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0a0a0a0a0a" + } + }, + "refund_NoOOG_1" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", @@ -1194,4 +1266,4 @@ "value" : "0x0a" } } -} \ No newline at end of file +} diff --git a/tests/files/StateTests/stSolidityTest.json b/tests/files/StateTests/stSolidityTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stSpecialTest.json b/tests/files/StateTests/stSpecialTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stSystemOperationsTest.json b/tests/files/StateTests/stSystemOperationsTest.json old mode 100755 new mode 100644 index 7f7cb1220c86..94ca013e3f67 --- a/tests/files/StateTests/stSystemOperationsTest.json +++ b/tests/files/StateTests/stSystemOperationsTest.json @@ -18676,6 +18676,61 @@ "value" : "0x0186a0" } }, + "suicideSendEtherPostDeath" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x989680", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "post" : { + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x2aa8", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7624eb8", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "9f3c63ff818c14e4b56e5fa1fc03a76725f598bcac256668185ec51dfc1d7f5f", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60606040526000357c01000000000000000000000000000000000000000000000000000000009004806335f46994146100445780634d536fe31461005157610042565b005b61004f600450610072565b005b61005c60045061008d565b6040518082815260200191505060405180910390f35b3073ffffffffffffffffffffffffffffffffffffffff16ff5b565b600060003073ffffffffffffffffffffffffffffffffffffffff166335f46994604051817c01000000000000000000000000000000000000000000000000000000000281526004018090506000604051808303816000876161da5a03f115610002575050503073ffffffffffffffffffffffffffffffffffffffff163190503373ffffffffffffffffffffffffffffffffffffffff16600082604051809050600060405180830381858888f1935050505050809150610147565b509056", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "0x4d536fe3", + "gasLimit" : "0x2dc6c0", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, "suicideSendEtherToMe" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", diff --git a/tests/files/StateTests/stTransactionTest.json b/tests/files/StateTests/stTransactionTest.json old mode 100755 new mode 100644 diff --git a/tests/files/StateTests/stWalletTest.json b/tests/files/StateTests/stWalletTest.json old mode 100755 new mode 100644 diff --git a/tests/files/TODO b/tests/files/TODO old mode 100755 new mode 100644 diff --git a/tests/files/TransactionTests/RandomTests/tr201506052141PYTHON.json b/tests/files/TransactionTests/RandomTests/tr201506052141PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/TransactionTests/tt10mbDataField.json b/tests/files/TransactionTests/tt10mbDataField.json old mode 100755 new mode 100644 diff --git a/tests/files/TransactionTests/ttTransactionTest.json b/tests/files/TransactionTests/ttTransactionTest.json old mode 100755 new mode 100644 index 00169d293213..9fb2ff2bfd0a --- a/tests/files/TransactionTests/ttTransactionTest.json +++ b/tests/files/TransactionTests/ttTransactionTest.json @@ -419,7 +419,7 @@ "gasLimit" : "0xf710", "gasPrice" : "0x09184e72a000", "nonce" : "0x0d", - "r" : "0x006ab6dda9f4df56ea45583af36660329147f1753f3724ea5eb9ed83e812ca77", + "r" : "0x6ab6dda9f4df56ea45583af36660329147f1753f3724ea5eb9ed83e812ca77", "s" : "0x495701e230667832c8999e884e366a61028633ecf951e8cd66d119f381ae5718", "to" : "7c47ef93268a311f4cad0c750724299e9b72c268", "v" : "0x1c", diff --git a/tests/files/TransactionTests/ttWrongRLPTransaction.json b/tests/files/TransactionTests/ttWrongRLPTransaction.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/hex_encoded_securetrie_test.json b/tests/files/TrieTests/hex_encoded_securetrie_test.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/trieanyorder.json b/tests/files/TrieTests/trieanyorder.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/trieanyorder_secureTrie.json b/tests/files/TrieTests/trieanyorder_secureTrie.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/trietest.json b/tests/files/TrieTests/trietest.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/trietest_secureTrie.json b/tests/files/TrieTests/trietest_secureTrie.json old mode 100755 new mode 100644 diff --git a/tests/files/TrieTests/trietestnextprev.json b/tests/files/TrieTests/trietestnextprev.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503102037PYTHON.json b/tests/files/VMTests/RandomTests/201503102037PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503102148PYTHON.json b/tests/files/VMTests/RandomTests/201503102148PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503102300PYTHON.json b/tests/files/VMTests/RandomTests/201503102300PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503102320PYTHON.json b/tests/files/VMTests/RandomTests/201503102320PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110050PYTHON.json b/tests/files/VMTests/RandomTests/201503110050PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110206PYTHON.json b/tests/files/VMTests/RandomTests/201503110206PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110219PYTHON.json b/tests/files/VMTests/RandomTests/201503110219PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110226PYTHON_DUP6.json b/tests/files/VMTests/RandomTests/201503110226PYTHON_DUP6.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110346PYTHON_PUSH24.json b/tests/files/VMTests/RandomTests/201503110346PYTHON_PUSH24.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503110526PYTHON.json b/tests/files/VMTests/RandomTests/201503110526PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503111844PYTHON.json b/tests/files/VMTests/RandomTests/201503111844PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503112218PYTHON.json b/tests/files/VMTests/RandomTests/201503112218PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503120317PYTHON.json b/tests/files/VMTests/RandomTests/201503120317PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503120525PYTHON.json b/tests/files/VMTests/RandomTests/201503120525PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503120547PYTHON.json b/tests/files/VMTests/RandomTests/201503120547PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/201503120909PYTHON.json b/tests/files/VMTests/RandomTests/201503120909PYTHON.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/RandomTests/randomTest.json b/tests/files/VMTests/RandomTests/randomTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json old mode 100755 new mode 100644 index 88d3c1e5b24f..b3a19be65583 --- a/tests/files/VMTests/vmArithmeticTest.json +++ b/tests/files/VMTests/vmArithmeticTest.json @@ -7,8 +7,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -52,8 +51,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -97,8 +95,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -141,8 +138,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -185,8 +181,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -229,8 +224,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -274,8 +268,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -319,8 +312,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -363,8 +355,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -408,8 +399,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -453,8 +443,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -498,8 +487,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -543,8 +531,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -587,8 +574,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -632,8 +618,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -677,8 +662,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -721,8 +705,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -766,8 +749,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -810,8 +792,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -854,8 +835,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -898,8 +878,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -943,8 +922,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -987,8 +965,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1023,6 +1000,50 @@ } } }, + "divBoostBug" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x7f01dae6076b981dae6076b981dae6076b981dae6076b981dae6076b981dae60777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba04600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013872", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f01dae6076b981dae6076b981dae6076b981dae6076b981dae6076b981dae60777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba04600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x89" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f01dae6076b981dae6076b981dae6076b981dae6076b981dae6076b981dae60777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffba04600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "divByNonZero0" : { "callcreates" : [ ], @@ -1031,8 +1052,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1076,8 +1096,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1120,8 +1139,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1164,8 +1182,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1209,8 +1226,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1253,8 +1269,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1298,8 +1313,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1343,8 +1357,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1388,8 +1401,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1433,8 +1445,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1477,8 +1488,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1522,8 +1532,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1567,8 +1576,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1612,8 +1620,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1656,8 +1663,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1709,8 +1715,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1759,8 +1764,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1809,8 +1813,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1859,8 +1862,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1909,8 +1911,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1959,8 +1960,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2009,8 +2009,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2059,8 +2058,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2109,8 +2107,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2159,8 +2156,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2209,8 +2205,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2259,8 +2254,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2309,8 +2303,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2359,8 +2352,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2409,8 +2401,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2459,8 +2450,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2509,8 +2499,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2559,8 +2548,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2609,8 +2597,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2659,8 +2646,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2709,8 +2695,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2759,8 +2744,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2809,8 +2793,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2859,8 +2842,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2909,8 +2891,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2959,8 +2940,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3010,8 +2990,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3061,8 +3040,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3111,8 +3089,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3161,8 +3138,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3211,8 +3187,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3261,8 +3236,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x05f5e100", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3311,8 +3285,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3361,8 +3334,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3408,8 +3380,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3455,8 +3426,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3502,8 +3472,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3549,8 +3518,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3596,8 +3564,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3643,8 +3610,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3690,8 +3656,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3737,8 +3702,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3784,8 +3748,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3831,8 +3794,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3878,8 +3840,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3925,8 +3886,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3972,8 +3932,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4019,8 +3978,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4066,8 +4024,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4113,8 +4070,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4160,8 +4116,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4207,8 +4162,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4254,8 +4208,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4301,8 +4254,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4348,8 +4300,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4395,8 +4346,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4442,8 +4392,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4489,8 +4438,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4536,8 +4484,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4582,8 +4529,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4628,8 +4574,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4675,8 +4620,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4722,8 +4666,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4769,8 +4712,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4816,8 +4758,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4863,8 +4804,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4910,8 +4850,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4957,8 +4896,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5004,8 +4942,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5051,8 +4988,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5096,8 +5032,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5143,8 +5078,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5190,8 +5124,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5237,8 +5170,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5284,8 +5216,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5330,8 +5261,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5377,8 +5307,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5421,8 +5350,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5466,8 +5394,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5511,8 +5438,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5555,8 +5481,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5599,8 +5524,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5644,8 +5568,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5689,8 +5612,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5734,8 +5656,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5779,8 +5700,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5823,8 +5743,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5868,8 +5787,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5913,8 +5831,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -5957,8 +5874,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6002,8 +5918,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6044,8 +5959,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6075,8 +5989,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6119,8 +6032,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6163,8 +6075,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6207,8 +6118,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6252,8 +6162,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6297,8 +6206,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6342,8 +6250,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6387,8 +6294,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6431,8 +6337,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6476,8 +6381,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6521,8 +6425,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6565,8 +6468,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6609,8 +6511,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6653,8 +6554,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6697,8 +6597,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6741,8 +6640,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6786,8 +6684,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6830,8 +6727,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6875,8 +6771,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6920,8 +6815,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -6964,8 +6858,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7009,8 +6902,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7054,8 +6946,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7099,8 +6990,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7143,8 +7033,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7187,8 +7076,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7232,8 +7120,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7277,8 +7164,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7321,8 +7207,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7365,8 +7250,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7410,8 +7294,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7454,8 +7337,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7499,8 +7381,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7544,8 +7425,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7588,8 +7468,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7633,8 +7512,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7677,8 +7555,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7722,8 +7599,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7767,8 +7643,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7812,8 +7687,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7857,8 +7731,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7901,8 +7774,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7946,8 +7818,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -7991,8 +7862,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8036,8 +7906,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8080,8 +7949,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8125,8 +7993,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8170,8 +8037,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8215,8 +8081,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8260,8 +8125,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8305,8 +8169,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8349,8 +8212,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8393,8 +8255,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8437,8 +8298,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8482,8 +8342,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8526,8 +8385,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8571,8 +8429,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8615,8 +8472,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8660,8 +8516,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8704,8 +8559,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8749,8 +8603,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8794,8 +8647,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8839,8 +8691,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -8884,8 +8735,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", diff --git a/tests/files/VMTests/vmBitwiseLogicOperationTest.json b/tests/files/VMTests/vmBitwiseLogicOperationTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmBlockInfoTest.json b/tests/files/VMTests/vmBlockInfoTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmEnvironmentalInfoTest.json b/tests/files/VMTests/vmEnvironmentalInfoTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmIOandFlowOperationsTest.json b/tests/files/VMTests/vmIOandFlowOperationsTest.json old mode 100755 new mode 100644 index 2ac01f8174f0..0eb6a4365658 --- a/tests/files/VMTests/vmIOandFlowOperationsTest.json +++ b/tests/files/VMTests/vmIOandFlowOperationsTest.json @@ -5,8 +5,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -34,8 +33,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -63,8 +61,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -94,8 +91,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -139,8 +135,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -182,8 +177,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -211,8 +205,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -240,8 +233,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -269,8 +261,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -298,8 +289,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -329,8 +319,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -372,8 +361,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -403,8 +391,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -446,8 +433,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -475,8 +461,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -504,8 +489,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -533,8 +517,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -563,8 +546,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -592,8 +574,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -621,8 +602,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -652,8 +632,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -697,8 +676,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -740,8 +718,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -769,8 +746,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -800,8 +776,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -843,8 +818,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -872,8 +846,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -901,8 +874,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x01", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -932,8 +904,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x01", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -977,8 +948,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x04", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1020,8 +990,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x04", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1049,8 +1018,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x04", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1078,8 +1046,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x07", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1109,8 +1076,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1146,14 +1112,170 @@ } } }, + "DynamicJump_value1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x08" + }, + "gas" : "0x01867a", + "logs" : [ + ], + "out" : "0x0000000000000000000000000000000000000000000000000000000000000001", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "DynamicJump_value2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x12" + }, + "gas" : "0x01867c", + "logs" : [ + ], + "out" : "0x0000000000000000000000000000000000000000000000000000000000000002", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "DynamicJump_value3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x1b" + }, + "gas" : "0x01867e", + "logs" : [ + ], + "out" : "0x0000000000000000000000000000000000000000000000000000000000000003", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "DynamicJump_valueUnderflow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b505050600052596000f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x1b" + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x60016002600334565b5050600052596000f35b50600052596000f35b505050600052596000f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "DynamicJumpi0" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1183,8 +1305,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1226,8 +1347,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1257,8 +1377,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1300,8 +1419,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1329,8 +1447,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1358,8 +1475,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1387,8 +1503,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1417,8 +1532,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1447,8 +1561,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1479,8 +1592,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1526,8 +1638,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1571,8 +1682,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1601,8 +1711,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1631,8 +1740,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1661,8 +1769,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1691,8 +1798,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1723,8 +1829,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1768,8 +1873,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1800,8 +1904,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1845,8 +1948,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1875,8 +1977,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1905,8 +2006,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x02", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1935,8 +2035,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1964,8 +2063,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -1995,8 +2093,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2037,8 +2134,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2066,8 +2162,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2097,8 +2192,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2140,8 +2234,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2171,8 +2264,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2215,8 +2307,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2259,8 +2350,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2304,8 +2394,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2347,8 +2436,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2378,8 +2466,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2422,8 +2509,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2466,8 +2552,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2510,8 +2595,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2552,8 +2636,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2581,8 +2664,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2610,8 +2692,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2641,8 +2722,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2686,8 +2766,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2729,8 +2808,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2758,8 +2836,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2787,8 +2864,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2818,8 +2894,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2863,8 +2938,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2905,8 +2979,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2934,8 +3007,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2963,8 +3035,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -2992,8 +3063,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3021,8 +3091,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3050,8 +3119,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3079,8 +3147,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3115,8 +3182,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3153,8 +3219,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3195,8 +3260,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3226,8 +3290,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3269,8 +3332,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3300,8 +3362,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3343,8 +3404,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3372,8 +3432,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3408,8 +3467,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3446,8 +3504,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x989680", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3488,8 +3545,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3517,8 +3573,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3548,8 +3603,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3591,8 +3645,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3614,6 +3667,84 @@ } } }, + "loop_stacklimit_1020" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000345b60019003906001018180600357600052600152600059f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x03fc" + }, + "gas" : "0xef1c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x6000345b60019003906001018180600357600052600152600059f3", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x6000345b60019003906001018180600357600052600152600059f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "loop_stacklimit_1021" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x6000345b60019003906001018180600357600052600152600059f3", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x03fd" + }, + "expect" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "storage" : { + "0x02" : "0x23" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x6000345b60019003906001018180600357600052600152600059f3", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "memory1" : { "callcreates" : [ ], @@ -3622,8 +3753,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3666,8 +3796,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3710,8 +3839,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3752,8 +3880,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3781,8 +3908,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3812,8 +3938,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3857,8 +3982,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3902,8 +4026,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3947,8 +4070,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -3992,8 +4114,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4037,8 +4158,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4080,8 +4200,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4111,8 +4230,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4155,8 +4273,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4200,8 +4317,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4243,8 +4359,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4274,8 +4389,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4318,8 +4432,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4363,8 +4476,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4407,8 +4519,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4452,8 +4563,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4495,8 +4605,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4524,8 +4633,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4555,8 +4663,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4597,8 +4704,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x01f4153d80", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4628,8 +4734,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4675,8 +4780,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4719,8 +4823,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4742,6 +4845,41 @@ } } }, + "sstore_underflow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x600155", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "expect" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "storage" : { + "0x01" : "0x00" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x152d02c7e14af6800000", + "code" : "0x600155", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "stack_loop" : { "callcreates" : [ ], @@ -4750,8 +4888,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4794,8 +4931,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4836,8 +4972,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4867,8 +5002,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", diff --git a/tests/files/VMTests/vmInputLimits.json b/tests/files/VMTests/vmInputLimits.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmInputLimitsLight.json b/tests/files/VMTests/vmInputLimitsLight.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmLogTest.json b/tests/files/VMTests/vmLogTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmPerformanceTest.json b/tests/files/VMTests/vmPerformanceTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmPushDupSwapTest.json b/tests/files/VMTests/vmPushDupSwapTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmSha3Test.json b/tests/files/VMTests/vmSha3Test.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmSystemOperationsTest.json b/tests/files/VMTests/vmSystemOperationsTest.json old mode 100755 new mode 100644 diff --git a/tests/files/VMTests/vmtests.json b/tests/files/VMTests/vmtests.json old mode 100755 new mode 100644 diff --git a/tests/files/ansible/README.md b/tests/files/ansible/README.md old mode 100755 new mode 100644 diff --git a/tests/files/ansible/Vagrantfile b/tests/files/ansible/Vagrantfile old mode 100755 new mode 100644 diff --git a/tests/files/ansible/ec2-setup.yml b/tests/files/ansible/ec2-setup.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/ec2-terminate.yml b/tests/files/ansible/ec2-terminate.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/ec2.ini b/tests/files/ansible/ec2.ini old mode 100755 new mode 100644 diff --git a/tests/files/ansible/host-config.yml b/tests/files/ansible/host-config.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/common/handlers/main.yml b/tests/files/ansible/roles/common/handlers/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/common/tasks/main.yml b/tests/files/ansible/roles/common/tasks/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/docker/handlers/main.yml b/tests/files/ansible/roles/docker/handlers/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/docker/tasks/main.yml b/tests/files/ansible/roles/docker/tasks/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/ec2/tasks/setup.yml b/tests/files/ansible/roles/ec2/tasks/setup.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/ec2/tasks/terminate.yml b/tests/files/ansible/roles/ec2/tasks/terminate.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/ec2/vars/main.yml b/tests/files/ansible/roles/ec2/vars/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/roles/testrunner/tasks/main.yml b/tests/files/ansible/roles/testrunner/tasks/main.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/site.yml b/tests/files/ansible/site.yml old mode 100755 new mode 100644 diff --git a/tests/files/ansible/test-files/docker-cpp/Dockerfile b/tests/files/ansible/test-files/docker-cpp/Dockerfile old mode 100755 new mode 100644 diff --git a/tests/files/ansible/test-files/docker-cppjit/Dockerfile b/tests/files/ansible/test-files/docker-cppjit/Dockerfile old mode 100755 new mode 100644 diff --git a/tests/files/ansible/test-files/docker-go/Dockerfile b/tests/files/ansible/test-files/docker-go/Dockerfile old mode 100755 new mode 100644 diff --git a/tests/files/ansible/test-files/docker-python/Dockerfile b/tests/files/ansible/test-files/docker-python/Dockerfile old mode 100755 new mode 100644 diff --git a/tests/files/ansible/testrunner-config.yml b/tests/files/ansible/testrunner-config.yml old mode 100755 new mode 100644 diff --git a/tests/files/index.js b/tests/files/index.js deleted file mode 100755 index 0427fe759dc6..000000000000 --- a/tests/files/index.js +++ /dev/null @@ -1,25 +0,0 @@ -var tests = module.exports = {}; - -Object.defineProperties(tests, { - blockchainTests: { - get: require('require-all').bind(this, __dirname + '/BlockchainTests') - }, - basicTests: { - get: require('require-all').bind(this, __dirname + '/BasicTests/') - }, - trieTests: { - get: require('require-all').bind(this, __dirname + '/TrieTests/') - }, - stateTests: { - get: require('require-all').bind(this, __dirname + '/StateTests/') - }, - transactionTests: { - get: require('require-all').bind(this, __dirname + '/TransactionTests/') - }, - vmTests: { - get: require('require-all').bind(this, __dirname + '/VMTests') - }, - powTests: { - get: require('require-all').bind(this, __dirname + '/PoWTests') - } -}); diff --git a/tests/state_test.go b/tests/state_test.go index b450f5e74295..c62631c48f57 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -115,6 +115,13 @@ func TestCallCreateCallCode(t *testing.T) { } } +func TestCallCodes(t *testing.T) { + fn := filepath.Join(stateTestDir, "stCallCodes.json") + if err := RunStateTest(fn, StateSkipTests); err != nil { + t.Error(err) + } +} + func TestMemory(t *testing.T) { fn := filepath.Join(stateTestDir, "stMemoryTest.json") if err := RunStateTest(fn, StateSkipTests); err != nil { diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 3ae5d32dab3c..dc275f121cf9 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -128,6 +128,7 @@ func runStateTests(tests map[string]VmTest, skipTests []string) error { return nil } + //fmt.Println("StateTest name:", name) if err := runStateTest(test); err != nil { return fmt.Errorf("%s: %s\n", name, err.Error()) } @@ -172,7 +173,7 @@ func runStateTest(test VmTest) error { ret, logs, _, _ = RunState(statedb, env, test.Transaction) - // // Compare expected and actual return + // Compare expected and actual return rexp := common.FromHex(test.Out) if bytes.Compare(rexp, ret) != 0 { return fmt.Errorf("return failed. Expected %x, got %x\n", rexp, ret) @@ -181,9 +182,6 @@ func runStateTest(test VmTest) error { // check post state for addr, account := range test.Post { obj := statedb.GetStateObject(common.HexToAddress(addr)) - if obj == nil { - continue - } if obj.Balance().Cmp(common.Big(account.Balance)) != 0 { return fmt.Errorf("(%x) balance failed. Expected %v, got %v => %v\n", obj.Address().Bytes()[:4], account.Balance, obj.Balance(), new(big.Int).Sub(common.Big(account.Balance), obj.Balance())) diff --git a/tests/util.go b/tests/util.go index 38e8c2c1b064..311667ffa509 100644 --- a/tests/util.go +++ b/tests/util.go @@ -21,12 +21,14 @@ import ( "fmt" "math/big" + "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core" "github.com/expanse-project/go-expanse/core/state" "github.com/expanse-project/go-expanse/core/types" "github.com/expanse-project/go-expanse/core/vm" "github.com/expanse-project/go-expanse/crypto" + "github.com/expanse-project/go-expanse/ethdb" ) func checkLogs(tlog []Log, logs state.Logs) error { @@ -87,7 +89,7 @@ func (self Log) Topics() [][]byte { return t } -func StateObjectFromAccount(db common.Database, addr string, account Account) *state.StateObject { +func StateObjectFromAccount(db ethdb.Database, addr string, account Account) *state.StateObject { obj := state.NewStateObject(common.HexToAddress(addr), db) obj.SetBalance(common.Big(account.Balance)) diff --git a/xeth/xeth.go b/xeth/xeth.go index 6eb30a58ae6f..3e3c3f509a87 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -355,6 +355,10 @@ func (self *XEth) EthBlockByNumber(num int64) *types.Block { return self.getBlockByHeight(num) } +func (self *XEth) Td(hash common.Hash) *big.Int { + return self.backend.ChainManager().GetTd(hash) +} + func (self *XEth) CurrentBlock() *types.Block { return self.backend.ChainManager().CurrentBlock() } @@ -528,8 +532,10 @@ func (self *XEth) NewLogFilter(earliest, latest int64, skip, max int, address [] self.logMu.Lock() defer self.logMu.Unlock() - var id int filter := core.NewFilter(self.backend) + id := self.filterManager.InstallFilter(filter) + self.logQueue[id] = &logQueue{timeout: time.Now()} + filter.SetEarliestBlock(earliest) filter.SetLatestBlock(latest) filter.SetSkip(skip) @@ -540,10 +546,10 @@ func (self *XEth) NewLogFilter(earliest, latest int64, skip, max int, address [] self.logMu.Lock() defer self.logMu.Unlock() - self.logQueue[id].add(logs...) + if queue := self.logQueue[id]; queue != nil { + queue.add(logs...) + } } - id = self.filterManager.InstallFilter(filter) - self.logQueue[id] = &logQueue{timeout: time.Now()} return id } @@ -552,16 +558,18 @@ func (self *XEth) NewTransactionFilter() int { self.transactionMu.Lock() defer self.transactionMu.Unlock() - var id int filter := core.NewFilter(self.backend) + id := self.filterManager.InstallFilter(filter) + self.transactionQueue[id] = &hashQueue{timeout: time.Now()} + filter.TransactionCallback = func(tx *types.Transaction) { self.transactionMu.Lock() defer self.transactionMu.Unlock() - self.transactionQueue[id].add(tx.Hash()) + if queue := self.transactionQueue[id]; queue != nil { + queue.add(tx.Hash()) + } } - id = self.filterManager.InstallFilter(filter) - self.transactionQueue[id] = &hashQueue{timeout: time.Now()} return id } @@ -569,16 +577,18 @@ func (self *XEth) NewBlockFilter() int { self.blockMu.Lock() defer self.blockMu.Unlock() - var id int filter := core.NewFilter(self.backend) + id := self.filterManager.InstallFilter(filter) + self.blockQueue[id] = &hashQueue{timeout: time.Now()} + filter.BlockCallback = func(block *types.Block, logs state.Logs) { self.blockMu.Lock() defer self.blockMu.Unlock() - self.blockQueue[id].add(block.Hash()) + if queue := self.blockQueue[id]; queue != nil { + queue.add(block.Hash()) + } } - id = self.filterManager.InstallFilter(filter) - self.blockQueue[id] = &hashQueue{timeout: time.Now()} return id } @@ -1018,16 +1028,24 @@ func (m callmsg) Value() *big.Int { return m.value } func (m callmsg) Data() []byte { return m.data } type logQueue struct { + mu sync.Mutex + logs state.Logs timeout time.Time id int } func (l *logQueue) add(logs ...*state.Log) { + l.mu.Lock() + defer l.mu.Unlock() + l.logs = append(l.logs, logs...) } func (l *logQueue) get() state.Logs { + l.mu.Lock() + defer l.mu.Unlock() + l.timeout = time.Now() tmp := l.logs l.logs = nil @@ -1035,16 +1053,24 @@ func (l *logQueue) get() state.Logs { } type hashQueue struct { + mu sync.Mutex + hashes []common.Hash timeout time.Time id int } func (l *hashQueue) add(hashes ...common.Hash) { + l.mu.Lock() + defer l.mu.Unlock() + l.hashes = append(l.hashes, hashes...) } func (l *hashQueue) get() []common.Hash { + l.mu.Lock() + defer l.mu.Unlock() + l.timeout = time.Now() tmp := l.hashes l.hashes = nil