diff options
70 files changed, 9375 insertions, 9798 deletions
diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..1f37ce892 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM ubuntu:14.04 + +## Environment setup +ENV HOME /root +ENV GOPATH /root/go +ENV PATH /go/bin:/root/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games + +RUN mkdir -p /root/go +ENV DEBIAN_FRONTEND noninteractive + +## Install base dependencies +RUN apt-get update && apt-get upgrade -y +RUN apt-get install -y git mercurial build-essential software-properties-common pkg-config libgmp3-dev libreadline6-dev libpcre3-dev libpcre++-dev + +## Build and install Go +RUN hg clone -u release https://code.google.com/p/go +RUN cd go && hg update go1.4 +RUN cd go/src && ./all.bash && go version + +## Install GUI dependencies +RUN add-apt-repository ppa:ubuntu-sdk-team/ppa -y +RUN apt-get update -y +RUN apt-get install -y qtbase5-private-dev qtdeclarative5-private-dev libqt5opengl5-dev + +## Fetch and install serpent-go +RUN go get -v -d github.com/ethereum/serpent-go +WORKDIR $GOPATH/src/github.com/ethereum/serpent-go +RUN git checkout master +RUN git submodule update --init +RUN go install -v + +# Fetch and install go-ethereum +RUN go get -v -d github.com/ethereum/go-ethereum/... +WORKDIR $GOPATH/src/github.com/ethereum/go-ethereum +RUN git checkout poc8 +RUN ETH_DEPS=$(go list -f '{{.Imports}} {{.TestImports}} {{.XTestImports}}' github.com/ethereum/go-ethereum/... | sed -e 's/\[//g' | sed -e 's/\]//g' | sed -e 's/C //g'); if [ "$ETH_DEPS" ]; then go get $ETH_DEPS; fi +RUN go install -v ./cmd/ethereum + +# Run JSON RPC +ENTRYPOINT ["ethereum", "-rpc=true", "-rpcport=8080"] +EXPOSE 8080 diff --git a/block_pool.go b/block_pool.go deleted file mode 100644 index 803927f21..000000000 --- a/block_pool.go +++ /dev/null @@ -1,351 +0,0 @@ -package eth - -import ( - "bytes" - "container/list" - "fmt" - "math" - "math/big" - "sync" - "time" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethutil" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/wire" -) - -var poollogger = logger.NewLogger("BPOOL") - -type block struct { - from *Peer - peer *Peer - block *types.Block - reqAt time.Time - requested int -} - -type BlockPool struct { - mut sync.Mutex - - eth *Ethereum - - hashes [][]byte - pool map[string]*block - - td *big.Int - quit chan bool - - fetchingHashes bool - downloadStartedAt time.Time - - ChainLength, BlocksProcessed int - - peer *Peer -} - -func NewBlockPool(eth *Ethereum) *BlockPool { - return &BlockPool{ - eth: eth, - pool: make(map[string]*block), - td: ethutil.Big0, - quit: make(chan bool), - } -} - -func (self *BlockPool) Len() int { - return len(self.hashes) -} - -func (self *BlockPool) Reset() { - self.pool = make(map[string]*block) - self.hashes = nil -} - -func (self *BlockPool) HasLatestHash() bool { - self.mut.Lock() - defer self.mut.Unlock() - - return self.pool[string(self.eth.ChainManager().CurrentBlock.Hash())] != nil -} - -func (self *BlockPool) HasCommonHash(hash []byte) bool { - return self.eth.ChainManager().GetBlock(hash) != nil -} - -func (self *BlockPool) Blocks() (blocks types.Blocks) { - for _, item := range self.pool { - if item.block != nil { - blocks = append(blocks, item.block) - } - } - - return -} - -func (self *BlockPool) FetchHashes(peer *Peer) bool { - highestTd := self.eth.HighestTDPeer() - - if (self.peer == nil && peer.td.Cmp(highestTd) >= 0) || (self.peer != nil && peer.td.Cmp(self.peer.td) > 0) || self.peer == peer { - if self.peer != peer { - poollogger.Infof("Found better suitable peer (%v vs %v)\n", self.td, peer.td) - - if self.peer != nil { - self.peer.doneFetchingHashes = true - } - } - - self.peer = peer - self.td = peer.td - - if !self.HasLatestHash() { - self.fetchHashes() - } - - return true - } - - return false -} - -func (self *BlockPool) fetchHashes() { - peer := self.peer - - peer.doneFetchingHashes = false - - const amount = 256 - peerlogger.Debugf("Fetching hashes (%d) %x...\n", amount, peer.lastReceivedHash[0:4]) - peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{peer.lastReceivedHash, uint32(amount)})) -} - -func (self *BlockPool) AddHash(hash []byte, peer *Peer) { - self.mut.Lock() - defer self.mut.Unlock() - - if self.pool[string(hash)] == nil { - self.pool[string(hash)] = &block{peer, nil, nil, time.Now(), 0} - - self.hashes = append([][]byte{hash}, self.hashes...) - } -} - -func (self *BlockPool) Add(b *types.Block, peer *Peer) { - self.addBlock(b, peer, false) -} - -func (self *BlockPool) AddNew(b *types.Block, peer *Peer) { - self.addBlock(b, peer, true) -} - -func (self *BlockPool) addBlock(b *types.Block, peer *Peer, newBlock bool) { - self.mut.Lock() - defer self.mut.Unlock() - - hash := string(b.Hash()) - - if self.pool[hash] == nil && !self.eth.ChainManager().HasBlock(b.Hash()) { - poollogger.Infof("Got unrequested block (%x...)\n", hash[0:4]) - - self.hashes = append(self.hashes, b.Hash()) - self.pool[hash] = &block{peer, peer, b, time.Now(), 0} - - // The following is only performed on an unrequested new block - if newBlock { - fmt.Println("1.", !self.eth.ChainManager().HasBlock(b.PrevHash), ethutil.Bytes2Hex(b.Hash()[0:4]), ethutil.Bytes2Hex(b.PrevHash[0:4])) - fmt.Println("2.", self.pool[string(b.PrevHash)] == nil) - fmt.Println("3.", !self.fetchingHashes) - if !self.eth.ChainManager().HasBlock(b.PrevHash) /*&& self.pool[string(b.PrevHash)] == nil*/ && !self.fetchingHashes { - poollogger.Infof("Unknown chain, requesting (%x...)\n", b.PrevHash[0:4]) - peer.QueueMessage(wire.NewMessage(wire.MsgGetBlockHashesTy, []interface{}{b.Hash(), uint32(256)})) - } - } - } else if self.pool[hash] != nil { - self.pool[hash].block = b - } - - self.BlocksProcessed++ -} - -func (self *BlockPool) Remove(hash []byte) { - self.mut.Lock() - defer self.mut.Unlock() - - self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash) - delete(self.pool, string(hash)) -} - -func (self *BlockPool) DistributeHashes() { - self.mut.Lock() - defer self.mut.Unlock() - - var ( - peerLen = self.eth.peers.Len() - amount = 256 * peerLen - dist = make(map[*Peer][][]byte) - ) - - num := int(math.Min(float64(amount), float64(len(self.pool)))) - for i, j := 0, 0; i < len(self.hashes) && j < num; i++ { - hash := self.hashes[i] - item := self.pool[string(hash)] - - if item != nil && item.block == nil { - var peer *Peer - lastFetchFailed := time.Since(item.reqAt) > 5*time.Second - - // Handle failed requests - if lastFetchFailed && item.requested > 5 && item.peer != nil { - if item.requested < 100 { - // Select peer the hash was retrieved off - peer = item.from - } else { - // Remove it - self.hashes = ethutil.DeleteFromByteSlice(self.hashes, hash) - delete(self.pool, string(hash)) - } - } else if lastFetchFailed || item.peer == nil { - // Find a suitable, available peer - eachPeer(self.eth.peers, func(p *Peer, v *list.Element) { - if peer == nil && len(dist[p]) < amount/peerLen && p.statusKnown { - peer = p - } - }) - } - - if peer != nil { - item.reqAt = time.Now() - item.peer = peer - item.requested++ - - dist[peer] = append(dist[peer], hash) - } - } - } - - for peer, hashes := range dist { - peer.FetchBlocks(hashes) - } - - if len(dist) > 0 { - self.downloadStartedAt = time.Now() - } -} - -func (self *BlockPool) Start() { - go self.downloadThread() - go self.chainThread() -} - -func (self *BlockPool) Stop() { - close(self.quit) -} - -func (self *BlockPool) downloadThread() { - serviceTimer := time.NewTicker(100 * time.Millisecond) -out: - for { - select { - case <-self.quit: - break out - case <-serviceTimer.C: - // Check if we're catching up. If not distribute the hashes to - // the peers and download the blockchain - self.fetchingHashes = false - eachPeer(self.eth.peers, func(p *Peer, v *list.Element) { - if p.statusKnown && p.FetchingHashes() { - self.fetchingHashes = true - } - }) - - if len(self.hashes) > 0 { - self.DistributeHashes() - } - - if self.ChainLength < len(self.hashes) { - self.ChainLength = len(self.hashes) - } - - if self.peer != nil && - !self.peer.doneFetchingHashes && - time.Since(self.peer.lastHashAt) > 10*time.Second && - time.Since(self.peer.lastHashRequestedAt) > 5*time.Second { - self.fetchHashes() - } - - /* - if !self.fetchingHashes { - blocks := self.Blocks() - chain.BlockBy(chain.Number).Sort(blocks) - - if len(blocks) > 0 { - if !self.eth.ChainManager().HasBlock(b.PrevHash) && self.pool[string(b.PrevHash)] == nil && !self.fetchingHashes { - } - } - } - */ - } - } -} - -func (self *BlockPool) chainThread() { - procTimer := time.NewTicker(500 * time.Millisecond) -out: - for { - select { - case <-self.quit: - break out - case <-procTimer.C: - blocks := self.Blocks() - types.BlockBy(types.Number).Sort(blocks) - - // Find common block - for i, block := range blocks { - if self.eth.ChainManager().HasBlock(block.PrevHash) { - blocks = blocks[i:] - break - } - } - - if len(blocks) > 0 { - if self.eth.ChainManager().HasBlock(blocks[0].PrevHash) { - for i, block := range blocks[1:] { - // NOTE: The Ith element in this loop refers to the previous block in - // outer "blocks" - if bytes.Compare(block.PrevHash, blocks[i].Hash()) != 0 { - blocks = blocks[:i] - - break - } - } - } else { - blocks = nil - } - } - - if len(blocks) > 0 { - chainman := self.eth.ChainManager() - - err := chainman.InsertChain(blocks) - if err != nil { - poollogger.Debugln(err) - - self.Reset() - - if self.peer != nil && self.peer.conn != nil { - poollogger.Debugf("Punishing peer for supplying bad chain (%v)\n", self.peer.conn.RemoteAddr()) - } - - // This peer gave us bad hashes and made us fetch a bad chain, therefor he shall be punished. - self.eth.BlacklistPeer(self.peer) - self.peer.StopWithReason(DiscBadPeer) - self.td = ethutil.Big0 - self.peer = nil - } - - for _, block := range blocks { - self.Remove(block.Hash()) - } - } - } - } -} diff --git a/cmd/ethereum/cmd.go b/cmd/ethereum/cmd.go index 8710d6136..d8b9ea487 100644 --- a/cmd/ethereum/cmd.go +++ b/cmd/ethereum/cmd.go @@ -21,9 +21,9 @@ import ( "io/ioutil" "os" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/cmd/ethereum/repl" "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/javascript" ) diff --git a/cmd/ethereum/flags.go b/cmd/ethereum/flags.go index 783944cf2..556735491 100644 --- a/cmd/ethereum/flags.go +++ b/cmd/ethereum/flags.go @@ -38,7 +38,8 @@ var ( StartRpc bool StartWebSockets bool RpcPort int - UseUPnP bool + NatType string + PMPGateway string OutboundPort string ShowGenesis bool AddPeer string @@ -84,7 +85,8 @@ func Init() { flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use") flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file (db)") flag.StringVar(&OutboundPort, "port", "30303", "listening port") - flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support") + flag.StringVar(&NatType, "nat", "", "NAT support (UPNP|PMP) (none)") + flag.StringVar(&PMPGateway, "pmp", "", "Gateway IP for PMP") flag.IntVar(&MaxPeer, "maxpeer", 10, "maximum desired peers") flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") flag.BoolVar(&StartRpc, "rpc", false, "start rpc server") diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go index 43551fb3a..4f87ef17b 100644 --- a/cmd/ethereum/main.go +++ b/cmd/ethereum/main.go @@ -69,9 +69,9 @@ func main() { // create, import, export keys utils.KeyTasks(keyManager, KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive) - clientIdentity := utils.NewClientIdentity(ClientIdentifier, Version, Identifier) + clientIdentity := utils.NewClientIdentity(ClientIdentifier, Version, Identifier, string(keyManager.PublicKey())) - ethereum := utils.NewEthereum(db, clientIdentity, keyManager, UseUPnP, OutboundPort, MaxPeer) + ethereum := utils.NewEthereum(db, clientIdentity, keyManager, utils.NatType(NatType, PMPGateway), OutboundPort, MaxPeer) if Dump { var block *types.Block diff --git a/cmd/ethereum/repl/repl.go b/cmd/ethereum/repl/repl.go index a5146fecd..4a7880ff4 100644 --- a/cmd/ethereum/repl/repl.go +++ b/cmd/ethereum/repl/repl.go @@ -24,7 +24,7 @@ import ( "os" "path" - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/javascript" "github.com/ethereum/go-ethereum/logger" diff --git a/cmd/mist/bindings.go b/cmd/mist/bindings.go index 6dbcc3f1d..6d2342c87 100644 --- a/cmd/mist/bindings.go +++ b/cmd/mist/bindings.go @@ -103,7 +103,7 @@ func (self *Gui) DumpState(hash, path string) { var stateDump []byte if len(hash) == 0 { - stateDump = self.eth.BlockManager().CurrentState().Dump() + stateDump = self.eth.ChainManager().State().Dump() } else { var block *types.Block if hash[0] == '#' { diff --git a/cmd/mist/debugger.go b/cmd/mist/debugger.go index ca3ff5af2..d7c584eab 100644 --- a/cmd/mist/debugger.go +++ b/cmd/mist/debugger.go @@ -141,8 +141,8 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data keyPair = self.lib.eth.KeyManager().KeyPair() ) - statedb := self.lib.eth.BlockManager().TransState() - account := self.lib.eth.BlockManager().TransState().GetAccount(keyPair.Address()) + statedb := self.lib.eth.ChainManager().TransState() + account := self.lib.eth.ChainManager().TransState().GetAccount(keyPair.Address()) contract := statedb.NewStateObject([]byte{0}) contract.SetCode(script) contract.SetBalance(value) diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go index 0b03cdc1b..fe066e994 100644 --- a/cmd/mist/gui.go +++ b/cmd/mist/gui.go @@ -401,7 +401,7 @@ func (gui *Gui) update() { generalUpdateTicker := time.NewTicker(500 * time.Millisecond) statsUpdateTicker := time.NewTicker(5 * time.Second) - state := gui.eth.BlockManager().TransState() + state := gui.eth.ChainManager().TransState() gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance()))) @@ -428,14 +428,14 @@ func (gui *Gui) update() { case core.NewBlockEvent: gui.processBlock(ev.Block, false) if bytes.Compare(ev.Block.Coinbase, gui.address()) == 0 { - gui.setWalletValue(gui.eth.BlockManager().CurrentState().GetAccount(gui.address()).Balance(), nil) + gui.setWalletValue(gui.eth.ChainManager().State().GetBalance(gui.address()), nil) } case core.TxPreEvent: tx := ev.Tx - tstate := gui.eth.BlockManager().TransState() - cstate := gui.eth.BlockManager().CurrentState() + tstate := gui.eth.ChainManager().TransState() + cstate := gui.eth.ChainManager().State() taccount := tstate.GetAccount(gui.address()) caccount := cstate.GetAccount(gui.address()) diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go index 2b5e56646..fdbde50fd 100644 --- a/cmd/mist/ui_lib.go +++ b/cmd/mist/ui_lib.go @@ -200,7 +200,7 @@ func (ui *UiLib) AssetPath(p string) string { func (self *UiLib) StartDbWithContractAndData(contractHash, data string) { dbWindow := NewDebuggerWindow(self) - object := self.eth.BlockManager().CurrentState().GetStateObject(ethutil.Hex2Bytes(contractHash)) + object := self.eth.ChainManager().State().GetStateObject(ethutil.Hex2Bytes(contractHash)) if len(object.Code) > 0 { dbWindow.SetCode("0x" + ethutil.Bytes2Hex(object.Code)) } diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index db7bcd35e..3e3ac617a 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -4,23 +4,23 @@ import ( "fmt" "io" "log" + "net" "os" "os/signal" "path" "path/filepath" "regexp" "runtime" - "time" "bitbucket.org/kardianos/osext" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/wire" "github.com/ethereum/go-ethereum/xeth" ) @@ -144,17 +144,32 @@ func NewDatabase() ethutil.Database { return db } -func NewClientIdentity(clientIdentifier, version, customIdentifier string) *wire.SimpleClientIdentity { - return wire.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier) +func NewClientIdentity(clientIdentifier, version, customIdentifier string, pubkey string) *p2p.SimpleClientIdentity { + return p2p.NewSimpleClientIdentity(clientIdentifier, version, customIdentifier, pubkey) } -func NewEthereum(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, usePnp bool, OutboundPort string, MaxPeer int) *eth.Ethereum { - ethereum, err := eth.New(db, clientIdentity, keyManager, eth.CapDefault, usePnp) +func NatType(natType string, gateway string) (nat p2p.NAT) { + switch natType { + case "UPNP": + nat = p2p.UPNP() + case "PMP": + ip := net.ParseIP(gateway) + if ip == nil { + clilogger.Fatalf("cannot resolve PMP gateway IP %s", gateway) + } + nat = p2p.PMP(ip) + case "": + default: + clilogger.Fatalf("unrecognised NAT type '%s'", natType) + } + return +} + +func NewEthereum(db ethutil.Database, clientIdentity p2p.ClientIdentity, keyManager *crypto.KeyManager, nat p2p.NAT, OutboundPort string, MaxPeer int) *eth.Ethereum { + ethereum, err := eth.New(db, clientIdentity, keyManager, nat, OutboundPort, MaxPeer) if err != nil { clilogger.Fatalln("eth start err:", err) } - ethereum.Port = OutboundPort - ethereum.MaxPeers = MaxPeer return ethereum } @@ -268,11 +283,6 @@ func StartMining(ethereum *eth.Ethereum) bool { if gminer == nil { gminer = miner.New(addr, ethereum) } - // Give it some time to connect with peers - time.Sleep(3 * time.Second) - for !ethereum.IsUpToDate() { - time.Sleep(5 * time.Second) - } gminer.Start() }() RegisterInterrupt(func(os.Signal) { diff --git a/cmd/utils/websockets.go b/cmd/utils/websockets.go index d3ba50e78..29f9b8aeb 100644 --- a/cmd/utils/websockets.go +++ b/cmd/utils/websockets.go @@ -1,7 +1,7 @@ package utils import ( - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/websocket" "github.com/ethereum/go-ethereum/xeth" diff --git a/core/block_manager.go b/core/block_manager.go index 4c1cea35a..cf47218ed 100644 --- a/core/block_manager.go +++ b/core/block_manager.go @@ -2,7 +2,6 @@ package core import ( "bytes" - "container/list" "errors" "fmt" "math/big" @@ -14,8 +13,10 @@ import ( "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/pow/ezp" "github.com/ethereum/go-ethereum/state" - "github.com/ethereum/go-ethereum/wire" ) var statelogger = logger.NewLogger("BLOCK") @@ -36,13 +37,12 @@ type EthManager interface { BlockManager() *BlockManager ChainManager() *ChainManager TxPool() *TxPool - Broadcast(msgType wire.MsgType, data []interface{}) PeerCount() int IsMining() bool IsListening() bool - Peers() *list.List + Peers() []*p2p.Peer KeyManager() *crypto.KeyManager - ClientIdentity() wire.ClientIdentity + ClientIdentity() p2p.ClientIdentity Db() ethutil.Database EventMux() *event.TypeMux } @@ -55,17 +55,9 @@ type BlockManager struct { // non-persistent key/value memory storage mem map[string]*big.Int // Proof of work used for validating - Pow PoW + Pow pow.PoW // The ethereum manager interface eth EthManager - // The managed states - // Transiently state. The trans state isn't ever saved, validated and - // it could be used for setting account nonces without effecting - // the main states. - transState *state.StateDB - // Mining state. The mining state is used purely and solely by the mining - // operation. - miningState *state.StateDB // The last attempted block is mainly used for debugging purposes // This does not have to be a valid block and will be set during @@ -73,51 +65,22 @@ type BlockManager struct { lastAttemptedBlock *types.Block events event.Subscription + + eventMux *event.TypeMux } func NewBlockManager(ethereum EthManager) *BlockManager { sm := &BlockManager{ - mem: make(map[string]*big.Int), - Pow: &EasyPow{}, - eth: ethereum, - bc: ethereum.ChainManager(), + mem: make(map[string]*big.Int), + Pow: ezp.New(), + eth: ethereum, + bc: ethereum.ChainManager(), + eventMux: ethereum.EventMux(), } - sm.transState = ethereum.ChainManager().CurrentBlock.State().Copy() - sm.miningState = ethereum.ChainManager().CurrentBlock.State().Copy() return sm } -func (self *BlockManager) Start() { - statelogger.Debugln("Starting block manager") -} - -func (self *BlockManager) Stop() { - statelogger.Debugln("Stopping state manager") -} - -func (sm *BlockManager) CurrentState() *state.StateDB { - return sm.eth.ChainManager().CurrentBlock.State() -} - -func (sm *BlockManager) TransState() *state.StateDB { - return sm.transState -} - -func (sm *BlockManager) MiningState() *state.StateDB { - return sm.miningState -} - -func (sm *BlockManager) NewMiningState() *state.StateDB { - sm.miningState = sm.eth.ChainManager().CurrentBlock.State().Copy() - - return sm.miningState -} - -func (sm *BlockManager) ChainManager() *ChainManager { - return sm.bc -} - func (sm *BlockManager) TransitionState(statedb *state.StateDB, parent, block *types.Block) (receipts types.Receipts, err error) { coinbase := statedb.GetOrNewStateObject(block.Coinbase) coinbase.SetGasPool(block.CalcGasLimit(parent)) @@ -181,7 +144,7 @@ done: // Notify all subscribers if !transientProcess { - go self.eth.EventMux().Post(TxPostEvent{tx}) + go self.eventMux.Post(TxPostEvent{tx}) } receipts = append(receipts, receipt) @@ -275,8 +238,6 @@ func (sm *BlockManager) ProcessWithParent(block, parent *types.Block) (td *big.I chainlogger.Infof("Processed block #%d (%x...)\n", block.Number, block.Hash()[0:4]) - sm.transState = state.Copy() - sm.eth.TxPool().RemoveSet(block.Transactions()) return td, messages, nil @@ -327,7 +288,7 @@ func (sm *BlockManager) ValidateBlock(block, parent *types.Block) error { */ // Verify the nonce of the block. Return an error if it's not valid - if !sm.Pow.Verify(block.HashNoNonce(), block.Difficulty, block.Nonce) { + if !sm.Pow.Verify(block /*block.HashNoNonce(), block.Difficulty, block.Nonce*/) { return ValidationError("Block's nonce is invalid (= %v)", ethutil.Bytes2Hex(block.Nonce)) } diff --git a/core/chain_manager.go b/core/chain_manager.go index 150139def..f9fb3b3f8 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" ) var chainlogger = logger.NewLogger("CHAIN") @@ -55,6 +56,8 @@ type ChainManager struct { CurrentBlock *types.Block LastBlockHash []byte + + transState *state.StateDB } func NewChainManager(mux *event.TypeMux) *ChainManager { @@ -64,13 +67,27 @@ func NewChainManager(mux *event.TypeMux) *ChainManager { bc.setLastBlock() + bc.transState = bc.State().Copy() + return bc } +func (self *ChainManager) Status() (td *big.Int, currentBlock []byte, genesisBlock []byte) { + return self.TD, self.CurrentBlock.Hash(), self.Genesis().Hash() +} + func (self *ChainManager) SetProcessor(proc types.BlockProcessor) { self.processor = proc } +func (self *ChainManager) State() *state.StateDB { + return self.CurrentBlock.State() +} + +func (self *ChainManager) TransState() *state.StateDB { + return self.transState +} + func (bc *ChainManager) setLastBlock() { data, _ := ethutil.Config.Db.Get([]byte("LastBlock")) if len(data) != 0 { @@ -160,7 +177,7 @@ func (bc *ChainManager) HasBlock(hash []byte) bool { return len(data) != 0 } -func (self *ChainManager) GetChainHashesFromHash(hash []byte, max uint64) (chain [][]byte) { +func (self *ChainManager) GetBlockHashesFromHash(hash []byte, max uint64) (chain [][]byte) { block := self.GetBlock(hash) if block == nil { return @@ -275,6 +292,8 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error { self.SetTotalDifficulty(td) self.insert(block) + self.transState = self.State().Copy() + //sm.eth.TxPool().RemoveSet(block.Transactions()) } self.eventMux.Post(NewBlockEvent{block}) diff --git a/core/dagger.go b/core/dagger.go index 8a042b34f..3039d8995 100644 --- a/core/dagger.go +++ b/core/dagger.go @@ -6,8 +6,6 @@ import ( "math/rand" "time" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/logger" "github.com/obscuren/sha3" @@ -15,89 +13,6 @@ import ( var powlogger = logger.NewLogger("POW") -type PoW interface { - Search(block *types.Block, stop <-chan struct{}) []byte - Verify(hash []byte, diff *big.Int, nonce []byte) bool - GetHashrate() int64 - Turbo(bool) -} - -type EasyPow struct { - hash *big.Int - HashRate int64 - turbo bool -} - -func (pow *EasyPow) GetHashrate() int64 { - return pow.HashRate -} - -func (pow *EasyPow) Turbo(on bool) { - pow.turbo = on -} - -func (pow *EasyPow) Search(block *types.Block, stop <-chan struct{}) []byte { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - hash := block.HashNoNonce() - diff := block.Difficulty - i := int64(0) - start := time.Now().UnixNano() - t := time.Now() - - for { - select { - case <-stop: - powlogger.Infoln("Breaking from mining") - pow.HashRate = 0 - return nil - default: - i++ - - if time.Since(t) > (1 * time.Second) { - elapsed := time.Now().UnixNano() - start - hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000 - pow.HashRate = int64(hashes) - powlogger.Infoln("Hashing @", pow.HashRate, "khash") - - t = time.Now() - } - - sha := crypto.Sha3(big.NewInt(r.Int63()).Bytes()) - if pow.Verify(hash, diff, sha) { - return sha - } - } - - if !pow.turbo { - time.Sleep(20 * time.Microsecond) - } - } - - return nil -} - -func (pow *EasyPow) Verify(hash []byte, diff *big.Int, nonce []byte) bool { - sha := sha3.NewKeccak256() - - d := append(hash, nonce...) - sha.Write(d) - - verification := new(big.Int).Div(ethutil.BigPow(2, 256), diff) - res := ethutil.U256(ethutil.BigD(sha.Sum(nil))) - - /* - fmt.Printf("hash w/o nonce %x\n", hash) - fmt.Printf("2**256 / %v = %v\n", diff, verification) - fmt.Printf("%v <= %v\n", res, verification) - fmt.Printf("vlen: %d rlen: %d\n", len(verification.Bytes()), len(res.Bytes())) - */ - - return res.Cmp(verification) <= 0 -} - -func (pow *EasyPow) SetHash(hash *big.Int) { -} - type Dagger struct { hash *big.Int xn *big.Int diff --git a/core/events.go b/core/events.go index deeba3e98..fe106da49 100644 --- a/core/events.go +++ b/core/events.go @@ -10,3 +10,6 @@ type TxPostEvent struct{ Tx *types.Transaction } // NewBlockEvent is posted when a block has been imported. type NewBlockEvent struct{ Block *types.Block } + +// NewMinedBlockEvent is posted when a block has been imported. +type NewMinedBlockEvent struct{ Block *types.Block } diff --git a/core/execution.go b/core/execution.go index 5176f7351..a464abc66 100644 --- a/core/execution.go +++ b/core/execution.go @@ -32,7 +32,7 @@ func (self *Execution) Call(codeAddr []byte, caller vm.ClosureRef) ([]byte, erro return self.exec(code, codeAddr, caller) } -func (self *Execution) exec(code, caddr []byte, caller vm.ClosureRef) (ret []byte, err error) { +func (self *Execution) exec(code, contextAddr []byte, caller vm.ClosureRef) (ret []byte, err error) { env := self.vm.Env() chainlogger.Debugf("pre state %x\n", env.State().Root()) @@ -57,7 +57,7 @@ func (self *Execution) exec(code, caddr []byte, caller vm.ClosureRef) (ret []byt } else { self.object = to // Pre-compiled contracts (address.go) 1, 2 & 3. - naddr := ethutil.BigD(caddr).Uint64() + naddr := ethutil.BigD(contextAddr).Uint64() if p := vm.Precompiled[naddr]; p != nil { if self.Gas.Cmp(p.Gas(len(self.input))) >= 0 { ret = p.Call(self.input) diff --git a/core/simple_pow.go b/core/simple_pow.go new file mode 100644 index 000000000..9a8bc9592 --- /dev/null +++ b/core/simple_pow.go @@ -0,0 +1 @@ +package core diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 1d1f478e4..2eb0b55df 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/state" - "github.com/ethereum/go-ethereum/wire" ) var txplogger = logger.NewLogger("TXP") @@ -18,7 +17,9 @@ var txplogger = logger.NewLogger("TXP") const txPoolQueueSize = 50 type TxPoolHook chan *types.Transaction -type TxMsgTy byte +type TxMsg struct { + Tx *types.Transaction +} const ( minGasPrice = 1000000 @@ -26,11 +27,6 @@ const ( var MinGasPrice = big.NewInt(10000000000000) -type TxMsg struct { - Tx *types.Transaction - Type TxMsgTy -} - func EachTx(pool *list.List, it func(*types.Transaction, *list.Element) bool) { for e := pool.Front(); e != nil; e = e.Next() { if it(e.Value.(*types.Transaction), e) { @@ -94,7 +90,7 @@ func (pool *TxPool) addTransaction(tx *types.Transaction) { pool.pool.PushBack(tx) // Broadcast the transaction to the rest of the peers - pool.Ethereum.Broadcast(wire.MsgTxTy, []interface{}{tx.RlpData()}) + pool.Ethereum.EventMux().Post(TxPreEvent{tx}) } func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error { @@ -116,7 +112,7 @@ func (pool *TxPool) ValidateTransaction(tx *types.Transaction) error { } // Get the sender - sender := pool.Ethereum.BlockManager().CurrentState().GetAccount(tx.Sender()) + sender := pool.Ethereum.ChainManager().State().GetAccount(tx.Sender()) totAmount := new(big.Int).Set(tx.Value) // Make sure there's enough in the sender's account. Having insufficient @@ -169,7 +165,17 @@ func (self *TxPool) Size() int { return self.pool.Len() } -func (pool *TxPool) CurrentTransactions() []*types.Transaction { +func (self *TxPool) AddTransactions(txs []*types.Transaction) { + for _, tx := range txs { + if err := self.Add(tx); err != nil { + txplogger.Infoln(err) + } else { + txplogger.Infof("tx %x\n", tx.Hash()[0:4]) + } + } +} + +func (pool *TxPool) GetTransactions() []*types.Transaction { pool.mutex.Lock() defer pool.mutex.Unlock() @@ -216,7 +222,7 @@ func (self *TxPool) RemoveSet(txs types.Transactions) { } func (pool *TxPool) Flush() []*types.Transaction { - txList := pool.CurrentTransactions() + txList := pool.GetTransactions() // Recreate a new list all together // XXX Is this the fastest way? diff --git a/core/types/block.go b/core/types/block.go index 55ce1fb9b..0108bd586 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -411,3 +411,6 @@ func (self *Block) Size() ethutil.StorageSize { func (self *Block) RlpData() interface{} { return self.Value().Val } + +// Implement pow.Block +func (self *Block) N() []byte { return self.Nonce } diff --git a/crypto/crypto.go b/crypto/crypto.go index d70a5a4db..b8fd78fa2 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -56,6 +56,10 @@ func Ecrecover(data []byte) []byte { // New methods using proper ecdsa keys from the stdlib func ToECDSA(prv []byte) *ecdsa.PrivateKey { + if len(prv) == 0 { + return nil + } + priv := new(ecdsa.PrivateKey) priv.PublicKey.Curve = S256() priv.D = ethutil.BigD(prv) @@ -64,14 +68,27 @@ func ToECDSA(prv []byte) *ecdsa.PrivateKey { } func FromECDSA(prv *ecdsa.PrivateKey) []byte { + if prv == nil { + return nil + } return prv.D.Bytes() } -func PubToECDSA(pub []byte) *ecdsa.PublicKey { +func ToECDSAPub(pub []byte) *ecdsa.PublicKey { + if len(pub) == 0 { + return nil + } x, y := elliptic.Unmarshal(S256(), pub) return &ecdsa.PublicKey{S256(), x, y} } +func FromECDSAPub(pub *ecdsa.PublicKey) []byte { + if pub == nil { + return nil + } + return elliptic.Marshal(S256(), pub.X, pub.Y) +} + func GenerateKey() (*ecdsa.PrivateKey, error) { return ecdsa.GenerateKey(S256(), rand.Reader) } diff --git a/crypto/encrypt_decrypt_test.go b/crypto/encrypt_decrypt_test.go index 850fa94e4..85b43c406 100644 --- a/crypto/encrypt_decrypt_test.go +++ b/crypto/encrypt_decrypt_test.go @@ -11,7 +11,7 @@ import ( func TestBox(t *testing.T) { prv1 := ToECDSA(ethutil.Hex2Bytes("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f")) prv2 := ToECDSA(ethutil.Hex2Bytes("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a")) - pub2 := PubToECDSA(ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5")) + pub2 := ToECDSAPub(ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5")) message := []byte("Hello, world.") ct, err := Encrypt(pub2, message) diff --git a/eth/backend.go b/eth/backend.go new file mode 100644 index 000000000..6235fc824 --- /dev/null +++ b/eth/backend.go @@ -0,0 +1,354 @@ +package eth + +import ( + "encoding/json" + "net" + "path" + "sync" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/event" + ethlogger "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/pow/ezp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/state" +) + +const ( + seedNodeAddress = "poc-7.ethdev.com:30300" +) + +var logger = ethlogger.NewLogger("SERV") + +type Ethereum struct { + // Channel for shutting down the ethereum + shutdownChan chan bool + quit chan bool + + // DB interface + db ethutil.Database + // State manager for processing new blocks and managing the over all states + blockManager *core.BlockManager + + // The transaction pool. Transaction can be pushed on this pool + // for later including in the blocks + txPool *core.TxPool + // The canonical chain + chainManager *core.ChainManager + // The block pool + blockPool *BlockPool + // Event + eventMux *event.TypeMux + + // Nonce + Nonce uint64 + + ListenAddr string + + blacklist p2p.Blacklist + server *p2p.Server + txSub event.Subscription + blockSub event.Subscription + + // Capabilities for outgoing peers + // serverCaps Caps + peersFile string + + Mining bool + + RpcServer *rpc.JsonRpcServer + + keyManager *crypto.KeyManager + + clientIdentity p2p.ClientIdentity + + synclock sync.Mutex + syncGroup sync.WaitGroup + + filterMu sync.RWMutex + filterId int + filters map[int]*core.Filter +} + +func New(db ethutil.Database, identity p2p.ClientIdentity, keyManager *crypto.KeyManager, nat p2p.NAT, port string, maxPeers int) (*Ethereum, error) { + + saveProtocolVersion(db) + ethutil.Config.Db = db + + // FIXME: + blacklist := p2p.NewBlacklist() + // Sorry Py person. I must blacklist. you perform badly + blacklist.Put(ethutil.Hex2Bytes("64656330303561383532336435376331616537643864663236623336313863373537353163636634333530626263396330346237336262623931383064393031")) + + peersFile := path.Join(ethutil.Config.ExecPath, "known_peers.json") + + nonce, _ := ethutil.RandomUint64() + + listenAddr := ":" + port + + eth := &Ethereum{ + shutdownChan: make(chan bool), + quit: make(chan bool), + db: db, + Nonce: nonce, + // serverCaps: caps, + peersFile: peersFile, + ListenAddr: listenAddr, + keyManager: keyManager, + clientIdentity: identity, + blacklist: blacklist, + eventMux: &event.TypeMux{}, + filters: make(map[int]*core.Filter), + } + + eth.txPool = core.NewTxPool(eth) + eth.chainManager = core.NewChainManager(eth.EventMux()) + eth.blockManager = core.NewBlockManager(eth) + eth.chainManager.SetProcessor(eth.blockManager) + + hasBlock := eth.chainManager.HasBlock + insertChain := eth.chainManager.InsertChain + pow := ezp.New() + verifyPoW := pow.Verify + eth.blockPool = NewBlockPool(hasBlock, insertChain, verifyPoW) + + // Start the tx pool + eth.txPool.Start() + + ethProto := EthProtocol(eth.txPool, eth.chainManager, eth.blockPool) + protocols := []p2p.Protocol{ethProto} + + server := &p2p.Server{ + Identity: identity, + MaxPeers: maxPeers, + Protocols: protocols, + ListenAddr: listenAddr, + Blacklist: blacklist, + NAT: nat, + } + + eth.server = server + + return eth, nil +} + +func (s *Ethereum) KeyManager() *crypto.KeyManager { + return s.keyManager +} + +func (s *Ethereum) ClientIdentity() p2p.ClientIdentity { + return s.clientIdentity +} + +func (s *Ethereum) ChainManager() *core.ChainManager { + return s.chainManager +} + +func (s *Ethereum) BlockManager() *core.BlockManager { + return s.blockManager +} + +func (s *Ethereum) TxPool() *core.TxPool { + return s.txPool +} + +func (s *Ethereum) BlockPool() *BlockPool { + return s.blockPool +} + +func (s *Ethereum) EventMux() *event.TypeMux { + return s.eventMux +} +func (self *Ethereum) Db() ethutil.Database { + return self.db +} + +func (s *Ethereum) IsMining() bool { + return s.Mining +} + +func (s *Ethereum) IsListening() bool { + if s.ListenAddr == "" { + return false + } else { + return true + } +} + +func (s *Ethereum) PeerCount() int { + return s.server.PeerCount() +} + +func (s *Ethereum) Peers() []*p2p.Peer { + return s.server.Peers() +} + +// Start the ethereum +func (s *Ethereum) Start(seed bool) error { + err := s.server.Start() + if err != nil { + return err + } + s.blockPool.Start() + + go s.filterLoop() + + // broadcast transactions + s.txSub = s.eventMux.Subscribe(core.TxPreEvent{}) + go s.txBroadcastLoop() + + // broadcast mined blocks + s.blockSub = s.eventMux.Subscribe(core.NewMinedBlockEvent{}) + go s.blockBroadcastLoop() + + // TODO: read peers here + if seed { + logger.Infof("Connect to seed node %v", seedNodeAddress) + if err := s.SuggestPeer(seedNodeAddress); err != nil { + return err + } + } + + logger.Infoln("Server started") + return nil +} + +func (self *Ethereum) SuggestPeer(addr string) error { + netaddr, err := net.ResolveTCPAddr("tcp", addr) + if err != nil { + logger.Errorf("couldn't resolve %s:", addr, err) + return err + } + + self.server.SuggestPeer(netaddr.IP, netaddr.Port, nil) + return nil +} + +func (s *Ethereum) Stop() { + // Close the database + defer s.db.Close() + + // + // WritePeers(s.peersFile, s.server.PeerAddresses()) + close(s.quit) + + s.txSub.Unsubscribe() // quits txBroadcastLoop + s.blockSub.Unsubscribe() // quits blockBroadcastLoop + + if s.RpcServer != nil { + s.RpcServer.Stop() + } + s.txPool.Stop() + s.eventMux.Stop() + s.blockPool.Stop() + + logger.Infoln("Server stopped") + close(s.shutdownChan) +} + +// This function will wait for a shutdown and resumes main thread execution +func (s *Ethereum) WaitForShutdown() { + <-s.shutdownChan +} + +func WritePeers(path string, addresses []string) { + if len(addresses) > 0 { + data, _ := json.MarshalIndent(addresses, "", " ") + ethutil.WriteFile(path, data) + } +} + +func ReadPeers(path string) (ips []string, err error) { + var data string + data, err = ethutil.ReadAllFile(path) + if err != nil { + json.Unmarshal([]byte(data), &ips) + } + return +} + +// now tx broadcasting is taken out of txPool +// handled here via subscription, efficiency? +func (self *Ethereum) txBroadcastLoop() { + // automatically stops if unsubscribe + for obj := range self.txSub.Chan() { + event := obj.(core.TxPreEvent) + self.server.Broadcast("eth", TxMsg, []interface{}{event.Tx.RlpData()}) + } +} + +func (self *Ethereum) blockBroadcastLoop() { + // automatically stops if unsubscribe + for obj := range self.txSub.Chan() { + event := obj.(core.NewMinedBlockEvent) + self.server.Broadcast("eth", NewBlockMsg, event.Block.Value().Val) + } +} + +func saveProtocolVersion(db ethutil.Database) { + d, _ := db.Get([]byte("ProtocolVersion")) + protocolVersion := ethutil.NewValue(d).Uint() + + if protocolVersion == 0 { + db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes()) + } +} + +// InstallFilter adds filter for blockchain events. +// The filter's callbacks will run for matching blocks and messages. +// The filter should not be modified after it has been installed. +func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) { + self.filterMu.Lock() + id = self.filterId + self.filters[id] = filter + self.filterId++ + self.filterMu.Unlock() + return id +} + +func (self *Ethereum) UninstallFilter(id int) { + self.filterMu.Lock() + delete(self.filters, id) + self.filterMu.Unlock() +} + +// GetFilter retrieves a filter installed using InstallFilter. +// The filter may not be modified. +func (self *Ethereum) GetFilter(id int) *core.Filter { + self.filterMu.RLock() + defer self.filterMu.RUnlock() + return self.filters[id] +} + +func (self *Ethereum) filterLoop() { + // Subscribe to events + events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) + for event := range events.Chan() { + switch event.(type) { + case core.NewBlockEvent: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.BlockCallback != nil { + e := event.(core.NewBlockEvent) + filter.BlockCallback(e.Block) + } + } + self.filterMu.RUnlock() + case state.Messages: + self.filterMu.RLock() + for _, filter := range self.filters { + if filter.MessageCallback != nil { + e := event.(state.Messages) + msgs := filter.FilterMessages(e) + if len(msgs) > 0 { + filter.MessageCallback(msgs) + } + } + } + self.filterMu.RUnlock() + } + } +} diff --git a/eth/block_pool.go b/eth/block_pool.go index 2c5ebb1e3..7cfbc63f8 100644 --- a/eth/block_pool.go +++ b/eth/block_pool.go @@ -1,369 +1,160 @@ package eth import ( - "bytes" - "fmt" "math" "math/big" + "math/rand" + "sort" "sync" "time" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethutil" - "github.com/ethereum/go-ethereum/event" ethlogger "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/pow" ) var poolLogger = ethlogger.NewLogger("Blockpool") const ( - blockHashesBatchSize = 256 - blockBatchSize = 64 - blockRequestInterval = 10 // seconds - blockRequestRepetition = 1 - cacheTimeout = 3 // minutes - blockTimeout = 5 // minutes + blockHashesBatchSize = 256 + blockBatchSize = 64 + blocksRequestInterval = 10 // seconds + blocksRequestRepetition = 1 + blockHashesRequestInterval = 10 // seconds + blocksRequestMaxIdleRounds = 10 + cacheTimeout = 3 // minutes + blockTimeout = 5 // minutes ) type poolNode struct { - hash []byte - block *types.Block - child *poolNode - parent *poolNode - root *nodePointer - knownParent bool - suicide chan bool - peer string - source string - blockRequestRoot bool - blockRequestControl *bool - blockRequestQuit *(chan bool) -} - -// the minimal interface for chain manager -type chainManager interface { - KnownBlock(hash []byte) bool - AddBlock(*types.Block) error - CheckPoW(*types.Block) bool + lock sync.RWMutex + hash []byte + block *types.Block + child *poolNode + parent *poolNode + section *section + knownParent bool + peer string + source string + complete bool } type BlockPool struct { - chainManager chainManager - eventer event.TypeMux - - // pool Pool - lock sync.Mutex + lock sync.RWMutex pool map[string]*poolNode - peersLock sync.Mutex + peersLock sync.RWMutex peers map[string]*peerInfo peer *peerInfo quit chan bool wg sync.WaitGroup running bool + + // the minimal interface with blockchain + hasBlock func(hash []byte) bool + insertChain func(types.Blocks) error + verifyPoW func(pow.Block) bool } type peerInfo struct { - td *big.Int - currentBlock []byte - id string + lock sync.RWMutex + + td *big.Int + currentBlock []byte + id string + requestBlockHashes func([]byte) error requestBlocks func([][]byte) error - invalidBlock func(error) -} + peerError func(int, string, ...interface{}) -type nodePointer struct { - hash []byte + sections map[string]*section + roots []*poolNode + quitC chan bool } -type peerChangeEvent struct { - *peerInfo -} - -func NewBlockPool(chMgr chainManager) *BlockPool { +func NewBlockPool(hasBlock func(hash []byte) bool, insertChain func(types.Blocks) error, verifyPoW func(pow.Block) bool, +) *BlockPool { return &BlockPool{ - chainManager: chMgr, - pool: make(map[string]*poolNode), - peers: make(map[string]*peerInfo), - quit: make(chan bool), - running: true, + hasBlock: hasBlock, + insertChain: insertChain, + verifyPoW: verifyPoW, } } -func (self *BlockPool) Stop() { +// allows restart +func (self *BlockPool) Start() { self.lock.Lock() - if !self.running { + if self.running { self.lock.Unlock() return } - self.running = false + self.running = true + self.quit = make(chan bool) + self.pool = make(map[string]*poolNode) self.lock.Unlock() - poolLogger.Infoln("Stopping") + self.peersLock.Lock() + self.peers = make(map[string]*peerInfo) + self.peersLock.Unlock() - close(self.quit) - self.wg.Wait() - poolLogger.Infoln("Stopped") + poolLogger.Infoln("Started") } -// Entry point for eth protocol to add block hashes received via BlockHashesMsg -// only hashes from the best peer is handled -// this method is always responsible to initiate further hash requests until -// a known parent is reached unless cancelled by a peerChange event -func (self *BlockPool) AddBlockHashes(next func() ([]byte, bool), peerId string) { - // subscribe to peerChangeEvent before we check for best peer - peerChange := self.eventer.Subscribe(peerChangeEvent{}) - defer peerChange.Unsubscribe() - // check if this peer is the best - peer, best := self.getPeer(peerId) - if !best { +func (self *BlockPool) Stop() { + self.lock.Lock() + if !self.running { + self.lock.Unlock() return } - root := &nodePointer{} - // peer is still the best - hashes := make(chan []byte) - var lastPoolNode *poolNode - - // using a for select loop so that peer change (new best peer) can abort the parallel thread that processes hashes of the earlier best peer - for { - hash, ok := next() - if ok { - hashes <- hash - } else { - break - } - select { - case <-self.quit: - return - case <-peerChange.Chan(): - // remember where we left off with this peer - if lastPoolNode != nil { - root.hash = lastPoolNode.hash - go self.killChain(lastPoolNode) - } - case hash := <-hashes: - self.lock.Lock() - defer self.lock.Unlock() - // check if known block connecting the downloaded chain to our blockchain - if self.chainManager.KnownBlock(hash) { - poolLogger.Infof("known block (%x...)\n", hash[0:4]) - if lastPoolNode != nil { - lastPoolNode.knownParent = true - go self.requestBlocksLoop(lastPoolNode) - } else { - // all hashes known if topmost one is in blockchain - } - return - } - // - var currentPoolNode *poolNode - // check if lastPoolNode has the correct parent node (hash matching), - // then just assign to currentPoolNode - if lastPoolNode != nil && lastPoolNode.parent != nil && bytes.Compare(lastPoolNode.parent.hash, hash) == 0 { - currentPoolNode = lastPoolNode.parent - } else { - // otherwise look up in pool - currentPoolNode = self.pool[string(hash)] - // if node does not exist, create it and index in the pool - if currentPoolNode == nil { - currentPoolNode = &poolNode{ - hash: hash, - } - self.pool[string(hash)] = currentPoolNode - } - } - // set up parent-child nodes (doubly linked list) - self.link(currentPoolNode, lastPoolNode) - // ! we trust the node iff - // (1) node marked as by the same peer or - // (2) it has a PoW valid block retrieved - if currentPoolNode.peer == peer.id || currentPoolNode.block != nil { - // the trusted checkpoint from which we request hashes down to known head - lastPoolNode = self.pool[string(currentPoolNode.root.hash)] - break - } - currentPoolNode.peer = peer.id - currentPoolNode.root = root - lastPoolNode = currentPoolNode - } - } - // lastPoolNode is nil if and only if the node with stored root hash is already cleaned up - // after valid block insertion, therefore in this case the blockpool active chain is connected to the blockchain, so no need to request further hashes or request blocks - if lastPoolNode != nil { - root.hash = lastPoolNode.hash - peer.requestBlockHashes(lastPoolNode.hash) - go self.requestBlocksLoop(lastPoolNode) - } - return -} - -func (self *BlockPool) requestBlocksLoop(node *poolNode) { - suicide := time.After(blockTimeout * time.Minute) - requestTimer := time.After(0) - var controlChan chan bool - closedChan := make(chan bool) - quit := make(chan bool) - close(closedChan) - requestBlocks := true - origNode := node - self.lock.Lock() - node.blockRequestRoot = true - b := false - control := &b - node.blockRequestControl = control - node.blockRequestQuit = &quit + self.running = false self.lock.Unlock() - blocks := 0 - self.wg.Add(1) -loop: - for { - if requestBlocks { - controlChan = closedChan - } else { - self.lock.Lock() - if *node.blockRequestControl { - controlChan = closedChan - *node.blockRequestControl = false - } - self.lock.Unlock() - } - select { - case <-quit: - break loop - case <-suicide: - go self.killChain(origNode) - break loop - - case <-requestTimer: - requestBlocks = true - - case <-controlChan: - controlChan = nil - // this iteration takes care of requesting blocks only starting from the first node with a missing block (moving target), - // max up to the next checkpoint (n.blockRequestRoot true) - nodes := []*poolNode{} - n := node - next := node - self.lock.Lock() - for n != nil && (n == node || !n.blockRequestRoot) && (requestBlocks || n.block != nil) { - if n.block != nil { - if len(nodes) == 0 { - // nil control indicates that node is not needed anymore - // block can be inserted to blockchain and deleted if knownParent - n.blockRequestControl = nil - blocks++ - next = next.child - } else { - // this is needed to indicate that when a new chain forks from an existing one - // triggering a reorg will ? renew the blockTimeout period ??? - // if there is a block but control == nil should start fetching blocks, see link function - n.blockRequestControl = control - } - } else { - nodes = append(nodes, n) - n.blockRequestControl = control - } - n = n.child - } - // if node is connected to the blockchain, we can immediately start inserting - // blocks to the blockchain and delete nodes - if node.knownParent { - go self.insertChainFrom(node) - } - if next.blockRequestRoot && next != node { - // no more missing blocks till the checkpoint, quitting - poolLogger.Debugf("fetched %v blocks on active chain, batch %v-%v", blocks, origNode, n) - break loop - } - self.lock.Unlock() - // reset starting node to the first descendant node with missing block - node = next - if !requestBlocks { - continue - } - go self.requestBlocks(nodes) - requestTimer = time.After(blockRequestInterval * time.Second) - } - } - self.wg.Done() - return -} + poolLogger.Infoln("Stopping") -func (self *BlockPool) requestBlocks(nodes []*poolNode) { - // distribute block request among known peers + close(self.quit) + self.lock.Lock() self.peersLock.Lock() - peerCount := len(self.peers) - poolLogger.Debugf("requesting %v missing blocks from %v peers", len(nodes), peerCount) - blockHashes := make([][][]byte, peerCount) - repetitions := int(math.Max(float64(peerCount)/2.0, float64(blockRequestRepetition))) - for n, node := range nodes { - for i := 0; i < repetitions; i++ { - blockHashes[n%peerCount] = append(blockHashes[n%peerCount], node.hash) - n++ - } - } - i := 0 - for _, peer := range self.peers { - peer.requestBlocks(blockHashes[i]) - i++ - } + self.peers = nil + self.pool = nil + self.peer = nil + self.wg.Wait() + self.lock.Unlock() self.peersLock.Unlock() -} + poolLogger.Infoln("Stopped") -func (self *BlockPool) insertChainFrom(node *poolNode) { - self.lock.Lock() - defer self.lock.Unlock() - for node != nil && node.blockRequestControl == nil { - err := self.chainManager.AddBlock(node.block) - if err != nil { - poolLogger.Debugf("invalid block %v", node.hash) - poolLogger.Debugf("penalise peers %v (hash), %v (block)", node.peer, node.source) - // penalise peer in node.source - go self.killChain(node) - return - } - poolLogger.Debugf("insert block %v into blockchain", node.hash) - node = node.child - } - // if block insertion succeeds, mark the child as knownParent - // trigger request blocks reorg - if node != nil { - node.knownParent = true - *(node.blockRequestControl) = true - } } // AddPeer is called by the eth protocol instance running on the peer after // the status message has been received with total difficulty and current block hash // AddPeer can only be used once, RemovePeer needs to be called when the peer disconnects -func (self *BlockPool) AddPeer(td *big.Int, currentBlock []byte, peerId string, requestBlockHashes func([]byte) error, requestBlocks func([][]byte) error, invalidBlock func(error)) bool { +func (self *BlockPool) AddPeer(td *big.Int, currentBlock []byte, peerId string, requestBlockHashes func([]byte) error, requestBlocks func([][]byte) error, peerError func(int, string, ...interface{})) bool { self.peersLock.Lock() defer self.peersLock.Unlock() if self.peers[peerId] != nil { panic("peer already added") } - info := &peerInfo{ + peer := &peerInfo{ td: td, currentBlock: currentBlock, id: peerId, //peer.Identity().Pubkey() requestBlockHashes: requestBlockHashes, requestBlocks: requestBlocks, - invalidBlock: invalidBlock, + peerError: peerError, } - self.peers[peerId] = info + self.peers[peerId] = peer poolLogger.Debugf("add new peer %v with td %v", peerId, td) currentTD := ethutil.Big0 if self.peer != nil { currentTD = self.peer.td } if td.Cmp(currentTD) > 0 { - self.peer = info - self.eventer.Post(peerChangeEvent{info}) + self.peer.stop(peer) + peer.start(self.peer) poolLogger.Debugf("peer %v promoted to best peer", peerId) - requestBlockHashes(currentBlock) + self.peer = peer return true } return false @@ -373,14 +164,15 @@ func (self *BlockPool) AddPeer(td *big.Int, currentBlock []byte, peerId string, func (self *BlockPool) RemovePeer(peerId string) { self.peersLock.Lock() defer self.peersLock.Unlock() - if self.peers[peerId] != nil { - panic("peer already removed") + peer := self.peers[peerId] + if peer == nil { + return } self.peers[peerId] = nil poolLogger.Debugf("remove peer %v", peerId[0:4]) // if current best peer is removed, need find a better one - if peerId == self.peer.id { + if self.peer != nil && peerId == self.peer.id { var newPeer *peerInfo max := ethutil.Big0 // peer with the highest self-acclaimed TD is chosen @@ -390,21 +182,499 @@ func (self *BlockPool) RemovePeer(peerId string) { newPeer = info } } - self.peer = newPeer - self.eventer.Post(peerChangeEvent{newPeer}) + self.peer.stop(peer) + peer.start(self.peer) if newPeer != nil { - poolLogger.Debugf("peer %v with td %v spromoted to best peer", newPeer.id[0:4], newPeer.td) - newPeer.requestBlockHashes(newPeer.currentBlock) + poolLogger.Debugf("peer %v with td %v promoted to best peer", newPeer.id[0:4], newPeer.td) } else { poolLogger.Warnln("no peers left") } } } -func (self *BlockPool) getPeer(peerId string) (*peerInfo, bool) { +// Entry point for eth protocol to add block hashes received via BlockHashesMsg +// only hashes from the best peer is handled +// this method is always responsible to initiate further hash requests until +// a known parent is reached unless cancelled by a peerChange event +// this process also launches all request processes on each chain section +// this function needs to run asynchronously for one peer since the message is discarded??? +func (self *BlockPool) AddBlockHashes(next func() ([]byte, bool), peerId string) { + + // check if this peer is the best + peer, best := self.getPeer(peerId) + if !best { + return + } + // peer is still the best + + var child *poolNode + var depth int + + // iterate using next (rlp stream lazy decoder) feeding hashesC + self.wg.Add(1) + go func() { + for { + select { + case <-self.quit: + return + case <-peer.quitC: + // if the peer is demoted, no more hashes taken + break + default: + hash, ok := next() + if !ok { + // message consumed chain skeleton built + break + } + // check if known block connecting the downloaded chain to our blockchain + if self.hasBlock(hash) { + poolLogger.Infof("known block (%x...)\n", hash[0:4]) + if child != nil { + child.Lock() + // mark child as absolute pool root with parent known to blockchain + child.knownParent = true + child.Unlock() + } + break + } + // + var parent *poolNode + // look up node in pool + parent = self.get(hash) + if parent != nil { + // reached a known chain in the pool + // request blocks on the newly added part of the chain + if child != nil { + self.link(parent, child) + + // activate the current chain + self.activateChain(parent, peer, true) + poolLogger.Debugf("potential chain of %v blocks added, reached blockpool, activate chain", depth) + break + } + // if this is the first hash, we expect to find it + parent.RLock() + grandParent := parent.parent + parent.RUnlock() + if grandParent != nil { + // activate the current chain + self.activateChain(parent, peer, true) + poolLogger.Debugf("block hash found, activate chain") + break + } + // the first node is the root of a chain in the pool, rejoice and continue + } + // if node does not exist, create it and index in the pool + section := §ion{} + if child == nil { + section.top = parent + } + parent = &poolNode{ + hash: hash, + child: child, + section: section, + peer: peerId, + } + self.set(hash, parent) + poolLogger.Debugf("create potential block for %x...", hash[0:4]) + + depth++ + child = parent + } + } + if child != nil { + poolLogger.Debugf("chain of %v hashes added", depth) + // start a processSection on the last node, but switch off asking + // hashes and blocks until next peer confirms this chain + section := self.processSection(child) + peer.addSection(child.hash, section) + section.start() + } + }() +} + +// AddBlock is the entry point for the eth protocol when blockmsg is received upon requests +// It has a strict interpretation of the protocol in that if the block received has not been requested, it results in an error (which can be ignored) +// block is checked for PoW +// only the first PoW-valid block for a hash is considered legit +func (self *BlockPool) AddBlock(block *types.Block, peerId string) { + hash := block.Hash() + node := self.get(hash) + node.RLock() + b := node.block + node.RUnlock() + if b != nil { + return + } + if node == nil && !self.hasBlock(hash) { + self.peerError(peerId, ErrUnrequestedBlock, "%x", hash) + return + } + // validate block for PoW + if !self.verifyPoW(block) { + self.peerError(peerId, ErrInvalidPoW, "%x", hash) + } + node.Lock() + node.block = block + node.source = peerId + node.Unlock() +} + +// iterates down a known poolchain and activates fetching processes +// on each chain section for the peer +// stops if the peer is demoted +// registers last section root as root for the peer (in case peer is promoted a second time, to remember) +func (self *BlockPool) activateChain(node *poolNode, peer *peerInfo, on bool) { + self.wg.Add(1) + go func() { + for { + node.sectionRLock() + bottom := node.section.bottom + if bottom == nil { // the chain section is being created or killed + break + } + // register this section with the peer + if peer != nil { + peer.addSection(bottom.hash, bottom.section) + if on { + bottom.section.start() + } else { + bottom.section.start() + } + } + if bottom.parent == nil { + node = bottom + break + } + // if peer demoted stop activation + select { + case <-peer.quitC: + break + default: + } + + node = bottom.parent + bottom.sectionRUnlock() + } + // remember root for this peer + peer.addRoot(node) + self.wg.Done() + }() +} + +// main worker thread on each section in the poolchain +// - kills the section if there are blocks missing after an absolute time +// - kills the section if there are maxIdleRounds of idle rounds of block requests with no response +// - periodically polls the chain section for missing blocks which are then requested from peers +// - registers the process controller on the peer so that if the peer is promoted as best peer the second time (after a disconnect of a better one), all active processes are switched back on unless they expire and killed () +// - when turned off (if peer disconnects and new peer connects with alternative chain), no blockrequests are made but absolute expiry timer is ticking +// - when turned back on it recursively calls itself on the root of the next chain section +// - when exits, signals to +func (self *BlockPool) processSection(node *poolNode) *section { + // absolute time after which sub-chain is killed if not complete (some blocks are missing) + suicideTimer := time.After(blockTimeout * time.Minute) + var blocksRequestTimer, blockHashesRequestTimer <-chan time.Time + var nodeC, missingC, processC chan *poolNode + controlC := make(chan bool) + resetC := make(chan bool) + var hashes [][]byte + var i, total, missing, lastMissing, depth int + var blockHashesRequests, blocksRequests int + var idle int + var init, alarm, done, same, running, once bool + orignode := node + hash := node.hash + + node.sectionLock() + defer node.sectionUnlock() + section := §ion{controlC: controlC, resetC: resetC} + node.section = section + + go func() { + self.wg.Add(1) + for { + node.sectionRLock() + controlC = node.section.controlC + node.sectionRUnlock() + + if init { + // missing blocks read from nodeC + // initialized section + if depth == 0 { + break + } + // enable select case to read missing block when ready + processC = missingC + missingC = make(chan *poolNode, lastMissing) + nodeC = nil + // only do once + init = false + } else { + if !once { + missingC = nil + processC = nil + i = 0 + total = 0 + lastMissing = 0 + } + } + + // went through all blocks in section + if i != 0 && i == lastMissing { + if len(hashes) > 0 { + // send block requests to peers + self.requestBlocks(blocksRequests, hashes) + } + blocksRequests++ + poolLogger.Debugf("[%x] block request attempt %v: missing %v/%v/%v", hash[0:4], blocksRequests, missing, total, depth) + if missing == lastMissing { + // idle round + if same { + // more than once + idle++ + // too many idle rounds + if idle > blocksRequestMaxIdleRounds { + poolLogger.Debugf("[%x] block requests had %v idle rounds (%v total attempts): missing %v/%v/%v\ngiving up...", hash[0:4], idle, blocksRequests, missing, total, depth) + self.killChain(node, nil) + break + } + } else { + idle = 0 + } + same = true + } else { + if missing == 0 { + // no missing nodes + poolLogger.Debugf("block request process complete on section %x... (%v total blocksRequests): missing %v/%v/%v", hash[0:4], blockHashesRequests, blocksRequests, missing, total, depth) + node.Lock() + orignode.complete = true + node.Unlock() + blocksRequestTimer = nil + if blockHashesRequestTimer == nil { + // not waiting for hashes any more + poolLogger.Debugf("hash request on root %x... successful (%v total attempts)\nquitting...", hash[0:4], blockHashesRequests) + break + } // otherwise suicide if no hashes coming + } + same = false + } + lastMissing = missing + i = 0 + missing = 0 + // ready for next round + done = true + } + if done && alarm { + poolLogger.Debugf("start checking if new blocks arrived (attempt %v): missing %v/%v/%v", blocksRequests, missing, total, depth) + blocksRequestTimer = time.After(blocksRequestInterval * time.Second) + alarm = false + done = false + // processC supposed to be empty and never closed so just swap, no need to allocate + tempC := processC + processC = missingC + missingC = tempC + } + select { + case <-self.quit: + break + case <-suicideTimer: + self.killChain(node, nil) + poolLogger.Warnf("[%x] timeout. (%v total attempts): missing %v/%v/%v", hash[0:4], blocksRequests, missing, total, depth) + break + case <-blocksRequestTimer: + alarm = true + case <-blockHashesRequestTimer: + orignode.RLock() + parent := orignode.parent + orignode.RUnlock() + if parent != nil { + // if not root of chain, switch off + poolLogger.Debugf("[%x] parent found, hash requests deactivated (after %v total attempts)\n", hash[0:4], blockHashesRequests) + blockHashesRequestTimer = nil + } else { + blockHashesRequests++ + poolLogger.Debugf("[%x] hash request on root (%v total attempts)\n", hash[0:4], blockHashesRequests) + self.requestBlockHashes(parent.hash) + blockHashesRequestTimer = time.After(blockHashesRequestInterval * time.Second) + } + case r, ok := <-controlC: + if !ok { + break + } + if running && !r { + poolLogger.Debugf("process on section %x... (%v total attempts): missing %v/%v/%v", hash[0:4], blocksRequests, missing, total, depth) + + alarm = false + blocksRequestTimer = nil + blockHashesRequestTimer = nil + processC = nil + } + if !running && r { + poolLogger.Debugf("[%x] on", hash[0:4]) + + orignode.RLock() + parent := orignode.parent + complete := orignode.complete + knownParent := orignode.knownParent + orignode.RUnlock() + if !complete { + poolLogger.Debugf("[%x] activate block requests", hash[0:4]) + blocksRequestTimer = time.After(0) + } + if parent == nil && !knownParent { + // if no parent but not connected to blockchain + poolLogger.Debugf("[%x] activate block hashes requests", hash[0:4]) + blockHashesRequestTimer = time.After(0) + } else { + blockHashesRequestTimer = nil + } + alarm = true + processC = missingC + if !once { + // if not run at least once fully, launch iterator + processC = make(chan *poolNode) + missingC = make(chan *poolNode) + self.foldUp(orignode, processC) + once = true + } + } + total = lastMissing + case <-resetC: + once = false + init = false + done = false + case node, ok := <-processC: + if !ok { + // channel closed, first iteration finished + init = true + once = true + continue + } + i++ + // if node has no block + node.RLock() + block := node.block + nhash := node.hash + knownParent := node.knownParent + node.RUnlock() + if !init { + depth++ + } + if block == nil { + missing++ + if !init { + total++ + } + hashes = append(hashes, nhash) + if len(hashes) == blockBatchSize { + self.requestBlocks(blocksRequests, hashes) + hashes = nil + } + missingC <- node + } else { + // block is found + if knownParent { + // connected to the blockchain, insert the longest chain of blocks + var blocks types.Blocks + child := node + parent := node + node.sectionRLock() + for child != nil && child.block != nil { + parent = child + blocks = append(blocks, parent.block) + child = parent.child + } + node.sectionRUnlock() + poolLogger.Debugf("[%x] insert %v blocks into blockchain", hash[0:4], len(blocks)) + if err := self.insertChain(blocks); err != nil { + // TODO: not clear which peer we need to address + // peerError should dispatch to peer if still connected and disconnect + self.peerError(node.source, ErrInvalidBlock, "%v", err) + poolLogger.Debugf("invalid block %v", node.hash) + poolLogger.Debugf("penalise peers %v (hash), %v (block)", node.peer, node.source) + // penalise peer in node.source + self.killChain(node, nil) + // self.disconnect() + break + } + // if suceeded mark the next one (no block yet) as connected to blockchain + if child != nil { + child.Lock() + child.knownParent = true + child.Unlock() + } + // reset starting node to first node with missing block + orignode = child + // pop the inserted ancestors off the channel + for i := 1; i < len(blocks); i++ { + <-processC + } + // delink inserted chain section + self.killChain(node, parent) + } + } + } + } + poolLogger.Debugf("[%x] quit after\n%v block hashes requests\n%v block requests: missing %v/%v/%v", hash[0:4], blockHashesRequests, blocksRequests, missing, total, depth) + + self.wg.Done() + node.sectionLock() + node.section.controlC = nil + node.sectionUnlock() + // this signals that controller not available + }() + return section + +} + +func (self *BlockPool) peerError(peerId string, code int, format string, params ...interface{}) { + self.peersLock.RLock() + defer self.peersLock.RUnlock() + peer, ok := self.peers[peerId] + if ok { + peer.peerError(code, format, params...) + } +} + +func (self *BlockPool) requestBlockHashes(hash []byte) { + self.peersLock.Lock() + defer self.peersLock.Unlock() + if self.peer != nil { + self.peer.requestBlockHashes(hash) + } +} + +func (self *BlockPool) requestBlocks(attempts int, hashes [][]byte) { + // distribute block request among known peers self.peersLock.Lock() defer self.peersLock.Unlock() - if self.peer.id == peerId { + peerCount := len(self.peers) + // on first attempt use the best peer + if attempts == 0 { + self.peer.requestBlocks(hashes) + return + } + repetitions := int(math.Min(float64(peerCount), float64(blocksRequestRepetition))) + poolLogger.Debugf("request %v missing blocks from %v/%v peers", len(hashes), repetitions, peerCount) + i := 0 + indexes := rand.Perm(peerCount)[0:(repetitions - 1)] + sort.Ints(indexes) + for _, peer := range self.peers { + if i == indexes[0] { + peer.requestBlocks(hashes) + indexes = indexes[1:] + if len(indexes) == 0 { + break + } + } + i++ + } +} + +func (self *BlockPool) getPeer(peerId string) (*peerInfo, bool) { + self.peersLock.RLock() + defer self.peersLock.RUnlock() + if self.peer != nil && self.peer.id == peerId { return self.peer, true } info, ok := self.peers[peerId] @@ -414,101 +684,332 @@ func (self *BlockPool) getPeer(peerId string) (*peerInfo, bool) { return info, false } -// if same peer gave different chain before, this will overwrite it -// if currentPoolNode existed as a non-leaf node the earlier fork is delinked -// if same parent hash is found, we can abort, we do not allow the same peer to change minds about parent of same hash, if errored first time round, will get penalized. -// if lastPoolNode had a different parent the earlier parent (with entire subtree) is delinked, this situation cannot normally arise though -// just in case reset lastPoolNode as non-root (unlikely) +func (self *peerInfo) addSection(hash []byte, section *section) { + self.lock.Lock() + defer self.lock.Unlock() + self.sections[string(hash)] = section +} + +func (self *peerInfo) addRoot(node *poolNode) { + self.lock.Lock() + defer self.lock.Unlock() + self.roots = append(self.roots, node) +} +// (re)starts processes registered for this peer (self) +func (self *peerInfo) start(peer *peerInfo) { + self.lock.Lock() + defer self.lock.Unlock() + self.quitC = make(chan bool) + for _, root := range self.roots { + root.sectionRLock() + if root.section.bottom != nil { + if root.parent == nil { + self.requestBlockHashes(root.hash) + } + } + root.sectionRUnlock() + } + self.roots = nil + self.controlSections(peer, true) +} + +// (re)starts process without requests, only suicide timer +func (self *peerInfo) stop(peer *peerInfo) { + self.lock.RLock() + defer self.lock.RUnlock() + close(self.quitC) + self.controlSections(peer, false) +} + +func (self *peerInfo) controlSections(peer *peerInfo, on bool) { + if peer != nil { + peer.lock.RLock() + defer peer.lock.RUnlock() + } + for hash, section := range peer.sections { + if section.done() { + delete(self.sections, hash) + } + _, exists := peer.sections[hash] + if on || peer == nil || exists { + if on { + // self is best peer + section.start() + } else { + // (re)starts process without requests, only suicide timer + section.stop() + } + } + } +} + +// called when parent is found in pool +// parent and child are guaranteed to be on different sections func (self *BlockPool) link(parent, child *poolNode) { - // reactivate node scheduled for suicide - if parent.suicide != nil { - close(parent.suicide) - parent.suicide = nil + var top bool + parent.sectionLock() + if child != nil { + child.sectionLock() + } + if parent == parent.section.top && parent.section.top != nil { + top = true + } + var bottom bool + + if child == child.section.bottom { + bottom = true } if parent.child != child { orphan := parent.child - orphan.parent = nil - go self.killChain(orphan) + if orphan != nil { + // got a fork in the chain + if top { + orphan.lock.Lock() + // make old child orphan + orphan.parent = nil + orphan.lock.Unlock() + } else { // we are under section lock + // make old child orphan + orphan.parent = nil + // reset section objects above the fork + nchild := orphan.child + node := orphan + section := §ion{bottom: orphan} + for node.section == nchild.section { + node = nchild + node.section = section + nchild = node.child + } + section.top = node + // set up a suicide + self.processSection(orphan).stop() + } + } else { + // child is on top of a chain need to close section + child.section.bottom = child + } + // adopt new child parent.child = child + if !top { + parent.section.top = parent + // restart section process so that shorter section is scanned for blocks + parent.section.reset() + } } + if child != nil { if child.parent != parent { - orphan := child.parent - orphan.child = nil - go func() { - // if it is a aberrant reverse fork, zip down to bottom - for orphan.parent != nil { - orphan = orphan.parent + stepParent := child.parent + if stepParent != nil { + if bottom { + stepParent.Lock() + stepParent.child = nil + stepParent.Unlock() + } else { + // we are on the same section + // if it is a aberrant reverse fork, + stepParent.child = nil + node := stepParent + nparent := stepParent.child + section := §ion{top: stepParent} + for node.section == nparent.section { + node = nparent + node.section = section + node = node.parent + } } - self.killChain(orphan) - }() - child.parent = parent + } else { + // linking to a root node, ie. parent is under the root of a chain + parent.section.top = parent + } } - child.knownParent = false + child.parent = parent + child.section.bottom = child } -} + // this needed if someone lied about the parent before + child.knownParent = false -func (self *BlockPool) killChain(node *poolNode) { - if node == nil { - return + parent.sectionUnlock() + if child != nil { + child.sectionUnlock() } - poolLogger.Debugf("suicide scheduled on node %v", node) - suicide := make(chan bool) - self.lock.Lock() - node.suicide = suicide - self.lock.Unlock() - timer := time.After(cacheTimeout * time.Minute) +} + +// this immediately kills the chain from node to end (inclusive) section by section +func (self *BlockPool) killChain(node *poolNode, end *poolNode) { + poolLogger.Debugf("kill chain section with root node %v", node) + + node.sectionLock() + node.section.abort() + self.set(node.hash, nil) + child := node.child + top := node.section.top + i := 1 self.wg.Add(1) - select { - case <-self.quit: - case <-suicide: - // cancel suicide = close node.suicide to reactivate node - case <-timer: - poolLogger.Debugf("suicide on node %v", node) - self.lock.Lock() - defer self.lock.Unlock() - // proceed up via child links until another suicide root found or chain ends - // abort request blocks loops that start above - // and delete nodes from pool then quit the suicide process - okToAbort := node.blockRequestRoot - for node != nil && (node.suicide == suicide || node.suicide == nil) { - self.pool[string(node.hash)] = nil - if okToAbort && node.blockRequestQuit != nil { - quit := *(node.blockRequestQuit) - if quit != nil { // not yet closed - *(node.blockRequestQuit) = nil - close(quit) + go func() { + var quit bool + for node != top && node != end && child != nil { + node = child + select { + case <-self.quit: + quit = true + break + default: + } + self.set(node.hash, nil) + child = node.child + } + poolLogger.Debugf("killed chain section of %v blocks with root node %v", i, node) + if !quit { + if node == top { + if node != end && child != nil && end != nil { + // + self.killChain(child, end) } } else { - okToAbort = true + if child != nil { + // delink rest of this section if ended midsection + child.section.bottom = child + child.parent = nil + } } - node = node.child } + node.section.bottom = nil + node.sectionUnlock() + self.wg.Done() + }() +} + +// structure to store long range links on chain to skip along +type section struct { + lock sync.RWMutex + bottom *poolNode + top *poolNode + controlC chan bool + resetC chan bool +} + +func (self *section) start() { + self.lock.RLock() + defer self.lock.RUnlock() + if self.controlC != nil { + self.controlC <- true } - self.wg.Done() } -// AddBlock is the entry point for the eth protocol when blockmsg is received upon requests -// It has a strict interpretation of the protocol in that if the block received has not been requested, it results in an error (which can be ignored) -// block is checked for PoW -// only the first PoW-valid block for a hash is considered legit -func (self *BlockPool) AddBlock(block *types.Block, peerId string) (err error) { - hash := block.Hash() +func (self *section) stop() { + self.lock.RLock() + defer self.lock.RUnlock() + if self.controlC != nil { + self.controlC <- false + } +} + +func (self *section) reset() { + self.lock.RLock() + defer self.lock.RUnlock() + if self.controlC != nil { + self.resetC <- true + self.controlC <- false + } +} + +func (self *section) abort() { self.lock.Lock() defer self.lock.Unlock() - node, ok := self.pool[string(hash)] - if !ok && !self.chainManager.KnownBlock(hash) { - return fmt.Errorf("unrequested block %x", hash) + if self.controlC != nil { + close(self.controlC) + self.controlC = nil } - if node.block != nil { - return - } - // validate block for PoW - if !self.chainManager.CheckPoW(block) { - return fmt.Errorf("invalid pow on block %x", hash) +} + +func (self *section) done() bool { + self.lock.Lock() + defer self.lock.Unlock() + if self.controlC != nil { + return true } - node.block = block - node.source = peerId - return nil + return false +} + +func (self *BlockPool) get(hash []byte) (node *poolNode) { + self.lock.Lock() + defer self.lock.Unlock() + return self.pool[string(hash)] +} + +func (self *BlockPool) set(hash []byte, node *poolNode) { + self.lock.Lock() + defer self.lock.Unlock() + self.pool[string(hash)] = node +} + +// first time for block request, this iteration retrieves nodes of the chain +// from node up to top (all the way if nil) via child links +// copies the controller +// and feeds nodeC channel +// this is performed under section readlock to prevent top from going away +// when +func (self *BlockPool) foldUp(node *poolNode, nodeC chan *poolNode) { + self.wg.Add(1) + go func() { + node.sectionRLock() + defer node.sectionRUnlock() + for node != nil { + select { + case <-self.quit: + break + case nodeC <- node: + if node == node.section.top { + break + } + node = node.child + } + } + close(nodeC) + self.wg.Done() + }() +} + +func (self *poolNode) Lock() { + self.sectionLock() + self.lock.Lock() +} + +func (self *poolNode) Unlock() { + self.lock.Unlock() + self.sectionUnlock() +} + +func (self *poolNode) RLock() { + self.lock.RLock() +} + +func (self *poolNode) RUnlock() { + self.lock.RUnlock() +} + +func (self *poolNode) sectionLock() { + self.lock.RLock() + defer self.lock.RUnlock() + self.section.lock.Lock() +} + +func (self *poolNode) sectionUnlock() { + self.lock.RLock() + defer self.lock.RUnlock() + self.section.lock.Unlock() +} + +func (self *poolNode) sectionRLock() { + self.lock.RLock() + defer self.lock.RUnlock() + self.section.lock.RLock() +} + +func (self *poolNode) sectionRUnlock() { + self.lock.RLock() + defer self.lock.RUnlock() + self.section.lock.RUnlock() } diff --git a/eth/error.go b/eth/error.go index 9355d6457..d1daad575 100644 --- a/eth/error.go +++ b/eth/error.go @@ -14,6 +14,8 @@ const ( ErrNoStatusMsg ErrExtraStatusMsg ErrInvalidBlock + ErrInvalidPoW + ErrUnrequestedBlock ) var errorToString = map[int]string{ @@ -26,6 +28,8 @@ var errorToString = map[int]string{ ErrNoStatusMsg: "No status message", ErrExtraStatusMsg: "Extra status message", ErrInvalidBlock: "Invalid block", + ErrInvalidPoW: "Invalid PoW", + ErrUnrequestedBlock: "Unrequested block", } type protocolError struct { diff --git a/eth/protocol.go b/eth/protocol.go index 380bcc8d2..3b5b49696 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -14,26 +14,33 @@ import ( // ethProtocol represents the ethereum wire protocol // instance is running on each peer type ethProtocol struct { - eth backend - peer *p2p.Peer - id string - rw p2p.MsgReadWriter + txPool txPool + chainManager chainManager + blockPool blockPool + peer *p2p.Peer + id string + rw p2p.MsgReadWriter } // backend is the interface the ethereum protocol backend should implement // used as an argument to EthProtocol -type backend interface { - GetTransactions() (txs []*types.Transaction) +type txPool interface { AddTransactions([]*types.Transaction) - GetBlockHashes(hash []byte, amount uint32) (hashes [][]byte) - AddBlockHashes(next func() ([]byte, bool), peerId string) +} + +type chainManager interface { + GetBlockHashesFromHash(hash []byte, amount uint64) (hashes [][]byte) GetBlock(hash []byte) (block *types.Block) - AddBlock(block *types.Block, peerId string) (err error) - AddPeer(td *big.Int, currentBlock []byte, peerId string, requestHashes func([]byte) error, requestBlocks func([][]byte) error, invalidBlock func(error)) (best bool) - RemovePeer(peerId string) Status() (td *big.Int, currentBlock []byte, genesisBlock []byte) } +type blockPool interface { + AddBlockHashes(next func() ([]byte, bool), peerId string) + AddBlock(block *types.Block, peerId string) + AddPeer(td *big.Int, currentBlock []byte, peerId string, requestHashes func([]byte) error, requestBlocks func([][]byte) error, peerError func(int, string, ...interface{})) (best bool) + RemovePeer(peerId string) +} + const ( ProtocolVersion = 43 NetworkId = 0 @@ -61,31 +68,33 @@ type newBlockMsgData struct { type getBlockHashesMsgData struct { Hash []byte - Amount uint32 + Amount uint64 } // main entrypoint, wrappers starting a server running the eth protocol // use this constructor to attach the protocol ("class") to server caps // the Dev p2p layer then runs the protocol instance on each peer -func EthProtocol(eth backend) *p2p.Protocol { - return &p2p.Protocol{ +func EthProtocol(txPool txPool, chainManager chainManager, blockPool blockPool) p2p.Protocol { + return p2p.Protocol{ Name: "eth", Version: ProtocolVersion, Length: ProtocolLength, Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - return runEthProtocol(eth, peer, rw) + return runEthProtocol(txPool, chainManager, blockPool, peer, rw) }, } } // the main loop that handles incoming messages // note RemovePeer in the post-disconnect hook -func runEthProtocol(eth backend, peer *p2p.Peer, rw p2p.MsgReadWriter) (err error) { +func runEthProtocol(txPool txPool, chainManager chainManager, blockPool blockPool, peer *p2p.Peer, rw p2p.MsgReadWriter) (err error) { self := ðProtocol{ - eth: eth, - rw: rw, - peer: peer, - id: (string)(peer.Identity().Pubkey()), + txPool: txPool, + chainManager: chainManager, + blockPool: blockPool, + rw: rw, + peer: peer, + id: (string)(peer.Identity().Pubkey()), } err = self.handleStatus() if err == nil { @@ -93,7 +102,7 @@ func runEthProtocol(eth backend, peer *p2p.Peer, rw p2p.MsgReadWriter) (err erro for { err = self.handle() if err != nil { - self.eth.RemovePeer(self.id) + self.blockPool.RemovePeer(self.id) break } } @@ -118,29 +127,20 @@ func (self *ethProtocol) handle() error { case StatusMsg: return ProtocolError(ErrExtraStatusMsg, "") - case GetTxMsg: - txs := self.eth.GetTransactions() - // TODO: rewrite using rlp flat - txsInterface := make([]interface{}, len(txs)) - for i, tx := range txs { - txsInterface[i] = tx.RlpData() - } - return self.rw.EncodeMsg(TxMsg, txsInterface...) - case TxMsg: // TODO: rework using lazy RLP stream var txs []*types.Transaction if err := msg.Decode(&txs); err != nil { return ProtocolError(ErrDecode, "%v", err) } - self.eth.AddTransactions(txs) + self.txPool.AddTransactions(txs) case GetBlockHashesMsg: var request getBlockHashesMsgData if err := msg.Decode(&request); err != nil { return ProtocolError(ErrDecode, "%v", err) } - hashes := self.eth.GetBlockHashes(request.Hash, request.Amount) + hashes := self.chainManager.GetBlockHashesFromHash(request.Hash, request.Amount) return self.rw.EncodeMsg(BlockHashesMsg, ethutil.ByteSliceToInterface(hashes)...) case BlockHashesMsg: @@ -154,7 +154,7 @@ func (self *ethProtocol) handle() error { } return } - self.eth.AddBlockHashes(iter, self.id) + self.blockPool.AddBlockHashes(iter, self.id) if err != nil && err != rlp.EOL { return ProtocolError(ErrDecode, "%v", err) } @@ -170,7 +170,7 @@ func (self *ethProtocol) handle() error { if i >= max { break } - block := self.eth.GetBlock(hash) + block := self.chainManager.GetBlock(hash) if block != nil { blocks = append(blocks, block.Value().Raw()) } @@ -188,9 +188,7 @@ func (self *ethProtocol) handle() error { return ProtocolError(ErrDecode, "%v", err) } } - if err := self.eth.AddBlock(block, self.id); err != nil { - return ProtocolError(ErrInvalidBlock, "%v", err) - } + self.blockPool.AddBlock(block, self.id) } case NewBlockMsg: @@ -202,7 +200,7 @@ func (self *ethProtocol) handle() error { // to simplify backend interface adding a new block // uses AddPeer followed by AddHashes, AddBlock only if peer is the best peer // (or selected as new best peer) - if self.eth.AddPeer(request.TD, hash, self.id, self.requestBlockHashes, self.requestBlocks, self.invalidBlock) { + if self.blockPool.AddPeer(request.TD, hash, self.id, self.requestBlockHashes, self.requestBlocks, self.protoErrorDisconnect) { called := true iter := func() (hash []byte, ok bool) { if called { @@ -212,10 +210,8 @@ func (self *ethProtocol) handle() error { return } } - self.eth.AddBlockHashes(iter, self.id) - if err := self.eth.AddBlock(request.Block, self.id); err != nil { - return ProtocolError(ErrInvalidBlock, "%v", err) - } + self.blockPool.AddBlockHashes(iter, self.id) + self.blockPool.AddBlock(request.Block, self.id) } default: @@ -233,7 +229,7 @@ type statusMsgData struct { } func (self *ethProtocol) statusMsg() p2p.Msg { - td, currentBlock, genesisBlock := self.eth.Status() + td, currentBlock, genesisBlock := self.chainManager.Status() return p2p.NewMsg(StatusMsg, uint32(ProtocolVersion), @@ -269,7 +265,7 @@ func (self *ethProtocol) handleStatus() error { return ProtocolError(ErrDecode, "%v", err) } - _, _, genesisBlock := self.eth.Status() + _, _, genesisBlock := self.chainManager.Status() if bytes.Compare(status.GenesisBlock, genesisBlock) != 0 { return ProtocolError(ErrGenesisBlockMismatch, "%x (!= %x)", status.GenesisBlock, genesisBlock) @@ -285,7 +281,7 @@ func (self *ethProtocol) handleStatus() error { self.peer.Infof("Peer is [eth] capable (%d/%d). TD = %v ~ %x", status.ProtocolVersion, status.NetworkId, status.CurrentBlock) - self.eth.AddPeer(status.TD, status.CurrentBlock, self.id, self.requestBlockHashes, self.requestBlocks, self.invalidBlock) + self.blockPool.AddPeer(status.TD, status.CurrentBlock, self.id, self.requestBlockHashes, self.requestBlocks, self.protoErrorDisconnect) return nil } @@ -300,11 +296,6 @@ func (self *ethProtocol) requestBlocks(hashes [][]byte) error { return self.rw.EncodeMsg(GetBlocksMsg, ethutil.ByteSliceToInterface(hashes)) } -func (self *ethProtocol) invalidBlock(err error) { - ProtocolError(ErrInvalidBlock, "%v", err) - self.peer.Disconnect(p2p.DiscSubprotocolError) -} - func (self *ethProtocol) protoError(code int, format string, params ...interface{}) (err *protocolError) { err = ProtocolError(code, format, params...) if err.Fatal() { @@ -314,3 +305,14 @@ func (self *ethProtocol) protoError(code int, format string, params ...interface } return } + +func (self *ethProtocol) protoErrorDisconnect(code int, format string, params ...interface{}) { + err := ProtocolError(code, format, params...) + if err.Fatal() { + self.peer.Errorln(err) + // disconnect + } else { + self.peer.Debugln(err) + } + +} diff --git a/eth/protocol_test.go b/eth/protocol_test.go index a166ea6cd..322aec7b7 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -84,12 +84,30 @@ func (self *TestBackend) GetBlockHashes(hash []byte, amount uint32) (hashes [][] return } +<<<<<<< HEAD +<<<<<<< HEAD func (self *TestBackend) AddBlockHashes(next func() ([]byte, bool), peerId string) { if self.addBlockHashes != nil { self.addBlockHashes(next, peerId) } } +======= +func (self *TestBackend) AddHash(hash []byte, peer *p2p.Peer) (more bool) { + if self.addHash != nil { + more = self.addHash(hash, peer) +======= +func (self *TestBackend) AddBlockHashes(next func() ([]byte, bool), peerId string) { + if self.addBlockHashes != nil { + self.addBlockHashes(next, peerId) +>>>>>>> eth protocol changes + } +} +<<<<<<< HEAD +>>>>>>> initial commit for eth-p2p integration +======= + +>>>>>>> eth protocol changes func (self *TestBackend) GetBlock(hash []byte) (block *types.Block) { if self.getBlock != nil { block = self.getBlock(hash) @@ -97,26 +115,59 @@ func (self *TestBackend) GetBlock(hash []byte) (block *types.Block) { return } +<<<<<<< HEAD +<<<<<<< HEAD func (self *TestBackend) AddBlock(block *types.Block, peerId string) (err error) { if self.addBlock != nil { err = self.addBlock(block, peerId) +======= +func (self *TestBackend) AddBlock(td *big.Int, block *types.Block, peer *p2p.Peer) (fetchHashes bool, err error) { + if self.addBlock != nil { + fetchHashes, err = self.addBlock(td, block, peer) +>>>>>>> initial commit for eth-p2p integration +======= +func (self *TestBackend) AddBlock(block *types.Block, peerId string) (err error) { + if self.addBlock != nil { + err = self.addBlock(block, peerId) +>>>>>>> eth protocol changes } return } +<<<<<<< HEAD +<<<<<<< HEAD func (self *TestBackend) AddPeer(td *big.Int, currentBlock []byte, peerId string, requestBlockHashes func([]byte) error, requestBlocks func([][]byte) error, invalidBlock func(error)) (best bool) { if self.addPeer != nil { best = self.addPeer(td, currentBlock, peerId, requestBlockHashes, requestBlocks, invalidBlock) +======= +func (self *TestBackend) AddPeer(td *big.Int, currentBlock []byte, peer *p2p.Peer) (fetchHashes bool) { + if self.addPeer != nil { + fetchHashes = self.addPeer(td, currentBlock, peer) +>>>>>>> initial commit for eth-p2p integration +======= +func (self *TestBackend) AddPeer(td *big.Int, currentBlock []byte, peerId string, requestBlockHashes func([]byte) error, requestBlocks func([][]byte) error, invalidBlock func(error)) (best bool) { + if self.addPeer != nil { + best = self.addPeer(td, currentBlock, peerId, requestBlockHashes, requestBlocks, invalidBlock) +>>>>>>> eth protocol changes } return } +<<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> eth protocol changes func (self *TestBackend) RemovePeer(peerId string) { if self.removePeer != nil { self.removePeer(peerId) } } +<<<<<<< HEAD +======= +>>>>>>> initial commit for eth-p2p integration +======= +>>>>>>> eth protocol changes func (self *TestBackend) Status() (td *big.Int, currentBlock []byte, genesisBlock []byte) { if self.status != nil { td, currentBlock, genesisBlock = self.status() @@ -124,6 +175,10 @@ func (self *TestBackend) Status() (td *big.Int, currentBlock []byte, genesisBloc return } +<<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> eth protocol changes // TODO: refactor this into p2p/client_identity type peerId struct { pubkey []byte @@ -147,12 +202,26 @@ func testPeer() *p2p.Peer { } func TestErrNoStatusMsg(t *testing.T) { +<<<<<<< HEAD +======= +func TestEth(t *testing.T) { +>>>>>>> initial commit for eth-p2p integration +======= +>>>>>>> eth protocol changes quit := make(chan bool) rw := &testMsgReadWriter{make(chan p2p.Msg, 10), make(chan p2p.Msg, 10)} testBackend := &TestBackend{} var err error go func() { +<<<<<<< HEAD +<<<<<<< HEAD + err = runEthProtocol(testBackend, testPeer(), rw) +======= + err = runEthProtocol(testBackend, nil, rw) +>>>>>>> initial commit for eth-p2p integration +======= err = runEthProtocol(testBackend, testPeer(), rw) +>>>>>>> eth protocol changes close(quit) }() statusMsg := p2p.NewMsg(4) diff --git a/ethereum.go b/ethereum.go deleted file mode 100644 index 94e46b556..000000000 --- a/ethereum.go +++ /dev/null @@ -1,661 +0,0 @@ -package eth - -import ( - "container/list" - "encoding/json" - "fmt" - "math/big" - "math/rand" - "net" - "path" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethutil" - "github.com/ethereum/go-ethereum/event" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum/go-ethereum/state" - "github.com/ethereum/go-ethereum/wire" -) - -const ( - seedTextFileUri string = "http://www.ethereum.org/servers.poc3.txt" - seedNodeAddress = "poc-7.ethdev.com:30303" -) - -var loggerger = logger.NewLogger("SERV") - -func eachPeer(peers *list.List, callback func(*Peer, *list.Element)) { - // Loop thru the peers and close them (if we had them) - for e := peers.Front(); e != nil; e = e.Next() { - callback(e.Value.(*Peer), e) - } -} - -const ( - processReapingTimeout = 60 // TODO increase -) - -type Ethereum struct { - // Channel for shutting down the ethereum - shutdownChan chan bool - quit chan bool - - // DB interface - db ethutil.Database - // State manager for processing new blocks and managing the over all states - blockManager *core.BlockManager - // The transaction pool. Transaction can be pushed on this pool - // for later including in the blocks - txPool *core.TxPool - // The canonical chain - blockChain *core.ChainManager - // The block pool - blockPool *BlockPool - // Eventer - eventMux event.TypeMux - // Peers - peers *list.List - // Nonce - Nonce uint64 - - Addr net.Addr - Port string - - blacklist [][]byte - - peerMut sync.Mutex - - // Capabilities for outgoing peers - serverCaps Caps - - nat NAT - - // Specifies the desired amount of maximum peers - MaxPeers int - - Mining bool - - listening bool - - RpcServer *rpc.JsonRpcServer - - keyManager *crypto.KeyManager - - clientIdentity wire.ClientIdentity - - isUpToDate bool - - filterMu sync.RWMutex - filterId int - filters map[int]*core.Filter -} - -func New(db ethutil.Database, clientIdentity wire.ClientIdentity, keyManager *crypto.KeyManager, caps Caps, usePnp bool) (*Ethereum, error) { - var err error - var nat NAT - - if usePnp { - nat, err = Discover() - if err != nil { - loggerger.Debugln("UPnP failed", err) - } - } - - bootstrapDb(db) - - ethutil.Config.Db = db - - nonce, _ := ethutil.RandomUint64() - ethereum := &Ethereum{ - shutdownChan: make(chan bool), - quit: make(chan bool), - db: db, - peers: list.New(), - Nonce: nonce, - serverCaps: caps, - nat: nat, - keyManager: keyManager, - clientIdentity: clientIdentity, - isUpToDate: true, - filters: make(map[int]*core.Filter), - } - - ethereum.blockPool = NewBlockPool(ethereum) - ethereum.txPool = core.NewTxPool(ethereum) - ethereum.blockChain = core.NewChainManager(ethereum.EventMux()) - ethereum.blockManager = core.NewBlockManager(ethereum) - ethereum.blockChain.SetProcessor(ethereum.blockManager) - - // Start the tx pool - ethereum.txPool.Start() - - return ethereum, nil -} - -func (s *Ethereum) KeyManager() *crypto.KeyManager { - return s.keyManager -} - -func (s *Ethereum) ClientIdentity() wire.ClientIdentity { - return s.clientIdentity -} - -func (s *Ethereum) ChainManager() *core.ChainManager { - return s.blockChain -} - -func (s *Ethereum) BlockManager() *core.BlockManager { - return s.blockManager -} - -func (s *Ethereum) TxPool() *core.TxPool { - return s.txPool -} -func (s *Ethereum) BlockPool() *BlockPool { - return s.blockPool -} -func (s *Ethereum) EventMux() *event.TypeMux { - return &s.eventMux -} -func (self *Ethereum) Db() ethutil.Database { - return self.db -} - -func (s *Ethereum) ServerCaps() Caps { - return s.serverCaps -} -func (s *Ethereum) IsMining() bool { - return s.Mining -} -func (s *Ethereum) PeerCount() int { - return s.peers.Len() -} -func (s *Ethereum) IsUpToDate() bool { - upToDate := true - eachPeer(s.peers, func(peer *Peer, e *list.Element) { - if atomic.LoadInt32(&peer.connected) == 1 { - if peer.catchingUp == true && peer.versionKnown { - upToDate = false - } - } - }) - return upToDate -} -func (s *Ethereum) PushPeer(peer *Peer) { - s.peers.PushBack(peer) -} -func (s *Ethereum) IsListening() bool { - return s.listening -} - -func (s *Ethereum) HighestTDPeer() (td *big.Int) { - td = big.NewInt(0) - - eachPeer(s.peers, func(p *Peer, v *list.Element) { - if p.td.Cmp(td) > 0 { - td = p.td - } - }) - - return -} - -func (self *Ethereum) BlacklistPeer(peer *Peer) { - self.blacklist = append(self.blacklist, peer.pubkey) -} - -func (s *Ethereum) AddPeer(conn net.Conn) { - peer := NewPeer(conn, s, true) - - if peer != nil { - if s.peers.Len() < s.MaxPeers { - peer.Start() - } else { - loggerger.Debugf("Max connected peers reached. Not adding incoming peer.") - } - } -} - -func (s *Ethereum) ProcessPeerList(addrs []string) { - for _, addr := range addrs { - // TODO Probably requires some sanity checks - s.ConnectToPeer(addr) - } -} - -func (s *Ethereum) ConnectToPeer(addr string) error { - if s.peers.Len() < s.MaxPeers { - var alreadyConnected bool - - ahost, aport, _ := net.SplitHostPort(addr) - var chost string - - ips, err := net.LookupIP(ahost) - - if err != nil { - return err - } else { - // If more then one ip is available try stripping away the ipv6 ones - if len(ips) > 1 { - var ipsv4 []net.IP - // For now remove the ipv6 addresses - for _, ip := range ips { - if strings.Contains(ip.String(), "::") { - continue - } else { - ipsv4 = append(ipsv4, ip) - } - } - if len(ipsv4) == 0 { - return fmt.Errorf("[SERV] No IPV4 addresses available for hostname") - } - - // Pick a random ipv4 address, simulating round-robin DNS. - rand.Seed(time.Now().UTC().UnixNano()) - i := rand.Intn(len(ipsv4)) - chost = ipsv4[i].String() - } else { - if len(ips) == 0 { - return fmt.Errorf("[SERV] No IPs resolved for the given hostname") - return nil - } - chost = ips[0].String() - } - } - - eachPeer(s.peers, func(p *Peer, v *list.Element) { - if p.conn == nil { - return - } - phost, pport, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) - - if phost == chost && pport == aport { - alreadyConnected = true - //loggerger.Debugf("Peer %s already added.\n", chost) - return - } - }) - - if alreadyConnected { - return nil - } - - NewOutboundPeer(addr, s, s.serverCaps) - } - - return nil -} - -func (s *Ethereum) OutboundPeers() []*Peer { - // Create a new peer slice with at least the length of the total peers - outboundPeers := make([]*Peer, s.peers.Len()) - length := 0 - eachPeer(s.peers, func(p *Peer, e *list.Element) { - if !p.inbound && p.conn != nil { - outboundPeers[length] = p - length++ - } - }) - - return outboundPeers[:length] -} - -func (s *Ethereum) InboundPeers() []*Peer { - // Create a new peer slice with at least the length of the total peers - inboundPeers := make([]*Peer, s.peers.Len()) - length := 0 - eachPeer(s.peers, func(p *Peer, e *list.Element) { - if p.inbound { - inboundPeers[length] = p - length++ - } - }) - - return inboundPeers[:length] -} - -func (s *Ethereum) InOutPeers() []*Peer { - // Reap the dead peers first - s.reapPeers() - - // Create a new peer slice with at least the length of the total peers - inboundPeers := make([]*Peer, s.peers.Len()) - length := 0 - eachPeer(s.peers, func(p *Peer, e *list.Element) { - // Only return peers with an actual ip - if len(p.host) > 0 { - inboundPeers[length] = p - length++ - } - }) - - return inboundPeers[:length] -} - -func (s *Ethereum) Broadcast(msgType wire.MsgType, data []interface{}) { - msg := wire.NewMessage(msgType, data) - s.BroadcastMsg(msg) -} - -func (s *Ethereum) BroadcastMsg(msg *wire.Msg) { - eachPeer(s.peers, func(p *Peer, e *list.Element) { - p.QueueMessage(msg) - }) -} - -func (s *Ethereum) Peers() *list.List { - return s.peers -} - -func (s *Ethereum) reapPeers() { - eachPeer(s.peers, func(p *Peer, e *list.Element) { - if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) { - s.removePeerElement(e) - } - }) -} - -func (s *Ethereum) removePeerElement(e *list.Element) { - s.peerMut.Lock() - defer s.peerMut.Unlock() - - s.peers.Remove(e) - - s.eventMux.Post(PeerListEvent{s.peers}) -} - -func (s *Ethereum) RemovePeer(p *Peer) { - eachPeer(s.peers, func(peer *Peer, e *list.Element) { - if peer == p { - s.removePeerElement(e) - } - }) -} - -func (s *Ethereum) reapDeadPeerHandler() { - reapTimer := time.NewTicker(processReapingTimeout * time.Second) - - for { - select { - case <-reapTimer.C: - s.reapPeers() - } - } -} - -// Start the ethereum -func (s *Ethereum) Start(seed bool) { - s.blockPool.Start() - s.blockManager.Start() - - // Bind to addr and port - ln, err := net.Listen("tcp", ":"+s.Port) - if err != nil { - loggerger.Warnf("Port %s in use. Connection listening disabled. Acting as client", s.Port) - s.listening = false - } else { - s.listening = true - // Starting accepting connections - loggerger.Infoln("Ready and accepting connections") - // Start the peer handler - go s.peerHandler(ln) - } - - if s.nat != nil { - go s.upnpUpdateThread() - } - - // Start the reaping processes - go s.reapDeadPeerHandler() - go s.update() - go s.filterLoop() - - if seed { - s.Seed() - } - s.ConnectToPeer("localhost:40404") - loggerger.Infoln("Server started") -} - -func (s *Ethereum) Seed() { - // Sorry Py person. I must blacklist. you perform badly - s.blacklist = append(s.blacklist, ethutil.Hex2Bytes("64656330303561383532336435376331616537643864663236623336313863373537353163636634333530626263396330346237336262623931383064393031")) - ips := PastPeers() - if len(ips) > 0 { - for _, ip := range ips { - loggerger.Infoln("Connecting to previous peer ", ip) - s.ConnectToPeer(ip) - } - } else { - loggerger.Debugln("Retrieving seed nodes") - - // Eth-Go Bootstrapping - ips, er := net.LookupIP("seed.bysh.me") - if er == nil { - peers := []string{} - for _, ip := range ips { - node := fmt.Sprintf("%s:%d", ip.String(), 30303) - loggerger.Debugln("Found DNS Go Peer:", node) - peers = append(peers, node) - } - s.ProcessPeerList(peers) - } - - // Official DNS Bootstrapping - _, nodes, err := net.LookupSRV("eth", "tcp", "ethereum.org") - if err == nil { - peers := []string{} - // Iterate SRV nodes - for _, n := range nodes { - target := n.Target - port := strconv.Itoa(int(n.Port)) - // Resolve target to ip (Go returns list, so may resolve to multiple ips?) - addr, err := net.LookupHost(target) - if err == nil { - for _, a := range addr { - // Build string out of SRV port and Resolved IP - peer := net.JoinHostPort(a, port) - loggerger.Debugln("Found DNS Bootstrap Peer:", peer) - peers = append(peers, peer) - } - } else { - loggerger.Debugln("Couldn't resolve :", target) - } - } - // Connect to Peer list - s.ProcessPeerList(peers) - } - - s.ConnectToPeer(seedNodeAddress) - } -} - -func (s *Ethereum) peerHandler(listener net.Listener) { - for { - conn, err := listener.Accept() - if err != nil { - loggerger.Debugln(err) - - continue - } - - go s.AddPeer(conn) - } -} - -func (s *Ethereum) Stop() { - // Stop eventMux first, it will close all subscriptions. - s.eventMux.Stop() - - // Close the database - defer s.db.Close() - - var ips []string - eachPeer(s.peers, func(p *Peer, e *list.Element) { - ips = append(ips, p.conn.RemoteAddr().String()) - }) - - if len(ips) > 0 { - d, _ := json.MarshalIndent(ips, "", " ") - ethutil.WriteFile(path.Join(ethutil.Config.ExecPath, "known_peers.json"), d) - } - - eachPeer(s.peers, func(p *Peer, e *list.Element) { - p.Stop() - }) - - close(s.quit) - - if s.RpcServer != nil { - s.RpcServer.Stop() - } - s.txPool.Stop() - s.blockManager.Stop() - s.blockPool.Stop() - - loggerger.Infoln("Server stopped") - close(s.shutdownChan) -} - -// This function will wait for a shutdown and resumes main thread execution -func (s *Ethereum) WaitForShutdown() { - <-s.shutdownChan -} - -func (s *Ethereum) upnpUpdateThread() { - // Go off immediately to prevent code duplication, thereafter we renew - // lease every 15 minutes. - timer := time.NewTimer(5 * time.Minute) - lport, _ := strconv.ParseInt(s.Port, 10, 16) - first := true -out: - for { - select { - case <-timer.C: - var err error - _, err = s.nat.AddPortMapping("TCP", int(lport), int(lport), "eth listen port", 20*60) - if err != nil { - loggerger.Debugln("can't add UPnP port mapping:", err) - break out - } - if first && err == nil { - _, err = s.nat.GetExternalAddress() - if err != nil { - loggerger.Debugln("UPnP can't get external address:", err) - continue out - } - first = false - } - timer.Reset(time.Minute * 15) - case <-s.quit: - break out - } - } - - timer.Stop() - - if err := s.nat.DeletePortMapping("TCP", int(lport), int(lport)); err != nil { - loggerger.Debugln("unable to remove UPnP port mapping:", err) - } else { - loggerger.Debugln("succesfully disestablished UPnP port mapping") - } -} - -func (self *Ethereum) update() { - upToDateTimer := time.NewTicker(1 * time.Second) - -out: - for { - select { - case <-upToDateTimer.C: - if self.IsUpToDate() && !self.isUpToDate { - self.eventMux.Post(ChainSyncEvent{false}) - self.isUpToDate = true - } else if !self.IsUpToDate() && self.isUpToDate { - self.eventMux.Post(ChainSyncEvent{true}) - self.isUpToDate = false - } - case <-self.quit: - break out - } - } -} - -// InstallFilter adds filter for blockchain events. -// The filter's callbacks will run for matching blocks and messages. -// The filter should not be modified after it has been installed. -func (self *Ethereum) InstallFilter(filter *core.Filter) (id int) { - self.filterMu.Lock() - id = self.filterId - self.filters[id] = filter - self.filterId++ - self.filterMu.Unlock() - return id -} - -func (self *Ethereum) UninstallFilter(id int) { - self.filterMu.Lock() - delete(self.filters, id) - self.filterMu.Unlock() -} - -// GetFilter retrieves a filter installed using InstallFilter. -// The filter may not be modified. -func (self *Ethereum) GetFilter(id int) *core.Filter { - self.filterMu.RLock() - defer self.filterMu.RUnlock() - return self.filters[id] -} - -func (self *Ethereum) filterLoop() { - // Subscribe to events - events := self.eventMux.Subscribe(core.NewBlockEvent{}, state.Messages(nil)) - for event := range events.Chan() { - switch event := event.(type) { - case core.NewBlockEvent: - self.filterMu.RLock() - for _, filter := range self.filters { - if filter.BlockCallback != nil { - filter.BlockCallback(event.Block) - } - } - self.filterMu.RUnlock() - - case state.Messages: - self.filterMu.RLock() - for _, filter := range self.filters { - if filter.MessageCallback != nil { - msgs := filter.FilterMessages(event) - if len(msgs) > 0 { - filter.MessageCallback(msgs) - } - } - } - self.filterMu.RUnlock() - } - } -} - -func bootstrapDb(db ethutil.Database) { - d, _ := db.Get([]byte("ProtocolVersion")) - protov := ethutil.NewValue(d).Uint() - - if protov == 0 { - db.Put([]byte("ProtocolVersion"), ethutil.NewValue(ProtocolVersion).Bytes()) - } -} - -func PastPeers() []string { - var ips []string - data, _ := ethutil.ReadAllFile(path.Join(ethutil.Config.ExecPath, "known_peers.json")) - json.Unmarshal([]byte(data), &ips) - - return ips -} diff --git a/event/filter/filter.go b/event/filter/filter.go new file mode 100644 index 000000000..9817d5782 --- /dev/null +++ b/event/filter/filter.go @@ -0,0 +1,70 @@ +package filter + +import "reflect" + +type Filter interface { + Compare(Filter) bool + Trigger(data interface{}) +} + +type FilterEvent struct { + filter Filter + data interface{} +} + +type Filters struct { + id int + watchers map[int]Filter + ch chan FilterEvent + + quit chan struct{} +} + +func New() *Filters { + return &Filters{ + ch: make(chan FilterEvent), + watchers: make(map[int]Filter), + quit: make(chan struct{}), + } +} + +func (self *Filters) Start() { + go self.loop() +} + +func (self *Filters) Stop() { + close(self.quit) +} + +func (self *Filters) Notify(filter Filter, data interface{}) { + self.ch <- FilterEvent{filter, data} +} + +func (self *Filters) Install(watcher Filter) int { + self.watchers[self.id] = watcher + self.id++ + + return self.id - 1 +} + +func (self *Filters) Uninstall(id int) { + delete(self.watchers, id) +} + +func (self *Filters) loop() { +out: + for { + select { + case <-self.quit: + break out + case event := <-self.ch: + for _, watcher := range self.watchers { + if reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) { + if watcher.Compare(event.filter) { + watcher.Trigger(event.data) + } + } + } + } + } +} diff --git a/event/filter/filter_test.go b/event/filter/filter_test.go new file mode 100644 index 000000000..815deb63a --- /dev/null +++ b/event/filter/filter_test.go @@ -0,0 +1,34 @@ +package filter + +import "testing" + +func TestFilters(t *testing.T) { + var success bool + var failure bool + + fm := New() + fm.Start() + fm.Install(Generic{ + Str1: "hello", + Fn: func(data interface{}) { + success = data.(bool) + }, + }) + fm.Install(Generic{ + Str1: "hello1", + Str2: "hello", + Fn: func(data interface{}) { + failure = true + }, + }) + fm.Notify(Generic{Str1: "hello"}, true) + fm.Stop() + + if !success { + t.Error("expected 'hello' to be posted") + } + + if failure { + t.Error("hello1 was triggered") + } +} diff --git a/event/filter/generic_filter.go b/event/filter/generic_filter.go new file mode 100644 index 000000000..b04b4801e --- /dev/null +++ b/event/filter/generic_filter.go @@ -0,0 +1,22 @@ +package filter + +type Generic struct { + Str1, Str2, Str3 string + + Fn func(data interface{}) +} + +func (self Generic) Compare(f Filter) bool { + filter := f.(Generic) + if (len(self.Str1) == 0 || filter.Str1 == self.Str1) && + (len(self.Str2) == 0 || filter.Str2 == self.Str2) && + (len(self.Str3) == 0 || filter.Str3 == self.Str3) { + return true + } + + return false +} + +func (self Generic) Trigger(data interface{}) { + self.Fn(data) +} diff --git a/events.go b/events.go deleted file mode 100644 index 5fff1d831..000000000 --- a/events.go +++ /dev/null @@ -1,11 +0,0 @@ -package eth - -import "container/list" - -type PeerListEvent struct { - Peers *list.List -} - -type ChainSyncEvent struct { - InSync bool -} diff --git a/javascript/javascript_runtime.go b/javascript/javascript_runtime.go index a5b929a34..169ed509e 100644 --- a/javascript/javascript_runtime.go +++ b/javascript/javascript_runtime.go @@ -7,10 +7,10 @@ import ( "path" "path/filepath" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" @@ -150,7 +150,7 @@ func (self *JSRE) dump(call otto.FunctionCall) otto.Value { state = block.State() } else { - state = self.ethereum.BlockManager().CurrentState() + state = self.ethereum.ChainManager().State() } v, _ := self.Vm.ToValue(state.Dump()) @@ -202,7 +202,7 @@ func (self *JSRE) addPeer(call otto.FunctionCall) otto.Value { if err != nil { return otto.FalseValue() } - self.ethereum.ConnectToPeer(host) + self.ethereum.SuggestPeer(host) return otto.TrueValue() } diff --git a/javascript/types.go b/javascript/types.go index d5acaecce..cf5a6677b 100644 --- a/javascript/types.go +++ b/javascript/types.go @@ -3,7 +3,7 @@ package javascript import ( "fmt" - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/state" "github.com/ethereum/go-ethereum/ui" diff --git a/miner/miner.go b/miner/miner.go index 4f677cbef..6ba3b1eba 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -27,14 +27,15 @@ import ( "math/big" "sort" - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/pow" + "github.com/ethereum/go-ethereum/pow/ezp" "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/wire" ) type LocalTx struct { @@ -59,7 +60,7 @@ type Miner struct { localTxs map[int]*LocalTx localTxId int - pow core.PoW + pow pow.PoW quitCh chan struct{} powQuitCh chan struct{} @@ -74,7 +75,7 @@ func New(coinbase []byte, eth *eth.Ethereum) *Miner { return &Miner{ eth: eth, powQuitCh: make(chan struct{}), - pow: &core.EasyPow{}, + pow: ezp.New(), mining: false, localTxs: make(map[int]*LocalTx), MinAcceptedGasPrice: big.NewInt(10000000000000), @@ -82,7 +83,7 @@ func New(coinbase []byte, eth *eth.Ethereum) *Miner { } } -func (self *Miner) GetPow() core.PoW { +func (self *Miner) GetPow() pow.PoW { return self.pow } @@ -215,7 +216,7 @@ func (self *Miner) mine() { if err != nil { minerlogger.Infoln(err) } else { - self.eth.Broadcast(wire.MsgBlockTy, []interface{}{block.Value().Val}) + self.eth.EventMux().Post(core.NewMinedBlockEvent{block}) minerlogger.Infof("🔨 Mined block %x\n", block.Hash()) minerlogger.Infoln(block) @@ -230,7 +231,7 @@ func (self *Miner) finiliseTxs() types.Transactions { actualSize := len(self.localTxs) // See copy below txs := make(types.Transactions, actualSize+self.eth.TxPool().Size()) - state := self.eth.BlockManager().TransState() + state := self.eth.ChainManager().TransState() // XXX This has to change. Coinbase is, for new, same as key. key := self.eth.KeyManager() for i, ltx := range self.localTxs { @@ -244,7 +245,7 @@ func (self *Miner) finiliseTxs() types.Transactions { } // Faster than append - for _, tx := range self.eth.TxPool().CurrentTransactions() { + for _, tx := range self.eth.TxPool().GetTransactions() { if tx.GasPrice.Cmp(self.MinAcceptedGasPrice) >= 0 { txs[actualSize] = tx actualSize++ diff --git a/nat.go b/nat.go deleted file mode 100644 index 999308eb2..000000000 --- a/nat.go +++ /dev/null @@ -1,12 +0,0 @@ -package eth - -import ( - "net" -) - -// protocol is either "udp" or "tcp" -type NAT interface { - GetExternalAddress() (addr net.IP, err error) - AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) - DeletePortMapping(protocol string, externalPort, internalPort int) (err error) -} diff --git a/natpmp.go b/natpmp.go deleted file mode 100644 index 489342a4b..000000000 --- a/natpmp.go +++ /dev/null @@ -1,55 +0,0 @@ -package eth - -import ( - "fmt" - "net" - - natpmp "github.com/jackpal/go-nat-pmp" -) - -// Adapt the NAT-PMP protocol to the NAT interface - -// TODO: -// + Register for changes to the external address. -// + Re-register port mapping when router reboots. -// + A mechanism for keeping a port mapping registered. - -type natPMPClient struct { - client *natpmp.Client -} - -func NewNatPMP(gateway net.IP) (nat NAT) { - return &natPMPClient{natpmp.NewClient(gateway)} -} - -func (n *natPMPClient) GetExternalAddress() (addr net.IP, err error) { - response, err := n.client.GetExternalAddress() - if err != nil { - return - } - ip := response.ExternalIPAddress - addr = net.IPv4(ip[0], ip[1], ip[2], ip[3]) - return -} - -func (n *natPMPClient) AddPortMapping(protocol string, externalPort, internalPort int, - description string, timeout int) (mappedExternalPort int, err error) { - if timeout <= 0 { - err = fmt.Errorf("timeout must not be <= 0") - return - } - // Note order of port arguments is switched between our AddPortMapping and the client's AddPortMapping. - response, err := n.client.AddPortMapping(protocol, internalPort, externalPort, timeout) - if err != nil { - return - } - mappedExternalPort = int(response.MappedExternalPort) - return -} - -func (n *natPMPClient) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { - // To destroy a mapping, send an add-port with - // an internalPort of the internal port to destroy, an external port of zero and a time of zero. - _, err = n.client.AddPortMapping(protocol, internalPort, 0, 0) - return -} diff --git a/natupnp.go b/natupnp.go deleted file mode 100644 index c7f9eeb62..000000000 --- a/natupnp.go +++ /dev/null @@ -1,338 +0,0 @@ -package eth - -// Just enough UPnP to be able to forward ports -// - -import ( - "bytes" - "encoding/xml" - "errors" - "net" - "net/http" - "os" - "strconv" - "strings" - "time" -) - -type upnpNAT struct { - serviceURL string - ourIP string -} - -func Discover() (nat NAT, err error) { - ssdp, err := net.ResolveUDPAddr("udp4", "239.255.255.250:1900") - if err != nil { - return - } - conn, err := net.ListenPacket("udp4", ":0") - if err != nil { - return - } - socket := conn.(*net.UDPConn) - defer socket.Close() - - err = socket.SetDeadline(time.Now().Add(10 * time.Second)) - if err != nil { - return - } - - st := "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n" - buf := bytes.NewBufferString( - "M-SEARCH * HTTP/1.1\r\n" + - "HOST: 239.255.255.250:1900\r\n" + - st + - "MAN: \"ssdp:discover\"\r\n" + - "MX: 2\r\n\r\n") - message := buf.Bytes() - answerBytes := make([]byte, 1024) - for i := 0; i < 3; i++ { - _, err = socket.WriteToUDP(message, ssdp) - if err != nil { - return - } - var n int - n, _, err = socket.ReadFromUDP(answerBytes) - if err != nil { - continue - // socket.Close() - // return - } - answer := string(answerBytes[0:n]) - if strings.Index(answer, "\r\n"+st) < 0 { - continue - } - // HTTP header field names are case-insensitive. - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 - locString := "\r\nlocation: " - answer = strings.ToLower(answer) - locIndex := strings.Index(answer, locString) - if locIndex < 0 { - continue - } - loc := answer[locIndex+len(locString):] - endIndex := strings.Index(loc, "\r\n") - if endIndex < 0 { - continue - } - locURL := loc[0:endIndex] - var serviceURL string - serviceURL, err = getServiceURL(locURL) - if err != nil { - return - } - var ourIP string - ourIP, err = getOurIP() - if err != nil { - return - } - nat = &upnpNAT{serviceURL: serviceURL, ourIP: ourIP} - return - } - err = errors.New("UPnP port discovery failed.") - return -} - -// service represents the Service type in an UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type service struct { - ServiceType string `xml:"serviceType"` - ControlURL string `xml:"controlURL"` -} - -// deviceList represents the deviceList type in an UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type deviceList struct { - XMLName xml.Name `xml:"deviceList"` - Device []device `xml:"device"` -} - -// serviceList represents the serviceList type in an UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type serviceList struct { - XMLName xml.Name `xml:"serviceList"` - Service []service `xml:"service"` -} - -// device represents the device type in an UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type device struct { - XMLName xml.Name `xml:"device"` - DeviceType string `xml:"deviceType"` - DeviceList deviceList `xml:"deviceList"` - ServiceList serviceList `xml:"serviceList"` -} - -// specVersion represents the specVersion in a UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type specVersion struct { - XMLName xml.Name `xml:"specVersion"` - Major int `xml:"major"` - Minor int `xml:"minor"` -} - -// root represents the Root document for a UPnP xml description. -// Only the parts we care about are present and thus the xml may have more -// fields than present in the structure. -type root struct { - XMLName xml.Name `xml:"root"` - SpecVersion specVersion - Device device -} - -func getChildDevice(d *device, deviceType string) *device { - dl := d.DeviceList.Device - for i := 0; i < len(dl); i++ { - if dl[i].DeviceType == deviceType { - return &dl[i] - } - } - return nil -} - -func getChildService(d *device, serviceType string) *service { - sl := d.ServiceList.Service - for i := 0; i < len(sl); i++ { - if sl[i].ServiceType == serviceType { - return &sl[i] - } - } - return nil -} - -func getOurIP() (ip string, err error) { - hostname, err := os.Hostname() - if err != nil { - return - } - p, err := net.LookupIP(hostname) - if err != nil && len(p) > 0 { - return - } - return p[0].String(), nil -} - -func getServiceURL(rootURL string) (url string, err error) { - r, err := http.Get(rootURL) - if err != nil { - return - } - defer r.Body.Close() - if r.StatusCode >= 400 { - err = errors.New(string(r.StatusCode)) - return - } - var root root - err = xml.NewDecoder(r.Body).Decode(&root) - - if err != nil { - return - } - a := &root.Device - if a.DeviceType != "urn:schemas-upnp-org:device:InternetGatewayDevice:1" { - err = errors.New("No InternetGatewayDevice") - return - } - b := getChildDevice(a, "urn:schemas-upnp-org:device:WANDevice:1") - if b == nil { - err = errors.New("No WANDevice") - return - } - c := getChildDevice(b, "urn:schemas-upnp-org:device:WANConnectionDevice:1") - if c == nil { - err = errors.New("No WANConnectionDevice") - return - } - d := getChildService(c, "urn:schemas-upnp-org:service:WANIPConnection:1") - if d == nil { - err = errors.New("No WANIPConnection") - return - } - url = combineURL(rootURL, d.ControlURL) - return -} - -func combineURL(rootURL, subURL string) string { - protocolEnd := "://" - protoEndIndex := strings.Index(rootURL, protocolEnd) - a := rootURL[protoEndIndex+len(protocolEnd):] - rootIndex := strings.Index(a, "/") - return rootURL[0:protoEndIndex+len(protocolEnd)+rootIndex] + subURL -} - -func soapRequest(url, function, message string) (r *http.Response, err error) { - fullMessage := "<?xml version=\"1.0\" ?>" + - "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n" + - "<s:Body>" + message + "</s:Body></s:Envelope>" - - req, err := http.NewRequest("POST", url, strings.NewReader(fullMessage)) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "text/xml ; charset=\"utf-8\"") - req.Header.Set("User-Agent", "Darwin/10.0.0, UPnP/1.0, MiniUPnPc/1.3") - //req.Header.Set("Transfer-Encoding", "chunked") - req.Header.Set("SOAPAction", "\"urn:schemas-upnp-org:service:WANIPConnection:1#"+function+"\"") - req.Header.Set("Connection", "Close") - req.Header.Set("Cache-Control", "no-cache") - req.Header.Set("Pragma", "no-cache") - - // log.Stderr("soapRequest ", req) - //fmt.Println(fullMessage) - - r, err = http.DefaultClient.Do(req) - if err != nil { - return - } - - if r.Body != nil { - defer r.Body.Close() - } - - if r.StatusCode >= 400 { - // log.Stderr(function, r.StatusCode) - err = errors.New("Error " + strconv.Itoa(r.StatusCode) + " for " + function) - r = nil - return - } - return -} - -type statusInfo struct { - externalIpAddress string -} - -func (n *upnpNAT) getStatusInfo() (info statusInfo, err error) { - - message := "<u:GetStatusInfo xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + - "</u:GetStatusInfo>" - - var response *http.Response - response, err = soapRequest(n.serviceURL, "GetStatusInfo", message) - if err != nil { - return - } - - // TODO: Write a soap reply parser. It has to eat the Body and envelope tags... - - response.Body.Close() - return -} - -func (n *upnpNAT) GetExternalAddress() (addr net.IP, err error) { - info, err := n.getStatusInfo() - if err != nil { - return - } - addr = net.ParseIP(info.externalIpAddress) - return -} - -func (n *upnpNAT) AddPortMapping(protocol string, externalPort, internalPort int, description string, timeout int) (mappedExternalPort int, err error) { - // A single concatenation would break ARM compilation. - message := "<u:AddPortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + - "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) - message += "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" - message += "<NewInternalPort>" + strconv.Itoa(internalPort) + "</NewInternalPort>" + - "<NewInternalClient>" + n.ourIP + "</NewInternalClient>" + - "<NewEnabled>1</NewEnabled><NewPortMappingDescription>" - message += description + - "</NewPortMappingDescription><NewLeaseDuration>" + strconv.Itoa(timeout) + - "</NewLeaseDuration></u:AddPortMapping>" - - var response *http.Response - response, err = soapRequest(n.serviceURL, "AddPortMapping", message) - if err != nil { - return - } - - // TODO: check response to see if the port was forwarded - // log.Println(message, response) - mappedExternalPort = externalPort - _ = response - return -} - -func (n *upnpNAT) DeletePortMapping(protocol string, externalPort, internalPort int) (err error) { - - message := "<u:DeletePortMapping xmlns:u=\"urn:schemas-upnp-org:service:WANIPConnection:1\">\r\n" + - "<NewRemoteHost></NewRemoteHost><NewExternalPort>" + strconv.Itoa(externalPort) + - "</NewExternalPort><NewProtocol>" + protocol + "</NewProtocol>" + - "</u:DeletePortMapping>" - - var response *http.Response - response, err = soapRequest(n.serviceURL, "DeletePortMapping", message) - if err != nil { - return - } - - // TODO: check response to see if the port was deleted - // log.Println(message, response) - _ = response - return -} diff --git a/peer.go b/peer.go deleted file mode 100644 index 331e9de37..000000000 --- a/peer.go +++ /dev/null @@ -1,881 +0,0 @@ -package eth - -import ( - "bytes" - "container/list" - "fmt" - "math" - "math/big" - "net" - "strconv" - "strings" - "sync/atomic" - "time" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethutil" - "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/wire" -) - -var peerlogger = logger.NewLogger("PEER") - -const ( - // The size of the output buffer for writing messages - outputBufferSize = 50 - // Current protocol version - ProtocolVersion = 49 - // Current P2P version - P2PVersion = 2 - // Ethereum network version - NetVersion = 0 - // Interval for ping/pong message - pingPongTimer = 2 * time.Second -) - -type DiscReason byte - -const ( - // Values are given explicitly instead of by iota because these values are - // defined by the wire protocol spec; it is easier for humans to ensure - // correctness when values are explicit. - DiscRequested DiscReason = iota - DiscReTcpSysErr - DiscBadProto - DiscBadPeer - DiscTooManyPeers - DiscConnDup - DiscGenesisErr - DiscProtoErr - DiscQuitting -) - -var discReasonToString = []string{ - "requested", - "TCP sys error", - "bad protocol", - "useless peer", - "too many peers", - "already connected", - "wrong genesis block", - "incompatible network", - "quitting", -} - -func (d DiscReason) String() string { - if len(discReasonToString) < int(d) { - return "Unknown" - } - - return discReasonToString[d] -} - -// Peer capabilities -type Caps byte - -const ( - CapPeerDiscTy Caps = 1 << iota - CapTxTy - CapChainTy - - CapDefault = CapChainTy | CapTxTy | CapPeerDiscTy -) - -var capsToString = map[Caps]string{ - CapPeerDiscTy: "Peer discovery", - CapTxTy: "Transaction relaying", - CapChainTy: "Block chain relaying", -} - -func (c Caps) IsCap(cap Caps) bool { - return c&cap > 0 -} - -func (c Caps) String() string { - var caps []string - if c.IsCap(CapPeerDiscTy) { - caps = append(caps, capsToString[CapPeerDiscTy]) - } - if c.IsCap(CapChainTy) { - caps = append(caps, capsToString[CapChainTy]) - } - if c.IsCap(CapTxTy) { - caps = append(caps, capsToString[CapTxTy]) - } - - return strings.Join(caps, " | ") -} - -type Peer struct { - // Ethereum interface - ethereum *Ethereum - // Net connection - conn net.Conn - // Output queue which is used to communicate and handle messages - outputQueue chan *wire.Msg - // Quit channel - quit chan bool - // Determines whether it's an inbound or outbound peer - inbound bool - // Flag for checking the peer's connectivity state - connected int32 - disconnect int32 - // Last known message send - lastSend time.Time - // Indicated whether a verack has been send or not - // This flag is used by writeMessage to check if messages are allowed - // to be send or not. If no version is known all messages are ignored. - versionKnown bool - statusKnown bool - - // Last received pong message - lastPong int64 - lastBlockReceived time.Time - doneFetchingHashes bool - lastHashAt time.Time - lastHashRequestedAt time.Time - - host []byte - port uint16 - caps Caps - td *big.Int - bestHash []byte - lastReceivedHash []byte - requestedHashes [][]byte - - // This peer's public key - pubkey []byte - - // Indicated whether the node is catching up or not - catchingUp bool - diverted bool - blocksRequested int - - version string - - // We use this to give some kind of pingtime to a node, not very accurate, could be improved. - pingTime time.Duration - pingStartTime time.Time - - lastRequestedBlock *types.Block - - protocolCaps *ethutil.Value -} - -func NewPeer(conn net.Conn, ethereum *Ethereum, inbound bool) *Peer { - pubkey := ethereum.KeyManager().PublicKey()[1:] - - return &Peer{ - outputQueue: make(chan *wire.Msg, outputBufferSize), - quit: make(chan bool), - ethereum: ethereum, - conn: conn, - inbound: inbound, - disconnect: 0, - connected: 1, - port: 30303, - pubkey: pubkey, - blocksRequested: 10, - caps: ethereum.ServerCaps(), - version: ethereum.ClientIdentity().String(), - protocolCaps: ethutil.NewValue(nil), - td: big.NewInt(0), - doneFetchingHashes: true, - } -} - -func NewOutboundPeer(addr string, ethereum *Ethereum, caps Caps) *Peer { - p := &Peer{ - outputQueue: make(chan *wire.Msg, outputBufferSize), - quit: make(chan bool), - ethereum: ethereum, - inbound: false, - connected: 0, - disconnect: 0, - port: 30303, - caps: caps, - version: ethereum.ClientIdentity().String(), - protocolCaps: ethutil.NewValue(nil), - td: big.NewInt(0), - doneFetchingHashes: true, - } - - // Set up the connection in another goroutine so we don't block the main thread - go func() { - conn, err := p.Connect(addr) - if err != nil { - //peerlogger.Debugln("Connection to peer failed. Giving up.", err) - p.Stop() - return - } - p.conn = conn - - // Atomically set the connection state - atomic.StoreInt32(&p.connected, 1) - atomic.StoreInt32(&p.disconnect, 0) - - p.Start() - }() - - return p -} - -func (self *Peer) Connect(addr string) (conn net.Conn, err error) { - const maxTries = 3 - for attempts := 0; attempts < maxTries; attempts++ { - conn, err = net.DialTimeout("tcp", addr, 10*time.Second) - if err != nil { - time.Sleep(time.Duration(attempts*20) * time.Second) - continue - } - - // Success - return - } - - return -} - -// Getters -func (p *Peer) PingTime() string { - return p.pingTime.String() -} -func (p *Peer) Inbound() bool { - return p.inbound -} -func (p *Peer) LastSend() time.Time { - return p.lastSend -} -func (p *Peer) LastPong() int64 { - return p.lastPong -} -func (p *Peer) Host() []byte { - return p.host -} -func (p *Peer) Port() uint16 { - return p.port -} -func (p *Peer) Version() string { - return p.version -} -func (p *Peer) Connected() *int32 { - return &p.connected -} - -// Setters -func (p *Peer) SetVersion(version string) { - p.version = version -} - -// Outputs any RLP encoded data to the peer -func (p *Peer) QueueMessage(msg *wire.Msg) { - if atomic.LoadInt32(&p.connected) != 1 { - return - } - p.outputQueue <- msg -} - -func (p *Peer) writeMessage(msg *wire.Msg) { - // Ignore the write if we're not connected - if atomic.LoadInt32(&p.connected) != 1 { - return - } - - if !p.versionKnown { - switch msg.Type { - case wire.MsgHandshakeTy: // Ok - default: // Anything but ack is allowed - return - } - } else { - /* - if !p.statusKnown { - switch msg.Type { - case wire.MsgStatusTy: // Ok - default: // Anything but ack is allowed - return - } - } - */ - } - - peerlogger.DebugDetailf("(%v) <= %v\n", p.conn.RemoteAddr(), formatMessage(msg)) - - err := wire.WriteMessage(p.conn, msg) - if err != nil { - peerlogger.Debugln(" Can't send message:", err) - // Stop the client if there was an error writing to it - p.Stop() - return - } -} - -// Outbound message handler. Outbound messages are handled here -func (p *Peer) HandleOutbound() { - // The ping timer. Makes sure that every 2 minutes a ping is send to the peer - pingTimer := time.NewTicker(pingPongTimer) - serviceTimer := time.NewTicker(10 * time.Second) - -out: - for { - skip: - select { - // Main message queue. All outbound messages are processed through here - case msg := <-p.outputQueue: - if !p.statusKnown { - switch msg.Type { - case wire.MsgTxTy, wire.MsgGetBlockHashesTy, wire.MsgBlockHashesTy, wire.MsgGetBlocksTy, wire.MsgBlockTy: - break skip - } - } - - switch msg.Type { - case wire.MsgGetBlockHashesTy: - p.lastHashRequestedAt = time.Now() - } - - p.writeMessage(msg) - p.lastSend = time.Now() - - // Ping timer - case <-pingTimer.C: - p.writeMessage(wire.NewMessage(wire.MsgPingTy, "")) - p.pingStartTime = time.Now() - - // Service timer takes care of peer broadcasting, transaction - // posting or block posting - case <-serviceTimer.C: - p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, "")) - - case <-p.quit: - // Break out of the for loop if a quit message is posted - break out - } - } - -clean: - // This loop is for draining the output queue and anybody waiting for us - for { - select { - case <-p.outputQueue: - // TODO - default: - break clean - } - } -} - -func formatMessage(msg *wire.Msg) (ret string) { - ret = fmt.Sprintf("%v %v", msg.Type, msg.Data) - - /* - XXX Commented out because I need the log level here to determine - if i should or shouldn't generate this message - */ - /* - switch msg.Type { - case wire.MsgPeersTy: - ret += fmt.Sprintf("(%d entries)", msg.Data.Len()) - case wire.MsgBlockTy: - b1, b2 := chain.NewBlockFromRlpValue(msg.Data.Get(0)), ethchain.NewBlockFromRlpValue(msg.Data.Get(msg.Data.Len()-1)) - ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), b1.Hash()[0:4], b2.Hash()[0:4]) - case wire.MsgBlockHashesTy: - h1, h2 := msg.Data.Get(0).Bytes(), msg.Data.Get(msg.Data.Len()-1).Bytes() - ret += fmt.Sprintf("(%d entries) %x - %x", msg.Data.Len(), h1, h2) - } - */ - - return -} - -// Inbound handler. Inbound messages are received here and passed to the appropriate methods -func (p *Peer) HandleInbound() { - for atomic.LoadInt32(&p.disconnect) == 0 { - - // HMM? - time.Sleep(50 * time.Millisecond) - // Wait for a message from the peer - msgs, err := wire.ReadMessages(p.conn) - if err != nil { - peerlogger.Debugln(err) - } - for _, msg := range msgs { - peerlogger.DebugDetailf("(%v) => %v\n", p.conn.RemoteAddr(), formatMessage(msg)) - - switch msg.Type { - case wire.MsgHandshakeTy: - // Version message - p.handleHandshake(msg) - - //if p.caps.IsCap(CapPeerDiscTy) { - p.QueueMessage(wire.NewMessage(wire.MsgGetPeersTy, "")) - //} - - case wire.MsgDiscTy: - p.Stop() - peerlogger.Infoln("Disconnect peer: ", DiscReason(msg.Data.Get(0).Uint())) - case wire.MsgPingTy: - // Respond back with pong - p.QueueMessage(wire.NewMessage(wire.MsgPongTy, "")) - case wire.MsgPongTy: - // If we received a pong back from a peer we set the - // last pong so the peer handler knows this peer is still - // active. - p.lastPong = time.Now().Unix() - p.pingTime = time.Since(p.pingStartTime) - case wire.MsgTxTy: - // If the message was a transaction queue the transaction - // in the TxPool where it will undergo validation and - // processing when a new block is found - for i := 0; i < msg.Data.Len(); i++ { - tx := types.NewTransactionFromValue(msg.Data.Get(i)) - err := p.ethereum.TxPool().Add(tx) - if err != nil { - peerlogger.Infoln(err) - } else { - peerlogger.Infof("tx OK (%x)\n", tx.Hash()[0:4]) - } - } - case wire.MsgGetPeersTy: - // Peer asked for list of connected peers - //p.pushPeers() - case wire.MsgPeersTy: - // Received a list of peers (probably because MsgGetPeersTy was send) - data := msg.Data - // Create new list of possible peers for the ethereum to process - peers := make([]string, data.Len()) - // Parse each possible peer - for i := 0; i < data.Len(); i++ { - value := data.Get(i) - peers[i] = unpackAddr(value.Get(0), value.Get(1).Uint()) - } - - // Connect to the list of peers - p.ethereum.ProcessPeerList(peers) - - case wire.MsgStatusTy: - // Handle peer's status msg - p.handleStatus(msg) - } - - // TMP - if p.statusKnown { - switch msg.Type { - - case wire.MsgGetBlockHashesTy: - if msg.Data.Len() < 2 { - peerlogger.Debugln("err: argument length invalid ", msg.Data.Len()) - } - - hash := msg.Data.Get(0).Bytes() - amount := msg.Data.Get(1).Uint() - - hashes := p.ethereum.ChainManager().GetChainHashesFromHash(hash, amount) - - p.QueueMessage(wire.NewMessage(wire.MsgBlockHashesTy, ethutil.ByteSliceToInterface(hashes))) - - case wire.MsgGetBlocksTy: - // Limit to max 300 blocks - max := int(math.Min(float64(msg.Data.Len()), 300.0)) - var blocks []interface{} - - for i := 0; i < max; i++ { - hash := msg.Data.Get(i).Bytes() - block := p.ethereum.ChainManager().GetBlock(hash) - if block != nil { - blocks = append(blocks, block.Value().Raw()) - } - } - - p.QueueMessage(wire.NewMessage(wire.MsgBlockTy, blocks)) - - case wire.MsgBlockHashesTy: - p.catchingUp = true - - blockPool := p.ethereum.blockPool - - foundCommonHash := false - p.lastHashAt = time.Now() - - it := msg.Data.NewIterator() - for it.Next() { - hash := it.Value().Bytes() - p.lastReceivedHash = hash - - if blockPool.HasCommonHash(hash) { - foundCommonHash = true - - break - } - - blockPool.AddHash(hash, p) - } - - if !foundCommonHash { - p.FetchHashes() - } else { - peerlogger.Infof("Found common hash (%x...)\n", p.lastReceivedHash[0:4]) - p.doneFetchingHashes = true - } - - case wire.MsgBlockTy: - p.catchingUp = true - - blockPool := p.ethereum.blockPool - - it := msg.Data.NewIterator() - for it.Next() { - block := types.NewBlockFromRlpValue(it.Value()) - blockPool.Add(block, p) - - p.lastBlockReceived = time.Now() - } - case wire.MsgNewBlockTy: - var ( - blockPool = p.ethereum.blockPool - block = types.NewBlockFromRlpValue(msg.Data.Get(0)) - td = msg.Data.Get(1).BigInt() - ) - - if td.Cmp(blockPool.td) > 0 { - p.ethereum.blockPool.AddNew(block, p) - } - } - - } - } - } - - p.Stop() -} - -func (self *Peer) FetchBlocks(hashes [][]byte) { - if len(hashes) > 0 { - peerlogger.Debugf("Fetching blocks (%d)\n", len(hashes)) - - self.QueueMessage(wire.NewMessage(wire.MsgGetBlocksTy, ethutil.ByteSliceToInterface(hashes))) - } -} - -func (self *Peer) FetchHashes() bool { - blockPool := self.ethereum.blockPool - - return blockPool.FetchHashes(self) -} - -func (self *Peer) FetchingHashes() bool { - return !self.doneFetchingHashes -} - -// General update method -func (self *Peer) update() { - serviceTimer := time.NewTicker(100 * time.Millisecond) - -out: - for { - select { - case <-serviceTimer.C: - if self.IsCap("eth") { - var ( - sinceBlock = time.Since(self.lastBlockReceived) - ) - - if sinceBlock > 5*time.Second { - self.catchingUp = false - } - } - case <-self.quit: - break out - } - } - - serviceTimer.Stop() -} - -func (p *Peer) Start() { - peerHost, peerPort, _ := net.SplitHostPort(p.conn.LocalAddr().String()) - servHost, servPort, _ := net.SplitHostPort(p.conn.RemoteAddr().String()) - - if p.inbound { - p.host, p.port = packAddr(peerHost, peerPort) - } else { - p.host, p.port = packAddr(servHost, servPort) - } - - err := p.pushHandshake() - if err != nil { - peerlogger.Debugln("Peer can't send outbound version ack", err) - - p.Stop() - - return - } - - go p.HandleOutbound() - // Run the inbound handler in a new goroutine - go p.HandleInbound() - // Run the general update handler - go p.update() - - // Wait a few seconds for startup and then ask for an initial ping - time.Sleep(2 * time.Second) - p.writeMessage(wire.NewMessage(wire.MsgPingTy, "")) - p.pingStartTime = time.Now() - -} - -func (p *Peer) Stop() { - p.StopWithReason(DiscRequested) -} - -func (p *Peer) StopWithReason(reason DiscReason) { - if atomic.AddInt32(&p.disconnect, 1) != 1 { - return - } - - // Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here - p.ethereum.RemovePeer(p) - - close(p.quit) - if atomic.LoadInt32(&p.connected) != 0 { - p.writeMessage(wire.NewMessage(wire.MsgDiscTy, reason)) - p.conn.Close() - } -} - -func (p *Peer) peersMessage() *wire.Msg { - outPeers := make([]interface{}, len(p.ethereum.InOutPeers())) - // Serialise each peer - for i, peer := range p.ethereum.InOutPeers() { - // Don't return localhost as valid peer - if !net.ParseIP(peer.conn.RemoteAddr().String()).IsLoopback() { - outPeers[i] = peer.RlpData() - } - } - - // Return the message to the peer with the known list of connected clients - return wire.NewMessage(wire.MsgPeersTy, outPeers) -} - -// Pushes the list of outbound peers to the client when requested -func (p *Peer) pushPeers() { - p.QueueMessage(p.peersMessage()) -} - -func (self *Peer) pushStatus() { - msg := wire.NewMessage(wire.MsgStatusTy, []interface{}{ - uint32(ProtocolVersion), - uint32(NetVersion), - self.ethereum.ChainManager().TD, - self.ethereum.ChainManager().CurrentBlock.Hash(), - self.ethereum.ChainManager().Genesis().Hash(), - }) - - self.QueueMessage(msg) -} - -func (self *Peer) handleStatus(msg *wire.Msg) { - c := msg.Data - - var ( - //protoVersion = c.Get(0).Uint() - netVersion = c.Get(1).Uint() - td = c.Get(2).BigInt() - bestHash = c.Get(3).Bytes() - genesis = c.Get(4).Bytes() - ) - - if bytes.Compare(self.ethereum.ChainManager().Genesis().Hash(), genesis) != 0 { - loggerger.Warnf("Invalid genisis hash %x. Disabling [eth]\n", genesis) - return - } - - if netVersion != NetVersion { - loggerger.Warnf("Invalid network version %d. Disabling [eth]\n", netVersion) - return - } - - /* - if protoVersion != ProtocolVersion { - loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", protoVersion) - return - } - */ - - // Get the td and last hash - self.td = td - self.bestHash = bestHash - self.lastReceivedHash = bestHash - - self.statusKnown = true - - // Compare the total TD with the blockchain TD. If remote is higher - // fetch hashes from highest TD node. - self.FetchHashes() - - loggerger.Infof("Peer is [eth] capable. (TD = %v ~ %x)", self.td, self.bestHash) - -} - -func (p *Peer) pushHandshake() error { - pubkey := p.ethereum.KeyManager().PublicKey() - msg := wire.NewMessage(wire.MsgHandshakeTy, []interface{}{ - P2PVersion, []byte(p.version), []interface{}{[]interface{}{"eth", ProtocolVersion}}, p.port, pubkey[1:], - }) - - p.QueueMessage(msg) - - return nil -} - -func (p *Peer) handleHandshake(msg *wire.Msg) { - c := msg.Data - - var ( - p2pVersion = c.Get(0).Uint() - clientId = c.Get(1).Str() - caps = c.Get(2) - port = c.Get(3).Uint() - pub = c.Get(4).Bytes() - ) - - // Check correctness of p2p protocol version - if p2pVersion != P2PVersion { - peerlogger.Debugf("Invalid P2P version. Require protocol %d, received %d\n", P2PVersion, p2pVersion) - p.Stop() - return - } - - // Handle the pub key (validation, uniqueness) - if len(pub) == 0 { - peerlogger.Warnln("Pubkey required, not supplied in handshake.") - p.Stop() - return - } - - // Self connect detection - pubkey := p.ethereum.KeyManager().PublicKey() - if bytes.Compare(pubkey[1:], pub) == 0 { - p.Stop() - - return - } - - // Check for blacklisting - for _, pk := range p.ethereum.blacklist { - if bytes.Compare(pk, pub) == 0 { - peerlogger.Debugf("Blacklisted peer tried to connect (%x...)\n", pubkey[0:4]) - p.StopWithReason(DiscBadPeer) - - return - } - } - - usedPub := 0 - // This peer is already added to the peerlist so we expect to find a double pubkey at least once - eachPeer(p.ethereum.Peers(), func(peer *Peer, e *list.Element) { - if bytes.Compare(pub, peer.pubkey) == 0 { - usedPub++ - } - }) - - if usedPub > 0 { - peerlogger.Debugf("Pubkey %x found more then once. Already connected to client.", p.pubkey) - p.Stop() - return - } - p.pubkey = pub - - // If this is an inbound connection send an ack back - if p.inbound { - p.port = uint16(port) - } - - p.SetVersion(clientId) - - p.versionKnown = true - - p.ethereum.PushPeer(p) - p.ethereum.eventMux.Post(PeerListEvent{p.ethereum.Peers()}) - - p.protocolCaps = caps - - it := caps.NewIterator() - var capsStrs []string - for it.Next() { - cap := it.Value().Get(0).Str() - ver := it.Value().Get(1).Uint() - switch cap { - case "eth": - if ver != ProtocolVersion { - loggerger.Warnf("Invalid protocol version %d. Disabling [eth]\n", ver) - continue - } - p.pushStatus() - } - - capsStrs = append(capsStrs, fmt.Sprintf("%s/%d", cap, ver)) - } - - peerlogger.Infof("Added peer (%s) %d / %d (%v)\n", p.conn.RemoteAddr(), p.ethereum.Peers().Len(), p.ethereum.MaxPeers, capsStrs) - - peerlogger.Debugln(p) -} - -func (self *Peer) IsCap(cap string) bool { - capsIt := self.protocolCaps.NewIterator() - for capsIt.Next() { - if capsIt.Value().Str() == cap { - return true - } - } - - return false -} - -func (self *Peer) Caps() *ethutil.Value { - return self.protocolCaps -} - -func (p *Peer) String() string { - var strBoundType string - if p.inbound { - strBoundType = "inbound" - } else { - strBoundType = "outbound" - } - var strConnectType string - if atomic.LoadInt32(&p.disconnect) == 0 { - strConnectType = "connected" - } else { - strConnectType = "disconnected" - } - - return fmt.Sprintf("[%s] (%s) %v %s", strConnectType, strBoundType, p.conn.RemoteAddr(), p.version) - -} - -func (p *Peer) RlpData() []interface{} { - return []interface{}{p.host, p.port, p.pubkey} -} - -func packAddr(address, _port string) (host []byte, port uint16) { - p, _ := strconv.Atoi(_port) - port = uint16(p) - - h := net.ParseIP(address) - if ip := h.To4(); ip != nil { - host = []byte(ip) - } else { - host = []byte(h) - } - - return -} - -func unpackAddr(value *ethutil.Value, p uint64) string { - host, _ := net.IP(value.Bytes()).MarshalText() - prt := strconv.Itoa(int(p)) - - return net.JoinHostPort(string(host), prt) -} diff --git a/pow/block.go b/pow/block.go new file mode 100644 index 000000000..4759e19fb --- /dev/null +++ b/pow/block.go @@ -0,0 +1,9 @@ +package pow + +import "math/big" + +type Block interface { + Diff() *big.Int + HashNoNonce() []byte + N() []byte +} diff --git a/pow/ezp/pow.go b/pow/ezp/pow.go new file mode 100644 index 000000000..cdf89950f --- /dev/null +++ b/pow/ezp/pow.go @@ -0,0 +1,89 @@ +package ezp + +import ( + "math/big" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/pow" + "github.com/obscuren/sha3" +) + +var powlogger = logger.NewLogger("POW") + +type EasyPow struct { + hash *big.Int + HashRate int64 + turbo bool +} + +func New() *EasyPow { + return &EasyPow{} +} + +func (pow *EasyPow) GetHashrate() int64 { + return pow.HashRate +} + +func (pow *EasyPow) Turbo(on bool) { + pow.turbo = on +} + +func (pow *EasyPow) Search(block pow.Block, stop <-chan struct{}) []byte { + r := rand.New(rand.NewSource(time.Now().UnixNano())) + hash := block.HashNoNonce() + diff := block.Diff() + i := int64(0) + start := time.Now().UnixNano() + t := time.Now() + + for { + select { + case <-stop: + powlogger.Infoln("Breaking from mining") + pow.HashRate = 0 + return nil + default: + i++ + + if time.Since(t) > (1 * time.Second) { + elapsed := time.Now().UnixNano() - start + hashes := ((float64(1e9) / float64(elapsed)) * float64(i)) / 1000 + pow.HashRate = int64(hashes) + powlogger.Infoln("Hashing @", pow.HashRate, "khash") + + t = time.Now() + } + + sha := crypto.Sha3(big.NewInt(r.Int63()).Bytes()) + if pow.verify(hash, diff, sha) { + return sha + } + } + + if !pow.turbo { + time.Sleep(20 * time.Microsecond) + } + } + + return nil +} + +func (pow *EasyPow) verify(hash []byte, diff *big.Int, nonce []byte) bool { + sha := sha3.NewKeccak256() + + d := append(hash, nonce...) + sha.Write(d) + + verification := new(big.Int).Div(ethutil.BigPow(2, 256), diff) + res := ethutil.U256(ethutil.BigD(sha.Sum(nil))) + + return res.Cmp(verification) <= 0 +} + +func (pow *EasyPow) Verify(block pow.Block) bool { + return pow.verify(block.HashNoNonce(), block.Diff(), block.N()) +} diff --git a/pow/pow.go b/pow/pow.go new file mode 100644 index 000000000..c94ee40ba --- /dev/null +++ b/pow/pow.go @@ -0,0 +1,8 @@ +package pow + +type PoW interface { + Search(block Block, stop <-chan struct{}) []byte + Verify(block Block) bool + GetHashrate() int64 + Turbo(bool) +} diff --git a/tests/files/StateTests/stPreCompiledContracts.json b/tests/files/StateTests/stPreCompiledContracts.json index 5830ecafc..0f1db1275 100644 --- a/tests/files/StateTests/stPreCompiledContracts.json +++ b/tests/files/StateTests/stPreCompiledContracts.json @@ -726,14 +726,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1232", + "balance" : "1182", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898768", + "balance" : "999999999999898818", "code" : "0x", "nonce" : "1", "storage" : { @@ -796,14 +796,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1236", + "balance" : "1286", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898764", + "balance" : "999999999999898714", "code" : "0x", "nonce" : "1", "storage" : { @@ -866,14 +866,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1236", + "balance" : "1286", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898764", + "balance" : "999999999999898714", "code" : "0x", "nonce" : "1", "storage" : { @@ -1070,19 +1070,18 @@ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060036101f4f1600255600051600055", "nonce" : "0", "storage" : { - "0x" : "0x953450193f7389363135b31dc0f371f22f3947db", - "0x02" : "0x01" + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "32484", + "balance" : "32684", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999867516", + "balance" : "999999999999867316", "code" : "0x", "nonce" : "1", "storage" : { @@ -1214,14 +1213,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1232", + "balance" : "1182", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898768", + "balance" : "999999999999898818", "code" : "0x", "nonce" : "1", "storage" : { @@ -1284,14 +1283,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1232", + "balance" : "1182", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898768", + "balance" : "999999999999898818", "code" : "0x", "nonce" : "1", "storage" : { @@ -1354,14 +1353,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1236", + "balance" : "1286", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898764", + "balance" : "999999999999898714", "code" : "0x", "nonce" : "1", "storage" : { @@ -1424,14 +1423,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "1236", + "balance" : "1286", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999898764", + "balance" : "999999999999898714", "code" : "0x", "nonce" : "1", "storage" : { @@ -1628,19 +1627,18 @@ "code" : "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60005260206000620f42406000600060026101f4f1600255600051600055", "nonce" : "0", "storage" : { - "0x" : "0x739d5000bbe364e92a2fe28d62c17a6dfd4f32105420c30b97ec0180300a2dae", - "0x02" : "0x01" + "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "32484", + "balance" : "32684", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999867516", + "balance" : "999999999999867316", "code" : "0x", "nonce" : "1", "storage" : { diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json index a9daf2abd..983431484 100644 --- a/tests/files/StateTests/stRecursiveCreate.json +++ b/tests/files/StateTests/stRecursiveCreate.json @@ -1,6194 +1,7231 @@ { - "recursiveCreate": { - "env": { - "currentCoinbase": "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty": "256", - "currentGasLimit": "10000000", - "currentNumber": "0", - "currentTimestamp": 1, - "previousHash": "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "out": "0x", - "post": { - "0007318879928543f66b36e58900a870dfa83312": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "001864a1fbee8126e530b9242353d9cb76b043f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "00ae33b99c24c45ce086aa9a1844fe8ed55ec312": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "00c3d96a0eaddf7975da5c8718c26d65de0de59b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "00eb1775a16c0965c299f06a0873e11825f915e3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "00eb67f5e410e28c16861fea7a2ecc1e0011a75f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0116be8937cb591d6db17246c91dc3deb1fd0e1e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "012255fe8647bfe207603a62536ac6ae7a230ca9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "014337758eb4abf60a8e458a97acbd8b47fa0c31": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "01619145d576c5b3130eeed16f29501f2773c958": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0177fee01c15eede3b794e761753c1f6d108b7f3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "018b456893203c6e3a5661e7328b5a858904cdc1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0199dd91369b5ce0467b68d57beaf1d96fdc769a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "01b26e834122a942828698305a84789ec47c0454": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "02391d38c9b4f03e9225ae5b28230284fa397a09": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "029f9045d1904fe6076c4dbe77bd33290f390714": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "02c7efe87a470a521338ba476a0eaf7a535c9c56": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "02fa5c7476f2d423f27ac8afa1e357db95f920fd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "02fee10ca6c1ed23e651f29c97a310b1b4dad13f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "033b61ab81ffc5adce16d365458629d9f3482129": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "03b685fb90981f103fde64c3bbb5fd701c84dd0d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "04110d816c380812a427968ece99b1c963dfbce6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "04308fa2e7af944dd7008a7edbe5221a52e2bc87": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0441738f9f0a045afd77a72ef8398475c1111471": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0462dd089e0519c581654520d17763635011fdff": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0473710fb4277459429e0c4a862ad3e4b45692e4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "04929feafa156581a24d8a0bfe8154ffab39fb37": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "04a104904b31f401966da211ef40874d6e97ae46": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "05e29ccc32df8edacbc5bd6fe19fb4ca02928969": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0602479ffb0636a1ce0fb57bf7949cc978250d2a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "060e7bcadd084fcf19db5cc1ea769550bd8f7508": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "065c627bc67fca3636da49c34994b6efb2adaad0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "06c4341ea63b3431260716e2162ba90abd9628c3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0723789d0c7093f6e97c3fdeb1324a75427ca6e8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "076ad7e168093f590a74f6fdce56b492a23baa2b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "080e2ae63ad3891bfba9ec5200f4ba383209ecde": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0891a47ead61f684dc876e12d5261ab614d0fa09": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "08d19f247ca974ee89d4f988cac4becf7a177723": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "095e7baea6a6c7c4c2dfeb977efac326af552d87": { - "balance": "20100000", - "code": "0x60206000600039602060006000f0", - "nonce": "1", - "storage": {} - }, - "098de34931d0d159e2631aee55524c217624d095": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "09957f64c3396f36daa03c68fa6c997eb7903df1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "09986b78d02ae7c8eaa8b62053a3ee78deba79ab": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0a1960fde1fc2010660dc9cdc299facac4502363": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0a517d755cebbf66312b30fff713666a9cb917e0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0a9015286f76ca4fbcc33e74e9c414be9774a67c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0b4b7f08623d9b3d6514baf529399e4f1c0ad944": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0b98f3276e76e9982d7f6996878ea5196fda62f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0ba7f30a90b699e3f906bff7599b230890bbd56b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0bec2514a2a40586ec75e27442352d1dd2bce537": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0c0cd995ac9e488544723e3e8e90a5fed98a6958": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0c1e13b0604290abd900eba3fb6b7560b3401f58": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0d11b1966fa90191f6927943c476d36fa3a31556": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0e0905211a442bb5838d2d6860f4f21e6b9c6593": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0e639c40606e9329259d2f945f59dbcc6c5c5cfe": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0e700a2aba22bd639abf05addbb24c53c3f0f3cb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0e8dab5716375707d97656230beb5f1445e56309": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0eca69ecf3068082cff932c044fe39142ab6268b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0f065de4c5c4a842f52a30fdf7b0162594df70a3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0f0f333b14cae00e0f74e1de336437d5644ae336": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0f2fc64833681664e54ca74ea756c7233a05dd85": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "0f8f271215cf51a0646c8a60ed626515b3ddb739": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1039c22c55420b0d7e65e6e6e65798f3f4c1e725": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "104f577c92f14f3684c13eb179b9969c05115604": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1057c6ef671b124fc14b5641c167c6e6756d8cb8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1121c3fb4f490140339dabac59a62dd59a9912de": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "11895349d40ea4683803f8eb7ad1d2355ff906d8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "11fde66f162bbb0e19d68f0c774c997d0165fa56": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1209046d7bf46e81d8202422e630719c906653da": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "120e38f3899a4e2f9f848a82c7afee288d14e7a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1236efbead5ada892f61e7e4e59faa143e3bc01a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "128aabc28c928691ad3415e3c57010c40694cd6e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "12eed250610e4d59e841381dc46deaea3d9305b1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "130d08c2381d23796ff403d8f1fbaf204d90e3b8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "134c36c64db09ad23fde5b43a3a7a92d84dd5300": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "13911c90a6ddef5182a772116c1d9e98f27fb1af": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "141182812579a73e13dd878d8a94bb628143b097": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1456fa2cf6376b40069504e491e64aa40484fe3f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1480213270423eae9d6b0a603541e989998453d1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "149d393bffe9be2336e7ffd6a109f05318dc798c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "14a76e43bc292a0e69bace56681c4eb50d8e52d7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1555dfd05f003c056dc219415443be1a502fdee1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "157f8c66dd3cae32485b2d68a51c1dd7923bf91e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1591af76c716952018e52e54c716e8b2226d494b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "15e75e648b604b0b8028f7955647eac6bc850088": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "161f83bac94d326e2a8debba84379ab72a14c6d6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1622e5aa3015448c3a7560b15a289d9aacc5370e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1660ada72b0a07040df8d063f2f3f3fee891f1d0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "16c5f61453cff59c6b7e2a690cd902b72208427f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "16cab73035afa73268745a3c2937b551813c4960": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "16f5ee37c60dfd70f8281ac16cda47d665ef8789": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1756aed6799c904988cc7a1dfabe77fcca058655": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "17c7a85a071c3dee708baeaf56c208752c362e56": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "18500d6a8e3e20ace9aeb507c213b6261b23f5d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1872142d84f7023b181766b790a4487f4012527c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "18731575d0a6339f6317c2a1b628d8a4c145328e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "187749fd89567f9519f0d50b4a19ad2600440e3a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "187dea0407359c9579adbdf1ba9fad4a92fb358b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "188921ab89b5b8bcbe443676626e6012a1ed7dfb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1889f5317912e414fda653c710d2c17b7d5651e2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "18934934c2f7d8b6b645fcc90460a966df3a716f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "18e0cdfc5a23465cfb3566091849c044d2210b55": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1a6bbe5380998bea238848b7a5927fa87e7b9fe1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1ac3dd6a958d88e45c2c55d938dba74fa892084e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1b6ec3b2772285abeba8f53839fd96de995c4bd1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1b8a6f09f8fc9743b59ddbb2f105034e32262552": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1bce33a58c2741f74daab60067f759e9fc5f8c40": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1c2749b3a6c574b21622761bef7274261597ef2e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1c32901c93008d3e09928bdf3385f32ecff9500e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1c6c53405b0eb8800a527cc5990fe3b259b50a4a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1c827d36ec915dae96fdc0b164fb7bc1be9467b6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1cd063768378c77cbcb93dab0ba4c345d76bb0fe": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1cd52bab323ca2180a747d3c8b8405397003feb9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1d3289a828d2bb4a86cda52b7772e2d0d508bac9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1e1505a86f6b0fb5f7a4500cca953462cde929e4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1ea264b74c8f6e50586097e2e7c9a39419fd88de": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1ec26f14651cc567ce691ce83ef09eced6b12a6e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1f01dbf8bd02bed14cc0a21831e044faa3f66fca": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1f1960aa296fd1f00ff131357138001afcd858a9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1f5cdfaf598bd8002997b576e9ba849636c8431f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1f95c6da6a9e0abe74900ec00388094d32d98a42": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1fce5879444d729719c03b5af6e074b87a49d933": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "202474905af37a5074cfbc2d2dd0f2f205a099ab": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2040d98a367ea817f76fcf8574d4df51234eb492": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "208d07e7177b2e975c6b6d0eb3c5566900b87dfc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2099c5bdda1d98ce3b99988d768fa9f812a21f24": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "21190aebff29feb773919d8572f8cc825bbf7144": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "21368af8397276e6e4b284fe36f525dd323bd3da": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "22230d8d10e81e01450aa68bdfbee3c20d969de9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "22affea985c1a1ab7007a55e77e80c54111708be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "22df73cba33d8fd14fc985fccded670de4041f25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "22f2f312befc07db595b5d9fcbc4caa7ee8df51c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "23138c70217200a44c58dceaa4f5ab06470213a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "241b46962af48709f1a19739ffdc7bd3f0d2c7ad": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "24248d1242acc87dc331e87f3142951a977a3d2c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "24dd378f51adc67a50e339e8031fe9bd4aafab36": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "253a31b068a402910eb30758704b78c375ea349a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2559cea11e9d8fd293253a8ffada7558c9c4db86": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "25c0d5ce71eec198760c001497350ad83df55ea8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "25f81565c6ac2e22d7e320168222450c2cdf4f6d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2600b9122847ee06e201ff6a734fdcfa74b2be73": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2652f49b5ad98503231b3befe7587c231be8a5e8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "269f24e1ae86f63876b0504b7b26e20483fa95f8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "26be5205dce0ce433dca3602886578160e6d52c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "28313061667479bb25119ca3090cd25c4a99a20f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "284452c049bb65ec77ed7502b19abf699127c21d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "28cd47ab2e86fe040740206eb31fe193df7cbab4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "28ce21f7f28c8a546bca1697ada45cd73473465d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "291cfb4b02976ffde7f1f269a3e7d30940367e55": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "293f982d000532a7861ab122bdc4bbfd26bf9030": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "295882ddd91b2f92c43bad0a51fd0ef7af61e729": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "29799a64a736832cda536d687dd443ef3bc31e57": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "298b8bde7997684bfe4434cf6d24d50ddabb69b2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "299f80e93d68725830c27cb084265d0e634e4f77": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "29f147c366199719adcb2ed1d528c4f34c10dc03": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2abef5958c8b283eaeec4557844ff1fe194e6cd3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba": { - "balance": "465224", - "code": "0x", - "nonce": "0", - "storage": {} - }, - "2b5fbc2f7e76f6281861cb4282effb94d609844d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2bab1d9132d47e56f937ef50987cc52c9adddf0b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2bb175c167599417f2192d9f926a5c648d17de8f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2c4a413bc345da77b2d07a17313b6d89aef2c2c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2c748f96ae0e6e9b01395e8a73dfc351c46658be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2ccccc0744051db25927d850055234117778c1fd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2cd26944d7baa6d92eee478960d5778375862e85": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2cf5732f017b0cf1b1f13a1478e10239716bf6b5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2d142ccaa1337198d592bc36ce7c5447da73f906": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2d960addf6048f155cfaac4ad513f46429bb58f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2db5e35091789102bd0019b4ee49bcae42524428": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2dbc14a87a2b5a8b780e460dbe0083d8260326f4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2e070631694c093a9a329ec0b4a1cfa57e20ab77": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2e574f7a4c8f0e80964604262ef68b3168fd31ef": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2e83c90e7fa359705ed2138854a83a9145c27a8e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2ea29d9016f2b1141475e4c3c62e031c0a908a07": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2eabf4237f49d4cd44ec256436b99ba41828d36c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2ed524088290909f92ade6d5f9d9c24071c26662": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "305773e25e157761c9d55cb7d9e24fc1b953a8b9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "30b37f280d6735ee04239de0963b071f83c13a27": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "30c5bc3861dfc5a70325aca029ab5dcb2d72928f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "30f51302b4630ea1b8bdcac380bd97d78c8f60d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "310782e2f6d97ef0abd4a4ccb75b401a7d348be6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "311f9efa9544b1c8a8277c52e0f1ca47daec8c00": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "312f80de0869a8fed49c8ba843484411c47dd13e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3174a074366bc04bfb7f2a728a725cb01cd575d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "317f31be5e04361b11b97ff2d6fc682030d8cd8d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "317fda8ec45232a8259546a4ca8ebef16338d47b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "31a87a9e67b2728c14767de26753f205b793c5ac": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "31c640b92c21a1f1465c91070b4b3b4d6854195f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "31e7dce7c8469a6dc612dd8c0a1242846d31c069": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3229e332af8eaf358f44aad3a902a6c47f96983e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "32a48ace80773ad092de1d9bcaa00787353b5fad": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "32de9810bbf442f9209f994556bc9a7f7e6da500": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "32f9418411245a8bc6982ff71436ed2de87e3d96": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "331a1cbbb58594c3636c0e54de517c4a6cedc27b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "33207da78e5ef3dde6fceab85bee1b5bf717e139": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "333872ba7e8ce9c43e158b12a3d038d06672db7e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "33b82c3871bc89d9137c62af099a0c4e5911a047": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "33c85ce982d0996ff7313c1387ab93348a6777d7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "34c972120d50fbdbb38ba536e4d61bc8f995d19d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "352e4ddc3153285117254b1cc378d297b7a057b5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3539fe0192009fe1a9d35901b0ba951a59348a97": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "36630619f71ccd89ea6fba8b13099d1483187b17": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3671a99d2a485b30fafa2a65f405b6b03ed32ea9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "36a9d95fe0c701c65370560445c6a80b4e13c8d9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "37609ce3799a1b75ea6090da3d014d59e5e7851c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "379ef6dde2bc54ced45146d4907639ee7cf1c8eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "37f998764813b136ddf5a754f34063fd03065e36": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "37fa399a749c121f8a15ce77e3d9f9bec8020d7a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3820c20f3f8ee1b164dab460b05a979640a41369": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38450559e7ed9b72c80aa00855b942f9bac1b281": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38479ce52243f1a8b358515a084fb41533a723fd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3867a470ae1d99ccc7af287ed95ea4da4fd49e52": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "387b1112283308ce33f63062a7531e6fe0f3af16": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38813e8d77b07f357888ea1a7805ebf52c59189b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "38fe3b47fed5fa6d060bde66598bf5a773b831eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3917f5ac4614ab7d126adf2f5b1d578f2b91c370": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "39457953215cb93e68bc5b351d63a8b7fd16031e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "39d9b351db53d59af4907116d594ebba910474f2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "39ea196ad4678ac786f9ff4ba12edbb364cd1baf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "39ed2d94ee4aae100b111c773d4f3b78bd4e9291": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3b7465c98051ca273d8909857047d5dc5b022af7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3b7d7653d3a7c2712d08bd29668163cb775c74a9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3bfd62743dab66288fe0b993d893a41d2dc3fbba": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3c7c94fe8e900964a9885a19e09a4ab80213c5c3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3d082c9477c05d23447d1682257a9d0ac1f948be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3d7b61ce014d1cb84465f1f908a6a940fd991b39": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3da1b91d461c3220510e60c0c5b87be635068740": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3dd6e0baadd05402f490e3030ef1970d884a1caf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3debce965330c2da68edb1cdd3ac380d5ce67b10": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3dff39a90e67e86536dcc8b4dbfac04da831e0b5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3e0506e272fb9d9369627282cd76a40e4046ee84": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3e3069deb6f503bb8bf155eb2f89801140831f5b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3e85699a24243e147ec809e30761d92c0d21392a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3edca986feba79717853d9b91595ae61d953736e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3ef5e42a0012b430169dae579f8dac0f6ef5dc38": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3f5bf6c71c4fae1a91c1cca72b539dd83762a716": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3f8bd9d9410af417dcc6969b64096380e1a6d0b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "3fde19fb418799c0e1744b322314c17a863a0c9c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "401f65fb53496c7746dc6477f6f9d67246965d51": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "40652c9cf91678111a21c62d7206ffbca3d47c9b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "40e0cce7d94ab21453c5576f30a598cf9fa80e1a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "411456908355aa037314aa920e8afef3632503fa": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "41493b8488a0ae34cade12733e8df93a87f3ec7f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "41eeae22551bd18167a31036b363bdcec89a7d9c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "42ea619ae1a90979837ad2137458d991ea0613be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "42f56890357c304762f1c57171cef30f044ea09b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "42f8c6079f5658fc8dc5629b63684f278acb7648": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "43b0edac3c2c58f16fa2380089d841c420a14236": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "43ec9b975f37266d0ff7f044581db559fb9376c4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "444e8af4b323407d02a7f96c209b712a65c6aba9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "44b329f4eb8ebaa00d731472964de821f8e53a26": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "44d13c51fb706efb7394346b00debea9ea46e9f3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "44ed3a04032bf3585faf1dfedb9806eeb8345809": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "44f344790e299b22484749266ea59bbcd58e4b0e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4582048e819b7d55b3c6f47e46ef8dd8fdd12038": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "45eb1861d0701efb338468964c2495db8e7e3411": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "462cf0e5071404ef569338a6f0a5b113d64a11a2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "479544e8b67a7e82120d3c5d7869b4c55f4a0de3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "483940025f2d36cb32e93ed80caa41f15487ee7f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "48e958f074c27f1d190e69ef8c01f86931b278f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "49a01a2696857efac9ba53c2705ea4ffdeb30419": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "49fc4b5136601d856188898008375b9c1bf5897e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4a0ec2620d55cefe3e80960f83ebc81219ebabcb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4a1edf2110e4ff29c69b835bdd375ac88525dde6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4a466c64765157e1a9dee46e1a26d95ac2664c4f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4a635e63aadc395c1801c73640f256250d209b25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4aebaa9fbdb040e8037e78fc37785f33dc3cafec": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4af174d239e86ee19d40026eae04486804602061": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4b2c0c38418eb142d686d124ac5fcb363b061fd7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4b414d48f3871bc957751d5895c96f090b509bbb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4b6dcb9105adc3ccc34c6c180e9e2212c1789975": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4b8558347f669cd9b50f70cb501cdbf05f93b575": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4bdd7615ee906a0c88233acc5816b4fdb4656dfa": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4cd33b31663c159fbd73cbb32f616eb46f7b18a2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4d47d935a3a4a4618c67f337a0075d26d9c1f852": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4d4ad735b52df9e88fbebebac2de1ede991f9994": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4d7a1e5009218cf5176a313f6922c3ab01d4970d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4d92228ffbe5ea89389a34a7086e4420d61eb70b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4dbe6269722a6063d594dfb65eba1f2a10488963": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4e36ffe7590f8dd7fa9c4c03cba3120674814abc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4e5cd86dc5f716ebbdf6ef572a369c227986bde4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4e76fc5e619a4200846eecdd5545b39499debb10": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4e86f346747b828937501ebfda05b2b8fa16f87a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4ebc77b7203cce293550d92b2b5587621cf53219": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4ec27065c52d294799b93700dcee6e32778f1b18": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4f14a61b9f2f99e50b719f1345e76339f7618202": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4f36659fa632310b6ec438dea4085b522a2dd077": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4f5af8eccb582ad30e2702d07577479599461c54": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4f5c55986b93d742d196235aa7329df2c8ae5562": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4f86da4fecade6017d7f15e30d8320446306870a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4fc34bdd654289653ffc904f86ab2f17bad8431d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "4fe8f4ad85487cfe365ca212848f7c970c21e135": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5038bd4d6b5b31100c52c85ae3294d525596836c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "504ba70fca5091ea426c964ac631082e4ad51672": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "50aada85d21c462d9c2803fd3c22beacc61f496b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "511b33319d0f7df487e07c4f5d149b27cecace46": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5154569b5138f7c1b77d4434860a92ff5707e047": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "51a578dc2949f3881535733a5b1a7b5bd308215f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5216a59dcffc6105f9b58a0b397baad604c0dfb6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "52b774b5fab1f557024bd4a7cbec4cd014b81557": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "52b90967c04ab8adba7c6908b04eabf2c00bcf82": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "52ff6062b4e65231065d5579f870b7f1472a5853": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "533069310b9741214f30aeec58be9d19f40161fe": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "533a4a1adbae2d561beb729c53e46251ab3a407c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "534d2d9ab80a99d598de600ac2843f751e8bef3a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "54819bf1efa86437d2f38b4211bdd5229247d9b5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "54a1706bea8f61e354b5296afa5a9f488f88ba0d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "54d1de66a65ecf30d79037a8c8af99c633113516": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "55010017736ad7e8e14327cf0230ba4c6bab0450": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5503d35e96e76e02db22c51fd7fd3d5c0667c885": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "552e158ca0fbd97f7b3c6208ad3f956a67c8df78": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "558fb0163d7794abf1b241aa4728390028291ce7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "559bf1337f14e89aee38a9859ec9bf8035e8f6c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "570dce0f67e367a085e51a47d6c93891a82d452b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "57cb48688d626a12fd4caee130b11e1b06ebaacb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "59ad59b53c0d9bbdf0ee0912732baa43eacaae99": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5affb7ff218092cf60bc1ba4b32ea65a32cd6844": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5b1718e3af89692315a673b5c134361408069b00": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5b2ed45c5376c8359479e1b48f8c07437ec78336": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5b4615bc4b0f10948e46f967ca6e64cf91a7753f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5bcf5f7ba278df5a31f48a5706e69816727a6e9b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5bd96b317d4163401c9b1a2271c03b9439e73e6e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5bf1ac936d2312daf08e481d85e99151cdfdb9e1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5c70cf636b26ffc099fba8ddd5093e95ca8e7782": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5d07bd78606705bb5c62fd390123b4e45f7d74d8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5d11f35386d10cfa7121b02056d97dd932659943": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5d3292b79851f68d3907a550dc1a0b569d603f66": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5d57e28e16bcf33b37672eeb891b29c481e89120": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5e0ea0c533298d20ebcd19482a8b1e1854dda425": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5e5a0b9c4c36067c8730abecdb29ba97aed877a7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5e76969932c5d314142b23c555af4625fa6b9343": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5e89d5dd43fa9fa54381f234d1f7251387a0692c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5f1703b93938752face6e4657a90825b77f455da": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5ff4d4daf0a832422c4675a77720abbfb5afbba8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "5ff4ef866c3ad4102444d020c1d21c3d35a119eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "60a2db26238d52510209c569dca17c1f41c9a544": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "61144e43a08b3852bcd531d13f0485743bd835a3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6123d3be4335107712685be2d575958b17501067": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "61306db8b4ac256266cb379b5f686e25cc117590": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "614037f9a7be1ab2131d485845f297f2d62d569a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "615a957b818ce70fec123daafe552c482c59c5a8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "62123ac69c46a06f7e3644b0dfcfcded535b8727": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "621ada91fe8f65407ac963de8e75d88d4c388cd3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "624a9bd6345be1a95c7fb509ca4bb77d05138adb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "629fdbc407b70b57eaa1523ab12c5178e81a5d52": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "62c01474f089b07dae603491675dc5b5748f7049": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "62cde2103198f54d31cdb9e9495fd7e1243c2c27": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "62e75c838a732abab87e1846f361721f03e7d973": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "636b02091904e5b452d19455f484306b8fe62dd6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6454029b19b69bcda3ba156684d58283636dea40": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "65e3776618742b90f1d9844c907b276854869abc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "66e68e1d0f65b4379c2864f5228d98de265c5e30": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "674840a9e918ae6b7560a4ddfb60b96a32636ba4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6792d18ead88bff9193e50fa12c02779f2a0f4bd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "67a66435543da4130940ccc47e3d9d164db65fd1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "67df3bc5f86456f2bc57f75c99a0389bca7e5850": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "689a40b4f540d145f6dc4ba4079e17f84b650f9c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "68ec6ebf20b30a31b09c7a35d847da342e24a3c4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "692a1a4da0b418dd701f5133e2b3c5686015a3df": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "697f8deffc4b33738f1dc02e792b5cb4a37ead06": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "69afd0683057a214d3bb3cc7d438961cf8c8b200": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "69fd2b9233b83e54861436496ad6b9fb28afaf40": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6a22049b6339e13438521842386a7118d6a1a15b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6ac56f1ceee102b85819d789e6b29308eabc373c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6af2602221d2477af828ddb2c1dec8f70a24abe0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6afeffe32a56293f23d655a1d1b2bf31d616c2ea": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6b0105812868d533882ea4f08bb628e5e9d811db": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6b5ced188780878d8a72b3e6f02618db2bb97584": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6b5fe85d1513c1a29fa825a343db7a80558e6de5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6b6945d5fd5172355825871803b93e57c5040653": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6bed38b822d8823a2cb71883522f932cdde95b0a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6c14bbac448312636b86fe713185cf7d8ea6f1be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6c3bed6efc677ccb136c0d886a6f3fdb375798c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6cc6da179301a7ec4290cc0a5860a42ad188399f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6d27b8cb6b9af8a56fca98f13033d15f10f66da4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6d9834013a85a25df2e3dead1986d753457d7b67": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6e0a20c94065e338c7715046a320ff4495b4fa84": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6e24d18a80aeccbace499b6d26b655633c0bee99": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6e2da6b24262f419933bd63b03d470ba019350e3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6e53f8efbbec77187f733cb053a53a28e14ade81": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6f257471f06ece199232aaaa082d2b1ae7ddb483": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6f562b4994dff65756e316febb8d5a5b99e11420": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6fc7016fa33af287b3b9cacd092c26bd9a054569": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "6ff9622ab3c22e4357e90274d00291c527991d21": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "702433f6bfbd76274ec1bb641c4a0428298487f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "711b5163728968ec016a924238f743fa04f2d11f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "714213a080e1d2988acadbfc5e441df5173f81ba": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7161527e54370ad8fe44bc83d692b10b9f9b877e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "71a2fa577619a37c2e2336bb6c20fc1af193860f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7213c423e1db8af095bd3cefb15e43c6067635ee": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "723bce7438e7c70d113e954e9aad5dfb4551dbff": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "72969d083705c924922b857922930f2087426ca0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "729af7294be595a0efd7d891c9e51f89c07950c7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7343c0aaebc045465ffebca00e201c1f554c2eea": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "73f9912db6e86599f256f090dffd915a845a9631": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "751c9d6e9b6d91897ab1754b15b72712953de9be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7528088649b574b14d14f4b5ba45285eb8a78ffc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "752e929cfb45fd739923f562b146db315b8cc4ca": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7642513288c9da66960a6f3df0c156a8e1dcb119": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "769277251b9d3f0906a338f156238b159bc126dd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "76ca5805dcccf57966da8489d1720fb8c5dc4b81": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "76ea1b9309253b5c03bbd6e9fca6591b51fb3785": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7702eec59b0ee531bef08c14d0e6c89e7e43ebac": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7797a5c4bb655b5ea51bc966875abb3b19c0d105": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "77d724d278fa787544189c4774f03849be2868ef": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "77f14e248490de6b7afb327c0f013c54ae31d2a6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "77f263b8c785ec73f9f77dd11ab64fb0089cb164": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "784c21d8eb231135ac99a64dd2ee334b045043ad": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "786102f7205ad86bb77b14a1b80d8b26cbf3562b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "791812110230af4583a4a6dff7eb425b0b0dfab4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "79225179187b35144fe9e8505cce2bcff3986ff9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "795d6e09eedae3febc172169c017fb67aa62efbc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "799dcaea1d20bf1428807757a84d6792798b74cf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "79cf9a7b86c0a7adb03ecb8967d70413f21b925e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "79f2d463ce2404b3e77db5dea5cc19d76ac223dc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7a315595e01d6e16134063232a01395187c9650e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7ba53872256e6762bbfdbefb1bb80b26f94df9f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7be1a5856ef5951cf1991b57c00f73939c7030f8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7c26d9c9b73a75f1a468d06bd69e08f4d316845b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7c41aaac568600537f36df0e35cb625dfbed75a7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7d3b079a8306f7cc89f1b9b23319ec904e3ad853": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7d4e21638e756b9953576f460037cd702d10211f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7d699e5ea61a26a7f677478cc79887e2f27ab345": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7d8dde5a13af888557ddd5b931dda20ae59e9e23": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7d8e57afa6550a1be621fb6c083aca311a1e229c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7e2a31e29b84cb193202609dbd86ebaf9a83c119": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7e2bd10d506af5eaada030590c8073495230f37c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7e9f915d9417cd7bc8220546680fa5eeb73a2192": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7ebf86bf849b6097c8af6dae10c52438538a0711": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7f16eb03b09934c61a424e6a1c4649f193d157fb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7f3d23738538a34184e3cf16506685cf0884bac5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8069a4fb09d35f100d18c98d02ec1bfd997bb893": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8135c9c23bfa97243ea79214772816339552f835": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8142cb33b22222bb9e39a66b53af12c6ca0b5375": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "814a465f554f949e6e2a6878539c705f319c627d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "81b26e12027f5df776edd5539791e683dc2e57f0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "82afbc3f6dba388dba71ee35f56ea772a53033a8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "82d03794122107972c0d075f16754791224b507c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "833bafb51e8a34c93f3100430fffc5ba61ef95c9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "83602911153c9c176419a17276ada844bb932527": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "83802f999d793e8985b916465ccf6050195c0167": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "83abf69971313b011ee30466e8f703a460400557": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "83e3e5a16d3b696a0314b30b2534804dd5e11197": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "83ed885c9759d5524052681a5602616a4d565e87": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8405a655c77ae3ebef4410c924cba9ef22a57f42": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "844301835752f15f39550cdf531e07ccef5d133d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8507d90ee605e59469a35fdc78e844c59894e003": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "857109cf04811d5273ec3af3f3d3bb56e93d1dfb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8692f270fea1b23b492dea1755f48cdd1dd78534": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8703df2417e0d7c59d063caa9583cb10a4d20532": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "871986919b8ac4032193739eeae09c66765f0f15": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8719f47f3dd875955760868a4fb23f761cf7d4ad": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "87946e396d4fd04d02f117adf25ac427895878b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "87b27e4b436adde9bf724b4889980331dd038d49": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "897003bcc0313258e7a3517771982e05e4cfce1f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "89e81283794cb458b9590002ce69ddba3c976a42": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "89f02008028773d99248943a6bcb14200f4509a0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8a05aa8ab787526a0591016c2aee95037b8a478b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8a2cab44ea3d5c52c704f060f4088e505791a57e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8b0c28ef1527a918fc7dc134ee6c00f069c7073a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8b0dfaaf9135721f01f3712572ea9963d70f49c0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8bbe1ac3ee5866589a669dd95744af5ee83e1b72": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8c2e2a704d809931e711b89162391f2dba837406": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8cfda5300d7544327e32aca175840f90860305e7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8d7912a42951e7201c8854b98a36e4203508c3a2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8dffcd74e5b5923512916c6a64b502689cfa65e1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8e1320b630d8a411819c16dc0edc2cb77ed8049d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8e15b61b6735457672c8d4809e30ca7877e9fabd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8e4354916a56d367dd99d3eb120e27a1d8ec6e66": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8f55e75b453fbb3071e4454119a33477c6028788": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8faf239455a012d6ef377a83448c8185466f8511": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8fb5af158980be77e5d137ab6f95000407041099": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8fb5f5dc4d66ea0233a652230d44299718cb9f9e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "8ff9fb732fc13f492704a9f47c47db4e877f6dc3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "90344e80aead27d6b007ee73dd8fd8169f870f51": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "90f8d2eba99d7e50525edae64a61a28526eef894": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9137343457792227d68316f6ac0bc3518a7702e3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "91acc7d4c4cc7affac116157a53f5614959485f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "91c87b19dcd811fc5efc567a022bca52d5e2e252": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "925cdeaf40df0ac82648432e65481350417fd848": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "92bbf48cf4a124ffff047cad76c82db1a1889803": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "931543d59701f1a123f3850e4c6e4b0ea097ae5a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "93840036a3c19b1e91ba0ea10f95a5041ef61a3f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "939023fa69f246b709a97f16c37367e36267828c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "94602cccae39d50fdc504869eff546d1678f0ae2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "94cceeb51248e76f0fa711e92986ad36208f6e93": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "954933598dcf8e04d6f4ae5b311673409e85c809": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9580d4c2c6795fcb1ec84bf6a58b873fb2737788": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "95a4d7cccb5204733874fa87285a176fe1e9e240": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "95f36953203283bc9358f396b627dc79480a8ec8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9606aeadd83c5da2a613b0e132f0a6c13cee43bf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "965025b3b611003c82c8c9b69b35b4c5444cde69": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9663275f953d54a345f3dd00e2eeb0f156710129": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "96f4278992ff6da5e8e60456279d9bc5d1f7a845": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "970e2fc1f55b1e2b214f84e155ae6a9403f891b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "97316b1fd92c5e6611acffe79899064fd9274c8a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "974beeae03d1860c485c0dbb68e5413317770b16": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "97b61770815f0589776243ec8ffa365b86548b28": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "97c99c7f158206d19196df8d21573126569d918e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "980410833d9ce53a0f944ccc629032fb0e6ae6aa": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9848ce910f5874ffb5cad5fdc3507e8d54fd668a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "985e84916da5ee358e1c119c9b12ff133da52d29": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9862b64181c8bf5bd53e51c5f596528ff82bf652": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "986e30c8512ac023f09da460202322a88e98aa66": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "987600e63a25755048e018d1976d8ec4657f359d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "98ae7604effcc8bf6accb109ebf78fb6f5dad01d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "98ae76bbf3fe4b779df55df06eb0081ac95d660f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "98b163f2929e5c92709759e3215879acf32a3a98": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "98cf6cec29c58634b6022fd1e8f54f912921eef3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9917620c3df2e3cae0f0e690b4da82221bc26efe": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "99b2fcba8120bedd048fe79f5262a6690ed38c39": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9a0ca249b7e4f00f62ba5230a602c3233895cee2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9a0fa2b2dd4993b5ac3370b4047f5e4472121674": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9beadb15fd4fe1f0755ce82dd160e1a798544a1b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9c5fc050311de43f7b7d9a66e8319ad3c051a252": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9c89251856283a8e3aed6d801ca965fdc1da4aa7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9cb15938a825ff7c17ae775b6454730983522906": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9ce1b776e1a050af28b1034980a628b7728b0831": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9cefc7e38d2a714318e5c36c3c21b226b10218e7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9d0e24467eaf9b797b9e3f6a6084958889592ba8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9deb7e973e3567140c51750e92d7c5091174f506": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9f28528f2db498c3a0e79b15b97d3b3e9357e942": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9f42a00ab7bea15357b54e16867383fdc02e7060": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9fbf90147bf6ca022818372bf38637738d553552": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a015c57718562f3839cdabd7d4e9c86f1a321a1b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a02b80b54ccc306e042c286172ba903dd53fa4c3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a086d90b189bda22a2ebf3e9b7092f1782e4fe84": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a1230890b4634e4461d6295fef3b4ca6d8899bd4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a1ef404093a02445fe14243e853a641c23ecaff7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a24089bde6e39fea0d157ab9aa4173882e62f39f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a2442dd71a4e937fd73ff383067f97ad4c83b4a1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a301df371257a12c7bc93194ec045d211a2d4359": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a318ee3c41da839fa1002dba1f9a140274ce59e8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a31b0038c42665206876c410caf02e67405dcfff": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a31be87c0ce167d8e9380a34c7d5004e42f37840": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a3396b3bca8473c21f9ab1fca8a40ecd580bc625": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a3ad081c8f3b79ad20285e881e0e4d011efc012f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a40a11c1f943538e64466de3b3bf8c022b883094": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a479aac07f3b83ee401944a36812d665f54ca6f7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a4a5e07598b0d6a40fe62ca88813b63a1c02710e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a4cd6039bfcc6295533a985631a151bf2e0e8b21": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a5303b50e97dc17384209bdc3723ddc6eda7aea0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a5552ed8dae24eaed9346af3186f634d38ee9aaf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a5ec829bcc187b6d19e825b5b6f12f86f81cc063": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a60724458ce6cca04016e99826fff8c99c32e3b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a6495f085bc30ac47e89a9a700e406e26286c3f8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a65929129c13f2405697b704fb1c840987ad36f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a686b20553a38e866228ce003657a71200957c3b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a71525ab6694ead3c1be0aad07bac06e69192524": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a724835568fb5e3986c1e87331a18b6628b73e25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a7547a96b2c999509ae062509a0d426fa46ade62": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a770dccb354eae253f170825000386233ebed231": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a777e559211613e73d9d0cbcdad62c88957d6f25": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a7aaf603309127956371841badc44b69252d142e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a89361425f7403ec9e757b5d1a31993a79189a34": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { - "balance": "999999999999434776", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a9647f4a0a14042d91dc33c0328030a7157c93ae": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a9ed1d8a969237243d26f8728287cb3eb8730662": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "a9f73dca799231e385ce5038c826b03eff0d1145": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aa6cffe5185732689c18f37a7f86170cb7304c2a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aa839cff1f78242d01a33305e1d9973cd7c66d4d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aac939ac7c11bbbfb7f4520d14442a2460a51e87": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aae4a2e3c51c04606dcb3723456e58f3ed214f45": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aae4f6978a8eb4a7be406a2a787d31dd49cd551e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ab118214a2227c79eab2680df0a96d0ad67dafd3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ab1b93b6a83c275972ec2a6b513c3106dda84f47": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "abf67dec2d1ec31dd111c2f1135818b6af86c662": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "acbb287ca3f98d4775dce56e40ffce57ce4ba179": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ad02a5cab29480ea5b67e354b0da540082500327": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "adecbe660a4943fb6feada38775e51259ea15af1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ae17512fd9edf51989081b42962b2fc85de4a2d8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ae5837876e23fcefa0f204d7b6433966ebb854b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aecb52facdff422fd67875967e9278a7b872af32": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "af3cf705624b239ce07280597a55dc8ca69dd086": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "afbd8818fe046adfa468ea58a217b83f7d5e75a0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b008af759b5359810c78d181f0743ed85c286116": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b021f73dfd1500257934aacddd707e6f67173edf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b03a2acc80fce6d54bd1db95d7ff24123ed6e106": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b0a10fa71a1c4c621345666be094909ac112ec82": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b0ea2ec7623a1faebead30c8007b260a4c62f99f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b14b3e0660d147b2603ed92fec4ff337e3c259df": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b15c7770a476be2c77c3bd50d60ea6b2cde3186d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b1691d2608aea9d7a56083dc7dcbfacc93a4287a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b1ec052c576186de285bbd31164de3b19a844dc1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b2c10a1979ac6236e586ed704cf9dcecb034b8b7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b2da69bc3361eaf80dce81a17d610217ebbc7a17": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b376b876f7137844ef5e2db1e307713885ee5d33": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b39c8c3ee619a2946cf540cbf16720a881110f83": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b3edb875f0dc5faa556edf77a97e53c9d828d146": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b4429d6274f10ef0b7ba30837c5de603ed4c16ef": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b4481bed4acdd11d8f22f535016a762cc87845c2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b4c898e7d827a75d991aec0a837c23aa8d9041e2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b572b99fc06b16a232d74898e587398d25d7d33f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b6367a493bbaed7334456b3646e4541c9e96012e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b651decbba52842e8fc86afda1168ac549dea7d6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b7650fa902a0ad81e8d48deb557323bfcf32efdd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b78428568fc511f4a6ed34c2d57c4e104138ca98": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b7b7c5f65fc11a6bee686b9363884811be247c43": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b7c425948402f9382208346ff48ef6ac4667baab": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b7fbcbcd3389df89233f8bf6bfa8acf892958a33": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b88173b953f6c1b613b6e878cfdb34899e3339ac": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b8fc89fa4eae09e1b4bbb51f4c1791e589368801": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b9261902783bf36bab49f18323a9c8e4ad86519f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b94d3b46afb9954a375e50a6fede26705800a057": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b96672ac912cc5ad6f75157401ccd9003512ffc3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b96982fae6a70aff19c2d99c3b2adc57b151d784": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ba158ff71047c0322b1474461f94c0246d0dfb2e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ba3adb3b7ccccb748a65932e0254e52ce092c5b5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ba56f0f804625c0ff8b7b119bd03af0a10b5886e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ba70f98f64f041290dd6794e5cbc9e8144c8c914": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "baf332c908b38d0c5e825b41a500525fa990b0cc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bb26680f6bb423720c6437fab35913d0a86e2a78": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bb7a0556525b43c750e380a0ac1ca3bb719e601c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bbdb82e2b1ebae617370e1c27542ea087a4fa937": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bc2929a7819bb70f10676f4bc004fff40ce5a52b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bc845b8623c7af6b07eda7a5363298989cc007db": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bccf73dc6498406a51b4183e22c4be57de5c4975": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bd4f71cc4a8facf8612158e418fa394cabef27b7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bdd290243af494ef27e986a3cc432ba3f873758d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bddd1619fd3c4703733b1648b7db0ffa6dd09a19": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bea830535682332041ad318232044f5e914af083": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "becf51bad165c4b8544ecc57c7859ee946e610df": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bed1a42fdb56c7d562a773650bb2785737caca3b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bf36bc1d23eebe66f84a0f119552dc7b46fe2402": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "bf574eebdcc7ff3617200fe07c8c7154a8d129f4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c052f8b19df2c41d807bde1c041a8ba2e87f15d5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c071690916c15657eba376c7c6b4b06d38e815be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c07b721215b231d9820dc8d186e3dcabc6c75e66": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c101a7eb0ac863e824eea705432530c65aa0c518": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c1ab531ecade623c0c908c1fbf104fb8c647a37e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c20cf04f10caa057314759a2908524925294efb3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c291bf92ff9bdc0e60f049e6a5b143b940658857": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c2afed79b83fc6b8d98802f52b1fea6648571ee7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c30727a70f64c82d0d8837f1b45b931ebf80b106": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c33582140ad3da6d7fde2c3c73d0530cbde93555": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c37a43e940dfb5baf581a0b82b351d48305fc885": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c37d1d79868b6a4c25db68301b8575ae4a8336fb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c3d826f0bcf2d353afaea99ec55eb9162438e315": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c4170be517e6c67a9e65dddb09220df58e547102": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c44e39eed84adf0c399a9d5af8d0053715d0f5f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c489e22b54124b98b17b68e7c38676efb81c1862": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c4be49d4dcee6efd96c35ddf346b969db9981091": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c57abf0b9724f82736bee2a05a9238a45de5512a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c608a6fa0f9f3a6af68270740ed6c998e145eede": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c694bd4edd4e806b9c7d4ad742a3be423391470b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c71253e1b049c2b5acba1893c74007a26797e111": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c71abd039da56d4c1d783ed06a48adf0808e9cef": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c775193c9d81ed6ee806f6005a874b927e96ff19": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c8732f022b6c57d291b26c830c651b3617c75b2a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c8b331eb5ad444567964f34dc24757bdd3425943": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c8c3cf855531e1d06c07245e76c5298b4fc90d8a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c8ca05f5e8391cd5004c3c4020e570ed4a520c20": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c9113ae38fc632738ad4722046d8e07ba9363ca7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "c98b82b246d3eca7562ae19d8ca605e77cd53a3a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "caf720d275e228b58bcd8b2686714ed8819cdc2b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cb5e208c02a68f2d97601da482c419af989e097f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cc0302264a5d0f269e26ca3ac24d7695b562b4f4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ccce4f34ac3a550c95747823a00fecce349734f7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cce1e6f23dccba1aa1830b1b7714fe985f9f2032": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cd1171381ba62ff31b56a001b8144e64e365eba1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cd5fca46bbc468b84b493f7b52ff50386b174d40": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cdc1f2aa2853b37723f415aeb181583e11ae7b8f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ce20ac750c9549b466d48c90352a255f6b7c8294": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ce7600131bfe22040ad75febed54cd4ad181276d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cebebe455b6a15d2e4705ebe51fe5007afda76eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cedbc4eaa94298536ad368e8ac9819c5e7448738": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ceee86e99b04198c09fc8ebf3e2f45253bddeed5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cf3f58bfe41401084fd1e997e8e36dfb35e363cc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "cfb86844738d5373ad23eb3185e1e9fc5d517ae6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d032f83c65a584f6e47f9fff9bc864d51a164a94": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d09a49b1cdb208e2504486267ca2418c87152962": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d0a97217cb0a4211e28a58222c1b038c44a3f211": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d10afb219e80a211c9072b18de0ff2317f67e573": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d111da05d7193bc295a4956543810071fcbe4238": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2468d6da54259507d07f74ef0a246f97e52f035": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2571607e241ecf590ed94b12d87c94babe36db6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d25b7ae72c049f91091a4abedc4d618e5a05e1e0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d269786262f853ed769ef3ea9a7e5b98db3bfb32": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2a0b130c0834eb0ad2717ad13233242280a6fd0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2be9413f150b2eaf2666b42ee719fc66e5066f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d2e450aa145ce97dc054b1bcf391407fbf202bd5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d3a4f3cc7113eb16572eced68ab395a40ceeda1c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d3c1c3359ed1906851379272964b7d96e2977654": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d49825eca3314ad0c5918472615055010cf4a4fa": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d49daab5099319cdda477f5ba715ae685c031db7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d5144e55ee02feec18f2ff293f08b8379d1509d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d577d44f2748e151afdb1ded254c942ca9933b0b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d65386ce109ffa3570dd27e54f32e2528fe01fc3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d7409d185224a0284e7451923e3d094ec309ef92": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d743161f0f7beed30155e171b4d577d5ce2a70d3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d758e9a701769fe9e5a80b3a09180e7631866f55": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d79995f1fbdf19beff429a94fa9dd184827c68c4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d80ba0ac6edb71367c1634ae5bf72970e596a99c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d87693ae6d35928467daf90aac749654e9c57644": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d9860a22b84f982363ab9684d767a347a5c4fb74": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d99befc655ecd5df508569aaadd729af7371687e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d9d8272a3b205f71494f9009705f4f30dd31c607": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "d9dd1aa8519580888c402dd4fae66ca68b4a7b47": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "da3580da73b2986fe0da9b6caebe17818b7b3645": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "da5828cee8e61bd0d8af71ef5da9a7a9019ade13": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "da7555a43e7a3790290cd20a19ec19032e28a6dd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dae44ad9bfab81783c1dd591ebe3409fa8967883": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "db06ebb361ef006c17f89ad92165185a38f6e630": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "db4ed990c69c3b67a04a96ccf079649facb9c433": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dba37eb3483100bc89a7bf11b7f110ad71ecf41c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dc280f2887ea315f70692eb247e399b18a07bda8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dce512ecde5a4c27da464f846e71c8272da4ad80": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dceb9854f220556f595bd655bf6c023457341e4a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dd8317eb76e8949315e601fa8a6959e2ffd277c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dddb23bf0a55d0197810e062a5a24a1503705ae5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dddda651d375f5352d2ff488eace1de63b6ffca9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "de63eef4b269d8572b6b00574ad8e34c471a07d6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "df50b2ca876e4174d276dac0c64e644cb1b5a118": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "df5767dc4d8111e8641198f637e4423c62e57e27": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dfc26965c20fea217850a28c08021f1468146101": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "dfeb403cff0aabe20cb07d8451caacfe31260132": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e026a4835edf27c2705c97f237e5b59b7b5da1f7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e059d3aac9a568120467ddbba3e4d25bbc82dc64": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e089f14df5e00aff3b03cac5e1236f5cf5832d5f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0a1885b4057f65dc75636f4fb0e4b57da82429c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0b3647d7252d53d397fa6af6d9da4749f4caadf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0e5744863b26418baf12f94f0bdad2ef2546a92": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e14b8b08ed9b569d2945b078fe94225924c5987e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e1e31732ce0075070c8d7e2ef7a44b93949493d0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e1f79aa1d6477ffd08d4e5ce185637434147e4f8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e21b2668bb1e9cf057606c44d49648f1c140aa76": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e24778b9ec00cc9bef91643e31885deee719207e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e28a959abf1b36ad7778737d992690cb73a51a91": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e292ba16ee32e94ba88b4b72821bf90fe7b1b845": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e2982af9c977c39cb4633346b916a3897ffeb6f9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e326d4acceedb3e572b98d4a45a6f1e37ee42501": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e32bec776748185042cb02d58fad1d5027bbaeff": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e3443d812bb8204255a1d249b82aa19508dff5c9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e355b484879e20943aca2c6655953ec8121b64e8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e365d9256480b1e9d3cc6eafdcad5912b75ad149": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e3d08fe78f595bede290f820ec0e878572803a6a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e4028c8f2888697e9939562de475f70a841ee713": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e49d92946422e69977a94d1b4b769f97efcfb8eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e59b406835db0d4c63ae28072c64c664da637557": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e5baf7303b008f333c57491345e604d52fce0d63": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e635349c1e038d62f774f4201cbda082b8af403c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e6f12dc0baf6536aa75f226bfb0262d8266433d1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e703236fc6d1dcc955b9abf34f490e2bf5057fdd": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e74299a026e8a481c1db07e6065ca30af9858cbc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e75900e645ce8d1abbb97d408989b159b2a50a1c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e7b8aae66ff70d59fcc5a8b4de5a246081547146": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e8373e7e464120da8a84da82c8137872cda65780": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e908278cc1515f214049c48c3a8908524f2cc407": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e913f5b697154f99bfc159a132c6c253b457ef18": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e93e7128f80bef53e3217782f21f4bd6a6d19c7c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "e9d157e81c306452f8494f681813037b146660eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ea186a9a4815581b71403480abae5cc7c57c00be": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ea216bc75a65a838ea3d63f7c05588c2840ec1ab": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ea2f1211c66cdabf2b618a4dd965ce133592763b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eadf36b1baf942879b0b5c45469fa05add1d61b3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eb203eec55c1da2fd38977032c79ada414cc914c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eb4e97f22f12995949c371f2df690f68f71070eb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ebff1a1539630b2f7b5260a93ea602372e539366": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ec184f693f222b3e48622f5253c134339e7e2e7d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ec318906ab052a41ef13ea33deee554704a307c1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ec45f260d4d758d6d23ae0297a9516190d935a5b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "eca2fc261f07a269c2487e6d1b0539d0950ff792": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ecd38089d14a75b93afa634276bbe8965f5642dc": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ee439948c6dead863ab2ba9105b70916d45f9e79": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ee6f3914a1e5d955fd62a29562ee0ab776235ff5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "efe2a6d8859b14ecc69baf66dcd47f4067df18e5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f00d30ecf763691115d2314d14ea1e11f61ad874": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f07ee5b0729c565f7b57995a108f94e4fcb81558": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f12be871bc1a1f3ca254eb027786085dd79494c5": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f134cf7fd6ed2e962db26c4b3d99ee5884102c85": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f191a9c00fe780f63cf4f68a06e895bd53981254": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f1970ea5af8456fee42cc087e79bd5c6a6efaa87": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f25da1517af0e2fce2b9d75fd964e8827cc0cb72": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f2866fb67103c69f10edaed228d2dd64b7e6df83": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f2d923a66a9684f2268530094ce8e3f8b8cae52e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f3c5a341248911dda9d694ee74bf997365941dbf": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f4489af2af8424c6edf0d0adc525680dea208a31": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f475a28a9649aa00ab8a40af393f1961587c2275": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f48270bfa988db4518f9b1db9e78bb398c954550": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f49ecf0e4378b1957686d8d0b227f83e48e5523c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f4e76b020a22e8c1929ba2163e413385fc0cf884": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f5472ede25cb83dc2fe392b01111133b777709b9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f619381383c69659fe81a10d695b2663426624d4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f62f676443b29c513964f01cbb356165ace54b78": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f735071cbee190d76b704ce68384fc21e389fbe7": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f74f956ea3d122e47f4aa0066b5e3605c80d0282": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f78b2d97c8af245b705c0a19601b95f983e9aaf6": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f78ff2d350615b858077a50ff85b3a9e2edcc995": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f85aaa082ae886506141245ea3b43ee74babca65": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f8fc32491119dea2b7fda5080ef9cf0027590265": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f904cb6a599db50cc635bb70f3c23f056e39914e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fa849bc1ece08222f4bf249ca06a6468b3de5b1a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fa9c2ac45638e511b06ebe051411ebdc2c4c228a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fabaccc45975d14c53b830fd4fa0576da541d22e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fafa31e9b477adf7a26b651aa9913f8664e536a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fb04fd4e715c760c91ddc0f30b000b52203f66a4": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fb5d7c75f272b07450867579978314661c3e1206": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fbdc8132551b0ed5c50b6c0f279097592b5c87ef": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fc55e6958f11444ae56c09af726f2ec57525db58": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fc70ade160bd76694149f3f439f5d4f78bdc483e": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fc86915f4e8884b49adeb6f23a8f69e643d9db7b": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fcdb751de1dc7c5246ce698b4b104016d034cfdb": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fcf47e5c1414303d55afc40c75c41cf42079d560": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd0dea1a583400fc29051c8192b70022d8d92c48": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd5b134edd8931ca2102693d88070dd49fc13350": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fd91b246a065cde3fc10edd6457b9e6c10fb386f": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fdc6c80a86ea555b5de26c3db49a779eea6beb0c": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fe4f48d16a7ec27241b987f3545423291c7cce77": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fe686acb3b7cc09ec6379af828b4b3b638898130": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fe8d768de7a723c23583162dbef207b6dcb4fb58": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fed73d1755549bd523a775e81cf80a1a507eec50": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "ffc4569dfb86db2e584a1138a75747dffb794466": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - }, - "fff1cd2c481ce0fba0c97ef77c79227d3b67832a": { - "balance": "0", - "code": "0x", - "nonce": "1", - "storage": {} - } - }, - "pre": { - "095e7baea6a6c7c4c2dfeb977efac326af552d87": { - "balance": "20000000", - "code": "0x60206000600039602060006000f0", - "nonce": "0", - "storage": {} - }, - "a94f5374fce5edbc8e2a8697c15331677e6ebf0b": { - "balance": "1000000000000000000", - "code": "0x", - "nonce": "0", - "storage": {} - } - }, - "transaction": { - "data": "", - "gasLimit": "465224", - "gasPrice": "1", - "nonce": "0", - "secretKey": "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", - "to": "095e7baea6a6c7c4c2dfeb977efac326af552d87", - "value": "100000" + "recursiveCreate" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "10000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0007318879928543f66b36e58900a870dfa83312" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "001864a1fbee8126e530b9242353d9cb76b043f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00ae33b99c24c45ce086aa9a1844fe8ed55ec312" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00c3d96a0eaddf7975da5c8718c26d65de0de59b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00eb1775a16c0965c299f06a0873e11825f915e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "00eb67f5e410e28c16861fea7a2ecc1e0011a75f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0116be8937cb591d6db17246c91dc3deb1fd0e1e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "012255fe8647bfe207603a62536ac6ae7a230ca9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "014337758eb4abf60a8e458a97acbd8b47fa0c31" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "01619145d576c5b3130eeed16f29501f2773c958" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0177fee01c15eede3b794e761753c1f6d108b7f3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "018b456893203c6e3a5661e7328b5a858904cdc1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0199dd91369b5ce0467b68d57beaf1d96fdc769a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "01b26e834122a942828698305a84789ec47c0454" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02391d38c9b4f03e9225ae5b28230284fa397a09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "029f9045d1904fe6076c4dbe77bd33290f390714" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02c7efe87a470a521338ba476a0eaf7a535c9c56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02fa5c7476f2d423f27ac8afa1e357db95f920fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "02fee10ca6c1ed23e651f29c97a310b1b4dad13f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "033b61ab81ffc5adce16d365458629d9f3482129" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "03b685fb90981f103fde64c3bbb5fd701c84dd0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04308fa2e7af944dd7008a7edbe5221a52e2bc87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0441738f9f0a045afd77a72ef8398475c1111471" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0462dd089e0519c581654520d17763635011fdff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0473710fb4277459429e0c4a862ad3e4b45692e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04929feafa156581a24d8a0bfe8154ffab39fb37" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "04a104904b31f401966da211ef40874d6e97ae46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "05e29ccc32df8edacbc5bd6fe19fb4ca02928969" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0602479ffb0636a1ce0fb57bf7949cc978250d2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "060e7bcadd084fcf19db5cc1ea769550bd8f7508" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "065c627bc67fca3636da49c34994b6efb2adaad0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "06c4341ea63b3431260716e2162ba90abd9628c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0723789d0c7093f6e97c3fdeb1324a75427ca6e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "076ad7e168093f590a74f6fdce56b492a23baa2b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "080e2ae63ad3891bfba9ec5200f4ba383209ecde" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0891a47ead61f684dc876e12d5261ab614d0fa09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "08d19f247ca974ee89d4f988cac4becf7a177723" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20100000", + "code" : "0x60206000600039602060006000f0", + "nonce" : "1", + "storage" : { + } + }, + "098de34931d0d159e2631aee55524c217624d095" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "09957f64c3396f36daa03c68fa6c997eb7903df1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "09986b78d02ae7c8eaa8b62053a3ee78deba79ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a1960fde1fc2010660dc9cdc299facac4502363" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0a9015286f76ca4fbcc33e74e9c414be9774a67c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0b4b7f08623d9b3d6514baf529399e4f1c0ad944" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0b98f3276e76e9982d7f6996878ea5196fda62f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0ba7f30a90b699e3f906bff7599b230890bbd56b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0bec2514a2a40586ec75e27442352d1dd2bce537" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0c0cd995ac9e488544723e3e8e90a5fed98a6958" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0c1e13b0604290abd900eba3fb6b7560b3401f58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0d11b1966fa90191f6927943c476d36fa3a31556" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e0905211a442bb5838d2d6860f4f21e6b9c6593" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e639c40606e9329259d2f945f59dbcc6c5c5cfe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e700a2aba22bd639abf05addbb24c53c3f0f3cb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0e8dab5716375707d97656230beb5f1445e56309" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0eca69ecf3068082cff932c044fe39142ab6268b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f065de4c5c4a842f52a30fdf7b0162594df70a3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f0f333b14cae00e0f74e1de336437d5644ae336" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f2fc64833681664e54ca74ea756c7233a05dd85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "0f8f271215cf51a0646c8a60ed626515b3ddb739" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1039c22c55420b0d7e65e6e6e65798f3f4c1e725" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "104f577c92f14f3684c13eb179b9969c05115604" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1057c6ef671b124fc14b5641c167c6e6756d8cb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1121c3fb4f490140339dabac59a62dd59a9912de" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "11895349d40ea4683803f8eb7ad1d2355ff906d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "11fde66f162bbb0e19d68f0c774c997d0165fa56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1209046d7bf46e81d8202422e630719c906653da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "120e38f3899a4e2f9f848a82c7afee288d14e7a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1236efbead5ada892f61e7e4e59faa143e3bc01a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "128aabc28c928691ad3415e3c57010c40694cd6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "12eed250610e4d59e841381dc46deaea3d9305b1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "130d08c2381d23796ff403d8f1fbaf204d90e3b8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "134c36c64db09ad23fde5b43a3a7a92d84dd5300" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "13911c90a6ddef5182a772116c1d9e98f27fb1af" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "141182812579a73e13dd878d8a94bb628143b097" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1456fa2cf6376b40069504e491e64aa40484fe3f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1480213270423eae9d6b0a603541e989998453d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "149d393bffe9be2336e7ffd6a109f05318dc798c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "14a76e43bc292a0e69bace56681c4eb50d8e52d7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1555dfd05f003c056dc219415443be1a502fdee1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "157f8c66dd3cae32485b2d68a51c1dd7923bf91e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1591af76c716952018e52e54c716e8b2226d494b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "15e75e648b604b0b8028f7955647eac6bc850088" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "161f83bac94d326e2a8debba84379ab72a14c6d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1622e5aa3015448c3a7560b15a289d9aacc5370e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1660ada72b0a07040df8d063f2f3f3fee891f1d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16c5f61453cff59c6b7e2a690cd902b72208427f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16cab73035afa73268745a3c2937b551813c4960" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "16f5ee37c60dfd70f8281ac16cda47d665ef8789" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1756aed6799c904988cc7a1dfabe77fcca058655" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "17c7a85a071c3dee708baeaf56c208752c362e56" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18500d6a8e3e20ace9aeb507c213b6261b23f5d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1872142d84f7023b181766b790a4487f4012527c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18731575d0a6339f6317c2a1b628d8a4c145328e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "187749fd89567f9519f0d50b4a19ad2600440e3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "187dea0407359c9579adbdf1ba9fad4a92fb358b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "188921ab89b5b8bcbe443676626e6012a1ed7dfb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1889f5317912e414fda653c710d2c17b7d5651e2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18934934c2f7d8b6b645fcc90460a966df3a716f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "18e0cdfc5a23465cfb3566091849c044d2210b55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1a6bbe5380998bea238848b7a5927fa87e7b9fe1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ac3dd6a958d88e45c2c55d938dba74fa892084e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1b6ec3b2772285abeba8f53839fd96de995c4bd1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1b8a6f09f8fc9743b59ddbb2f105034e32262552" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1bce33a58c2741f74daab60067f759e9fc5f8c40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c2749b3a6c574b21622761bef7274261597ef2e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c32901c93008d3e09928bdf3385f32ecff9500e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c6c53405b0eb8800a527cc5990fe3b259b50a4a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1c827d36ec915dae96fdc0b164fb7bc1be9467b6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1cd063768378c77cbcb93dab0ba4c345d76bb0fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1cd52bab323ca2180a747d3c8b8405397003feb9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1d3289a828d2bb4a86cda52b7772e2d0d508bac9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1e1505a86f6b0fb5f7a4500cca953462cde929e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ea264b74c8f6e50586097e2e7c9a39419fd88de" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1ec26f14651cc567ce691ce83ef09eced6b12a6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f01dbf8bd02bed14cc0a21831e044faa3f66fca" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f1960aa296fd1f00ff131357138001afcd858a9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f5cdfaf598bd8002997b576e9ba849636c8431f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1f95c6da6a9e0abe74900ec00388094d32d98a42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1fce5879444d729719c03b5af6e074b87a49d933" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "202474905af37a5074cfbc2d2dd0f2f205a099ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2040d98a367ea817f76fcf8574d4df51234eb492" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "208d07e7177b2e975c6b6d0eb3c5566900b87dfc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2099c5bdda1d98ce3b99988d768fa9f812a21f24" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21190aebff29feb773919d8572f8cc825bbf7144" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "21368af8397276e6e4b284fe36f525dd323bd3da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22230d8d10e81e01450aa68bdfbee3c20d969de9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22affea985c1a1ab7007a55e77e80c54111708be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22df73cba33d8fd14fc985fccded670de4041f25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "22f2f312befc07db595b5d9fcbc4caa7ee8df51c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "23138c70217200a44c58dceaa4f5ab06470213a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "241b46962af48709f1a19739ffdc7bd3f0d2c7ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24248d1242acc87dc331e87f3142951a977a3d2c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "253a31b068a402910eb30758704b78c375ea349a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2559cea11e9d8fd293253a8ffada7558c9c4db86" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "25c0d5ce71eec198760c001497350ad83df55ea8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "25f81565c6ac2e22d7e320168222450c2cdf4f6d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2600b9122847ee06e201ff6a734fdcfa74b2be73" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2652f49b5ad98503231b3befe7587c231be8a5e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "269f24e1ae86f63876b0504b7b26e20483fa95f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "26be5205dce0ce433dca3602886578160e6d52c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28313061667479bb25119ca3090cd25c4a99a20f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "284452c049bb65ec77ed7502b19abf699127c21d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28cd47ab2e86fe040740206eb31fe193df7cbab4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "28ce21f7f28c8a546bca1697ada45cd73473465d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "291cfb4b02976ffde7f1f269a3e7d30940367e55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "295882ddd91b2f92c43bad0a51fd0ef7af61e729" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "29799a64a736832cda536d687dd443ef3bc31e57" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "298b8bde7997684bfe4434cf6d24d50ddabb69b2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "299f80e93d68725830c27cb084265d0e634e4f77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "29f147c366199719adcb2ed1d528c4f34c10dc03" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2abef5958c8b283eaeec4557844ff1fe194e6cd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "465224", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "2b5fbc2f7e76f6281861cb4282effb94d609844d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2bab1d9132d47e56f937ef50987cc52c9adddf0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2bb175c167599417f2192d9f926a5c648d17de8f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2c4a413bc345da77b2d07a17313b6d89aef2c2c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2c748f96ae0e6e9b01395e8a73dfc351c46658be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ccccc0744051db25927d850055234117778c1fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2cd26944d7baa6d92eee478960d5778375862e85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2d142ccaa1337198d592bc36ce7c5447da73f906" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2d960addf6048f155cfaac4ad513f46429bb58f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2db5e35091789102bd0019b4ee49bcae42524428" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2dbc14a87a2b5a8b780e460dbe0083d8260326f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e070631694c093a9a329ec0b4a1cfa57e20ab77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e574f7a4c8f0e80964604262ef68b3168fd31ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2e83c90e7fa359705ed2138854a83a9145c27a8e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ea29d9016f2b1141475e4c3c62e031c0a908a07" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2eabf4237f49d4cd44ec256436b99ba41828d36c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2ed524088290909f92ade6d5f9d9c24071c26662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "305773e25e157761c9d55cb7d9e24fc1b953a8b9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30b37f280d6735ee04239de0963b071f83c13a27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30c5bc3861dfc5a70325aca029ab5dcb2d72928f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "30f51302b4630ea1b8bdcac380bd97d78c8f60d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "310782e2f6d97ef0abd4a4ccb75b401a7d348be6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "311f9efa9544b1c8a8277c52e0f1ca47daec8c00" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "312f80de0869a8fed49c8ba843484411c47dd13e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3174a074366bc04bfb7f2a728a725cb01cd575d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "317f31be5e04361b11b97ff2d6fc682030d8cd8d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "317fda8ec45232a8259546a4ca8ebef16338d47b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31a87a9e67b2728c14767de26753f205b793c5ac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "31e7dce7c8469a6dc612dd8c0a1242846d31c069" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3229e332af8eaf358f44aad3a902a6c47f96983e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32a48ace80773ad092de1d9bcaa00787353b5fad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32de9810bbf442f9209f994556bc9a7f7e6da500" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "32f9418411245a8bc6982ff71436ed2de87e3d96" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "331a1cbbb58594c3636c0e54de517c4a6cedc27b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33207da78e5ef3dde6fceab85bee1b5bf717e139" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "333872ba7e8ce9c43e158b12a3d038d06672db7e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33b82c3871bc89d9137c62af099a0c4e5911a047" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "33c85ce982d0996ff7313c1387ab93348a6777d7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "34c972120d50fbdbb38ba536e4d61bc8f995d19d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "352e4ddc3153285117254b1cc378d297b7a057b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3539fe0192009fe1a9d35901b0ba951a59348a97" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "36630619f71ccd89ea6fba8b13099d1483187b17" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3671a99d2a485b30fafa2a65f405b6b03ed32ea9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "36a9d95fe0c701c65370560445c6a80b4e13c8d9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37609ce3799a1b75ea6090da3d014d59e5e7851c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "379ef6dde2bc54ced45146d4907639ee7cf1c8eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3820c20f3f8ee1b164dab460b05a979640a41369" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38450559e7ed9b72c80aa00855b942f9bac1b281" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38479ce52243f1a8b358515a084fb41533a723fd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3867a470ae1d99ccc7af287ed95ea4da4fd49e52" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "387b1112283308ce33f63062a7531e6fe0f3af16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38813e8d77b07f357888ea1a7805ebf52c59189b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "38fe3b47fed5fa6d060bde66598bf5a773b831eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3917f5ac4614ab7d126adf2f5b1d578f2b91c370" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39457953215cb93e68bc5b351d63a8b7fd16031e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39d9b351db53d59af4907116d594ebba910474f2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39ea196ad4678ac786f9ff4ba12edbb364cd1baf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "39ed2d94ee4aae100b111c773d4f3b78bd4e9291" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3b7465c98051ca273d8909857047d5dc5b022af7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3b7d7653d3a7c2712d08bd29668163cb775c74a9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3bfd62743dab66288fe0b993d893a41d2dc3fbba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3c7c94fe8e900964a9885a19e09a4ab80213c5c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d082c9477c05d23447d1682257a9d0ac1f948be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3d7b61ce014d1cb84465f1f908a6a940fd991b39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3da1b91d461c3220510e60c0c5b87be635068740" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3dd6e0baadd05402f490e3030ef1970d884a1caf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3debce965330c2da68edb1cdd3ac380d5ce67b10" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3dff39a90e67e86536dcc8b4dbfac04da831e0b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e0506e272fb9d9369627282cd76a40e4046ee84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e3069deb6f503bb8bf155eb2f89801140831f5b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3e85699a24243e147ec809e30761d92c0d21392a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3edca986feba79717853d9b91595ae61d953736e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3ef5e42a0012b430169dae579f8dac0f6ef5dc38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3f5bf6c71c4fae1a91c1cca72b539dd83762a716" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3f8bd9d9410af417dcc6969b64096380e1a6d0b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "3fde19fb418799c0e1744b322314c17a863a0c9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "401f65fb53496c7746dc6477f6f9d67246965d51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "40652c9cf91678111a21c62d7206ffbca3d47c9b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "40e0cce7d94ab21453c5576f30a598cf9fa80e1a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "411456908355aa037314aa920e8afef3632503fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "41493b8488a0ae34cade12733e8df93a87f3ec7f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "41eeae22551bd18167a31036b363bdcec89a7d9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42ea619ae1a90979837ad2137458d991ea0613be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42f56890357c304762f1c57171cef30f044ea09b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "42f8c6079f5658fc8dc5629b63684f278acb7648" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "43b0edac3c2c58f16fa2380089d841c420a14236" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "43ec9b975f37266d0ff7f044581db559fb9376c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "444e8af4b323407d02a7f96c209b712a65c6aba9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44b329f4eb8ebaa00d731472964de821f8e53a26" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44d13c51fb706efb7394346b00debea9ea46e9f3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44ed3a04032bf3585faf1dfedb9806eeb8345809" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "44f344790e299b22484749266ea59bbcd58e4b0e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4582048e819b7d55b3c6f47e46ef8dd8fdd12038" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "45eb1861d0701efb338468964c2495db8e7e3411" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "462cf0e5071404ef569338a6f0a5b113d64a11a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "479544e8b67a7e82120d3c5d7869b4c55f4a0de3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "483940025f2d36cb32e93ed80caa41f15487ee7f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "48e958f074c27f1d190e69ef8c01f86931b278f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "49a01a2696857efac9ba53c2705ea4ffdeb30419" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "49fc4b5136601d856188898008375b9c1bf5897e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a0ec2620d55cefe3e80960f83ebc81219ebabcb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a1edf2110e4ff29c69b835bdd375ac88525dde6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a466c64765157e1a9dee46e1a26d95ac2664c4f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4a635e63aadc395c1801c73640f256250d209b25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4aebaa9fbdb040e8037e78fc37785f33dc3cafec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4af174d239e86ee19d40026eae04486804602061" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b2c0c38418eb142d686d124ac5fcb363b061fd7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b414d48f3871bc957751d5895c96f090b509bbb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b6dcb9105adc3ccc34c6c180e9e2212c1789975" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4b8558347f669cd9b50f70cb501cdbf05f93b575" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4bdd7615ee906a0c88233acc5816b4fdb4656dfa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4cd33b31663c159fbd73cbb32f616eb46f7b18a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d47d935a3a4a4618c67f337a0075d26d9c1f852" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d4ad735b52df9e88fbebebac2de1ede991f9994" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d7a1e5009218cf5176a313f6922c3ab01d4970d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4d92228ffbe5ea89389a34a7086e4420d61eb70b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4dbe6269722a6063d594dfb65eba1f2a10488963" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e36ffe7590f8dd7fa9c4c03cba3120674814abc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e5cd86dc5f716ebbdf6ef572a369c227986bde4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e76fc5e619a4200846eecdd5545b39499debb10" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4e86f346747b828937501ebfda05b2b8fa16f87a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ebc77b7203cce293550d92b2b5587621cf53219" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ec27065c52d294799b93700dcee6e32778f1b18" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f14a61b9f2f99e50b719f1345e76339f7618202" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f5af8eccb582ad30e2702d07577479599461c54" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f5c55986b93d742d196235aa7329df2c8ae5562" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4f86da4fecade6017d7f15e30d8320446306870a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4fc34bdd654289653ffc904f86ab2f17bad8431d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "4fe8f4ad85487cfe365ca212848f7c970c21e135" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5038bd4d6b5b31100c52c85ae3294d525596836c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "504ba70fca5091ea426c964ac631082e4ad51672" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "50aada85d21c462d9c2803fd3c22beacc61f496b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "511b33319d0f7df487e07c4f5d149b27cecace46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5154569b5138f7c1b77d4434860a92ff5707e047" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51a578dc2949f3881535733a5b1a7b5bd308215f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5216a59dcffc6105f9b58a0b397baad604c0dfb6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52b774b5fab1f557024bd4a7cbec4cd014b81557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52b90967c04ab8adba7c6908b04eabf2c00bcf82" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "52ff6062b4e65231065d5579f870b7f1472a5853" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "533069310b9741214f30aeec58be9d19f40161fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "533a4a1adbae2d561beb729c53e46251ab3a407c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "534d2d9ab80a99d598de600ac2843f751e8bef3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54819bf1efa86437d2f38b4211bdd5229247d9b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54a1706bea8f61e354b5296afa5a9f488f88ba0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "54d1de66a65ecf30d79037a8c8af99c633113516" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "55010017736ad7e8e14327cf0230ba4c6bab0450" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5503d35e96e76e02db22c51fd7fd3d5c0667c885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "552e158ca0fbd97f7b3c6208ad3f956a67c8df78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "558fb0163d7794abf1b241aa4728390028291ce7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "559bf1337f14e89aee38a9859ec9bf8035e8f6c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "570dce0f67e367a085e51a47d6c93891a82d452b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "57cb48688d626a12fd4caee130b11e1b06ebaacb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "59ad59b53c0d9bbdf0ee0912732baa43eacaae99" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5affb7ff218092cf60bc1ba4b32ea65a32cd6844" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b1718e3af89692315a673b5c134361408069b00" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b2ed45c5376c8359479e1b48f8c07437ec78336" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b4615bc4b0f10948e46f967ca6e64cf91a7753f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bcf5f7ba278df5a31f48a5706e69816727a6e9b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bd96b317d4163401c9b1a2271c03b9439e73e6e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5bf1ac936d2312daf08e481d85e99151cdfdb9e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5c70cf636b26ffc099fba8ddd5093e95ca8e7782" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d07bd78606705bb5c62fd390123b4e45f7d74d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d11f35386d10cfa7121b02056d97dd932659943" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d3292b79851f68d3907a550dc1a0b569d603f66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5d57e28e16bcf33b37672eeb891b29c481e89120" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e0ea0c533298d20ebcd19482a8b1e1854dda425" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e5a0b9c4c36067c8730abecdb29ba97aed877a7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e76969932c5d314142b23c555af4625fa6b9343" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5e89d5dd43fa9fa54381f234d1f7251387a0692c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5f1703b93938752face6e4657a90825b77f455da" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5ff4d4daf0a832422c4675a77720abbfb5afbba8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "5ff4ef866c3ad4102444d020c1d21c3d35a119eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "60a2db26238d52510209c569dca17c1f41c9a544" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "61144e43a08b3852bcd531d13f0485743bd835a3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6123d3be4335107712685be2d575958b17501067" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "61306db8b4ac256266cb379b5f686e25cc117590" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "614037f9a7be1ab2131d485845f297f2d62d569a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "615a957b818ce70fec123daafe552c482c59c5a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62123ac69c46a06f7e3644b0dfcfcded535b8727" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "621ada91fe8f65407ac963de8e75d88d4c388cd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "624a9bd6345be1a95c7fb509ca4bb77d05138adb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "629fdbc407b70b57eaa1523ab12c5178e81a5d52" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62cde2103198f54d31cdb9e9495fd7e1243c2c27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "62e75c838a732abab87e1846f361721f03e7d973" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "636b02091904e5b452d19455f484306b8fe62dd6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6454029b19b69bcda3ba156684d58283636dea40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "65e3776618742b90f1d9844c907b276854869abc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "66e68e1d0f65b4379c2864f5228d98de265c5e30" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "674840a9e918ae6b7560a4ddfb60b96a32636ba4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6792d18ead88bff9193e50fa12c02779f2a0f4bd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "67a66435543da4130940ccc47e3d9d164db65fd1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "67df3bc5f86456f2bc57f75c99a0389bca7e5850" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "689a40b4f540d145f6dc4ba4079e17f84b650f9c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "68ec6ebf20b30a31b09c7a35d847da342e24a3c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "692a1a4da0b418dd701f5133e2b3c5686015a3df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "697f8deffc4b33738f1dc02e792b5cb4a37ead06" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "69afd0683057a214d3bb3cc7d438961cf8c8b200" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "69fd2b9233b83e54861436496ad6b9fb28afaf40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6a22049b6339e13438521842386a7118d6a1a15b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ac56f1ceee102b85819d789e6b29308eabc373c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6af2602221d2477af828ddb2c1dec8f70a24abe0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6afeffe32a56293f23d655a1d1b2bf31d616c2ea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b0105812868d533882ea4f08bb628e5e9d811db" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b5ced188780878d8a72b3e6f02618db2bb97584" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b5fe85d1513c1a29fa825a343db7a80558e6de5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6b6945d5fd5172355825871803b93e57c5040653" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6bed38b822d8823a2cb71883522f932cdde95b0a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6c14bbac448312636b86fe713185cf7d8ea6f1be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6c3bed6efc677ccb136c0d886a6f3fdb375798c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6cc6da179301a7ec4290cc0a5860a42ad188399f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d27b8cb6b9af8a56fca98f13033d15f10f66da4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6d9834013a85a25df2e3dead1986d753457d7b67" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e0a20c94065e338c7715046a320ff4495b4fa84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e24d18a80aeccbace499b6d26b655633c0bee99" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e2da6b24262f419933bd63b03d470ba019350e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6e53f8efbbec77187f733cb053a53a28e14ade81" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f257471f06ece199232aaaa082d2b1ae7ddb483" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6f562b4994dff65756e316febb8d5a5b99e11420" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6fc7016fa33af287b3b9cacd092c26bd9a054569" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "6ff9622ab3c22e4357e90274d00291c527991d21" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "702433f6bfbd76274ec1bb641c4a0428298487f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "711b5163728968ec016a924238f743fa04f2d11f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "714213a080e1d2988acadbfc5e441df5173f81ba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7161527e54370ad8fe44bc83d692b10b9f9b877e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "71a2fa577619a37c2e2336bb6c20fc1af193860f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7213c423e1db8af095bd3cefb15e43c6067635ee" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "723bce7438e7c70d113e954e9aad5dfb4551dbff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "72969d083705c924922b857922930f2087426ca0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7343c0aaebc045465ffebca00e201c1f554c2eea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "73f9912db6e86599f256f090dffd915a845a9631" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "751c9d6e9b6d91897ab1754b15b72712953de9be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7528088649b574b14d14f4b5ba45285eb8a78ffc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "752e929cfb45fd739923f562b146db315b8cc4ca" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7642513288c9da66960a6f3df0c156a8e1dcb119" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "769277251b9d3f0906a338f156238b159bc126dd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "76ca5805dcccf57966da8489d1720fb8c5dc4b81" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "76ea1b9309253b5c03bbd6e9fca6591b51fb3785" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7702eec59b0ee531bef08c14d0e6c89e7e43ebac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7797a5c4bb655b5ea51bc966875abb3b19c0d105" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77d724d278fa787544189c4774f03849be2868ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77f14e248490de6b7afb327c0f013c54ae31d2a6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "77f263b8c785ec73f9f77dd11ab64fb0089cb164" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "784c21d8eb231135ac99a64dd2ee334b045043ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "786102f7205ad86bb77b14a1b80d8b26cbf3562b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "791812110230af4583a4a6dff7eb425b0b0dfab4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79225179187b35144fe9e8505cce2bcff3986ff9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "795d6e09eedae3febc172169c017fb67aa62efbc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "799dcaea1d20bf1428807757a84d6792798b74cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79cf9a7b86c0a7adb03ecb8967d70413f21b925e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "79f2d463ce2404b3e77db5dea5cc19d76ac223dc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7a315595e01d6e16134063232a01395187c9650e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ba53872256e6762bbfdbefb1bb80b26f94df9f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7be1a5856ef5951cf1991b57c00f73939c7030f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c26d9c9b73a75f1a468d06bd69e08f4d316845b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c41aaac568600537f36df0e35cb625dfbed75a7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d3b079a8306f7cc89f1b9b23319ec904e3ad853" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d4e21638e756b9953576f460037cd702d10211f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d699e5ea61a26a7f677478cc79887e2f27ab345" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d8dde5a13af888557ddd5b931dda20ae59e9e23" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7d8e57afa6550a1be621fb6c083aca311a1e229c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e2a31e29b84cb193202609dbd86ebaf9a83c119" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e2bd10d506af5eaada030590c8073495230f37c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7e9f915d9417cd7bc8220546680fa5eeb73a2192" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ebf86bf849b6097c8af6dae10c52438538a0711" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f16eb03b09934c61a424e6a1c4649f193d157fb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f3d23738538a34184e3cf16506685cf0884bac5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8069a4fb09d35f100d18c98d02ec1bfd997bb893" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8135c9c23bfa97243ea79214772816339552f835" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8142cb33b22222bb9e39a66b53af12c6ca0b5375" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "814a465f554f949e6e2a6878539c705f319c627d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "81b26e12027f5df776edd5539791e683dc2e57f0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "82afbc3f6dba388dba71ee35f56ea772a53033a8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "82d03794122107972c0d075f16754791224b507c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "833bafb51e8a34c93f3100430fffc5ba61ef95c9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83602911153c9c176419a17276ada844bb932527" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83802f999d793e8985b916465ccf6050195c0167" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83abf69971313b011ee30466e8f703a460400557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "83ed885c9759d5524052681a5602616a4d565e87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8405a655c77ae3ebef4410c924cba9ef22a57f42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "844301835752f15f39550cdf531e07ccef5d133d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8507d90ee605e59469a35fdc78e844c59894e003" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "857109cf04811d5273ec3af3f3d3bb56e93d1dfb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8692f270fea1b23b492dea1755f48cdd1dd78534" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "871986919b8ac4032193739eeae09c66765f0f15" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8719f47f3dd875955760868a4fb23f761cf7d4ad" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87946e396d4fd04d02f117adf25ac427895878b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87b27e4b436adde9bf724b4889980331dd038d49" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "897003bcc0313258e7a3517771982e05e4cfce1f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "89e81283794cb458b9590002ce69ddba3c976a42" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "89f02008028773d99248943a6bcb14200f4509a0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8a05aa8ab787526a0591016c2aee95037b8a478b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8a2cab44ea3d5c52c704f060f4088e505791a57e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8b0c28ef1527a918fc7dc134ee6c00f069c7073a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8b0dfaaf9135721f01f3712572ea9963d70f49c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8bbe1ac3ee5866589a669dd95744af5ee83e1b72" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8c2e2a704d809931e711b89162391f2dba837406" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8cfda5300d7544327e32aca175840f90860305e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8d7912a42951e7201c8854b98a36e4203508c3a2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e1320b630d8a411819c16dc0edc2cb77ed8049d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e15b61b6735457672c8d4809e30ca7877e9fabd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8e4354916a56d367dd99d3eb120e27a1d8ec6e66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8f55e75b453fbb3071e4454119a33477c6028788" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8faf239455a012d6ef377a83448c8185466f8511" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8fb5af158980be77e5d137ab6f95000407041099" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8fb5f5dc4d66ea0233a652230d44299718cb9f9e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "8ff9fb732fc13f492704a9f47c47db4e877f6dc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "90344e80aead27d6b007ee73dd8fd8169f870f51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "90f8d2eba99d7e50525edae64a61a28526eef894" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9137343457792227d68316f6ac0bc3518a7702e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91acc7d4c4cc7affac116157a53f5614959485f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "91c87b19dcd811fc5efc567a022bca52d5e2e252" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "925cdeaf40df0ac82648432e65481350417fd848" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "92bbf48cf4a124ffff047cad76c82db1a1889803" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "931543d59701f1a123f3850e4c6e4b0ea097ae5a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93840036a3c19b1e91ba0ea10f95a5041ef61a3f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "939023fa69f246b709a97f16c37367e36267828c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94602cccae39d50fdc504869eff546d1678f0ae2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "94cceeb51248e76f0fa711e92986ad36208f6e93" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "954933598dcf8e04d6f4ae5b311673409e85c809" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9580d4c2c6795fcb1ec84bf6a58b873fb2737788" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "95f36953203283bc9358f396b627dc79480a8ec8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9606aeadd83c5da2a613b0e132f0a6c13cee43bf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "965025b3b611003c82c8c9b69b35b4c5444cde69" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9663275f953d54a345f3dd00e2eeb0f156710129" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "96f4278992ff6da5e8e60456279d9bc5d1f7a845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "970e2fc1f55b1e2b214f84e155ae6a9403f891b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97316b1fd92c5e6611acffe79899064fd9274c8a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "974beeae03d1860c485c0dbb68e5413317770b16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97a3956189161fe3d52554c2a599bb619983be5d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + }, + "97b61770815f0589776243ec8ffa365b86548b28" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97c99c7f158206d19196df8d21573126569d918e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "980410833d9ce53a0f944ccc629032fb0e6ae6aa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9848ce910f5874ffb5cad5fdc3507e8d54fd668a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "985e84916da5ee358e1c119c9b12ff133da52d29" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9862b64181c8bf5bd53e51c5f596528ff82bf652" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "986e30c8512ac023f09da460202322a88e98aa66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "987600e63a25755048e018d1976d8ec4657f359d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98ae7604effcc8bf6accb109ebf78fb6f5dad01d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98ae76bbf3fe4b779df55df06eb0081ac95d660f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98b163f2929e5c92709759e3215879acf32a3a98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "98cf6cec29c58634b6022fd1e8f54f912921eef3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9917620c3df2e3cae0f0e690b4da82221bc26efe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a0ca249b7e4f00f62ba5230a602c3233895cee2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a0fa2b2dd4993b5ac3370b4047f5e4472121674" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9beadb15fd4fe1f0755ce82dd160e1a798544a1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9c5fc050311de43f7b7d9a66e8319ad3c051a252" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9c89251856283a8e3aed6d801ca965fdc1da4aa7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cb15938a825ff7c17ae775b6454730983522906" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9ce1b776e1a050af28b1034980a628b7728b0831" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cefc7e38d2a714318e5c36c3c21b226b10218e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9d0e24467eaf9b797b9e3f6a6084958889592ba8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9deb7e973e3567140c51750e92d7c5091174f506" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9f28528f2db498c3a0e79b15b97d3b3e9357e942" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9f42a00ab7bea15357b54e16867383fdc02e7060" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9fbf90147bf6ca022818372bf38637738d553552" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a015c57718562f3839cdabd7d4e9c86f1a321a1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a02b80b54ccc306e042c286172ba903dd53fa4c3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a086d90b189bda22a2ebf3e9b7092f1782e4fe84" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a1230890b4634e4461d6295fef3b4ca6d8899bd4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a1ef404093a02445fe14243e853a641c23ecaff7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a24089bde6e39fea0d157ab9aa4173882e62f39f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a2442dd71a4e937fd73ff383067f97ad4c83b4a1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a301df371257a12c7bc93194ec045d211a2d4359" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a318ee3c41da839fa1002dba1f9a140274ce59e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a31b0038c42665206876c410caf02e67405dcfff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a31be87c0ce167d8e9380a34c7d5004e42f37840" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3396b3bca8473c21f9ab1fca8a40ecd580bc625" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a3ad081c8f3b79ad20285e881e0e4d011efc012f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a40a11c1f943538e64466de3b3bf8c022b883094" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a479aac07f3b83ee401944a36812d665f54ca6f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4a5e07598b0d6a40fe62ca88813b63a1c02710e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a4cd6039bfcc6295533a985631a151bf2e0e8b21" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5303b50e97dc17384209bdc3723ddc6eda7aea0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5552ed8dae24eaed9346af3186f634d38ee9aaf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a5ec829bcc187b6d19e825b5b6f12f86f81cc063" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a60724458ce6cca04016e99826fff8c99c32e3b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a6495f085bc30ac47e89a9a700e406e26286c3f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a65929129c13f2405697b704fb1c840987ad36f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a686b20553a38e866228ce003657a71200957c3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a71525ab6694ead3c1be0aad07bac06e69192524" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a724835568fb5e3986c1e87331a18b6628b73e25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7547a96b2c999509ae062509a0d426fa46ade62" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a770dccb354eae253f170825000386233ebed231" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a777e559211613e73d9d0cbcdad62c88957d6f25" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7aaf603309127956371841badc44b69252d142e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a89361425f7403ec9e757b5d1a31993a79189a34" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "999999999999434776", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9ed1d8a969237243d26f8728287cb3eb8730662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "a9f73dca799231e385ce5038c826b03eff0d1145" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aa839cff1f78242d01a33305e1d9973cd7c66d4d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aac939ac7c11bbbfb7f4520d14442a2460a51e87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aae4f6978a8eb4a7be406a2a787d31dd49cd551e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ab118214a2227c79eab2680df0a96d0ad67dafd3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ab1b93b6a83c275972ec2a6b513c3106dda84f47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "abf67dec2d1ec31dd111c2f1135818b6af86c662" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "acbb287ca3f98d4775dce56e40ffce57ce4ba179" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ad02a5cab29480ea5b67e354b0da540082500327" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "adecbe660a4943fb6feada38775e51259ea15af1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ae17512fd9edf51989081b42962b2fc85de4a2d8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ae5837876e23fcefa0f204d7b6433966ebb854b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aecb52facdff422fd67875967e9278a7b872af32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "af3cf705624b239ce07280597a55dc8ca69dd086" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "afbd8818fe046adfa468ea58a217b83f7d5e75a0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b008af759b5359810c78d181f0743ed85c286116" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b021f73dfd1500257934aacddd707e6f67173edf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b03a2acc80fce6d54bd1db95d7ff24123ed6e106" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0a10fa71a1c4c621345666be094909ac112ec82" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0ea2ec7623a1faebead30c8007b260a4c62f99f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b14b3e0660d147b2603ed92fec4ff337e3c259df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b15c7770a476be2c77c3bd50d60ea6b2cde3186d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b1691d2608aea9d7a56083dc7dcbfacc93a4287a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b1ec052c576186de285bbd31164de3b19a844dc1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2c10a1979ac6236e586ed704cf9dcecb034b8b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2da69bc3361eaf80dce81a17d610217ebbc7a17" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b376b876f7137844ef5e2db1e307713885ee5d33" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b39c8c3ee619a2946cf540cbf16720a881110f83" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b3edb875f0dc5faa556edf77a97e53c9d828d146" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4429d6274f10ef0b7ba30837c5de603ed4c16ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4481bed4acdd11d8f22f535016a762cc87845c2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b4c898e7d827a75d991aec0a837c23aa8d9041e2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b572b99fc06b16a232d74898e587398d25d7d33f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b6367a493bbaed7334456b3646e4541c9e96012e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b651decbba52842e8fc86afda1168ac549dea7d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7650fa902a0ad81e8d48deb557323bfcf32efdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b78428568fc511f4a6ed34c2d57c4e104138ca98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7b7c5f65fc11a6bee686b9363884811be247c43" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7c425948402f9382208346ff48ef6ac4667baab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b7fbcbcd3389df89233f8bf6bfa8acf892958a33" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b88173b953f6c1b613b6e878cfdb34899e3339ac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b8fc89fa4eae09e1b4bbb51f4c1791e589368801" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b9261902783bf36bab49f18323a9c8e4ad86519f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b94d3b46afb9954a375e50a6fede26705800a057" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b96672ac912cc5ad6f75157401ccd9003512ffc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b96982fae6a70aff19c2d99c3b2adc57b151d784" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba158ff71047c0322b1474461f94c0246d0dfb2e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba3adb3b7ccccb748a65932e0254e52ce092c5b5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba56f0f804625c0ff8b7b119bd03af0a10b5886e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ba70f98f64f041290dd6794e5cbc9e8144c8c914" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "baf332c908b38d0c5e825b41a500525fa990b0cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bb26680f6bb423720c6437fab35913d0a86e2a78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bb7a0556525b43c750e380a0ac1ca3bb719e601c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bbdb82e2b1ebae617370e1c27542ea087a4fa937" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc2929a7819bb70f10676f4bc004fff40ce5a52b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bc845b8623c7af6b07eda7a5363298989cc007db" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bccf73dc6498406a51b4183e22c4be57de5c4975" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bd4f71cc4a8facf8612158e418fa394cabef27b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bdd290243af494ef27e986a3cc432ba3f873758d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bddd1619fd3c4703733b1648b7db0ffa6dd09a19" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bea830535682332041ad318232044f5e914af083" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "becf51bad165c4b8544ecc57c7859ee946e610df" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bed1a42fdb56c7d562a773650bb2785737caca3b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bf36bc1d23eebe66f84a0f119552dc7b46fe2402" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "bf574eebdcc7ff3617200fe07c8c7154a8d129f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c052f8b19df2c41d807bde1c041a8ba2e87f15d5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c071690916c15657eba376c7c6b4b06d38e815be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c07b721215b231d9820dc8d186e3dcabc6c75e66" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c101a7eb0ac863e824eea705432530c65aa0c518" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c1ab531ecade623c0c908c1fbf104fb8c647a37e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c20cf04f10caa057314759a2908524925294efb3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c291bf92ff9bdc0e60f049e6a5b143b940658857" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c2afed79b83fc6b8d98802f52b1fea6648571ee7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c30727a70f64c82d0d8837f1b45b931ebf80b106" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c33582140ad3da6d7fde2c3c73d0530cbde93555" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c37d1d79868b6a4c25db68301b8575ae4a8336fb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c3d826f0bcf2d353afaea99ec55eb9162438e315" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c4170be517e6c67a9e65dddb09220df58e547102" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c44e39eed84adf0c399a9d5af8d0053715d0f5f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c489e22b54124b98b17b68e7c38676efb81c1862" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c4be49d4dcee6efd96c35ddf346b969db9981091" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c57abf0b9724f82736bee2a05a9238a45de5512a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c608a6fa0f9f3a6af68270740ed6c998e145eede" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c694bd4edd4e806b9c7d4ad742a3be423391470b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c71253e1b049c2b5acba1893c74007a26797e111" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c71abd039da56d4c1d783ed06a48adf0808e9cef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c775193c9d81ed6ee806f6005a874b927e96ff19" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8732f022b6c57d291b26c830c651b3617c75b2a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8b331eb5ad444567964f34dc24757bdd3425943" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8c3cf855531e1d06c07245e76c5298b4fc90d8a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c8ca05f5e8391cd5004c3c4020e570ed4a520c20" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c9113ae38fc632738ad4722046d8e07ba9363ca7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "c98b82b246d3eca7562ae19d8ca605e77cd53a3a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "caf720d275e228b58bcd8b2686714ed8819cdc2b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cb5e208c02a68f2d97601da482c419af989e097f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc0302264a5d0f269e26ca3ac24d7695b562b4f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ccce4f34ac3a550c95747823a00fecce349734f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cce1e6f23dccba1aa1830b1b7714fe985f9f2032" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd1171381ba62ff31b56a001b8144e64e365eba1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cd5fca46bbc468b84b493f7b52ff50386b174d40" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cdc1f2aa2853b37723f415aeb181583e11ae7b8f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ce20ac750c9549b466d48c90352a255f6b7c8294" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ce7600131bfe22040ad75febed54cd4ad181276d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cebebe455b6a15d2e4705ebe51fe5007afda76eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cedbc4eaa94298536ad368e8ac9819c5e7448738" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ceee86e99b04198c09fc8ebf3e2f45253bddeed5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cf3f58bfe41401084fd1e997e8e36dfb35e363cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "cfb86844738d5373ad23eb3185e1e9fc5d517ae6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d032f83c65a584f6e47f9fff9bc864d51a164a94" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d09a49b1cdb208e2504486267ca2418c87152962" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d0a97217cb0a4211e28a58222c1b038c44a3f211" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d10afb219e80a211c9072b18de0ff2317f67e573" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d111da05d7193bc295a4956543810071fcbe4238" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2468d6da54259507d07f74ef0a246f97e52f035" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d25b7ae72c049f91091a4abedc4d618e5a05e1e0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d269786262f853ed769ef3ea9a7e5b98db3bfb32" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2a0b130c0834eb0ad2717ad13233242280a6fd0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2be9413f150b2eaf2666b42ee719fc66e5066f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d2e450aa145ce97dc054b1bcf391407fbf202bd5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3a4f3cc7113eb16572eced68ab395a40ceeda1c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d3c1c3359ed1906851379272964b7d96e2977654" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d49825eca3314ad0c5918472615055010cf4a4fa" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d49daab5099319cdda477f5ba715ae685c031db7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d5144e55ee02feec18f2ff293f08b8379d1509d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d577d44f2748e151afdb1ded254c942ca9933b0b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d65386ce109ffa3570dd27e54f32e2528fe01fc3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7409d185224a0284e7451923e3d094ec309ef92" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d743161f0f7beed30155e171b4d577d5ce2a70d3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d758e9a701769fe9e5a80b3a09180e7631866f55" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d79995f1fbdf19beff429a94fa9dd184827c68c4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d80ba0ac6edb71367c1634ae5bf72970e596a99c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d87693ae6d35928467daf90aac749654e9c57644" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9860a22b84f982363ab9684d767a347a5c4fb74" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d99befc655ecd5df508569aaadd729af7371687e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9d8272a3b205f71494f9009705f4f30dd31c607" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "d9dd1aa8519580888c402dd4fae66ca68b4a7b47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da3580da73b2986fe0da9b6caebe17818b7b3645" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da5828cee8e61bd0d8af71ef5da9a7a9019ade13" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "da7555a43e7a3790290cd20a19ec19032e28a6dd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dae44ad9bfab81783c1dd591ebe3409fa8967883" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db06ebb361ef006c17f89ad92165185a38f6e630" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db4ed990c69c3b67a04a96ccf079649facb9c433" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dba37eb3483100bc89a7bf11b7f110ad71ecf41c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dc280f2887ea315f70692eb247e399b18a07bda8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dce512ecde5a4c27da464f846e71c8272da4ad80" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dceb9854f220556f595bd655bf6c023457341e4a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dd8317eb76e8949315e601fa8a6959e2ffd277c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dddb23bf0a55d0197810e062a5a24a1503705ae5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dddda651d375f5352d2ff488eace1de63b6ffca9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "de63eef4b269d8572b6b00574ad8e34c471a07d6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "df50b2ca876e4174d276dac0c64e644cb1b5a118" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "df5767dc4d8111e8641198f637e4423c62e57e27" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dfc26965c20fea217850a28c08021f1468146101" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "dfeb403cff0aabe20cb07d8451caacfe31260132" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e026a4835edf27c2705c97f237e5b59b7b5da1f7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e059d3aac9a568120467ddbba3e4d25bbc82dc64" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e089f14df5e00aff3b03cac5e1236f5cf5832d5f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0a1885b4057f65dc75636f4fb0e4b57da82429c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0b3647d7252d53d397fa6af6d9da4749f4caadf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0e5744863b26418baf12f94f0bdad2ef2546a92" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e14b8b08ed9b569d2945b078fe94225924c5987e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1e31732ce0075070c8d7e2ef7a44b93949493d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e1f79aa1d6477ffd08d4e5ce185637434147e4f8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e21b2668bb1e9cf057606c44d49648f1c140aa76" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e24778b9ec00cc9bef91643e31885deee719207e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e28a959abf1b36ad7778737d992690cb73a51a91" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e292ba16ee32e94ba88b4b72821bf90fe7b1b845" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e2982af9c977c39cb4633346b916a3897ffeb6f9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e326d4acceedb3e572b98d4a45a6f1e37ee42501" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e32bec776748185042cb02d58fad1d5027bbaeff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e3443d812bb8204255a1d249b82aa19508dff5c9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e355b484879e20943aca2c6655953ec8121b64e8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e365d9256480b1e9d3cc6eafdcad5912b75ad149" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e3d08fe78f595bede290f820ec0e878572803a6a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e4028c8f2888697e9939562de475f70a841ee713" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e49d92946422e69977a94d1b4b769f97efcfb8eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e59b406835db0d4c63ae28072c64c664da637557" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e5baf7303b008f333c57491345e604d52fce0d63" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e635349c1e038d62f774f4201cbda082b8af403c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e6f12dc0baf6536aa75f226bfb0262d8266433d1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e703236fc6d1dcc955b9abf34f490e2bf5057fdd" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e74299a026e8a481c1db07e6065ca30af9858cbc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e75900e645ce8d1abbb97d408989b159b2a50a1c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e7b8aae66ff70d59fcc5a8b4de5a246081547146" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e8373e7e464120da8a84da82c8137872cda65780" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e908278cc1515f214049c48c3a8908524f2cc407" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e913f5b697154f99bfc159a132c6c253b457ef18" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e93e7128f80bef53e3217782f21f4bd6a6d19c7c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "e9d157e81c306452f8494f681813037b146660eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea186a9a4815581b71403480abae5cc7c57c00be" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea216bc75a65a838ea3d63f7c05588c2840ec1ab" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ea2f1211c66cdabf2b618a4dd965ce133592763b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eadf36b1baf942879b0b5c45469fa05add1d61b3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb203eec55c1da2fd38977032c79ada414cc914c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb4e97f22f12995949c371f2df690f68f71070eb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ebff1a1539630b2f7b5260a93ea602372e539366" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec184f693f222b3e48622f5253c134339e7e2e7d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec318906ab052a41ef13ea33deee554704a307c1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec45f260d4d758d6d23ae0297a9516190d935a5b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "eca2fc261f07a269c2487e6d1b0539d0950ff792" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ecd38089d14a75b93afa634276bbe8965f5642dc" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee439948c6dead863ab2ba9105b70916d45f9e79" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ee6f3914a1e5d955fd62a29562ee0ab776235ff5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "efe2a6d8859b14ecc69baf66dcd47f4067df18e5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f00d30ecf763691115d2314d14ea1e11f61ad874" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f07ee5b0729c565f7b57995a108f94e4fcb81558" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f12be871bc1a1f3ca254eb027786085dd79494c5" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f134cf7fd6ed2e962db26c4b3d99ee5884102c85" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f191a9c00fe780f63cf4f68a06e895bd53981254" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f1970ea5af8456fee42cc087e79bd5c6a6efaa87" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f25da1517af0e2fce2b9d75fd964e8827cc0cb72" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2866fb67103c69f10edaed228d2dd64b7e6df83" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f2d923a66a9684f2268530094ce8e3f8b8cae52e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f3c5a341248911dda9d694ee74bf997365941dbf" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4489af2af8424c6edf0d0adc525680dea208a31" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f475a28a9649aa00ab8a40af393f1961587c2275" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f48270bfa988db4518f9b1db9e78bb398c954550" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f49ecf0e4378b1957686d8d0b227f83e48e5523c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f4e76b020a22e8c1929ba2163e413385fc0cf884" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f5472ede25cb83dc2fe392b01111133b777709b9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f619381383c69659fe81a10d695b2663426624d4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f62f676443b29c513964f01cbb356165ace54b78" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f74f956ea3d122e47f4aa0066b5e3605c80d0282" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f78b2d97c8af245b705c0a19601b95f983e9aaf6" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f78ff2d350615b858077a50ff85b3a9e2edcc995" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f85aaa082ae886506141245ea3b43ee74babca65" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f8fc32491119dea2b7fda5080ef9cf0027590265" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f904cb6a599db50cc635bb70f3c23f056e39914e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fa849bc1ece08222f4bf249ca06a6468b3de5b1a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fa9c2ac45638e511b06ebe051411ebdc2c4c228a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fabaccc45975d14c53b830fd4fa0576da541d22e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fafa31e9b477adf7a26b651aa9913f8664e536a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fb04fd4e715c760c91ddc0f30b000b52203f66a4" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fb5d7c75f272b07450867579978314661c3e1206" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fbdc8132551b0ed5c50b6c0f279097592b5c87ef" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc55e6958f11444ae56c09af726f2ec57525db58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc70ade160bd76694149f3f439f5d4f78bdc483e" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fc86915f4e8884b49adeb6f23a8f69e643d9db7b" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fcdb751de1dc7c5246ce698b4b104016d034cfdb" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fcf47e5c1414303d55afc40c75c41cf42079d560" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd0dea1a583400fc29051c8192b70022d8d92c48" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd5b134edd8931ca2102693d88070dd49fc13350" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fd91b246a065cde3fc10edd6457b9e6c10fb386f" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fdc6c80a86ea555b5de26c3db49a779eea6beb0c" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe4f48d16a7ec27241b987f3545423291c7cce77" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe686acb3b7cc09ec6379af828b4b3b638898130" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fe8d768de7a723c23583162dbef207b6dcb4fb58" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fed73d1755549bd523a775e81cf80a1a507eec50" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "ffc4569dfb86db2e584a1138a75747dffb794466" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + }, + "fff1cd2c481ce0fba0c97ef77c79227d3b67832a" : { + "balance" : "0", + "code" : "0x", + "nonce" : "1", + "storage" : { + } + } + }, + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "20000000", + "code" : "0x60206000600039602060006000f0", + "nonce" : "0", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000000000000000", + "code" : "0x", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "465224", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "100000" + } } - } -} +}
\ No newline at end of file diff --git a/tests/files/StateTests/stSystemOperationsTest.json b/tests/files/StateTests/stSystemOperationsTest.json index 64915bead..a74d32ae5 100644 --- a/tests/files/StateTests/stSystemOperationsTest.json +++ b/tests/files/StateTests/stSystemOperationsTest.json @@ -5144,14 +5144,14 @@ } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "917", + "balance" : "997", "code" : "0x", "nonce" : "0", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "999999999999899083", + "balance" : "999999999999899003", "code" : "0x", "nonce" : "1", "storage" : { @@ -5827,4 +5827,4 @@ "value" : "100000" } } -}
\ No newline at end of file +} diff --git a/tests/files/TrieTests/trieanyorder.json b/tests/files/TrieTests/trieanyorder.json new file mode 100644 index 000000000..ebf5fbff0 --- /dev/null +++ b/tests/files/TrieTests/trieanyorder.json @@ -0,0 +1,55 @@ +{ + "singleItem": { + "in": { + "A": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "root": "0xd23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab" + }, + "dogs": { + "in": { + "doe": "reindeer", + "dog": "puppy", + "dogglesworth": "cat" + }, + "root": "0x8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3" + }, + "puppy": { + "in": { + "do": "verb", + "horse": "stallion", + "doge": "coin", + "dog": "puppy" + }, + "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" + }, + "foo": { + "in": { + "foo": "bar", + "food": "bat", + "food": "bass" + }, + "root": "0x17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3" + }, + "smallValues": { + "in": { + "be": "e", + "dog": "puppy", + "bed": "d" + }, + "root": "0x3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b" + }, + "testy": { + "in": { + "test": "test", + "te": "testy" + }, + "root": "0x8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928" + }, + "hex": { + "in": { + "0x0045": "0x0123456789", + "0x4500": "0x9876543210" + }, + "root": "0x285505fcabe84badc8aa310e2aae17eddc7d120aabec8a476902c8184b3a3503" + } +} diff --git a/tests/files/TrieTests/trietest.json b/tests/files/TrieTests/trietest.json index 8d8c35f3b..ce5c2d191 100644 --- a/tests/files/TrieTests/trietest.json +++ b/tests/files/TrieTests/trietest.json @@ -1,27 +1,4 @@ { - "singleItem": { - "in": [ - ["A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"] - ], - "root": "0xd23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab" - }, - "dogs": { - "in": [ - ["doe", "reindeer"], - ["dog", "puppy"], - ["dogglesworth", "cat"] - ], - "root": "0x8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3" - }, - "puppy": { - "in": [ - ["do", "verb"], - ["horse", "stallion"], - ["doge", "coin"], - ["dog", "puppy"] - ], - "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" - }, "emptyValues": { "in": [ ["do", "verb"], @@ -29,42 +6,12 @@ ["horse", "stallion"], ["shaman", "horse"], ["doge", "coin"], - ["ether", ""], + ["ether", null], ["dog", "puppy"], - ["shaman", ""] + ["shaman", null] ], "root": "0x5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84" }, - "foo": { - "in": [ - ["foo", "bar"], - ["food", "bat"], - ["food", "bass"] - ], - "root": "0x17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3" - }, - "smallValues": { - "in": [ - ["be", "e"], - ["dog", "puppy"], - ["bed", "d"] - ], - "root": "0x3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b" - }, - "testy": { - "in": [ - ["test", "test"], - ["te", "testy"] - ], - "root": "0x8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928" - }, - "hex": { - "in": [ - ["0x0045", "0x0123456789"], - ["0x4500", "0x9876543210"] - ], - "root": "0x285505fcabe84badc8aa310e2aae17eddc7d120aabec8a476902c8184b3a3503" - }, "jeff": { "in": [ ["0x0000000000000000000000000000000000000000000000000000000000000045", "0x22b224a1420a802ab51d326e29fa98e34c4f24ea"], @@ -75,7 +22,7 @@ ["0x000000000000000000000000ec4f34c97e43fbb2816cfd95e388353c7181dab1", "0x4e616d6552656700000000000000000000000000000000000000000000000000"], ["0x4655474156000000000000000000000000000000000000000000000000000000", "0x7ef9e639e2733cb34e4dfc576d4b23f72db776b2"], ["0x4e616d6552656700000000000000000000000000000000000000000000000000", "0xec4f34c97e43fbb2816cfd95e388353c7181dab1"], - ["0x0000000000000000000000000000000000000000000000000000001234567890", ""], + ["0x0000000000000000000000000000000000000000000000000000001234567890", null], ["0x000000000000000000000000697c7b8c961b56f675d570498424ac8de1a918f6", "0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000"], ["0x6f6f6f6820736f2067726561742c207265616c6c6c793f000000000000000000", "0x697c7b8c961b56f675d570498424ac8de1a918f6"] ], diff --git a/tests/files/VMTests/RandomTests/randomTest.json b/tests/files/VMTests/RandomTests/randomTest.json new file mode 100644 index 000000000..dad2ee4a2 --- /dev/null +++ b/tests/files/VMTests/RandomTests/randomTest.json @@ -0,0 +1,46 @@ +{ + "randomVMtest" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : "1", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "code" : "0x675545", + "data" : "0x", + "gas" : "10000", + "gasPrice" : "100000000000000", + "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", + "value" : "1000000000000000000" + }, + "gas" : "9999", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x675545", + "nonce" : "0", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "1000000000000000000", + "code" : "0x675545", + "nonce" : "0", + "storage" : { + } + } + } + } +}
\ No newline at end of file diff --git a/tests/files/VMTests/vmSha3Test.json b/tests/files/VMTests/vmSha3Test.json index bd430ec9d..b9e6b46a1 100644 --- a/tests/files/VMTests/vmSha3Test.json +++ b/tests/files/VMTests/vmSha3Test.json @@ -20,7 +20,7 @@ "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", "value" : "1000000000000000000" }, - "gas" : "99999999677", + "gas" : "99999999687", "logs" : [ ], "out" : "0x", diff --git a/ui/qt/qwhisper/whisper.go b/ui/qt/qwhisper/whisper.go new file mode 100644 index 000000000..bed23c8a7 --- /dev/null +++ b/ui/qt/qwhisper/whisper.go @@ -0,0 +1,70 @@ +package qwhisper + +import ( + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/whisper" +) + +func fromHex(s string) []byte { + if len(s) > 1 { + return ethutil.Hex2Bytes(s[2:]) + } + return nil +} +func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) } + +type Whisper struct { + *whisper.Whisper +} + +func New(w *whisper.Whisper) *Whisper { + return &Whisper{w} +} + +func (self *Whisper) Post(data string, pow, ttl uint32, to, from string) { + msg := whisper.NewMessage(fromHex(data)) + envelope, err := msg.Seal(time.Duration(pow), whisper.Opts{ + Ttl: time.Duration(ttl), + To: crypto.ToECDSAPub(fromHex(to)), + From: crypto.ToECDSA(fromHex(from)), + }) + if err != nil { + // handle error + return + } + + if err := self.Whisper.Send(envelope); err != nil { + // handle error + return + } +} + +func (self *Whisper) NewIdentity() string { + return toHex(self.Whisper.NewIdentity().D.Bytes()) +} + +func (self *Whisper) HasIdentify(key string) bool { + return self.Whisper.HasIdentity(crypto.ToECDSA(fromHex(key))) +} + +func (self *Whisper) Watch(opts map[string]interface{}) { + filter := filterFromMap(opts) + filter.Fn = func(msg *whisper.Message) { + // TODO POST TO QT WINDOW + } + self.Whisper.Watch(filter) +} + +func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { + if to, ok := opts["to"].(string); ok { + f.To = crypto.ToECDSA(fromHex(to)) + } + if from, ok := opts["from"].(string); ok { + f.From = crypto.ToECDSAPub(fromHex(from)) + } + + return +} diff --git a/vm/common.go b/vm/common.go index 5fd512687..592d44ccd 100644 --- a/vm/common.go +++ b/vm/common.go @@ -20,7 +20,7 @@ const ( var ( GasStep = big.NewInt(1) - GasSha = big.NewInt(20) + GasSha = big.NewInt(10) GasSLoad = big.NewInt(20) GasSStore = big.NewInt(100) GasSStoreRefund = big.NewInt(100) diff --git a/vm/virtual_machine.go b/vm/virtual_machine.go index 5738075fb..3b6f98ab2 100644 --- a/vm/virtual_machine.go +++ b/vm/virtual_machine.go @@ -5,7 +5,6 @@ import "math/big" type VirtualMachine interface { Env() Environment Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) ([]byte, error) - Depth() int Printf(string, ...interface{}) VirtualMachine Endl() VirtualMachine } @@ -21,7 +21,7 @@ func New(env Environment, typ Type) VirtualMachine { } func (self *Vm) Run(me, caller ClosureRef, code []byte, value, gas, price *big.Int, data []byte) (ret []byte, err error) { - return nil, nil + panic("not implemented") } func (self *Vm) Env() Environment { diff --git a/vm/vm_debug.go b/vm/vm_debug.go index 5b7258cc5..8af1979b1 100644 --- a/vm/vm_debug.go +++ b/vm/vm_debug.go @@ -25,8 +25,6 @@ type DebugVm struct { Fn string Recoverable bool - - depth int } func NewDebugVm(env Environment) *DebugVm { @@ -51,8 +49,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * closure := NewClosure(msg, caller, me, code, gas, price) if self.env.Depth() == MaxCallDepth { - closure.UseGas(gas) - + //closure.UseGas(gas) return closure.Return(nil), DepthError{} } @@ -116,7 +113,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * return closure.Return(nil), nil } - vmlogger.Debugf("(%d) %x gas: %v (d) %x\n", self.depth, closure.Address(), closure.Gas, callData) + vmlogger.Debugf("(%d) %x gas: %v (d) %x\n", self.env.Depth(), closure.Address(), closure.Gas, callData) for { prevStep = step @@ -867,14 +864,16 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * // Get the arguments from the memory args := mem.Get(inOffset.Int64(), inSize.Int64()) - var executeAddr []byte + var ( + ret []byte + err error + ) if op == CALLCODE { - executeAddr = closure.Address() + ret, err = self.env.CallCode(closure, addr.Bytes(), args, gas, price, value) } else { - executeAddr = addr.Bytes() + ret, err = self.env.Call(closure, addr.Bytes(), args, gas, price, value) } - ret, err := self.env.Call(closure, executeAddr, args, gas, price, value) if err != nil { stack.Push(ethutil.BigFalse) @@ -885,7 +884,7 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * mem.Set(retOffset.Uint64(), retSize.Uint64(), ret) } - self.Printf("resume %x", closure.Address()) + self.Printf("resume %x (%v)", closure.Address(), closure.Gas) // Debug hook if self.Dbg != nil { @@ -914,7 +913,6 @@ func (self *DebugVm) Run(me, caller ClosureRef, code []byte, value, gas, price * default: vmlogger.Debugf("(pc) %-3v Invalid opcode %x\n", pc, op) - //panic(fmt.Sprintf("Invalid opcode %x", op)) closure.ReturnGas(big.NewInt(1), nil) return closure.Return(nil), fmt.Errorf("Invalid opcode %x", op) @@ -963,7 +961,3 @@ func (self *DebugVm) Endl() VirtualMachine { func (self *DebugVm) Env() Environment { return self.env } - -func (self *DebugVm) Depth() int { - return self.depth -} diff --git a/whisper/envelope.go b/whisper/envelope.go index 359fa1568..683e88128 100644 --- a/whisper/envelope.go +++ b/whisper/envelope.go @@ -61,22 +61,27 @@ func (self *Envelope) Seal(pow time.Duration) { self.proveWork(pow) } -func (self *Envelope) Open(prv *ecdsa.PrivateKey) (*Message, error) { +func (self *Envelope) Open(prv *ecdsa.PrivateKey) (msg *Message, err error) { data := self.Data - if data[0] > 0 && len(data) < 66 { - return nil, fmt.Errorf("unable to open envelope. First bit set but len(data) < 66") - } - + var message Message + dataStart := 1 if data[0] > 0 { - payload, err := crypto.Decrypt(prv, data[66:]) + if len(data) < 66 { + return nil, fmt.Errorf("unable to open envelope. First bit set but len(data) < 66") + } + dataStart = 66 + message.Flags = data[0] + message.Signature = data[1:66] + } + message.Payload = data[dataStart:] + if prv != nil { + message.Payload, err = crypto.Decrypt(prv, message.Payload) if err != nil { return nil, fmt.Errorf("unable to open envelope. Decrypt failed: %v", err) } - - return NewMessage(payload), nil } - return NewMessage(data[1:]), nil + return &message, nil } func (self *Envelope) proveWork(dura time.Duration) { diff --git a/whisper/filter.go b/whisper/filter.go new file mode 100644 index 000000000..4315aa556 --- /dev/null +++ b/whisper/filter.go @@ -0,0 +1,10 @@ +package whisper + +import "crypto/ecdsa" + +type Filter struct { + To *ecdsa.PrivateKey + From *ecdsa.PublicKey + Topics [][]byte + Fn func(*Message) +} diff --git a/whisper/main.go b/whisper/main.go index 80050d899..2ee2f3ff1 100644 --- a/whisper/main.go +++ b/whisper/main.go @@ -8,6 +8,7 @@ import ( "net" "os" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/whisper" @@ -17,9 +18,9 @@ import ( func main() { logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel)) - pub, sec := secp256k1.GenerateKeyPair() + pub, _ := secp256k1.GenerateKeyPair() - whisper := whisper.New(sec) + whisper := whisper.New(&event.TypeMux{}) srv := p2p.Server{ MaxPeers: 10, diff --git a/whisper/message.go b/whisper/message.go index 8ce5d880b..db0110b4a 100644 --- a/whisper/message.go +++ b/whisper/message.go @@ -28,15 +28,11 @@ func (self *Message) sign(key *ecdsa.PrivateKey) (err error) { } func (self *Message) Recover() *ecdsa.PublicKey { + defer func() { recover() }() // in case of invalid sig return crypto.SigToPub(self.hash(), self.Signature) } -func (self *Message) Encrypt(from *ecdsa.PrivateKey, to *ecdsa.PublicKey) (err error) { - err = self.sign(from) - if err != nil { - return err - } - +func (self *Message) Encrypt(to *ecdsa.PublicKey) (err error) { self.Payload, err = crypto.Encrypt(to, self.Payload) if err != nil { return err @@ -57,8 +53,16 @@ type Opts struct { } func (self *Message) Seal(pow time.Duration, opts Opts) (*Envelope, error) { - if opts.To != nil && opts.From != nil { - if err := self.Encrypt(opts.From, opts.To); err != nil { + if opts.From != nil { + err := self.sign(opts.From) + if err != nil { + return nil, err + } + } + + if opts.To != nil { + err := self.Encrypt(opts.To) + if err != nil { return nil, err } } diff --git a/whisper/whisper.go b/whisper/whisper.go index 4d7a2a23e..356debd1c 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -9,6 +9,7 @@ import ( "time" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event/filter" "github.com/ethereum/go-ethereum/p2p" "gopkg.in/fatih/set.v0" ) @@ -38,28 +39,38 @@ const ( envelopesMsg = 0x01 ) +type MessageEvent struct { + To *ecdsa.PrivateKey + From *ecdsa.PublicKey + Message *Message +} + const DefaultTtl = 50 * time.Second type Whisper struct { - key *ecdsa.PrivateKey protocol p2p.Protocol + filters *filter.Filters mmu sync.RWMutex messages map[Hash]*Envelope expiry map[uint32]*set.SetNonTS quit chan struct{} + + keys []*ecdsa.PrivateKey } -func New(sec []byte) *Whisper { +func New() *Whisper { whisper := &Whisper{ - key: crypto.ToECDSA(sec), messages: make(map[Hash]*Envelope), + filters: filter.New(), expiry: make(map[uint32]*set.SetNonTS), quit: make(chan struct{}), } + whisper.filters.Start() go whisper.update() + // XXX TODO REMOVE TESTING CODE msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) envelope, _ := msg.Seal(DefaultPow, Opts{ Ttl: DefaultTtl, @@ -67,6 +78,7 @@ func New(sec []byte) *Whisper { if err := whisper.Send(envelope); err != nil { fmt.Println(err) } + // XXX TODO REMOVE TESTING CODE // p2p whisper sub protocol handler whisper.protocol = p2p.Protocol{ @@ -87,6 +99,35 @@ func (self *Whisper) Send(envelope *Envelope) error { return self.add(envelope) } +func (self *Whisper) NewIdentity() *ecdsa.PrivateKey { + key, err := crypto.GenerateKey() + if err != nil { + panic(err) + } + self.keys = append(self.keys, key) + + return key +} + +func (self *Whisper) HasIdentity(key *ecdsa.PrivateKey) bool { + for _, key := range self.keys { + if key.D.Cmp(key.D) == 0 { + return true + } + } + return false +} + +func (self *Whisper) Watch(opts Filter) int { + return self.filters.Install(filter.Generic{ + Str1: string(crypto.FromECDSA(opts.To)), + Str2: string(crypto.FromECDSAPub(opts.From)), + Fn: func(data interface{}) { + opts.Fn(data.(*Message)) + }, + }) +} + // Main handler for passing whisper messages to whisper peer objects func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { wpeer := NewPeer(self, peer, ws) @@ -122,7 +163,7 @@ func (self *Whisper) msgHandler(peer *p2p.Peer, ws p2p.MsgReadWriter) error { // takes care of adding envelopes to the messages pool. At this moment no sanity checks are being performed. func (self *Whisper) add(envelope *Envelope) error { if !envelope.valid() { - return errors.New("invalid pow for envelope") + return errors.New("invalid pow provided for envelope") } self.mmu.Lock() @@ -136,11 +177,9 @@ func (self *Whisper) add(envelope *Envelope) error { if !self.expiry[envelope.Expiry].Has(hash) { self.expiry[envelope.Expiry].Add(hash) - // TODO notify listeners (given that we had any ...) + self.postEvent(envelope) } - fmt.Println("add", envelope) - return nil } @@ -189,6 +228,19 @@ func (self *Whisper) envelopes() (envelopes []*Envelope) { return } +func (self *Whisper) postEvent(envelope *Envelope) { + for _, key := range self.keys { + if message, err := envelope.Open(key); err == nil { + // Create a custom filter? + self.filters.Notify(filter.Generic{ + Str1: string(crypto.FromECDSA(key)), Str2: string(crypto.FromECDSAPub(message.Recover())), + }, message) + } else { + fmt.Println(err) + } + } +} + func (self *Whisper) Protocol() p2p.Protocol { return self.protocol } diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go new file mode 100644 index 000000000..107cb8c97 --- /dev/null +++ b/whisper/whisper_test.go @@ -0,0 +1,47 @@ +package whisper + +import ( + "fmt" + "testing" + "time" +) + +func TestKeyManagement(t *testing.T) { + whisper := New() + + key := whisper.NewIdentity() + if !whisper.HasIdentity(key) { + t.Error("expected whisper to have identify") + } +} + +func TestEvent(t *testing.T) { + res := make(chan *Message, 1) + whisper := New() + id := whisper.NewIdentity() + whisper.Watch(Filter{ + To: id, + Fn: func(msg *Message) { + res <- msg + }, + }) + + msg := NewMessage([]byte(fmt.Sprintf("Hello world. This is whisper-go. Incase you're wondering; the time is %v", time.Now()))) + envelope, err := msg.Seal(DefaultPow, Opts{ + Ttl: DefaultTtl, + From: id, + To: &id.PublicKey, + }) + if err != nil { + fmt.Println(err) + t.FailNow() + } + + tick := time.NewTicker(time.Second) + whisper.postEvent(envelope) + select { + case <-res: + case <-tick.C: + t.Error("did not receive message") + } +} diff --git a/wire/.gitignore b/wire/.gitignore deleted file mode 100644 index f725d58d1..000000000 --- a/wire/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. -# -# 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 - -/tmp -*/**/*un~ -*un~ -.DS_Store -*/**/.DS_Store - diff --git a/wire/README.md b/wire/README.md deleted file mode 100644 index 7f63688b3..000000000 --- a/wire/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# ethwire - -The ethwire package contains the ethereum wire protocol. The ethwire -package is required to write and read from the ethereum network. - -# Installation - -`go get github.com/ethereum/ethwire-go` - -# Messaging overview - -The Ethereum Wire protocol defines the communication between the nodes -running Ethereum. Further reader reading can be done on the -[Wiki](http://wiki.ethereum.org/index.php/Wire_Protocol). - -# Reading Messages - -```go -// Read and validate the next eth message from the provided connection. -// returns a error message with the details. -msg, err := ethwire.ReadMessage(conn) -if err != nil { - // Handle error -} -``` - -# Writing Messages - -```go -// Constructs a message which can be interpreted by the eth network. -// Write the inventory to network -err := ethwire.WriteMessage(conn, &Msg{ - Type: ethwire.MsgInvTy, - Data : []interface{}{...}, -}) -``` diff --git a/wire/client_identity.go b/wire/client_identity.go deleted file mode 100644 index 0a268024a..000000000 --- a/wire/client_identity.go +++ /dev/null @@ -1,56 +0,0 @@ -package wire - -import ( - "fmt" - "runtime" -) - -// should be used in Peer handleHandshake, incorporate Caps, ProtocolVersion, Pubkey etc. -type ClientIdentity interface { - String() string -} - -type SimpleClientIdentity struct { - clientIdentifier string - version string - customIdentifier string - os string - implementation string -} - -func NewSimpleClientIdentity(clientIdentifier string, version string, customIdentifier string) *SimpleClientIdentity { - clientIdentity := &SimpleClientIdentity{ - clientIdentifier: clientIdentifier, - version: version, - customIdentifier: customIdentifier, - os: runtime.GOOS, - implementation: runtime.Version(), - } - - return clientIdentity -} - -func (c *SimpleClientIdentity) init() { -} - -func (c *SimpleClientIdentity) String() string { - var id string - if len(c.customIdentifier) > 0 { - id = "/" + c.customIdentifier - } - - return fmt.Sprintf("%s/v%s%s/%s/%s", - c.clientIdentifier, - c.version, - id, - c.os, - c.implementation) -} - -func (c *SimpleClientIdentity) SetCustomIdentifier(customIdentifier string) { - c.customIdentifier = customIdentifier -} - -func (c *SimpleClientIdentity) GetCustomIdentifier() string { - return c.customIdentifier -} diff --git a/wire/client_identity_test.go b/wire/client_identity_test.go deleted file mode 100644 index c0e7a0159..000000000 --- a/wire/client_identity_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package wire - -import ( - "fmt" - "runtime" - "testing" -) - -func TestClientIdentity(t *testing.T) { - clientIdentity := NewSimpleClientIdentity("Ethereum(G)", "0.5.16", "test") - clientString := clientIdentity.String() - expected := fmt.Sprintf("Ethereum(G)/v0.5.16/test/%s/%s", runtime.GOOS, runtime.Version()) - if clientString != expected { - t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString) - } - customIdentifier := clientIdentity.GetCustomIdentifier() - if customIdentifier != "test" { - t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test', got %q", customIdentifier) - } - clientIdentity.SetCustomIdentifier("test2") - customIdentifier = clientIdentity.GetCustomIdentifier() - if customIdentifier != "test2" { - t.Errorf("Expected clientIdentity.GetCustomIdentifier() to be 'test2', got %q", customIdentifier) - } - clientString = clientIdentity.String() - expected = fmt.Sprintf("Ethereum(G)/v0.5.16/test2/%s/%s", runtime.GOOS, runtime.Version()) - if clientString != expected { - t.Errorf("Expected clientIdentity to be %q, got %q", expected, clientString) - } -} diff --git a/wire/messages2.go b/wire/messages2.go deleted file mode 100644 index acbd9e0d5..000000000 --- a/wire/messages2.go +++ /dev/null @@ -1,199 +0,0 @@ -package wire - -import ( - "bytes" - "errors" - "fmt" - "net" - "time" - - "github.com/ethereum/go-ethereum/ethutil" -) - -// The connection object allows you to set up a connection to the Ethereum network. -// The Connection object takes care of all encoding and sending objects properly over -// the network. -type Connection struct { - conn net.Conn - nTimeout time.Duration - pendingMessages Messages -} - -// Create a new connection to the Ethereum network -func New(conn net.Conn) *Connection { - return &Connection{conn: conn, nTimeout: 500} -} - -// Read, reads from the network. It will block until the next message is received. -func (self *Connection) Read() *Msg { - if len(self.pendingMessages) == 0 { - self.readMessages() - } - - ret := self.pendingMessages[0] - self.pendingMessages = self.pendingMessages[1:] - - return ret - -} - -// Write to the Ethereum network specifying the type of the message and -// the data. Data can be of type RlpEncodable or []interface{}. Returns -// nil or if something went wrong an error. -func (self *Connection) Write(typ MsgType, v ...interface{}) error { - var pack []byte - - slice := [][]interface{}{[]interface{}{byte(typ)}} - for _, value := range v { - if encodable, ok := value.(ethutil.RlpEncodeDecode); ok { - slice = append(slice, encodable.RlpValue()) - } else if raw, ok := value.([]interface{}); ok { - slice = append(slice, raw) - } else { - panic(fmt.Sprintf("Unable to 'write' object of type %T", value)) - } - } - - // Encode the type and the (RLP encoded) data for sending over the wire - encoded := ethutil.NewValue(slice).Encode() - payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32) - - // Write magic token and payload length (first 8 bytes) - pack = append(MagicToken, payloadLength...) - pack = append(pack, encoded...) - - // Write to the connection - _, err := self.conn.Write(pack) - if err != nil { - return err - } - - return nil -} - -func (self *Connection) readMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { - if len(data) == 0 { - return nil, nil, true, nil - } - - if len(data) <= 8 { - return nil, remaining, false, errors.New("Invalid message") - } - - // Check if the received 4 first bytes are the magic token - if bytes.Compare(MagicToken, data[:4]) != 0 { - return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4]) - } - - messageLength := ethutil.BytesToNumber(data[4:8]) - remaining = data[8+messageLength:] - if int(messageLength) > len(data[8:]) { - return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength) - } - - message := data[8 : 8+messageLength] - decoder := ethutil.NewValueFromBytes(message) - // Type of message - t := decoder.Get(0).Uint() - // Actual data - d := decoder.SliceFrom(1) - - msg = &Msg{ - Type: MsgType(t), - Data: d, - } - - return -} - -// The basic message reader waits for data on the given connection, decoding -// and doing a few sanity checks such as if there's a data type and -// unmarhals the given data -func (self *Connection) readMessages() (err error) { - // The recovering function in case anything goes horribly wrong - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("wire.ReadMessage error: %v", r) - } - }() - - // Buff for writing network message to - //buff := make([]byte, 1440) - var buff []byte - var totalBytes int - for { - // Give buffering some time - self.conn.SetReadDeadline(time.Now().Add(self.nTimeout * time.Millisecond)) - // Create a new temporarily buffer - b := make([]byte, 1440) - // Wait for a message from this peer - n, _ := self.conn.Read(b) - if err != nil && n == 0 { - if err.Error() != "EOF" { - fmt.Println("err now", err) - return err - } else { - break - } - - // Messages can't be empty - } else if n == 0 { - break - } - - buff = append(buff, b[:n]...) - totalBytes += n - } - - // Reslice buffer - buff = buff[:totalBytes] - msg, remaining, done, err := self.readMessage(buff) - for ; done != true; msg, remaining, done, err = self.readMessage(remaining) { - //log.Println("rx", msg) - - if msg != nil { - self.pendingMessages = append(self.pendingMessages, msg) - } - } - - return -} - -func ReadMessage(data []byte) (msg *Msg, remaining []byte, done bool, err error) { - if len(data) == 0 { - return nil, nil, true, nil - } - - if len(data) <= 8 { - return nil, remaining, false, errors.New("Invalid message") - } - - // Check if the received 4 first bytes are the magic token - if bytes.Compare(MagicToken, data[:4]) != 0 { - return nil, nil, false, fmt.Errorf("MagicToken mismatch. Received %v", data[:4]) - } - - messageLength := ethutil.BytesToNumber(data[4:8]) - remaining = data[8+messageLength:] - if int(messageLength) > len(data[8:]) { - return nil, nil, false, fmt.Errorf("message length %d, expected %d", len(data[8:]), messageLength) - } - - message := data[8 : 8+messageLength] - decoder := ethutil.NewValueFromBytes(message) - // Type of message - t := decoder.Get(0).Uint() - // Actual data - d := decoder.SliceFrom(1) - - msg = &Msg{ - Type: MsgType(t), - Data: d, - } - - return -} - -func bufferedRead(conn net.Conn) ([]byte, error) { - return nil, nil -} diff --git a/wire/messaging.go b/wire/messaging.go deleted file mode 100644 index 9c6cb5944..000000000 --- a/wire/messaging.go +++ /dev/null @@ -1,178 +0,0 @@ -// Package wire provides low level access to the Ethereum network and allows -// you to broadcast data over the network. -package wire - -import ( - "bytes" - "fmt" - "net" - "time" - - "github.com/ethereum/go-ethereum/ethutil" -) - -// Connection interface describing the methods required to implement the wire protocol. -type Conn interface { - Write(typ MsgType, v ...interface{}) error - Read() *Msg -} - -// The magic token which should be the first 4 bytes of every message and can be used as separator between messages. -var MagicToken = []byte{34, 64, 8, 145} - -type MsgType byte - -const ( - // Values are given explicitly instead of by iota because these values are - // defined by the wire protocol spec; it is easier for humans to ensure - // correctness when values are explicit. - MsgHandshakeTy = 0x00 - MsgDiscTy = 0x01 - MsgPingTy = 0x02 - MsgPongTy = 0x03 - MsgGetPeersTy = 0x04 - MsgPeersTy = 0x05 - - MsgStatusTy = 0x10 - MsgTxTy = 0x12 - MsgGetBlockHashesTy = 0x13 - MsgBlockHashesTy = 0x14 - MsgGetBlocksTy = 0x15 - MsgBlockTy = 0x16 - MsgNewBlockTy = 0x17 -) - -var msgTypeToString = map[MsgType]string{ - MsgHandshakeTy: "Handshake", - MsgDiscTy: "Disconnect", - MsgPingTy: "Ping", - MsgPongTy: "Pong", - MsgGetPeersTy: "Get peers", - MsgStatusTy: "Status", - MsgPeersTy: "Peers", - MsgTxTy: "Transactions", - MsgBlockTy: "Blocks", - //MsgGetTxsTy: "Get Txs", - MsgGetBlockHashesTy: "Get block hashes", - MsgBlockHashesTy: "Block hashes", - MsgGetBlocksTy: "Get blocks", -} - -func (mt MsgType) String() string { - return msgTypeToString[mt] -} - -type Msg struct { - Type MsgType // Specifies how the encoded data should be interpreted - //Data []byte - Data *ethutil.Value -} - -func NewMessage(msgType MsgType, data interface{}) *Msg { - return &Msg{ - Type: msgType, - Data: ethutil.NewValue(data), - } -} - -type Messages []*Msg - -// The basic message reader waits for data on the given connection, decoding -// and doing a few sanity checks such as if there's a data type and -// unmarhals the given data -func ReadMessages(conn net.Conn) (msgs []*Msg, err error) { - // The recovering function in case anything goes horribly wrong - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("wire.ReadMessage error: %v", r) - } - }() - - var ( - buff []byte - messages [][]byte - msgLength int - ) - - for { - // Give buffering some time - conn.SetReadDeadline(time.Now().Add(5 * time.Millisecond)) - // Create a new temporarily buffer - b := make([]byte, 1440) - n, _ := conn.Read(b) - if err != nil && n == 0 { - if err.Error() != "EOF" { - fmt.Println("err now", err) - return nil, err - } else { - break - } - } - - if n == 0 && len(buff) == 0 { - // If there's nothing on the wire wait for a bit - time.Sleep(200 * time.Millisecond) - - continue - } - - buff = append(buff, b[:n]...) - if msgLength == 0 { - // Check if the received 4 first bytes are the magic token - if bytes.Compare(MagicToken, buff[:4]) != 0 { - return nil, fmt.Errorf("MagicToken mismatch. Received %v", buff[:4]) - } - - // Read the length of the message - msgLength = int(ethutil.BytesToNumber(buff[4:8])) - - // Remove the token and length - buff = buff[8:] - } - - if len(buff) >= msgLength { - messages = append(messages, buff[:msgLength]) - buff = buff[msgLength:] - msgLength = 0 - - if len(buff) == 0 { - break - } - } - } - - for _, m := range messages { - decoder := ethutil.NewValueFromBytes(m) - // Type of message - t := decoder.Get(0).Uint() - // Actual data - d := decoder.SliceFrom(1) - - msgs = append(msgs, &Msg{Type: MsgType(t), Data: d}) - } - - return -} - -// The basic message writer takes care of writing data over the given -// connection and does some basic error checking -func WriteMessage(conn net.Conn, msg *Msg) error { - var pack []byte - - // Encode the type and the (RLP encoded) data for sending over the wire - encoded := ethutil.NewValue(append([]interface{}{byte(msg.Type)}, msg.Data.Slice()...)).Encode() - payloadLength := ethutil.NumberToBytes(uint32(len(encoded)), 32) - - // Write magic token and payload length (first 8 bytes) - pack = append(MagicToken, payloadLength...) - pack = append(pack, encoded...) - //fmt.Printf("payload %v (%v) %q\n", msg.Type, conn.RemoteAddr(), encoded) - - // Write to the connection - _, err := conn.Write(pack) - if err != nil { - return err - } - - return nil -} diff --git a/xeth/hexface.go b/xeth/hexface.go index c1f49453d..524b68210 100644 --- a/xeth/hexface.go +++ b/xeth/hexface.go @@ -3,7 +3,6 @@ package xeth import ( "bytes" "encoding/json" - "sync/atomic" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" @@ -63,12 +62,8 @@ func (self *JSXEth) PeerCount() int { func (self *JSXEth) Peers() []JSPeer { var peers []JSPeer - for peer := self.obj.Peers().Front(); peer != nil; peer = peer.Next() { - p := peer.Value.(core.Peer) - // we only want connected peers - if atomic.LoadInt32(p.Connected()) != 0 { - peers = append(peers, *NewJSPeer(p)) - } + for _, peer := range self.obj.Peers() { + peers = append(peers, *NewJSPeer(peer)) } return peers diff --git a/xeth/js_types.go b/xeth/js_types.go index da26439cf..1d9faa190 100644 --- a/xeth/js_types.go +++ b/xeth/js_types.go @@ -1,14 +1,13 @@ package xeth import ( - "fmt" - "strconv" "strings" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethutil" + "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/state" ) @@ -155,38 +154,36 @@ func NewPReciept(contractCreation bool, creationAddress, hash, address []byte) * // Peer interface exposed to QML type JSPeer struct { - ref *core.Peer - Inbound bool `json:"isInbound"` - LastSend int64 `json:"lastSend"` - LastPong int64 `json:"lastPong"` - Ip string `json:"ip"` - Port int `json:"port"` - Version string `json:"version"` - LastResponse string `json:"lastResponse"` - Latency string `json:"latency"` - Caps string `json:"caps"` -} - -func NewJSPeer(peer core.Peer) *JSPeer { - if peer == nil { - return nil - } - - var ip []string - for _, i := range peer.Host() { - ip = append(ip, strconv.Itoa(int(i))) - } - ipAddress := strings.Join(ip, ".") - - var caps []string - capsIt := peer.Caps().NewIterator() - for capsIt.Next() { - cap := capsIt.Value().Get(0).Str() - ver := capsIt.Value().Get(1).Uint() - caps = append(caps, fmt.Sprintf("%s/%d", cap, ver)) - } - - return &JSPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime(), Caps: "[" + strings.Join(caps, ", ") + "]"} + ref *p2p.Peer + // Inbound bool `json:"isInbound"` + // LastSend int64 `json:"lastSend"` + // LastPong int64 `json:"lastPong"` + // Ip string `json:"ip"` + // Port int `json:"port"` + // Version string `json:"version"` + // LastResponse string `json:"lastResponse"` + // Latency string `json:"latency"` + // Caps string `json:"caps"` +} + +func NewJSPeer(peer *p2p.Peer) *JSPeer { + + // var ip []string + // for _, i := range peer.Host() { + // ip = append(ip, strconv.Itoa(int(i))) + // } + // ipAddress := strings.Join(ip, ".") + + // var caps []string + // capsIt := peer.Caps().NewIterator() + // for capsIt.Next() { + // cap := capsIt.Value().Get(0).Str() + // ver := capsIt.Value().Get(1).Uint() + // caps = append(caps, fmt.Sprintf("%s/%d", cap, ver)) + // } + + return &JSPeer{ref: peer} + // return &JSPeer{ref: &peer, Inbound: peer.Inbound(), LastSend: peer.LastSend().Unix(), LastPong: peer.LastPong(), Version: peer.Version(), Ip: ipAddress, Port: int(peer.Port()), Latency: peer.PingTime(), Caps: "[" + strings.Join(caps, ", ") + "]"} } type JSReceipt struct { diff --git a/xeth/pipe.go b/xeth/pipe.go index 2ca8134ce..a8d8ed999 100644 --- a/xeth/pipe.go +++ b/xeth/pipe.go @@ -22,7 +22,7 @@ type VmVars struct { type XEth struct { obj core.EthManager blockManager *core.BlockManager - blockChain *core.ChainManager + chainManager *core.ChainManager world *World Vm VmVars @@ -32,7 +32,7 @@ func New(obj core.EthManager) *XEth { pipe := &XEth{ obj: obj, blockManager: obj.BlockManager(), - blockChain: obj.ChainManager(), + chainManager: obj.ChainManager(), } pipe.world = NewWorld(pipe) @@ -51,7 +51,7 @@ func (self *XEth) Nonce(addr []byte) uint64 { } func (self *XEth) Block(hash []byte) *types.Block { - return self.blockChain.GetBlock(hash) + return self.chainManager.GetBlock(hash) } func (self *XEth) Storage(addr, storageAddr []byte) *ethutil.Value { @@ -82,7 +82,7 @@ func (self *XEth) Execute(addr []byte, data []byte, value, gas, price *ethutil.V func (self *XEth) ExecuteObject(object *Object, data []byte, value, gas, price *ethutil.Value) ([]byte, error) { var ( initiator = state.NewStateObject(self.obj.KeyManager().KeyPair().Address()) - block = self.blockChain.CurrentBlock + block = self.chainManager.CurrentBlock ) self.Vm.State = self.World().State().Copy() @@ -131,14 +131,14 @@ func (self *XEth) Transact(key *crypto.KeyPair, to []byte, value, gas, price *et tx = types.NewTransactionMessage(hash, value.BigInt(), gas.BigInt(), price.BigInt(), data) } - state := self.blockManager.TransState() + state := self.chainManager.TransState() nonce := state.GetNonce(key.Address()) tx.Nonce = nonce tx.Sign(key.PrivateKey) // Do some pre processing for our "pre" events and hooks - block := self.blockChain.NewBlock(key.Address()) + block := self.chainManager.NewBlock(key.Address()) coinbase := state.GetStateObject(key.Address()) coinbase.SetGasPool(block.GasLimit) self.blockManager.ApplyTransactions(coinbase, state, block, types.Transactions{tx}, true) diff --git a/xeth/world.go b/xeth/world.go index c5c20c224..008a08423 100644 --- a/xeth/world.go +++ b/xeth/world.go @@ -1,8 +1,7 @@ package xeth import ( - "container/list" - + "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/state" ) @@ -23,7 +22,7 @@ func (self *XEth) World() *World { } func (self *World) State() *state.StateDB { - return self.pipe.blockManager.CurrentState() + return self.pipe.chainManager.State() } func (self *World) Get(addr []byte) *Object { @@ -55,7 +54,7 @@ func (self *World) IsListening() bool { return self.pipe.obj.IsListening() } -func (self *World) Peers() *list.List { +func (self *World) Peers() []*p2p.Peer { return self.pipe.obj.Peers() } |