From c51e153b5c5327f971e7b410e49e7babfc3f0b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 2 Jul 2015 14:13:46 +0300 Subject: [PATCH 01/90] eth, metrics, p2p: prepare metrics and net packets to eth/62 --- eth/downloader/downloader.go | 3 +- eth/handler.go | 15 +------ eth/metrics.go | 84 ++++++++++++++++++++++++++++++++++++ eth/peer.go | 50 ++++++++++++--------- eth/protocol.go | 25 ++++++++--- metrics/metrics.go | 12 +++--- p2p/metrics.go | 8 +++- 7 files changed, 149 insertions(+), 48 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index e3e22a7848fc..23d2e045e947 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -39,6 +39,7 @@ import ( const ( eth60 = 60 // Constant to check for old protocol support eth61 = 61 // Constant to check for new protocol support + eth62 = 62 // Constant to check for experimental protocol support ) var ( @@ -329,7 +330,7 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e if err = d.fetchBlocks60(); err != nil { return err } - case eth61: + case eth61, eth62: // New eth/61, use forward, concurrent hash and block retrieval algorithm number, err := d.findAncestor(p) if err != nil { diff --git a/eth/handler.go b/eth/handler.go index 5d233dd968a4..6c1895bbd02c 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -176,7 +176,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 eth peer. When @@ -281,14 +281,11 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { case 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 { break } - reqHashInTrafficMeter.Mark(int64(32 * len(hashes))) - // Deliver them all to the downloader for queuing err := pm.downloader.DeliverHashes(p.id, hashes) if err != nil { @@ -340,7 +337,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { case 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 { @@ -349,7 +345,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // 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 @@ -365,9 +360,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msgStream.Decode(&hashes); err != nil { break } - propHashInPacketsMeter.Mark(1) - propHashInTrafficMeter.Mark(int64(32 * len(hashes))) - // Mark the hashes as present at the remote node for _, hash := range hashes { p.MarkBlock(hash) @@ -390,9 +382,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { 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) } @@ -427,7 +416,6 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { 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 +424,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(), diff --git a/eth/metrics.go b/eth/metrics.go index 625b90b67188..13745dc43d46 100644 --- a/eth/metrics.go +++ b/eth/metrics.go @@ -18,6 +18,7 @@ package eth import ( "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p" ) var ( @@ -41,4 +42,87 @@ var ( 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/header/in/packets") + reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/header/in/traffic") + reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/header/out/packets") + reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/header/out/traffic") + reqStateInPacketsMeter = metrics.NewMeter("eth/req/state/in/packets") + reqStateInTrafficMeter = metrics.NewMeter("eth/req/state/in/traffic") + reqStateOutPacketsMeter = metrics.NewMeter("eth/req/state/out/packets") + reqStateOutTrafficMeter = metrics.NewMeter("eth/req/state/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 +} + +// 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{rw} +} + +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 msg.Code { + case BlockHashesMsg: + packets, traffic = reqHashInPacketsMeter, reqHashInTrafficMeter + case BlocksMsg: + packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter + case BlockHeadersMsg: + packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter + case NodeDataMsg: + packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter + case NewBlockHashesMsg: + packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter + case NewBlockMsg: + packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter + case 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 msg.Code { + case BlockHashesMsg: + packets, traffic = reqHashOutPacketsMeter, reqHashOutTrafficMeter + case BlocksMsg: + packets, traffic = reqBlockOutPacketsMeter, reqBlockOutTrafficMeter + case BlockHeadersMsg: + packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter + case NodeDataMsg: + packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter + case NewBlockHashesMsg: + packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter + case NewBlockMsg: + packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter + case 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/eth/peer.go b/eth/peer.go index ade1f37eaa60..c17cdfca781a 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -129,9 +129,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,27 +137,17 @@ 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 // a hash notification. func (p *peer) SendNewBlockHashes(hashes []common.Hash) error { - propHashOutPacketsMeter.Mark(1) - propHashOutTrafficMeter.Mark(int64(32 * len(hashes))) - for _, hash := range hashes { p.knownBlocks.Add(hash) } @@ -168,33 +156,55 @@ func (p *peer) SendNewBlockHashes(hashes []common.Hash) error { // 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) +} + +// 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) +} + // 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...\n", 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...\n", 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\n", p, len(hashes)) return p2p.Send(p.rw, GetBlocksMsg, hashes) } +// RequestHeaders fetches a batch of blocks' headers corresponding to the +// specified hashes. +func (p *peer) RequestHeaders(hashes []common.Hash) error { + glog.V(logger.Debug).Infof("%v fetching %v headers\n", p, len(hashes)) + return p2p.Send(p.rw, GetBlockHeadersMsg, 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\n", p, len(hashes)) + return p2p.Send(p.rw, GetNodeDataMsg, 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 { diff --git a/eth/protocol.go b/eth/protocol.go index b8c9b50d0e3b..fcc5f21e2e91 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -24,10 +24,10 @@ import ( ) // Supported versions of the eth protocol (first is primary). -var ProtocolVersions = []uint{61, 60} +var ProtocolVersions = []uint{62, 61, 60} // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{9, 8} +var ProtocolLengths = []uint64{13, 9, 8} const ( NetworkId = 1 @@ -36,6 +36,7 @@ const ( // eth protocol message codes const ( + // Protocol messages belonging to eth/60 StatusMsg = iota NewBlockHashesMsg TxMsg @@ -44,7 +45,15 @@ const ( GetBlocksMsg BlocksMsg NewBlockMsg + + // Protocol messages belonging to eth/61 GetBlockHashesFromNumberMsg + + // Protocol messages belonging to eth/62 + GetBlockHeadersMsg + BlockHeadersMsg + GetNodeDataMsg + NodeDataMsg ) type errCode int @@ -102,15 +111,14 @@ type statusData struct { GenesisBlock common.Hash } -// getBlockHashesData is the network packet for the hash based block retrieval -// message. +// 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 @@ -121,3 +129,8 @@ type newBlockData struct { Block *types.Block TD *big.Int } + +// nodeDataData is the network response packet for a node data retrieval. +type nodeDataData []struct { + Value []byte +} diff --git a/metrics/metrics.go b/metrics/metrics.go index 6d1a065edb01..fcf8b5c32b61 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/p2p/metrics.go b/p2p/metrics.go index f98cac2742d7..98b61901d53d 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 { From d910148a96cca05bc40ac5b5773effa9b92702f8 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Mon, 24 Aug 2015 12:22:12 +0200 Subject: [PATCH 02/90] Set ipc channel as user agent client --- rpc/comms/ipc.go | 12 ++++-------- rpc/comms/ipc_unix.go | 23 ++++++++++++++++++++++- rpc/comms/ipc_windows.go | 23 ++++++++++++++++++++++- rpc/jeth.go | 10 ---------- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/rpc/comms/ipc.go b/rpc/comms/ipc.go index d897bf31375d..3de659b65c40 100644 --- a/rpc/comms/ipc.go +++ b/rpc/comms/ipc.go @@ -42,16 +42,12 @@ func (self *ipcClient) Close() { self.coder.Close() } -func (self *ipcClient) Send(req interface{}) error { +func (self *ipcClient) Send(msg interface{}) error { var err error - if r, ok := req.(*shared.Request); ok { - if err = self.coder.WriteResponse(r); err != nil { - if err = self.reconnect(); err == nil { - err = self.coder.WriteResponse(r) - } + if err = self.coder.WriteResponse(msg); err != nil { + if err = self.reconnect(); err == nil { + err = self.coder.WriteResponse(msg) } - - return err } return err } diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 24aefa5f3439..9d90da071930 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rpc/codec" "github.com/ethereum/go-ethereum/rpc/shared" + "github.com/ethereum/go-ethereum/rpc/useragent" ) func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) { @@ -34,7 +35,18 @@ func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) { return nil, err } - return &ipcClient{cfg.Endpoint, c, codec, codec.New(c)}, nil + coder := codec.New(c) + msg := shared.Request{ + Id: 0, + Method: useragent.EnableUserAgentMethod, + Jsonrpc: shared.JsonRpcVersion, + Params: []byte("[]"), + } + + coder.WriteResponse(msg) + coder.Recv() + + return &ipcClient{cfg.Endpoint, c, codec, coder}, nil } func (self *ipcClient) reconnect() error { @@ -42,6 +54,15 @@ func (self *ipcClient) reconnect() error { c, err := net.DialUnix("unix", nil, &net.UnixAddr{self.endpoint, "unix"}) if err == nil { self.coder = self.codec.New(c) + + msg := shared.Request{ + Id: 0, + Method: useragent.EnableUserAgentMethod, + Jsonrpc: shared.JsonRpcVersion, + Params: []byte("[]"), + } + self.coder.WriteResponse(msg) + self.coder.Recv() } return err diff --git a/rpc/comms/ipc_windows.go b/rpc/comms/ipc_windows.go index b2fe2b29db52..47edd9e5bc6b 100644 --- a/rpc/comms/ipc_windows.go +++ b/rpc/comms/ipc_windows.go @@ -32,6 +32,7 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rpc/codec" "github.com/ethereum/go-ethereum/rpc/shared" + "github.com/ethereum/go-ethereum/rpc/useragent" ) var ( @@ -656,13 +657,33 @@ func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) { return nil, err } - return &ipcClient{cfg.Endpoint, c, codec, codec.New(c)}, nil + coder := codec.New(c) + msg := shared.Request{ + Id: 0, + Method: useragent.EnableUserAgentMethod, + Jsonrpc: shared.JsonRpcVersion, + Params: []byte("[]"), + } + + coder.WriteResponse(msg) + coder.Recv() + + return &ipcClient{cfg.Endpoint, c, codec, coder}, nil } func (self *ipcClient) reconnect() error { c, err := Dial(self.endpoint) if err == nil { self.coder = self.codec.New(c) + + req := shared.Request{ + Id: 0, + Method: useragent.EnableUserAgentMethod, + Jsonrpc: shared.JsonRpcVersion, + Params: []byte("[]"), + } + self.coder.WriteResponse(req) + self.coder.Recv() } return err } diff --git a/rpc/jeth.go b/rpc/jeth.go index 158bfb64cbc8..757f6b7eb518 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -40,16 +40,6 @@ type Jeth struct { } func NewJeth(ethApi shared.EthereumApi, re *jsre.JSRE, client comms.EthereumClient, fe xeth.Frontend) *Jeth { - // enable the jeth as the user agent - req := shared.Request{ - Id: 0, - Method: useragent.EnableUserAgentMethod, - Jsonrpc: shared.JsonRpcVersion, - Params: []byte("[]"), - } - client.Send(&req) - client.Recv() - return &Jeth{ethApi, re, client, fe} } From 42f44dda5468000b3b2c005ec485529bc5da3674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 2 Jul 2015 19:55:18 +0300 Subject: [PATCH 03/90] eth, eth/downloader: handle header requests, table driven proto tests --- cmd/geth/main.go | 2 + cmd/utils/flags.go | 17 ++ eth/backend.go | 2 +- eth/downloader/downloader.go | 12 +- eth/fetcher/fetcher.go | 8 +- eth/fetcher/fetcher_test.go | 26 +- eth/handler.go | 263 ++++++++++++++---- eth/handler_test.go | 525 +++++++++++++++++++++++++++++++++++ eth/helper_test.go | 147 ++++++++++ eth/metrics.go | 131 +++++---- eth/peer.go | 17 ++ eth/protocol.go | 124 +++++++-- eth/protocol_test.go | 181 +++++------- ethdb/memory_database.go | 8 + 14 files changed, 1209 insertions(+), 254 deletions(-) create mode 100644 eth/handler_test.go create mode 100644 eth/helper_test.go diff --git a/cmd/geth/main.go b/cmd/geth/main.go index ff556c984ec2..dc7e19c61add 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -283,6 +283,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.DataDirFlag, utils.BlockchainVersionFlag, utils.OlympicFlag, + utils.EthVersionFlag, utils.CacheFlag, utils.JSpathFlag, utils.ListenPortFlag, @@ -333,6 +334,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso 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) } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index af2929d10266..5ebc4ea61e76 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -138,6 +138,11 @@ var ( Name: "olympic", Usage: "Use olympic style protocol", } + EthVersionFlag = cli.IntFlag{ + Name: "eth", + Value: 61, + Usage: "Highest eth protocol to advertise (temporary, dev option)", + } // miner settings MinerThreadsFlag = cli.IntFlag{ @@ -459,6 +464,18 @@ 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(eth.ProtocolVersions) > 0 && eth.ProtocolVersions[0] > uint(version) { + eth.ProtocolVersions = eth.ProtocolVersions[1:] + eth.ProtocolLengths = eth.ProtocolLengths[1:] + } + if len(eth.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) { datadir := ctx.GlobalString(DataDirFlag.Name) diff --git a/eth/backend.go b/eth/backend.go index 2b21a7c9604a..ad2a2c1f94e6 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -373,7 +373,7 @@ func New(config *Config) (*Ethereum, error) { eth.blockProcessor = core.NewBlockProcessor(chainDb, eth.pow, eth.chainManager, eth.EventMux()) eth.chainManager.SetProcessor(eth.blockProcessor) - eth.protocolManager = NewProtocolManager(config.NetworkId, eth.eventMux, eth.txPool, eth.pow, eth.chainManager) + eth.protocolManager = NewProtocolManager(config.NetworkId, eth.eventMux, eth.txPool, eth.pow, eth.chainManager, chainDb) eth.miner = miner.New(eth, eth.EventMux(), eth.pow) eth.miner.SetGasPrice(config.GasPrice) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 23d2e045e947..6a6bce6445e3 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -39,13 +39,15 @@ import ( const ( eth60 = 60 // Constant to check for old protocol support eth61 = 61 // Constant to check for new protocol support - eth62 = 62 // Constant to check for experimental 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 + 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 + MaxHeaderFetch = 256 // Amount of block headers 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 // 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 @@ -330,7 +332,7 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e if err = d.fetchBlocks60(); err != nil { return err } - case eth61, eth62: + case eth61: // New eth/61, use forward, concurrent hash and block retrieval algorithm number, err := d.findAncestor(p) if err != nil { diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 55b6c5c1c59f..07eb165dc5ec 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -69,8 +69,9 @@ 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) + time time.Time // Timestamp of the announcement origin string // Identifier of the peer originating the notification fetch blockRequesterFn // Fetcher function to retrieve @@ -152,9 +153,10 @@ 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, fetcher blockRequesterFn) error { block := &announce{ hash: hash, + number: number, time: time, origin: peer, fetch: fetcher, diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go index ecbb3f868c1f..b0d9ce843ada 100644 --- a/eth/fetcher/fetcher_test.go +++ b/eth/fetcher/fetcher_test.go @@ -194,7 +194,7 @@ func TestSequentialAnnouncements(t *testing.T) { 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) + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), fetcher) verifyImportEvent(t, imported) } verifyImportDone(t, imported) @@ -221,9 +221,9 @@ func TestConcurrentAnnouncements(t *testing.T) { 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) + tester.fetcher.Notify("first", hashes[i], 0, time.Now().Add(-arriveTimeout), wrapper) + tester.fetcher.Notify("second", hashes[i], 0, time.Now().Add(-arriveTimeout+time.Millisecond), wrapper) + tester.fetcher.Notify("second", hashes[i], 0, time.Now().Add(-arriveTimeout-time.Millisecond), wrapper) verifyImportEvent(t, imported) } @@ -252,7 +252,7 @@ func TestOverlappingAnnouncements(t *testing.T) { 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) + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), fetcher) select { case <-fetching: case <-time.After(time.Second): @@ -286,7 +286,7 @@ func TestPendingDeduplication(t *testing.T) { } // 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) + tester.fetcher.Notify("repeater", hashes[0], 0, time.Now().Add(-arriveTimeout), wrapper) time.Sleep(time.Millisecond) } time.Sleep(delay) @@ -317,12 +317,12 @@ 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) + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), fetcher) time.Sleep(time.Millisecond) } } // Finally announce the skipped entry and check full import - tester.fetcher.Notify("valid", hashes[skip], time.Now().Add(-arriveTimeout), fetcher) + tester.fetcher.Notify("valid", hashes[skip], 0, time.Now().Add(-arriveTimeout), fetcher) verifyImportCount(t, imported, len(hashes)-1) } @@ -343,7 +343,7 @@ 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) + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), fetcher) time.Sleep(time.Millisecond) } } @@ -374,7 +374,7 @@ 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) + tester.fetcher.Notify("valid", hashes[0], 0, time.Now().Add(-arriveTimeout), fetcher) <-fetching tester.fetcher.Enqueue("valid", blocks[hashes[0]]) @@ -437,9 +437,9 @@ func TestHashMemoryExhaustionAttack(t *testing.T) { // 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) + tester.fetcher.Notify("valid", hashes[len(hashes)-2-i], 0, time.Now(), valid) } - tester.fetcher.Notify("attacker", attack[i], time.Now(), attacker) + tester.fetcher.Notify("attacker", attack[i], 0, 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,7 +449,7 @@ 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) + tester.fetcher.Notify("valid", hashes[i], 0, time.Now().Add(-arriveTimeout), valid) verifyImportEvent(t, imported) } verifyImportDone(t, imported) diff --git a/eth/handler.go b/eth/handler.go index 6c1895bbd02c..25ff0eef0370 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -36,10 +36,8 @@ import ( "github.com/ethereum/go-ethereum/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 +// This is the target maximum size of returned blocks, headers or node data. +const softResponseLimit = 2 * 1024 * 1024 func errResp(code errCode, format string, v ...interface{}) error { return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) @@ -59,12 +57,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 common.Database + + downloader *downloader.Downloader + fetcher *fetcher.Fetcher + peers *peerSet SubProtocols []p2p.Protocol @@ -85,17 +84,17 @@ type ProtocolManager struct { // 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) *ProtocolManager { +func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow pow.PoW, chainman *core.ChainManager, chaindb common.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)) @@ -190,6 +189,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 { @@ -230,12 +232,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 +253,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,12 +280,10 @@ 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)) - var hashes []common.Hash - if err := msgStream.Decode(&hashes); err != nil { + if err := msg.Decode(&hashes); err != nil { break } // Deliver them all to the downloader for queuing @@ -292,7 +292,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { 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 { @@ -302,44 +302,28 @@ 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)) - 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 } @@ -352,31 +336,196 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { pm.downloader.DeliverBlocks(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 blocks 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 block satisfying the query + var origin *types.Block + if query.Origin.Hash != (common.Hash{}) { + origin = pm.chainman.GetBlock(query.Origin.Hash) + } else { + origin = pm.chainman.GetBlockByNumber(query.Origin.Number) + } + if origin == nil { + break + } + headers = append(headers, origin.Header()) + bytes += origin.Size() + + // Advance to the next block 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 block := pm.chainman.GetBlock(query.Origin.Hash); block != nil { + query.Origin.Hash = block.ParentHash() + } else { + unknown = true + break + } + } + case query.Origin.Hash != (common.Hash{}) && !query.Reverse: + // Hash based traversal towards the leaf block + if block := pm.chainman.GetBlockByNumber(origin.NumberU64() + query.Skip + 1); block != nil { + if pm.chainman.GetBlockHashesFromHash(block.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash { + query.Origin.Hash = block.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 == 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 common.StorageSize + bodies []*blockBody + ) + 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, stopping if enough was found + if block := pm.chainman.GetBlock(hash); block != nil { + bodies = append(bodies, &blockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) + bytes += block.Size() + } + } + return p.SendBlockBodies(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) + } + } + 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 { + pm.fetcher.Notify(p.id, block.Hash, block.Number, time.Now(), p.RequestBlocks) } - case NewBlockMsg: + case msg.Code == NewBlockMsg: // Retrieve and decode the propagated block var request newBlockData if err := msg.Decode(&request); err != nil { @@ -410,7 +559,7 @@ 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 { diff --git a/eth/handler_test.go b/eth/handler_test.go new file mode 100644 index 000000000000..63c94faa1249 --- /dev/null +++ b/eth/handler_test.go @@ -0,0 +1,525 @@ +package eth + +import ( + "fmt" + "math/big" + "math/rand" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" +) + +// Tests that hashes can be retrieved from a remote chain by hashes in reverse +// order. +func TestGetBlockHashes60(t *testing.T) { testGetBlockHashes(t, 60) } +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 TestGetBlockHashesFromNumber60(t *testing.T) { testGetBlockHashesFromNumber(t, 60) } +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 TestGetBlocks60(t *testing.T) { testGetBlocks(t, 60) } +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/eth/helper_test.go b/eth/helper_test.go new file mode 100644 index 000000000000..3a799e6f69ed --- /dev/null +++ b/eth/helper_test.go @@ -0,0 +1,147 @@ +// This file contains some shares testing functionality, common to multiple +// different files and modules being tested. + +package eth + +import ( + "crypto/rand" + "math/big" + "sync" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/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, 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/eth/metrics.go b/eth/metrics.go index 13745dc43d46..778747210d42 100644 --- a/eth/metrics.go +++ b/eth/metrics.go @@ -22,44 +22,53 @@ import ( ) var ( - 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/header/in/packets") - reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/header/in/traffic") - reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/header/out/packets") - reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/header/out/traffic") - reqStateInPacketsMeter = metrics.NewMeter("eth/req/state/in/packets") - reqStateInTrafficMeter = metrics.NewMeter("eth/req/state/in/traffic") - reqStateOutPacketsMeter = metrics.NewMeter("eth/req/state/out/packets") - reqStateOutTrafficMeter = metrics.NewMeter("eth/req/state/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") + 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/header/in/packets") + reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/header/in/traffic") + reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/header/out/packets") + reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/header/out/traffic") + reqBodyInPacketsMeter = metrics.NewMeter("eth/req/body/in/packets") + reqBodyInTrafficMeter = metrics.NewMeter("eth/req/body/in/traffic") + reqBodyOutPacketsMeter = metrics.NewMeter("eth/req/body/out/packets") + reqBodyOutTrafficMeter = metrics.NewMeter("eth/req/body/out/traffic") + reqStateInPacketsMeter = metrics.NewMeter("eth/req/state/in/packets") + reqStateInTrafficMeter = metrics.NewMeter("eth/req/state/in/traffic") + reqStateOutPacketsMeter = metrics.NewMeter("eth/req/state/out/packets") + reqStateOutTrafficMeter = metrics.NewMeter("eth/req/state/out/traffic") + reqReceiptInPacketsMeter = metrics.NewMeter("eth/req/receipt/in/packets") + reqReceiptInTrafficMeter = metrics.NewMeter("eth/req/receipt/in/traffic") + reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipt/out/packets") + reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipt/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 + 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 @@ -68,7 +77,13 @@ func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter { if !metrics.Enabled { return rw } - return &meteredMsgReadWriter{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) { @@ -79,20 +94,27 @@ func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { } // Account for the data traffic packets, traffic := miscInPacketsMeter, miscInTrafficMeter - switch msg.Code { - case BlockHashesMsg: + switch { + case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlockHashesMsg: packets, traffic = reqHashInPacketsMeter, reqHashInTrafficMeter - case BlocksMsg: + case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlocksMsg: packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter - case BlockHeadersMsg: - packets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter - case NodeDataMsg: + + 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 NewBlockHashesMsg: + case rw.version == eth63 && msg.Code == ReceiptsMsg: + packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter + + case msg.Code == NewBlockHashesMsg: packets, traffic = propHashInPacketsMeter, propHashInTrafficMeter - case NewBlockMsg: + case msg.Code == NewBlockMsg: packets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter - case TxMsg: + case msg.Code == TxMsg: packets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter } packets.Mark(1) @@ -104,20 +126,27 @@ func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error { // Account for the data traffic packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter - switch msg.Code { - case BlockHashesMsg: + switch { + case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlockHashesMsg: packets, traffic = reqHashOutPacketsMeter, reqHashOutTrafficMeter - case BlocksMsg: + case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlocksMsg: packets, traffic = reqBlockOutPacketsMeter, reqBlockOutTrafficMeter - case BlockHeadersMsg: + + case rw.version == eth62 && msg.Code == BlockHeadersMsg: packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter - case NodeDataMsg: + case rw.version == eth62 && msg.Code == BlockBodiesMsg: + packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter + + case rw.version == eth63 && msg.Code == NodeDataMsg: packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter - case NewBlockHashesMsg: + case rw.version == eth63 && msg.Code == ReceiptsMsg: + packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter + + case msg.Code == NewBlockHashesMsg: packets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter - case NewBlockMsg: + case msg.Code == NewBlockMsg: packets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter - case TxMsg: + case msg.Code == TxMsg: packets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter } packets.Mark(1) diff --git a/eth/peer.go b/eth/peer.go index c17cdfca781a..78de8a9d34cd 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -165,12 +165,23 @@ 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)) +} + // 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 { @@ -205,6 +216,12 @@ func (p *peer) RequestNodeData(hashes []common.Hash) error { 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\n", 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 { diff --git a/eth/protocol.go b/eth/protocol.go index fcc5f21e2e91..c16223ccf53c 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -17,17 +17,29 @@ package eth import ( + "fmt" + "io" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" +) + +// Constants to match up protocol versions and messages +const ( + eth60 = 60 + eth61 = 61 + eth62 = 62 + eth63 = 63 + eth64 = 64 ) // Supported versions of the eth protocol (first is primary). -var ProtocolVersions = []uint{62, 61, 60} +var ProtocolVersions = []uint{eth64, eth63, eth62, eth61, eth60} // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{13, 9, 8} +var ProtocolLengths = []uint64{15, 12, 8, 9, 8} const ( NetworkId = 1 @@ -37,23 +49,38 @@ const ( // eth protocol message codes const ( // Protocol messages belonging to eth/60 - StatusMsg = iota - NewBlockHashesMsg - TxMsg - GetBlockHashesMsg - BlockHashesMsg - GetBlocksMsg - BlocksMsg - NewBlockMsg - - // Protocol messages belonging to eth/61 - GetBlockHashesFromNumberMsg - - // Protocol messages belonging to eth/62 - GetBlockHeadersMsg - BlockHeadersMsg - GetNodeDataMsg - NodeDataMsg + StatusMsg = 0x00 + NewBlockHashesMsg = 0x01 + TxMsg = 0x02 + GetBlockHashesMsg = 0x03 + BlockHashesMsg = 0x04 + GetBlocksMsg = 0x05 + BlocksMsg = 0x06 + NewBlockMsg = 0x07 + + // Protocol messages belonging to eth/61 (extension of eth/60) + 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 @@ -111,6 +138,12 @@ type statusData struct { GenesisBlock common.Hash } +// 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 @@ -124,12 +157,65 @@ type getBlockHashesFromNumberData struct { 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/eth/protocol_test.go b/eth/protocol_test.go index 08c9b6a06385..263088099d22 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -18,19 +18,16 @@ package eth import ( "crypto/rand" - "math/big" + "fmt" "sync" "testing" "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/rlp" ) func init() { @@ -40,8 +37,15 @@ 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 TestStatusMsgErrors60(t *testing.T) { testStatusMsgErrors(t, 60) } +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 +60,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 +93,21 @@ func TestStatusMsgErrors(t *testing.T) { } // This test checks that received transactions are added to the local pool. -func TestRecvTransactions(t *testing.T) { +func TestRecvTransactions60(t *testing.T) { testRecvTransactions(t, 60) } +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 +123,21 @@ func TestRecvTransactions(t *testing.T) { } // This test checks that pending transactions are sent. -func TestSendTransactions(t *testing.T) { - pm := newProtocolManagerForTesting(nil) +func TestSendTransactions60(t *testing.T) { testSendTransactions(t, 60) } +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 +152,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 +176,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) - } - if err := p2p.Send(p, StatusMsg, msg); err != nil { - t.Fatalf("status send: %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) } -} - -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/ethdb/memory_database.go b/ethdb/memory_database.go index 70b03dfade66..d50f8f9d4476 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -49,6 +49,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")) From ca88e18f59af84f34ad67da21fd27a6407eea87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 14 Aug 2015 17:48:26 +0300 Subject: [PATCH 04/90] eth: kill off protocol eth/60 in preparation for eth/62 --- eth/downloader/downloader.go | 397 +----------------------------- eth/downloader/downloader_test.go | 380 +--------------------------- eth/handler_test.go | 3 - eth/metrics.go | 24 +- eth/protocol.go | 25 +- eth/protocol_test.go | 3 - 6 files changed, 28 insertions(+), 804 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 6a6bce6445e3..b28879ee674d 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -18,11 +18,9 @@ package downloader import ( - "bytes" "errors" "math" "math/big" - "math/rand" "sync" "sync/atomic" "time" @@ -37,8 +35,8 @@ import ( ) 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 ( @@ -324,16 +322,8 @@ 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, eth/%d", p.id, p.version) switch p.version { - case eth60: - // Old eth/60 version, use reverse hash retrieval algorithm - if err = d.fetchHashes60(p, hash); err != nil { - return err - } - if err = d.fetchBlocks60(); err != nil { - return err - } case eth61: - // New eth/61, use forward, concurrent hash and block retrieval algorithm + // Old eth/61, use forward, concurrent hash and block retrieval algorithm number, err := d.findAncestor(p) if err != nil { return err @@ -355,8 +345,6 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e glog.V(logger.Error).Infof("Unsupported eth protocol: %d", p.version) return errBadPeer } - glog.V(logger.Debug).Infoln("Synchronization completed") - return nil } @@ -385,299 +373,6 @@ 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. - - getHashes := func(from common.Hash) { - go active.getRelHashes(from) - timeout.Reset(hashTTL) - } - - // 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; { - 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 -} - -// 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() - - // 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.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 - } - // 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) - } - } - // 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 - } - - } 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 - } - } - } - 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 // 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. @@ -1023,92 +718,6 @@ func (d *Downloader) fetchBlocks(from uint64) error { } } -// 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) - for { - select { - case <-d.cancelCh: - return errCancelBlockFetch - - case <-timeout: - return errTimeout - - case <-d.hashCh: - // Out of bounds hashes received, ignore them - - case blockPack := <-d.blockCh: - blocks := blockPack.blocks - - // 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 - } - } -} - // process takes blocks from the queue and tries to import them into the chain. // // The algorithmic flow is as follows: diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 61fc7827b608..7e3456433d33 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -17,7 +17,6 @@ package downloader import ( - "crypto/rand" "errors" "fmt" "math/big" @@ -215,11 +214,6 @@ func (dl *downloadTester) peerGetRelHashesFn(id string, delay time.Duration) fun // 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 eth/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 return func(head uint64, count int) error { time.Sleep(delay) @@ -261,24 +255,6 @@ func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([ } } -// 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) - - tester := newTester() - tester.newPeer("peer", eth60, hashes, blocks) - - // 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 imported := len(tester.ownBlocks); imported != targetBlocks+1 { - t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) - } -} - // 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. @@ -301,7 +277,6 @@ 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 testThrottling(t *testing.T, protocol int) { @@ -400,7 +375,6 @@ func TestInactiveDownloader(t *testing.T) { } // 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 testCancel(t *testing.T, protocol int) { @@ -432,7 +406,6 @@ func testCancel(t *testing.T, protocol int) { } // 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 testMultiSynchronisation(t *testing.T, protocol int) { @@ -463,355 +436,6 @@ 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() - - // Create a batch of blocks, with a slow and a full speed peer - targetCycles := 2 - targetBlocks := targetCycles*blockCacheLimit - 15 - targetIODelay := time.Second - hashes, blocks := makeChain(targetBlocks, 0, genesis) - - tester.newSlowPeer("fast", eth60, hashes, blocks, 0) - tester.newSlowPeer("slow", eth60, hashes, blocks, targetIODelay) - - // Try to sync with the peers (pull hashes from fast) - start := time.Now() - if err := tester.sync("fast", 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) - } -} - -// 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() - - // Forge a single-link chain with a forged header - hashes, blocks := makeChain(1, 0, genesis) - tester.newPeer("valid", eth60, hashes, blocks) - - 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) - - // 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") - } - 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 { - 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]]) - } -} - -// 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") - } - } - // 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 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) - - 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) - } -} - -// 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) - - // 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) - } - // 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 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) - } -} - -// 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 - - blockSoftTTL = 100 * time.Millisecond - crossCheckCycle = 25 * time.Millisecond - - // 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) - } -} - -// 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) - } - // 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 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) - - // 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 - - if err := tester.sync("valid", nil); err != nil { - t.Fatalf("failed to synchronise blocks: %v", err) - } -} - -// 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) - - 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 { - 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 len(tester.ownHashes) != len(hashes) { - t.Fatalf("chain length mismatch: have %v, want %v", len(tester.ownHashes), len(hashes)) - } -} - // 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) { @@ -850,7 +474,7 @@ func TestHashAttackerDropping(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{genesis.Hash()}, nil); err != nil { + if err := tester.newPeer(id, eth61, []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 { @@ -882,7 +506,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, eth61, []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 { diff --git a/eth/handler_test.go b/eth/handler_test.go index 63c94faa1249..6400d4e7898b 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -19,7 +19,6 @@ import ( // Tests that hashes can be retrieved from a remote chain by hashes in reverse // order. -func TestGetBlockHashes60(t *testing.T) { testGetBlockHashes(t, 60) } func TestGetBlockHashes61(t *testing.T) { testGetBlockHashes(t, 61) } func testGetBlockHashes(t *testing.T, protocol int) { @@ -63,7 +62,6 @@ func testGetBlockHashes(t *testing.T, protocol int) { // Tests that hashes can be retrieved from a remote chain by numbers in forward // order. -func TestGetBlockHashesFromNumber60(t *testing.T) { testGetBlockHashesFromNumber(t, 60) } func TestGetBlockHashesFromNumber61(t *testing.T) { testGetBlockHashesFromNumber(t, 61) } func testGetBlockHashesFromNumber(t *testing.T, protocol int) { @@ -104,7 +102,6 @@ func testGetBlockHashesFromNumber(t *testing.T, protocol int) { } // Tests that blocks can be retrieved from a remote chain based on their hashes. -func TestGetBlocks60(t *testing.T) { testGetBlocks(t, 60) } func TestGetBlocks61(t *testing.T) { testGetBlocks(t, 61) } func testGetBlocks(t *testing.T, protocol int) { diff --git a/eth/metrics.go b/eth/metrics.go index 778747210d42..21002094c876 100644 --- a/eth/metrics.go +++ b/eth/metrics.go @@ -95,19 +95,19 @@ func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { // Account for the data traffic packets, traffic := miscInPacketsMeter, miscInTrafficMeter switch { - case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlockHashesMsg: + case rw.version < eth62 && msg.Code == BlockHashesMsg: packets, traffic = reqHashInPacketsMeter, reqHashInTrafficMeter - case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlocksMsg: + case rw.version < eth62 && msg.Code == BlocksMsg: packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter - case rw.version == eth62 && msg.Code == BlockHeadersMsg: + case rw.version >= eth62 && msg.Code == BlockHeadersMsg: packets, traffic = reqBlockInPacketsMeter, reqBlockInTrafficMeter - case rw.version == eth62 && msg.Code == BlockBodiesMsg: + case rw.version >= eth62 && msg.Code == BlockBodiesMsg: packets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter - case rw.version == eth63 && msg.Code == NodeDataMsg: + case rw.version >= eth63 && msg.Code == NodeDataMsg: packets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter - case rw.version == eth63 && msg.Code == ReceiptsMsg: + case rw.version >= eth63 && msg.Code == ReceiptsMsg: packets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter case msg.Code == NewBlockHashesMsg: @@ -127,19 +127,19 @@ func (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error { // Account for the data traffic packets, traffic := miscOutPacketsMeter, miscOutTrafficMeter switch { - case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlockHashesMsg: + case rw.version < eth62 && msg.Code == BlockHashesMsg: packets, traffic = reqHashOutPacketsMeter, reqHashOutTrafficMeter - case (rw.version == eth60 || rw.version == eth61) && msg.Code == BlocksMsg: + case rw.version < eth62 && msg.Code == BlocksMsg: packets, traffic = reqBlockOutPacketsMeter, reqBlockOutTrafficMeter - case rw.version == eth62 && msg.Code == BlockHeadersMsg: + case rw.version >= eth62 && msg.Code == BlockHeadersMsg: packets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter - case rw.version == eth62 && msg.Code == BlockBodiesMsg: + case rw.version >= eth62 && msg.Code == BlockBodiesMsg: packets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter - case rw.version == eth63 && msg.Code == NodeDataMsg: + case rw.version >= eth63 && msg.Code == NodeDataMsg: packets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter - case rw.version == eth63 && msg.Code == ReceiptsMsg: + case rw.version >= eth63 && msg.Code == ReceiptsMsg: packets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter case msg.Code == NewBlockHashesMsg: diff --git a/eth/protocol.go b/eth/protocol.go index c16223ccf53c..49f096a3b230 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -28,7 +28,6 @@ import ( // Constants to match up protocol versions and messages const ( - eth60 = 60 eth61 = 61 eth62 = 62 eth63 = 63 @@ -36,10 +35,10 @@ const ( ) // Supported versions of the eth protocol (first is primary). -var ProtocolVersions = []uint{eth64, eth63, eth62, eth61, eth60} +var ProtocolVersions = []uint{eth64, eth63, eth62, eth61} // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{15, 12, 8, 9, 8} +var ProtocolLengths = []uint64{15, 12, 8, 9} const ( NetworkId = 1 @@ -48,17 +47,15 @@ const ( // eth protocol message codes const ( - // Protocol messages belonging to eth/60 - StatusMsg = 0x00 - NewBlockHashesMsg = 0x01 - TxMsg = 0x02 - GetBlockHashesMsg = 0x03 - BlockHashesMsg = 0x04 - GetBlocksMsg = 0x05 - BlocksMsg = 0x06 - NewBlockMsg = 0x07 - - // Protocol messages belonging to eth/61 (extension of eth/60) + // 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) diff --git a/eth/protocol_test.go b/eth/protocol_test.go index 263088099d22..bc3b5acfc347 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -38,7 +38,6 @@ func init() { var testAccount = crypto.NewKey(rand.Reader) // Tests that handshake failures are detected and reported correctly. -func TestStatusMsgErrors60(t *testing.T) { testStatusMsgErrors(t, 60) } func TestStatusMsgErrors61(t *testing.T) { testStatusMsgErrors(t, 61) } func TestStatusMsgErrors62(t *testing.T) { testStatusMsgErrors(t, 62) } func TestStatusMsgErrors63(t *testing.T) { testStatusMsgErrors(t, 63) } @@ -93,7 +92,6 @@ func testStatusMsgErrors(t *testing.T, protocol int) { } // This test checks that received transactions are added to the local pool. -func TestRecvTransactions60(t *testing.T) { testRecvTransactions(t, 60) } func TestRecvTransactions61(t *testing.T) { testRecvTransactions(t, 61) } func TestRecvTransactions62(t *testing.T) { testRecvTransactions(t, 62) } func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) } @@ -123,7 +121,6 @@ func testRecvTransactions(t *testing.T, protocol int) { } // This test checks that pending transactions are sent. -func TestSendTransactions60(t *testing.T) { testSendTransactions(t, 60) } func TestSendTransactions61(t *testing.T) { testSendTransactions(t, 61) } func TestSendTransactions62(t *testing.T) { testSendTransactions(t, 62) } func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) } From 7324176f702a77fc331bf16a968d2eb4bccce021 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 24 Aug 2015 02:52:53 +0200 Subject: [PATCH 05/90] Add tests for uncle timestamps and refactor timestamp type --- cmd/evm/main.go | 6 +- core/block_processor.go | 20 +- core/block_processor_test.go | 4 +- core/chain_makers.go | 11 +- core/chain_manager.go | 3 +- core/error.go | 7 +- core/genesis.go | 2 +- core/types/block.go | 9 +- core/types/block_test.go | 2 +- core/vm/environment.go | 2 +- core/vm/instructions.go | 2 +- core/vm/jit_test.go | 2 +- core/vm/vm.go | 2 +- core/vm_env.go | 2 +- eth/handler.go | 2 +- miner/worker.go | 10 +- tests/block_test.go | 7 + tests/block_test_util.go | 6 +- tests/files/BlockchainTests/bcUncleTest.json | 315 ++++++++++++++++++- tests/util.go | 6 +- xeth/types.go | 3 +- 21 files changed, 380 insertions(+), 43 deletions(-) diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 6639069b9905..243dd6266979 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -166,7 +166,7 @@ type VMEnv struct { depth int Gas *big.Int - time uint64 + time *big.Int logs []vm.StructLog } @@ -175,7 +175,7 @@ func NewEnv(state *state.StateDB, transactor common.Address, value *big.Int) *VM state: state, transactor: &transactor, value: value, - time: uint64(time.Now().Unix()), + time: big.NewInt(time.Now().Unix()), } } @@ -183,7 +183,7 @@ func (self *VMEnv) State() *state.StateDB { return self.state } func (self *VMEnv) Origin() common.Address { return *self.transactor } func (self *VMEnv) BlockNumber() *big.Int { return common.Big0 } func (self *VMEnv) Coinbase() common.Address { return *self.transactor } -func (self *VMEnv) Time() uint64 { return self.time } +func (self *VMEnv) Time() *big.Int { return self.time } func (self *VMEnv) Difficulty() *big.Int { return common.Big1 } func (self *VMEnv) BlockHash() []byte { return make([]byte, 32) } func (self *VMEnv) Value() *big.Int { return self.value } diff --git a/core/block_processor.go b/core/block_processor.go index dd7fe8962c33..99d27fa7178b 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -203,7 +203,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st txs := block.Transactions() // Block validation - if err = ValidateHeader(sm.Pow, header, parent, false); err != nil { + if err = ValidateHeader(sm.Pow, header, parent, false, false); err != nil { return } @@ -327,7 +327,7 @@ 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); err != nil { + if err := ValidateHeader(sm.Pow, uncle, ancestors[uncle.ParentHash], true, true); err != nil { return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err)) } } @@ -358,19 +358,25 @@ 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 bool) error { +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)) } - if block.Time > uint64(time.Now().Unix()) { - return BlockFutureErr + if uncle { + if block.Time.Cmp(common.MaxBig) == 1 { + return BlockTSTooBigErr + } + } else { + if block.Time.Cmp(big.NewInt(time.Now().Unix())) == 1 { + return BlockFutureErr + } } - if block.Time <= parent.Time() { + if block.Time.Cmp(parent.Time()) != 1 { return BlockEqualTSErr } - expd := CalcDifficulty(block.Time, parent.Time(), parent.Number(), parent.Difficulty()) + 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) } diff --git a/core/block_processor_test.go b/core/block_processor_test.go index 4525f417bf78..e0b2d3313fc0 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -48,13 +48,13 @@ 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) + err := ValidateHeader(pow, header, chain.Genesis(), 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) + err = ValidateHeader(pow, header, chain.Genesis(), 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 0bb1df95a8fb..b009e0c28ca6 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -166,16 +166,21 @@ func GenerateChain(parent *types.Block, db common.Database, n int, gen func(int, } func makeHeader(parent *types.Block, state *state.StateDB) *types.Header { - time := parent.Time() + 10 // block time is fixed at 10 seconds + var time *big.Int + if parent.Time() == nil { + time = big.NewInt(10) + } else { + time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds + } return &types.Header{ Root: state.Root(), ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), - Difficulty: CalcDifficulty(time, parent.Time(), parent.Number(), parent.Difficulty()), + Difficulty: CalcDifficulty(time.Uint64(), new(big.Int).Sub(time, big.NewInt(10)).Uint64(), parent.Number(), parent.Difficulty()), GasLimit: CalcGasLimit(parent), GasUsed: new(big.Int), Number: new(big.Int).Add(parent.Number(), common.Big1), - Time: uint64(time), + Time: time, } } diff --git a/core/chain_manager.go b/core/chain_manager.go index cf5b8bd78bbd..c8127951ea55 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -596,7 +596,8 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { // Allow up to MaxFuture second in the future blocks. If this limit // is exceeded the chain is discarded and processed at a later time // if given. - if max := uint64(time.Now().Unix()) + maxTimeFutureBlocks; block.Time() > max { + max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks) + if block.Time().Cmp(max) == 1 { return i, fmt.Errorf("%v: BlockFutureErr, %v > %v", BlockFutureErr, block.Time(), max) } diff --git a/core/error.go b/core/error.go index 5e6ff4de7f3c..09eea22d6da5 100644 --- a/core/error.go +++ b/core/error.go @@ -25,9 +25,10 @@ import ( ) var ( - BlockNumberErr = errors.New("block number invalid") - BlockFutureErr = errors.New("block time is in the future") - BlockEqualTSErr = errors.New("block time stamp equal to previous") + BlockNumberErr = errors.New("block number invalid") + BlockFutureErr = errors.New("block time is in the future") + BlockTSTooBigErr = errors.New("block time too big") + BlockEqualTSErr = errors.New("block time stamp equal to previous") ) // Parent error. In case a parent is unknown this error will be thrown diff --git a/core/genesis.go b/core/genesis.go index 97afb3a4aebf..7d4e03c990ce 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -73,7 +73,7 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, difficulty := common.String2Big(genesis.Difficulty) block := types.NewBlock(&types.Header{ Nonce: types.EncodeNonce(common.String2Big(genesis.Nonce).Uint64()), - Time: common.String2Big(genesis.Timestamp).Uint64(), + Time: common.String2Big(genesis.Timestamp), ParentHash: common.HexToHash(genesis.ParentHash), Extra: common.FromHex(genesis.ExtraData), GasLimit: common.String2Big(genesis.GasLimit), diff --git a/core/types/block.go b/core/types/block.go index 427a3e6cb3bc..2188e6d4da8e 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -60,7 +60,7 @@ type Header struct { Number *big.Int // The block number GasLimit *big.Int // Gas limit GasUsed *big.Int // Gas used - Time uint64 // Creation time + Time *big.Int // Creation time Extra []byte // Extra data MixDigest common.Hash // for quick difficulty verification Nonce BlockNonce @@ -94,7 +94,7 @@ func (h *Header) UnmarshalJSON(data []byte) error { Coinbase string Difficulty string GasLimit string - Time uint64 + Time *big.Int Extra string } dec := json.NewDecoder(bytes.NewReader(data)) @@ -210,6 +210,9 @@ func NewBlockWithHeader(header *Header) *Block { func copyHeader(h *Header) *Header { cpy := *h + if cpy.Time = new(big.Int); h.Time != nil { + cpy.Time.Set(h.Time) + } if cpy.Difficulty = new(big.Int); h.Difficulty != nil { cpy.Difficulty.Set(h.Difficulty) } @@ -301,13 +304,13 @@ func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number) func (b *Block) GasLimit() *big.Int { return new(big.Int).Set(b.header.GasLimit) } func (b *Block) GasUsed() *big.Int { return new(big.Int).Set(b.header.GasUsed) } func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) } +func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } func (b *Block) Nonce() uint64 { return binary.BigEndian.Uint64(b.header.Nonce[:]) } func (b *Block) Bloom() Bloom { return b.header.Bloom } func (b *Block) Coinbase() common.Address { return b.header.Coinbase } -func (b *Block) Time() uint64 { return b.header.Time } func (b *Block) Root() common.Hash { return b.header.Root } func (b *Block) ParentHash() common.Hash { return b.header.ParentHash } func (b *Block) TxHash() common.Hash { return b.header.TxHash } diff --git a/core/types/block_test.go b/core/types/block_test.go index aebb6328bd4b..cdd8431f4dd6 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -47,7 +47,7 @@ func TestBlockEncoding(t *testing.T) { check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e")) check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) - check("Time", block.Time(), uint64(1426516743)) + check("Time", block.Time(), big.NewInt(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), big.NewInt(50000), big.NewInt(10), nil) diff --git a/core/vm/environment.go b/core/vm/environment.go index 5a1bf320100e..916081f5132d 100644 --- a/core/vm/environment.go +++ b/core/vm/environment.go @@ -33,7 +33,7 @@ type Environment interface { BlockNumber() *big.Int GetHash(n uint64) common.Hash Coinbase() common.Address - Time() uint64 + Time() *big.Int Difficulty() *big.Int GasLimit() *big.Int CanTransfer(from Account, balance *big.Int) bool diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 2de35a44307d..aa0117cc856e 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -341,7 +341,7 @@ func opCoinbase(instr instruction, env Environment, context *Context, memory *Me } func opTimestamp(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) { - stack.push(U256(new(big.Int).SetUint64(env.Time()))) + stack.push(U256(new(big.Int).Set(env.Time()))) } func opNumber(instr instruction, env Environment, context *Context, memory *Memory, stack *stack) { diff --git a/core/vm/jit_test.go b/core/vm/jit_test.go index b9e2c699999f..d8e442637960 100644 --- a/core/vm/jit_test.go +++ b/core/vm/jit_test.go @@ -93,7 +93,7 @@ func (self *Env) StructLogs() []StructLog { //func (self *Env) PrevHash() []byte { return self.parent } func (self *Env) Coinbase() common.Address { return common.Address{} } -func (self *Env) Time() uint64 { return uint64(time.Now().Unix()) } +func (self *Env) Time() *big.Int { return big.NewInt(time.Now().Unix()) } func (self *Env) Difficulty() *big.Int { return big.NewInt(0) } func (self *Env) State() *state.StateDB { return nil } func (self *Env) GasLimit() *big.Int { return self.gasLimit } diff --git a/core/vm/vm.go b/core/vm/vm.go index da764004ad78..d9e1a0ce506e 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -491,7 +491,7 @@ func (self *Vm) Run(context *Context, input []byte) (ret []byte, err error) { case TIMESTAMP: time := self.env.Time() - stack.push(new(big.Int).SetUint64(time)) + stack.push(new(big.Int).Set(time)) case NUMBER: number := self.env.BlockNumber() diff --git a/core/vm_env.go b/core/vm_env.go index 719829543799..a08f024fe728 100644 --- a/core/vm_env.go +++ b/core/vm_env.go @@ -49,7 +49,7 @@ func NewEnv(state *state.StateDB, chain *ChainManager, msg Message, header *type func (self *VMEnv) Origin() common.Address { f, _ := self.msg.From(); return f } func (self *VMEnv) BlockNumber() *big.Int { return self.header.Number } func (self *VMEnv) Coinbase() common.Address { return self.header.Coinbase } -func (self *VMEnv) Time() uint64 { return self.header.Time } +func (self *VMEnv) Time() *big.Int { return self.header.Time } func (self *VMEnv) Difficulty() *big.Int { return self.header.Difficulty } func (self *VMEnv) GasLimit() *big.Int { return self.header.GasLimit } func (self *VMEnv) Value() *big.Int { return self.msg.Value() } diff --git a/eth/handler.go b/eth/handler.go index 5d233dd968a4..4f3d1f34cff6 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -117,7 +117,7 @@ func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow po manager.downloader = downloader.New(manager.eventMux, manager.chainman.HasBlock, manager.chainman.GetBlock, manager.chainman.CurrentBlock, manager.chainman.InsertChain, manager.removePeer) validator := func(block *types.Block, parent *types.Block) error { - return core.ValidateHeader(pow, block.Header(), parent, true) + return core.ValidateHeader(pow, block.Header(), parent, true, false) } heighter := func() uint64 { return manager.chainman.CurrentBlock().NumberU64() diff --git a/miner/worker.go b/miner/worker.go index aa2132a51ca1..86970ec07193 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -278,7 +278,7 @@ func (self *worker) wait() { glog.V(logger.Error).Infoln("Invalid block found during mining") continue } - if err := core.ValidateHeader(self.eth.BlockProcessor().Pow, block.Header(), parent, true); err != nil && err != core.BlockFutureErr { + if err := core.ValidateHeader(self.eth.BlockProcessor().Pow, block.Header(), parent, true, false); err != nil && err != core.BlockFutureErr { glog.V(logger.Error).Infoln("Invalid header on mined block:", err) continue } @@ -434,8 +434,8 @@ func (self *worker) commitNewWork() { tstart := time.Now() parent := self.chain.CurrentBlock() tstamp := tstart.Unix() - if tstamp <= int64(parent.Time()) { - tstamp = int64(parent.Time()) + 1 + if parent.Time().Cmp(new(big.Int).SetInt64(tstamp)) != 1 { + tstamp = parent.Time().Int64() + 1 } // this will ensure we're not going off too far in the future if now := time.Now().Unix(); tstamp > now+4 { @@ -448,12 +448,12 @@ func (self *worker) commitNewWork() { header := &types.Header{ ParentHash: parent.Hash(), Number: num.Add(num, common.Big1), - Difficulty: core.CalcDifficulty(uint64(tstamp), parent.Time(), parent.Number(), parent.Difficulty()), + Difficulty: core.CalcDifficulty(uint64(tstamp), parent.Time().Uint64(), parent.Number(), parent.Difficulty()), GasLimit: core.CalcGasLimit(parent), GasUsed: new(big.Int), Coinbase: self.coinbase, Extra: self.extra, - Time: uint64(tstamp), + Time: big.NewInt(tstamp), } previous := self.current diff --git a/tests/block_test.go b/tests/block_test.go index f42b474b7260..b0db5fe56819 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -35,6 +35,13 @@ func TestBcUncleHeaderValidityTests(t *testing.T) { } } +func TestBcUncleTests(t *testing.T) { + err := RunBlockTest(filepath.Join(blockTestDir, "bcUncleTest.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 d47c2b101d28..2090afce719e 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -365,8 +365,8 @@ func (s *BlockTest) validateBlockHeader(h *btHeader, h2 *types.Header) error { return fmt.Errorf("GasUsed: expected: %v, decoded: %v", expectedGasUsed, h2.GasUsed) } - expectedTimestamp := mustConvertUint(h.Timestamp, 16) - if expectedTimestamp != h2.Time { + expectedTimestamp := mustConvertBigInt(h.Timestamp, 16) + if expectedTimestamp.Cmp(h2.Time) != 0 { return fmt.Errorf("Timestamp: expected: %v, decoded: %v", expectedTimestamp, h2.Time) } @@ -461,7 +461,7 @@ func mustConvertHeader(in btHeader) *types.Header { GasUsed: mustConvertBigInt(in.GasUsed, 16), GasLimit: mustConvertBigInt(in.GasLimit, 16), Difficulty: mustConvertBigInt(in.Difficulty, 16), - Time: mustConvertUint(in.Timestamp, 16), + Time: mustConvertBigInt(in.Timestamp, 16), Nonce: types.EncodeNonce(mustConvertUint(in.Nonce, 16)), } return header diff --git a/tests/files/BlockchainTests/bcUncleTest.json b/tests/files/BlockchainTests/bcUncleTest.json index bd6326a8895e..0d0e83c0c168 100755 --- a/tests/files/BlockchainTests/bcUncleTest.json +++ b/tests/files/BlockchainTests/bcUncleTest.json @@ -4543,5 +4543,318 @@ } } } + }, + "uncleTimestampTooBig" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "6bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130e", + "mixHash" : "fefce638471ab6b66b1f1423ae574a99a6b2137229fe1846c508554d718d2bc1", + "nonce" : "f8cf2912afdd244d", + "number" : "0x01", + "parentHash" : "b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2", + "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0x55d9d69f", + "transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf90261f901f9a0b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455d9d69f80a0fefce638471ab6b66b1f1423ae574a99a6b2137229fe1846c508554d718d2bc188f8cf2912afdd244df862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0", + "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" : "4c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3f", + "mixHash" : "3449cf46635bab4ae7121dcd145e6ca12ac4337f79e88354c41bff1c48335b48", + "nonce" : "4376da5cd48ffb68", + "number" : "0x02", + "parentHash" : "6bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130e", + "receiptTrie" : "5ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6b", + "stateRoot" : "e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70e", + "timestamp" : "0x55d9d6a1", + "transactionsTrie" : "c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf90260f901f9a06bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70ea0c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5a05ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88252088455d9d6a180a03449cf46635bab4ae7121dcd145e6ca12ac4337f79e88354c41bff1c48335b48884376da5cd48ffb68f861f85f01018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f239f1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cfc0", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x01", + "r" : "0x33c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f23", + "s" : "0x1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cf", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1b", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + ] + }, + { + "rlp" : "0xf90459f901f9a04c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3fa0f4fd3b99eb9b343e87bc472fdcd6b18e5cbcb231b1e70f8948e97b02c008ac26948888f1f195afa192cfee860698584c030f4c9db1a0e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07dea01722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1aa04ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920afb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd88252088455d9d6a680a0caf6f553d8c1394d291caaeabc61bc25f9126f4c313c829b2a51134cbd23d27188e6999e52421f5a38f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca015eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0eea05d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38f901f6f901f3a06bd328a10bb674cc758bd1bccb8afb584808766434c28b85580b422c75d4130ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcde5374fce5edbc8e2a8697c15331677e6ebf0ba0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000002832fefd8808080a077355633b05269548d6b3bd8e80d334fcb1a31c566b980dfc56eb57d5c16acc388846c622f81a727e7" + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "b964d0b68e5a3c7265e4087dc2a8aaf599f06b6d6c1316a1b1b6475587f569e2", + "mixHash" : "b65f3c17c458ce015c087c3e4c0ffeeb010bf648a1faa2585c674d81ea7dcdfd", + "nonce" : "0b2ec3394d2421e3", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0b65f3c17c458ce015c087c3e4c0ffeeb010bf648a1faa2585c674d81ea7dcdfd880b2ec3394d2421e3c0c0", + "lastblockhash" : "4c179927c9b9897464c7133033b412c9b66ee2bb1fa4a4b2595a6006d4081e3f", + "postState" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x14", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x8ac7230489e8a410", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e71fbdc", + "code" : "0x", + "nonce" : "0x02", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e72a000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "uncleTimestampMaxUint256" : { + "blocks" : [ + { + "blockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x5208", + "hash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a", + "mixHash" : "4296af28ea723598c959f1cabc6f01fa0c75d126cfde89f13ccd9debcf3079c3", + "nonce" : "3213b3fd7789f5d5", + "number" : "0x01", + "parentHash" : "e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264", + "receiptTrie" : "e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0x55d9c571", + "transactionsTrie" : "5c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf90261f901f9a0e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a05c9151c2413d1cd25c51ffb4ac38948acc1359bf08c6b49f283660e9bcf0f516a0e9244cf7503b79c03d3a099e07a80d2dbc77bb0b502d8a89d51ac0d68dd31313b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000001832fefd88252088455d9c57180a04296af28ea723598c959f1cabc6f01fa0c75d126cfde89f13ccd9debcf3079c3883213b3fd7789f5d5f862f86080018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba077c7cd36820c71821c1aed59de46e70e701c4a8dd89c9ba508ab722210f60da8a03f29825d40c7c3f7bff3ca69267e0f3fb74b2d18b8c2c4e3c135b5d3b06e288dc0", + "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" : "04e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89", + "mixHash" : "782e9bf4a3427dee8cf2494f966830dd04a217eb5cf8769dba0ed6400212264f", + "nonce" : "e83b4878a0b9a46f", + "number" : "0x02", + "parentHash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a", + "receiptTrie" : "5ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6b", + "stateRoot" : "e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70e", + "timestamp" : "0x55d9c573", + "transactionsTrie" : "c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "rlp" : "0xf90260f901f9a019c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a0e7e4760f75476ec7f51869d8bdce5c693058fd5a95c77ea9c0bf7ced1e50d70ea0c673e076264c4669a5c2e479f1757b78e42511efe33b5fd2c0a23b929c7f87f5a05ea1a8b24652fed0ecab4738edd9211891eb8c4353c345973b78a02cc0f32f6bb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd88252088455d9c57380a0782e9bf4a3427dee8cf2494f966830dd04a217eb5cf8769dba0ed6400212264f88e83b4878a0b9a46ff861f85f01018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba033c86e64d708c97c6b135cadff79dbf45985aa0b53694789e90d15f756765f239f1d0f8caa2a16405148c9d85581be5814960010f3cba938b5501590cea1f7cfc0", + "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" : "eed1b4da708283370856fc76352d68f36d9766b7f366da372e2992ced9a1f663", + "mixHash" : "c250fe02a675a64e068023f48df2662ff2269d970f7689bde287228e200d5401", + "nonce" : "105781dacf8bcf41", + "number" : "0x03", + "parentHash" : "04e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89", + "receiptTrie" : "4ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920af", + "stateRoot" : "e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07de", + "timestamp" : "0x55d9c577", + "transactionsTrie" : "1722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1a", + "uncleHash" : "1e8797b712282d23d059df15e9082411499795fe2644bdfb35f310c10c78169b" + }, + "rlp" : "0xf90479f901f9a004e0807bea4d9766809afba8f4dbf2e5ab4e522aa4570bb915381c6593530e89a01e8797b712282d23d059df15e9082411499795fe2644bdfb35f310c10c78169b948888f1f195afa192cfee860698584c030f4c9db1a0e9940294a09308406a3d2e09203aed11db40259fac0a25e639ad2b30b82d07dea01722b8a91bfc4f5614ce36ee77c7cce6620ab4af36d3c54baa66d7dbeb7bce1aa04ede0225773c7a517b91994aca65ade45124e7ef4b8be1e6097c9773a11920afb90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302008003832fefd88252088455d9c57780a0c250fe02a675a64e068023f48df2662ff2269d970f7689bde287228e200d540188105781dacf8bcf41f862f86002018304cb2f94095e7baea6a6c7c4c2dfeb977efac326af552d870a801ca015eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0eea05d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38f90216f90213a019c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794bcde5374fce5edbc8e2a8697c15331677e6ebf0ba0cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000002832fefd880a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80a06868c784ca472bb16eb9b23029965a737713003d0da6c006e4923e400cd783fc88d99c24fcd2648302", + "transactions" : [ + { + "data" : "0x", + "gasLimit" : "0x04cb2f", + "gasPrice" : "0x01", + "nonce" : "0x02", + "r" : "0x15eb1cc916728b9799e55c489857727669afb2986433d5f54cde11faaed9f0ee", + "s" : "0x5d36f6d06c34aae8d0a2a5895c8ba4a17ad46a5fa59f361cb3e7e01a23030e38", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "v" : "0x1c", + "value" : "0x0a" + } + ], + "uncleHeaders" : [ + { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "bcde5374fce5edbc8e2a8697c15331677e6ebf0b", + "difficulty" : "0x020000", + "extraData" : "0x", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "5264110fedc6f468e9b3c1fead10ee4bdd4957bcb6d193503f8ede6a0d478b95", + "mixHash" : "6868c784ca472bb16eb9b23029965a737713003d0da6c006e4923e400cd783fc", + "nonce" : "d99c24fcd2648302", + "number" : "0x02", + "parentHash" : "19c900975f94fd78dc12ad13740200fbe0a2eba43fd070bedc65588b0c95438a", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "cb52de543653d86ccd13ba3ddf8b052525b04231c6884a4db3188a184681d878", + "timestamp" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + } + ] + } + ], + "genesisBlockHeader" : { + "bloom" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "coinbase" : "8888f1f195afa192cfee860698584c030f4c9db1", + "difficulty" : "0x020000", + "extraData" : "0x42", + "gasLimit" : "0x2fefd8", + "gasUsed" : "0x00", + "hash" : "e688d736f1307c6f97b6777381b30556137b9d4ca5c43fbd5b30d6b5df315264", + "mixHash" : "f35b4695bdfef02db19d255636bec7911667c7056df2b2f475053ea78dd1b0ff", + "nonce" : "5333c47f947590d8", + "number" : "0x00", + "parentHash" : "0000000000000000000000000000000000000000000000000000000000000000", + "receiptTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "7dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1", + "timestamp" : "0x54c98c81", + "transactionsTrie" : "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncleHash" : "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" + }, + "genesisRLP" : "0xf901fcf901f7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347948888f1f195afa192cfee860698584c030f4c9db1a07dba07d6b448a186e9612e5f737d1c909dce473e53199901a302c00646d523c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080832fefd8808454c98c8142a0f35b4695bdfef02db19d255636bec7911667c7056df2b2f475053ea78dd1b0ff885333c47f947590d8c0c0", + "lastblockhash" : "eed1b4da708283370856fc76352d68f36d9766b7f366da372e2992ced9a1f663", + "postState" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x14", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "8888f1f195afa192cfee860698584c030f4c9db1" : { + "balance" : "0x8ac7230489e8a410", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e71fbdc", + "code" : "0x", + "nonce" : "0x02", + "storage" : { + } + } + }, + "pre" : { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x09184e72a000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + } } -} \ No newline at end of file +} diff --git a/tests/util.go b/tests/util.go index 3b94effc8f1f..a9b5011a9a21 100644 --- a/tests/util.go +++ b/tests/util.go @@ -135,7 +135,7 @@ type Env struct { coinbase common.Address number *big.Int - time uint64 + time *big.Int difficulty *big.Int gasLimit *big.Int @@ -165,7 +165,7 @@ func NewEnvFromMap(state *state.StateDB, envValues map[string]string, exeValues //env.parent = common.Hex2Bytes(envValues["previousHash"]) env.coinbase = common.HexToAddress(envValues["currentCoinbase"]) env.number = common.Big(envValues["currentNumber"]) - env.time = common.Big(envValues["currentTimestamp"]).Uint64() + env.time = common.Big(envValues["currentTimestamp"]) env.difficulty = common.Big(envValues["currentDifficulty"]) env.gasLimit = common.Big(envValues["currentGasLimit"]) env.Gas = new(big.Int) @@ -178,7 +178,7 @@ func (self *Env) BlockNumber() *big.Int { return self.number } //func (self *Env) PrevHash() []byte { return self.parent } func (self *Env) Coinbase() common.Address { return self.coinbase } -func (self *Env) Time() uint64 { return self.time } +func (self *Env) Time() *big.Int { return self.time } func (self *Env) Difficulty() *big.Int { return self.difficulty } func (self *Env) State() *state.StateDB { return self.state } func (self *Env) GasLimit() *big.Int { return self.gasLimit } diff --git a/xeth/types.go b/xeth/types.go index ad5101d61f72..218c8dc7cdfb 100644 --- a/xeth/types.go +++ b/xeth/types.go @@ -19,6 +19,7 @@ package xeth import ( "bytes" "fmt" + "math/big" "strings" "github.com/ethereum/go-ethereum/common" @@ -76,7 +77,7 @@ type Block struct { Hash string `json:"hash"` Transactions *common.List `json:"transactions"` Uncles *common.List `json:"uncles"` - Time uint64 `json:"time"` + Time *big.Int `json:"time"` Coinbase string `json:"coinbase"` Name string `json:"name"` GasLimit string `json:"gasLimit"` From 47a7fe5d22fe2a6be783f6576070814fe951eaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 14 Aug 2015 21:25:41 +0300 Subject: [PATCH 06/90] eth: port the synchronisation algo to eth/62 --- cmd/utils/flags.go | 2 +- core/types/block.go | 14 + eth/downloader/downloader.go | 674 +++++++++++++++++++++++++----- eth/downloader/downloader_test.go | 337 +++++++++++---- eth/downloader/peer.go | 92 +++- eth/downloader/queue.go | 239 +++++++++-- eth/fetcher/fetcher.go | 401 ++++++++++++++++-- eth/fetcher/fetcher_test.go | 471 ++++++++++++++++++--- eth/handler.go | 62 ++- eth/peer.go | 59 ++- 10 files changed, 2010 insertions(+), 341 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 5ebc4ea61e76..80805ca22838 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -140,7 +140,7 @@ var ( } EthVersionFlag = cli.IntFlag{ Name: "eth", - Value: 61, + Value: 62, Usage: "Highest eth protocol to advertise (temporary, dev option)", } diff --git a/core/types/block.go b/core/types/block.go index 427a3e6cb3bc..777ad9483e24 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -357,6 +357,20 @@ func (b *Block) WithMiningResult(nonce uint64, mixDigest common.Hash) *Block { } } +// 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 { diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index b28879ee674d..0e85297562cc 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -26,12 +26,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" - "gopkg.in/fatih/set.v0" ) const ( @@ -40,40 +38,44 @@ const ( ) 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 - MaxHeaderFetch = 256 // Amount of block headers 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 // 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 + 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 // 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 + 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. @@ -91,28 +93,36 @@ 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 @@ -137,12 +147,18 @@ 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 + processCh chan bool // Channel to signal the block fetcher of new or finished work cancelCh chan struct{} // Channel to cancel mid-flight syncs cancelLock sync.RWMutex // Lock to protect the cancel channel in delivers + + // Testing hooks + 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. @@ -153,8 +169,7 @@ 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{ + return &Downloader{ mux: mux, queue: newQueue(), peers: newPeerSet(), @@ -166,14 +181,10 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, he newPeerCh: make(chan *peer, 1), hashCh: make(chan hashPack, 1), blockCh: make(chan blockPack, 1), + headerCh: make(chan headerPack, 1), + bodyCh: make(chan bodyPack, 1), processCh: 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. @@ -206,15 +217,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 } @@ -235,7 +243,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: @@ -244,7 +252,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) @@ -270,10 +278,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") @@ -285,7 +289,6 @@ 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) // Create cancel channel for aborting mid-flight d.cancelLock.Lock() @@ -320,17 +323,37 @@ 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, eth/%d", p.id, p.version) - switch p.version { - case eth61: + glog.V(logger.Debug).Infof("Synchronising with the network using: %s [eth/%d]", p.id, p.version) + defer glog.V(logger.Debug).Infof("Synchronisation terminated") + + switch { + case p.version == eth61: // Old eth/61, use forward, concurrent hash and block retrieval algorithm + number, err := d.findAncestor61(p) + if err != nil { + return err + } + errc := make(chan error, 2) + go func() { errc <- d.fetchHashes61(p, td, number+1) }() + go func() { errc <- d.fetchBlocks61(number + 1) }() + + // If any fetcher fails, cancel the other + if err := <-errc; err != nil { + d.cancel() + <-errc + return err + } + return <-errc + + case p.version >= eth62: + // New eth/62, use forward, concurrent header and block body retrieval algorithm number, err := d.findAncestor(p) if err != nil { return err } 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, number+1) }() + go func() { errc <- d.fetchBodies(number + 1) }() // If any fetcher fails, cancel the other if err := <-errc; err != nil { @@ -373,17 +396,17 @@ func (d *Downloader) Terminate() { d.cancel() } -// 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 } @@ -422,6 +445,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 @@ -429,7 +458,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 @@ -468,7 +497,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 @@ -476,6 +505,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 @@ -485,9 +520,9 @@ 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 @@ -510,6 +545,12 @@ 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 { @@ -548,7 +589,7 @@ 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 @@ -573,10 +614,10 @@ func (d *Downloader) fetchHashes(p *peer, td *big.Int, from uint64) error { } } -// 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") @@ -595,24 +636,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() @@ -624,7 +671,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: @@ -638,7 +685,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() } @@ -696,7 +743,7 @@ func (d *Downloader) fetchBlocks(from uint64) error { // 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 } @@ -704,7 +751,7 @@ 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) } @@ -718,6 +765,401 @@ func (d *Downloader) fetchBlocks(from uint64) error { } } +// 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 + 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) + 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 + } + 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.processCh <- 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.headBlock().Td) > 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) + 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 + cont := d.queue.Pending() < maxQueuedHeaders + select { + case d.processCh <- cont: + default: + } + if !cont { + 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) + d.dropPeer(p.id) + + // Finish the sync gracefully instead of dumping the gathered data though + select { + case d.processCh <- false: + default: + } + 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.processCh: + // 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() { + // 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: @@ -763,6 +1205,9 @@ func (d *Downloader) process() { if len(blocks) == 0 { return } + if d.chainInsertHook != nil { + d.chainInsertHook(blocks) + } // Reset the import statistics d.importLock.Lock() d.importStart = time.Now() @@ -796,9 +1241,31 @@ 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) error { + // 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) error { // Make sure the downloader is active if atomic.LoadInt32(&d.synchronising) == 0 { return errNoSyncActive @@ -817,10 +1284,9 @@ 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) error { // Make sure the downloader is active if atomic.LoadInt32(&d.synchronising) == 0 { return errNoSyncActive @@ -831,7 +1297,27 @@ 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) error { + // 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/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 7e3456433d33..8d009b671701 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -27,20 +27,39 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/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() @@ -78,8 +97,6 @@ type downloadTester struct { 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 - - maxHashFetch int // Overrides the maximum number of retrieved hashes } // newTester creates a new downloader test mocker. @@ -156,7 +173,9 @@ 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)) + err := dl.downloader.RegisterPeer(id, version, hashes[0], + dl.peerGetRelHashesFn(id, delay), dl.peerGetAbsHashesFn(id, delay), dl.peerGetBlocksFn(id, delay), + nil, 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)) @@ -184,13 +203,9 @@ 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 - } // 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++ @@ -204,7 +219,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 } @@ -213,24 +228,20 @@ 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 { +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 - } // 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 } @@ -249,7 +260,55 @@ 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 + } +} + +// 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) + + // 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 + } +} + +// 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) + 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 } @@ -258,13 +317,18 @@ func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([ // 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 { @@ -277,7 +341,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 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 @@ -288,11 +355,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) @@ -303,27 +369,25 @@ func testThrottling(t *testing.T, protocol int) { for len(tester.ownBlocks) < targetBlocks+1 { // 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) cached = len(tester.downloader.queue.blockPool) - if cached == blockCacheLimit || len(tester.ownBlocks)+cached == targetBlocks+1 { + 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) @@ -336,14 +400,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 { @@ -362,20 +431,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) + } +} + +// 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.DeliverBlocks("bad peer", []*types.Block{}); 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 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 @@ -383,6 +468,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() @@ -390,27 +478,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 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) @@ -436,45 +527,130 @@ func testMultiSynchronisation(t *testing.T, protocol int) { } } +// 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 small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + tester := newTester() + tester.newPeer("peer", protocol, hashes, blocks) + + // Instrument the downloader to signal body requests + requested := int32(0) + tester.downloader.bodyFetchHook = func(headers []*types.Header) { + atomic.AddInt32(&requested, int32(len(headers))) + } + // 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 imported := len(tester.ownBlocks); imported != targetBlocks+1 { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, targetBlocks+1) + } + // 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++ + } + } + if int(requested) != needed { + t.Fatalf("block body retrieval count mismatch: have %v, want %v", requested, needed) + } +} + +// 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) } + +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) + + invalidBlocks := make(map[common.Hash]*types.Block) + for hash, block := range validBlocks { + invalidBlocks[hash] = types.NewBlockWithHeader(block.Header()) + } + + tester := newTester() + tester.newPeer("valid", protocol, hashes, validBlocks) + tester.newPeer("attack", protocol, hashes, invalidBlocks) + + // 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) + } + if imported := len(tester.ownBlocks); imported != len(hashes) { + t.Fatalf("synchronised block mismatch: have %v, want %v", imported, 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, eth61, []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 { @@ -491,7 +667,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 @@ -506,7 +687,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, eth61, []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 { diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 4273b9168240..8fd1f9a991a8 100644 --- a/eth/downloader/peer.go +++ b/eth/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 // Eth 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 { diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 96e08e1440c4..a527414ff6f1 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -43,16 +43,20 @@ 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 pendPool map[string]*fetchRequest // Currently pending block retrieval operations @@ -66,11 +70,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 +89,9 @@ func (q *queue) Reset() { q.hashQueue.Reset() q.hashCounter = 0 + q.headerPool = make(map[common.Hash]*types.Header) + q.headerQueue.Reset() + q.pendPool = make(map[string]*fetchRequest) q.blockPool = make(map[common.Hash]uint64) @@ -90,21 +99,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 +133,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 +147,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 +184,29 @@ 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) []*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 %x already scheduled", hash) + continue + } + // Queue the header for body retrieval + inserts = append(inserts, header) + q.headerPool[hash] = header + q.headerQueue.Push(header, -float32(header.Number.Uint64())) + } + 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 +262,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 +311,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 +381,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) } @@ -310,8 +410,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() @@ -337,19 +437,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 +458,88 @@ 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 + } + 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/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index 07eb165dc5ec..f54256788bf5 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/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,12 +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 - number uint64 // Number of the block being announced (0 = unknown | old protocol) - 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. @@ -89,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) @@ -112,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. @@ -121,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), @@ -153,13 +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, number uint64, 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, - number: number, - 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: @@ -183,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 } @@ -209,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 { @@ -255,14 +354,25 @@ func (f *Fetcher) loop() { glog.V(logger.Debug).Infof("Peer %s: exceeded outstanding announces (%d)", notification.origin, hashLimit) 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) + discardMeter.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: @@ -275,7 +385,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) @@ -292,30 +402,77 @@ 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 + fetchBlocks(hashes) + } else { + // Use new eth/62 protocol to retrieve headers first + for _, hash := range hashes { + 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 filter := <-f.filter: + 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) + } + go f.completing[hashes[0]].fetchBodies(hashes) + } + // Schedule the next fetch if blocks are still pending + f.rescheduleComplete(completeTimer) + + case filter := <-f.blockFilter: // Blocks arrived, extract any explicit fetches, return all else var blocks types.Blocks select { @@ -352,12 +509,135 @@ 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 + } + // 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]) + + complete = append(complete, types.NewBlockWithHeader(header)) + 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) + } + } + 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 + } + + 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 { + blocks = append(blocks, types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i])) + } 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 + } + } + + 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 @@ -372,6 +652,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) { @@ -380,13 +676,15 @@ 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) + 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) + glog.V(logger.Debug).Infof("Peer %s: discarded block #%d [%x…], distance %d", peer, block.NumberU64(), hash.Bytes()[:4], dist) discardMeter.Mark(1) + f.forgetHash(hash) return } // Schedule the block for future importing @@ -400,7 +698,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()) } } } @@ -412,13 +710,14 @@ 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 @@ -434,13 +733,13 @@ func (f *Fetcher) insert(peer string, block *types.Block) { 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 @@ -474,9 +773,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/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go index b0d9ce843ada..707d8d7583ac 100644 --- a/eth/fetcher/fetcher_test.go +++ b/eth/fetcher/fetcher_test.go @@ -27,21 +27,39 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/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 +78,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 +88,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 +142,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 +164,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 +273,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 +290,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], 0, 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], 0, time.Now().Add(-arriveTimeout), wrapper) - tester.fetcher.Notify("second", hashes[i], 0, time.Now().Add(-arriveTimeout+time.Millisecond), wrapper) - tester.fetcher.Notify("second", hashes[i], 0, 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 +373,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], 0, 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], 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 +472,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 +494,40 @@ func TestRandomArrivalImport(t *testing.T) { for i := len(hashes) - 1; i >= 0; i-- { if i != skip { - tester.fetcher.Notify("valid", hashes[i], 0, 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], 0, 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 +535,11 @@ func TestQueueGapFill(t *testing.T) { for i := len(hashes) - 1; i >= 0; i-- { if i != skip { - tester.fetcher.Notify("valid", hashes[i], 0, 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 +550,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 +577,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], 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 +598,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 +758,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], 0, 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], 0, 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 +790,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], 0, 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 +843,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/eth/handler.go b/eth/handler.go index 25ff0eef0370..e7404e36a7fd 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -201,7 +201,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 @@ -287,7 +289,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { break } // 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) } @@ -332,8 +334,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { 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) } // Block header query, collect the requested headers and reply @@ -401,6 +403,46 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } 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)) @@ -522,7 +564,11 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } } for _, block := range unknown { - pm.fetcher.Notify(p.id, block.Hash, block.Number, time.Now(), p.RequestBlocks) + 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 msg.Code == NewBlockMsg: @@ -612,7 +658,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/eth/peer.go b/eth/peer.go index 78de8a9d34cd..8d7c488859b1 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -145,15 +145,29 @@ func (p *peer) SendBlocks(blocks []*types.Block) error { 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 { +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 { p.knownBlocks.Add(block.Hash()) @@ -185,40 +199,61 @@ func (p *peer) SendReceipts(receipts []*types.Receipt) error { // 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("%v fetching hashes (%d) from %x...\n", p, 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. func (p *peer) RequestHashesFromNumber(from uint64, count int) error { - glog.V(logger.Debug).Infof("%v fetching hashes (%d) from #%d...\n", p, 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("%v fetching %v blocks\n", p, len(hashes)) + glog.V(logger.Debug).Infof("%v fetching %v blocks", p, len(hashes)) return p2p.Send(p.rw, GetBlocksMsg, hashes) } -// RequestHeaders fetches a batch of blocks' headers corresponding to the -// specified hashes. -func (p *peer) RequestHeaders(hashes []common.Hash) error { - glog.V(logger.Debug).Infof("%v fetching %v headers\n", p, len(hashes)) - return p2p.Send(p.rw, GetBlockHeadersMsg, hashes) +// 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\n", p, len(hashes)) + 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\n", p, len(hashes)) + glog.V(logger.Debug).Infof("%v fetching %v receipts", p, len(hashes)) return p2p.Send(p.rw, GetReceiptsMsg, hashes) } From 17f65cd1e5e0fea6e4f7b96c60767aaa0ada366d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 25 Aug 2015 13:57:49 +0300 Subject: [PATCH 07/90] eth: update metrics collection to handle eth/62 algos --- cmd/geth/monitorcmd.go | 2 +- eth/downloader/downloader.go | 44 +++++++++++++++++++++++++++++++---- eth/downloader/metrics.go | 45 ++++++++++++++++++++++++++++++++++++ eth/downloader/queue.go | 12 ++++++++++ eth/fetcher/fetcher.go | 35 ++++++++++++++++++++-------- eth/fetcher/metrics.go | 26 ++++++++++++++++----- eth/metrics.go | 32 ++++++++++++------------- 7 files changed, 160 insertions(+), 36 deletions(-) create mode 100644 eth/downloader/metrics.go diff --git a/cmd/geth/monitorcmd.go b/cmd/geth/monitorcmd.go index a7c099532c05..a45d29b8f29b 100644 --- a/cmd/geth/monitorcmd.go +++ b/cmd/geth/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/eth/downloader/downloader.go b/eth/downloader/downloader.go index 0e85297562cc..574f2ba15eab 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -526,6 +526,7 @@ 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() @@ -534,6 +535,7 @@ func (d *Downloader) fetchHashes61(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 @@ -557,6 +559,7 @@ func (d *Downloader) fetchHashes61(p *peer, td *big.Int, from uint64) error { 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 @@ -609,6 +612,7 @@ func (d *Downloader) fetchHashes61(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 } } @@ -896,6 +900,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { 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() @@ -904,6 +909,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { 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 @@ -927,6 +933,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { 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 @@ -980,6 +987,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { 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 @@ -1244,7 +1252,14 @@ func (d *Downloader) process() { // 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) error { +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 @@ -1265,7 +1280,14 @@ func (d *Downloader) DeliverHashes61(id string, hashes []common.Hash) error { // 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) DeliverBlocks61(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 @@ -1286,7 +1308,14 @@ func (d *Downloader) DeliverBlocks61(id string, blocks []*types.Block) 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) error { +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 @@ -1306,7 +1335,14 @@ func (d *Downloader) DeliverHeaders(id string, headers []*types.Header) error { } // 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) error { +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 diff --git a/eth/downloader/metrics.go b/eth/downloader/metrics.go new file mode 100644 index 000000000000..fd926affd55e --- /dev/null +++ b/eth/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/ethereum/go-ethereum/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/eth/downloader/queue.go b/eth/downloader/queue.go index a527414ff6f1..7db78327b306 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -397,9 +397,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) } } @@ -420,6 +430,7 @@ func (q *queue) Deliver61(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 @@ -468,6 +479,7 @@ func (q *queue) Deliver(id string, txLists [][]*types.Transaction, uncleLists [] 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 diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index f54256788bf5..b8ec1fc554a1 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -347,18 +347,19 @@ 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) - discardMeter.Mark(1) + propAnnounceDropMeter.Mark(1) break } } @@ -377,7 +378,7 @@ func (f *Fetcher) loop() { 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: @@ -425,10 +426,12 @@ func (f *Fetcher) loop() { } 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 } } @@ -467,6 +470,7 @@ func (f *Fetcher) loop() { 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 @@ -480,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 { @@ -498,6 +503,7 @@ func (f *Fetcher) loop() { } } + blockFilterOutMeter.Mark(int64(len(download))) select { case filter <- download: case <-f.quit: @@ -520,6 +526,8 @@ func (f *Fetcher) loop() { 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{} @@ -544,7 +552,10 @@ func (f *Fetcher) loop() { 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]) - complete = append(complete, types.NewBlockWithHeader(header)) + block := types.NewBlockWithHeader(header) + block.ReceivedAt = task.time + + complete = append(complete, block) f.completing[hash] = announce continue } @@ -559,6 +570,7 @@ func (f *Fetcher) loop() { unknown = append(unknown, header) } } + headerFilterOutMeter.Mark(int64(len(unknown))) select { case filter <- &headerFilterTask{headers: unknown, time: task.time}: case <-f.quit: @@ -590,6 +602,7 @@ func (f *Fetcher) loop() { 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++ { @@ -606,7 +619,10 @@ func (f *Fetcher) loop() { matched = true if f.getBlock(hash) == nil { - blocks = append(blocks, types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i])) + block := types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i]) + block.ReceivedAt = task.time + + blocks = append(blocks, block) } else { f.forgetHash(hash) } @@ -621,6 +637,7 @@ func (f *Fetcher) loop() { } } + bodyFilterOutMeter.Mark(int64(len(task.transactions))) select { case filter <- task: case <-f.quit: @@ -677,13 +694,14 @@ func (f *Fetcher) enqueue(peer string, block *types.Block) { 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) + 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) + propBroadcastDropMeter.Mark(1) f.forgetHash(hash) return } @@ -724,11 +742,10 @@ func (f *Fetcher) insert(peer string, block *types.Block) { 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: @@ -743,7 +760,7 @@ func (f *Fetcher) insert(peer string, block *types.Block) { 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 diff --git a/eth/fetcher/metrics.go b/eth/fetcher/metrics.go index 76cc49226915..b82d3ca0117f 100644 --- a/eth/fetcher/metrics.go +++ b/eth/fetcher/metrics.go @@ -23,10 +23,24 @@ import ( ) var ( - announceMeter = metrics.NewMeter("eth/sync/RemoteAnnounces") - announceTimer = metrics.NewTimer("eth/sync/LocalAnnounces") - broadcastMeter = metrics.NewMeter("eth/sync/RemoteBroadcasts") - broadcastTimer = metrics.NewTimer("eth/sync/LocalBroadcasts") - discardMeter = metrics.NewMeter("eth/sync/DiscardedBlocks") - futureMeter = metrics.NewMeter("eth/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/eth/metrics.go b/eth/metrics.go index 21002094c876..cfab3bcb3397 100644 --- a/eth/metrics.go +++ b/eth/metrics.go @@ -42,22 +42,22 @@ var ( 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/header/in/packets") - reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/header/in/traffic") - reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/header/out/packets") - reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/header/out/traffic") - reqBodyInPacketsMeter = metrics.NewMeter("eth/req/body/in/packets") - reqBodyInTrafficMeter = metrics.NewMeter("eth/req/body/in/traffic") - reqBodyOutPacketsMeter = metrics.NewMeter("eth/req/body/out/packets") - reqBodyOutTrafficMeter = metrics.NewMeter("eth/req/body/out/traffic") - reqStateInPacketsMeter = metrics.NewMeter("eth/req/state/in/packets") - reqStateInTrafficMeter = metrics.NewMeter("eth/req/state/in/traffic") - reqStateOutPacketsMeter = metrics.NewMeter("eth/req/state/out/packets") - reqStateOutTrafficMeter = metrics.NewMeter("eth/req/state/out/traffic") - reqReceiptInPacketsMeter = metrics.NewMeter("eth/req/receipt/in/packets") - reqReceiptInTrafficMeter = metrics.NewMeter("eth/req/receipt/in/traffic") - reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipt/out/packets") - reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipt/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") From a1d8015817737c200bc6eb7a33a3486de6bd7384 Mon Sep 17 00:00:00 2001 From: caktux Date: Tue, 25 Aug 2015 14:42:57 -0400 Subject: [PATCH 08/90] add missing shh_getMessages to RPC mappings --- rpc/api/shh.go | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc/api/shh.go b/rpc/api/shh.go index 9ca6f9dda475..60e8056052fb 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, } ) From 101418b27537d065d55b3c8fcba6a9d450de8dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 25 Aug 2015 19:42:05 +0300 Subject: [PATCH 09/90] common/compiler: fix #1598, expose solidity errors --- common/compiler/solidity.go | 104 ++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 58 deletions(-) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 56928ac27ddb..67815a72673e 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" @@ -110,95 +111,82 @@ 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) + 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 + 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 + "/*.binary") 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 + if binary, err = ioutil.ReadFile(filepath.Join(wd, base+".binary")); err != nil { + return nil, fmt.Errorf("solc: error reading compiler output for code: %v", err) } - abiDefinitionJson, err = ioutil.ReadFile(abiDefinitionFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) - return - } - 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, CompilerVersion: sol.version, - AbiDefinition: abiDefinition, - UserDoc: userDoc, - DeveloperDoc: developerDoc, + AbiDefinition: abi, + UserDoc: userdoc, + DeveloperDoc: devdoc, }, } - - contracts[base] = contract } - - return + return contracts, nil } func SaveInfo(info *ContractInfo, filename string) (contenthash common.Hash, err error) { From f448310eef5abf1dfd10b25bfd22466cb5477dfd Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Wed, 26 Aug 2015 11:09:09 +0200 Subject: [PATCH 10/90] bugfix console error handling --- rpc/jeth.go | 9 +++++---- rpc/shared/types.go | 6 ++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rpc/jeth.go b/rpc/jeth.go index 757f6b7eb518..ae2603ae4a01 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -44,11 +44,12 @@ func NewJeth(ethApi shared.EthereumApi, re *jsre.JSRE, client comms.EthereumClie } 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/types.go b/rpc/shared/types.go index 659b74bf60ae..dd9a60aab97f 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 From 5dd2462816c007b13590e7d9ab0bc8b02b027439 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Wed, 26 Aug 2015 11:39:43 +0200 Subject: [PATCH 11/90] rpc/api - remove personal.deleteAccount from RPC interface --- rpc/api/personal.go | 16 ---------------- rpc/api/personal_args.go | 30 ------------------------------ rpc/api/utils.go | 1 - 3 files changed, 47 deletions(-) diff --git a/rpc/api/personal.go b/rpc/api/personal.go index 6c73ac83df27..1b0dea330a1a 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,21 +104,6 @@ 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.ethereum.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 { diff --git a/rpc/api/personal_args.go b/rpc/api/personal_args.go index 5a584fb0cec4..89419029bd4f 100644 --- a/rpc/api/personal_args.go +++ b/rpc/api/personal_args.go @@ -44,36 +44,6 @@ 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 diff --git a/rpc/api/utils.go b/rpc/api/utils.go index 50c607d16b61..5072dc2cdc6b 100644 --- a/rpc/api/utils.go +++ b/rpc/api/utils.go @@ -118,7 +118,6 @@ var ( "personal": []string{ "listAccounts", "newAccount", - "deleteAccount", "unlockAccount", }, "shh": []string{ From 829201382b67e95ab31fca887234d1858c11c810 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Wed, 26 Aug 2015 12:46:50 +0200 Subject: [PATCH 12/90] rpc: return error code for eth_getWork when no work ready --- miner/remote_agent.go | 8 +++++--- rpc/api/eth.go | 7 ++++++- rpc/shared/errors.go | 14 ++++++++++++++ rpc/shared/types.go | 3 +++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 5c672a6e0288..5ccadb89639d 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,10 @@ func (a *RemoteAgent) GetWork() [3]string { res[2] = common.BytesToHash(n.Bytes()).Hex() a.work[block.HashNoNonce()] = a.currentWork + return res, nil + } else { + return res, errors.New("No work available yet, don't panic.") } - - return res } // Returns true or false, but does not indicate if the PoW was correct diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 5199bd966d3c..253b6d5cf533 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -563,7 +563,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("getWork") + } else { + return ret, nil + } } func (self *ethApi) SubmitWork(req *shared.Request) (interface{}, error) { diff --git a/rpc/shared/errors.go b/rpc/shared/errors.go index 85af1bb2f40a..d43858a4089d 100644 --- a/rpc/shared/errors.go +++ b/rpc/shared/errors.go @@ -64,6 +64,20 @@ func NewNotImplementedError(method string) *NotImplementedError { } } +type NotReadyError struct { + Method string +} + +func (e *NotReadyError) Error() string { + return fmt.Sprintf("%s method not ready", e.Method) +} + +func NewNotReadyError(method string) *NotReadyError { + return &NotReadyError{ + Method: method, + } +} + type DecodeParamError struct { err string } diff --git a/rpc/shared/types.go b/rpc/shared/types.go index 659b74bf60ae..f58924976f6b 100644 --- a/rpc/shared/types.go +++ b/rpc/shared/types.go @@ -94,6 +94,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} From cfd84a6ad9dee2eccf34e312d32cbfb95d360afe Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 27 Aug 2015 13:23:37 +0200 Subject: [PATCH 13/90] build: avoid -X separator warning with Go >= 1.5 --- build/ldflags.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 From d9addf79fadfed85a7437184aa3ab12622eb5d13 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Fri, 28 Aug 2015 03:42:01 +0200 Subject: [PATCH 14/90] Improve error string and remove unneeded else clause --- miner/remote_agent.go | 3 +-- rpc/api/eth.go | 2 +- rpc/shared/errors.go | 8 ++++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 5ccadb89639d..9e4453ce8e09 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -112,9 +112,8 @@ func (a *RemoteAgent) GetWork() ([3]string, error) { a.work[block.HashNoNonce()] = a.currentWork return res, nil - } else { - return res, errors.New("No work available yet, don't panic.") } + 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/rpc/api/eth.go b/rpc/api/eth.go index 253b6d5cf533..ba87e86c655f 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -565,7 +565,7 @@ func (self *ethApi) GetWork(req *shared.Request) (interface{}, error) { self.xeth.SetMining(true, 0) ret, err := self.xeth.RemoteMining().GetWork() if err != nil { - return nil, shared.NewNotReadyError("getWork") + return nil, shared.NewNotReadyError("mining work") } else { return ret, nil } diff --git a/rpc/shared/errors.go b/rpc/shared/errors.go index d43858a4089d..d5a7011f9190 100644 --- a/rpc/shared/errors.go +++ b/rpc/shared/errors.go @@ -65,16 +65,16 @@ func NewNotImplementedError(method string) *NotImplementedError { } type NotReadyError struct { - Method string + Resource string } func (e *NotReadyError) Error() string { - return fmt.Sprintf("%s method not ready", e.Method) + return fmt.Sprintf("%s not ready", e.Resource) } -func NewNotReadyError(method string) *NotReadyError { +func NewNotReadyError(resource string) *NotReadyError { return &NotReadyError{ - Method: method, + Resource: resource, } } From 39e956060095801b11766c6788dd5b7a5d0589b6 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Fri, 28 Aug 2015 12:49:41 +0200 Subject: [PATCH 15/90] rpc/api allow empty password --- rpc/api/personal.go | 4 ++-- rpc/api/personal_args.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rpc/api/personal.go b/rpc/api/personal.go index 1b0dea330a1a..1fb412612b1d 100644 --- a/rpc/api/personal.go +++ b/rpc/api/personal.go @@ -110,7 +110,7 @@ func (self *personalApi) UnlockAccount(req *shared.Request) (interface{}, error) 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") @@ -121,6 +121,6 @@ func (self *personalApi) UnlockAccount(req *shared.Request) (interface{}, error) am := self.ethereum.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 89419029bd4f..73dc6285ef7c 100644 --- a/rpc/api/personal_args.go +++ b/rpc/api/personal_args.go @@ -46,7 +46,7 @@ func (args *NewAccountArgs) UnmarshalJSON(b []byte) (err error) { type UnlockAccountArgs struct { Address string - Passphrase string + Passphrase *string Duration int } @@ -70,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") } From 8b12bcc0ac7527d094334cab694a72e79d269592 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sat, 29 Aug 2015 11:12:01 +0200 Subject: [PATCH 16/90] rpc: add receiptRoot to getBlock* responses Fixes #1679 --- rpc/api/parsing.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rpc/api/parsing.go b/rpc/api/parsing.go index 0698e8dbe792..5858bc1361d3 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 @@ -291,6 +296,7 @@ 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) From fe8093b71f68614af8f542c7b829f56a28db7914 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 31 Aug 2015 16:45:00 +0200 Subject: [PATCH 17/90] Add TestBcForkUncleTests and update JSON files --- tests/block_test.go | 7 + tests/files/ABITests/basic_abi_tests.json | 0 tests/files/BasicTests/blockgenesistest.json | 0 tests/files/BasicTests/crypto.json | 0 tests/files/BasicTests/genesishashestest.json | 6 +- tests/files/BasicTests/hexencodetest.json | 0 tests/files/BasicTests/keyaddrtest.json | 0 tests/files/BasicTests/txtest.json | 0 .../RandomTests/bl10251623GO.json | 0 .../RandomTests/bl201507071825GO.json | 0 .../BlockchainTests/bcBlockGasLimitTest.json | 0 .../BlockchainTests/bcForkBlockTest.json | 558 ++--- tests/files/BlockchainTests/bcForkUncle.json | 445 ++++ .../BlockchainTests/bcGasPricerTest.json | 2101 ++++++++--------- .../BlockchainTests/bcInvalidHeaderTest.json | 228 +- .../BlockchainTests/bcInvalidRLPTest.json | 0 .../files/BlockchainTests/bcRPC_API_Test.json | 0 .../bcTotalDifficultyTest.json | 0 .../bcUncleHeaderValiditiy.json | 0 tests/files/BlockchainTests/bcUncleTest.json | 0 .../BlockchainTests/bcValidBlockTest.json | 0 tests/files/BlockchainTests/bcWalletTest.json | 0 .../GenesisTests/basic_genesis_tests.json | 0 tests/files/KeyStoreTests/basic_tests.json | 0 tests/files/PoWTests/ethash_tests.json | 0 tests/files/README.md | 0 .../RLPTests/RandomRLPTests/example.json | 0 tests/files/RLPTests/invalidRLPTest.json | 0 tests/files/RLPTests/rlptest.json | 0 .../RandomTests/st201503121803PYTHON.json | 0 .../RandomTests/st201503121806PYTHON.json | 0 .../RandomTests/st201503121848GO.json | 0 .../RandomTests/st201503121849GO.json | 0 .../RandomTests/st201503121850GO.json | 0 .../RandomTests/st201503121851GO.json | 0 .../RandomTests/st201503121953GO.json | 0 .../RandomTests/st201503122023GO.json | 0 .../RandomTests/st201503122023PYTHON.json | 0 .../RandomTests/st201503122027GO.json | 0 .../RandomTests/st201503122054GO.json | 0 .../RandomTests/st201503122055GO.json | 0 .../RandomTests/st201503122115CPPJIT.json | 0 .../RandomTests/st201503122115GO.json | 0 .../RandomTests/st201503122123GO.json | 0 .../RandomTests/st201503122124GO.json | 0 .../RandomTests/st201503122128PYTHON.json | 0 .../RandomTests/st201503122140GO.json | 0 .../RandomTests/st201503122159GO.json | 0 .../RandomTests/st201503122204GO.json | 0 .../RandomTests/st201503122212GO.json | 0 .../RandomTests/st201503122231GO.json | 0 .../RandomTests/st201503122238GO.json | 0 .../RandomTests/st201503122252GO.json | 0 .../RandomTests/st201503122316GO.json | 0 .../RandomTests/st201503122324GO.json | 0 .../RandomTests/st201503122358GO.json | 0 .../RandomTests/st201503130002GO.json | 0 .../RandomTests/st201503130005GO.json | 0 .../RandomTests/st201503130007GO.json | 0 .../RandomTests/st201503130010GO.json | 0 .../RandomTests/st201503130023PYTHON.json | 0 .../RandomTests/st201503130059GO.json | 0 .../RandomTests/st201503130101GO.json | 0 .../RandomTests/st201503130109GO.json | 0 .../RandomTests/st201503130117GO.json | 0 .../RandomTests/st201503130122GO.json | 0 .../RandomTests/st201503130156GO.json | 0 .../RandomTests/st201503130156PYTHON.json | 0 .../RandomTests/st201503130207GO.json | 0 .../RandomTests/st201503130219CPPJIT.json | 0 .../RandomTests/st201503130219GO.json | 0 .../RandomTests/st201503130243GO.json | 0 .../RandomTests/st201503130246GO.json | 0 .../RandomTests/st201503130321GO.json | 0 .../RandomTests/st201503130322GO.json | 0 .../RandomTests/st201503130332GO.json | 0 .../RandomTests/st201503130359GO.json | 0 .../RandomTests/st201503130405GO.json | 0 .../RandomTests/st201503130408GO.json | 0 .../RandomTests/st201503130411GO.json | 0 .../RandomTests/st201503130431GO.json | 0 .../RandomTests/st201503130437GO.json | 0 .../RandomTests/st201503130450GO.json | 0 .../RandomTests/st201503130512CPPJIT.json | 0 .../RandomTests/st201503130512GO.json | 0 .../RandomTests/st201503130615GO.json | 0 .../RandomTests/st201503130705GO.json | 0 .../RandomTests/st201503130733CPPJIT.json | 0 .../RandomTests/st201503130733GO.json | 0 .../RandomTests/st201503130747GO.json | 0 .../RandomTests/st201503130751GO.json | 0 .../RandomTests/st201503130752PYTHON.json | 0 .../RandomTests/st201503130757PYTHON.json | 0 .../RandomTests/st201503131658GO.json | 0 .../RandomTests/st201503131739GO.json | 0 .../RandomTests/st201503131755CPPJIT.json | 0 .../RandomTests/st201503131755GO.json | 0 .../RandomTests/st201503132001CPPJIT.json | 0 .../RandomTests/st201503132127PYTHON.json | 0 .../RandomTests/st201503132201CPPJIT.json | 0 .../RandomTests/st201503132201GO.json | 0 .../RandomTests/st201503132202PYTHON.json | 0 .../RandomTests/st201503140002PYTHON.json | 0 .../RandomTests/st201503140240PYTHON.json | 0 .../RandomTests/st201503140522PYTHON.json | 0 .../RandomTests/st201503140756PYTHON.json | 0 .../RandomTests/st201503141144PYTHON.json | 0 .../RandomTests/st201503141510PYTHON.json | 0 .../RandomTests/st201503150427PYTHON.json | 0 .../RandomTests/st201503150716PYTHON.json | 0 .../RandomTests/st201503151450PYTHON.json | 0 .../RandomTests/st201503151516PYTHON.json | 0 .../RandomTests/st201503151753PYTHON.json | 0 .../RandomTests/st201503152057PYTHON.json | 0 .../RandomTests/st201503152241PYTHON.json | 0 .../RandomTests/st201503160014PYTHON.json | 0 .../RandomTests/st201503160733PYTHON.json | 0 .../RandomTests/st201503170051PYTHON.json | 0 .../RandomTests/st201503170433PYTHON.json | 0 .../RandomTests/st201503170523PYTHON.json | 0 .../RandomTests/st201503171108PYTHON.json | 0 .../RandomTests/st201503181223GO.json | 0 .../RandomTests/st201503181225GO.json | 0 .../RandomTests/st201503181226CPPJIT.json | 0 .../RandomTests/st201503181227CPPJIT.json | 0 .../RandomTests/st201503181227GO.json | 0 .../RandomTests/st201503181229GO.json | 0 .../RandomTests/st201503181230CPPJIT.json | 0 .../RandomTests/st201503181230GO.json | 0 .../RandomTests/st201503181231GO.json | 0 .../RandomTests/st201503181232CPPJIT.json | 0 .../RandomTests/st201503181232GO.json | 0 .../RandomTests/st201503181233GO.json | 0 .../RandomTests/st201503181234CPPJIT.json | 0 .../RandomTests/st201503181234GO.json | 0 .../RandomTests/st201503181235CPPJIT.json | 0 .../RandomTests/st201503181235GO.json | 0 .../RandomTests/st201503181236GO.json | 0 .../RandomTests/st201503181237GO.json | 0 .../RandomTests/st201503181239GO.json | 0 .../RandomTests/st201503181241CPPJIT.json | 0 .../RandomTests/st201503181241GO.json | 0 .../RandomTests/st201503181243GO.json | 0 .../RandomTests/st201503181244GO.json | 0 .../RandomTests/st201503181245CPPJIT.json | 0 .../RandomTests/st201503181245GO.json | 0 .../RandomTests/st201503181246CPPJIT.json | 0 .../RandomTests/st201503181246GO.json | 0 .../RandomTests/st201503181247GO.json | 0 .../RandomTests/st201503181248GO.json | 0 .../RandomTests/st201503181249GO.json | 0 .../RandomTests/st201503181250CPPJIT.json | 0 .../RandomTests/st201503181250GO.json | 0 .../RandomTests/st201503181251GO.json | 0 .../RandomTests/st201503181252CPPJIT.json | 0 .../RandomTests/st201503181253GO.json | 0 .../RandomTests/st201503181255CPPJIT.json | 0 .../RandomTests/st201503181255GO.json | 0 .../RandomTests/st201503181257GO.json | 0 .../RandomTests/st201503181258CPPJIT.json | 0 .../RandomTests/st201503181258GO.json | 0 .../RandomTests/st201503181301CPPJIT.json | 0 .../RandomTests/st201503181301GO.json | 0 .../RandomTests/st201503181303GO.json | 0 .../RandomTests/st201503181304GO.json | 0 .../RandomTests/st201503181305GO.json | 0 .../RandomTests/st201503181306GO.json | 0 .../RandomTests/st201503181307CPPJIT.json | 0 .../RandomTests/st201503181307GO.json | 0 .../RandomTests/st201503181308GO.json | 0 .../RandomTests/st201503181309GO.json | 0 .../RandomTests/st201503181310GO.json | 0 .../RandomTests/st201503181311GO.json | 0 .../RandomTests/st201503181313GO.json | 0 .../RandomTests/st201503181314GO.json | 0 .../RandomTests/st201503181315CPPJIT.json | 0 .../RandomTests/st201503181315GO.json | 0 .../RandomTests/st201503181316CPPJIT.json | 0 .../RandomTests/st201503181316PYTHON.json | 0 .../RandomTests/st201503181317GO.json | 0 .../RandomTests/st201503181318CPPJIT.json | 0 .../RandomTests/st201503181318GO.json | 0 .../RandomTests/st201503181319GO.json | 0 .../RandomTests/st201503181319PYTHON.json | 0 .../RandomTests/st201503181322GO.json | 0 .../RandomTests/st201503181323CPPJIT.json | 0 .../RandomTests/st201503181323GO.json | 0 .../RandomTests/st201503181324GO.json | 0 .../RandomTests/st201503181325GO.json | 0 .../RandomTests/st201503181326CPPJIT.json | 0 .../RandomTests/st201503181326GO.json | 0 .../RandomTests/st201503181327GO.json | 0 .../RandomTests/st201503181329CPPJIT.json | 0 .../RandomTests/st201503181329GO.json | 0 .../RandomTests/st201503181330GO.json | 0 .../RandomTests/st201503181332GO.json | 0 .../RandomTests/st201503181333GO.json | 0 .../RandomTests/st201503181334GO.json | 0 .../RandomTests/st201503181336CPPJIT.json | 0 .../RandomTests/st201503181337GO.json | 0 .../RandomTests/st201503181338GO.json | 0 .../RandomTests/st201503181339CPPJIT.json | 0 .../RandomTests/st201503181339GO.json | 0 .../RandomTests/st201503181340GO.json | 0 .../RandomTests/st201503181341CPPJIT.json | 0 .../RandomTests/st201503181342CPPJIT.json | 0 .../RandomTests/st201503181342GO.json | 0 .../RandomTests/st201503181345GO.json | 0 .../RandomTests/st201503181346GO.json | 0 .../RandomTests/st201503181347CPPJIT.json | 0 .../RandomTests/st201503181347GO.json | 0 .../RandomTests/st201503181347PYTHON.json | 0 .../RandomTests/st201503181350CPPJIT.json | 0 .../RandomTests/st201503181352GO.json | 0 .../RandomTests/st201503181353GO.json | 0 .../RandomTests/st201503181354CPPJIT.json | 0 .../RandomTests/st201503181354GO.json | 0 .../RandomTests/st201503181355GO.json | 0 .../RandomTests/st201503181356CPPJIT.json | 0 .../RandomTests/st201503181357CPPJIT.json | 0 .../RandomTests/st201503181358CPPJIT.json | 0 .../RandomTests/st201503181358GO.json | 0 .../RandomTests/st201503181359GO.json | 0 .../RandomTests/st201503181402CPPJIT.json | 0 .../RandomTests/st201503181403GO.json | 0 .../RandomTests/st201503181406CPPJIT.json | 0 .../RandomTests/st201503181406GO.json | 0 .../RandomTests/st201503181410GO.json | 0 .../RandomTests/st201503181412CPPJIT.json | 0 .../RandomTests/st201503181413GO.json | 0 .../RandomTests/st201503181415GO.json | 0 .../RandomTests/st201503181416GO.json | 0 .../RandomTests/st201503181417CPPJIT.json | 0 .../RandomTests/st201503181417GO.json | 0 .../RandomTests/st201503181418CPPJIT.json | 0 .../RandomTests/st201503181422GO.json | 0 .../RandomTests/st201503181423CPPJIT.json | 0 .../RandomTests/st201503181424GO.json | 0 .../RandomTests/st201503181426CPPJIT.json | 0 .../RandomTests/st201503181426GO.json | 0 .../RandomTests/st201503181428GO.json | 0 .../RandomTests/st201503181430CPPJIT.json | 0 .../RandomTests/st201503181435GO.json | 0 .../RandomTests/st201503181436GO.json | 0 .../RandomTests/st201503181437CPPJIT.json | 0 .../RandomTests/st201503181437GO.json | 0 .../RandomTests/st201503181438CPPJIT.json | 0 .../RandomTests/st201503181438GO.json | 0 .../RandomTests/st201503181439CPPJIT.json | 0 .../RandomTests/st201503181439GO.json | 0 .../RandomTests/st201503181439PYTHON.json | 0 .../RandomTests/st201503181440GO.json | 0 .../RandomTests/st201503181441GO.json | 0 .../RandomTests/st201503181442GO.json | 0 .../RandomTests/st201503181445CPPJIT.json | 0 .../RandomTests/st201503181446GO.json | 0 .../RandomTests/st201503181447GO.json | 0 .../RandomTests/st201503181450GO.json | 0 .../RandomTests/st201503181451CPPJIT.json | 0 .../RandomTests/st201503181453GO.json | 0 .../RandomTests/st201503181455GO.json | 0 .../RandomTests/st201503181456CPPJIT.json | 0 .../RandomTests/st201503181457GO.json | 0 .../RandomTests/st201503181458GO.json | 0 .../RandomTests/st201503181459GO.json | 0 .../RandomTests/st201503181500GO.json | 0 .../RandomTests/st201503181501GO.json | 0 .../RandomTests/st201503181503GO.json | 0 .../RandomTests/st201503181504GO.json | 0 .../RandomTests/st201503181505GO.json | 0 .../RandomTests/st201503181506CPPJIT.json | 0 .../RandomTests/st201503181507GO.json | 0 .../RandomTests/st201503181509CPPJIT.json | 0 .../RandomTests/st201503181509GO.json | 0 .../RandomTests/st201503181510GO.json | 0 .../RandomTests/st201503181511GO.json | 0 .../RandomTests/st201503181512GO.json | 0 .../RandomTests/st201503181513CPPJIT.json | 0 .../RandomTests/st201503181513GO.json | 0 .../RandomTests/st201503181514CPPJIT.json | 0 .../RandomTests/st201503181514GO.json | 0 .../RandomTests/st201503181517CPPJIT.json | 0 .../RandomTests/st201503181517GO.json | 0 .../RandomTests/st201503181519CPPJIT.json | 0 .../RandomTests/st201503181519GO.json | 0 .../RandomTests/st201503181520CPPJIT.json | 0 .../RandomTests/st201503181520GO.json | 0 .../RandomTests/st201503181521GO.json | 0 .../RandomTests/st201503181522GO.json | 0 .../RandomTests/st201503181524CPPJIT.json | 0 .../RandomTests/st201503181524GO.json | 0 .../RandomTests/st201503181526GO.json | 0 .../RandomTests/st201503181527GO.json | 0 .../RandomTests/st201503181528CPPJIT.json | 0 .../RandomTests/st201503181528GO.json | 0 .../RandomTests/st201503181528PYTHON.json | 0 .../RandomTests/st201503181529GO.json | 0 .../RandomTests/st201503181531CPPJIT.json | 0 .../RandomTests/st201503181533GO.json | 0 .../RandomTests/st201503181534CPPJIT.json | 0 .../RandomTests/st201503181534GO.json | 0 .../RandomTests/st201503181536CPPJIT.json | 0 .../RandomTests/st201503181536GO.json | 0 .../RandomTests/st201503181537GO.json | 0 .../RandomTests/st201503181538GO.json | 0 .../RandomTests/st201503181539GO.json | 0 .../RandomTests/st201503181540CPPJIT.json | 0 .../RandomTests/st201503181540PYTHON.json | 0 .../RandomTests/st201503181543GO.json | 0 .../RandomTests/st201503181544CPPJIT.json | 0 .../RandomTests/st201503181544GO.json | 0 .../RandomTests/st201503181547GO.json | 0 .../RandomTests/st201503181548CPPJIT.json | 0 .../RandomTests/st201503181548GO.json | 0 .../RandomTests/st201503181551GO.json | 0 .../RandomTests/st201503181552CPPJIT.json | 0 .../RandomTests/st201503181553GO.json | 0 .../RandomTests/st201503181555CPPJIT.json | 0 .../RandomTests/st201503181555GO.json | 0 .../RandomTests/st201503181557GO.json | 0 .../RandomTests/st201503181559GO.json | 0 .../RandomTests/st201503181601CPPJIT.json | 0 .../RandomTests/st201503181601GO.json | 0 .../RandomTests/st201503181602GO.json | 0 .../RandomTests/st201503181603GO.json | 0 .../RandomTests/st201503181604GO.json | 0 .../RandomTests/st201503181605GO.json | 0 .../RandomTests/st201503181606GO.json | 0 .../RandomTests/st201503181607GO.json | 0 .../RandomTests/st201503181608CPPJIT.json | 0 .../RandomTests/st201503181608GO.json | 0 .../RandomTests/st201503181609GO.json | 0 .../RandomTests/st201503181610CPPJIT.json | 0 .../RandomTests/st201503181610GO.json | 0 .../RandomTests/st201503181611CPPJIT.json | 0 .../RandomTests/st201503181611GO.json | 0 .../RandomTests/st201503181612GO.json | 0 .../RandomTests/st201503181614CPPJIT.json | 0 .../RandomTests/st201503181614GO.json | 0 .../RandomTests/st201503181616CPPJIT.json | 0 .../RandomTests/st201503181616GO.json | 0 .../RandomTests/st201503181617GO.json | 0 .../RandomTests/st201503181618GO.json | 0 .../RandomTests/st201503181619GO.json | 0 .../RandomTests/st201503181620CPPJIT.json | 0 .../RandomTests/st201503181620GO.json | 0 .../RandomTests/st201503181621GO.json | 0 .../RandomTests/st201503181625GO.json | 0 .../RandomTests/st201503181626CPPJIT.json | 0 .../RandomTests/st201503181626GO.json | 0 .../RandomTests/st201503181627GO.json | 0 .../RandomTests/st201503181628GO.json | 0 .../RandomTests/st201503181629GO.json | 0 .../RandomTests/st201503181630CPPJIT.json | 0 .../RandomTests/st201503181630GO.json | 0 .../RandomTests/st201503181630PYTHON.json | 0 .../RandomTests/st201503181632GO.json | 0 .../RandomTests/st201503181634CPPJIT.json | 0 .../RandomTests/st201503181635GO.json | 0 .../RandomTests/st201503181636GO.json | 0 .../RandomTests/st201503181638GO.json | 0 .../RandomTests/st201503181639CPPJIT.json | 0 .../RandomTests/st201503181641GO.json | 0 .../RandomTests/st201503181645GO.json | 0 .../RandomTests/st201503181646GO.json | 0 .../RandomTests/st201503181647CPPJIT.json | 0 .../RandomTests/st201503181649CPPJIT.json | 0 .../RandomTests/st201503181650GO.json | 0 .../RandomTests/st201503181652CPPJIT.json | 0 .../RandomTests/st201503181653GO.json | 0 .../RandomTests/st201503181654GO.json | 0 .../RandomTests/st201503181655CPPJIT.json | 0 .../RandomTests/st201503181655GO.json | 0 .../RandomTests/st201503181656CPPJIT.json | 0 .../RandomTests/st201503181656GO.json | 0 .../RandomTests/st201503181657GO.json | 0 .../RandomTests/st201503181658GO.json | 0 .../RandomTests/st201503181700GO.json | 0 .../RandomTests/st201503181702GO.json | 0 .../RandomTests/st201503181703CPPJIT.json | 0 .../RandomTests/st201503181703GO.json | 0 .../RandomTests/st201503181704GO.json | 0 .../RandomTests/st201503181706GO.json | 0 .../RandomTests/st201503181709GO.json | 0 .../RandomTests/st201503181711CPPJIT.json | 0 .../RandomTests/st201503181711GO.json | 0 .../RandomTests/st201503181713CPPJIT.json | 0 .../RandomTests/st201503181713GO.json | 0 .../RandomTests/st201503181714GO.json | 0 .../RandomTests/st201503181715CPPJIT.json | 0 .../RandomTests/st201503181715GO.json | 0 .../RandomTests/st201503181716GO.json | 0 .../RandomTests/st201503181717GO.json | 0 .../RandomTests/st201503181720CPPJIT.json | 0 .../RandomTests/st201503181722GO.json | 0 .../RandomTests/st201503181723CPPJIT.json | 0 .../RandomTests/st201503181723GO.json | 0 .../RandomTests/st201503181724CPPJIT.json | 0 .../RandomTests/st201503181724GO.json | 0 .../RandomTests/st201503181725GO.json | 0 .../RandomTests/st201503181728GO.json | 0 .../RandomTests/st201503181729GO.json | 0 .../RandomTests/st201503181730GO.json | 0 .../RandomTests/st201503181731CPPJIT.json | 0 .../RandomTests/st201503181732GO.json | 0 .../RandomTests/st201503181734CPPJIT.json | 0 .../RandomTests/st201503181734GO.json | 0 .../RandomTests/st201503181735GO.json | 0 .../RandomTests/st201503181737CPPJIT.json | 0 .../RandomTests/st201503181737GO.json | 0 .../RandomTests/st201503181738CPPJIT.json | 0 .../RandomTests/st201503181738GO.json | 0 .../RandomTests/st201503181739GO.json | 0 .../RandomTests/st201503181740CPPJIT.json | 0 .../RandomTests/st201503181740GO.json | 0 .../RandomTests/st201503181742CPPJIT.json | 0 .../RandomTests/st201503181743GO.json | 0 .../RandomTests/st201503181744GO.json | 0 .../RandomTests/st201503181745CPPJIT.json | 0 .../RandomTests/st201503181746GO.json | 0 .../RandomTests/st201503181747GO.json | 0 .../RandomTests/st201503181748GO.json | 0 .../RandomTests/st201503181749GO.json | 0 .../RandomTests/st201503181750CPPJIT.json | 0 .../RandomTests/st201503181750GO.json | 0 .../RandomTests/st201503181752GO.json | 0 .../RandomTests/st201503181753CPPJIT.json | 0 .../RandomTests/st201503181754CPPJIT.json | 0 .../RandomTests/st201503181754GO.json | 0 .../RandomTests/st201503181755CPPJIT.json | 0 .../RandomTests/st201503181755GO.json | 0 .../RandomTests/st201503181756GO.json | 0 .../RandomTests/st201503181757CPPJIT.json | 0 .../RandomTests/st201503181757GO.json | 0 .../RandomTests/st201503181759GO.json | 0 .../RandomTests/st201503181800GO.json | 0 .../RandomTests/st201503181801GO.json | 0 .../RandomTests/st201503181802GO.json | 0 .../RandomTests/st201503181803CPPJIT.json | 0 .../RandomTests/st201503181803GO.json | 0 .../RandomTests/st201503181804GO.json | 0 .../RandomTests/st201503181806GO.json | 0 .../RandomTests/st201503181808GO.json | 0 .../RandomTests/st201503181809CPPJIT.json | 0 .../RandomTests/st201503181812CPPJIT.json | 0 .../RandomTests/st201503181812GO.json | 0 .../RandomTests/st201503181814CPPJIT.json | 0 .../RandomTests/st201503181815GO.json | 0 .../RandomTests/st201503181816CPPJIT.json | 0 .../RandomTests/st201503181817CPPJIT.json | 0 .../RandomTests/st201503181819GO.json | 0 .../RandomTests/st201503181821GO.json | 0 .../RandomTests/st201503181822GO.json | 0 .../RandomTests/st201503181823GO.json | 0 .../RandomTests/st201503181824GO.json | 0 .../RandomTests/st201503181825GO.json | 0 .../RandomTests/st201503181829GO.json | 0 .../RandomTests/st201503181830CPPJIT.json | 0 .../RandomTests/st201503181833GO.json | 0 .../RandomTests/st201503181834CPPJIT.json | 0 .../RandomTests/st201503181834GO.json | 0 .../RandomTests/st201503181837GO.json | 0 .../RandomTests/st201503181840GO.json | 0 .../RandomTests/st201503181842GO.json | 0 .../RandomTests/st201503181843GO.json | 0 .../RandomTests/st201503181844GO.json | 0 .../RandomTests/st201503181845GO.json | 0 .../RandomTests/st201503181846GO.json | 0 .../RandomTests/st201503181847GO.json | 0 .../RandomTests/st201503181848GO.json | 0 .../RandomTests/st201503181849GO.json | 0 .../RandomTests/st201503181850GO.json | 0 .../RandomTests/st201503181851CPPJIT.json | 0 .../RandomTests/st201503181851GO.json | 0 .../RandomTests/st201503181852CPPJIT.json | 0 .../RandomTests/st201503181854GO.json | 0 .../RandomTests/st201503181855CPPJIT.json | 0 .../RandomTests/st201503181857PYTHON.json | 0 .../RandomTests/st201503181859GO.json | 0 .../RandomTests/st201503181900GO.json | 0 .../RandomTests/st201503181903GO.json | 0 .../RandomTests/st201503181904GO.json | 0 .../RandomTests/st201503181906GO.json | 0 .../RandomTests/st201503181907GO.json | 0 .../RandomTests/st201503181910GO.json | 0 .../RandomTests/st201503181915GO.json | 0 .../RandomTests/st201503181919CPPJIT.json | 0 .../RandomTests/st201503181919PYTHON.json | 0 .../RandomTests/st201503181920GO.json | 0 .../RandomTests/st201503181922GO.json | 0 .../RandomTests/st201503181926GO.json | 0 .../RandomTests/st201503181929GO.json | 0 .../RandomTests/st201503181931CPPJIT.json | 0 .../RandomTests/st201503181931GO.json | 0 .../RandomTests/st201503181931PYTHON.json | 0 .../RandomTests/st201503191646GO.json | 0 .../RandomTests/st201503200837JS.json | 0 .../RandomTests/st201503200838JS.json | 0 .../RandomTests/st201503200841JS.json | 0 .../RandomTests/st201503200848JS.json | 0 .../RandomTests/st201503240609JS.json | 0 .../RandomTests/st201503302200JS.json | 0 .../RandomTests/st201503302202JS.json | 0 .../RandomTests/st201503302206JS.json | 0 .../RandomTests/st201503302208JS.json | 0 .../RandomTests/st201503302210JS.json | 0 .../RandomTests/st201503302211JS.json | 0 .../RandomTests/st201504011535GO.json | 0 .../RandomTests/st201504011536GO.json | 0 .../RandomTests/st201504011547GO.json | 0 .../RandomTests/st201504011916JS.json | 0 .../RandomTests/st201504012130JS.json | 0 .../RandomTests/st201504012259JS.json | 0 .../RandomTests/st201504012359JS.json | 0 .../RandomTests/st201504020305JS.json | 0 .../RandomTests/st201504020400JS.json | 0 .../RandomTests/st201504020428JS.json | 0 .../RandomTests/st201504020431JS.json | 0 .../RandomTests/st201504020444JS.json | 0 .../RandomTests/st201504020538JS.json | 0 .../RandomTests/st201504020639JS.json | 0 .../RandomTests/st201504020836JS.json | 0 .../RandomTests/st201504020910JS.json | 0 .../RandomTests/st201504021057JS.json | 0 .../RandomTests/st201504021104JS.json | 0 .../RandomTests/st201504021237CPPJIT.json | 0 .../RandomTests/st201504021237GO.json | 0 .../RandomTests/st201504021237JS.json | 0 .../RandomTests/st201504021237PYTHON.json | 0 .../RandomTests/st201504021949JS.json | 0 .../RandomTests/st201504022003CPPJIT.json | 0 .../RandomTests/st201504022124JS.json | 0 .../RandomTests/st201504030138JS.json | 0 .../RandomTests/st201504030646JS.json | 0 .../RandomTests/st201504030709JS.json | 0 .../RandomTests/st201504031133JS.json | 0 .../RandomTests/st201504031446JS.json | 0 .../RandomTests/st201504031841JS.json | 0 .../RandomTests/st201504041605JS.json | 0 .../RandomTests/st201504042052JS.json | 0 .../RandomTests/st201504042226CPPJIT.json | 0 .../RandomTests/st201504042355CPPJIT.json | 0 .../RandomTests/st201504050059JS.json | 0 .../RandomTests/st201504050733JS.json | 0 .../RandomTests/st201504051540JS.json | 0 .../RandomTests/st201504051944CPPJIT.json | 0 .../RandomTests/st201504052008CPPJIT.json | 0 .../RandomTests/st201504052014GO.json | 0 .../RandomTests/st201504052031CPPJIT.json | 0 .../RandomTests/st201504060057CPPJIT.json | 0 .../RandomTests/st201504060418CPPJIT.json | 0 .../RandomTests/st201504061106CPPJIT.json | 0 .../RandomTests/st201504061134CPPJIT.json | 0 .../RandomTests/st201504062033CPPJIT.json | 0 .../RandomTests/st201504062046CPPJIT.json | 0 .../RandomTests/st201504062314CPPJIT.json | 0 .../RandomTests/st201504070746JS.json | 0 .../RandomTests/st201504070816CPPJIT.json | 0 .../RandomTests/st201504070836CPPJIT.json | 0 .../RandomTests/st201504070839CPPJIT.json | 0 .../RandomTests/st201504071041CPPJIT.json | 0 .../RandomTests/st201504071056CPPJIT.json | 0 .../RandomTests/st201504071621CPPJIT.json | 0 .../RandomTests/st201504071653CPPJIT.json | 0 .../RandomTests/st201504071750CPPJIT.json | 0 .../RandomTests/st201504071905CPPJIT.json | 0 .../RandomTests/st201504080454CPPJIT.json | 0 .../RandomTests/st201504080457CPPJIT.json | 0 .../RandomTests/st201504080650CPPJIT.json | 0 .../RandomTests/st201504080840CPPJIT.json | 0 .../RandomTests/st201504080948CPPJIT.json | 0 .../RandomTests/st201504081100CPPJIT.json | 0 .../RandomTests/st201504081134CPPJIT.json | 0 .../RandomTests/st201504081138CPPJIT.json | 0 .../RandomTests/st201504081611CPPJIT.json | 0 .../RandomTests/st201504081841JAVA.json | 0 .../RandomTests/st201504081842JAVA.json | 0 .../RandomTests/st201504081843JAVA.json | 0 .../RandomTests/st201504081928CPPJIT.json | 0 .../RandomTests/st201504081953JAVA.json | 0 .../RandomTests/st201504081954JAVA.json | 0 .../RandomTests/st201504081955JAVA.json | 0 .../RandomTests/st201504081956JAVA.json | 0 .../RandomTests/st201504081957JAVA.json | 0 .../RandomTests/st201504082000JAVA.json | 0 .../RandomTests/st201504082001JAVA.json | 0 .../RandomTests/st201504082002JAVA.json | 0 .../RandomTests/st201504090553CPPJIT.json | 0 .../RandomTests/st201504090657CPPJIT.json | 0 .../RandomTests/st201504091403CPPJIT.json | 0 .../RandomTests/st201504091641CPPJIT.json | 0 .../RandomTests/st201504092303CPPJIT.json | 0 .../RandomTests/st201504100125CPPJIT.json | 0 .../RandomTests/st201504100215CPPJIT.json | 0 .../RandomTests/st201504100226PYTHON.json | 0 .../RandomTests/st201504100308CPPJIT.json | 0 .../RandomTests/st201504100337CPPJIT.json | 0 .../RandomTests/st201504100341CPPJIT.json | 0 .../RandomTests/st201504101009CPPJIT.json | 0 .../RandomTests/st201504101150CPPJIT.json | 0 .../RandomTests/st201504101223CPPJIT.json | 0 .../RandomTests/st201504101338CPPJIT.json | 0 .../RandomTests/st201504101754PYTHON.json | 0 .../RandomTests/st201504111554CPPJIT.json | 0 .../RandomTests/st201504130653JS.json | 0 .../RandomTests/st201504131821CPPJIT.json | 0 .../RandomTests/st201504140229CPPJIT.json | 0 .../RandomTests/st201504140236CPPJIT.json | 0 .../RandomTests/st201504140359CPPJIT.json | 0 .../RandomTests/st201504140750CPPJIT.json | 0 .../RandomTests/st201504140818CPPJIT.json | 0 .../RandomTests/st201504140900CPPJIT.json | 0 .../RandomTests/st201504150854CPPJIT.json | 0 .../RandomTests/st201504151057CPPJIT.json | 0 .../RandomTests/st201504202124CPPJIT.json | 0 .../RandomTests/st201504210245CPPJIT.json | 0 .../RandomTests/st201504210957CPPJIT.json | 0 .../RandomTests/st201504211739CPPJIT.json | 0 .../RandomTests/st201504212038CPPJIT.json | 0 .../RandomTests/st201504230729CPPJIT.json | 0 .../RandomTests/st201504231639CPPJIT.json | 0 .../RandomTests/st201504231710CPPJIT.json | 0 .../RandomTests/st201504231742CPPJIT.json | 0 .../RandomTests/st201504232350CPPJIT.json | 0 .../RandomTests/st201504240140CPPJIT.json | 0 .../RandomTests/st201504240220CPPJIT.json | 0 .../RandomTests/st201504240351CPPJIT.json | 0 .../RandomTests/st201504240817CPPJIT.json | 0 .../RandomTests/st201504241118CPPJIT.json | 0 .../RandomTests/st201505021810CPPJIT.json | 0 .../RandomTests/st201505050557JS.json | 0 .../RandomTests/st201505050929GO.json | 0 .../RandomTests/st201505050942PYTHON.json | 0 .../RandomTests/st201505051004PYTHON.json | 0 .../RandomTests/st201505051016PYTHON.json | 0 .../RandomTests/st201505051114GO.json | 0 .../RandomTests/st201505051238GO.json | 0 .../RandomTests/st201505051249GO.json | 0 .../RandomTests/st201505051558PYTHON.json | 0 .../RandomTests/st201505051611PYTHON.json | 0 .../RandomTests/st201505051648JS.json | 0 .../RandomTests/st201505051710GO.json | 0 .../RandomTests/st201505052013GO.json | 0 .../RandomTests/st201505052102JS.json | 0 .../RandomTests/st201505052235GO.json | 0 .../RandomTests/st201505052238JS.json | 0 .../RandomTests/st201505052242PYTHON.json | 0 .../RandomTests/st201505052343PYTHON.json | 0 .../RandomTests/st201505060120GO.json | 0 .../RandomTests/st201505060121GO.json | 0 .../RandomTests/st201505060136PYTHON.json | 0 .../RandomTests/st201505060646JS.json | 0 .../RandomTests/st201505252314CPPJIT.json | 0 .../RandomTests/st201505272131CPPJIT.json | 0 .../RandomTests/st201506040034GO.json | 0 .../RandomTests/st201506040157GO.json | 0 .../RandomTests/st201506052130GO.json | 0 .../RandomTests/st201506060929GO.json | 0 .../RandomTests/st201506061255GO.json | 0 .../RandomTests/st201506062331GO.json | 0 .../RandomTests/st201506070548GO.json | 0 .../RandomTests/st201506071050GO.json | 0 .../RandomTests/st201506071624GO.json | 0 .../RandomTests/st201506071819GO.json | 0 .../RandomTests/st201506072007GO.json | 0 .../RandomTests/st201506080556GO.json | 0 .../RandomTests/st201506080721GO.json | 0 .../RandomTests/st201506091836GO.json | 0 .../RandomTests/st201506092032GO.json | 0 .../RandomTests/st201506101359JS.json | 0 .../RandomTests/st201507030359GO.json | 0 tests/files/StateTests/stBlockHashTest.json | 0 .../StateTests/stCallCreateCallCodeTest.json | 0 tests/files/StateTests/stExample.json | 0 tests/files/StateTests/stInitCodeTest.json | 0 tests/files/StateTests/stLogTests.json | 0 .../files/StateTests/stMemoryStressTest.json | 0 tests/files/StateTests/stMemoryTest.json | 0 .../StateTests/stPreCompiledContracts.json | 0 .../StateTests/stQuadraticComplexityTest.json | 0 tests/files/StateTests/stRecursiveCreate.json | 0 tests/files/StateTests/stRefundTest.json | 74 +- tests/files/StateTests/stSolidityTest.json | 0 tests/files/StateTests/stSpecialTest.json | 0 .../StateTests/stSystemOperationsTest.json | 55 + tests/files/StateTests/stTransactionTest.json | 0 tests/files/StateTests/stWalletTest.json | 0 tests/files/TODO | 0 .../RandomTests/tr201506052141PYTHON.json | 0 .../TransactionTests/tt10mbDataField.json | 0 .../TransactionTests/ttTransactionTest.json | 2 +- .../ttWrongRLPTransaction.json | 0 .../hex_encoded_securetrie_test.json | 0 tests/files/TrieTests/trieanyorder.json | 0 .../TrieTests/trieanyorder_secureTrie.json | 0 tests/files/TrieTests/trietest.json | 0 .../files/TrieTests/trietest_secureTrie.json | 0 tests/files/TrieTests/trietestnextprev.json | 0 .../RandomTests/201503102037PYTHON.json | 0 .../RandomTests/201503102148PYTHON.json | 0 .../RandomTests/201503102300PYTHON.json | 0 .../RandomTests/201503102320PYTHON.json | 0 .../RandomTests/201503110050PYTHON.json | 0 .../RandomTests/201503110206PYTHON.json | 0 .../RandomTests/201503110219PYTHON.json | 0 .../RandomTests/201503110226PYTHON_DUP6.json | 0 .../201503110346PYTHON_PUSH24.json | 0 .../RandomTests/201503110526PYTHON.json | 0 .../RandomTests/201503111844PYTHON.json | 0 .../RandomTests/201503112218PYTHON.json | 0 .../RandomTests/201503120317PYTHON.json | 0 .../RandomTests/201503120525PYTHON.json | 0 .../RandomTests/201503120547PYTHON.json | 0 .../RandomTests/201503120909PYTHON.json | 0 .../files/VMTests/RandomTests/randomTest.json | 0 tests/files/VMTests/vmArithmeticTest.json | 0 .../VMTests/vmBitwiseLogicOperationTest.json | 0 tests/files/VMTests/vmBlockInfoTest.json | 0 .../VMTests/vmEnvironmentalInfoTest.json | 0 .../VMTests/vmIOandFlowOperationsTest.json | 643 ++--- tests/files/VMTests/vmInputLimits.json | 0 tests/files/VMTests/vmInputLimitsLight.json | 0 tests/files/VMTests/vmLogTest.json | 0 tests/files/VMTests/vmPerformanceTest.json | 0 tests/files/VMTests/vmPushDupSwapTest.json | 0 tests/files/VMTests/vmSha3Test.json | 0 .../files/VMTests/vmSystemOperationsTest.json | 0 tests/files/VMTests/vmtests.json | 0 tests/files/ansible/README.md | 0 tests/files/ansible/Vagrantfile | 0 tests/files/ansible/ec2-setup.yml | 0 tests/files/ansible/ec2-terminate.yml | 0 tests/files/ansible/ec2.ini | 0 tests/files/ansible/host-config.yml | 0 .../ansible/roles/common/handlers/main.yml | 0 .../files/ansible/roles/common/tasks/main.yml | 0 .../ansible/roles/docker/handlers/main.yml | 0 .../files/ansible/roles/docker/tasks/main.yml | 0 tests/files/ansible/roles/ec2/tasks/setup.yml | 0 .../ansible/roles/ec2/tasks/terminate.yml | 0 tests/files/ansible/roles/ec2/vars/main.yml | 0 .../ansible/roles/testrunner/tasks/main.yml | 0 tests/files/ansible/site.yml | 0 .../ansible/test-files/docker-cpp/Dockerfile | 0 .../test-files/docker-cppjit/Dockerfile | 0 .../ansible/test-files/docker-go/Dockerfile | 0 .../test-files/docker-python/Dockerfile | 0 tests/files/ansible/testrunner-config.yml | 0 tests/files/index.js | 25 - tests/files/package.json | 26 - 750 files changed, 2305 insertions(+), 1865 deletions(-) mode change 100755 => 100644 tests/files/ABITests/basic_abi_tests.json mode change 100755 => 100644 tests/files/BasicTests/blockgenesistest.json mode change 100755 => 100644 tests/files/BasicTests/crypto.json mode change 100755 => 100644 tests/files/BasicTests/genesishashestest.json mode change 100755 => 100644 tests/files/BasicTests/hexencodetest.json mode change 100755 => 100644 tests/files/BasicTests/keyaddrtest.json mode change 100755 => 100644 tests/files/BasicTests/txtest.json mode change 100755 => 100644 tests/files/BlockchainTests/RandomTests/bl10251623GO.json mode change 100755 => 100644 tests/files/BlockchainTests/RandomTests/bl201507071825GO.json mode change 100755 => 100644 tests/files/BlockchainTests/bcBlockGasLimitTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcForkBlockTest.json create mode 100644 tests/files/BlockchainTests/bcForkUncle.json mode change 100755 => 100644 tests/files/BlockchainTests/bcGasPricerTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcInvalidHeaderTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcInvalidRLPTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcRPC_API_Test.json mode change 100755 => 100644 tests/files/BlockchainTests/bcTotalDifficultyTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcUncleHeaderValiditiy.json mode change 100755 => 100644 tests/files/BlockchainTests/bcUncleTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcValidBlockTest.json mode change 100755 => 100644 tests/files/BlockchainTests/bcWalletTest.json mode change 100755 => 100644 tests/files/GenesisTests/basic_genesis_tests.json mode change 100755 => 100644 tests/files/KeyStoreTests/basic_tests.json mode change 100755 => 100644 tests/files/PoWTests/ethash_tests.json mode change 100755 => 100644 tests/files/README.md mode change 100755 => 100644 tests/files/RLPTests/RandomRLPTests/example.json mode change 100755 => 100644 tests/files/RLPTests/invalidRLPTest.json mode change 100755 => 100644 tests/files/RLPTests/rlptest.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121803PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121806PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121848GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121849GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121850GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121851GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503121953GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122023GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122023PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122027GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122054GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122055GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122115CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122115GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122123GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122124GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122128PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122140GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122159GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122204GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122212GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122231GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122238GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122252GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122316GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122324GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503122358GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130002GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130005GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130007GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130010GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130023PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130059GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130101GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130109GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130117GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130122GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130156GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130156PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130207GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130219CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130219GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130243GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130246GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130321GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130322GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130332GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130359GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130405GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130408GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130411GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130431GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130437GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130450GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130512CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130512GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130615GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130705GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130733CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130733GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130747GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130751GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130752PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503130757PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503131658GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503131739GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503131755CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503131755GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503132001CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503132127PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503132201CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503132201GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503132202PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503140002PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503140240PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503140522PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503140756PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503141144PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503141510PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503150427PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503150716PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503151450PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503151516PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503151753PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503152057PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503152241PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503160014PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503160733PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503170051PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503170433PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503170523PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503171108PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181223GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181225GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181226CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181227CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181227GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181229GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181230CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181230GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181231GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181232CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181232GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181233GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181234CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181234GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181235CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181235GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181236GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181237GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181239GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181241CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181241GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181243GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181244GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181245CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181245GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181246CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181246GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181247GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181248GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181249GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181250CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181250GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181251GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181252CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181253GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181255CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181255GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181257GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181258CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181258GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181301CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181301GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181303GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181304GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181305GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181306GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181307CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181307GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181308GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181309GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181310GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181311GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181313GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181314GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181315CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181315GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181316CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181316PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181317GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181318CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181318GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181319GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181319PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181322GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181323CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181323GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181324GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181325GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181326CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181326GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181327GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181329CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181329GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181330GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181332GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181333GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181334GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181336CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181337GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181338GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181339CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181339GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181340GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181341CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181342CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181342GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181345GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181346GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181347CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181347GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181347PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181350CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181352GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181353GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181354CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181354GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181355GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181356CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181357CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181358CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181358GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181359GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181402CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181403GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181406CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181406GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181410GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181412CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181413GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181415GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181416GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181417CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181417GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181418CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181422GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181423CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181424GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181426CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181426GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181428GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181430CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181435GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181436GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181437CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181437GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181438CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181438GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181439CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181439GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181439PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181440GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181441GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181442GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181445CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181446GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181447GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181450GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181451CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181453GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181455GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181456CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181457GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181458GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181459GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181500GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181501GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181503GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181504GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181505GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181506CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181507GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181509CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181509GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181510GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181511GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181512GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181513CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181513GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181514CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181514GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181517CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181517GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181519CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181519GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181520CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181520GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181521GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181522GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181524CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181524GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181526GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181527GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181528CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181528GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181528PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181529GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181531CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181533GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181534CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181534GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181536CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181536GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181537GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181538GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181539GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181540CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181540PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181543GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181544CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181544GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181547GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181548CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181548GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181551GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181552CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181553GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181555CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181555GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181557GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181559GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181601CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181601GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181602GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181603GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181604GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181605GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181606GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181607GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181608CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181608GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181609GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181610CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181610GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181611CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181611GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181612GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181614CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181614GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181616CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181616GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181617GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181618GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181619GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181620CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181620GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181621GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181625GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181626CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181626GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181627GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181628GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181629GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181630CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181630GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181630PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181632GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181634CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181635GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181636GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181638GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181639CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181641GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181645GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181646GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181647CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181649CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181650GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181652CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181653GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181654GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181655CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181655GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181656CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181656GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181657GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181658GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181700GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181702GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181703CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181703GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181704GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181706GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181709GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181711CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181711GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181713CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181713GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181714GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181715CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181715GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181716GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181717GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181720CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181722GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181723CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181723GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181724CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181724GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181725GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181728GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181729GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181730GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181731CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181732GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181734CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181734GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181735GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181737CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181737GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181738CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181738GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181739GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181740CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181740GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181742CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181743GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181744GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181745CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181746GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181747GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181748GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181749GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181750CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181750GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181752GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181753CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181754CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181754GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181755CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181755GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181756GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181757CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181757GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181759GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181800GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181801GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181802GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181803CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181803GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181804GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181806GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181808GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181809CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181812CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181812GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181814CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181815GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181816CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181817CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181819GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181821GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181822GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181823GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181824GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181825GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181829GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181830CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181833GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181834CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181834GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181837GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181840GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181842GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181843GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181844GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181845GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181846GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181847GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181848GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181849GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181850GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181851CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181851GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181852CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181854GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181855CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181857PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181859GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181900GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181903GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181904GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181906GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181907GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181910GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181915GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181919CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181919PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181920GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181922GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181926GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181929GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181931CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181931GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503181931PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503191646GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503200837JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503200838JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503200841JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503200848JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503240609JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302200JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302202JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302206JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302208JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302210JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201503302211JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504011535GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504011536GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504011547GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504011916JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504012130JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504012259JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504012359JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020305JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020400JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020428JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020431JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020444JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020538JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020639JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020836JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504020910JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021057JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021104JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021237CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021237GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021237JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021237PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504021949JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504022003CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504022124JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504030138JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504030646JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504030709JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504031133JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504031446JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504031841JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504041605JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504042052JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504042226CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504042355CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504050059JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504050733JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504051540JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504051944CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504052008CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504052014GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504052031CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504060057CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504060418CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504061106CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504061134CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504062033CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504062046CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504062314CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504070746JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504070816CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504070836CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504070839CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071041CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071056CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071621CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071653CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071750CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504071905CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504080454CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504080457CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504080650CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504080840CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504080948CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081100CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081134CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081138CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081611CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081841JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081842JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081843JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081928CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081953JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081954JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081955JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081956JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504081957JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504082000JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504082001JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504082002JAVA.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504090553CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504090657CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504091403CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504091641CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504092303CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100125CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100215CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100226PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100308CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100337CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504100341CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504101009CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504101150CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504101223CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504101338CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504101754PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504111554CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504130653JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504131821CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140229CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140236CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140359CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140750CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140818CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504140900CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504150854CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504151057CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504202124CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504210245CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504210957CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504211739CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504212038CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504230729CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504231639CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504231710CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504231742CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504232350CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504240140CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504240220CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504240351CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504240817CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201504241118CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505021810CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505050557JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505050929GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505050942PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051004PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051016PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051114GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051238GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051249GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051558PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051611PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051648JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505051710GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052013GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052102JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052235GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052238JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052242PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505052343PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505060120GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505060121GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505060136PYTHON.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505060646JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505252314CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201505272131CPPJIT.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506040034GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506040157GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506052130GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506060929GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506061255GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506062331GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506070548GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506071050GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506071624GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506071819GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506072007GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506080556GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506080721GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506091836GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506092032GO.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201506101359JS.json mode change 100755 => 100644 tests/files/StateTests/RandomTests/st201507030359GO.json mode change 100755 => 100644 tests/files/StateTests/stBlockHashTest.json mode change 100755 => 100644 tests/files/StateTests/stCallCreateCallCodeTest.json mode change 100755 => 100644 tests/files/StateTests/stExample.json mode change 100755 => 100644 tests/files/StateTests/stInitCodeTest.json mode change 100755 => 100644 tests/files/StateTests/stLogTests.json mode change 100755 => 100644 tests/files/StateTests/stMemoryStressTest.json mode change 100755 => 100644 tests/files/StateTests/stMemoryTest.json mode change 100755 => 100644 tests/files/StateTests/stPreCompiledContracts.json mode change 100755 => 100644 tests/files/StateTests/stQuadraticComplexityTest.json mode change 100755 => 100644 tests/files/StateTests/stRecursiveCreate.json mode change 100755 => 100644 tests/files/StateTests/stRefundTest.json mode change 100755 => 100644 tests/files/StateTests/stSolidityTest.json mode change 100755 => 100644 tests/files/StateTests/stSpecialTest.json mode change 100755 => 100644 tests/files/StateTests/stSystemOperationsTest.json mode change 100755 => 100644 tests/files/StateTests/stTransactionTest.json mode change 100755 => 100644 tests/files/StateTests/stWalletTest.json mode change 100755 => 100644 tests/files/TODO mode change 100755 => 100644 tests/files/TransactionTests/RandomTests/tr201506052141PYTHON.json mode change 100755 => 100644 tests/files/TransactionTests/tt10mbDataField.json mode change 100755 => 100644 tests/files/TransactionTests/ttTransactionTest.json mode change 100755 => 100644 tests/files/TransactionTests/ttWrongRLPTransaction.json mode change 100755 => 100644 tests/files/TrieTests/hex_encoded_securetrie_test.json mode change 100755 => 100644 tests/files/TrieTests/trieanyorder.json mode change 100755 => 100644 tests/files/TrieTests/trieanyorder_secureTrie.json mode change 100755 => 100644 tests/files/TrieTests/trietest.json mode change 100755 => 100644 tests/files/TrieTests/trietest_secureTrie.json mode change 100755 => 100644 tests/files/TrieTests/trietestnextprev.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503102037PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503102148PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503102300PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503102320PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110050PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110206PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110219PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110226PYTHON_DUP6.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110346PYTHON_PUSH24.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503110526PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503111844PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503112218PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503120317PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503120525PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503120547PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/201503120909PYTHON.json mode change 100755 => 100644 tests/files/VMTests/RandomTests/randomTest.json mode change 100755 => 100644 tests/files/VMTests/vmArithmeticTest.json mode change 100755 => 100644 tests/files/VMTests/vmBitwiseLogicOperationTest.json mode change 100755 => 100644 tests/files/VMTests/vmBlockInfoTest.json mode change 100755 => 100644 tests/files/VMTests/vmEnvironmentalInfoTest.json mode change 100755 => 100644 tests/files/VMTests/vmIOandFlowOperationsTest.json mode change 100755 => 100644 tests/files/VMTests/vmInputLimits.json mode change 100755 => 100644 tests/files/VMTests/vmInputLimitsLight.json mode change 100755 => 100644 tests/files/VMTests/vmLogTest.json mode change 100755 => 100644 tests/files/VMTests/vmPerformanceTest.json mode change 100755 => 100644 tests/files/VMTests/vmPushDupSwapTest.json mode change 100755 => 100644 tests/files/VMTests/vmSha3Test.json mode change 100755 => 100644 tests/files/VMTests/vmSystemOperationsTest.json mode change 100755 => 100644 tests/files/VMTests/vmtests.json mode change 100755 => 100644 tests/files/ansible/README.md mode change 100755 => 100644 tests/files/ansible/Vagrantfile mode change 100755 => 100644 tests/files/ansible/ec2-setup.yml mode change 100755 => 100644 tests/files/ansible/ec2-terminate.yml mode change 100755 => 100644 tests/files/ansible/ec2.ini mode change 100755 => 100644 tests/files/ansible/host-config.yml mode change 100755 => 100644 tests/files/ansible/roles/common/handlers/main.yml mode change 100755 => 100644 tests/files/ansible/roles/common/tasks/main.yml mode change 100755 => 100644 tests/files/ansible/roles/docker/handlers/main.yml mode change 100755 => 100644 tests/files/ansible/roles/docker/tasks/main.yml mode change 100755 => 100644 tests/files/ansible/roles/ec2/tasks/setup.yml mode change 100755 => 100644 tests/files/ansible/roles/ec2/tasks/terminate.yml mode change 100755 => 100644 tests/files/ansible/roles/ec2/vars/main.yml mode change 100755 => 100644 tests/files/ansible/roles/testrunner/tasks/main.yml mode change 100755 => 100644 tests/files/ansible/site.yml mode change 100755 => 100644 tests/files/ansible/test-files/docker-cpp/Dockerfile mode change 100755 => 100644 tests/files/ansible/test-files/docker-cppjit/Dockerfile mode change 100755 => 100644 tests/files/ansible/test-files/docker-go/Dockerfile mode change 100755 => 100644 tests/files/ansible/test-files/docker-python/Dockerfile mode change 100755 => 100644 tests/files/ansible/testrunner-config.yml delete mode 100755 tests/files/index.js delete mode 100755 tests/files/package.json diff --git a/tests/block_test.go b/tests/block_test.go index b0db5fe56819..09fc8ebc9701 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -42,6 +42,13 @@ 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/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/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 old mode 100755 new mode 100644 diff --git a/tests/files/BlockchainTests/bcValidBlockTest.json b/tests/files/BlockchainTests/bcValidBlockTest.json old mode 100755 new mode 100644 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/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 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..b1e7cf095038 --- 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", @@ -4750,8 +4853,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4794,8 +4896,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4836,8 +4937,7 @@ "currentDifficulty" : "0x0100", "currentGasLimit" : "0x0f4240", "currentNumber" : "0x00", - "currentTimestamp" : "0x01", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + "currentTimestamp" : "0x01" }, "exec" : { "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", @@ -4867,8 +4967,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/files/package.json b/tests/files/package.json deleted file mode 100755 index 1e0ad9c289e6..000000000000 --- a/tests/files/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "ethereum-tests", - "version": "0.0.6", - "description": "tests for ethereum", - "main": "index.js", - "scripts": { - "test": "echo \"There are no tests for there tests\" && exit 1" - }, - "repository": { - "type": "git", - "url": "https://github.com/ethereum/tests" - }, - "keywords": [ - "tests", - "ethereum" - ], - "author": "", - "license": "MIT", - "bugs": { - "url": "https://github.com/ethereum/tests/issues" - }, - "homepage": "https://github.com/ethereum/tests", - "dependencies": { - "require-all": "^1.0.0" - } -} From 540eb3d02d7cdfbca81903e7230b3f09f17f10ff Mon Sep 17 00:00:00 2001 From: Steven Dee Date: Wed, 29 Jul 2015 18:45:27 -0400 Subject: [PATCH 18/90] Pull in ethash and go-isatty updates Fixes build on OpenBSD. --- Godeps/Godeps.json | 5 ++--- .../_workspace/src/github.com/ethereum/ethash/setup.py | 0 .../github.com/ethereum/ethash/src/libethash/endian.h | 4 ++++ .../src/github.com/ethereum/ethash/src/libethash/fnv.h | 4 ++++ .../src/github.com/ethereum/ethash/test/c/test.sh | 0 .../src/github.com/ethereum/ethash/test/python/test.sh | 0 .../src/github.com/ethereum/ethash/test/test.sh | 0 Godeps/_workspace/src/github.com/mattn/go-isatty/LICENSE | 9 +++++++++ .../src/github.com/mattn/go-isatty/isatty_bsd.go | 2 +- 9 files changed, 20 insertions(+), 4 deletions(-) mode change 100644 => 100755 Godeps/_workspace/src/github.com/ethereum/ethash/setup.py mode change 100644 => 100755 Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.sh mode change 100644 => 100755 Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh mode change 100644 => 100755 Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh create mode 100644 Godeps/_workspace/src/github.com/mattn/go-isatty/LICENSE diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index d5c41227dc35..c939ae67074d 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -21,8 +21,7 @@ }, { "ImportPath": "github.com/ethereum/ethash", - "Comment": "v23.1-227-g8f6ccaa", - "Rev": "8f6ccaaef9b418553807a73a95cb5f49cd3ea39f" + "Rev": "227ec953eae56f4f6c7f5e7dc93b4bbebf0cda2e" }, { "ImportPath": "github.com/fatih/color", @@ -51,7 +50,7 @@ }, { "ImportPath": "github.com/mattn/go-isatty", - "Rev": "fdbe02a1b44e75977b2690062b83cf507d70c013" + "Rev": "7fcbc72f853b92b5720db4a6b8482be612daef24" }, { "ImportPath": "github.com/mattn/go-runewidth", diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py b/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py old mode 100644 new mode 100755 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h index 6ca6cc036494..e32b1c539853 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h +++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h @@ -35,6 +35,10 @@ #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_) diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h index d23c4e247405..82cd655c41c9 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/fnv.h +++ b/Godeps/_workspace/src/github.com/ethereum/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/ethereum/ethash/test/c/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.sh old mode 100644 new mode 100755 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh old mode 100644 new mode 100755 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh old mode 100644 new mode 100755 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 From 67225de2551943a5e53e6c595fcf2c4049e4606d Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 1 Sep 2015 09:19:45 +0200 Subject: [PATCH 19/90] Filter on addresses should work as an OR not an AND. --- core/filter.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/filter.go b/core/filter.go index c34d6ff6ccd7..b328ffff30e1 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 { From 1f1d73ab747da9edc1c8f6bd39835e5653c539ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 1 Sep 2015 16:11:14 +0300 Subject: [PATCH 20/90] eth/downloader: fix race causing occasional test failure --- eth/downloader/downloader.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 574f2ba15eab..73f95bf64863 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -739,9 +739,11 @@ func (d *Downloader) fetchBlocks61(from uint64) error { break } // Send a download request to all idle peers, until throttled + throttled := false for _, peer := range d.peers.IdlePeers() { // 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 @@ -762,7 +764,7 @@ func (d *Downloader) fetchBlocks61(from uint64) error { } // 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 } } From 00b45acb9e104f3229a7f2f3be88686d4bcb5706 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 1 Sep 2015 21:35:30 +0200 Subject: [PATCH 21/90] core: improve block gas tracking --- core/block_processor.go | 28 +++++++++++++++++++--------- core/state_transition.go | 23 ++++++++--------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/core/block_processor.go b/core/block_processor.go index 99d27fa7178b..1238fda7b98c 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -56,6 +56,18 @@ type BlockProcessor struct { eventMux *event.TypeMux } +// TODO: type GasPool big.Int +// +// GasPool is implemented by state.StateObject. This is a historical +// coincidence. Gas tracking should move out of StateObject. + +// GasPool tracks the amount of gas available during +// execution of the transactions in a block. +type GasPool interface { + AddGas(gas, price *big.Int) + SubGas(gas, price *big.Int) error +} + func NewBlockProcessor(db common.Database, pow pow.PoW, chainManager *ChainManager, eventMux *event.TypeMux) *BlockProcessor { sm := &BlockProcessor{ chainDb: db, @@ -64,16 +76,15 @@ func NewBlockProcessor(db common.Database, pow pow.PoW, chainManager *ChainManag bc: chainManager, eventMux: eventMux, } - return sm } func (sm *BlockProcessor) TransitionState(statedb *state.StateDB, parent, block *types.Block, transientProcess bool) (receipts types.Receipts, err error) { - coinbase := statedb.GetOrNewStateObject(block.Coinbase()) - coinbase.SetGasLimit(block.GasLimit()) + gp := statedb.GetOrNewStateObject(block.Coinbase()) + gp.SetGasLimit(block.GasLimit()) // Process the transactions on to parent state - receipts, err = sm.ApplyTransactions(coinbase, statedb, block, block.Transactions(), transientProcess) + receipts, err = sm.ApplyTransactions(gp, statedb, block, block.Transactions(), transientProcess) if err != nil { return nil, err } @@ -81,9 +92,8 @@ func (sm *BlockProcessor) TransitionState(statedb *state.StateDB, parent, block return receipts, nil } -func (self *BlockProcessor) ApplyTransaction(coinbase *state.StateObject, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *big.Int, transientProcess bool) (*types.Receipt, *big.Int, error) { - cb := statedb.GetStateObject(coinbase.Address()) - _, gas, err := ApplyMessage(NewEnv(statedb, self.bc, tx, header), tx, cb) +func (self *BlockProcessor) ApplyTransaction(gp GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *big.Int, transientProcess bool) (*types.Receipt, *big.Int, error) { + _, gas, err := ApplyMessage(NewEnv(statedb, self.bc, tx, header), tx, gp) if err != nil { return nil, nil, err } @@ -118,7 +128,7 @@ func (self *BlockProcessor) ChainManager() *ChainManager { return self.bc } -func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, statedb *state.StateDB, block *types.Block, txs types.Transactions, transientProcess bool) (types.Receipts, error) { +func (self *BlockProcessor) ApplyTransactions(gp GasPool, statedb *state.StateDB, block *types.Block, txs types.Transactions, transientProcess bool) (types.Receipts, error) { var ( receipts types.Receipts totalUsedGas = big.NewInt(0) @@ -130,7 +140,7 @@ func (self *BlockProcessor) ApplyTransactions(coinbase *state.StateObject, state for i, tx := range txs { statedb.StartRecord(tx.Hash(), block.Hash(), i) - receipt, txGas, err := self.ApplyTransaction(coinbase, statedb, header, tx, totalUsedGas, transientProcess) + receipt, txGas, err := self.ApplyTransaction(gp, statedb, header, tx, totalUsedGas, transientProcess) if err != nil { return nil, err } diff --git a/core/state_transition.go b/core/state_transition.go index a5d4fc19b9aa..6ff7fa1ffd8f 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -45,7 +45,7 @@ import ( * 6) Derive new state root */ type StateTransition struct { - coinbase common.Address + gp GasPool msg Message gas, gasPrice *big.Int initialGas *big.Int @@ -53,8 +53,6 @@ type StateTransition struct { data []byte state *state.StateDB - cb, rec, sen *state.StateObject - env vm.Environment } @@ -96,13 +94,13 @@ func IntrinsicGas(data []byte) *big.Int { return igas } -func ApplyMessage(env vm.Environment, msg Message, coinbase *state.StateObject) ([]byte, *big.Int, error) { - return NewStateTransition(env, msg, coinbase).transitionState() +func ApplyMessage(env vm.Environment, msg Message, gp GasPool) ([]byte, *big.Int, error) { + return NewStateTransition(env, msg, gp).transitionState() } -func NewStateTransition(env vm.Environment, msg Message, coinbase *state.StateObject) *StateTransition { +func NewStateTransition(env vm.Environment, msg Message, gp GasPool) *StateTransition { return &StateTransition{ - coinbase: coinbase.Address(), + gp: gp, env: env, msg: msg, gas: new(big.Int), @@ -111,13 +109,9 @@ func NewStateTransition(env vm.Environment, msg Message, coinbase *state.StateOb value: msg.Value(), data: msg.Data(), state: env.State(), - cb: coinbase, } } -func (self *StateTransition) Coinbase() *state.StateObject { - return self.state.GetOrNewStateObject(self.coinbase) -} func (self *StateTransition) From() (*state.StateObject, error) { f, err := self.msg.From() if err != nil { @@ -160,7 +154,7 @@ func (self *StateTransition) BuyGas() error { if sender.Balance().Cmp(mgval) < 0 { return fmt.Errorf("insufficient ETH for gas (%x). Req %v, has %v", sender.Address().Bytes()[:4], mgval, sender.Balance()) } - if err = self.Coinbase().SubGas(mgas, self.gasPrice); err != nil { + if err = self.gp.SubGas(mgas, self.gasPrice); err != nil { return err } self.AddGas(mgas) @@ -241,13 +235,12 @@ func (self *StateTransition) transitionState() (ret []byte, usedGas *big.Int, er } self.refundGas() - self.state.AddBalance(self.coinbase, new(big.Int).Mul(self.gasUsed(), self.gasPrice)) + self.state.AddBalance(self.env.Coinbase(), new(big.Int).Mul(self.gasUsed(), self.gasPrice)) return ret, self.gasUsed(), err } func (self *StateTransition) refundGas() { - coinbase := self.Coinbase() sender, _ := self.From() // err already checked // Return remaining gas remaining := new(big.Int).Mul(self.gas, self.gasPrice) @@ -258,7 +251,7 @@ func (self *StateTransition) refundGas() { self.gas.Add(self.gas, refund) self.state.AddBalance(sender.Address(), refund.Mul(refund, self.gasPrice)) - coinbase.AddGas(self.gas, self.gasPrice) + self.gp.AddGas(self.gas, self.gasPrice) } func (self *StateTransition) gasUsed() *big.Int { From 0fda4c4e1556671e2a2cdc1561fa9b8fe643eed5 Mon Sep 17 00:00:00 2001 From: Christoph Jentzsch Date: Wed, 2 Sep 2015 23:24:17 +0200 Subject: [PATCH 22/90] fix block time issue currently, under normal circumstances, you always set the timestamp to previous.Time() + 1. credits to https://www.reddit.com/r/ethereum/comments/3jcs5r/code_avg_block_time_vs_difficulty_adjustment/cuoi4op style --- miner/worker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miner/worker.go b/miner/worker.go index 86970ec07193..16a16931d701 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -434,7 +434,7 @@ func (self *worker) commitNewWork() { tstart := time.Now() parent := self.chain.CurrentBlock() tstamp := tstart.Unix() - if parent.Time().Cmp(new(big.Int).SetInt64(tstamp)) != 1 { + if parent.Time().Cmp(new(big.Int).SetInt64(tstamp)) >= 0 { tstamp = parent.Time().Int64() + 1 } // this will ensure we're not going off too far in the future From 1a86adc5a27d6f9af0601ee294f957346f790fdd Mon Sep 17 00:00:00 2001 From: Kobi Gurkan Date: Thu, 3 Sep 2015 10:28:30 +0300 Subject: [PATCH 23/90] cmd/geth: honor datadir when attaching --- cmd/geth/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index dc7e19c61add..aacb588feb63 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -402,7 +402,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) } From f69121357dda1629f543c1788cd0d47f1088c40c Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Sun, 6 Sep 2015 16:25:55 +0200 Subject: [PATCH 24/90] cmd/geth Autocompletion bugfix which let the console crash --- cmd/geth/js.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/geth/js.go b/cmd/geth/js.go index c31deefdd91a..3e36007053bd 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/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, "" } From 4ea81f170a164b611b792d6c0e632d38f8953d64 Mon Sep 17 00:00:00 2001 From: Hector Chu Date: Mon, 7 Sep 2015 15:09:59 +0100 Subject: [PATCH 25/90] rpc/comms: fix bug attaching the console over http --- rpc/comms/http.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpc/comms/http.go b/rpc/comms/http.go index c165aa27e116..f4a930d0ef5d 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 { From 618065895b9ec3170eeb954bd12f8de58255e5c6 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Tue, 8 Sep 2015 11:27:55 +0200 Subject: [PATCH 26/90] agent/miner Prevent the CpuAgent to be started multiple times --- miner/agent.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/miner/agent.go b/miner/agent.go index 2f8d9fee4218..c3ea91b50e36 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/pow" + "sync/atomic" ) type CpuAgent struct { @@ -35,6 +36,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 { @@ -58,8 +61,12 @@ func (self *CpuAgent) Stop() { } func (self *CpuAgent) Start() { - self.mu.Lock() defer self.mu.Unlock() + self.mu.Lock() + + if atomic.LoadInt32(&self.isMining) == 1 { + return // agent already started + } self.quit = make(chan struct{}) // creating current op ch makes sure we're not closing a nil ch @@ -67,6 +74,8 @@ func (self *CpuAgent) Start() { self.workCh = make(chan *Work, 1) go self.update() + + atomic.StoreInt32(&self.isMining, 1) } func (self *CpuAgent) update() { @@ -99,10 +108,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{}) { From 652eea71febb8ae39cde9d72c1d4a74e193ec55e Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Tue, 8 Sep 2015 12:42:29 +0200 Subject: [PATCH 27/90] put unlock after lock --- miner/agent.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/miner/agent.go b/miner/agent.go index c3ea91b50e36..7ccf8d2e0d56 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -61,10 +61,10 @@ func (self *CpuAgent) Stop() { } func (self *CpuAgent) Start() { - defer self.mu.Unlock() self.mu.Lock() - - if atomic.LoadInt32(&self.isMining) == 1 { + defer self.mu.Unlock() + + if !atomic.CompareAndSwapInt32(&self.isMining, 0, 1) { return // agent already started } @@ -74,8 +74,6 @@ func (self *CpuAgent) Start() { self.workCh = make(chan *Work, 1) go self.update() - - atomic.StoreInt32(&self.isMining, 1) } func (self *CpuAgent) update() { From 004ed786b424ef3d6491ce46c3d893d8ecac3cc2 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Tue, 8 Sep 2015 15:53:17 +0200 Subject: [PATCH 28/90] core/state: deleted field in StateObject Copy() and unit test --- core/state/state_object.go | 1 + core/state/state_test.go | 104 +++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/core/state/state_object.go b/core/state/state_object.go index c76feb77433e..0af0fbd5ab48 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -263,6 +263,7 @@ func (self *StateObject) Copy() *StateObject { stateObject.gasPool.Set(self.gasPool) stateObject.remove = self.remove stateObject.dirty = self.dirty + stateObject.deleted = self.deleted return stateObject } diff --git a/core/state/state_test.go b/core/state/state_test.go index 5972d266a9f7..35cf53e3e539 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -17,6 +17,7 @@ package state import ( + "bytes" "math/big" "testing" @@ -117,3 +118,106 @@ func (s *StateSuite) TestSnapshot(c *checker.C) { c.Assert(data1, checker.DeepEquals, res) } + +// use testing instead of checker because checker does not support +// printing/logging in tests (-check.vv does not work) +func TestSnapshot2(t *testing.T) { + db, _ := ethdb.NewMemDatabase() + state := New(common.Hash{}, db) + + stateobjaddr0 := toAddr([]byte("so0")) + stateobjaddr1 := toAddr([]byte("so1")) + var storageaddr common.Hash + + data0 := common.BytesToHash([]byte{17}) + data1 := common.BytesToHash([]byte{18}) + + state.SetState(stateobjaddr0, storageaddr, data0) + state.SetState(stateobjaddr1, storageaddr, data1) + + // db, trie are already non-empty values + so0 := state.GetStateObject(stateobjaddr0) + so0.balance = big.NewInt(42) + so0.nonce = 43 + so0.gasPool = big.NewInt(44) + so0.code = []byte{'c', 'a', 'f', 'e'} + so0.codeHash = so0.CodeHash() + so0.remove = true + so0.deleted = false + so0.dirty = false + state.SetStateObject(so0) + + // and one with deleted == true + so1 := state.GetStateObject(stateobjaddr1) + so1.balance = big.NewInt(52) + so1.nonce = 53 + so1.gasPool = big.NewInt(54) + so1.code = []byte{'c', 'a', 'f', 'e', '2'} + so1.codeHash = so1.CodeHash() + so1.remove = true + so1.deleted = true + so1.dirty = true + state.SetStateObject(so1) + + so1 = state.GetStateObject(stateobjaddr1) + if so1 != nil { + t.Fatalf("deleted object not nil when getting") + } + + snapshot := state.Copy() + state.Set(snapshot) + + so0Restored := state.GetStateObject(stateobjaddr0) + so1Restored := state.GetStateObject(stateobjaddr1) + // non-deleted is equal (restored) + compareStateObjects(so0, so0Restored, t) + // deleted should be nil, both before and after restore of state copy + if so1Restored != nil { + t.Fatalf("deleted object not nil after restoring snapshot") + } +} + +func compareStateObjects(so0, so1 *StateObject, t *testing.T) { + if so0.address != so1.address { + t.Fatalf("\nexpected %v\ngot %v", so0.address, so1.address) + } + if so0.balance.Cmp(so1.balance) != 0 { + t.Fatalf("\nexpected %v\ngot %v", so0.balance, so1.balance) + } + if so0.nonce != so1.nonce { + t.Fatalf("\nexpected %v\ngot %v", so0.nonce, so1.nonce) + } + if !bytes.Equal(so0.codeHash, so1.codeHash) { + t.Fatalf("\nexpected %v\ngot %v", so0.codeHash, so1.codeHash) + } + if !bytes.Equal(so0.code, so1.code) { + t.Fatalf("\nexpected %v\ngot %v", so0.code, so1.code) + } + if !bytes.Equal(so0.initCode, so1.initCode) { + t.Fatalf("\nexpected %v\ngot %v", so0.initCode, so1.initCode) + } + + for k, v := range so0.storage { + if so1.storage[k] != v { + t.Fatalf("\nstorage key %s:\nexpected %v\ngot %v", k, v, so1.storage[k]) + } + } + for k, v := range so1.storage { + if so0.storage[k] != v { + t.Fatalf("\nunexpected k,v : %v, %v", k, v) + } + } + + if so0.gasPool.Cmp(so1.gasPool) != 0 { + t.Fatalf("\nexpected %v\ngot %v", so0.gasPool, so1.gasPool) + } + if so0.remove != so1.remove { + t.Fatalf("\nexpected %v\ngot %v", so0.remove, so1.remove) + } + if so0.deleted != so1.deleted { + t.Fatalf("\nexpected %v\ngot %v", so0.deleted, so1.deleted) + } + if so0.dirty != so1.dirty { + t.Fatalf("\nexpected %v\ngot %v", so0.dirty, so1.dirty) + } +} From bf879ef230b33f3cff4c075c205dbaeb8f09d820 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Wed, 9 Sep 2015 00:26:18 +0200 Subject: [PATCH 29/90] core/state: test formatting adhering to Go convention --- core/state/state_test.go | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/core/state/state_test.go b/core/state/state_test.go index 35cf53e3e539..60836738ea26 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -170,7 +170,7 @@ func TestSnapshot2(t *testing.T) { so0Restored := state.GetStateObject(stateobjaddr0) so1Restored := state.GetStateObject(stateobjaddr1) // non-deleted is equal (restored) - compareStateObjects(so0, so0Restored, t) + compareStateObjects(so0Restored, so0, t) // deleted should be nil, both before and after restore of state copy if so1Restored != nil { t.Fatalf("deleted object not nil after restoring snapshot") @@ -179,45 +179,45 @@ func TestSnapshot2(t *testing.T) { func compareStateObjects(so0, so1 *StateObject, t *testing.T) { if so0.address != so1.address { - t.Fatalf("\nexpected %v\ngot %v", so0.address, so1.address) + t.Fatalf("Address mismatch: have %v, want %v", so0.address, so1.address) } if so0.balance.Cmp(so1.balance) != 0 { - t.Fatalf("\nexpected %v\ngot %v", so0.balance, so1.balance) + t.Fatalf("Balance mismatch: have %v, want %v", so0.balance, so1.balance) } if so0.nonce != so1.nonce { - t.Fatalf("\nexpected %v\ngot %v", so0.nonce, so1.nonce) + t.Fatalf("Nonce mismatch: have %v, want %v", so0.nonce, so1.nonce) } if !bytes.Equal(so0.codeHash, so1.codeHash) { - t.Fatalf("\nexpected %v\ngot %v", so0.codeHash, so1.codeHash) + t.Fatalf("CodeHash mismatch: have %v, want %v", so0.codeHash, so1.codeHash) } if !bytes.Equal(so0.code, so1.code) { - t.Fatalf("\nexpected %v\ngot %v", so0.code, so1.code) + t.Fatalf("Code mismatch: have %v, want %v", so0.code, so1.code) } if !bytes.Equal(so0.initCode, so1.initCode) { - t.Fatalf("\nexpected %v\ngot %v", so0.initCode, so1.initCode) + t.Fatalf("InitCode mismatch: have %v, want %v", so0.initCode, so1.initCode) } - for k, v := range so0.storage { - if so1.storage[k] != v { - t.Fatalf("\nstorage key %s:\nexpected %v\ngot %v", k, v, so1.storage[k]) - } - } for k, v := range so1.storage { if so0.storage[k] != v { - t.Fatalf("\nunexpected k,v : %v, %v", k, v) + t.Fatalf("Storage key %s mismatch: have %v, want %v", k, so0.storage[k], v) + } + } + for k, v := range so0.storage { + if so1.storage[k] != v { + t.Fatalf("Storage key %s mismatch: have %v, want none.", k, v) } } if so0.gasPool.Cmp(so1.gasPool) != 0 { - t.Fatalf("\nexpected %v\ngot %v", so0.gasPool, so1.gasPool) + t.Fatalf("GasPool mismatch: have %v, want %v", so0.gasPool, so1.gasPool) } if so0.remove != so1.remove { - t.Fatalf("\nexpected %v\ngot %v", so0.remove, so1.remove) + t.Fatalf("Remove mismatch: have %v, want %v", so0.remove, so1.remove) } if so0.deleted != so1.deleted { - t.Fatalf("\nexpected %v\ngot %v", so0.deleted, so1.deleted) + t.Fatalf("Deleted mismatch: have %v, want %v", so0.deleted, so1.deleted) } if so0.dirty != so1.dirty { - t.Fatalf("\nexpected %v\ngot %v", so0.dirty, so1.dirty) + t.Fatalf("Dirty mismatch: have %v, want %v", so0.dirty, so1.dirty) } } From f04b3a6f293ef15151dc040183ab74ef5ce54d2a Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Sun, 6 Sep 2015 15:46:54 +0200 Subject: [PATCH 30/90] cmd/geth, cmd/utils, eth: added dev mode flag Dev mode enabled some debugging flags such as: * VM debugging mode * Simpler proof of work * Whisper enabled by default * Datadir to a tmp datadir * Maxpeers set to 0 * Gas price of 0 * Random listen port --- cmd/geth/main.go | 1 + cmd/utils/flags.go | 33 ++++++++++++++++++++++++++++++++- eth/backend.go | 15 +++++++++------ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index aacb588feb63..f72f697914c9 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -308,6 +308,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.IPCPathFlag, utils.ExecFlag, utils.WhisperEnabledFlag, + utils.DevModeFlag, utils.VMDebugFlag, utils.VMForceJitFlag, utils.VMJitCacheFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 80805ca22838..95fb649e638f 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -121,6 +121,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", @@ -410,7 +414,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { glog.V(logger.Error).Infoln("WARNING: No etherbase set and no accounts found as default") } - return ð.Config{ + cfg := ð.Config{ Name: common.MakeName(clientID, version), DataDir: ctx.GlobalString(DataDirFlag.Name), GenesisNonce: ctx.GlobalInt(GenesisNonceFlag.Name), @@ -447,6 +451,33 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.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. diff --git a/eth/backend.go b/eth/backend.go index ad2a2c1f94e6..639aaaaec9ec 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -73,6 +73,8 @@ var ( ) type Config struct { + DevMode bool + Name string NetworkId int GenesisNonce int @@ -303,16 +305,17 @@ func New(config *Config) (*Ethereum, 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 { + case config.GenesisBlock != nil: // This is for testing only. core.WriteBlock(chainDb, config.GenesisBlock) core.WriteHead(chainDb, config.GenesisBlock) } From ac32f52ca6e620556e7a875f0d52ddef72215532 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 3 Sep 2015 01:37:00 +0200 Subject: [PATCH 31/90] rlp: fix encReader returning nil buffers to the pool The bug can cause crashes if Read is called after EOF has been returned. No code performs such calls right now, but hitting the bug gets more likely as rlp.EncodeToReader gets used in more places. --- rlp/encode.go | 13 +++++++++---- rlp/encode_test.go | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/rlp/encode.go b/rlp/encode.go index b525ae4e7ab7..a0531af012da 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -90,8 +90,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 +102,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 +288,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) diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 60bd95692648..b550d4303b74 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -23,6 +23,7 @@ import ( "io" "io/ioutil" "math/big" + "sync" "testing" ) @@ -306,3 +307,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() +} From bc17dba8fba0f3007398f231f07916a95ed963ac Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 1 Jul 2015 02:09:02 +0200 Subject: [PATCH 32/90] rlp: add Split functions These functions allow destructuring of raw rlp-encoded bytes without the overhead of reflection or copying. --- rlp/decode_test.go | 3 +- rlp/raw.go | 140 ++++++++++++++++++++++++++++++++ rlp/raw_test.go | 195 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 rlp/raw.go create mode 100644 rlp/raw_test.go diff --git a/rlp/decode_test.go b/rlp/decode_test.go index d6b0611dd08a..ce4f9ecc8d2a 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -24,6 +24,7 @@ import ( "io" "math/big" "reflect" + "strings" "testing" ) @@ -725,7 +726,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/raw.go b/rlp/raw.go new file mode 100644 index 000000000000..e93c4df40531 --- /dev/null +++ b/rlp/raw.go @@ -0,0 +1,140 @@ +// 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" + +// 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) + } + } +} From 24bb68e7cf546153436f1d38a7227fdf75d73343 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 9 Sep 2015 03:34:15 +0200 Subject: [PATCH 33/90] rlp: add RawValue --- rlp/decode.go | 11 +++++++++++ rlp/decode_test.go | 5 +++++ rlp/encode.go | 7 +++++++ rlp/encode_test.go | 5 +++++ rlp/raw.go | 12 +++++++++++- 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/rlp/decode.go b/rlp/decode.go index 1381f5274e53..c4d42c6fc365 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 ce4f9ecc8d2a..408f1a5a9564 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -438,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)}, diff --git a/rlp/encode.go b/rlp/encode.go index a0531af012da..2aeee4721926 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -354,6 +354,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): @@ -389,6 +391,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 b550d4303b74..a3f30d80478c 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -204,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"}, diff --git a/rlp/raw.go b/rlp/raw.go index e93c4df40531..fca445618d78 100644 --- a/rlp/raw.go +++ b/rlp/raw.go @@ -16,7 +16,17 @@ package rlp -import "io" +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{}) // Split returns the content of first RLP value and any // bytes after the value as subslices of b. From fc8b246109760714a838f4be163cca1dbb998163 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 10 Sep 2015 14:48:19 +0200 Subject: [PATCH 34/90] rlp: move ListSize to raw.go --- rlp/encode.go | 6 ------ rlp/raw.go | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rlp/encode.go b/rlp/encode.go index 2aeee4721926..d73b17c282a3 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. diff --git a/rlp/raw.go b/rlp/raw.go index fca445618d78..33aae6ee5399 100644 --- a/rlp/raw.go +++ b/rlp/raw.go @@ -28,6 +28,12 @@ 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) { From 4ce3dfe9c8b825afe3beff205ebe3a5734203c20 Mon Sep 17 00:00:00 2001 From: "Jeff R. Allen" Date: Thu, 10 Sep 2015 23:59:38 +0600 Subject: [PATCH 35/90] common: Update README.md for the current package name --- common/README.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/common/README.md b/common/README.md index 1ed56b71ba16..adea022b7f98 100644 --- a/common/README.md +++ b/common/README.md @@ -1,49 +1,50 @@ -# ethutil +# common [![Build Status](https://travis-ci.org/ethereum/go-ethereum.png?branch=master)](https://travis-ci.org/ethereum/go-ethereum) -The ethutil package contains the ethereum utility library. +The common package contains the ethereum utility library. # Installation -`go get github.com/ethereum/ethutil-go` +As a subdirectory the main go-ethereum repository, you get it with +`go get github.com/ethereum/go-ethereum`. # Usage ## RLP (Recursive Linear Prefix) Encoding -RLP Encoding is an encoding scheme utilized by the Ethereum project. It -encodes any native value or list to string. +RLP Encoding is an encoding scheme used by the Ethereum project. It +encodes any native value or list to a string. -More in depth information about the Encoding scheme see the [Wiki](http://wiki.ethereum.org/index.php/RLP) -article. +More in depth information about the encoding scheme see the +[Wiki](http://wiki.ethereum.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 Ethereum project. +Patricie Tree is a merkle trie used by the Ethereum project. More in depth information about the (modified) Patricia Trie can be found on the [Wiki](http://wiki.ethereum.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 +66,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 +90,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 +111,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 +123,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 +133,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) From b81a6e6ab8954689fa183fd19639cf0344c0de19 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Thu, 10 Sep 2015 15:24:36 +0200 Subject: [PATCH 36/90] core, core/vm, core/state: remove unused functions --- core/block_cache.go | 120 ------------------------------------- core/block_cache_test.go | 76 ----------------------- core/state/state_object.go | 43 ------------- core/state/statedb.go | 21 ------- core/types/transaction.go | 4 -- core/vm/errors.go | 17 ------ 6 files changed, 281 deletions(-) delete mode 100644 core/block_cache.go delete mode 100644 core/block_cache_test.go diff --git a/core/block_cache.go b/core/block_cache.go deleted file mode 100644 index 0fd71144882b..000000000000 --- a/core/block_cache.go +++ /dev/null @@ -1,120 +0,0 @@ -// 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 ( - "sync" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -// BlockCache implements a caching mechanism specifically for blocks and uses FILO to pop -type BlockCache struct { - size int - - hashes []common.Hash - blocks map[common.Hash]*types.Block - - mu sync.RWMutex -} - -// Creates and returns a `BlockCache` with `size`. If `size` is smaller than 1 it will panic -func NewBlockCache(size int) *BlockCache { - if size < 1 { - panic("block cache size not allowed to be smaller than 1") - } - - bc := &BlockCache{size: size} - bc.Clear() - return bc -} - -func (bc *BlockCache) Clear() { - bc.blocks = make(map[common.Hash]*types.Block) - bc.hashes = nil - -} - -func (bc *BlockCache) Push(block *types.Block) { - bc.mu.Lock() - defer bc.mu.Unlock() - - if len(bc.hashes) == bc.size { - delete(bc.blocks, bc.hashes[0]) - - // XXX There are a few other options on solving this - // 1) use a poller / GC like mechanism to clean up untracked objects - // 2) copy as below - // re-use the slice and remove the reference to bc.hashes[0] - // this will allow the element to be garbage collected. - copy(bc.hashes, bc.hashes[1:]) - } else { - bc.hashes = append(bc.hashes, common.Hash{}) - } - - hash := block.Hash() - bc.blocks[hash] = block - bc.hashes[len(bc.hashes)-1] = hash -} - -func (bc *BlockCache) Delete(hash common.Hash) { - bc.mu.Lock() - defer bc.mu.Unlock() - - if _, ok := bc.blocks[hash]; ok { - delete(bc.blocks, hash) - for i, h := range bc.hashes { - if hash == h { - bc.hashes = bc.hashes[:i+copy(bc.hashes[i:], bc.hashes[i+1:])] - // or ? => bc.hashes = append(bc.hashes[:i], bc.hashes[i+1]...) - - break - } - } - } -} - -func (bc *BlockCache) Get(hash common.Hash) *types.Block { - bc.mu.RLock() - defer bc.mu.RUnlock() - - if block, haz := bc.blocks[hash]; haz { - return block - } - - return nil -} - -func (bc *BlockCache) Has(hash common.Hash) bool { - bc.mu.RLock() - defer bc.mu.RUnlock() - - _, ok := bc.blocks[hash] - return ok -} - -func (bc *BlockCache) Each(cb func(int, *types.Block)) { - bc.mu.Lock() - defer bc.mu.Unlock() - - i := 0 - for _, block := range bc.blocks { - cb(i, block) - i++ - } -} diff --git a/core/block_cache_test.go b/core/block_cache_test.go deleted file mode 100644 index ef826d5bda9c..000000000000 --- a/core/block_cache_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// 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" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -func newChain(size int) (chain []*types.Block) { - var parentHash common.Hash - for i := 0; i < size; i++ { - head := &types.Header{ParentHash: parentHash, Number: big.NewInt(int64(i))} - block := types.NewBlock(head, nil, nil, nil) - chain = append(chain, block) - parentHash = block.Hash() - } - return chain -} - -func insertChainCache(cache *BlockCache, chain []*types.Block) { - for _, block := range chain { - cache.Push(block) - } -} - -func TestNewBlockCache(t *testing.T) { - chain := newChain(3) - cache := NewBlockCache(2) - insertChainCache(cache, chain) - - if cache.hashes[0] != chain[1].Hash() { - t.Error("oldest block incorrect") - } -} - -func TestInclusion(t *testing.T) { - chain := newChain(3) - cache := NewBlockCache(3) - insertChainCache(cache, chain) - - for _, block := range chain { - if b := cache.Get(block.Hash()); b == nil { - t.Errorf("getting %x failed", block.Hash()) - } - } -} - -func TestDeletion(t *testing.T) { - chain := newChain(3) - cache := NewBlockCache(3) - insertChainCache(cache, chain) - - cache.Delete(chain[1].Hash()) - - if cache.Has(chain[1].Hash()) { - t.Errorf("expected %x not to be included") - } -} diff --git a/core/state/state_object.go b/core/state/state_object.go index 0af0fbd5ab48..69c64ae404f6 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -87,10 +87,6 @@ type StateObject struct { dirty bool } -func (self *StateObject) Reset() { - self.storage = make(Storage) -} - func NewStateObject(address common.Address, db common.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) @@ -184,14 +180,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 +256,6 @@ func (self *StateObject) Copy() *StateObject { return stateObject } -func (self *StateObject) Set(stateObject *StateObject) { - *self = *stateObject -} - // // Attribute accessors // @@ -280,20 +264,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 +286,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 +324,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 577f7162ebd7..b754f088771b 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -18,7 +18,6 @@ package state import ( - "bytes" "math/big" "github.com/ethereum/go-ethereum/common" @@ -276,10 +275,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 +306,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/types/transaction.go b/core/types/transaction.go index 28a7e02b31c1..8260d7423068 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 diff --git a/core/vm/errors.go b/core/vm/errors.go index 24567e9a1eb5..e2fc84065eb0 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 -} From c6013725a8e9848f522250a07915f64459c28557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 11 Sep 2015 15:53:23 +0300 Subject: [PATCH 37/90] godeps: pull in ethash android fix --- Godeps/Godeps.json | 3 ++- Godeps/_workspace/src/github.com/ethereum/ethash/setup.py | 0 .../src/github.com/ethereum/ethash/src/libethash/endian.h | 4 ++-- .../_workspace/src/github.com/ethereum/ethash/test/c/test.sh | 0 .../src/github.com/ethereum/ethash/test/python/test.sh | 0 Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh | 0 6 files changed, 4 insertions(+), 3 deletions(-) mode change 100755 => 100644 Godeps/_workspace/src/github.com/ethereum/ethash/setup.py mode change 100755 => 100644 Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.sh mode change 100755 => 100644 Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh mode change 100755 => 100644 Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index c939ae67074d..7c6dd59b1e46 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -21,7 +21,8 @@ }, { "ImportPath": "github.com/ethereum/ethash", - "Rev": "227ec953eae56f4f6c7f5e7dc93b4bbebf0cda2e" + "Comment": "v23.1-234-g062e40a", + "Rev": "062e40a1a1671f5a5102862b56e4c56f68a732f5" }, { "ImportPath": "github.com/fatih/color", diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py b/Godeps/_workspace/src/github.com/ethereum/ethash/setup.py old mode 100755 new mode 100644 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h index e32b1c539853..849325a59612 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h +++ b/Godeps/_workspace/src/github.com/ethereum/ethash/src/libethash/endian.h @@ -41,8 +41,8 @@ #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/ethereum/ethash/test/c/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/c/test.sh old mode 100755 new mode 100644 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/python/test.sh old mode 100755 new mode 100644 diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh b/Godeps/_workspace/src/github.com/ethereum/ethash/test/test.sh old mode 100755 new mode 100644 From 3e6964b841bb22c4eab4cdaa22655beeae577419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 11 Sep 2015 17:03:31 +0300 Subject: [PATCH 38/90] rpc/comms: fix #1795, ensure IPC path exists before binding --- rpc/comms/ipc_unix.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 9d90da071930..d68363a454c6 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -21,6 +21,7 @@ package comms import ( "net" "os" + "path/filepath" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -69,7 +70,11 @@ func (self *ipcClient) reconnect() error { } func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.EthereumApi, 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 { From 2b339cbbd8bb475d2195d54a71dcced700003430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 31 Aug 2015 20:21:02 +0300 Subject: [PATCH 39/90] core, eth: split the db blocks into headers and bodies --- core/chain_manager.go | 262 ++++++++++++++++++++++--------------- core/chain_manager_test.go | 5 +- core/chain_util.go | 210 ++++++++++++++++++++++++----- core/genesis.go | 2 +- core/types/block.go | 4 + eth/backend.go | 108 +++++++-------- eth/handler.go | 43 +++--- eth/peer.go | 6 + eth/protocol.go | 16 +++ 9 files changed, 430 insertions(+), 226 deletions(-) diff --git a/core/chain_manager.go b/core/chain_manager.go index c8127951ea55..745b270f7c6a 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -48,6 +48,8 @@ var ( ) const ( + headerCacheLimit = 256 + bodyCacheLimit = 256 blockCacheLimit = 256 maxFutureBlocks = 256 maxTimeFutureBlocks = 30 @@ -71,7 +73,10 @@ type ChainManager struct { 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 + blockCache *lru.Cache // Cache for the most recent entire blocks futureBlocks *lru.Cache // future blocks are blocks added for later processing quit chan struct{} @@ -84,13 +89,22 @@ type ChainManager struct { } func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) { - cache, _ := lru.New(blockCacheLimit) + headerCache, _ := lru.New(headerCacheLimit) + bodyCache, _ := lru.New(bodyCacheLimit) + bodyRLPCache, _ := lru.New(bodyCacheLimit) + 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, + blockCache: blockCache, + futureBlocks: futureBlocks, + pow: pow, } bc.genesisBlock = bc.GetBlockByNumber(0) @@ -105,11 +119,9 @@ func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) ( } glog.V(logger.Info).Infoln("WARNING: Wrote default ethereum 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 +135,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,13 +145,15 @@ 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.insert(head) bc.setLastState() @@ -199,11 +207,9 @@ 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 := WriteHead(bc.chainDb, block); err != nil { + glog.Fatalf("failed to write database head: %v", err) } - bc.currentBlock = block bc.lastBlockHash = block.Hash() return true @@ -213,14 +219,14 @@ 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 := GetHeadHash(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 { @@ -240,63 +246,37 @@ 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")) + bc.ResetWithGenesisBlock(bc.genesisBlock) } -func (bc *ChainManager) removeBlock(block *types.Block) { - bc.chainDb.Delete(append(blockHashPre, block.Hash().Bytes()...)) -} - -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 + // Prepare the genesis block and reinitialize the chain + bc.genesisBlock = genesis + bc.genesisBlock.Td = genesis.Difficulty() - err := WriteBlock(bc.chainDb, bc.genesisBlock) - if err != nil { - glog.Fatalln("db err:", err) + if err := WriteBlock(bc.chainDb, bc.genesisBlock); err != nil { + glog.Fatalf("failed to write genesis block: %v", err) } - 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. @@ -359,61 +339,130 @@ 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 := GetHeaderByHash(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 := GetHashByNumber(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, uncles and total difficulty) +// from the database by hash, caching it if found. The resion for the peculiar +// pointer-to-slice return type is to differentiate between empty and inexistent +// bodies. +func (self *ChainManager) GetBody(hash common.Hash) (*[]*types.Transaction, *[]*types.Header) { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := self.bodyCache.Get(hash); ok { + body := cached.(*storageBody) + return &body.Transactions, &body.Uncles } - // 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 - } + transactions, uncles, td := GetBodyByHash(self.chainDb, hash) + if td == nil { + return nil, nil + } + // Cache the found body for next time and return + self.bodyCache.Add(hash, &storageBody{ + Transactions: transactions, + Uncles: uncles, + }) + return &transactions, &uncles +} - 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) []byte { + // Short circuit if the body's already in the cache, retrieve otherwise + if cached, ok := self.bodyRLPCache.Get(hash); ok { + return cached.([]byte) } + body, td := GetBodyRLPByHash(self.chainDb, hash) + if td == nil { + return nil + } + // Cache the found body for next time and return + self.bodyRLPCache.Add(hash, body) + return body +} - return +// 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) 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 := GetHashByNumber(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 +476,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()...) diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 002dcbe44651..97e7cacdc920 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -388,7 +388,10 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block func chm(genesis *types.Block, db common.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.blockCache, _ = lru.New(100) bc.futureBlocks, _ = lru.New(100) bc.processor = bproc{} bc.ResetWithGenesisBlock(genesis) diff --git a/core/chain_util.go b/core/chain_util.go index 84b462ce3da2..c12bdda75dba 100644 --- a/core/chain_util.go +++ b/core/chain_util.go @@ -19,7 +19,6 @@ package core import ( "bytes" "math/big" - "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -30,9 +29,14 @@ import ( ) var ( - blockHashPre = []byte("block-hash-") + headKey = []byte("LastBlock") + + headerHashPre = []byte("header-hash-") + bodyHashPre = []byte("body-hash-") blockNumPre = []byte("block-num-") ExpDiffPeriod = big.NewInt(100000) + + blockHashPre = []byte("block-hash-") // [deprecated by eth/63] ) // CalcDifficulty is the difficulty adjustment algorithm. It returns @@ -112,68 +116,212 @@ 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[:]...)) +// storageBody is the block body encoding used for the database. +type storageBody struct { + Transactions []*types.Transaction + Uncles []*types.Header +} + +// GetHashByNumber retrieves a hash assigned to a canonical block number. +func GetHashByNumber(db common.Database, number uint64) common.Hash { + data, _ := db.Get(append(blockNumPre, big.NewInt(int64(number)).Bytes()...)) + if len(data) == 0 { + return common.Hash{} + } + return common.BytesToHash(data) +} + +// GetHeadHash retrieves the hash of the current canonical head block. +func GetHeadHash(db common.Database) common.Hash { + data, _ := db.Get(headKey) + if len(data) == 0 { + return common.Hash{} + } + return common.BytesToHash(data) +} + +// GetHeaderRLPByHash retrieves a block header in its raw RLP database encoding, +// or nil if the header's not found. +func GetHeaderRLPByHash(db common.Database, hash common.Hash) []byte { + data, _ := db.Get(append(headerHashPre, hash[:]...)) + return data +} + +// GetHeaderByHash retrieves the block header corresponding to the hash, nil if +// none found. +func GetHeaderByHash(db common.Database, hash common.Hash) *types.Header { + data := GetHeaderRLPByHash(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 } -// GetBlockByHash returns the canonical block by number or nil if not found +// GetBodyRLPByHash retrieves the block body (transactions and uncles) in RLP +// encoding, and the associated total difficulty. +func GetBodyRLPByHash(db common.Database, hash common.Hash) ([]byte, *big.Int) { + combo, _ := db.Get(append(bodyHashPre, hash[:]...)) + if len(combo) == 0 { + return nil, nil + } + buffer := bytes.NewBuffer(combo) + + td := new(big.Int) + if err := rlp.Decode(buffer, td); err != nil { + glog.V(logger.Error).Infof("invalid block td RLP for hash %x: %v", hash, err) + return nil, nil + } + return buffer.Bytes(), td +} + +// GetBodyByHash retrieves the block body (transactons, uncles, total difficulty) +// corresponding to the hash, nils if none found. +func GetBodyByHash(db common.Database, hash common.Hash) ([]*types.Transaction, []*types.Header, *big.Int) { + data, td := GetBodyRLPByHash(db, hash) + if len(data) == 0 || td == nil { + return nil, nil, nil + } + body := new(storageBody) + 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, nil, nil + } + return body.Transactions, body.Uncles, td +} + +// GetBlockByHash retrieves an entire block corresponding to the hash, assembling +// it back from the stored header and body. +func GetBlockByHash(db common.Database, hash common.Hash) *types.Block { + // Retrieve the block header and body contents + header := GetHeaderByHash(db, hash) + if header == nil { + return nil + } + transactions, uncles, td := GetBodyByHash(db, hash) + if td == nil { + return nil + } + // Reassemble the block and return + block := types.NewBlockWithHeader(header).WithBody(transactions, uncles) + block.Td = td + + return block +} + +// GetBlockByNumber 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 { return nil } - return GetBlockByHash(db, common.BytesToHash(key)) } -// 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 { +// WriteCanonNumber stores the canonical hash for the given block number. +func WriteCanonNumber(db common.Database, hash common.Hash, number uint64) error { + key := append(blockNumPre, 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 +// WriteHead updates the head block of the chain database. func WriteHead(db common.Database, block *types.Block) error { - err := WriteCanonNumber(db, block) - if err != nil { + if err := WriteCanonNumber(db, block.Hash(), block.NumberU64()); err != nil { + glog.Fatalf("failed to store canonical number into database: %v", err) return err } - err = db.Put([]byte("LastBlock"), block.Hash().Bytes()) - if err != nil { + if err := db.Put(headKey, block.Hash().Bytes()); err != nil { + glog.Fatalf("failed to store last block 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() - - enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block)) - key := append(blockHashPre, block.Hash().Bytes()...) - err := db.Put(key, enc) +// WriteHeader serializes a block header into the database. +func WriteHeader(db common.Database, header *types.Header) error { + data, err := rlp.EncodeToBytes(header) if err != nil { - glog.Fatal("db write fail:", err) return err } + key := append(headerHashPre, header.Hash().Bytes()...) + 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 +} - if glog.V(logger.Debug) { - glog.Infof("wrote block #%v %s. Took %v\n", block.Number(), common.PP(block.Hash().Bytes()), time.Since(tstart)) +// WriteBody serializes the body of a block into the database. +func WriteBody(db common.Database, block *types.Block) error { + body, err := rlp.EncodeToBytes(&storageBody{block.Transactions(), block.Uncles()}) + if err != nil { + return err + } + td, err := rlp.EncodeToBytes(block.Td) + if err != nil { + return err } + key := append(bodyHashPre, block.Hash().Bytes()...) + if err := db.Put(key, append(td, body...)); err != nil { + glog.Fatalf("failed to store block body into database: %v", err) + return err + } + glog.V(logger.Debug).Infof("stored block body #%v [%x…]", block.Number, block.Hash().Bytes()[:4]) + return nil +} +// WriteBlock serializes a block into the database, header and body separately. +func WriteBlock(db common.Database, block *types.Block) error { + // Store the body first to retain database consistency + if err := WriteBody(db, block); err != nil { + return err + } + // Store the header too, signaling full block ownership + if err := WriteHeader(db, block.Header()); err != nil { + return err + } return nil } + +// DeleteHeader removes all block header data associated with a hash. +func DeleteHeader(db common.Database, hash common.Hash) { + db.Delete(append(headerHashPre, hash.Bytes()...)) +} + +// DeleteBody removes all block body data associated with a hash. +func DeleteBody(db common.Database, hash common.Hash) { + db.Delete(append(bodyHashPre, hash.Bytes()...)) +} + +// DeleteBlock removes all block data associated with a hash. +func DeleteBlock(db common.Database, hash common.Hash) { + DeleteHeader(db, hash) + DeleteBody(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 common.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/genesis.go b/core/genesis.go index 7d4e03c990ce..6fbc671b06e3 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -86,7 +86,7 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, if block := GetBlockByHash(chainDb, block.Hash()); block != nil { glog.V(logger.Info).Infoln("Genesis block already in chain. Writing canonical number") - err := WriteCanonNumber(chainDb, block) + err := WriteCanonNumber(chainDb, block.Hash(), block.NumberU64()) if err != nil { return nil, err } diff --git a/core/types/block.go b/core/types/block.go index fd81db04cd1d..558b46e010ff 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -135,6 +135,7 @@ type Block struct { ReceivedAt time.Time } +// [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 +148,7 @@ type extblock struct { Uncles []*Header } +// [deprecated by eth/63] // "storage" block encoding. used for database. type storageblock struct { Header *Header @@ -268,6 +270,7 @@ 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 { @@ -277,6 +280,7 @@ func (b *StorageBlock) DecodeRLP(s *rlp.Stream) error { return nil } +// [deprecated by eth/63] func (b *StorageBlock) EncodeRLP(w io.Writer) error { return rlp.Encode(w, storageblock{ Header: b.header, diff --git a/eth/backend.go b/eth/backend.go index 639aaaaec9ec..59f2ab01a8ca 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -18,6 +18,7 @@ package eth import ( + "bytes" "crypto/ecdsa" "encoding/json" "fmt" @@ -269,11 +270,7 @@ func New(config *Config) (*Ethereum, error) { 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 - } - + // 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) @@ -281,6 +278,10 @@ func New(config *Config) (*Ethereum, 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) @@ -721,74 +722,55 @@ 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 common.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.WriteBody(db, block); 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.WriteBody(db, current); 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.WriteHeader(db, current.Header()); err != nil { + return err } - it.Release() } - return nil } diff --git a/eth/handler.go b/eth/handler.go index f22afecb77a5..95f4e8ce2180 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -345,33 +345,33 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&query); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } - // Gather blocks until the fetch or network limits is reached + // 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 block satisfying the query - var origin *types.Block + // Retrieve the next header satisfying the query + var origin *types.Header if query.Origin.Hash != (common.Hash{}) { - origin = pm.chainman.GetBlock(query.Origin.Hash) + origin = pm.chainman.GetHeader(query.Origin.Hash) } else { - origin = pm.chainman.GetBlockByNumber(query.Origin.Number) + origin = pm.chainman.GetHeaderByNumber(query.Origin.Number) } if origin == nil { break } - headers = append(headers, origin.Header()) - bytes += origin.Size() + headers = append(headers, origin) + bytes += 500 // Approximate, should be good enough estimate - // Advance to the next block of the query + // 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 block := pm.chainman.GetBlock(query.Origin.Hash); block != nil { - query.Origin.Hash = block.ParentHash() + if header := pm.chainman.GetHeader(query.Origin.Hash); header != nil { + query.Origin.Hash = header.ParentHash } else { unknown = true break @@ -379,9 +379,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } case query.Origin.Hash != (common.Hash{}) && !query.Reverse: // Hash based traversal towards the leaf block - if block := pm.chainman.GetBlockByNumber(origin.NumberU64() + query.Skip + 1); block != nil { - if pm.chainman.GetBlockHashesFromHash(block.Hash(), query.Skip+1)[query.Skip] == query.Origin.Hash { - query.Origin.Hash = block.Hash() + 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 } @@ -452,23 +452,24 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { // Gather blocks until the fetch or network limits is reached var ( hash common.Hash - bytes common.StorageSize - bodies []*blockBody + bytes int + bodies []*blockBodyRLP ) for bytes < softResponseLimit && len(bodies) < downloader.MaxBlockFetch { - //Retrieve the hash of the next block + // 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, stopping if enough was found - if block := pm.chainman.GetBlock(hash); block != nil { - bodies = append(bodies, &blockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) - bytes += block.Size() + // Retrieve the requested block body, stopping if enough was found + if data := pm.chainman.GetBodyRLP(hash); len(data) != 0 { + body := blockBodyRLP(data) + bodies = append(bodies, &body) + bytes += len(body) } } - return p.SendBlockBodies(bodies) + return p.SendBlockBodiesRLP(bodies) case p.version >= eth63 && msg.Code == GetNodeDataMsg: // Decode the retrieval message diff --git a/eth/peer.go b/eth/peer.go index 8d7c488859b1..f1ddd97265e4 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -184,6 +184,12 @@ 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 []*blockBodyRLP) error { + return p2p.Send(p.rw, BlockBodiesMsg, blockBodiesRLPData(bodies)) +} + // SendNodeData sends a batch of arbitrary internal data, corresponding to the // hashes requested. func (p *peer) SendNodeData(data [][]byte) error { diff --git a/eth/protocol.go b/eth/protocol.go index 49f096a3b230..24007bbb5200 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -213,6 +213,22 @@ type blockBody struct { // blockBodiesData is the network packet for block content distribution. type blockBodiesData []*blockBody +// blockBodyRLP represents the RLP encoded data content of a single block. +type blockBodyRLP []byte + +// EncodeRLP is a specialized encoder for a block body to pass the already +// encoded body RLPs from the database on, without double encoding. +func (b *blockBodyRLP) EncodeRLP(w io.Writer) error { + if _, err := w.Write([]byte(*b)); err != nil { + return err + } + return nil +} + +// blockBodiesRLPData is the network packet for block content distribution +// based on original RLP formatting (i.e. skip the db-decode/proto-encode). +type blockBodiesRLPData []*blockBodyRLP + // nodeDataData is the network response packet for a node data retrieval. type nodeDataData []struct { Value []byte From cdc2662c4098d68a7b450b9b9ff2688acbffcee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 7 Sep 2015 20:43:01 +0300 Subject: [PATCH 40/90] core: split out TD from database and all internals --- cmd/geth/main.go | 7 +- core/chain_makers.go | 1 - core/chain_manager.go | 150 ++++++++++-------- core/chain_manager_test.go | 14 +- core/chain_util.go | 212 ++++++++++++++------------ core/chain_util_test.go | 243 ++++++++++++++++++++++++++++++ core/genesis.go | 20 +-- core/types/block.go | 35 +++-- eth/backend.go | 18 ++- eth/downloader/downloader.go | 11 +- eth/downloader/downloader_test.go | 44 ++++-- eth/handler.go | 19 +-- eth/peer.go | 5 +- eth/protocol.go | 16 -- miner/worker.go | 4 +- rpc/api/eth.go | 72 +++++---- rpc/api/parsing.go | 4 +- tests/block_test_util.go | 5 +- xeth/xeth.go | 4 + 19 files changed, 590 insertions(+), 294 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index f72f697914c9..ba753a493683 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -528,17 +528,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/core/chain_makers.go b/core/chain_makers.go index b009e0c28ca6..f89218f82105 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -158,7 +158,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 } diff --git a/core/chain_manager.go b/core/chain_manager.go index 745b270f7c6a..407945f8eb25 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -35,6 +35,7 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/rlp" "github.com/hashicorp/golang-lru" ) @@ -48,8 +49,9 @@ var ( ) const ( - headerCacheLimit = 256 + headerCacheLimit = 512 bodyCacheLimit = 256 + tdCacheLimit = 1024 blockCacheLimit = 256 maxFutureBlocks = 256 maxTimeFutureBlocks = 30 @@ -70,12 +72,12 @@ type ChainManager struct { checkpoint int // checkpoint counts towards the new checkpoint td *big.Int currentBlock *types.Block - lastBlockHash common.Hash currentGasLimit *big.Int 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 @@ -92,6 +94,7 @@ func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) ( headerCache, _ := lru.New(headerCacheLimit) bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) + tdCache, _ := lru.New(tdCacheLimit) blockCache, _ := lru.New(blockCacheLimit) futureBlocks, _ := lru.New(maxFutureBlocks) @@ -102,6 +105,7 @@ func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) ( headerCache: headerCache, bodyCache: bodyCache, bodyRLPCache: bodyRLPCache, + tdCache: tdCache, blockCache: blockCache, futureBlocks: futureBlocks, pow: pow, @@ -154,7 +158,7 @@ func (bc *ChainManager) SetHead(head *types.Block) { bc.futureBlocks.Purge() bc.currentBlock = head - bc.setTotalDifficulty(head.Td) + bc.setTotalDifficulty(bc.GetTd(head.Hash())) bc.insert(head) bc.setLastState() } @@ -177,7 +181,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 { @@ -207,11 +211,13 @@ func (bc *ChainManager) recover() bool { if len(data) != 0 { block := bc.GetBlock(common.BytesToHash(data)) if block != nil { - if err := WriteHead(bc.chainDb, block); err != nil { - glog.Fatalf("failed to write database head: %v", 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 } } @@ -219,12 +225,11 @@ func (bc *ChainManager) recover() bool { } func (bc *ChainManager) setLastState() error { - head := GetHeadHash(bc.chainDb) + 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", head) if bc.recover() { @@ -236,7 +241,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) { @@ -268,10 +273,10 @@ func (bc *ChainManager) ResetWithGenesisBlock(genesis *types.Block) { bc.futureBlocks.Purge() // Prepare the genesis block and reinitialize the chain - bc.genesisBlock = genesis - bc.genesisBlock.Td = genesis.Difficulty() - - if err := WriteBlock(bc.chainDb, bc.genesisBlock); err != nil { + 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.insert(bc.genesisBlock) @@ -315,23 +320,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 @@ -352,7 +357,7 @@ func (self *ChainManager) GetHeader(hash common.Hash) *types.Header { if header, ok := self.headerCache.Get(hash); ok { return header.(*types.Header) } - header := GetHeaderByHash(self.chainDb, hash) + header := GetHeader(self.chainDb, hash) if header == nil { return nil } @@ -364,44 +369,39 @@ func (self *ChainManager) GetHeader(hash common.Hash) *types.Header { // 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 := GetHashByNumber(self.chainDb, number) + hash := GetCanonicalHash(self.chainDb, number) if hash == (common.Hash{}) { return nil } return self.GetHeader(hash) } -// GetBody retrieves a block body (transactions, uncles and total difficulty) -// from the database by hash, caching it if found. The resion for the peculiar -// pointer-to-slice return type is to differentiate between empty and inexistent -// bodies. -func (self *ChainManager) GetBody(hash common.Hash) (*[]*types.Transaction, *[]*types.Header) { +// 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.(*storageBody) - return &body.Transactions, &body.Uncles + body := cached.(*types.Body) + return body } - transactions, uncles, td := GetBodyByHash(self.chainDb, hash) - if td == nil { - return nil, nil + body := GetBody(self.chainDb, hash) + if body == nil { + return nil } // Cache the found body for next time and return - self.bodyCache.Add(hash, &storageBody{ - Transactions: transactions, - Uncles: uncles, - }) - return &transactions, &uncles + self.bodyCache.Add(hash, body) + return body } // GetBodyRLP retrieves a block body in RLP encoding from the database by hash, // caching it if found. -func (self *ChainManager) GetBodyRLP(hash common.Hash) []byte { +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.([]byte) + return cached.(rlp.RawValue) } - body, td := GetBodyRLPByHash(self.chainDb, hash) - if td == nil { + body := GetBodyRLP(self.chainDb, hash) + if len(body) == 0 { return nil } // Cache the found body for next time and return @@ -409,6 +409,22 @@ func (self *ChainManager) GetBodyRLP(hash common.Hash) []byte { return body } +// 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 { @@ -421,7 +437,7 @@ func (self *ChainManager) GetBlock(hash common.Hash) *types.Block { 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 } @@ -433,7 +449,7 @@ func (self *ChainManager) GetBlock(hash common.Hash) *types.Block { // 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 := GetHashByNumber(self.chainDb, number) + hash := GetCanonicalHash(self.chainDb, number) if hash == (common.Hash{}) { return nil } @@ -455,7 +471,7 @@ func (self *ChainManager) GetBlockHashesFromHash(hash common.Hash, max uint64) [ break } chain = append(chain, header.Hash()) - if header.Number.Cmp(common.Big0) <= 0 { + if header.Number.Cmp(common.Big0) == 0 { break } } @@ -531,15 +547,25 @@ 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 @@ -547,12 +573,10 @@ func (self *ChainManager) WriteBlock(block *types.Block, queued bool) (status wr if err != nil { return NonStatTy, err } - status = SplitStatTy } - self.mu.Lock() - self.setTotalDifficulty(block.Td) + self.setTotalDifficulty(td) self.insert(block) self.mu.Unlock() @@ -561,9 +585,11 @@ func (self *ChainManager) WriteBlock(block *types.Block, queued bool) (status wr 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()) @@ -622,11 +648,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { 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) @@ -666,7 +687,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { 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 } @@ -799,12 +820,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) } } diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 97e7cacdc920..a20480de815b 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -77,6 +77,7 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big 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 +111,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 +119,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) { @@ -391,6 +386,7 @@ func chm(genesis *types.Block, db common.Database) *ChainManager { 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{} diff --git a/core/chain_util.go b/core/chain_util.go index c12bdda75dba..0e3fa31f9e5d 100644 --- a/core/chain_util.go +++ b/core/chain_util.go @@ -29,14 +29,18 @@ import ( ) var ( - headKey = []byte("LastBlock") + headHeaderKey = []byte("LastHeader") + headBlockKey = []byte("LastBlock") - headerHashPre = []byte("header-hash-") - bodyHashPre = []byte("body-hash-") - blockNumPre = []byte("block-num-") - ExpDiffPeriod = big.NewInt(100000) + blockPrefix = []byte("block-") + blockNumPrefix = []byte("block-num-") + + headerSuffix = []byte("-header") + bodySuffix = []byte("-body") + tdSuffix = []byte("-td") - blockHashPre = []byte("block-hash-") // [deprecated by eth/63] + ExpDiffPeriod = big.NewInt(100000) + blockHashPre = []byte("block-hash-") // [deprecated by eth/63] ) // CalcDifficulty is the difficulty adjustment algorithm. It returns @@ -73,16 +77,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. @@ -116,41 +110,48 @@ func CalcGasLimit(parent *types.Block) *big.Int { return gl } -// storageBody is the block body encoding used for the database. -type storageBody struct { - Transactions []*types.Transaction - Uncles []*types.Header +// GetCanonicalHash retrieves a hash assigned to a canonical block number. +func GetCanonicalHash(db common.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) } -// GetHashByNumber retrieves a hash assigned to a canonical block number. -func GetHashByNumber(db common.Database, number uint64) common.Hash { - data, _ := db.Get(append(blockNumPre, big.NewInt(int64(number)).Bytes()...)) +// 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 common.Database) common.Hash { + data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } -// GetHeadHash retrieves the hash of the current canonical head block. -func GetHeadHash(db common.Database) common.Hash { - data, _ := db.Get(headKey) +// GetHeadBlockHash retrieves the hash of the current canonical head block. +func GetHeadBlockHash(db common.Database) common.Hash { + data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} } return common.BytesToHash(data) } -// GetHeaderRLPByHash retrieves a block header in its raw RLP database encoding, -// or nil if the header's not found. -func GetHeaderRLPByHash(db common.Database, hash common.Hash) []byte { - data, _ := db.Get(append(headerHashPre, hash[:]...)) +// GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil +// if the header's not found. +func GetHeaderRLP(db common.Database, hash common.Hash) rlp.RawValue { + data, _ := db.Get(append(append(blockPrefix, hash[:]...), headerSuffix...)) return data } -// GetHeaderByHash retrieves the block header corresponding to the hash, nil if -// none found. -func GetHeaderByHash(db common.Database, hash common.Hash) *types.Header { - data := GetHeaderRLPByHash(db, hash) +// GetHeader retrieves the block header corresponding to the hash, nil if none +// found. +func GetHeader(db common.Database, hash common.Hash) *types.Header { + data := GetHeaderRLP(db, hash) if len(data) == 0 { return nil } @@ -162,69 +163,61 @@ func GetHeaderByHash(db common.Database, hash common.Hash) *types.Header { return header } -// GetBodyRLPByHash retrieves the block body (transactions and uncles) in RLP -// encoding, and the associated total difficulty. -func GetBodyRLPByHash(db common.Database, hash common.Hash) ([]byte, *big.Int) { - combo, _ := db.Get(append(bodyHashPre, hash[:]...)) - if len(combo) == 0 { - return nil, nil - } - buffer := bytes.NewBuffer(combo) - - td := new(big.Int) - if err := rlp.Decode(buffer, td); err != nil { - glog.V(logger.Error).Infof("invalid block td RLP for hash %x: %v", hash, err) - return nil, nil - } - return buffer.Bytes(), td +// GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. +func GetBodyRLP(db common.Database, hash common.Hash) rlp.RawValue { + data, _ := db.Get(append(append(blockPrefix, hash[:]...), bodySuffix...)) + return data } -// GetBodyByHash retrieves the block body (transactons, uncles, total difficulty) -// corresponding to the hash, nils if none found. -func GetBodyByHash(db common.Database, hash common.Hash) ([]*types.Transaction, []*types.Header, *big.Int) { - data, td := GetBodyRLPByHash(db, hash) - if len(data) == 0 || td == nil { - return nil, nil, nil +// GetBody retrieves the block body (transactons, uncles) corresponding to the +// hash, nil if none found. +func GetBody(db common.Database, hash common.Hash) *types.Body { + data := GetBodyRLP(db, hash) + if len(data) == 0 { + return nil } - body := new(storageBody) + 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, nil, nil + return nil } - return body.Transactions, body.Uncles, td + return body } -// GetBlockByHash retrieves an entire block corresponding to the hash, assembling -// it back from the stored header and body. -func GetBlockByHash(db common.Database, hash common.Hash) *types.Block { - // Retrieve the block header and body contents - header := GetHeaderByHash(db, hash) - if header == nil { +// GetTd retrieves a block's total difficulty corresponding to the hash, nil if +// none found. +func GetTd(db common.Database, hash common.Hash) *big.Int { + data, _ := db.Get(append(append(blockPrefix, hash.Bytes()...), tdSuffix...)) + if len(data) == 0 { return nil } - transactions, uncles, td := GetBodyByHash(db, hash) - if td == 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 } - // Reassemble the block and return - block := types.NewBlockWithHeader(header).WithBody(transactions, uncles) - block.Td = td - - return block + return td } -// GetBlockByNumber 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 { +// GetBlock retrieves an entire block corresponding to the hash, assembling it +// back from the stored header and body. +func GetBlock(db common.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 } - return GetBlockByHash(db, common.BytesToHash(key)) + // Reassemble the block and return + return types.NewBlockWithHeader(header).WithBody(body.Transactions, body.Uncles) } -// WriteCanonNumber stores the canonical hash for the given block number. -func WriteCanonNumber(db common.Database, hash common.Hash, number uint64) error { - key := append(blockNumPre, big.NewInt(int64(number)).Bytes()...) +// WriteCanonicalHash stores the canonical hash for the given block number. +func WriteCanonicalHash(db common.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 @@ -232,14 +225,19 @@ func WriteCanonNumber(db common.Database, hash common.Hash, number uint64) error return nil } -// WriteHead updates the head block of the chain database. -func WriteHead(db common.Database, block *types.Block) error { - if err := WriteCanonNumber(db, block.Hash(), block.NumberU64()); err != nil { - glog.Fatalf("failed to store canonical number into database: %v", err) +// WriteHeadHeaderHash stores the head header's hash. +func WriteHeadHeaderHash(db common.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 } - if err := db.Put(headKey, block.Hash().Bytes()); err != nil { - glog.Fatalf("failed to store last block into database: %v", err) + return nil +} + +// WriteHeadBlockHash stores the head block's hash. +func WriteHeadBlockHash(db common.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 @@ -251,7 +249,7 @@ func WriteHeader(db common.Database, header *types.Header) error { if err != nil { return err } - key := append(headerHashPre, header.Hash().Bytes()...) + 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 @@ -261,28 +259,39 @@ func WriteHeader(db common.Database, header *types.Header) error { } // WriteBody serializes the body of a block into the database. -func WriteBody(db common.Database, block *types.Block) error { - body, err := rlp.EncodeToBytes(&storageBody{block.Transactions(), block.Uncles()}) +func WriteBody(db common.Database, hash common.Hash, body *types.Body) error { + data, err := rlp.EncodeToBytes(body) if err != nil { return err } - td, err := rlp.EncodeToBytes(block.Td) + 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 +} + +// WriteTd serializes the total difficulty of a block into the database. +func WriteTd(db common.Database, hash common.Hash, td *big.Int) error { + data, err := rlp.EncodeToBytes(td) if err != nil { return err } - key := append(bodyHashPre, block.Hash().Bytes()...) - if err := db.Put(key, append(td, body...)); err != nil { - glog.Fatalf("failed to store block body into database: %v", 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 body #%v [%x…]", block.Number, block.Hash().Bytes()[:4]) + 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 common.Database, block *types.Block) error { // Store the body first to retain database consistency - if err := WriteBody(db, block); err != nil { + if err := WriteBody(db, block.Hash(), &types.Body{block.Transactions(), block.Uncles()}); err != nil { return err } // Store the header too, signaling full block ownership @@ -292,20 +301,31 @@ func WriteBlock(db common.Database, block *types.Block) error { return nil } +// DeleteCanonicalHash removes the number to hash canonical mapping. +func DeleteCanonicalHash(db common.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 common.Database, hash common.Hash) { - db.Delete(append(headerHashPre, hash.Bytes()...)) + db.Delete(append(append(blockPrefix, hash.Bytes()...), headerSuffix...)) } // DeleteBody removes all block body data associated with a hash. func DeleteBody(db common.Database, hash common.Hash) { - db.Delete(append(bodyHashPre, hash.Bytes()...)) + db.Delete(append(append(blockPrefix, hash.Bytes()...), bodySuffix...)) +} + +// DeleteTd removes all block total difficulty data associated with a hash. +func DeleteTd(db common.Database, hash common.Hash) { + db.Delete(append(append(blockPrefix, hash.Bytes()...), tdSuffix...)) } // DeleteBlock removes all block data associated with a hash. func DeleteBlock(db common.Database, hash common.Hash) { DeleteHeader(db, hash) DeleteBody(db, hash) + DeleteTd(db, hash) } // [deprecated by eth/63] diff --git a/core/chain_util_test.go b/core/chain_util_test.go index 4bbe8119429a..3f0446715b83 100644 --- a/core/chain_util_test.go +++ b/core/chain_util_test.go @@ -23,6 +23,10 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto/sha3" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/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/genesis.go b/core/genesis.go index 6fbc671b06e3..3a8f0af0cc89 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -82,28 +82,29 @@ 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.Hash(), block.NumberU64()) + 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 } @@ -120,7 +121,6 @@ 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 } diff --git a/core/types/block.go b/core/types/block.go index 558b46e010ff..7a84045a6320 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,19 @@ 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 eth 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 @@ -170,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 { @@ -276,20 +290,10 @@ func (b *StorageBlock) DecodeRLP(s *rlp.Stream) error { 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 } -// [deprecated by eth/63] -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 } @@ -360,7 +364,6 @@ func (b *Block) WithMiningResult(nonce uint64, mixDigest common.Hash) *Block { transactions: b.transactions, receipts: b.receipts, uncles: b.uncles, - Td: b.Td, } } @@ -390,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: @@ -398,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/eth/backend.go b/eth/backend.go index 59f2ab01a8ca..deb6d3d0f06b 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -316,9 +316,13 @@ func New(config *Config) (*Ethereum, error) { if err != nil { return nil, err } - case config.GenesisBlock != nil: // This is for testing only. + } + // 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 { @@ -752,7 +756,10 @@ func upgradeChainDatabase(db common.Database) error { // Load the block, split and serialize (order!) block := core.GetBlockByHashOld(db, common.BytesToHash(bytes.TrimPrefix(it.Key(), blockPrefix))) - if err := core.WriteBody(db, block); err != nil { + 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 { @@ -765,7 +772,10 @@ func upgradeChainDatabase(db common.Database) error { // Lastly, upgrade the head block, disabling the upgrade mechanism current := core.GetBlockByHashOld(db, head) - if err := core.WriteBody(db, current); err != nil { + if err := core.WriteTd(db, current.Hash(), current.DeprecatedTd()); err != nil { + return err + } + 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 { diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 73f95bf64863..d28985b3e3d6 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -87,6 +87,9 @@ 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) @@ -136,6 +139,7 @@ type Downloader struct { 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 @@ -168,7 +172,7 @@ 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 { +func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, headBlock headRetrievalFn, getTd tdRetrievalFn, insertChain chainInsertFn, dropPeer peerDropFn) *Downloader { return &Downloader{ mux: mux, queue: newQueue(), @@ -176,6 +180,7 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, he hasBlock: hasBlock, getBlock: getBlock, headBlock: headBlock, + getTd: getTd, insertChain: insertChain, dropPeer: dropPeer, newPeerCh: make(chan *peer, 1), @@ -582,7 +587,7 @@ func (d *Downloader) fetchHashes61(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 @@ -958,7 +963,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { // 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.headBlock().Td) > 0 { + if !gotHeaders && td.Cmp(d.getTd(d.headBlock().Hash())) > 0 { return errStallingPeer } return nil diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 8d009b671701..dbcf93607cb2 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -93,21 +93,25 @@ 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 } // 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 } @@ -119,8 +123,8 @@ func (dl *downloadTester) sync(id string, td *big.Int) error { // 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) @@ -152,6 +156,11 @@ func (dl *downloadTester) headBlock() *types.Block { 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 { + return dl.ownChainTd[hash] +} + // insertChain injects a new batch of blocks into the simulated chain. func (dl *downloadTester) insertChain(blocks types.Blocks) (int, error) { for i, block := range blocks { @@ -160,6 +169,7 @@ func (dl *downloadTester) insertChain(blocks types.Blocks) (int, error) { } dl.ownHashes = append(dl.ownHashes, block.Hash()) dl.ownBlocks[block.Hash()] = block + dl.ownChainTd[block.Hash()] = dl.ownChainTd[block.ParentHash()] } return len(blocks), nil } @@ -180,9 +190,16 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha // 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 @@ -192,6 +209,7 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha func (dl *downloadTester) dropPeer(id string) { delete(dl.peerHashes, id) delete(dl.peerBlocks, id) + delete(dl.peerChainTds, id) dl.downloader.UnregisterPeer(id) } diff --git a/eth/handler.go b/eth/handler.go index 95f4e8ce2180..4aef6904363a 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -36,8 +36,10 @@ import ( "github.com/ethereum/go-ethereum/rlp" ) -// This is the target maximum size of returned blocks, headers or node data. -const softResponseLimit = 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...)) @@ -113,7 +115,7 @@ 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) @@ -363,7 +365,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { break } headers = append(headers, origin) - bytes += 500 // Approximate, should be good enough estimate + bytes += estHeaderRlpSize // Advance to the next header of the query switch { @@ -453,7 +455,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { var ( hash common.Hash bytes int - bodies []*blockBodyRLP + bodies []rlp.RawValue ) for bytes < softResponseLimit && len(bodies) < downloader.MaxBlockFetch { // Retrieve the hash of the next block @@ -464,9 +466,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { } // Retrieve the requested block body, stopping if enough was found if data := pm.chainman.GetBodyRLP(hash); len(data) != 0 { - body := blockBodyRLP(data) - bodies = append(bodies, &body) - bytes += len(body) + bodies = append(bodies, data) + bytes += len(data) } } return p.SendBlockBodiesRLP(bodies) @@ -644,7 +645,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 diff --git a/eth/peer.go b/eth/peer.go index f1ddd97265e4..603b49b88935 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" "gopkg.in/fatih/set.v0" ) @@ -186,8 +187,8 @@ func (p *peer) SendBlockBodies(bodies []*blockBody) error { // SendBlockBodiesRLP sends a batch of block contents to the remote peer from // an already RLP encoded format. -func (p *peer) SendBlockBodiesRLP(bodies []*blockBodyRLP) error { - return p2p.Send(p.rw, BlockBodiesMsg, blockBodiesRLPData(bodies)) +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 diff --git a/eth/protocol.go b/eth/protocol.go index 24007bbb5200..49f096a3b230 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -213,22 +213,6 @@ type blockBody struct { // blockBodiesData is the network packet for block content distribution. type blockBodiesData []*blockBody -// blockBodyRLP represents the RLP encoded data content of a single block. -type blockBodyRLP []byte - -// EncodeRLP is a specialized encoder for a block body to pass the already -// encoded body RLPs from the database on, without double encoding. -func (b *blockBodyRLP) EncodeRLP(w io.Writer) error { - if _, err := w.Write([]byte(*b)); err != nil { - return err - } - return nil -} - -// blockBodiesRLPData is the network packet for block content distribution -// based on original RLP formatting (i.e. skip the db-decode/proto-encode). -type blockBodiesRLPData []*blockBodyRLP - // nodeDataData is the network response packet for a node data retrieval. type nodeDataData []struct { Value []byte diff --git a/miner/worker.go b/miner/worker.go index 16a16931d701..2f43b110f982 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -283,7 +283,7 @@ func (self *worker) wait() { 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 +533,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/rpc/api/eth.go b/rpc/api/eth.go index ba87e86c655f..a93e41157086 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -204,7 +204,8 @@ func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interfa return nil, shared.NewDecodeParamError(err.Error()) } - block := NewBlockRes(self.xeth.EthBlockByHash(args.Hash), false) + raw := self.xeth.EthBlockByHash(args.Hash) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) if block == nil { return nil, nil } else { @@ -218,7 +219,8 @@ func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (inter return nil, shared.NewDecodeParamError(err.Error()) } - block := NewBlockRes(self.xeth.EthBlockByNumber(args.BlockNumber), false) + raw := self.xeth.EthBlockByNumber(args.BlockNumber) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) if block == nil { return nil, nil } else { @@ -232,12 +234,12 @@ func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByHash(args.Hash) - br := NewBlockRes(block, false) - if br == nil { + raw := self.xeth.EthBlockByHash(args.Hash) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()), nil + return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil } func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}, error) { @@ -246,12 +248,12 @@ func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{} return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block, false) - if br == nil { + raw := self.xeth.EthBlockByNumber(args.BlockNumber) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(br.Uncles))).Bytes()), nil + return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil } func (self *ethApi) GetData(req *shared.Request) (interface{}, error) { @@ -362,7 +364,7 @@ func (self *ethApi) GetBlockByHash(req *shared.Request) (interface{}, error) { } block := self.xeth.EthBlockByHash(args.BlockHash) - return NewBlockRes(block, args.IncludeTxs), nil + return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { @@ -372,8 +374,7 @@ func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { } block := self.xeth.EthBlockByNumber(args.BlockNumber) - br := NewBlockRes(block, args.IncludeTxs) - return br, nil + return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } func (self *ethApi) GetTransactionByHash(req *shared.Request) (interface{}, error) { @@ -402,16 +403,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) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if block == nil { return nil, nil } - - if args.Index >= int64(len(br.Transactions)) || args.Index < 0 { + 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 +421,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) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if block == nil { return nil, nil } - - if args.Index >= int64(len(v.Transactions)) || args.Index < 0 { + 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 +439,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) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + if block == nil { return nil, nil } - - if args.Index >= int64(len(br.Uncles)) || args.Index < 0 { + 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 +457,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) + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) + if block == nil { return nil, nil } - - if args.Index >= int64(len(v.Uncles)) || args.Index < 0 { + 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 } } diff --git a/rpc/api/parsing.go b/rpc/api/parsing.go index 5858bc1361d3..cdfaa0ed11da 100644 --- a/rpc/api/parsing.go +++ b/rpc/api/parsing.go @@ -281,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 } @@ -299,7 +299,7 @@ func NewBlockRes(block *types.Block, fullTx bool) *BlockRes { 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/tests/block_test_util.go b/tests/block_test_util.go index 2090afce719e..30488951d46f 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -440,9 +440,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/xeth/xeth.go b/xeth/xeth.go index 8bd45998f12a..00b70da6c994 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() } From 17b729759b308a44ebe339fd373a190d0aaf1672 Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 10 Sep 2015 14:12:41 +0200 Subject: [PATCH 41/90] Solidity Compiler - solc new API * adapt to new compiler versioning * use compiler version as language version * implement new solc API for versions >= 0.1.[2-9][0-9]* fixes #1770 * add optimize=1 to options * backward compatibility (for now) for <= 0.1.1, and old versions (0.[2-9][0-9]*.[0-9]+) * introduce compilerOptions to ContractInfo * clean up flair, include full version string to version line and ContractInfo --- common/compiler/solidity.go | 60 +++++++++++++++++++++++--------- common/compiler/solidity_test.go | 12 +++---- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 67815a72673e..5ded4fc6e961 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -34,15 +34,10 @@ import ( "github.com/ethereum/go-ethereum/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]+") + newAPIRegexp = regexp.MustCompile("0\\.1\\.[2-9][0-9]*") + paramsLegacy = []string{ "--binary", // Request to output the contract in binary (hexadecimal). "file", // "--json-abi", // Request to output the contract's JSON ABI interface. @@ -54,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=1", // code optimizer switched on + "-o", // output directory + } ) type Contract struct { @@ -66,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) { @@ -94,17 +101,22 @@ func New(solcPath string) (sol *Solidity, err error) { return } - version := versionRegExp.FindString(out.String()) + fullVersion := out.String() + version := versionRegExp.FindString(fullVersion) + legacy := !newAPIRegexp.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 { @@ -127,6 +139,15 @@ func (sol *Solidity) Compile(source string) (map[string]*Contract, error) { // 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 = strings.NewReader(source) @@ -136,7 +157,7 @@ func (sol *Solidity) Compile(source string) (map[string]*Contract, error) { return nil, fmt.Errorf("solc: %v\n%s", err, string(stderr.Bytes())) } // Sanity check that something was actually built - matches, _ := filepath.Glob(wd + "/*.binary") + matches, _ := filepath.Glob(wd + "/*\\.bin*") if len(matches) < 1 { return nil, fmt.Errorf("solc: no build results found") } @@ -148,7 +169,11 @@ func (sol *Solidity) Compile(source string) (map[string]*Contract, error) { // Parse the individual compilation results (code binary, ABI definitions, user and dev docs) var binary []byte - if binary, err = ioutil.ReadFile(filepath.Join(wd, base+".binary")); err != nil { + binext := ".bin" + if sol.legacy { + binext = ".binary" + } + 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) } @@ -178,8 +203,9 @@ func (sol *Solidity) Compile(source string) (map[string]*Contract, error) { Info: ContractInfo{ Source: source, Language: "Solidity", - LanguageVersion: languageVersion, + LanguageVersion: sol.version, CompilerVersion: sol.version, + CompilerOptions: compilerOptions, AbiDefinition: abi, UserDoc: userdoc, DeveloperDoc: devdoc, diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 3303bc15a1cd..905a5957c4bb 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -26,7 +26,7 @@ import ( "github.com/ethereum/go-ethereum/common" ) -const solcVersion = "0.9.23" +const solcVersion = "0.1.1" var ( source = ` @@ -37,16 +37,16 @@ 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.Skip("solc not found: skip: %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) } @@ -111,4 +111,4 @@ func TestSaveInfo(t *testing.T) { if cinfohash != infohash { t.Errorf("content hash for info is incorrect. expected %v, got %v", infohash.Hex(), cinfohash.Hex()) } -} \ No newline at end of file +} From 0d4072777520a665637937efd440e06f18ea0626 Mon Sep 17 00:00:00 2001 From: "Jeff R. Allen" Date: Thu, 10 Sep 2015 21:48:20 +0600 Subject: [PATCH 42/90] Change go-uuid to use the current supported repository. --- Godeps/Godeps.json | 9 ++- .../src/github.com/pborman/uuid/CONTRIBUTORS | 1 + .../pborman}/uuid/LICENSE | 2 +- .../pborman}/uuid/dce.go | 0 .../pborman}/uuid/doc.go | 0 .../pborman}/uuid/hash.go | 0 .../src/github.com/pborman/uuid/json.go | 30 +++++++++ .../src/github.com/pborman/uuid/json_test.go | 32 +++++++++ .../pborman}/uuid/node.go | 0 .../src/github.com/pborman/uuid/seq_test.go | 66 +++++++++++++++++++ .../src/github.com/pborman/uuid/sql.go | 40 +++++++++++ .../src/github.com/pborman/uuid/sql_test.go | 53 +++++++++++++++ .../pborman}/uuid/time.go | 10 +-- .../pborman}/uuid/util.go | 0 .../pborman}/uuid/uuid.go | 0 .../pborman}/uuid/uuid_test.go | 0 .../pborman}/uuid/version1.go | 4 +- .../pborman}/uuid/version4.go | 0 crypto/crypto.go | 2 +- crypto/key.go | 2 +- crypto/key_store_passphrase.go | 2 +- 21 files changed, 237 insertions(+), 16 deletions(-) create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/CONTRIBUTORS rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/LICENSE (96%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/dce.go (100%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/doc.go (100%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/hash.go (100%) create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/json.go create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/json_test.go rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/node.go (100%) create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/sql.go create mode 100644 Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/time.go (93%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/util.go (100%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/uuid.go (100%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/uuid_test.go (100%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/version1.go (93%) rename Godeps/_workspace/src/{code.google.com/p/go-uuid => github.com/pborman}/uuid/version4.go (100%) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index c939ae67074d..8a9d042618ff 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", @@ -61,6 +56,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/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/crypto/crypto.go b/crypto/crypto.go index a474d6f13f24..b3a8d730b4c8 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/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/ecies" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/crypto/sha3" "github.com/ethereum/go-ethereum/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 d80b99759861..35139b67f21d 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/ethereum/go-ethereum/common" + "github.com/pborman/uuid" ) const ( diff --git a/crypto/key_store_passphrase.go b/crypto/key_store_passphrase.go index f21af8dd9f87..c7ee009872c3 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/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto/randentropy" + "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/scrypt" ) From 8c4dab77ba48dc68073fe1df79e7000043c0f966 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 14 Sep 2015 09:35:57 +0200 Subject: [PATCH 43/90] all: move common.Database to package ethdb --- cmd/geth/blocktestcmd.go | 3 +- cmd/geth/chaincmd.go | 3 +- cmd/geth/js_test.go | 2 +- cmd/utils/flags.go | 2 +- common/natspec/natspec_e2e_test.go | 2 +- core/bench_test.go | 2 +- core/block_processor.go | 5 ++-- core/chain_makers.go | 7 +++-- core/chain_manager.go | 5 ++-- core/chain_manager_test.go | 4 +-- core/chain_util.go | 45 +++++++++++++++--------------- core/genesis.go | 9 +++--- core/helper_test.go | 6 ++-- core/manager.go | 6 ++-- core/state/state_object.go | 7 +++-- core/state/statedb.go | 5 ++-- core/transaction_util.go | 10 +++---- eth/backend.go | 16 +++++------ eth/handler.go | 5 ++-- common/db.go => ethdb/interface.go | 3 +- miner/agent.go | 5 ++-- miner/worker.go | 3 +- tests/block_test_util.go | 2 +- tests/util.go | 3 +- 24 files changed, 85 insertions(+), 75 deletions(-) rename common/db.go => ethdb/interface.go (96%) diff --git a/cmd/geth/blocktestcmd.go b/cmd/geth/blocktestcmd.go index 4eff82e3d195..a667cfd60785 100644 --- a/cmd/geth/blocktestcmd.go +++ b/cmd/geth/blocktestcmd.go @@ -22,7 +22,6 @@ import ( "github.com/codegangsta/cli" "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/tests" @@ -103,7 +102,7 @@ func runBlockTest(ctx *cli.Context) { func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, 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 diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index c420459189fd..c5bc4b66ac52 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger/glog" ) @@ -191,7 +192,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/geth/js_test.go b/cmd/geth/js_test.go index 67c36dfe7111..2fd5a531dc44 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -103,7 +103,7 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *eth 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/utils/flags.go b/cmd/utils/flags.go index 95fb649e638f..b45ef0af2b5d 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -508,7 +508,7 @@ func SetupEth(ctx *cli.Context) { } // 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/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index fc8ca6af2e1c..ea28b457e34e 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -143,7 +143,7 @@ func testEth(t *testing.T) (ethereum *eth.Ethereum, 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 baae8a7a5e7f..d05b7d30b193 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 { diff --git a/core/block_processor.go b/core/block_processor.go index 1238fda7b98c..1d3bc6656a05 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -26,6 +26,7 @@ import ( "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -41,7 +42,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 +69,7 @@ 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), diff --git a/core/chain_makers.go b/core/chain_makers.go index f89218f82105..d3b7c42b66c7 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -22,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/pow" ) @@ -142,7 +143,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 { @@ -185,7 +186,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) @@ -201,7 +202,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_manager.go b/core/chain_manager.go index 407945f8eb25..1218b1a6e026 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -30,6 +30,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -60,7 +61,7 @@ const ( type ChainManager struct { //eth EthManager - chainDb common.Database + chainDb ethdb.Database processor types.BlockProcessor eventMux *event.TypeMux genesisBlock *types.Block @@ -90,7 +91,7 @@ type ChainManager struct { pow pow.PoW } -func NewChainManager(chainDb common.Database, pow pow.PoW, mux *event.TypeMux) (*ChainManager, error) { +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) diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index a20480de815b..67ca41f00bba 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -46,7 +46,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) @@ -380,7 +380,7 @@ 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.headerCache, _ = lru.New(100) diff --git a/core/chain_util.go b/core/chain_util.go index 0e3fa31f9e5d..33d94cebd5f5 100644 --- a/core/chain_util.go +++ b/core/chain_util.go @@ -22,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/params" @@ -111,7 +112,7 @@ func CalcGasLimit(parent *types.Block) *big.Int { } // GetCanonicalHash retrieves a hash assigned to a canonical block number. -func GetCanonicalHash(db common.Database, number uint64) common.Hash { +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{} @@ -124,7 +125,7 @@ func GetCanonicalHash(db common.Database, number uint64) common.Hash { // 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 common.Database) common.Hash { +func GetHeadHeaderHash(db ethdb.Database) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} @@ -133,7 +134,7 @@ func GetHeadHeaderHash(db common.Database) common.Hash { } // GetHeadBlockHash retrieves the hash of the current canonical head block. -func GetHeadBlockHash(db common.Database) common.Hash { +func GetHeadBlockHash(db ethdb.Database) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} @@ -143,14 +144,14 @@ func GetHeadBlockHash(db common.Database) common.Hash { // GetHeaderRLP retrieves a block header in its raw RLP database encoding, or nil // if the header's not found. -func GetHeaderRLP(db common.Database, hash common.Hash) rlp.RawValue { +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 common.Database, hash common.Hash) *types.Header { +func GetHeader(db ethdb.Database, hash common.Hash) *types.Header { data := GetHeaderRLP(db, hash) if len(data) == 0 { return nil @@ -164,14 +165,14 @@ func GetHeader(db common.Database, hash common.Hash) *types.Header { } // GetBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. -func GetBodyRLP(db common.Database, hash common.Hash) rlp.RawValue { +func GetBodyRLP(db ethdb.Database, hash common.Hash) rlp.RawValue { data, _ := db.Get(append(append(blockPrefix, hash[:]...), bodySuffix...)) return data } // GetBody retrieves the block body (transactons, uncles) corresponding to the // hash, nil if none found. -func GetBody(db common.Database, hash common.Hash) *types.Body { +func GetBody(db ethdb.Database, hash common.Hash) *types.Body { data := GetBodyRLP(db, hash) if len(data) == 0 { return nil @@ -186,7 +187,7 @@ func GetBody(db common.Database, hash common.Hash) *types.Body { // GetTd retrieves a block's total difficulty corresponding to the hash, nil if // none found. -func GetTd(db common.Database, hash common.Hash) *big.Int { +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 @@ -201,7 +202,7 @@ func GetTd(db common.Database, hash common.Hash) *big.Int { // GetBlock retrieves an entire block corresponding to the hash, assembling it // back from the stored header and body. -func GetBlock(db common.Database, hash common.Hash) *types.Block { +func GetBlock(db ethdb.Database, hash common.Hash) *types.Block { // Retrieve the block header and body contents header := GetHeader(db, hash) if header == nil { @@ -216,7 +217,7 @@ func GetBlock(db common.Database, hash common.Hash) *types.Block { } // WriteCanonicalHash stores the canonical hash for the given block number. -func WriteCanonicalHash(db common.Database, hash common.Hash, number uint64) error { +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) @@ -226,7 +227,7 @@ func WriteCanonicalHash(db common.Database, hash common.Hash, number uint64) err } // WriteHeadHeaderHash stores the head header's hash. -func WriteHeadHeaderHash(db common.Database, hash common.Hash) error { +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 @@ -235,7 +236,7 @@ func WriteHeadHeaderHash(db common.Database, hash common.Hash) error { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db common.Database, hash common.Hash) error { +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 @@ -244,7 +245,7 @@ func WriteHeadBlockHash(db common.Database, hash common.Hash) error { } // WriteHeader serializes a block header into the database. -func WriteHeader(db common.Database, header *types.Header) error { +func WriteHeader(db ethdb.Database, header *types.Header) error { data, err := rlp.EncodeToBytes(header) if err != nil { return err @@ -259,7 +260,7 @@ func WriteHeader(db common.Database, header *types.Header) error { } // WriteBody serializes the body of a block into the database. -func WriteBody(db common.Database, hash common.Hash, body *types.Body) error { +func WriteBody(db ethdb.Database, hash common.Hash, body *types.Body) error { data, err := rlp.EncodeToBytes(body) if err != nil { return err @@ -274,7 +275,7 @@ func WriteBody(db common.Database, hash common.Hash, body *types.Body) error { } // WriteTd serializes the total difficulty of a block into the database. -func WriteTd(db common.Database, hash common.Hash, td *big.Int) error { +func WriteTd(db ethdb.Database, hash common.Hash, td *big.Int) error { data, err := rlp.EncodeToBytes(td) if err != nil { return err @@ -289,7 +290,7 @@ func WriteTd(db common.Database, hash common.Hash, td *big.Int) error { } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db common.Database, block *types.Block) error { +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 @@ -302,27 +303,27 @@ func WriteBlock(db common.Database, block *types.Block) error { } // DeleteCanonicalHash removes the number to hash canonical mapping. -func DeleteCanonicalHash(db common.Database, number uint64) { +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 common.Database, hash common.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 common.Database, hash common.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 common.Database, hash common.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 common.Database, hash common.Hash) { +func DeleteBlock(db ethdb.Database, hash common.Hash) { DeleteHeader(db, hash) DeleteBody(db, hash) DeleteTd(db, hash) @@ -333,7 +334,7 @@ func DeleteBlock(db common.Database, hash common.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 common.Database, hash common.Hash) *types.Block { +func GetBlockByHashOld(db ethdb.Database, hash common.Hash) *types.Block { data, _ := db.Get(append(blockHashPre, hash[:]...)) if len(data) == 0 { return nil diff --git a/core/genesis.go b/core/genesis.go index 3a8f0af0cc89..727e2c75f141 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -27,13 +27,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/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 @@ -110,7 +111,7 @@ func WriteGenesisBlock(chainDb common.Database, reader io.Reader) (*types.Block, // 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) @@ -124,7 +125,7 @@ func GenesisBlockForTesting(db common.Database, addr common.Address, balance *bi return block } -func WriteGenesisBlockForTesting(db common.Database, addr common.Address, balance *big.Int) *types.Block { +func WriteGenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block { testGenesis := fmt.Sprintf(`{ "nonce":"0x%x", "gasLimit":"0x%x", @@ -137,7 +138,7 @@ func WriteGenesisBlockForTesting(db common.Database, addr common.Address, balanc 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 b21f31d7c834..81ea6fc22644 100644 --- a/core/helper_test.go +++ b/core/helper_test.go @@ -22,7 +22,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" // "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/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 8b0401b03195..0f108a6decaa 100644 --- a/core/manager.go +++ b/core/manager.go @@ -18,7 +18,7 @@ package core import ( "github.com/ethereum/go-ethereum/accounts" - "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" ) @@ -28,7 +28,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 69c64ae404f6..353f2357b2b2 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -23,6 +23,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/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,7 +88,7 @@ type StateObject struct { dirty bool } -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) @@ -96,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 diff --git a/core/state/statedb.go b/core/state/statedb.go index b754f088771b..24f97e32afc9 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -21,6 +21,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/trie" @@ -32,7 +33,7 @@ import ( // * Contracts // * Accounts type StateDB struct { - db common.Database + db ethdb.Database trie *trie.SecureTrie root common.Hash @@ -47,7 +48,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)} } diff --git a/core/transaction_util.go b/core/transaction_util.go index ce2ceac46391..69c6bc36fd67 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) @@ -78,7 +78,7 @@ func PutTransactions(db common.Database, block *types.Block, txs types.Transacti } // 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) @@ -108,7 +108,7 @@ func PutReceipts(db common.Database, receipts types.Receipts) error { } // 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 +124,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 +141,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/eth/backend.go b/eth/backend.go index deb6d3d0f06b..a923cfa7880e 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -128,7 +128,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 { @@ -210,8 +210,8 @@ type Ethereum struct { shutdownChan chan bool // DB interfaces - chainDb common.Database // Block chain databe - dappDb common.Database // Dapp database + chainDb ethdb.Database // Block chain database + dappDb ethdb.Database // Dapp database // Closed when databases are flushed and closed databasesClosed chan bool @@ -267,7 +267,7 @@ func New(config *Config) (*Ethereum, error) { newdb := config.NewDB if newdb == nil { - newdb = func(path string) (common.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) } + newdb = func(path string) (ethdb.Database, error) { return ethdb.NewLDBDatabase(path, config.DatabaseCache) } } // Open the chain database and perform any upgrades needed @@ -527,8 +527,8 @@ func (s *Ethereum) BlockProcessor() *core.BlockProcessor { return s.blockProcess func (s *Ethereum) TxPool() *core.TxPool { return s.txPool } func (s *Ethereum) Whisper() *whisper.Whisper { return s.whisper } func (s *Ethereum) EventMux() *event.TypeMux { return s.eventMux } -func (s *Ethereum) ChainDb() common.Database { return s.chainDb } -func (s *Ethereum) DappDb() common.Database { return s.dappDb } +func (s *Ethereum) ChainDb() ethdb.Database { return s.chainDb } +func (s *Ethereum) DappDb() ethdb.Database { return s.dappDb } func (s *Ethereum) IsListening() bool { return true } // Always listening func (s *Ethereum) PeerCount() int { return s.net.PeerCount() } func (s *Ethereum) Peers() []*p2p.Peer { return s.net.Peers() } @@ -717,7 +717,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() @@ -728,7 +728,7 @@ func saveBlockchainVersion(db common.Database, bcVersion int) { // upgradeChainDatabase ensures that the chain database stores block split into // separate header and body entries. -func upgradeChainDatabase(db common.Database) error { +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 { diff --git a/eth/handler.go b/eth/handler.go index 4aef6904363a..0a06ea3358d9 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -28,6 +28,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/eth/fetcher" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -61,7 +62,7 @@ func (ep extProt) GetBlock(hashes []common.Hash) error { return ep.getBlocks(has type ProtocolManager struct { txpool txPool chainman *core.ChainManager - chaindb common.Database + chaindb ethdb.Database downloader *downloader.Downloader fetcher *fetcher.Fetcher @@ -86,7 +87,7 @@ type ProtocolManager struct { // 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 common.Database) *ProtocolManager { +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, diff --git a/common/db.go b/ethdb/interface.go similarity index 96% rename from common/db.go rename to ethdb/interface.go index 60c090cdce24..598e8eaa331f 100644 --- a/common/db.go +++ b/ethdb/interface.go @@ -14,9 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package common +package ethdb -// Database interface type Database interface { Put(key []byte, value []byte) error Get(key []byte) ([]byte, error) diff --git a/miner/agent.go b/miner/agent.go index 7ccf8d2e0d56..e80b222c8329 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -19,11 +19,12 @@ package miner import ( "sync" + "sync/atomic" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/pow" - "sync/atomic" ) type CpuAgent struct { @@ -63,7 +64,7 @@ func (self *CpuAgent) Stop() { func (self *CpuAgent) Start() { self.mu.Lock() defer self.mu.Unlock() - + if !atomic.CompareAndSwapInt32(&self.isMining, 0, 1) { return // agent already started } diff --git a/miner/worker.go b/miner/worker.go index 2f43b110f982..96c42c292e7f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -100,7 +101,7 @@ type worker struct { eth core.Backend chain *core.ChainManager proc *core.BlockProcessor - chainDb common.Database + chainDb ethdb.Database coinbase common.Address gasPrice *big.Int diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 30488951d46f..e31ca6344617 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -197,7 +197,7 @@ func (test *BlockTest) makeEthConfig() *eth.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() }, } } diff --git a/tests/util.go b/tests/util.go index a9b5011a9a21..72d927ada198 100644 --- a/tests/util.go +++ b/tests/util.go @@ -27,6 +27,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" ) func checkLogs(tlog []Log, logs state.Logs) error { @@ -87,7 +88,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)) From 8b32f10f16f19c0b8985399fafdfe31af29493a1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 18 Aug 2015 13:42:21 +0200 Subject: [PATCH 44/90] ethdb: add NewBatch --- ethdb/database.go | 20 ++++++++++++++++++++ ethdb/interface.go | 6 ++++++ ethdb/memory_database.go | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/ethdb/database.go b/ethdb/database.go index 9e80e5409191..ad87f853d866 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -268,3 +268,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/ethdb/interface.go b/ethdb/interface.go index 598e8eaa331f..acb1b57c03df 100644 --- a/ethdb/interface.go +++ b/ethdb/interface.go @@ -22,4 +22,10 @@ type Database interface { 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 d50f8f9d4476..4fcce181219e 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -95,3 +95,26 @@ func (db *MemDatabase) LastKnownTD() []byte { func (db *MemDatabase) Flush() error { return nil } + +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 +} From d581dfee5fbd46f3e6c54e3fab2717105e6bd510 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 6 Jul 2015 01:19:16 +0200 Subject: [PATCH 45/90] ethdb: copy stored memdb values Storing a value in LevelDB copies the bytes, modifying the value afterwards does not affect the content of the database. This commit ensures that MemDatabase satisfies the same property. --- ethdb/memory_database.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index 4fcce181219e..fd5663fec830 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 } From b25258996059439df82687cc653ed14a5a9edce1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Mon, 14 Sep 2015 09:45:40 +0200 Subject: [PATCH 46/90] ethdb: remove Flush --- eth/backend.go | 35 ++--------------------------------- ethdb/database.go | 21 ++++++++------------- ethdb/interface.go | 1 - ethdb/memory_database.go | 4 ---- 4 files changed, 10 insertions(+), 51 deletions(-) diff --git a/eth/backend.go b/eth/backend.go index a923cfa7880e..349dfa6133ac 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -213,9 +213,6 @@ type Ethereum struct { chainDb ethdb.Database // Block chain database dappDb ethdb.Database // Dapp database - // Closed when databases are flushed and closed - databasesClosed chan bool - //*** SERVICES *** // State manager for processing new blocks and managing the over all states blockProcessor *core.BlockProcessor @@ -337,7 +334,6 @@ func New(config *Config) (*Ethereum, error) { eth := &Ethereum{ shutdownChan: make(chan bool), - databasesClosed: make(chan bool), chainDb: chainDb, dappDb: dappDb, eventMux: &event.TypeMux{}, @@ -549,8 +545,6 @@ func (s *Ethereum) Start() error { if err != nil { return err } - // periodically flush databases - go s.syncDatabases() if s.AutoDAG { s.StartAutoDAG() @@ -566,32 +560,6 @@ func (s *Ethereum) Start() error { return nil } -// sync databases every minute. If flushing fails we exit immediatly. The system -// may not continue under any circumstances. -func (s *Ethereum) 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 *Ethereum) StartForTest() { jsonlogger.LogJson(&logger.LogStarting{ ClientString: s.net.Name, @@ -622,12 +590,13 @@ func (s *Ethereum) 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 *Ethereum) WaitForShutdown() { - <-s.databasesClosed <-s.shutdownChan } diff --git a/ethdb/database.go b/ethdb/database.go index ad87f853d866..047821c303fa 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 { diff --git a/ethdb/interface.go b/ethdb/interface.go index acb1b57c03df..f4b787a52a1a 100644 --- a/ethdb/interface.go +++ b/ethdb/interface.go @@ -21,7 +21,6 @@ type Database interface { Get(key []byte) ([]byte, error) Delete(key []byte) error Close() - Flush() error NewBatch() Batch } diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go index fd5663fec830..81911f23fa97 100644 --- a/ethdb/memory_database.go +++ b/ethdb/memory_database.go @@ -91,10 +91,6 @@ func (db *MemDatabase) LastKnownTD() []byte { return data } -func (db *MemDatabase) Flush() error { - return nil -} - func (db *MemDatabase) NewBatch() Batch { return &memBatch{db: db} } From 3a5e7ed9a60c946f3f807422355b0dae83aadcf2 Mon Sep 17 00:00:00 2001 From: zelig Date: Tue, 15 Sep 2015 00:35:22 +0200 Subject: [PATCH 47/90] new solc api: * use legacy version matcher * optimise just a boolean flag * skipf for messages in tests --- common/compiler/solidity.go | 22 +++++++++++----------- common/compiler/solidity_test.go | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 5ded4fc6e961..aca3a1fc2980 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -35,8 +35,8 @@ import ( ) var ( - versionRegExp = regexp.MustCompile("[0-9]+\\.[0-9]+\\.[0-9]+") - newAPIRegexp = regexp.MustCompile("0\\.1\\.[2-9][0-9]*") + 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", // @@ -50,13 +50,13 @@ var ( "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=1", // code optimizer switched on - "-o", // output directory + "--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 } ) @@ -102,8 +102,8 @@ func New(solcPath string) (sol *Solidity, err error) { } fullVersion := out.String() - version := versionRegExp.FindString(fullVersion) - legacy := !newAPIRegexp.MatchString(version) + version := versionRegexp.FindString(fullVersion) + legacy := legacyRegexp.MatchString(version) sol = &Solidity{ solcPath: solcPath, diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 905a5957c4bb..258a78f52abb 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -46,9 +46,9 @@ contract test { func TestCompiler(t *testing.T) { sol, err := New("") if err != nil { - t.Skip("solc not found: skip: %v", err) + 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") } From 0a7d059b6a4365c671386855289bfdc3178e2d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 9 Sep 2015 19:02:54 +0300 Subject: [PATCH 48/90] eth, rpc: standardize the chain sync progress counters --- eth/downloader/downloader.go | 186 ++++++++++++---- eth/downloader/downloader_test.go | 341 +++++++++++++++++++++++++++++- rpc/api/admin.go | 12 -- rpc/api/admin_js.go | 4 - rpc/api/eth.go | 15 ++ rpc/api/eth_js.go | 4 + rpc/api/utils.go | 2 +- 7 files changed, 496 insertions(+), 68 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d28985b3e3d6..5a6bcdff03e0 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -130,10 +130,9 @@ type Downloader struct { 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 @@ -161,6 +160,7 @@ type Downloader struct { 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) } @@ -192,27 +192,14 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, he } } -// 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() +// 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() - // Figure out the import progress - d.importLock.Lock() - defer d.importLock.Unlock() - - 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. @@ -333,14 +320,29 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e switch { case p.version == eth61: - // Old eth/61, use forward, concurrent hash and block retrieval algorithm - number, err := d.findAncestor61(p) + // 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, number+1) }() - go func() { errc <- d.fetchBlocks61(number + 1) }() + 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 { @@ -351,14 +353,29 @@ func (d *Downloader) syncWithPeer(p *peer, hash common.Hash, td *big.Int) (err e return <-errc case p.version >= eth62: - // New eth/62, use forward, concurrent header and block body retrieval algorithm - number, err := d.findAncestor(p) + // Look up the sync boundaries: the common ancestor and the target block + latest, err := d.fetchHeight(p) if err != nil { return err } + 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.fetchHeaders(p, td, number+1) }() - go func() { errc <- d.fetchBodies(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 { @@ -401,6 +418,50 @@ func (d *Downloader) Terminate() { d.cancel() } +// 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) + + // Request the advertised remote head block and wait for the response + go p.getBlocks([]common.Hash{p.head}) + + timeout := time.After(blockSoftTTL) + for { + select { + case <-d.cancelCh: + return 0, 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 <-d.hashCh: + // Out of bounds hashes received, ignore them + + case blockPack := <-d.blockCh: + // 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 + } + // 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 + } + return blocks[0].NumberU64(), nil + + case <-timeout: + glog.V(logger.Debug).Infof("%v: head block timeout", p) + return 0, errTimeout + } + } +} + // 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. @@ -776,6 +837,50 @@ func (d *Downloader) fetchBlocks61(from uint64) error { } } +// 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 0, errCancelBlockFetch + + 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 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 + } + } +} + // 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. @@ -1203,16 +1308,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 @@ -1223,13 +1322,6 @@ func (d *Downloader) process() { if d.chainInsertHook != nil { d.chainInsertHook(blocks) } - // Reset the import statistics - d.importLock.Lock() - d.importStart = time.Now() - d.importQueue = blocks - d.importDone = 0 - d.importLock.Unlock() - // 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 { diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index dbcf93607cb2..6ce19480fa3b 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "math/big" + "sync" "sync/atomic" "testing" "time" @@ -99,6 +100,8 @@ type downloadTester struct { 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 + + lock sync.RWMutex } // newTester creates a new downloader test mocker. @@ -118,8 +121,8 @@ func newTester() *downloadTester { // 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) @@ -127,14 +130,19 @@ func (dl *downloadTester) sync(id string, td *big.Int) error { 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() if hashes+blocks == 0 && atomic.LoadInt32(&dl.downloader.processing) == 0 { break } + // If there are queued blocks, but the head is missing, it's a stale leftover + if hashes+blocks > 0 && atomic.LoadInt32(&dl.downloader.processing) == 0 && dl.downloader.queue.GetHeadBlock() == nil { + break + } // Otherwise sleep a bit and retry time.Sleep(time.Millisecond) } @@ -143,26 +151,41 @@ 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") @@ -183,9 +206,12 @@ 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 { + dl.lock.Lock() + defer dl.lock.Unlock() + err := dl.downloader.RegisterPeer(id, version, hashes[0], dl.peerGetRelHashesFn(id, delay), dl.peerGetAbsHashesFn(id, delay), dl.peerGetBlocksFn(id, delay), - nil, dl.peerGetAbsHeadersFn(id, delay), dl.peerGetBodiesFn(id, delay)) + 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)) @@ -207,6 +233,9 @@ 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) @@ -221,6 +250,9 @@ func (dl *downloadTester) peerGetRelHashesFn(id string, delay time.Duration) fun return func(head common.Hash) error { time.Sleep(delay) + dl.lock.RLock() + defer dl.lock.RUnlock() + // Gather the next batch of hashes hashes := dl.peerHashes[id] result := make([]common.Hash, 0, MaxHashFetch) @@ -250,6 +282,9 @@ func (dl *downloadTester) peerGetAbsHashesFn(id string, delay time.Duration) fun return func(head uint64, count int) error { time.Sleep(delay) + dl.lock.RLock() + defer dl.lock.RUnlock() + // Gather the next batch of hashes hashes := dl.peerHashes[id] result := make([]common.Hash, 0, count) @@ -271,6 +306,10 @@ func (dl *downloadTester) peerGetAbsHashesFn(id string, delay time.Duration) fun 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 { @@ -284,6 +323,27 @@ func (dl *downloadTester) peerGetBlocksFn(id string, delay time.Duration) func([ } } +// 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() + + // Use the absolute header fetcher to satisfy the query + return dl.peerGetAbsHeadersFn(id, delay)(number, amount, skip, reverse) + } +} + // 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. @@ -291,6 +351,9 @@ func (dl *downloadTester) peerGetAbsHeadersFn(id string, delay time.Duration) fu 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] @@ -315,6 +378,10 @@ func (dl *downloadTester) peerGetAbsHeadersFn(id string, delay time.Duration) fu 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)) @@ -384,13 +451,23 @@ 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) < time.Second; { time.Sleep(25 * time.Millisecond) + tester.downloader.queue.lock.RLock() cached = len(tester.downloader.queue.blockPool) + tester.downloader.queue.lock.RUnlock() + if cached == blockCacheLimit || len(tester.ownBlocks)+cached+int(atomic.LoadUint32(&blocked)) == targetBlocks+1 { break } @@ -727,3 +804,259 @@ func testBlockBodyAttackerDropping(t *testing.T, protocol int) { } } } + +// 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/rpc/api/admin.go b/rpc/api/admin.go index 5e392ae320df..8af69b189d11 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.ethereum.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 25dbb4a8d3a8..413ea8d476cf 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 a93e41157086..9680536c6da8 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, @@ -166,6 +167,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.ethereum.ChainManager().CurrentBlock().NumberU64() + origin, height := self.ethereum.Downloader().Boundaries() + + if current < height { + return map[string]interface{}{ + "startingBlock": origin, + "currentBlock": current, + "highestBlock": height, + }, nil + } + return false, nil +} + func (self *ethApi) GasPrice(req *shared.Request) (interface{}, error) { return newHexNum(self.xeth.DefaultGasPrice().Bytes()), nil } diff --git a/rpc/api/eth_js.go b/rpc/api/eth_js.go index 393dac22f4fc..81bb341bf40e 100644 --- a/rpc/api/eth_js.go +++ b/rpc/api/eth_js.go @@ -42,6 +42,10 @@ web3._extend({ new web3._extend.Property({ name: 'pendingTransactions', getter: 'eth_pendingTransactions' + }), + new web3._extend.Property({ + name: 'syncing', + getter: 'eth_syncing' }) ] }); diff --git a/rpc/api/utils.go b/rpc/api/utils.go index 5072dc2cdc6b..76b2c531d533 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", From 99b62f36b6443e8ed8ff4e8c09ee9267eeaea162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 15 Sep 2015 13:33:45 +0300 Subject: [PATCH 49/90] eth/downloader: header-chain order and ancestry check --- eth/downloader/downloader.go | 2 +- eth/downloader/downloader_test.go | 65 +++++++++++++++++++++++++++++-- eth/downloader/queue.go | 17 +++++++- 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 5a6bcdff03e0..f038e24e4138 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -1078,7 +1078,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { // 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) + inserts := d.queue.Insert(headerPack.headers, from) if len(inserts) != len(headerPack.headers) { glog.V(logger.Debug).Infof("%v: stale headers", p) return errBadPeer diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 6ce19480fa3b..885fab8bd5c0 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -139,10 +139,6 @@ func (dl *downloadTester) sync(id string, td *big.Int) error { if hashes+blocks == 0 && atomic.LoadInt32(&dl.downloader.processing) == 0 { break } - // If there are queued blocks, but the head is missing, it's a stale leftover - if hashes+blocks > 0 && atomic.LoadInt32(&dl.downloader.processing) == 0 && dl.downloader.queue.GetHeadBlock() == nil { - break - } // Otherwise sleep a bit and retry time.Sleep(time.Millisecond) } @@ -660,6 +656,67 @@ func testEmptyBlockShortCircuit(t *testing.T, protocol int) { } } +// 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) } + +func testMissingHeaderAttack(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + tester := newTester() + + // 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]) + + if err := tester.sync("attack", nil); err == nil { + t.Fatalf("succeeded attacker synchronisation") + } + // 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 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) } + +func testShiftedHeaderAttack(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + tester := newTester() + + // Attempt a full sync with an attacker feeding shifted headers + tester.newPeer("attack", protocol, hashes, blocks) + delete(tester.peerBlocks["attack"], hashes[len(hashes)-2]) + + if err := tester.sync("attack", nil); err == nil { + t.Fatalf("succeeded attacker synchronisation") + } + // 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 an invalid body for a requested block, it gets // dropped immediately by the downloader. func TestInvalidBlockBodyAttack62(t *testing.T) { testInvalidBlockBodyAttack(t, 62) } diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 7db78327b306..49d1046fbf98 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -57,6 +57,7 @@ type queue struct { 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 @@ -91,6 +92,7 @@ func (q *queue) Reset() { q.headerPool = make(map[common.Hash]*types.Header) q.headerQueue.Reset() + q.headerHead = common.Hash{} q.pendPool = make(map[string]*fetchRequest) @@ -186,7 +188,7 @@ func (q *queue) Insert61(hashes []common.Hash, fifo bool) []common.Hash { // Insert adds a set of headers for the download queue for scheduling, returning // the new headers encountered. -func (q *queue) Insert(headers []*types.Header) []*types.Header { +func (q *queue) Insert(headers []*types.Header, from uint64) []*types.Header { q.lock.Lock() defer q.lock.Unlock() @@ -196,13 +198,24 @@ func (q *queue) Insert(headers []*types.Header) []*types.Header { // Make sure no duplicate requests are executed hash := header.Hash() if _, ok := q.headerPool[hash]; ok { - glog.V(logger.Warn).Infof("Header %x already scheduled", hash) + 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 } From d4d3fc6a702d87bab7e04dcd5085a83205107c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 11 Sep 2015 18:41:42 +0300 Subject: [PATCH 50/90] jsre, rpc/api: pull in new web3 and use hex numbers --- jsre/ethereum_js.go | 789 ++++++++++++++++++++++++++++++++++---------- rpc/api/eth.go | 6 +- rpc/api/eth_js.go | 4 - 3 files changed, 612 insertions(+), 187 deletions(-) diff --git a/jsre/ethereum_js.go b/jsre/ethereum_js.go index f33bb7c25a23..2d7dbfec0a67 100644 --- a/jsre/ethereum_js.go +++ b/jsre/ethereum_js.go @@ -650,7 +650,7 @@ module.exports = SolidityTypeBytes; You should have received a copy of the GNU Lesser General Public License along with ethereum.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 ethereum.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 ethereum.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 ethereum.js. If not, see . */ -/** +/** * @file sha3.js * @author Marek Kotewicz * @date 2015 @@ -1876,7 +1876,7 @@ module.exports = function (str, isNew) { console.warn('new usage: \'web3.sha3("hello")\''); console.warn('see https://github.com/ethereum/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 ethereum.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 ethereum.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', @@ -1977,9 +1978,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 @@ -1997,40 +2019,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; }; @@ -2052,13 +2078,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; }; @@ -2113,7 +2139,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)) { @@ -2156,7 +2182,7 @@ var getValueOfUnit = function (unit) { * - -- microether szabo micro * - -- milliether finney milli * - ether -- -- - * - kether einstein grand + * - kether einstein grand * - mether * - gether * - tether @@ -2169,7 +2195,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); }; /** @@ -2178,12 +2204,12 @@ var fromWei = function(number, unit) { * Possible units are: * SI Short SI Full Effigy Other * - kwei femtoether ada - * - mwei picoether babbage + * - mwei picoether babbage * - gwei nanoether shannon nano * - -- microether szabo micro * - -- milliether finney milli * - ether -- -- - * - kether einstein grand + * - kether einstein grand * - mether * - gether * - tether @@ -2196,7 +2222,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); }; /** @@ -2215,7 +2241,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); }; @@ -2242,7 +2268,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); }; /** @@ -2253,7 +2279,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); }; /** @@ -2267,7 +2293,7 @@ var toAddress = function (address) { if (isStrictAddress(address)) { return address; } - + if (/^[0-9a-f]{40}$/.test(address)) { return '0x' + address; } @@ -2281,7 +2307,7 @@ var toAddress = function (address) { * * @method isBigNumber * @param {Object} - * @return {Boolean} + * @return {Boolean} */ var isBigNumber = function (object) { return object instanceof BigNumber || @@ -2290,7 +2316,7 @@ var isBigNumber = function (object) { /** * Returns true if object is string, otherwise false - * + * * @method isString * @param {Object} * @return {Boolean} @@ -2341,12 +2367,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} @@ -2365,7 +2391,9 @@ module.exports = { toHex: toHex, toDecimal: toDecimal, fromDecimal: fromDecimal, + toUtf8: toUtf8, toAscii: toAscii, + fromUtf8: fromUtf8, fromAscii: fromAscii, transformToFullName: transformToFullName, extractDisplayName: extractDisplayName, @@ -2386,10 +2414,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){ @@ -2426,6 +2453,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'); @@ -2480,6 +2508,10 @@ web3.version = {}; web3.version.api = version.version; web3.eth = {}; +web3.eth.isSyncing = function (callback) { + return new IsSyncing(callback); +}; + /*jshint maxparams:4 */ web3.eth.filter = function (fil, callback) { return new Filter(fil, watches.eth(), formatters.outputLogFormatter, callback); @@ -2499,14 +2531,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; @@ -2569,7 +2603,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/eth":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/eth":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 ethereum.js. @@ -2586,7 +2620,7 @@ module.exports = web3; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file allevents.js * @author Marek Kotewicz * @date 2014 @@ -2675,7 +2709,7 @@ module.exports = AllSolidityEvents; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file batch.js * @author Marek Kotewicz * @date 2015 @@ -2720,7 +2754,7 @@ Batch.prototype.execute = function () { requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result)); } }); - }); + }); }; module.exports = Batch; @@ -2743,13 +2777,13 @@ module.exports = Batch; You should have received a copy of the GNU Lesser General Public License along with ethereum.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'); @@ -2806,7 +2840,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) { @@ -2846,7 +2880,7 @@ var checkForContractAddress = function(contract, abi, callback){ // stop watching after 50 blocks (timeout) if(count > 50) { - + filter.stopWatching(); callbackFired = true; @@ -2866,7 +2900,7 @@ var checkForContractAddress = function(contract, abi, callback){ if(callbackFired) return; - + filter.stopWatching(); callbackFired = true; @@ -2910,7 +2944,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) @@ -2984,10 +3018,10 @@ ContractFactory.prototype.at = function (address, callback) { // attach functions addFunctionsToContract(contract, this.abi); addEventsToContract(contract, this.abi); - + if (callback) { callback(null, contract); - } + } return contract; }; @@ -3022,7 +3056,7 @@ module.exports = contract; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file errors.js * @author Marek Kotewicz * @date 2015 @@ -3062,7 +3096,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file event.js * @author Marek Kotewicz * @date 2014 @@ -3132,7 +3166,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 @@ -3163,7 +3197,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); @@ -3185,17 +3219,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; @@ -3230,7 +3264,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.eth(), formatter, callback); @@ -3301,7 +3335,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 @@ -3311,7 +3345,7 @@ var getOptions = function (options) { if (utils.isString(options)) { return options; - } + } options = options || {}; @@ -3327,8 +3361,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) + }; }; /** @@ -3336,7 +3370,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 @@ -3371,12 +3405,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({ @@ -3396,6 +3432,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){ @@ -3406,6 +3443,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); @@ -3444,16 +3488,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; @@ -3483,7 +3536,7 @@ module.exports = Filter; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @author Fabian Vogelsteller @@ -3550,7 +3603,7 @@ var inputCallFormatter = function (options){ options[key] = utils.fromDecimal(options[key]); }); - return options; + return options; }; /** @@ -3575,12 +3628,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} @@ -3599,7 +3652,7 @@ var outputTransactionFormatter = function (tx){ /** * Formats the output of a transaction receipt to its proper values - * + * * @method outputTransactionReceiptFormatter * @param {Object} receipt * @returns {Object} @@ -3625,7 +3678,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) { @@ -3653,7 +3706,7 @@ var outputBlockFormatter = function(block) { /** * Formats the output of a log - * + * * @method outputLogFormatter * @param {Object} log object * @returns {Object} log @@ -3690,10 +3743,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; }; /** @@ -3710,7 +3763,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); @@ -3721,7 +3774,7 @@ var outputPostFormatter = function(post){ post.topics = []; } post.topics = post.topics.map(function(topic){ - return utils.toAscii(topic); + return utils.toUtf8(topic); }); return post; @@ -3739,6 +3792,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, @@ -3751,7 +3814,8 @@ module.exports = { outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, outputBlockFormatter: outputBlockFormatter, outputLogFormatter: outputLogFormatter, - outputPostFormatter: outputPostFormatter + outputPostFormatter: outputPostFormatter, + outputSyncingFormatter: outputSyncingFormatter }; @@ -3869,8 +3933,8 @@ SolidityFunction.prototype.call = function () { if (!callback) { var output = web3.eth.call(payload, defaultBlock); return this.unpackOutput(output); - } - + } + var self = this; web3.eth.call(payload, defaultBlock, function (error, output) { callback(error, self.unpackOutput(output)); @@ -3944,11 +4008,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 }; }; @@ -4079,7 +4143,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; @@ -4093,7 +4157,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) { @@ -4103,13 +4167,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) { @@ -4157,7 +4221,7 @@ module.exports = HttpProvider; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file iban.js * @author Marek Kotewicz * @date 2015 @@ -4289,7 +4353,7 @@ Iban.isValid = function (iban) { * @returns {Boolean} true if it is, otherwise false */ Iban.prototype.isValid = function () { - return /^XE[0-9]{2}(ETH[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; }; @@ -4357,7 +4421,7 @@ Iban.prototype.address = function () { var base36 = this._iban.substr(4); var asBn = new BigNumber(base36, 36); return padLeft(asBn.toString(16), 20); - } + } return ''; }; @@ -4401,9 +4465,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); @@ -4413,7 +4477,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){ @@ -4423,7 +4487,7 @@ var IpcProvider = function (path, net) { this.connection.on('end', function(){ _this._timeout(); - }); + }); // LISTEN FOR CONNECTION RESPONSES @@ -4462,7 +4526,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,'}|--|{') // }{ @@ -4566,7 +4630,7 @@ IpcProvider.prototype.send = function (payload) { try { result = JSON.parse(data); } catch(e) { - throw errors.InvalidResponse(data); + throw errors.InvalidResponse(data); } return result; @@ -4743,7 +4807,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 @@ -4756,7 +4820,7 @@ Method.prototype.validateArgs = function (args) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -4784,7 +4848,7 @@ Method.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -4798,7 +4862,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; } }; @@ -5185,6 +5249,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', @@ -5284,8 +5353,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] }); @@ -5460,7 +5529,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file namereg.js * @author Marek Kotewicz * @date 2015 @@ -5516,7 +5585,7 @@ var Property = function (options) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -5551,7 +5620,7 @@ Property.prototype.extractCallback = function (args) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -5568,7 +5637,7 @@ Property.prototype.attachToObject = function (obj) { obj = obj[names[0]]; name = names[1]; } - + Object.defineProperty(obj, name, proto); var toAsyncName = function (prefix, name) { @@ -5648,7 +5717,7 @@ module.exports = Property; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file requestmanager.js * @author Jeffrey Wilcke * @author Marek Kotewicz @@ -5730,7 +5799,7 @@ RequestManager.prototype.sendAsync = function (data, callback) { if (err) { return callback(err); } - + if (!Jsonrpc.getInstance().isValidResponse(result)) { return callback(errors.InvalidResponse(result)); } @@ -5763,7 +5832,7 @@ RequestManager.prototype.sendBatch = function (data, callback) { } callback(err, results); - }); + }); }; /** @@ -5811,11 +5880,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); @@ -5843,10 +5916,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) { @@ -5855,8 +5928,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; @@ -5865,25 +5947,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); }); @@ -5910,7 +5990,110 @@ module.exports = RequestManager; You should have received a copy of the GNU Lesser General Public License along with ethereum.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 ethereum.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 @@ -5932,7 +6115,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'); } @@ -5940,7 +6123,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()); @@ -5949,7 +6132,7 @@ var transfer = function (from, to, value, callback) { namereg.addr(iban.institution(), function (err, address) { return deposit(from, address, value, iban.client(), callback); }); - + }; /** @@ -5990,9 +6173,9 @@ 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){ +},{"../contracts/SmartExchange.json":3,"../web3":22,"./contract":25,"./iban":32,"./namereg":41}],46:[function(require,module,exports){ -},{}],46:[function(require,module,exports){ +},{}],47:[function(require,module,exports){ ;(function (root, factory) { if (typeof exports === "object") { // CommonJS @@ -6735,7 +6918,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 @@ -7059,7 +7242,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 @@ -7364,7 +7547,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 @@ -7391,6 +7820,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/rpc/api/eth.go b/rpc/api/eth.go index 9680536c6da8..30366a95185d 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -173,9 +173,9 @@ func (self *ethApi) IsSyncing(req *shared.Request) (interface{}, error) { if current < height { return map[string]interface{}{ - "startingBlock": origin, - "currentBlock": current, - "highestBlock": height, + "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 diff --git a/rpc/api/eth_js.go b/rpc/api/eth_js.go index 81bb341bf40e..393dac22f4fc 100644 --- a/rpc/api/eth_js.go +++ b/rpc/api/eth_js.go @@ -42,10 +42,6 @@ web3._extend({ new web3._extend.Property({ name: 'pendingTransactions', getter: 'eth_pendingTransactions' - }), - new web3._extend.Property({ - name: 'syncing', - getter: 'eth_syncing' }) ] }); From 321733ab2349c411cb584b0f88d58c01afa7f83b Mon Sep 17 00:00:00 2001 From: Kobi Gurkan Date: Tue, 15 Sep 2015 23:35:36 +0300 Subject: [PATCH 51/90] cmd/geth: adds extradata flag --- cmd/geth/main.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index ba753a493683..f546f89cca9a 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -58,6 +58,11 @@ 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() { @@ -331,6 +336,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.GpobaseStepDownFlag, utils.GpobaseStepUpFlag, utils.GpobaseCorrectionFactorFlag, + ExtraDataFlag, } app.Before = func(ctx *cli.Context) error { utils.SetupLogger(ctx) @@ -354,6 +360,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 @@ -382,7 +396,7 @@ func run(ctx *cli.Context) { } cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) - cfg.ExtraData = makeDefaultExtra() + cfg.ExtraData = makeExtra(ctx) ethereum, err := eth.New(cfg) if err != nil { From 821619e1c356df092f2d82cea0d98996765f3933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 16 Sep 2015 10:44:09 +0300 Subject: [PATCH 52/90] core, eth, miner: use pure header validation --- core/block_processor.go | 46 +++++++++++++++++------------------- core/block_processor_test.go | 4 ++-- eth/handler.go | 2 +- miner/worker.go | 2 +- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/core/block_processor.go b/core/block_processor.go index 1238fda7b98c..b480948a0ba6 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -213,7 +213,7 @@ 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 +337,7 @@ 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 +367,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 e0b2d3313fc0..538cf4ee50f9 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -48,13 +48,13 @@ 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/eth/handler.go b/eth/handler.go index 4aef6904363a..77fe09e8f3fc 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -118,7 +118,7 @@ func NewProtocolManager(networkId int, mux *event.TypeMux, txpool txPool, pow po 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() diff --git a/miner/worker.go b/miner/worker.go index 2f43b110f982..7ad7475ea7c9 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -278,7 +278,7 @@ func (self *worker) wait() { glog.V(logger.Error).Infoln("Invalid block found during mining") continue } - if err := core.ValidateHeader(self.eth.BlockProcessor().Pow, block.Header(), parent, true, false); err != nil && err != core.BlockFutureErr { + if err := core.ValidateHeader(self.eth.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 } From 2f65ddc50107399e867e28eca7e18ddd12b596c6 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Wed, 16 Sep 2015 11:57:33 +0200 Subject: [PATCH 53/90] jsre: timer bugfix when clearInterval was called from within the callback --- jsre/jsre.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jsre/jsre.go b/jsre/jsre.go index 0db9e33fc575..af7d507c6d0a 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) From 1a1a1ee4ff1b664a5f14599e0e57da892c187855 Mon Sep 17 00:00:00 2001 From: Kobi Gurkan Date: Wed, 16 Sep 2015 21:01:21 +0300 Subject: [PATCH 54/90] cmd/geth: extradata is correcly initialized with console --- cmd/geth/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index f546f89cca9a..b54d85c22be6 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -360,7 +360,7 @@ func main() { } } -// MakeExtra resolves extradata for the miner from a flag or returns a default. +// 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)) @@ -444,6 +444,8 @@ func console(ctx *cli.Context) { utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name)) cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx) + cfg.ExtraData = makeExtra(ctx) + ethereum, err := eth.New(cfg) if err != nil { utils.Fatalf("%v", err) From 6f3cb12924a87525026c814078ebf3a7f9cb0acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 17 Sep 2015 13:32:00 +0300 Subject: [PATCH 55/90] core: allow modifying test-chain block times --- core/chain_makers.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/chain_makers.go b/core/chain_makers.go index d3b7c42b66c7..70233438d8e6 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -131,6 +131,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. From b60a27627b32dd0e76269732b834ece1fe7d5c3a Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 18 Sep 2015 11:59:21 +0200 Subject: [PATCH 56/90] core: transaction nonce recovery fix When the transaction state recovery kicked in it assigned the last (incorrect) nonce to the pending state which caused transactions with the same nonce to occur. Added test for nonce recovery --- core/transaction_pool.go | 4 ++-- core/transaction_pool_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 42e26b3b3813..513600be354e 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -121,8 +121,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 7d09847401b8..d9267cc435ab 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -219,3 +219,22 @@ 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) + } +} From 075815e5ff98a1ba59be58f3081f222f5bb6da1f Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 14 Sep 2015 14:27:25 +0200 Subject: [PATCH 57/90] tests: update common test wrappers and test files --- tests/block_test_util.go | 85 +- tests/files/BasicTests/difficulty.json | 12521 ++++++++++++++++ tests/files/BlockchainTests/bcUncleTest.json | 8 +- .../BlockchainTests/bcValidBlockTest.json | 248 +- tests/files/VMTests/vmArithmeticTest.json | 626 +- .../VMTests/vmIOandFlowOperationsTest.json | 35 + tests/state_test_util.go | 3 - 7 files changed, 13102 insertions(+), 424 deletions(-) diff --git a/tests/block_test_util.go b/tests/block_test_util.go index e31ca6344617..8bda31683f75 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -44,8 +44,9 @@ import ( type BlockTest struct { Genesis *types.Block - Json *btJSON - preAccounts map[string]btAccount + Json *btJSON + preAccounts map[string]btAccount + postAccounts map[string]btAccount } type btJSON struct { @@ -147,7 +148,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,7 +173,7 @@ func runBlockTest(test *BlockTest) error { } // import pre accounts - statedb, err := test.InsertPreState(ethereum) + _, err = test.InsertPreState(ethereum) if err != nil { return fmt.Errorf("InsertPreState: %v", err) } @@ -183,7 +183,8 @@ func runBlockTest(test *BlockTest) error { return err } - if err = test.ValidatePostState(statedb); err != nil { + newDB := ethereum.ChainManager().State() + if err = test.ValidatePostState(newDB); err != nil { return fmt.Errorf("post state validation failed: %v", err) } return nil @@ -265,6 +266,7 @@ func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, erro post state. */ func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { + blockNums := make(map[string]bool) // insert the test blocks, which will execute all transactions for _, b := range t.Json.Blocks { cb, err := mustConvertBlock(b) @@ -287,9 +289,35 @@ func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { if b.BlockHeader == nil { return 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 = t.validateBlockHeader(b.BlockHeader, cb.Header()); err != nil { + return fmt.Errorf("Deserialised block header validation failed: %v", err) + } + + // validate the imported header against test file JSON + + /* + TODO: currently test files do not contain information on what + reorg is expected other than possibly the post state (which may + or may not depend on a specific chain). + + discussed with winswega and it was agreed to add this information + to the test files explicitly. + + meanwhile we skip header validation on blocks with the same block + number as a prior block, since this test code cannot know what + blocks are in the longest chain without making use of the very + protocol rules the tests verify or rely on the correctness of the + code that is being tested. + + */ + if !blockNums[b.BlockHeader.Number] { + importedBlock := chainManager.CurrentBlock() + if err = t.validateBlockHeader(b.BlockHeader, importedBlock.Header()); err != nil { + return fmt.Errorf("Imported block header validation failed: %v", err) + } + blockNums[b.BlockHeader.Number] = true } } return nil @@ -298,83 +326,84 @@ func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { func (s *BlockTest) validateBlockHeader(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 +427,13 @@ 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 @@ -432,7 +461,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} out.Genesis = mustConvertGenesis(in.GenesisBlockHeader) return out, err } 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/BlockchainTests/bcUncleTest.json b/tests/files/BlockchainTests/bcUncleTest.json index 0d0e83c0c168..518685fda61c 100644 --- a/tests/files/BlockchainTests/bcUncleTest.json +++ b/tests/files/BlockchainTests/bcUncleTest.json @@ -4826,23 +4826,23 @@ "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 index 66b3c25eb59b..8c29d465e5bc 100644 --- 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/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json index 88d3c1e5b24f..b3a19be65583 100644 --- 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/vmIOandFlowOperationsTest.json b/tests/files/VMTests/vmIOandFlowOperationsTest.json index b1e7cf095038..0eb6a4365658 100644 --- a/tests/files/VMTests/vmIOandFlowOperationsTest.json +++ b/tests/files/VMTests/vmIOandFlowOperationsTest.json @@ -4845,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" : [ ], diff --git a/tests/state_test_util.go b/tests/state_test_util.go index def9b0c36df6..0868224612ed 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -181,9 +181,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())) From 47ca6904b326165e394859f15bd2c374f7351847 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Fri, 18 Sep 2015 17:15:59 +0200 Subject: [PATCH 58/90] tests: use lastblockhash field to validate reorgs and block headers --- cmd/geth/blocktestcmd.go | 16 +++---- tests/block_test_util.go | 90 ++++++++++++++++++++++------------------ 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/cmd/geth/blocktestcmd.go b/cmd/geth/blocktestcmd.go index a667cfd60785..d3257ca4d53f 100644 --- a/cmd/geth/blocktestcmd.go +++ b/cmd/geth/blocktestcmd.go @@ -111,25 +111,27 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er if err != nil { return nil, err } - // if err := ethereum.Start(); err != nil { - // return nil, err - // } // import the genesis block ethereum.ResetWithGenesisBlock(test.Genesis) // import pre accounts - statedb, err := test.InsertPreState(ethereum) + _, err = test.InsertPreState(ethereum) if err != nil { return ethereum, fmt.Errorf("InsertPreState: %v", err) } - if err := test.TryBlocksInsert(ethereum.ChainManager()); err != nil { + cm := ethereum.ChainManager() + + validBlocks, err := test.TryBlocksInsert(cm) + if err != nil { return ethereum, 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 ethereum, fmt.Errorf("post state validation failed: %v", err) } - return ethereum, nil + + return ethereum, test.ValidateImportedHeaders(cm, validBlocks) } diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 8bda31683f75..3ca00bae82c9 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -44,9 +44,10 @@ import ( type BlockTest struct { Genesis *types.Block - Json *btJSON - preAccounts map[string]btAccount - postAccounts map[string]btAccount + Json *btJSON + preAccounts map[string]btAccount + postAccounts map[string]btAccount + lastblockhash string } type btJSON struct { @@ -54,6 +55,7 @@ type btJSON struct { GenesisBlockHeader btHeader Pre map[string]btAccount PostState map[string]btAccount + Lastblockhash string } type btBlock struct { @@ -77,6 +79,7 @@ type btHeader struct { MixHash string Nonce string Number string + Hash string ParentHash string ReceiptTrie string SeedHash string @@ -178,16 +181,24 @@ func runBlockTest(test *BlockTest) error { return fmt.Errorf("InsertPreState: %v", err) } - err = test.TryBlocksInsert(ethereum.ChainManager()) + cm := ethereum.ChainManager() + validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return err } - newDB := ethereum.ChainManager().State() + 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() *eth.Config { @@ -265,8 +276,8 @@ func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, erro expected we are expected to ignore it and continue processing and then validate the post state. */ -func (t *BlockTest) TryBlocksInsert(chainManager *core.ChainManager) error { - blockNums := make(map[string]bool) +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) @@ -274,7 +285,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: @@ -283,47 +294,23 @@ 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") } // validate RLP decoding by checking all values against test file JSON - if err = t.validateBlockHeader(b.BlockHeader, cb.Header()); err != nil { - return fmt.Errorf("Deserialised block header validation failed: %v", err) - } - - // validate the imported header against test file JSON - - /* - TODO: currently test files do not contain information on what - reorg is expected other than possibly the post state (which may - or may not depend on a specific chain). - - discussed with winswega and it was agreed to add this information - to the test files explicitly. - - meanwhile we skip header validation on blocks with the same block - number as a prior block, since this test code cannot know what - blocks are in the longest chain without making use of the very - protocol rules the tests verify or rely on the correctness of the - code that is being tested. - - */ - if !blockNums[b.BlockHeader.Number] { - importedBlock := chainManager.CurrentBlock() - if err = t.validateBlockHeader(b.BlockHeader, importedBlock.Header()); err != nil { - return fmt.Errorf("Imported block header validation failed: %v", err) - } - blockNums[b.BlockHeader.Number] = true + 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: want: %x have: %x", expectedBloom, h2.Bloom.Bytes()) @@ -439,6 +426,27 @@ func (t *BlockTest) ValidatePostState(statedb *state.StateDB) error { 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 +} + func convertBlockTests(in map[string]*btJSON) (map[string]*BlockTest, error) { out := make(map[string]*BlockTest) for name, test := range in { @@ -461,7 +469,7 @@ func convertBlockTest(in *btJSON) (out *BlockTest, err error) { err = fmt.Errorf("%v\n%s", recovered, buf) } }() - out = &BlockTest{preAccounts: in.Pre, postAccounts: in.PostState, Json: in} + out = &BlockTest{preAccounts: in.Pre, postAccounts: in.PostState, Json: in, lastblockhash: in.Lastblockhash} out.Genesis = mustConvertGenesis(in.GenesisBlockHeader) return out, err } From 399c920380f147eee4bdb47bd5b5115ed07a02ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Sat, 19 Sep 2015 14:45:53 +0300 Subject: [PATCH 59/90] core: separate and contain POW verifier, extensive tests --- core/chain_manager.go | 52 +-------- core/chain_manager_test.go | 17 +-- core/chain_pow.go | 87 ++++++++++++++ core/chain_pow_test.go | 233 +++++++++++++++++++++++++++++++++++++ 4 files changed, 327 insertions(+), 62 deletions(-) create mode 100644 core/chain_pow.go create mode 100644 core/chain_pow_test.go diff --git a/core/chain_manager.go b/core/chain_manager.go index 1218b1a6e026..62fd548ed0ac 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -22,7 +22,6 @@ import ( "fmt" "io" "math/big" - "runtime" "sync" "sync/atomic" "time" @@ -616,14 +615,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 { @@ -636,11 +633,11 @@ 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()} } } @@ -843,40 +840,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 67ca41f00bba..31a8769beb75 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -456,7 +456,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. @@ -499,18 +499,3 @@ func TestGenesisMismatch(t *testing.T) { } } */ - -// 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) { -} diff --git a/core/chain_pow.go b/core/chain_pow.go new file mode 100644 index 000000000000..c3b5788c19a9 --- /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/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/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..80c6a1cc0a48 --- /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/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/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) + } + } + } +} From 5621308949cc5573297bd70826421db00c1fd4ba Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 21 Sep 2015 11:34:02 +0200 Subject: [PATCH 60/90] tests: add test for StateTests/stCallCodes.json --- tests/files/StateTests/stCallCodes.json | 6798 +++++++++++++++++++++++ tests/state_test.go | 7 + tests/state_test_util.go | 3 +- 3 files changed, 6807 insertions(+), 1 deletion(-) create mode 100644 tests/files/StateTests/stCallCodes.json 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/state_test.go b/tests/state_test.go index 7090b054106e..245f605979b1 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 0868224612ed..95ecdd0a8a71 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) From be76a68aeacccce8ad63270a98beb34db37f0d88 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Mon, 21 Sep 2015 16:13:07 +0200 Subject: [PATCH 61/90] cmd/geth: changed version number to 1.2.0 Changed the version number of geth to 1.2.0 so that dev builds are now properly build (instead of master). Note to self; increase version number to 1.2.1 for our next actual release. --- cmd/geth/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b54d85c22be6..daffda30c17e 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -48,9 +48,9 @@ import ( const ( ClientIdentifier = "Geth" - Version = "1.1.0" + Version = "1.2.0" VersionMajor = 1 - VersionMinor = 1 + VersionMinor = 2 VersionPatch = 0 ) From eaa4473dbd4ad404b85f8f0f63b0418a782351b4 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Mon, 17 Aug 2015 14:01:41 +0200 Subject: [PATCH 62/90] core, core/types: readd transactions after chain re-org Added a `Difference` method to `types.Transactions` which sets the receiver to the difference of a to b (NOTE: not a **and** b). Transaction pool subscribes to RemovedTransactionEvent adding back to those potential missing from the chain. When a chain re-org occurs remove any transactions that were removed from the canonical chain during the re-org as well as the receipts that were generated in the process. Closes #1746 --- cmd/geth/js_test.go | 2 +- common/natspec/natspec_e2e_test.go | 2 +- core/bench_test.go | 2 +- core/chain_makers_test.go | 2 +- core/chain_manager.go | 60 +++++++------- core/chain_manager_test.go | 124 ++++++++++++++++++++++++++--- core/events.go | 3 + core/genesis.go | 22 +++-- core/transaction_pool.go | 12 +-- core/transaction_pool_test.go | 12 +++ core/transaction_util.go | 21 +++++ core/types/transaction.go | 24 +++++- eth/helper_test.go | 2 +- 13 files changed, 231 insertions(+), 57 deletions(-) diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 2fd5a531dc44..1f5b28e3a550 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -92,7 +92,7 @@ func testREPL(t *testing.T, config func(*eth.Config)) (string, *testjethre, *eth 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 := ð.Config{ diff --git a/common/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index ea28b457e34e..57f81f6529a6 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -134,7 +134,7 @@ func testEth(t *testing.T) (ethereum *eth.Ethereum, 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 ethereum, err = eth.New(ð.Config{ diff --git a/core/bench_test.go b/core/bench_test.go index d05b7d30b193..def4f0d2a665 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -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/chain_makers_test.go b/core/chain_makers_test.go index 1c868624df58..ac18e5e0b842 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 62fd548ed0ac..42f70af33b48 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -569,18 +569,17 @@ func (self *ChainManager) WriteBlock(block *types.Block) (status writeStatus, er // 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(td) self.insert(block) self.mu.Unlock() - - status = CanonStatTy } else { status = SideStatTy } @@ -681,9 +680,11 @@ 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) if err != nil { @@ -711,10 +712,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++ } @@ -729,20 +726,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 @@ -751,10 +754,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() @@ -764,13 +767,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") } } @@ -779,18 +783,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) @@ -798,8 +792,18 @@ 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() + self.eventMux.Post(RemovedTransactionEvent{diff}) return nil } diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 31a8769beb75..0c77fc138919 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -30,8 +30,10 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" "github.com/hashicorp/golang-lru" @@ -483,19 +485,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) +// 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) } - genesis = GenesisBlock(1, db) - _, err = NewChainManager(genesis, db, db, db, thePow(), &mux) - if err == nil { - t.Error("expected genesis mismatch error") + + // 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/events.go b/core/events.go index a487fc51d40d..e142b6dbaa45 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/genesis.go b/core/genesis.go index 727e2c75f141..b2346da650ff 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -125,15 +125,27 @@ func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big return block } -func WriteGenesisBlockForTesting(db ethdb.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 } diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 513600be354e..11d0cb490d51 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() } } diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index d9267cc435ab..37cd20c964df 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -238,3 +238,15 @@ func TestNonceRecovery(t *testing.T) { 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 69c6bc36fd67..ebe095abb93b 100644 --- a/core/transaction_util.go +++ b/core/transaction_util.go @@ -77,6 +77,22 @@ func PutTransactions(db ethdb.Database, block *types.Block, txs types.Transactio } } +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 ethdb.Database, receipts types.Receipts) error { batch := new(leveldb.Batch) @@ -107,6 +123,11 @@ func PutReceipts(db ethdb.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 ethdb.Database, txHash common.Hash) *types.Receipt { data, _ := db.Get(append(receiptsPre, txHash[:]...)) diff --git a/core/types/transaction.go b/core/types/transaction.go index 8260d7423068..7a6c5e088df7 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -272,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/eth/helper_test.go b/eth/helper_test.go index 3a799e6f69ed..034751f7f985 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -33,7 +33,7 @@ func newTestProtocolManager(blocks int, generator func(int, *core.BlockGen), new evmux = new(event.TypeMux) pow = new(core.FakePow) db, _ = ethdb.NewMemDatabase() - genesis = core.WriteGenesisBlockForTesting(db, testBankAddress, testBankFunds) + genesis = core.WriteGenesisBlockForTesting(db, core.GenesisAccount{testBankAddress, testBankFunds}) chainman, _ = core.NewChainManager(db, pow, evmux) blockproc = core.NewBlockProcessor(db, pow, chainman, evmux) ) From 6a05c569f26178870781c01c38e507523529b596 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 21 Sep 2015 21:36:01 +0300 Subject: [PATCH 63/90] makefile: built in cross compilation targets --- Makefile | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Makefile b/Makefile index 3478b543330a..8c7b80ea6145 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,30 @@ geth: @echo "Done building." @echo "Run \"$(GOBIN)/geth\" to launch geth." +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)/* From bfde1a4305817e76b203c2fd6da4d6a7ca41e5f7 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 14 Sep 2015 16:56:33 +0200 Subject: [PATCH 64/90] core: Add BadHashErr and test for BadHashes handling --- core/chain_manager.go | 2 +- core/chain_manager_test.go | 55 +++++++++++++++++++++++++++++++++++++- core/error.go | 11 ++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/chain_manager.go b/core/chain_manager.go index 0ad4f86f9865..383fce70c8af 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -642,7 +642,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { } 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 } diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 0c77fc138919..6cfafb8c0f89 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -75,7 +75,7 @@ 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 { @@ -421,6 +421,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) diff --git a/core/error.go b/core/error.go index 09eea22d6da5..ff58d69d6402 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 +} From 70b6174748585be2dd4b132203cda8655b76251b Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 22 Sep 2015 23:55:31 +0200 Subject: [PATCH 65/90] cmd/geth, core: make "geth blocktest" work again The test genesis block was not written properly, block insertion failed immediately. While here, fix the panic when shutting down "geth blocktest" with Ctrl+C. The signal handler is now installed automatically, causing ethereum.Stop to crash because everything is already stopped. --- cmd/geth/blocktestcmd.go | 6 ------ core/chain_manager.go | 1 + 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/cmd/geth/blocktestcmd.go b/cmd/geth/blocktestcmd.go index d3257ca4d53f..d6195e025333 100644 --- a/cmd/geth/blocktestcmd.go +++ b/cmd/geth/blocktestcmd.go @@ -91,7 +91,6 @@ func runBlockTest(ctx *cli.Context) { if err != nil { utils.Fatalf("%v", err) } - defer ethereum.Stop() if rpc { fmt.Println("Block Test post state validated, starting RPC interface.") startEth(ctx, ethereum) @@ -106,7 +105,6 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er cfg.MaxPeers = 0 // disable network cfg.Shh = false // disable whisper cfg.NAT = nil // disable port mapping - ethereum, err := eth.New(cfg) if err != nil { return nil, err @@ -114,7 +112,6 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er // import the genesis block ethereum.ResetWithGenesisBlock(test.Genesis) - // import pre accounts _, err = test.InsertPreState(ethereum) if err != nil { @@ -122,16 +119,13 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er } cm := ethereum.ChainManager() - validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return ethereum, fmt.Errorf("Block Test load error: %v", err) } - newDB := cm.State() if err := test.ValidatePostState(newDB); err != nil { return ethereum, fmt.Errorf("post state validation failed: %v", err) } - return ethereum, test.ValidateImportedHeaders(cm, validBlocks) } diff --git a/core/chain_manager.go b/core/chain_manager.go index 42f70af33b48..0ad4f86f9865 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -279,6 +279,7 @@ func (bc *ChainManager) ResetWithGenesisBlock(genesis *types.Block) { 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.setTotalDifficulty(genesis.Difficulty()) From 90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 22 Sep 2015 23:59:26 +0200 Subject: [PATCH 66/90] rpc/api: don't crash for unknown blocks Most eth RPC calls that work with blocks crashed when the block was not found because they called Hash on a nil block. This is a regression introduced in cdc2662c409 (#1779). While here, remove the insane conversions in get*CountBy*. There is no need to construct a complete BlockRes and converting int->int64->*big.Int->[]byte->hexnum->string to format the length of a slice as hex. --- rpc/api/eth.go | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 30366a95185d..4cd5f269501e 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -210,7 +210,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) { @@ -218,14 +218,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()) } - - raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.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) { @@ -234,13 +231,11 @@ func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (inter return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), 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) { @@ -249,12 +244,11 @@ func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByHash(args.Hash) if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}, error) { @@ -263,12 +257,11 @@ func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{} return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByNumber(args.BlockNumber) if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetData(req *shared.Request) (interface{}, error) { @@ -377,8 +370,10 @@ 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) + if block == nil { + return nil, nil + } return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } @@ -389,6 +384,9 @@ func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { } block := self.xeth.EthBlockByNumber(args.BlockNumber) + if block == nil { + return nil, nil + } return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } @@ -419,10 +417,10 @@ func (self *ethApi) GetTransactionByBlockHashAndIndex(req *shared.Request) (inte } raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) if args.Index >= int64(len(block.Transactions)) || args.Index < 0 { return nil, nil } else { @@ -437,10 +435,10 @@ func (self *ethApi) GetTransactionByBlockNumberAndIndex(req *shared.Request) (in } raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + 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 @@ -455,10 +453,10 @@ func (self *ethApi) GetUncleByBlockHashAndIndex(req *shared.Request) (interface{ } raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) - if block == nil { + if raw == nil { return nil, nil } + 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 @@ -473,10 +471,10 @@ func (self *ethApi) GetUncleByBlockNumberAndIndex(req *shared.Request) (interfac } raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) if args.Index >= int64(len(block.Uncles)) || args.Index < 0 { return nil, nil } else { From f459a3f0ae43eac29b597427be6602970f10334c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 23 Sep 2015 12:39:17 +0300 Subject: [PATCH 67/90] eth/downloader: always send termination wakes, clean leftover --- eth/downloader/downloader.go | 56 +++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f038e24e4138..d1a716c5f53e 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -154,7 +154,7 @@ type Downloader struct { 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 - processCh chan bool // Channel to signal the block fetcher of new or finished work + 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 @@ -188,7 +188,7 @@ func New(mux *event.TypeMux, hasBlock hashCheckFn, getBlock blockRetrievalFn, he blockCh: make(chan blockPack, 1), headerCh: make(chan headerPack, 1), bodyCh: make(chan bodyPack, 1), - processCh: make(chan bool, 1), + wakeCh: make(chan bool, 1), } } @@ -282,6 +282,10 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int) error d.queue.Reset() d.peers.Reset() + select { + case <-d.wakeCh: + default: + } // Create cancel channel for aborting mid-flight d.cancelLock.Lock() d.cancelCh = make(chan struct{}) @@ -633,7 +637,7 @@ func (d *Downloader) fetchHashes61(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 @@ -664,12 +668,18 @@ func (d *Downloader) fetchHashes61(p *peer, td *big.Int, from uint64) error { 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 @@ -766,7 +776,7 @@ func (d *Downloader) fetchBlocks61(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 @@ -1053,7 +1063,7 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { glog.V(logger.Debug).Infof("%v: no available headers", p) select { - case d.processCh <- false: + 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 @@ -1084,12 +1094,18 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { return errBadPeer } // Notify the block fetcher of new headers, but stop if queue is full - cont := d.queue.Pending() < maxQueuedHeaders - select { - case d.processCh <- cont: - default: - } - if !cont { + 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 @@ -1104,8 +1120,8 @@ func (d *Downloader) fetchHeaders(p *peer, td *big.Int, from uint64) error { // Finish the sync gracefully instead of dumping the gathered data though select { - case d.processCh <- false: - default: + case d.wakeCh <- false: + case <-d.cancelCh: } return nil } @@ -1199,7 +1215,7 @@ func (d *Downloader) fetchBodies(from uint64) error { default: } - case cont := <-d.processCh: + case cont := <-d.wakeCh: // The header fetcher sent a continuation flag, check if it's done if !cont { finished = true From 6e1dc321f4522223d235e30e2749958c17e59f07 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Wed, 23 Sep 2015 14:47:20 +0200 Subject: [PATCH 68/90] VERSION: added version --- VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 000000000000..26aaba0e8663 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.2.0 From b9359981f447f1f9b14ce82da60c5cf5c78df876 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 25 Sep 2015 13:56:53 +0200 Subject: [PATCH 69/90] xeth: fixed nil pointer of filter retrieval This fix addresses an issue with filters that were (possibly) not yet added to the filter queues but were expected. I've added additional nil checks making sure it doesn't crash and swapped the installation of the filter around so it's installed before use. Closes #1665 --- xeth/xeth.go | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/xeth/xeth.go b/xeth/xeth.go index 00b70da6c994..623b3a963457 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -532,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) @@ -544,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 } @@ -556,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 } @@ -573,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 } @@ -1022,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 @@ -1039,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 From b8b996be74bf0b180475a670b57604cb33f6819f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Tue, 29 Sep 2015 09:11:38 +0300 Subject: [PATCH 70/90] core: fix a formatting loop in BadHashError --- core/error.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/error.go b/core/error.go index ff58d69d6402..5e32124a7e4a 100644 --- a/core/error.go +++ b/core/error.go @@ -181,7 +181,7 @@ func IsValueTransferErr(e error) bool { type BadHashError common.Hash func (h BadHashError) Error() string { - return fmt.Sprintf("Found known bad hash in chain %x", h) + return fmt.Sprintf("Found known bad hash in chain %x", h[:]) } func IsBadHashError(err error) bool { From b4374436f331903ae1a19879aac0f37678b65f0e Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 30 Sep 2015 05:01:49 +0200 Subject: [PATCH 71/90] p2p/discover: fix race involving the seed node iterator nodeDB.querySeeds was not safe for concurrent use but could be called concurrenty on multiple goroutines in the following case: - the table was empty - a timed refresh started - a lookup was started and initiated refresh These conditions are unlikely to coincide during normal use, but are much more likely to occur all at once when the user's machine just woke from sleep. The root cause of the issue is that querySeeds reused the same leveldb iterator until it was exhausted. This commit moves the refresh scheduling logic into its own goroutine (so only one refresh is ever active) and changes querySeeds to not use a persistent iterator. The seed node selection is now more random and ignores nodes that have not been contacted in the last 5 days. --- p2p/discover/database.go | 96 +++++++++++--------- p2p/discover/database_test.go | 103 ++++++++-------------- p2p/discover/table.go | 161 ++++++++++++++++++++++------------ p2p/discover/table_test.go | 3 - p2p/discover/udp.go | 7 -- 5 files changed, 198 insertions(+), 172 deletions(-) diff --git a/p2p/discover/database.go b/p2p/discover/database.go index d5c594364fb3..e8e3371ff9ca 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 569585903f0b..80c1a6ff293d 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}, 30303, 30303, @@ -173,7 +197,7 @@ var nodeDBSeedQueryNodes = []struct { }, { node: newNode( - MustHexID("0x02d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + MustHexID("0x44d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 2}, 30303, 30303, @@ -182,7 +206,7 @@ var nodeDBSeedQueryNodes = []struct { }, { node: newNode( - MustHexID("0x03d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), + MustHexID("0xe2d9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{127, 0, 0, 3}, 30303, 30303, @@ -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/table.go b/p2p/discover/table.go index 972bc10777db..66afa52eafe4 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 @@ -93,11 +101,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 +116,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 +175,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 +197,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 @@ -210,9 +224,9 @@ func (tab *Table) Lookup(targetID NodeID) []*Node { 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 +271,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 +417,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 +480,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 426f4e9ccc9f..84962a1a5e2f 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 afb31ee69d67..8f62598f2665 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -52,8 +52,6 @@ const ( respTimeout = 500 * time.Millisecond sendTimeout = 500 * time.Millisecond expiration = 20 * time.Second - - refreshInterval = 1 * time.Hour ) // RPC packet types @@ -312,10 +310,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 +340,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 From 631bf361026676560b2995563fcf1324347a13a1 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 30 Sep 2015 05:17:58 +0200 Subject: [PATCH 72/90] p2p/discover: remove unused lastLookup field --- p2p/discover/table.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 66afa52eafe4..c128c2ed168b 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -88,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 @@ -218,8 +215,6 @@ 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() From 32dda976020f8ec756fa65e7764f41e9d42dbef4 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Wed, 30 Sep 2015 05:21:03 +0200 Subject: [PATCH 73/90] p2p/discover: ignore packet version numbers The strict matching can get in the way of protocol upgrades. --- p2p/discover/udp.go | 4 ---- p2p/discover/udp_test.go | 1 - 2 files changed, 5 deletions(-) diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 8f62598f2665..20f69cf0844e 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") @@ -522,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 a86d3737bcc2..913199c26862 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}) From 9666db2a442887ccf8ec2d81f5e2fedc1a3a3d3e Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Thu, 1 Oct 2015 10:35:35 +0200 Subject: [PATCH 74/90] VERSION, cmd/geth: bumped version 1.2.1 --- VERSION | 2 +- cmd/geth/main.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 26aaba0e8663..6085e946503a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 diff --git a/cmd/geth/main.go b/cmd/geth/main.go index daffda30c17e..e4e54c73c3da 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -48,10 +48,10 @@ import ( const ( ClientIdentifier = "Geth" - Version = "1.2.0" + Version = "1.2.1" VersionMajor = 1 VersionMinor = 2 - VersionPatch = 0 + VersionPatch = 1 ) var ( From b527c9c7183cab2323170e6fb80fef9cf1c63b35 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 2 Oct 2015 12:20:18 +0200 Subject: [PATCH 75/90] core: deadlock in chainmanager after posting RemovedTransactionEvent This PR solves an issue with the chain manager posting a `RemovedTransactionEvent`, the tx pool will try to acquire the chainmanager lock which has previously been locked prior to posting `RemovedTransactionEvent`. This results in a deadlock in the core. --- core/chain_manager.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/chain_manager.go b/core/chain_manager.go index 383fce70c8af..9525e239829d 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -804,7 +804,9 @@ func (self *ChainManager) reorg(oldBlock, newBlock *types.Block) error { DeleteReceipt(self.chainDb, tx.Hash()) DeleteTransaction(self.chainDb, tx.Hash()) } - self.eventMux.Post(RemovedTransactionEvent{diff}) + // 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 } From 274f86cd86c563a53625e720145a83064af7b730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Fri, 2 Oct 2015 13:20:41 +0300 Subject: [PATCH 76/90] eth/downloader: match capabilities when querying idle peers --- eth/downloader/downloader.go | 4 +-- eth/downloader/downloader_test.go | 49 +++++++++++++++++++++++++++++-- eth/downloader/peer.go | 8 +++-- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d1a716c5f53e..64fb1b57bef2 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -816,7 +816,7 @@ func (d *Downloader) fetchBlocks61(from uint64) error { } // Send a download request to all idle peers, until throttled throttled := false - for _, peer := range d.peers.IdlePeers() { + for _, peer := range d.peers.IdlePeers(eth61) { // Short circuit if throttling activated if d.queue.Throttle() { throttled = true @@ -1255,7 +1255,7 @@ func (d *Downloader) fetchBodies(from uint64) error { } // Send a download request to all idle peers, until throttled queuedEmptyBlocks, throttled := false, false - for _, peer := range d.peers.IdlePeers() { + for _, peer := range d.peers.IdlePeers(eth62) { // Short circuit if throttling activated if d.queue.Throttle() { throttled = true diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 885fab8bd5c0..96096527ec73 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -205,9 +205,17 @@ func (dl *downloadTester) newSlowPeer(id string, version int, hashes []common.Ha dl.lock.Lock() defer dl.lock.Unlock() - err := dl.downloader.RegisterPeer(id, version, hashes[0], - dl.peerGetRelHashesFn(id, delay), dl.peerGetAbsHashesFn(id, delay), dl.peerGetBlocksFn(id, delay), - dl.peerGetRelHeadersFn(id, delay), dl.peerGetAbsHeadersFn(id, delay), dl.peerGetBodiesFn(id, delay)) + 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)) @@ -618,6 +626,41 @@ func testMultiSynchronisation(t *testing.T, protocol int) { } } +// 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) } + +func testMultiProtocolSynchronisation(t *testing.T, protocol int) { + // Create a small enough block chain to download + targetBlocks := blockCacheLimit - 15 + hashes, blocks := makeChain(targetBlocks, 0, genesis) + + // 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) + + // 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 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 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) } diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 8fd1f9a991a8..c1d20ac6154d 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -312,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++ { From 465e810c66ccee49410ea34d08102a82ce7b48a5 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 2 Oct 2015 12:55:57 +0200 Subject: [PATCH 77/90] VERSION, cmd/geth: bumped version 1.2.2 --- VERSION | 2 +- cmd/geth/main.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 6085e946503a..23aa8390630c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.1 +1.2.2 diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e4e54c73c3da..d8e612acb98c 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -48,10 +48,10 @@ import ( const ( ClientIdentifier = "Geth" - Version = "1.2.1" + Version = "1.2.2" VersionMajor = 1 VersionMinor = 2 - VersionPatch = 1 + VersionPatch = 2 ) var ( From 2800c332807f322d351d16e55f3658f6efe62791 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Fri, 2 Oct 2015 21:31:53 +0200 Subject: [PATCH 78/90] Fake commit From 1487a50fd9adac7081436dff9388ea24aecdf75b Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 11:09:02 -0400 Subject: [PATCH 79/90] ignore all those test files --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From f3d24e4eb61c9003e64285d4e1323d84b3dfc659 Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:05:30 -0400 Subject: [PATCH 80/90] update rpc mapping :8ball: --- rpc/api/eth.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 134c3c4781e1..b187b5a9d227 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -97,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, } ) From 72f70f662c9b360c8021333b982a5f3862a7df00 Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:16:20 -0400 Subject: [PATCH 81/90] moving stuff around --- eth/fetcher/metrics.go | 46 -------- eth/metrics.go | 157 --------------------------- {eth => exp}/downloader/metrics.go | 0 exp/fetcher/metrics.go | 36 +++++-- {eth => exp}/handler_test.go | 0 {eth => exp}/helper_test.go | 0 exp/metrics.go | 165 ++++++++++++++++++++++++----- rpc/comms/ipc_unix.go | 2 +- rpc/jeth.go | 2 +- 9 files changed, 166 insertions(+), 242 deletions(-) delete mode 100644 eth/fetcher/metrics.go delete mode 100644 eth/metrics.go rename {eth => exp}/downloader/metrics.go (100%) rename {eth => exp}/handler_test.go (100%) rename {eth => exp}/helper_test.go (100%) diff --git a/eth/fetcher/metrics.go b/eth/fetcher/metrics.go deleted file mode 100644 index 9dad34e6a052..000000000000 --- a/eth/fetcher/metrics.go +++ /dev/null @@ -1,46 +0,0 @@ -// 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 fetcher. - -package fetcher - -import ( - "github.com/expanse-project/go-expanse/metrics" -) - -var ( - 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/eth/metrics.go b/eth/metrics.go deleted file mode 100644 index 3e38d62c2cc0..000000000000 --- a/eth/metrics.go +++ /dev/null @@ -1,157 +0,0 @@ -// 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 eth - -import ( - "github.com/expanse-project/go-expanse/metrics" - "github.com/expanse-project/go-expanse/p2p" -) - -var ( - 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/eth/downloader/metrics.go b/exp/downloader/metrics.go similarity index 100% rename from eth/downloader/metrics.go rename to exp/downloader/metrics.go 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/eth/handler_test.go b/exp/handler_test.go similarity index 100% rename from eth/handler_test.go rename to exp/handler_test.go diff --git a/eth/helper_test.go b/exp/helper_test.go similarity index 100% rename from eth/helper_test.go rename to exp/helper_test.go diff --git a/exp/metrics.go b/exp/metrics.go index 2bce1e89da37..3e38d62c2cc0 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 +package eth 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/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 203f65959ae2..d5e1552867a8 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -71,7 +71,7 @@ func (self *ipcClient) reconnect() error { } -func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.EthereumApi, error)) error { +func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.ExpanseApi, error)) error { // Ensure the IPC path exists and remove any previous leftover if err := os.MkdirAll(filepath.Dir(cfg.Endpoint), 0751); err != nil { return err diff --git a/rpc/jeth.go b/rpc/jeth.go index 86969bdadbf2..479a937fc0b1 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -40,7 +40,7 @@ type Jeth struct { } -func NewJeth(ethApi shared.EthereumApi, re *jsre.JSRE, client comms.EthereumClient, fe xeth.Frontend) *Jeth { +func NewJeth(ethApi shared.ExpanseApi, re *jsre.JSRE, client comms.ExpanseClient, fe xeth.Frontend) *Jeth { return &Jeth{ethApi, re, client, fe} } From 4977d41e959de9cd2a0b250d4d7d1e572094e984 Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:25:29 -0400 Subject: [PATCH 82/90] fixed import --- cmd/gexp/blocktestcmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gexp/blocktestcmd.go b/cmd/gexp/blocktestcmd.go index 8b759e0a3889..cec14509a513 100644 --- a/cmd/gexp/blocktestcmd.go +++ b/cmd/gexp/blocktestcmd.go @@ -22,7 +22,7 @@ import ( "github.com/codegangsta/cli" "github.com/expanse-project/go-expanse/cmd/utils" - "github.com/expanse-project/go-expanse/eth" + "github.com/expanse-project/go-expanse/exp" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/tests" ) From a724a1bb422dc26c12ec23b644be1f859afa294e Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:29:39 -0400 Subject: [PATCH 83/90] one more replace --- exp/handler_test.go | 2 +- exp/helper_test.go | 2 +- exp/metrics.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exp/handler_test.go b/exp/handler_test.go index a3970e018b0a..c68c3443daa0 100644 --- a/exp/handler_test.go +++ b/exp/handler_test.go @@ -1,4 +1,4 @@ -package eth +package exp import ( "fmt" diff --git a/exp/helper_test.go b/exp/helper_test.go index 012404ff127d..578c2020dcf7 100644 --- a/exp/helper_test.go +++ b/exp/helper_test.go @@ -1,7 +1,7 @@ // This file contains some shares testing functionality, common to multiple // different files and modules being tested. -package eth +package exp import ( "crypto/rand" diff --git a/exp/metrics.go b/exp/metrics.go index 3e38d62c2cc0..f18d8bcb24f6 100644 --- a/exp/metrics.go +++ b/exp/metrics.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package eth +package exp import ( "github.com/expanse-project/go-expanse/metrics" From 49d4cf6f1e27bad29ec8a92d1f4f27997954cf4d Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:31:41 -0400 Subject: [PATCH 84/90] one more --- exp/handler.go | 4 ++-- exp/handler_test.go | 2 +- exp/peer.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exp/handler.go b/exp/handler.go index f382f0a48e5d..7695b1b2507f 100644 --- a/exp/handler.go +++ b/exp/handler.go @@ -26,8 +26,8 @@ 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/eth/downloader" - "github.com/expanse-project/go-expanse/eth/fetcher" + "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" diff --git a/exp/handler_test.go b/exp/handler_test.go index c68c3443daa0..6d1253972622 100644 --- a/exp/handler_test.go +++ b/exp/handler_test.go @@ -11,7 +11,7 @@ import ( "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/eth/downloader" + "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" diff --git a/exp/peer.go b/exp/peer.go index b31f832eca39..786963af1384 100644 --- a/exp/peer.go +++ b/exp/peer.go @@ -25,7 +25,7 @@ import ( "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/types" - "github.com/expanse-project/go-expanse/eth/downloader" + "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" From 9b6b54f07a6c0c5882b61feda7f851246726564e Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:34:48 -0400 Subject: [PATCH 85/90] wasnt he last but close --- jsre/expanse_js.go | 2 +- rpc/api/eth.go | 4 ++-- tests/block_test_util.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jsre/expanse_js.go b/jsre/expanse_js.go index aa46a776fd52..2d5c685b4034 100644 --- a/jsre/expanse_js.go +++ b/jsre/expanse_js.go @@ -6081,7 +6081,7 @@ module.exports = IsSyncing; },{"../utils/utils":20,"./formatters":29,"./method":35,"./requestmanager":43}],45:[function(require,module,exports){ /* - This file is part of ethereum.js. + 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 diff --git a/rpc/api/eth.go b/rpc/api/eth.go index b187b5a9d227..443452408967 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -216,8 +216,8 @@ func (self *ethApi) IsMining(req *shared.Request) (interface{}, error) { } func (self *ethApi) IsSyncing(req *shared.Request) (interface{}, error) { - current := self.ethereum.ChainManager().CurrentBlock().NumberU64() - origin, height := self.ethereum.Downloader().Boundaries() + current := self.expanse.ChainManager().CurrentBlock().NumberU64() + origin, height := self.expanse.Downloader().Boundaries() if current < height { return map[string]interface{}{ diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 3ac6a5fc9b40..cf5ad8b62f69 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -183,7 +183,7 @@ func runBlockTest(test *BlockTest) error { } - cm := ethereum.ChainManager() + cm := expanse.ChainManager() validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return err From 7456be5f8453fb9b45d4d48a1293eb6cce04835d Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:43:13 -0400 Subject: [PATCH 86/90] last one --- tests/block_test_util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/block_test_util.go b/tests/block_test_util.go index cf5ad8b62f69..536af3fcab43 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -177,7 +177,7 @@ func runBlockTest(test *BlockTest) error { // import pre accounts - _, err = test.InsertPreState(ethereum) + _, err = test.InsertPreState(expanse) if err != nil { return fmt.Errorf("InsertPreState: %v", err) } From 135b401a0691101e16992a55b2b0aea36a392aae Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:05:30 -0400 Subject: [PATCH 87/90] update rpc mapping :8ball: moving stuff around fixed import one more replace one more wasnt he last but close last one --- cmd/gexp/blocktestcmd.go | 2 +- eth/fetcher/metrics.go | 46 -------- eth/metrics.go | 157 --------------------------- {eth => exp}/downloader/metrics.go | 0 exp/fetcher/metrics.go | 36 +++++-- exp/handler.go | 4 +- {eth => exp}/handler_test.go | 4 +- {eth => exp}/helper_test.go | 2 +- exp/metrics.go | 163 ++++++++++++++++++++++++----- exp/peer.go | 2 +- jsre/expanse_js.go | 2 +- rpc/api/eth.go | 52 ++++++++- rpc/comms/ipc_unix.go | 2 +- rpc/jeth.go | 2 +- tests/block_test_util.go | 4 +- 15 files changed, 225 insertions(+), 253 deletions(-) delete mode 100644 eth/fetcher/metrics.go delete mode 100644 eth/metrics.go rename {eth => exp}/downloader/metrics.go (100%) rename {eth => exp}/handler_test.go (99%) rename {eth => exp}/helper_test.go (99%) diff --git a/cmd/gexp/blocktestcmd.go b/cmd/gexp/blocktestcmd.go index 8b759e0a3889..cec14509a513 100644 --- a/cmd/gexp/blocktestcmd.go +++ b/cmd/gexp/blocktestcmd.go @@ -22,7 +22,7 @@ import ( "github.com/codegangsta/cli" "github.com/expanse-project/go-expanse/cmd/utils" - "github.com/expanse-project/go-expanse/eth" + "github.com/expanse-project/go-expanse/exp" "github.com/expanse-project/go-expanse/ethdb" "github.com/expanse-project/go-expanse/tests" ) diff --git a/eth/fetcher/metrics.go b/eth/fetcher/metrics.go deleted file mode 100644 index 9dad34e6a052..000000000000 --- a/eth/fetcher/metrics.go +++ /dev/null @@ -1,46 +0,0 @@ -// 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 fetcher. - -package fetcher - -import ( - "github.com/expanse-project/go-expanse/metrics" -) - -var ( - 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/eth/metrics.go b/eth/metrics.go deleted file mode 100644 index 3e38d62c2cc0..000000000000 --- a/eth/metrics.go +++ /dev/null @@ -1,157 +0,0 @@ -// 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 eth - -import ( - "github.com/expanse-project/go-expanse/metrics" - "github.com/expanse-project/go-expanse/p2p" -) - -var ( - 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/eth/downloader/metrics.go b/exp/downloader/metrics.go similarity index 100% rename from eth/downloader/metrics.go rename to exp/downloader/metrics.go 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 f382f0a48e5d..7695b1b2507f 100644 --- a/exp/handler.go +++ b/exp/handler.go @@ -26,8 +26,8 @@ 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/eth/downloader" - "github.com/expanse-project/go-expanse/eth/fetcher" + "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" diff --git a/eth/handler_test.go b/exp/handler_test.go similarity index 99% rename from eth/handler_test.go rename to exp/handler_test.go index a3970e018b0a..6d1253972622 100644 --- a/eth/handler_test.go +++ b/exp/handler_test.go @@ -1,4 +1,4 @@ -package eth +package exp import ( "fmt" @@ -11,7 +11,7 @@ import ( "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/eth/downloader" + "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" diff --git a/eth/helper_test.go b/exp/helper_test.go similarity index 99% rename from eth/helper_test.go rename to exp/helper_test.go index 012404ff127d..578c2020dcf7 100644 --- a/eth/helper_test.go +++ b/exp/helper_test.go @@ -1,7 +1,7 @@ // This file contains some shares testing functionality, common to multiple // different files and modules being tested. -package eth +package exp import ( "crypto/rand" 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 b31f832eca39..786963af1384 100644 --- a/exp/peer.go +++ b/exp/peer.go @@ -25,7 +25,7 @@ import ( "github.com/expanse-project/go-expanse/common" "github.com/expanse-project/go-expanse/core/types" - "github.com/expanse-project/go-expanse/eth/downloader" + "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" diff --git a/jsre/expanse_js.go b/jsre/expanse_js.go index aa46a776fd52..2d5c685b4034 100644 --- a/jsre/expanse_js.go +++ b/jsre/expanse_js.go @@ -6081,7 +6081,7 @@ module.exports = IsSyncing; },{"../utils/utils":20,"./formatters":29,"./method":35,"./requestmanager":43}],45:[function(require,module,exports){ /* - This file is part of ethereum.js. + 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 diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 134c3c4781e1..443452408967 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -97,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, } ) @@ -168,8 +216,8 @@ func (self *ethApi) IsMining(req *shared.Request) (interface{}, error) { } func (self *ethApi) IsSyncing(req *shared.Request) (interface{}, error) { - current := self.ethereum.ChainManager().CurrentBlock().NumberU64() - origin, height := self.ethereum.Downloader().Boundaries() + current := self.expanse.ChainManager().CurrentBlock().NumberU64() + origin, height := self.expanse.Downloader().Boundaries() if current < height { return map[string]interface{}{ diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go index 203f65959ae2..d5e1552867a8 100644 --- a/rpc/comms/ipc_unix.go +++ b/rpc/comms/ipc_unix.go @@ -71,7 +71,7 @@ func (self *ipcClient) reconnect() error { } -func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.EthereumApi, error)) error { +func startIpc(cfg IpcConfig, codec codec.Codec, initializer func(conn net.Conn) (shared.ExpanseApi, error)) error { // Ensure the IPC path exists and remove any previous leftover if err := os.MkdirAll(filepath.Dir(cfg.Endpoint), 0751); err != nil { return err diff --git a/rpc/jeth.go b/rpc/jeth.go index 86969bdadbf2..479a937fc0b1 100644 --- a/rpc/jeth.go +++ b/rpc/jeth.go @@ -40,7 +40,7 @@ type Jeth struct { } -func NewJeth(ethApi shared.EthereumApi, re *jsre.JSRE, client comms.EthereumClient, fe xeth.Frontend) *Jeth { +func NewJeth(ethApi shared.ExpanseApi, re *jsre.JSRE, client comms.ExpanseClient, fe xeth.Frontend) *Jeth { return &Jeth{ethApi, re, client, fe} } diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 3ac6a5fc9b40..536af3fcab43 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -177,13 +177,13 @@ func runBlockTest(test *BlockTest) error { // import pre accounts - _, err = test.InsertPreState(ethereum) + _, err = test.InsertPreState(expanse) if err != nil { return fmt.Errorf("InsertPreState: %v", err) } - cm := ethereum.ChainManager() + cm := expanse.ChainManager() validBlocks, err := test.TryBlocksInsert(cm) if err != nil { return err From 1299522681853dbaa808cd7f1e1a0adf7e4eed21 Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 12:59:29 -0400 Subject: [PATCH 88/90] update from expanse-project to org --- .gitmodules | 2 +- jsre/expanse_js.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/jsre/expanse_js.go b/jsre/expanse_js.go index 2d5c685b4034..cd4cdde7bb3c 100644 --- a/jsre/expanse_js.go +++ b/jsre/expanse_js.go @@ -1874,7 +1874,7 @@ 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.toUtf8(str); } From 789e52afdfc8c62586dd834a989e127566801fda Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 14:20:07 -0400 Subject: [PATCH 89/90] fix web3.js --- jsre/expanse_js.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsre/expanse_js.go b/jsre/expanse_js.go index cd4cdde7bb3c..27e5bf56e985 100644 --- a/jsre/expanse_js.go +++ b/jsre/expanse_js.go @@ -2606,7 +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/eth":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){ +},{"./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. From dfcf6fe98599d78ad35a80d21a64961820661151 Mon Sep 17 00:00:00 2001 From: Christopher Franko Date: Tue, 13 Oct 2015 14:33:02 -0400 Subject: [PATCH 90/90] bump version --- cmd/gexp/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gexp/main.go b/cmd/gexp/main.go index 4e78ef137749..e276c7dca41f 100644 --- a/cmd/gexp/main.go +++ b/cmd/gexp/main.go @@ -49,7 +49,7 @@ import ( const ( ClientIdentifier = "Gexp" - Version = "1.1.4" + Version = "1.2.2" VersionMajor = 1 VersionMinor = 2 VersionPatch = 2