From 61e8296bd82b4392e55e6707f37b7d1d1e897dd7 Mon Sep 17 00:00:00 2001 From: Vitalik Buterin Date: Fri, 15 May 2015 21:23:09 -0400 Subject: [PATCH 01/59] Adjust miner coinbase and not just miner worker coinbase --- miner/miner.go | 1 + 1 file changed, 1 insertion(+) diff --git a/miner/miner.go b/miner/miner.go index 19d39a605f..3f87e81515 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -75,6 +75,7 @@ func (self *Miner) Start(coinbase common.Address, threads int) { atomic.StoreInt32(&self.shouldStart, 1) self.threads = threads self.worker.coinbase = coinbase + self.coinbase = coinbase if atomic.LoadInt32(&self.canStart) == 0 { glog.V(logger.Info).Infoln("Can not start mining operation due to network sync (starts when finished)") From 28ba374f27b81ba143005e285be6f8a986134936 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 16 May 2015 17:43:19 +0200 Subject: [PATCH 02/59] cmd/geth: delete state db on upgradedb command --- cmd/geth/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index e9deec61f2..817337e202 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -574,6 +574,7 @@ func upgradeDb(ctx *cli.Context) { ethereum.ExtraDb().Close() os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) ethereum, err = eth.New(cfg) if err != nil { From 27782bbadec13482311754457e6e913fab076f8a Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 17 May 2015 00:55:02 +0200 Subject: [PATCH 03/59] core: global chain insert lock --- core/chain_manager.go | 95 +++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/core/chain_manager.go b/core/chain_manager.go index 2e8eb927d4..62e518ca0d 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -83,8 +83,9 @@ type ChainManager struct { eventMux *event.TypeMux genesisBlock *types.Block // Last known total difficulty - mu sync.RWMutex - tsmu sync.RWMutex + mu sync.RWMutex + chainmu sync.RWMutex + tsmu sync.RWMutex td *big.Int currentBlock *types.Block @@ -518,6 +519,9 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { self.wg.Add(1) defer self.wg.Done() + self.chainmu.Lock() + defer self.chainmu.Unlock() + // A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring. var ( queue = make([]interface{}, len(chain)) @@ -542,7 +546,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { continue } - block.Td = new(big.Int) // Do not penelise on future block. We'll need a block queue eventually that will queue // future block for future use if err == BlockFutureErr { @@ -568,54 +571,50 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { return i, err } - self.mu.Lock() - { - cblock := self.currentBlock - // Write block to database. Eventually we'll have to improve on this and throw away blocks that are - // not in the canonical chain. - self.write(block) - // Compare the TD of the last known block in the canonical chain to make sure it's greater. - // At this point it's possible that a different chain (fork) becomes the new canonical chain. - if block.Td.Cmp(self.td) > 0 { - // chain fork - if block.ParentHash() != cblock.Hash() { - // during split we merge two different chains and create the new canonical chain - self.merge(cblock, block) + cblock := self.currentBlock + // Write block to database. Eventually we'll have to improve on this and throw away blocks that are + // not in the canonical chain. + self.write(block) + // Compare the TD of the last known block in the canonical chain to make sure it's greater. + // At this point it's possible that a different chain (fork) becomes the new canonical chain. + if block.Td.Cmp(self.td) > 0 { + // chain fork + if block.ParentHash() != cblock.Hash() { + // during split we merge two different chains and create the new canonical chain + self.merge(cblock, block) - queue[i] = ChainSplitEvent{block, logs} - queueEvent.splitCount++ - } - - self.setTotalDifficulty(block.Td) - self.insert(block) - - jsonlogger.LogJson(&logger.EthChainNewHead{ - BlockHash: block.Hash().Hex(), - BlockNumber: block.Number(), - ChainHeadHash: cblock.Hash().Hex(), - BlockPrevHash: block.ParentHash().Hex(), - }) - - self.setTransState(state.New(block.Root(), self.stateDb)) - self.txState.SetState(state.New(block.Root(), self.stateDb)) - - queue[i] = ChainEvent{block, block.Hash(), logs} - queueEvent.canonicalCount++ - - if glog.V(logger.Debug) { - glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...)\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) - } - } else { - if glog.V(logger.Detail) { - glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...)\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) - } - - queue[i] = ChainSideEvent{block, logs} - queueEvent.sideCount++ + queue[i] = ChainSplitEvent{block, logs} + queueEvent.splitCount++ } - self.futureBlocks.Delete(block.Hash()) + + self.setTotalDifficulty(block.Td) + self.insert(block) + + jsonlogger.LogJson(&logger.EthChainNewHead{ + BlockHash: block.Hash().Hex(), + BlockNumber: block.Number(), + ChainHeadHash: cblock.Hash().Hex(), + BlockPrevHash: block.ParentHash().Hex(), + }) + + self.setTransState(state.New(block.Root(), self.stateDb)) + self.txState.SetState(state.New(block.Root(), self.stateDb)) + + queue[i] = ChainEvent{block, block.Hash(), logs} + queueEvent.canonicalCount++ + + if glog.V(logger.Debug) { + glog.Infof("[%v] inserted block #%d (%d TXs %d UNCs) (%x...)\n", time.Now().UnixNano(), block.Number(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + } + } else { + if glog.V(logger.Detail) { + glog.Infof("inserted forked block #%d (TD=%v) (%d TXs %d UNCs) (%x...)\n", block.Number(), block.Difficulty(), len(block.Transactions()), len(block.Uncles()), block.Hash().Bytes()[0:4]) + } + + queue[i] = ChainSideEvent{block, logs} + queueEvent.sideCount++ } - self.mu.Unlock() + self.futureBlocks.Delete(block.Hash()) stats.processed++ From e323f0e83120edb759dfa1e99325eff13e975b3b Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 10:13:50 +0200 Subject: [PATCH 04/59] core: tmp diagnostic logs --- core/block_processor.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/block_processor.go b/core/block_processor.go index cae618b390..adba264c13 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -351,6 +351,13 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty uncles.Add(hash) if ancestors.Has(hash) { + var branch string + ancestors.Each(func(item interface{}) bool { + branch += fmt.Sprintf(" O - %x\n |\n", item.(common.Hash)) + }) + branch += fmt.Sprintf(" O - %x\n |\n", block.Hash()) + glog.Infoln(branch) + return UncleError("uncle[%d](%x) is ancestor", i, hash[:4]) } From 54f0f82dd13f7faed68ab3a781df97a62b7d15d4 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 10:14:48 +0200 Subject: [PATCH 05/59] ret --- core/block_processor.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/block_processor.go b/core/block_processor.go index adba264c13..97ac4ce248 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -354,6 +354,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty var branch string ancestors.Each(func(item interface{}) bool { branch += fmt.Sprintf(" O - %x\n |\n", item.(common.Hash)) + return true }) branch += fmt.Sprintf(" O - %x\n |\n", block.Hash()) glog.Infoln(branch) From 67d44519ce4344d5ee5f7cf37dd785ead70e8453 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 10:49:09 +0200 Subject: [PATCH 06/59] core: bugfix test 2. set => hash map --- core/block_processor.go | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/core/block_processor.go b/core/block_processor.go index 97ac4ce248..0652d217fd 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -15,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" - "gopkg.in/fatih/set.v0" ) const ( @@ -329,40 +328,50 @@ func AccumulateRewards(statedb *state.StateDB, block *types.Block) { } func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *types.Block) error { - ancestors := set.New() - uncles := set.New() + //ancestors := set.New() + //uncles := set.New() + ancestors := make(map[common.Hash]struct{}) + uncles := make(map[common.Hash]struct{}) ancestorHeaders := make(map[common.Hash]*types.Header) for _, ancestor := range sm.bc.GetAncestors(block, 7) { ancestorHeaders[ancestor.Hash()] = ancestor.Header() - ancestors.Add(ancestor.Hash()) + //ancestors.Add(ancestor.Hash()) + ancestors[ancestor.Hash()] = struct{}{} // Include ancestors uncles in the uncle set. Uncles must be unique. for _, uncle := range ancestor.Uncles() { - uncles.Add(uncle.Hash()) + //uncles.Add(uncle.Hash()) + uncles[uncle.Hash()] = struct{}{} } } - uncles.Add(block.Hash()) + //uncles.Add(block.Hash()) + uncles[block.Hash()] = struct{}{} for i, uncle := range block.Uncles() { hash := uncle.Hash() - if uncles.Has(hash) { + //if uncles.Has(hash) { + if _, has := uncles[hash]; has { // Error not unique return UncleError("uncle[%d](%x) not unique", i, hash[:4]) } - uncles.Add(hash) + uncles[hash] = struct{}{} - if ancestors.Has(hash) { + //if ancestors.Has(hash) { + if _, has := ancestors[hash]; has { var branch string - ancestors.Each(func(item interface{}) bool { - branch += fmt.Sprintf(" O - %x\n |\n", item.(common.Hash)) - return true - }) + //ancestors.Each(func(item interface{}) bool { + for hash := range ancestors { + branch += fmt.Sprintf(" O - %x\n |\n", hash) + //return true + } + //}) branch += fmt.Sprintf(" O - %x\n |\n", block.Hash()) glog.Infoln(branch) return UncleError("uncle[%d](%x) is ancestor", i, hash[:4]) } - if !ancestors.Has(uncle.ParentHash) { + //if !ancestors.Has(uncle.ParentHash) { + if _, has := ancestors[uncle.ParentHash]; !has { return UncleError("uncle[%d](%x)'s parent unknown (%x)", i, hash[:4], uncle.ParentHash[0:4]) } From 36419defd1dfa6324ffad1d07e78d0adfd9aa4a4 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 18 May 2015 12:45:24 +0200 Subject: [PATCH 07/59] Update Ethereum JSON test files --- .../StateTests/stCallCreateCallCodeTest.json | 434 + .../files/StateTests/stMemoryStressTest.json | 20 +- tests/files/StateTests/stRecursiveCreate.json | 8255 +++++++++++++++++ tests/files/StateTests/stSolidityTest.json | 36 +- tests/files/VMTests/vmArithmeticTest.json | 485 +- 5 files changed, 9199 insertions(+), 31 deletions(-) diff --git a/tests/files/StateTests/stCallCreateCallCodeTest.json b/tests/files/StateTests/stCallCreateCallCodeTest.json index f295779a4b..a86192ede9 100644 --- a/tests/files/StateTests/stCallCreateCallCodeTest.json +++ b/tests/files/StateTests/stCallCreateCallCodeTest.json @@ -924,6 +924,440 @@ "value" : "0x0186a0" } }, + "createFailBalanceTooLow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a7640017", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x715d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7638e8c", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "5833e19631ddedaf4e3c9a766f696c2e59e7524e388eb871be19dc8e0ce37b6e", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a60005360016000670de0b6b3a7640018f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1d", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x17" + } + }, + "createInitFailBadJumpDestination" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6056600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailStackSizeLargerThan1024" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f6103ff6000525b7f0102030405060708090a0102030405060708090a010203046000527f05060708090a0102600160005103600052600051600657000000000000000000602052604060006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailStackUnderflow" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFailUndefinedInstruction" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x05f58340", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a16cf620", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "ccf7765eff3effe22a5f853099f7da88291b8346b689ffbf54b729ba04170e59", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60f4600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x05f5e100", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitFail_OOGduringInit" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0000000000000000000000000000000000000000" : { + "balance" : "0x0de0b6b3a76586a0", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x715d", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7620803", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "297303455494578a5176177ff1b9db0b0a516255a3d062fb960bbc99e60d8eb5", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1d", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, + "createInitOOGforCREATE" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x05f5e100", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0xcf1c", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a76330e4", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + } + }, + "postStateRoot" : "b61e4a95fae40806b0ddef0883479c3db70e79e019ab4260535560827525c00c", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x605a600053600160006001f0ff", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0xcf1c", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } + }, "createJS_ExampleContract" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", diff --git a/tests/files/StateTests/stMemoryStressTest.json b/tests/files/StateTests/stMemoryStressTest.json index 821d7b31fa..a279502b9a 100644 --- a/tests/files/StateTests/stMemoryStressTest.json +++ b/tests/files/StateTests/stMemoryStressTest.json @@ -266,35 +266,35 @@ }, "logs" : [ ], - "out" : "0x00", + "out" : "#4294967295", "post" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x6401000000016000f3", + "code" : "0x63ffffffff6000f3", "nonce" : "0x00", "storage" : { } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "0x200018085211", + "balance" : "0x20001800520e", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x1869ec3b06114f6f", + "balance" : "0x1869ec3b06194f72", "code" : "0x", "nonce" : "0x01", "storage" : { } } }, - "postStateRoot" : "8745f6bdec4290420747b8c024382c6ed14e09f4a11718bdc1f0f99e4d04607b", + "postStateRoot" : "1716bcf6c106040a46ab1d37c569b7e0841f921b4d252dc5202fb05388308a39", "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x6401000000016000f3", + "code" : "0x63ffffffff6000f3", "nonce" : "0x00", "storage" : { } @@ -328,11 +328,11 @@ }, "logs" : [ ], - "out" : "0x", + "out" : "#4294967295", "post" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x60016000526401000000006000f3", + "code" : "0x600160005263ffffffff6000f3", "nonce" : "0x00", "storage" : { } @@ -352,11 +352,11 @@ } } }, - "postStateRoot" : "e6c6c5b997cf7ecbc653c920a5b42d1ddd9f9ca2df2c68fd47059df2a3309b14", + "postStateRoot" : "b95676d3103fc4a6bdcfb1c201a6ed49e0fa7a239520a4b8ac034ce3b6c697eb", "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", - "code" : "0x60016000526401000000006000f3", + "code" : "0x600160005263ffffffff6000f3", "nonce" : "0x00", "storage" : { } diff --git a/tests/files/StateTests/stRecursiveCreate.json b/tests/files/StateTests/stRecursiveCreate.json index 7f07c2c6d7..4788f79dba 100644 --- a/tests/files/StateTests/stRecursiveCreate.json +++ b/tests/files/StateTests/stRecursiveCreate.json @@ -144,5 +144,8260 @@ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", "value" : "0x0186a0" } + }, + "recursiveCreateReturnValue" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x02540be400", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "logs" : [ + ], + "out" : "0x", + "post" : { + "0007318879928543f66b36e58900a870dfa83312" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x141182812579a73e13dd878d8a94bb628143b098" + } + }, + "001864a1fbee8126e530b9242353d9cb76b043f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb651decbba52842e8fc86afda1168ac549dea7d7" + } + }, + "002b88d7e31f20b1cec3ae31ef8ae3f017820cf7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a1960fde1fc2010660dc9cdc299facac4502364" + } + }, + "00ae33b99c24c45ce086aa9a1844fe8ed55ec312" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4489af2af8424c6edf0d0adc525680dea208a32" + } + }, + "00c3d96a0eaddf7975da5c8718c26d65de0de59b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe089f14df5e00aff3b03cac5e1236f5cf5832d60" + } + }, + "00eb1775a16c0965c299f06a0873e11825f915e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec5f2ac1947c51c5982eb0ab63d1e6439f45c2e4" + } + }, + "00eb67f5e410e28c16861fea7a2ecc1e0011a75f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x61144e43a08b3852bcd531d13f0485743bd835a4" + } + }, + "0116be8937cb591d6db17246c91dc3deb1fd0e1e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd4" + } + }, + "012255fe8647bfe207603a62536ac6ae7a230ca9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe24778b9ec00cc9bef91643e31885deee719207f" + } + }, + "014337758eb4abf60a8e458a97acbd8b47fa0c31" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb88173b953f6c1b613b6e878cfdb34899e3339ad" + } + }, + "01619145d576c5b3130eeed16f29501f2773c958" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x03b685fb90981f103fde64c3bbb5fd701c84dd0e" + } + }, + "016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52ff6062b4e65231065d5579f870b7f1472a5854" + } + }, + "0177fee01c15eede3b794e761753c1f6d108b7f3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd437bf9d51bac3a2757bf4b8bf38045e78d5adb" + } + }, + "018b456893203c6e3a5661e7328b5a858904cdc1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d92228ffbe5ea89389a34a7086e4420d61eb70c" + } + }, + "0199dd91369b5ce0467b68d57beaf1d96fdc769a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x974beeae03d1860c485c0dbb68e5413317770b17" + } + }, + "01b26e834122a942828698305a84789ec47c0454" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9580d4c2c6795fcb1ec84bf6a58b873fb2737789" + } + }, + "02391d38c9b4f03e9225ae5b28230284fa397a09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe908278cc1515f214049c48c3a8908524f2cc408" + } + }, + "029f9045d1904fe6076c4dbe77bd33290f390714" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdef94fccb1b7dfbe1cf0b3dcaa03a77cf58ae769" + } + }, + "02c577c9c1b247c0ea60b1dd50fa895c086e2f2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x06c4341ea63b3431260716e2162ba90abd9628c4" + } + }, + "02c7efe87a470a521338ba476a0eaf7a535c9c56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33c85ce982d0996ff7313c1387ab93348a6777d8" + } + }, + "02fa5c7476f2d423f27ac8afa1e357db95f920fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x11fde66f162bbb0e19d68f0c774c997d0165fa57" + } + }, + "02fee10ca6c1ed23e651f29c97a310b1b4dad13f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91c87b19dcd811fc5efc567a022bca52d5e2e253" + } + }, + "033b61ab81ffc5adce16d365458629d9f3482129" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc5a28cdc8c4b089c87ed4938ed4718253c48dd7b" + } + }, + "03b685fb90981f103fde64c3bbb5fd701c84dd0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe5baf7303b008f333c57491345e604d52fce0d64" + } + }, + "03f3095f9e46a8ac62005c42aaccbc0fcdc3aa32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa71525ab6694ead3c1be0aad07bac06e69192525" + } + }, + "04110d816c380812a427968ece99b1c963dfbce6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9647f4a0a14042d91dc33c0328030a7157c93af" + } + }, + "04308fa2e7af944dd7008a7edbe5221a52e2bc87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea186a9a4815581b71403480abae5cc7c57c00bf" + } + }, + "0441738f9f0a045afd77a72ef8398475c1111471" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e58" + } + }, + "0462dd089e0519c581654520d17763635011fdff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe32bec776748185042cb02d58fad1d5027bbaf00" + } + }, + "0473710fb4277459429e0c4a862ad3e4b45692e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6168c5e3b7d7c870e3e7eb53b152fcb920c8e1ec" + } + }, + "04929feafa156581a24d8a0bfe8154ffab39fb37" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51cc4a0bffdbdd8313ed94ebfd5524e8200f4877" + } + }, + "04a104904b31f401966da211ef40874d6e97ae46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x25f81565c6ac2e22d7e320168222450c2cdf4f6e" + } + }, + "0581dee4d5420c2f6b1614ca62a4d66bcf383d0e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x871986919b8ac4032193739eeae09c66765f0f16" + } + }, + "059ec3d5a255df8a5b592659ea5fdd963e9bd0c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x76ea1b9309253b5c03bbd6e9fca6591b51fb3786" + } + }, + "05e29ccc32df8edacbc5bd6fe19fb4ca02928969" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b71d8cc27346cf6d64e101aab9c88dfd58d26fd" + } + }, + "0602479ffb0636a1ce0fb57bf7949cc978250d2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24ce22b6a7f4227e1e3a6c03c14d07acdb2ec554" + } + }, + "060e7bcadd084fcf19db5cc1ea769550bd8f7508" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbbdb82e2b1ebae617370e1c27542ea087a4fa938" + } + }, + "065c627bc67fca3636da49c34994b6efb2adaad0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x26be5205dce0ce433dca3602886578160e6d52c2" + } + }, + "06c4341ea63b3431260716e2162ba90abd9628c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fed" + } + }, + "0723789d0c7093f6e97c3fdeb1324a75427ca6e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f14a61b9f2f99e50b719f1345e76339f7618203" + } + }, + "076ad7e168093f590a74f6fdce56b492a23baa2b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf5472ede25cb83dc2fe392b01111133b777709ba" + } + }, + "0801871b468dfdcc2d3bc0c0d01cb6ee02afe581" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x751c9d6e9b6d91897ab1754b15b72712953de9bf" + } + }, + "0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d8e57afa6550a1be621fb6c083aca311a1e229d" + } + }, + "080e2ae63ad3891bfba9ec5200f4ba383209ecde" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0e" + } + }, + "0891a47ead61f684dc876e12d5261ab614d0fa09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd09a49b1cdb208e2504486267ca2418c87152963" + } + }, + "08d19f247ca974ee89d4f988cac4becf7a177723" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b2c0c38418eb142d686d124ac5fcb363b061fd8" + } + }, + "08f86cd9e45cd0f821b6088ce2f1b3c0f70dba07" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb1691d2608aea9d7a56083dc7dcbfacc93a4287b" + } + }, + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x0132b3a0", + "code" : "0x602060006000396001602060006000f001600055", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2571607e241ecf590ed94b12d87c94babe36db7" + } + }, + "098de34931d0d159e2631aee55524c217624d095" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3ad081c8f3b79ad20285e881e0e4d011efc0130" + } + }, + "09957f64c3396f36daa03c68fa6c997eb7903df1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x64134c8f0ed52a13bd0a00ff9fc6db6e0832e39f" + } + }, + "09986b78d02ae7c8eaa8b62053a3ee78deba79ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc775193c9d81ed6ee806f6005a874b927e96ff1a" + } + }, + "0a1960fde1fc2010660dc9cdc299facac4502363" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51fd18c9ab9bbb67c27373e8ad754e253e09dbde" + } + }, + "0a517d755cebbf66312b30fff713666a9cb917e0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x95a4d7cccb5204733874fa87285a176fe1e9e241" + } + }, + "0a9015286f76ca4fbcc33e74e9c414be9774a67c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e5a0b9c4c36067c8730abecdb29ba97aed877a8" + } + }, + "0b4b7f08623d9b3d6514baf529399e4f1c0ad944" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84f" + } + }, + "0b98f3276e76e9982d7f6996878ea5196fda62f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3867a470ae1d99ccc7af287ed95ea4da4fd49e53" + } + }, + "0ba7f30a90b699e3f906bff7599b230890bbd56b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaeef5b5a721ea3c03ca909bf1f71c122ebcd32b0" + } + }, + "0bec2514a2a40586ec75e27442352d1dd2bce537" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f065de4c5c4a842f52a30fdf7b0162594df70a4" + } + }, + "0c0cd995ac9e488544723e3e8e90a5fed98a6958" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42f56890357c304762f1c57171cef30f044ea09c" + } + }, + "0c1e13b0604290abd900eba3fb6b7560b3401f58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x295882ddd91b2f92c43bad0a51fd0ef7af61e72a" + } + }, + "0d11b1966fa90191f6927943c476d36fa3a31556" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2d923a66a9684f2268530094ce8e3f8b8cae52f" + } + }, + "0d1e5ab3b0c2d1ad5a562c123b7f01f4145074ce" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ed524088290909f92ade6d5f9d9c24071c26663" + } + }, + "0e0905211a442bb5838d2d6860f4f21e6b9c6593" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe134cc9b2be1a15b9e270a9f7baacbda3c8b365a" + } + }, + "0e639c40606e9329259d2f945f59dbcc6c5c5cfe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83abf69971313b011ee30466e8f703a460400558" + } + }, + "0e700a2aba22bd639abf05addbb24c53c3f0f3cb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1039c22c55420b0d7e65e6e6e65798f3f4c1e726" + } + }, + "0e8dab5716375707d97656230beb5f1445e56309" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6fc7016fa33af287b3b9cacd092c26bd9a05456a" + } + }, + "0eca69ecf3068082cff932c044fe39142ab6268b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4fc34bdd654289653ffc904f86ab2f17bad8431e" + } + }, + "0f065de4c5c4a842f52a30fdf7b0162594df70a3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ba53872256e6762bbfdbefb1bb80b26f94df9f2" + } + }, + "0f0f333b14cae00e0f74e1de336437d5644ae336" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3dd6e0baadd05402f490e3030ef1970d884a1cb0" + } + }, + "0f2fc64833681664e54ca74ea756c7233a05dd85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02391d38c9b4f03e9225ae5b28230284fa397a0a" + } + }, + "0f8f271215cf51a0646c8a60ed626515b3ddb739" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e1f5c577cd5a404507687ef379cd1e41c4a9a9f" + } + }, + "1039c22c55420b0d7e65e6e6e65798f3f4c1e725" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3fde19fb418799c0e1744b322314c17a863a0c9d" + } + }, + "104f577c92f14f3684c13eb179b9969c05115604" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3c7c94fe8e900964a9885a19e09a4ab80213c5c4" + } + }, + "1057c6ef671b124fc14b5641c167c6e6756d8cb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc06bd5d93ac2ecab95942d1639b700e3a2cc48b9" + } + }, + "1121c3fb4f490140339dabac59a62dd59a9912de" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x61306db8b4ac256266cb379b5f686e25cc117591" + } + }, + "11895349d40ea4683803f8eb7ad1d2355ff906d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31e7dce7c8469a6dc612dd8c0a1242846d31c06a" + } + }, + "11fde66f162bbb0e19d68f0c774c997d0165fa56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x36630619f71ccd89ea6fba8b13099d1483187b18" + } + }, + "1209046d7bf46e81d8202422e630719c906653da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc44e39eed84adf0c399a9d5af8d0053715d0f5fa" + } + }, + "120e38f3899a4e2f9f848a82c7afee288d14e7a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf6ee7d8bf313f837bbfed7f10b16fb2f182fd417" + } + }, + "1236efbead5ada892f61e7e4e59faa143e3bc01a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa20b30a1e7723ce15f80e9706fe9c1ea05170a30" + } + }, + "128aabc28c928691ad3415e3c57010c40694cd6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdf5767dc4d8111e8641198f637e4423c62e57e28" + } + }, + "12eed250610e4d59e841381dc46deaea3d9305b1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe9d157e81c306452f8494f681813037b146660ec" + } + }, + "130d08c2381d23796ff403d8f1fbaf204d90e3b8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ee27699bf52e4db7f72b3f2591f48e8ad7972a5" + } + }, + "134c36c64db09ad23fde5b43a3a7a92d84dd5300" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8732f022b6c57d291b26c830c651b3617c75b2b" + } + }, + "13911c90a6ddef5182a772116c1d9e98f27fb1af" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb31b1fe90a535ed66dfaf1bf9e1062190fbe88a7" + } + }, + "141182812579a73e13dd878d8a94bb628143b097" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0f8d2e75cd431ef9d818a2552aab19a6a99c1d4" + } + }, + "1456fa2cf6376b40069504e491e64aa40484fe3f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0602479ffb0636a1ce0fb57bf7949cc978250d2b" + } + }, + "1480213270423eae9d6b0a603541e989998453d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x689a40b4f540d145f6dc4ba4079e17f84b650f9d" + } + }, + "149d393bffe9be2336e7ffd6a109f05318dc798c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x13911c90a6ddef5182a772116c1d9e98f27fb1b0" + } + }, + "14a76e43bc292a0e69bace56681c4eb50d8e52d7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54a1706bea8f61e354b5296afa5a9f488f88ba0e" + } + }, + "15146e7f5a3d2db1c655ba9d8eaea6c62ca34496" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaae4f6978a8eb4a7be406a2a787d31dd49cd551f" + } + }, + "1555dfd05f003c056dc219415443be1a502fdee1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb572b99fc06b16a232d74898e587398d25d7d340" + } + }, + "157f8c66dd3cae32485b2d68a51c1dd7923bf91e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x534d2d9ab80a99d598de600ac2843f751e8bef3b" + } + }, + "1588c83de3fa7b22bf6aa67a4e91f303b490cbb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc7e31a320a9a7969a6f4c3cf98bd6d92a6119056" + } + }, + "1591af76c716952018e52e54c716e8b2226d494b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe365d9256480b1e9d3cc6eafdcad5912b75ad14a" + } + }, + "15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf45" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xecd38089d14a75b93afa634276bbe8965f5642dd" + } + }, + "15e75e648b604b0b8028f7955647eac6bc850088" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbb26680f6bb423720c6437fab35913d0a86e2a79" + } + }, + "161f83bac94d326e2a8debba84379ab72a14c6d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd65386ce109ffa3570dd27e54f32e2528fe01fc4" + } + }, + "1622e5aa3015448c3a7560b15a289d9aacc5370e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x291cfb4b02976ffde7f1f269a3e7d30940367e56" + } + }, + "1660ada72b0a07040df8d063f2f3f3fee891f1d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb8fc89fa4eae09e1b4bbb51f4c1791e589368802" + } + }, + "16c5f61453cff59c6b7e2a690cd902b72208427f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4cada4d5773385e68f4ff1efd1a23d75dbf1e61d" + } + }, + "16cab73035afa73268745a3c2937b551813c4960" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf8fc32491119dea2b7fda5080ef9cf0027590266" + } + }, + "16f5ee37c60dfd70f8281ac16cda47d665ef8789" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdfc26965c20fea217850a28c08021f1468146102" + } + }, + "1756aed6799c904988cc7a1dfabe77fcca058655" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9606aeadd83c5da2a613b0e132f0a6c13cee43c0" + } + }, + "17c7a85a071c3dee708baeaf56c208752c362e56" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b4615bc4b0f10948e46f967ca6e64cf91a77540" + } + }, + "18500d6a8e3e20ace9aeb507c213b6261b23f5d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb03a2acc80fce6d54bd1db95d7ff24123ed6e107" + } + }, + "1872142d84f7023b181766b790a4487f4012527c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe28a959abf1b36ad7778737d992690cb73a51a92" + } + }, + "18731575d0a6339f6317c2a1b628d8a4c145328e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbed1a42fdb56c7d562a773650bb2785737caca3c" + } + }, + "187749fd89567f9519f0d50b4a19ad2600440e3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4bdd7615ee906a0c88233acc5816b4fdb4656dfb" + } + }, + "187dea0407359c9579adbdf1ba9fad4a92fb358b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77d724d278fa787544189c4774f03849be2868f0" + } + }, + "188921ab89b5b8bcbe443676626e6012a1ed7dfb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a9015286f76ca4fbcc33e74e9c414be9774a67d" + } + }, + "1889f5317912e414fda653c710d2c17b7d5651e2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5ec829bcc187b6d19e825b5b6f12f86f81cc064" + } + }, + "18934934c2f7d8b6b645fcc90460a966df3a716f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x92bbf48cf4a124ffff047cad76c82db1a1889804" + } + }, + "18e0cdfc5a23465cfb3566091849c044d2210b55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x533069310b9741214f30aeec58be9d19f40161ff" + } + }, + "1963ac8fc10167891e91b4d3f53e09e0b7c9b55d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x29f147c366199719adcb2ed1d528c4f34c10dc04" + } + }, + "1a6bbe5380998bea238848b7a5927fa87e7b9fe1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b5fe85d1513c1a29fa825a343db7a80558e6de6" + } + }, + "1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbccf73dc6498406a51b4183e22c4be57de5c4976" + } + }, + "1ac3dd6a958d88e45c2c55d938dba74fa892084e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a635e63aadc395c1801c73640f256250d209b26" + } + }, + "1b6ec3b2772285abeba8f53839fd96de995c4bd1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15146e7f5a3d2db1c655ba9d8eaea6c62ca34497" + } + }, + "1b8a6f09f8fc9743b59ddbb2f105034e32262552" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcfb86844738d5373ad23eb3185e1e9fc5d517ae7" + } + }, + "1bce33a58c2741f74daab60067f759e9fc5f8c40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x352e4ddc3153285117254b1cc378d297b7a057b6" + } + }, + "1c2749b3a6c574b21622761bef7274261597ef2e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcaf720d275e228b58bcd8b2686714ed8819cdc2c" + } + }, + "1c32901c93008d3e09928bdf3385f32ecff9500e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x161f83bac94d326e2a8debba84379ab72a14c6d7" + } + }, + "1c6c53405b0eb8800a527cc5990fe3b259b50a4a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa015c57718562f3839cdabd7d4e9c86f1a321a1c" + } + }, + "1c827d36ec915dae96fdc0b164fb7bc1be9467b6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8228837a1a7d0ae41b857d852a8dd6b7c6cb3e39" + } + }, + "1cd063768378c77cbcb93dab0ba4c345d76bb0fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e8" + } + }, + "1cd52bab323ca2180a747d3c8b8405397003feb9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9137343457792227d68316f6ac0bc3518a7702e4" + } + }, + "1d3289a828d2bb4a86cda52b7772e2d0d508bac9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c6c53405b0eb8800a527cc5990fe3b259b50a4b" + } + }, + "1e1505a86f6b0fb5f7a4500cca953462cde929e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77f263b8c785ec73f9f77dd11ab64fb0089cb165" + } + }, + "1ea264b74c8f6e50586097e2e7c9a39419fd88de" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x208d07e7177b2e975c6b6d0eb3c5566900b87dfd" + } + }, + "1ec05c9f7c0ececff5088a06157f47f3e9dac9c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ccccc0744051db25927d850055234117778c1fe" + } + }, + "1ec26f14651cc567ce691ce83ef09eced6b12a6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x284452c049bb65ec77ed7502b19abf699127c21e" + } + }, + "1f01dbf8bd02bed14cc0a21831e044faa3f66fca" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc489e22b54124b98b17b68e7c38676efb81c1863" + } + }, + "1f1960aa296fd1f00ff131357138001afcd858a9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8c2e2a704d809931e711b89162391f2dba837407" + } + }, + "1f323b00b7be1e9c0713b080cadc05f45e5e7ec3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52b90967c04ab8adba7c6908b04eabf2c00bcf83" + } + }, + "1f5cdfaf598bd8002997b576e9ba849636c8431f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x965025b3b611003c82c8c9b69b35b4c5444cde6a" + } + }, + "1f95c6da6a9e0abe74900ec00388094d32d98a42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfcf47e5c1414303d55afc40c75c41cf42079d561" + } + }, + "1fce5879444d729719c03b5af6e074b87a49d933" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x08f86cd9e45cd0f821b6088ce2f1b3c0f70dba08" + } + }, + "1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x40e0cce7d94ab21453c5576f30a598cf9fa80e1b" + } + }, + "202474905af37a5074cfbc2d2dd0f2f205a099ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x333872ba7e8ce9c43e158b12a3d038d06672db7f" + } + }, + "2040d98a367ea817f76fcf8574d4df51234eb492" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x188921ab89b5b8bcbe443676626e6012a1ed7dfc" + } + }, + "208d07e7177b2e975c6b6d0eb3c5566900b87dfc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ec05c9f7c0ececff5088a06157f47f3e9dac9c1" + } + }, + "2099c5bdda1d98ce3b99988d768fa9f812a21f24" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb021f73dfd1500257934aacddd707e6f67173ee0" + } + }, + "21115fe08f7ec434d4ec27e8dcfdf31a6e50aa09" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38ae3c2e0c1fa2eaec3648a2829fa362b5e01352" + } + }, + "21190aebff29feb773919d8572f8cc825bbf7144" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe026a4835edf27c2705c97f237e5b59b7b5da1f8" + } + }, + "21368af8397276e6e4b284fe36f525dd323bd3da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ec674e8eb6b890cbb7df926def8fbbb2a6bba71" + } + }, + "22230d8d10e81e01450aa68bdfbee3c20d969de9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cefc7e38d2a714318e5c36c3c21b226b10218e8" + } + }, + "22affea985c1a1ab7007a55e77e80c54111708be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x559bf1337f14e89aee38a9859ec9bf8035e8f6c2" + } + }, + "22df73cba33d8fd14fc985fccded670de4041f25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcdcc86f0d7e95ea5b2f9f5e802015c8ff855b258" + } + }, + "22f2f312befc07db595b5d9fcbc4caa7ee8df51c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2f828407f1a5fcbb1e4ec079c22d791c7fa5479" + } + }, + "23138c70217200a44c58dceaa4f5ab06470213a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x71a2fa577619a37c2e2336bb6c20fc1af1938610" + } + }, + "241b46962af48709f1a19739ffdc7bd3f0d2c7ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x310782e2f6d97ef0abd4a4ccb75b401a7d348be7" + } + }, + "24248d1242acc87dc331e87f3142951a977a3d2c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e574f7a4c8f0e80964604262ef68b3168fd31f0" + } + }, + "24ce22b6a7f4227e1e3a6c03c14d07acdb2ec553" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x080e2ae63ad3891bfba9ec5200f4ba383209ecdf" + } + }, + "24cea63a6f0ede9a0fa91907e841ba4174e1cd0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8a2cab44ea3d5c52c704f060f4088e505791a57f" + } + }, + "24dd378f51adc67a50e339e8031fe9bd4aafab36" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4202b8b8afd5354e3e40a219bdc17f6001bf2d0" + } + }, + "253a31b068a402910eb30758704b78c375ea349a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c70cf636b26ffc099fba8ddd5093e95ca8e7783" + } + }, + "2559cea11e9d8fd293253a8ffada7558c9c4db86" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb94d3b46afb9954a375e50a6fede26705800a058" + } + }, + "25c0d5ce71eec198760c001497350ad83df55ea8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1864a1fbee8126e530b9242353d9cb76b043fa" + } + }, + "25f81565c6ac2e22d7e320168222450c2cdf4f6d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e36ffe7590f8dd7fa9c4c03cba3120674814abd" + } + }, + "2600b9122847ee06e201ff6a734fdcfa74b2be73" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e85699a24243e147ec809e30761d92c0d21392b" + } + }, + "2652f49b5ad98503231b3befe7587c231be8a5e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8fb5f5dc4d66ea0233a652230d44299718cb9f9f" + } + }, + "269f24e1ae86f63876b0504b7b26e20483fa95f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e0905211a442bb5838d2d6860f4f21e6b9c6594" + } + }, + "26be5205dce0ce433dca3602886578160e6d52c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38813e8d77b07f357888ea1a7805ebf52c59189c" + } + }, + "277c19a0f1e4f5e4339de4d0223fa254a6c8a5df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98b163f2929e5c92709759e3215879acf32a3a99" + } + }, + "27b3a0698a207d5ed960cf71b1ee9fc54c229eb4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e24d18a80aeccbace499b6d26b655633c0bee9a" + } + }, + "28313061667479bb25119ca3090cd25c4a99a20f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x241b46962af48709f1a19739ffdc7bd3f0d2c7ae" + } + }, + "284452c049bb65ec77ed7502b19abf699127c21d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b709" + } + }, + "28cd47ab2e86fe040740206eb31fe193df7cbab4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xefe2a6d8859b14ecc69baf66dcd47f4067df18e6" + } + }, + "28ce21f7f28c8a546bca1697ada45cd73473465d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e2a31e29b84cb193202609dbd86ebaf9a83c11a" + } + }, + "291cfb4b02976ffde7f1f269a3e7d30940367e55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98ae7604effcc8bf6accb109ebf78fb6f5dad01e" + } + }, + "293f982d000532a7861ab122bdc4bbfd26bf9030" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x729af7294be595a0efd7d891c9e51f89c07950c8" + } + }, + "295882ddd91b2f92c43bad0a51fd0ef7af61e729" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4fe8f4ad85487cfe365ca212848f7c970c21e136" + } + }, + "29799a64a736832cda536d687dd443ef3bc31e57" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54d1de66a65ecf30d79037a8c8af99c633113517" + } + }, + "298b8bde7997684bfe4434cf6d24d50ddabb69b2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x25c0d5ce71eec198760c001497350ad83df55ea9" + } + }, + "299528bfdcf20ff8e19a7a3fbbdfe98eddc2604c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0f04368af17d56c8cdb50f0fd5f1847d9a49cb2" + } + }, + "299f80e93d68725830c27cb084265d0e634e4f77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x939023fa69f246b709a97f16c37367e36267828d" + } + }, + "29f147c366199719adcb2ed1d528c4f34c10dc03" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c7d893aa4fba1deebfc9a5a14b27e2ae7f66404" + } + }, + "2abef5958c8b283eaeec4557844ff1fe194e6cd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xffb9bfb24fb671413a3aae05e0f21b870eeb2aba" + } + }, + "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { + "balance" : "0x032e2d4c", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + }, + "2b5fbc2f7e76f6281861cb4282effb94d609844d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc37d1d79868b6a4c25db68301b8575ae4a8336fc" + } + }, + "2bab1d9132d47e56f937ef50987cc52c9adddf0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2d960addf6048f155cfaac4ad513f46429bb58f2" + } + }, + "2bb175c167599417f2192d9f926a5c648d17de8f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x799b6226b099fc75d1fc2cf6f833bdfc1fe63e49" + } + }, + "2c4a413bc345da77b2d07a17313b6d89aef2c2c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd6" + } + }, + "2c748f96ae0e6e9b01395e8a73dfc351c46658be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c8" + } + }, + "2ccccc0744051db25927d850055234117778c1fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x624a9bd6345be1a95c7fb509ca4bb77d05138adc" + } + }, + "2cd26944d7baa6d92eee478960d5778375862e85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8b0dfaaf9135721f01f3712572ea9963d70f49c1" + } + }, + "2cf5732f017b0cf1b1f13a1478e10239716bf6b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaae4a2e3c51c04606dcb3723456e58f3ed214f46" + } + }, + "2d142ccaa1337198d592bc36ce7c5447da73f906" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18934934c2f7d8b6b645fcc90460a966df3a7170" + } + }, + "2d960addf6048f155cfaac4ad513f46429bb58f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e76969932c5d314142b23c555af4625fa6b9344" + } + }, + "2db5e35091789102bd0019b4ee49bcae42524428" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d47d935a3a4a4618c67f337a0075d26d9c1f853" + } + }, + "2dbc14a87a2b5a8b780e460dbe0083d8260326f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x40652c9cf91678111a21c62d7206ffbca3d47c9c" + } + }, + "2e070631694c093a9a329ec0b4a1cfa57e20ab77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x312f80de0869a8fed49c8ba843484411c47dd13f" + } + }, + "2e574f7a4c8f0e80964604262ef68b3168fd31ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe4f48d16a7ec27241b987f3545423291c7cce78" + } + }, + "2e83c90e7fa359705ed2138854a83a9145c27a8e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc071690916c15657eba376c7c6b4b06d38e815bf" + } + }, + "2ea29d9016f2b1141475e4c3c62e031c0a908a07" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x128aabc28c928691ad3415e3c57010c40694cd6f" + } + }, + "2eabf4237f49d4cd44ec256436b99ba41828d36c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ab2ec9fb4e5d9d8cd15a1ad495ff314b97869c7" + } + }, + "2ed524088290909f92ade6d5f9d9c24071c26662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe8373e7e464120da8a84da82c8137872cda65781" + } + }, + "2f171d1f2cf19f4a458b7dc4db89fa7cd818dda0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe81f08cfb60f7c156cf7dcbee1b8790901a1eadd" + } + }, + "2f8ac479ce5baade6a63ecadf9599bfb0ecdecde" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d07bd78606705bb5c62fd390123b4e45f7d74d9" + } + }, + "305773e25e157761c9d55cb7d9e24fc1b953a8b9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x462cf0e5071404ef569338a6f0a5b113d64a11a3" + } + }, + "30b37f280d6735ee04239de0963b071f83c13a27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba3adb3b7ccccb748a65932e0254e52ce092c5b6" + } + }, + "30c5bc3861dfc5a70325aca029ab5dcb2d72928f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02fee10ca6c1ed23e651f29c97a310b1b4dad140" + } + }, + "30f51302b4630ea1b8bdcac380bd97d78c8f60d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22f2f312befc07db595b5d9fcbc4caa7ee8df51d" + } + }, + "310782e2f6d97ef0abd4a4ccb75b401a7d348be6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39ed2d94ee4aae100b111c773d4f3b78bd4e9292" + } + }, + "311f9efa9544b1c8a8277c52e0f1ca47daec8c00" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ad37e86c8d4b961b0302ebf0a540ae83f3679ed" + } + }, + "312f80de0869a8fed49c8ba843484411c47dd13e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe93e7128f80bef53e3217782f21f4bd6a6d19c7d" + } + }, + "3174a074366bc04bfb7f2a728a725cb01cd575d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc4170be517e6c67a9e65dddb09220df58e547103" + } + }, + "317f31be5e04361b11b97ff2d6fc682030d8cd8d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1fdfe5402a88f71bfbaf9c65f6df05b8eb6232c2" + } + }, + "317fda8ec45232a8259546a4ca8ebef16338d47b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cb15938a825ff7c17ae775b6454730983522907" + } + }, + "31a87a9e67b2728c14767de26753f205b793c5ac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe3d08fe78f595bede290f820ec0e878572803a6b" + } + }, + "31c640b92c21a1f1465c91070b4b3b4d6854195f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98ae76bbf3fe4b779df55df06eb0081ac95d6610" + } + }, + "31e7dce7c8469a6dc612dd8c0a1242846d31c069" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc1baaa8621b513d62e8aeb02543ce5c7b8020c1" + } + }, + "3229e332af8eaf358f44aad3a902a6c47f96983e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8b0c28ef1527a918fc7dc134ee6c00f069c7073b" + } + }, + "32a48ace80773ad092de1d9bcaa00787353b5fad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3a4f3cc7113eb16572eced68ab395a40ceeda1d" + } + }, + "32de9810bbf442f9209f994556bc9a7f7e6da500" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xac0dbbd8aa555e012e1b5fde0b4e1f20e30a057f" + } + }, + "32f9418411245a8bc6982ff71436ed2de87e3d96" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0801871b468dfdcc2d3bc0c0d01cb6ee02afe582" + } + }, + "331a1cbbb58594c3636c0e54de517c4a6cedc27b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e0506e272fb9d9369627282cd76a40e4046ee85" + } + }, + "33207da78e5ef3dde6fceab85bee1b5bf717e139" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeca2fc261f07a269c2487e6d1b0539d0950ff793" + } + }, + "333872ba7e8ce9c43e158b12a3d038d06672db7e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd5" + } + }, + "33b82c3871bc89d9137c62af099a0c4e5911a047" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7213c423e1db8af095bd3cefb15e43c6067635ef" + } + }, + "33c85ce982d0996ff7313c1387ab93348a6777d7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f5cdfaf598bd8002997b576e9ba849636c84320" + } + }, + "3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5216a59dcffc6105f9b58a0b397baad604c0dfb7" + } + }, + "34c972120d50fbdbb38ba536e4d61bc8f995d19d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b8558347f669cd9b50f70cb501cdbf05f93b576" + } + }, + "352e4ddc3153285117254b1cc378d297b7a057b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2040d98a367ea817f76fcf8574d4df51234eb493" + } + }, + "3539fe0192009fe1a9d35901b0ba951a59348a97" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad7" + } + }, + "36630619f71ccd89ea6fba8b13099d1483187b17" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x11895349d40ea4683803f8eb7ad1d2355ff906d9" + } + }, + "3671a99d2a485b30fafa2a65f405b6b03ed32ea9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x925cdeaf40df0ac82648432e65481350417fd849" + } + }, + "36a9d95fe0c701c65370560445c6a80b4e13c8d9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd1171381ba62ff31b56a001b8144e64e365eba2" + } + }, + "37609ce3799a1b75ea6090da3d014d59e5e7851c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3f8bd9d9410af417dcc6969b64096380e1a6d0b4" + } + }, + "379ef6dde2bc54ced45146d4907639ee7cf1c8eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe19f216f6b8b78ff1e705cb56d0cb07db60a05ed" + } + }, + "37f998764813b136ddf5a754f34063fd03065e36" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24dd378f51adc67a50e339e8031fe9bd4aafab37" + } + }, + "37fa399a749c121f8a15ce77e3d9f9bec8020d7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04110d816c380812a427968ece99b1c963dfbce7" + } + }, + "3820c20f3f8ee1b164dab460b05a979640a41369" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7642513288c9da66960a6f3df0c156a8e1dcb11a" + } + }, + "38450559e7ed9b72c80aa00855b942f9bac1b281" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc1ab531ecade623c0c908c1fbf104fb8c647a37f" + } + }, + "38479ce52243f1a8b358515a084fb41533a723fd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x636b02091904e5b452d19455f484306b8fe62dd7" + } + }, + "3867a470ae1d99ccc7af287ed95ea4da4fd49e52" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xde63eef4b269d8572b6b00574ad8e34c471a07d7" + } + }, + "387b1112283308ce33f63062a7531e6fe0f3af16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d9834013a85a25df2e3dead1986d753457d7b68" + } + }, + "38813e8d77b07f357888ea1a7805ebf52c59189b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x891c7f214e32206e8f497fdaa7ee419e2e8f3dde" + } + }, + "38ae3c2e0c1fa2eaec3648a2829fa362b5e01351" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79f2d463ce2404b3e77db5dea5cc19d76ac223dd" + } + }, + "38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30c5bc3861dfc5a70325aca029ab5dcb2d729290" + } + }, + "38fe3b47fed5fa6d060bde66598bf5a773b831eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1057c6ef671b124fc14b5641c167c6e6756d8cb9" + } + }, + "3917f5ac4614ab7d126adf2f5b1d578f2b91c370" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2bab1d9132d47e56f937ef50987cc52c9adddf0c" + } + }, + "39457953215cb93e68bc5b351d63a8b7fd16031e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e8dab5716375707d97656230beb5f1445e5630a" + } + }, + "39d9b351db53d59af4907116d594ebba910474f2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0177fee01c15eede3b794e761753c1f6d108b7f4" + } + }, + "39ea196ad4678ac786f9ff4ba12edbb364cd1baf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x202474905af37a5074cfbc2d2dd0f2f205a099ac" + } + }, + "39ed2d94ee4aae100b111c773d4f3b78bd4e9291" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa6495f085bc30ac47e89a9a700e406e26286c3f9" + } + }, + "3a9d3ead70f9c3cdf9a64b25b5c1bf765fe09fec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb5f4de69833ef9f1392c74a5ab905c5cd1ab2875" + } + }, + "3b7465c98051ca273d8909857047d5dc5b022af7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x05e29ccc32df8edacbc5bd6fe19fb4ca0292896a" + } + }, + "3b7d7653d3a7c2712d08bd29668163cb775c74a9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x50aada85d21c462d9c2803fd3c22beacc61f496c" + } + }, + "3bfd62743dab66288fe0b993d893a41d2dc3fbba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3539fe0192009fe1a9d35901b0ba951a59348a98" + } + }, + "3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a777" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8f55e75b453fbb3071e4454119a33477c6028789" + } + }, + "3c7c94fe8e900964a9885a19e09a4ab80213c5c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bf1ac936d2312daf08e481d85e99151cdfdb9e2" + } + }, + "3d082c9477c05d23447d1682257a9d0ac1f948be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x07318879928543f66b36e58900a870dfa83313" + } + }, + "3d64e9c7cee7c3d41cfbeed851fff8642bd0200b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c41aaac568600537f36df0e35cb625dfbed75a8" + } + }, + "3d7b61ce014d1cb84465f1f908a6a940fd991b39" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9e8fe9f31e954787e0f9d01b4a7a0c8d3d320615" + } + }, + "3da1b91d461c3220510e60c0c5b87be635068740" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf85aaa082ae886506141245ea3b43ee74babca66" + } + }, + "3dd6e0baadd05402f490e3030ef1970d884a1caf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x317f31be5e04361b11b97ff2d6fc682030d8cd8e" + } + }, + "3debce965330c2da68edb1cdd3ac380d5ce67b10" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfbdc8132551b0ed5c50b6c0f279097592b5c87f0" + } + }, + "3dff39a90e67e86536dcc8b4dbfac04da831e0b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc291bf92ff9bdc0e60f049e6a5b143b940658858" + } + }, + "3e0506e272fb9d9369627282cd76a40e4046ee84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaf3cf705624b239ce07280597a55dc8ca69dd087" + } + }, + "3e1b0d3f5819f63c9621ba4d4af623a7b89b99ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x401f65fb53496c7746dc6477f6f9d67246965d52" + } + }, + "3e3069deb6f503bb8bf155eb2f89801140831f5b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94bcc8632137dd2d666003e33d1e7c2fdd6e95e5" + } + }, + "3e85699a24243e147ec809e30761d92c0d21392a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe3443d812bb8204255a1d249b82aa19508dff5ca" + } + }, + "3edca986feba79717853d9b91595ae61d953736e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30f51302b4630ea1b8bdcac380bd97d78c8f60d4" + } + }, + "3ef5e42a0012b430169dae579f8dac0f6ef5dc38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e44d26c7ef8dc51a45248573f6a8e5a9f91a0af" + } + }, + "3f5bf6c71c4fae1a91c1cca72b539dd83762a716" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4481bed4acdd11d8f22f535016a762cc87845c3" + } + }, + "3f8bd9d9410af417dcc6969b64096380e1a6d0b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc2afed79b83fc6b8d98802f52b1fea6648571ee8" + } + }, + "3fabe5e3c3a59fd322cb638dc5295d1e94cbcea3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7b7c5f65fc11a6bee686b9363884811be247c44" + } + }, + "3fde19fb418799c0e1744b322314c17a863a0c9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4e76b020a22e8c1929ba2163e413385fc0cf885" + } + }, + "401f65fb53496c7746dc6477f6f9d67246965d51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e0ea0c533298d20ebcd19482a8b1e1854dda426" + } + }, + "40652c9cf91678111a21c62d7206ffbca3d47c9b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xecb643ddbca1cfa6dd22964c20ef57ab47c0fdaa" + } + }, + "40e0cce7d94ab21453c5576f30a598cf9fa80e1a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93840036a3c19b1e91ba0ea10f95a5041ef61a40" + } + }, + "411456908355aa037314aa920e8afef3632503fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0473710fb4277459429e0c4a862ad3e4b45692e5" + } + }, + "41493b8488a0ae34cade12733e8df93a87f3ec7f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf904cb6a599db50cc635bb70f3c23f056e39914f" + } + }, + "41eeae22551bd18167a31036b363bdcec89a7d9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e15566ad3e90f3c4c12c4d7fdb17e12c24da66c" + } + }, + "42bbb8e2c7347e29f3a679e4cc9d1ca75319fbd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbf36bc1d23eebe66f84a0f119552dc7b46fe2403" + } + }, + "42ea619ae1a90979837ad2137458d991ea0613be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x570dce0f67e367a085e51a47d6c93891a82d452c" + } + }, + "42f56890357c304762f1c57171cef30f044ea09b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x49fc4b5136601d856188898008375b9c1bf5897f" + } + }, + "42f8c6079f5658fc8dc5629b63684f278acb7648" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9c89251856283a8e3aed6d801ca965fdc1da4aa8" + } + }, + "43b0edac3c2c58f16fa2380089d841c420a14236" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x331a1cbbb58594c3636c0e54de517c4a6cedc27c" + } + }, + "43ec9b975f37266d0ff7f044581db559fb9376c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x931543d59701f1a123f3850e4c6e4b0ea097ae5b" + } + }, + "444e8af4b323407d02a7f96c209b712a65c6aba9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe686acb3b7cc09ec6379af828b4b3b638898131" + } + }, + "44b329f4eb8ebaa00d731472964de821f8e53a26" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2ea29d9016f2b1141475e4c3c62e031c0a908a08" + } + }, + "44d13c51fb706efb7394346b00debea9ea46e9f3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb008af759b5359810c78d181f0743ed85c286117" + } + }, + "44ed3a04032bf3585faf1dfedb9806eeb8345809" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa301df371257a12c7bc93194ec045d211a2d435a" + } + }, + "44f344790e299b22484749266ea59bbcd58e4b0e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfdc6c80a86ea555b5de26c3db49a779eea6beb0d" + } + }, + "4582048e819b7d55b3c6f47e46ef8dd8fdd12038" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x552e158ca0fbd97f7b3c6208ad3f956a67c8df79" + } + }, + "45eb1861d0701efb338468964c2495db8e7e3411" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb376b876f7137844ef5e2db1e307713885ee5d34" + } + }, + "462cf0e5071404ef569338a6f0a5b113d64a11a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4dbe6269722a6063d594dfb65eba1f2a10488964" + } + }, + "46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a15" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf1ba5e0a4a27d8dafcf87f049b178fe83574ac07" + } + }, + "479544e8b67a7e82120d3c5d7869b4c55f4a0de3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1555dfd05f003c056dc219415443be1a502fdee2" + } + }, + "483940025f2d36cb32e93ed80caa41f15487ee7f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfafa31e9b477adf7a26b651aa9913f8664e536a5" + } + }, + "48e958f074c27f1d190e69ef8c01f86931b278f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa381c1eb58a73d7e7c8b857fcf3a1b50c6116e1c" + } + }, + "49a01a2696857efac9ba53c2705ea4ffdeb30419" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x784c21d8eb231135ac99a64dd2ee334b045043ae" + } + }, + "49fc4b5136601d856188898008375b9c1bf5897e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2c748f96ae0e6e9b01395e8a73dfc351c46658bf" + } + }, + "4a0ec2620d55cefe3e80960f83ebc81219ebabcb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b1718e3af89692315a673b5c134361408069b01" + } + }, + "4a1edf2110e4ff29c69b835bdd375ac88525dde6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1b6ec3b2772285abeba8f53839fd96de995c4bd2" + } + }, + "4a466c64765157e1a9dee46e1a26d95ac2664c4f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf783f583fc06d2c88e9e0d263a6ab66f8b8a0515" + } + }, + "4a635e63aadc395c1801c73640f256250d209b25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf07ee5b0729c565f7b57995a108f94e4fcb81559" + } + }, + "4aebaa9fbdb040e8037e78fc37785f33dc3cafec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xef36b064bb706bc0540e4ed2b341ae8a0b7756b8" + } + }, + "4af174d239e86ee19d40026eae04486804602061" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x45eb1861d0701efb338468964c2495db8e7e3412" + } + }, + "4b2c0c38418eb142d686d124ac5fcb363b061fd7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa0ebd1b4fc0821dde34f102f6030fc9c40b29ab1" + } + }, + "4b414d48f3871bc957751d5895c96f090b509bbb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xece9d0b9393f64338ec6ca5b0efbcec2175f19ed" + } + }, + "4b6dcb9105adc3ccc34c6c180e9e2212c1789975" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb9261902783bf36bab49f18323a9c8e4ad8651a0" + } + }, + "4b8558347f669cd9b50f70cb501cdbf05f93b575" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x697f8deffc4b33738f1dc02e792b5cb4a37ead07" + } + }, + "4bb5fc5d686cfb132c177aee8ef426e5de98cc6b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b6dcb9105adc3ccc34c6c180e9e2212c1789976" + } + }, + "4bdd7615ee906a0c88233acc5816b4fdb4656dfa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4429d6274f10ef0b7ba30837c5de603ed4c16f0" + } + }, + "4c0cfb86a402c70e6b110a1237d10c7fc7fe9cd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1588c83de3fa7b22bf6aa67a4e91f303b490cbb9" + } + }, + "4cada4d5773385e68f4ff1efd1a23d75dbf1e61c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x43ec9b975f37266d0ff7f044581db559fb9376c5" + } + }, + "4cd33b31663c159fbd73cbb32f616eb46f7b18a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea216bc75a65a838ea3d63f7c05588c2840ec1ac" + } + }, + "4d47d935a3a4a4618c67f337a0075d26d9c1f852" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xadecbe660a4943fb6feada38775e51259ea15af2" + } + }, + "4d4ad735b52df9e88fbebebac2de1ede991f9994" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e2da6b24262f419933bd63b03d470ba019350e4" + } + }, + "4d7a1e5009218cf5176a313f6922c3ab01d4970d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3917f5ac4614ab7d126adf2f5b1d578f2b91c371" + } + }, + "4d92228ffbe5ea89389a34a7086e4420d61eb70b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x985e84916da5ee358e1c119c9b12ff133da52d2a" + } + }, + "4dbe6269722a6063d594dfb65eba1f2a10488963" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x36a9d95fe0c701c65370560445c6a80b4e13c8da" + } + }, + "4e36ffe7590f8dd7fa9c4c03cba3120674814abc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc2a603dfbb0734c098e5b6b7c8a9b64bab11054f" + } + }, + "4e4ad0ada6b3beffa2436bef1f6a8054f4476be8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdd0eda6e9a3dccc3d430e5dd333c83b759cc7884" + } + }, + "4e5cd86dc5f716ebbdf6ef572a369c227986bde4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa31b0038c42665206876c410caf02e67405dd000" + } + }, + "4e76fc5e619a4200846eecdd5545b39499debb10" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x68ec6ebf20b30a31b09c7a35d847da342e24a3c5" + } + }, + "4e86f346747b828937501ebfda05b2b8fa16f87a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d8dde5a13af888557ddd5b931dda20ae59e9e24" + } + }, + "4ebc77b7203cce293550d92b2b5587621cf53219" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24248d1242acc87dc331e87f3142951a977a3d2d" + } + }, + "4ec27065c52d294799b93700dcee6e32778f1b18" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7bfac062ec8fd11810639cc02f02aa8c61c6cfb9" + } + }, + "4ec674e8eb6b890cbb7df926def8fbbb2a6bba70" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8c3cf855531e1d06c07245e76c5298b4fc90d8b" + } + }, + "4f14a61b9f2f99e50b719f1345e76339f7618202" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5552ed8dae24eaed9346af3186f634d38ee9ab0" + } + }, + "4f36659fa632310b6ec438dea4085b522a2dd077" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaa6cffe5185732689c18f37a7f86170cb7304c2b" + } + }, + "4f5af8eccb582ad30e2702d07577479599461c54" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaac939ac7c11bbbfb7f4520d14442a2460a51e88" + } + }, + "4f5c55986b93d742d196235aa7329df2c8ae5562" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x157f8c66dd3cae32485b2d68a51c1dd7923bf91f" + } + }, + "4f86da4fecade6017d7f15e30d8320446306870a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x49a01a2696857efac9ba53c2705ea4ffdeb3041a" + } + }, + "4fc34bdd654289653ffc904f86ab2f17bad8431d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x029f9045d1904fe6076c4dbe77bd33290f390715" + } + }, + "4fe8f4ad85487cfe365ca212848f7c970c21e135" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa02b80b54ccc306e042c286172ba903dd53fa4c4" + } + }, + "5038bd4d6b5b31100c52c85ae3294d525596836c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa724835568fb5e3986c1e87331a18b6628b73e26" + } + }, + "504ba70fca5091ea426c964ac631082e4ad51672" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6a22049b6339e13438521842386a7118d6a1a15c" + } + }, + "50aada85d21c462d9c2803fd3c22beacc61f496b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x17c7a85a071c3dee708baeaf56c208752c362e57" + } + }, + "50dc3dab5836e25872ec87bb2bb30ab57a35fb0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6afeffe32a56293f23d655a1d1b2bf31d616c2eb" + } + }, + "511b33319d0f7df487e07c4f5d149b27cecace46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0bec2514a2a40586ec75e27442352d1dd2bce538" + } + }, + "5154569b5138f7c1b77d4434860a92ff5707e047" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32de9810bbf442f9209f994556bc9a7f7e6da501" + } + }, + "51a578dc2949f3881535733a5b1a7b5bd308215f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x311f9efa9544b1c8a8277c52e0f1ca47daec8c01" + } + }, + "51cc4a0bffdbdd8313ed94ebfd5524e8200f4876" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16f5ee37c60dfd70f8281ac16cda47d665ef878a" + } + }, + "51fd18c9ab9bbb67c27373e8ad754e253e09dbdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9860a22b84f982363ab9684d767a347a5c4fb75" + } + }, + "5216a59dcffc6105f9b58a0b397baad604c0dfb6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f8f271215cf51a0646c8a60ed626515b3ddb73a" + } + }, + "52b774b5fab1f557024bd4a7cbec4cd014b81557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a0ec2620d55cefe3e80960f83ebc81219ebabcc" + } + }, + "52b90967c04ab8adba7c6908b04eabf2c00bcf82" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x77f14e248490de6b7afb327c0f013c54ae31d2a7" + } + }, + "52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cbb5a7f2afe219ffb9b787065cbd94ad44ebd25" + } + }, + "52ff6062b4e65231065d5579f870b7f1472a5853" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1480213270423eae9d6b0a603541e989998453d2" + } + }, + "533069310b9741214f30aeec58be9d19f40161fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x187749fd89567f9519f0d50b4a19ad2600440e3b" + } + }, + "533a4a1adbae2d561beb729c53e46251ab3a407c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x504ba70fca5091ea426c964ac631082e4ad51673" + } + }, + "534d2d9ab80a99d598de600ac2843f751e8bef3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe49d92946422e69977a94d1b4b769f97efcfb8ec" + } + }, + "54819bf1efa86437d2f38b4211bdd5229247d9b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a0fa2b2dd4993b5ac3370b4047f5e4472121675" + } + }, + "54a1706bea8f61e354b5296afa5a9f488f88ba0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb4e97f22f12995949c371f2df690f68f71070ec" + } + }, + "54d1de66a65ecf30d79037a8c8af99c633113516" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa686b20553a38e866228ce003657a71200957c3c" + } + }, + "55010017736ad7e8e14327cf0230ba4c6bab0450" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9e30a8e67c1dc0ddcbcb8c0d957101801fd250cd" + } + }, + "5503d35e96e76e02db22c51fd7fd3d5c0667c885" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15e75e648b604b0b8028f7955647eac6bc850089" + } + }, + "552e158ca0fbd97f7b3c6208ad3f956a67c8df78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f3d23738538a34184e3cf16506685cf0884bac6" + } + }, + "5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87b27e4b436adde9bf724b4889980331dd038d4a" + } + }, + "558fb0163d7794abf1b241aa4728390028291ce7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e0a20c94065e338c7715046a320ff4495b4fa85" + } + }, + "559bf1337f14e89aee38a9859ec9bf8035e8f6c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4aebaa9fbdb040e8037e78fc37785f33dc3cafed" + } + }, + "560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cda" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4ce" + } + }, + "569e42b9cd8d79ee5c5ea9c68ba948b7b4d8d84e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8b331eb5ad444567964f34dc24757bdd3425944" + } + }, + "56cb9d29e9be519d3fc1cd21fcae7750aaa8b845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe913f5b697154f99bfc159a132c6c253b457ef19" + } + }, + "570dce0f67e367a085e51a47d6c93891a82d452b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3da1b91d461c3220510e60c0c5b87be635068741" + } + }, + "57cb48688d626a12fd4caee130b11e1b06ebaacb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba158ff71047c0322b1474461f94c0246d0dfb2f" + } + }, + "58cbb2379b1fdac0a036bf75bb598e7d4fa232bb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1889f5317912e414fda653c710d2c17b7d5651e3" + } + }, + "59ad59b53c0d9bbdf0ee0912732baa43eacaae99" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd99befc655ecd5df508569aaadd729af7371687f" + } + }, + "5a18f1d5e443321d54d1dafb3e3b5b6f2899378d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e89d5dd43fa9fa54381f234d1f7251387a0692d" + } + }, + "5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1236efbead5ada892f61e7e4e59faa143e3bc01b" + } + }, + "5affb7ff218092cf60bc1ba4b32ea65a32cd6844" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0891a47ead61f684dc876e12d5261ab614d0fa0a" + } + }, + "5b1718e3af89692315a673b5c134361408069b00" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28313061667479bb25119ca3090cd25c4a99a210" + } + }, + "5b2ed45c5376c8359479e1b48f8c07437ec78336" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe5fa8de537f7665e2aed751b8ca7c6b5bf0cdca1" + } + }, + "5b4615bc4b0f10948e46f967ca6e64cf91a7753f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd10afb219e80a211c9072b18de0ff2317f67e574" + } + }, + "5b71d8cc27346cf6d64e101aab9c88dfd58d26fc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd743161f0f7beed30155e171b4d577d5ce2a70d4" + } + }, + "5bcf5f7ba278df5a31f48a5706e69816727a6e9b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f562b4994dff65756e316febb8d5a5b99e11421" + } + }, + "5bd96b317d4163401c9b1a2271c03b9439e73e6e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22affea985c1a1ab7007a55e77e80c54111708bf" + } + }, + "5bf1ac936d2312daf08e481d85e99151cdfdb9e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfed73d1755549bd523a775e81cf80a1a507eec51" + } + }, + "5c0ddde0773ca1b8f9b07ecdad9f47f2705640e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44f344790e299b22484749266ea59bbcd58e4b0f" + } + }, + "5c45b1eefac6061c7713919b34f5dcae9d5cfc7b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42f8c6079f5658fc8dc5629b63684f278acb7649" + } + }, + "5c70cf636b26ffc099fba8ddd5093e95ca8e7782" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52b774b5fab1f557024bd4a7cbec4cd014b81558" + } + }, + "5cf45d08c0b55dd9c34cc4cb718c917333f2e9f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2600b9122847ee06e201ff6a734fdcfa74b2be74" + } + }, + "5d07bd78606705bb5c62fd390123b4e45f7d74d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb6367a493bbaed7334456b3646e4541c9e96012f" + } + }, + "5d11f35386d10cfa7121b02056d97dd932659943" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b0105812868d533882ea4f08bb628e5e9d811dc" + } + }, + "5d3292b79851f68d3907a550dc1a0b569d603f66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe14b8b08ed9b569d2945b078fe94225924c5987f" + } + }, + "5d57e28e16bcf33b37672eeb891b29c481e89120" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x012255fe8647bfe207603a62536ac6ae7a230caa" + } + }, + "5de8956c0c99e2dc6715201b3a9e1d5fd53b2dd4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9917620c3df2e3cae0f0e690b4da82221bc26eff" + } + }, + "5e0ea0c533298d20ebcd19482a8b1e1854dda425" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x59ad59b53c0d9bbdf0ee0912732baa43eacaae9a" + } + }, + "5e5a0b9c4c36067c8730abecdb29ba97aed877a7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x483940025f2d36cb32e93ed80caa41f15487ee80" + } + }, + "5e74c3c0f3bc39154407e9a3c55cde944d1ca04a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97b61770815f0589776243ec8ffa365b86548b29" + } + }, + "5e76969932c5d314142b23c555af4625fa6b9343" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ac3dd6a958d88e45c2c55d938dba74fa892084f" + } + }, + "5e89d5dd43fa9fa54381f234d1f7251387a0692c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8135c9c23bfa97243ea79214772816339552f836" + } + }, + "5f1703b93938752face6e4657a90825b77f455da" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x03f3095f9e46a8ac62005c42aaccbc0fcdc3aa33" + } + }, + "5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a1edf2110e4ff29c69b835bdd375ac88525dde7" + } + }, + "5ff4d4daf0a832422c4675a77720abbfb5afbba8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c2749b3a6c574b21622761bef7274261597ef2f" + } + }, + "5ff4ef866c3ad4102444d020c1d21c3d35a119eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x98cf6cec29c58634b6022fd1e8f54f912921eef4" + } + }, + "60a2db26238d52510209c569dca17c1f41c9a544" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d4e21638e756b9953576f460037cd702d102120" + } + }, + "61144e43a08b3852bcd531d13f0485743bd835a3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0e5744863b26418baf12f94f0bdad2ef2546a93" + } + }, + "6123d3be4335107712685be2d575958b17501067" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9cfe89d89bfe28ba95777b6a90ac7ed86b0e2030" + } + }, + "61306db8b4ac256266cb379b5f686e25cc117590" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbb7a0556525b43c750e380a0ac1ca3bb719e601d" + } + }, + "614037f9a7be1ab2131d485845f297f2d62d569a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x55010017736ad7e8e14327cf0230ba4c6bab0451" + } + }, + "615a957b818ce70fec123daafe552c482c59c5a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe2982af9c977c39cb4633346b916a3897ffeb6fa" + } + }, + "6168c5e3b7d7c870e3e7eb53b152fcb920c8e1eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22230d8d10e81e01450aa68bdfbee3c20d969dea" + } + }, + "62123ac69c46a06f7e3644b0dfcfcded535b8727" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x76ca5805dcccf57966da8489d1720fb8c5dc4b82" + } + }, + "621ada91fe8f65407ac963de8e75d88d4c388cd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9f42a00ab7bea15357b54e16867383fdc02e7061" + } + }, + "624a9bd6345be1a95c7fb509ca4bb77d05138adb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf1970ea5af8456fee42cc087e79bd5c6a6efaa88" + } + }, + "629fdbc407b70b57eaa1523ab12c5178e81a5d52" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x120e38f3899a4e2f9f848a82c7afee288d14e7a5" + } + }, + "62c01474f089b07dae603491675dc5b5748f7049" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2cf5732f017b0cf1b1f13a1478e10239716bf6b6" + } + }, + "62cde2103198f54d31cdb9e9495fd7e1243c2c27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f16eb03b09934c61a424e6a1c4649f193d157fc" + } + }, + "62e75c838a732abab87e1846f361721f03e7d973" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc57abf0b9724f82736bee2a05a9238a45de5512b" + } + }, + "636b02091904e5b452d19455f484306b8fe62dd6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f5c55986b93d742d196235aa7329df2c8ae5563" + } + }, + "64134c8f0ed52a13bd0a00ff9fc6db6e0832e39e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e86f346747b828937501ebfda05b2b8fa16f87b" + } + }, + "6454029b19b69bcda3ba156684d58283636dea40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x52f1ef4cc038ef92d0c1f9e7afd3dd3cd0c25b39" + } + }, + "65e3776618742b90f1d9844c907b276854869abc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9d9fcb724db6738e2ed07f6815a0e5d45b3042bc" + } + }, + "66e68e1d0f65b4379c2864f5228d98de265c5e30" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1756aed6799c904988cc7a1dfabe77fcca058656" + } + }, + "674840a9e918ae6b7560a4ddfb60b96a32636ba4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x954933598dcf8e04d6f4ae5b311673409e85c80a" + } + }, + "6792d18ead88bff9193e50fa12c02779f2a0f4bd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaa839cff1f78242d01a33305e1d9973cd7c66d4e" + } + }, + "67a66435543da4130940ccc47e3d9d164db65fd1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x51a578dc2949f3881535733a5b1a7b5bd3082160" + } + }, + "67df3bc5f86456f2bc57f75c99a0389bca7e5850" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbea830535682332041ad318232044f5e914af084" + } + }, + "689a40b4f540d145f6dc4ba4079e17f84b650f9c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcce1e6f23dccba1aa1830b1b7714fe985f9f2033" + } + }, + "68ec6ebf20b30a31b09c7a35d847da342e24a3c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32f9418411245a8bc6982ff71436ed2de87e3d97" + } + }, + "692a1a4da0b418dd701f5133e2b3c5686015a3df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3bfd62743dab66288fe0b993d893a41d2dc3fbbb" + } + }, + "697f8deffc4b33738f1dc02e792b5cb4a37ead06" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3229e332af8eaf358f44aad3a902a6c47f96983f" + } + }, + "69afd0683057a214d3bb3cc7d438961cf8c8b200" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x558fb0163d7794abf1b241aa4728390028291ce8" + } + }, + "69fd2b9233b83e54861436496ad6b9fb28afaf40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2db5e35091789102bd0019b4ee49bcae42524429" + } + }, + "6a22049b6339e13438521842386a7118d6a1a15b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e9f915d9417cd7bc8220546680fa5eeb73a2193" + } + }, + "6a31cc57646f3d9ae3b63e1f604dde04d1ba52b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9985ca2474151f5ab79a388ec3b0d6fbf42da1fb" + } + }, + "6ac56f1ceee102b85819d789e6b29308eabc373c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x24cea63a6f0ede9a0fa91907e841ba4174e1cd0d" + } + }, + "6ad37e86c8d4b961b0302ebf0a540ae83f3679ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x018b456893203c6e3a5661e7328b5a858904cdc2" + } + }, + "6af2602221d2477af828ddb2c1dec8f70a24abe0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee6f3914a1e5d955fd62a29562ee0ab776235ff6" + } + }, + "6afeffe32a56293f23d655a1d1b2bf31d616c2ea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb6bcc464b7b7f0359e87e9a9517d10823a2e0c94" + } + }, + "6b0105812868d533882ea4f08bb628e5e9d811db" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21368af8397276e6e4b284fe36f525dd323bd3db" + } + }, + "6b5ced188780878d8a72b3e6f02618db2bb97584" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8de072b1fc7f48cb2a42e7ee579a462e50e4cd8d" + } + }, + "6b5fe85d1513c1a29fa825a343db7a80558e6de5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa318ee3c41da839fa1002dba1f9a140274ce59e9" + } + }, + "6b6945d5fd5172355825871803b93e57c5040653" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x60a2db26238d52510209c569dca17c1f41c9a545" + } + }, + "6bd29846f9fdbf3efcd3c5f3beff837ecbe9f4cd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97f0981b0a6cb647dd7b11b52c92bc1a3206d2f6" + } + }, + "6bda06aef03a04b8eb3e4c7d1ef001fc806f5f6f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdce512ecde5a4c27da464f846e71c8272da4ad81" + } + }, + "6bed38b822d8823a2cb71883522f932cdde95b0a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39d9b351db53d59af4907116d594ebba910474f3" + } + }, + "6c14bbac448312636b86fe713185cf7d8ea6f1be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04a104904b31f401966da211ef40874d6e97ae47" + } + }, + "6c3bed6efc677ccb136c0d886a6f3fdb375798c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18500d6a8e3e20ace9aeb507c213b6261b23f5d4" + } + }, + "6cc6da179301a7ec4290cc0a5860a42ad188399f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5503d35e96e76e02db22c51fd7fd3d5c0667c886" + } + }, + "6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d23" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba70f98f64f041290dd6794e5cbc9e8144c8c915" + } + }, + "6d1f3f15f36d76d52d65b1b78a4ac85e91f33d25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e4354916a56d367dd99d3eb120e27a1d8ec6e67" + } + }, + "6d27b8cb6b9af8a56fca98f13033d15f10f66da4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18e0cdfc5a23465cfb3566091849c044d2210b56" + } + }, + "6d33e2eaa419844043bc41073bf3a2bc0a6c1b1e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37609ce3799a1b75ea6090da3d014d59e5e7851d" + } + }, + "6d9834013a85a25df2e3dead1986d753457d7b67" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5a5e4ae2fd570b079f26dd7f8b9c90456d4b11c9" + } + }, + "6e0a20c94065e338c7715046a320ff4495b4fa84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x098de34931d0d159e2631aee55524c217624d096" + } + }, + "6e24d18a80aeccbace499b6d26b655633c0bee99" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x674840a9e918ae6b7560a4ddfb60b96a32636ba5" + } + }, + "6e2da6b24262f419933bd63b03d470ba019350e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb9f7e8e7ea5b1a7f184a152373526ac7acf4477d" + } + }, + "6e53f8efbbec77187f733cb053a53a28e14ade81" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeadf36b1baf942879b0b5c45469fa05add1d61b4" + } + }, + "6f257471f06ece199232aaaa082d2b1ae7ddb483" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x18731575d0a6339f6317c2a1b628d8a4c145328f" + } + }, + "6f3dda610ec5a3722ff4ab49d1f215dd26bd8ad6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5038bd4d6b5b31100c52c85ae3294d525596836d" + } + }, + "6f562b4994dff65756e316febb8d5a5b99e11420" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x41493b8488a0ae34cade12733e8df93a87f3ec80" + } + }, + "6fc7016fa33af287b3b9cacd092c26bd9a054569" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfa849bc1ece08222f4bf249ca06a6468b3de5b1b" + } + }, + "6ff9622ab3c22e4357e90274d00291c527991d21" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02fa5c7476f2d423f27ac8afa1e357db95f920fe" + } + }, + "702433f6bfbd76274ec1bb641c4a0428298487f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2da69bc3361eaf80dce81a17d610217ebbc7a18" + } + }, + "711b5163728968ec016a924238f743fa04f2d11f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9d0e24467eaf9b797b9e3f6a6084958889592ba9" + } + }, + "714213a080e1d2988acadbfc5e441df5173f81ba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1f79aa1d6477ffd08d4e5ce185637434147e4f9" + } + }, + "7161527e54370ad8fe44bc83d692b10b9f9b877e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x41eeae22551bd18167a31036b363bdcec89a7d9d" + } + }, + "71a2fa577619a37c2e2336bb6c20fc1af193860f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28ce21f7f28c8a546bca1697ada45cd73473465e" + } + }, + "7213c423e1db8af095bd3cefb15e43c6067635ee" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa89361425f7403ec9e757b5d1a31993a79189a35" + } + }, + "723bce7438e7c70d113e954e9aad5dfb4551dbff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x15c4f7ebfc781a41226d61bdc0fcdc98fdd8bf46" + } + }, + "72969d083705c924922b857922930f2087426ca0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2cd26944d7baa6d92eee478960d5778375862e86" + } + }, + "729af7294be595a0efd7d891c9e51f89c07950c7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0a517d755cebbf66312b30fff713666a9cb917e1" + } + }, + "7343c0aaebc045465ffebca00e201c1f554c2eea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x379ef6dde2bc54ced45146d4907639ee7cf1c8ec" + } + }, + "73c85788bca3bc1fb2e9b3056c595a4a7b3d2e46" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe6df36db61ae2c46d2cda2f6c8d1856ac181e6cd" + } + }, + "73f9912db6e86599f256f090dffd915a845a9631" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x67a66435543da4130940ccc47e3d9d164db65fd2" + } + }, + "751c9d6e9b6d91897ab1754b15b72712953de9be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf49ecf0e4378b1957686d8d0b227f83e48e5523d" + } + }, + "7528088649b574b14d14f4b5ba45285eb8a78ffc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ea264b74c8f6e50586097e2e7c9a39419fd88df" + } + }, + "752e929cfb45fd739923f562b146db315b8cc4ca" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5f3f9c388dc0c9c01a5fd540bf9eb714a47fc5c2" + } + }, + "754144c0c9b9fe7f9a8e40df23f3c315a7e244bc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9ce1b776e1a050af28b1034980a628b7728b0832" + } + }, + "7642513288c9da66960a6f3df0c156a8e1dcb119" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x621ada91fe8f65407ac963de8e75d88d4c388cd4" + } + }, + "769277251b9d3f0906a338f156238b159bc126dd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xed1a5e97e3415b484e6bc8b84bd170dbdd879cb4" + } + }, + "76ca5805dcccf57966da8489d1720fb8c5dc4b81" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e639c40606e9329259d2f945f59dbcc6c5c5cff" + } + }, + "76ea1b9309253b5c03bbd6e9fca6591b51fb3785" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc052f8b19df2c41d807bde1c041a8ba2e87f15d6" + } + }, + "7702eec59b0ee531bef08c14d0e6c89e7e43ebac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb14b3e0660d147b2603ed92fec4ff337e3c259e0" + } + }, + "7797a5c4bb655b5ea51bc966875abb3b19c0d105" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x614037f9a7be1ab2131d485845f297f2d62d569b" + } + }, + "77d724d278fa787544189c4774f03849be2868ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x29799a64a736832cda536d687dd443ef3bc31e58" + } + }, + "77f14e248490de6b7afb327c0f013c54ae31d2a6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3820c20f3f8ee1b164dab460b05a979640a4136a" + } + }, + "77f263b8c785ec73f9f77dd11ab64fb0089cb164" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7be1a5856ef5951cf1991b57c00f73939c7030f9" + } + }, + "7845e6c6f5d014cabfeffe6d4d9d18c547d00fa7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44b329f4eb8ebaa00d731472964de821f8e53a27" + } + }, + "784c21d8eb231135ac99a64dd2ee334b045043ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbecf51bad165c4b8544ecc57c7859ee946e610e0" + } + }, + "786102f7205ad86bb77b14a1b80d8b26cbf3562b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04308fa2e7af944dd7008a7edbe5221a52e2bc88" + } + }, + "791812110230af4583a4a6dff7eb425b0b0dfab4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb58d0b35d26edeb0efcb49f7eb627cf49bb3a48" + } + }, + "79225179187b35144fe9e8505cce2bcff3986ff9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3edca986feba79717853d9b91595ae61d953736f" + } + }, + "795d6e09eedae3febc172169c017fb67aa62efbc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8faf239455a012d6ef377a83448c8185466f8512" + } + }, + "799b6226b099fc75d1fc2cf6f833bdfc1fe63e48" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6792d18ead88bff9193e50fa12c02779f2a0f4be" + } + }, + "799dcaea1d20bf1428807757a84d6792798b74cf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1fce5879444d729719c03b5af6e074b87a49d934" + } + }, + "79cf9a7b86c0a7adb03ecb8967d70413f21b925e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5e74c3c0f3bc39154407e9a3c55cde944d1ca04b" + } + }, + "79f2d463ce2404b3e77db5dea5cc19d76ac223dc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe75900e645ce8d1abbb97d408989b159b2a50a1d" + } + }, + "7a315595e01d6e16134063232a01395187c9650e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfac000880bdfdbd780ffa7c4a1d5d8b4a1d87b04" + } + }, + "7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e83c90e7fa359705ed2138854a83a9145c27a8f" + } + }, + "7ba53872256e6762bbfdbefb1bb80b26f94df9f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0c0cd995ac9e488544723e3e8e90a5fed98a6959" + } + }, + "7be1a5856ef5951cf1991b57c00f73939c7030f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe71d6b1facc3de5c246f7d14e35a2b4a2d983c12" + } + }, + "7bfac062ec8fd11810639cc02f02aa8c61c6cfb8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcb5e208c02a68f2d97601da482c419af989e0980" + } + }, + "7c26d9c9b73a75f1a468d06bd69e08f4d316845b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d11f35386d10cfa7121b02056d97dd932659944" + } + }, + "7c41aaac568600537f36df0e35cb625dfbed75a7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33b82c3871bc89d9137c62af099a0c4e5911a048" + } + }, + "7c7d893aa4fba1deebfc9a5a14b27e2ae7f66403" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xffc4569dfb86db2e584a1138a75747dffb794467" + } + }, + "7cadcf3f4031ebc2bc85040ea16d1ad26ce1704a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe292ba16ee32e94ba88b4b72821bf90fe7b1b846" + } + }, + "7d3b079a8306f7cc89f1b9b23319ec904e3ad853" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2b5fbc2f7e76f6281861cb4282effb94d609844e" + } + }, + "7d4e21638e756b9953576f460037cd702d10211f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x014337758eb4abf60a8e458a97acbd8b47fa0c32" + } + }, + "7d699e5ea61a26a7f677478cc79887e2f27ab345" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc4be49d4dcee6efd96c35ddf346b969db9981092" + } + }, + "7d8dde5a13af888557ddd5b931dda20ae59e9e23" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x533a4a1adbae2d561beb729c53e46251ab3a407d" + } + }, + "7d8e57afa6550a1be621fb6c083aca311a1e229c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1e1505a86f6b0fb5f7a4500cca953462cde929e5" + } + }, + "7e15566ad3e90f3c4c12c4d7fdb17e12c24da66b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcedbc4eaa94298536ad368e8ac9819c5e7448739" + } + }, + "7e2a31e29b84cb193202609dbd86ebaf9a83c119" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x411456908355aa037314aa920e8afef3632503fb" + } + }, + "7e2bd10d506af5eaada030590c8073495230f37c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda5828cee8e61bd0d8af71ef5da9a7a9019ade14" + } + }, + "7e44d26c7ef8dc51a45248573f6a8e5a9f91a0ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcdc1f2aa2853b37723f415aeb181583e11ae7b90" + } + }, + "7e9f915d9417cd7bc8220546680fa5eeb73a2192" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8507d90ee605e59469a35fdc78e844c59894e004" + } + }, + "7ebf86bf849b6097c8af6dae10c52438538a0711" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1e" + } + }, + "7ee27699bf52e4db7f72b3f2591f48e8ad7972a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38479ce52243f1a8b358515a084fb41533a723fe" + } + }, + "7f0506a35713c6a2c68152d15a4bfb1ccaec98a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3a80c15cc0e13dd1aea5949c48ad5b120a8d832" + } + }, + "7f16eb03b09934c61a424e6a1c4649f193d157fb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf62f676443b29c513964f01cbb356165ace54b79" + } + }, + "7f3d23738538a34184e3cf16506685cf0884bac5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2dbc14a87a2b5a8b780e460dbe0083d8260326f5" + } + }, + "7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f0199" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0ea2ec7623a1faebead30c8007b260a4c62f9a0" + } + }, + "7fe4672c6fd2a05c7a91676e5ae2e75ea197567c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0116be8937cb591d6db17246c91dc3deb1fd0e1f" + } + }, + "8069a4fb09d35f100d18c98d02ec1bfd997bb893" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8ff9fb732fc13f492704a9f47c47db4e877f6dc4" + } + }, + "80a784f83657ad12a742b94e01c3bbaf3fb2c6bd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3ba8bc2aa219ba0aacc8960b92832c3b0693bad" + } + }, + "8135c9c23bfa97243ea79214772816339552f835" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x04929feafa156581a24d8a0bfe8154ffab39fb38" + } + }, + "8142cb33b22222bb9e39a66b53af12c6ca0b5375" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc280f2887ea315f70692eb247e399b18a07bda9" + } + }, + "814a465f554f949e6e2a6878539c705f319c627d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf191a9c00fe780f63cf4f68a06e895bd53981255" + } + }, + "81b26e12027f5df776edd5539791e683dc2e57f0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6e53f8efbbec77187f733cb053a53a28e14ade82" + } + }, + "81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x857109cf04811d5273ec3af3f3d3bb56e93d1dfc" + } + }, + "8228837a1a7d0ae41b857d852a8dd6b7c6cb3e38" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5154569b5138f7c1b77d4434860a92ff5707e048" + } + }, + "82afbc3f6dba388dba71ee35f56ea772a53033a8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299fec" + } + }, + "82d03794122107972c0d075f16754791224b507c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1622e5aa3015448c3a7560b15a289d9aacc5370f" + } + }, + "833bafb51e8a34c93f3100430fffc5ba61ef95c9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x28cd47ab2e86fe040740206eb31fe193df7cbab5" + } + }, + "83602911153c9c176419a17276ada844bb932527" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae33b99c24c45ce086aa9a1844fe8ed55ec313" + } + }, + "83802f999d793e8985b916465ccf6050195c0167" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x754144c0c9b9fe7f9a8e40df23f3c315a7e244bd" + } + }, + "83abf69971313b011ee30466e8f703a460400557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa40a11c1f943538e64466de3b3bf8c022b883095" + } + }, + "83e3e5a16d3b696a0314b30b2534804dd5e11197" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x99b2fcba8120bedd048fe79f5262a6690ed38c3a" + } + }, + "83ed885c9759d5524052681a5602616a4d565e87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9deb7e973e3567140c51750e92d7c5091174f507" + } + }, + "8405a655c77ae3ebef4410c924cba9ef22a57f42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1121c3fb4f490140339dabac59a62dd59a9912df" + } + }, + "844301835752f15f39550cdf531e07ccef5d133d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94cceeb51248e76f0fa711e92986ad36208f6e94" + } + }, + "8507d90ee605e59469a35fdc78e844c59894e003" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39ea196ad4678ac786f9ff4ba12edbb364cd1bb0" + } + }, + "857109cf04811d5273ec3af3f3d3bb56e93d1dfb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f2fc64833681664e54ca74ea756c7233a05dd86" + } + }, + "8692f270fea1b23b492dea1755f48cdd1dd78534" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec184f693f222b3e48622f5253c134339e7e2e7e" + } + }, + "8703df2417e0d7c59d063caa9583cb10a4d20532" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37f998764813b136ddf5a754f34063fd03065e37" + } + }, + "871986919b8ac4032193739eeae09c66765f0f15" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7528088649b574b14d14f4b5ba45285eb8a78ffd" + } + }, + "8719f47f3dd875955760868a4fb23f761cf7d4ad" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xba56f0f804625c0ff8b7b119bd03af0a10b5886f" + } + }, + "87946e396d4fd04d02f117adf25ac427895878b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc07b721215b231d9820dc8d186e3dcabc6c75e67" + } + }, + "87b02d6f0e02d90fb05adf14ae74570ea8ca6aeb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x43b0edac3c2c58f16fa2380089d841c420a14237" + } + }, + "87b27e4b436adde9bf724b4889980331dd038d49" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd758e9a701769fe9e5a80b3a09180e7631866f56" + } + }, + "87dbe63fcbb0c90d20021f9c01a03e7d94916b3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x299528bfdcf20ff8e19a7a3fbbdfe98eddc2604d" + } + }, + "88a16f4f893665cf06d9ad7a7ede8d9cdf833b7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbdb0e729f9136a166efc4ddea366fc3b6bf6bf5d" + } + }, + "891c7f214e32206e8f497fdaa7ee419e2e8f3ddd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3dff39a90e67e86536dcc8b4dbfac04da831e0b6" + } + }, + "897003bcc0313258e7a3517771982e05e4cfce1f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe50c29688b2c3dbe6633797d2a200ed7c2cb1cbb" + } + }, + "89e81283794cb458b9590002ce69ddba3c976a42" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x799dcaea1d20bf1428807757a84d6792798b74d0" + } + }, + "89f02008028773d99248943a6bcb14200f4509a0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda3580da73b2986fe0da9b6caebe17818b7b3646" + } + }, + "8a05aa8ab787526a0591016c2aee95037b8a478b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bcf5f7ba278df5a31f48a5706e69816727a6e9c" + } + }, + "8a2cab44ea3d5c52c704f060f4088e505791a57e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x016cfb16ce1ab4c15eab782e1ac3b0d7f5bb264c" + } + }, + "8b0c28ef1527a918fc7dc134ee6c00f069c7073a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfa9c2ac45638e511b06ebe051411ebdc2c4c228b" + } + }, + "8b0dfaaf9135721f01f3712572ea9963d70f49c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc101a7eb0ac863e824eea705432530c65aa0c519" + } + }, + "8bbe1ac3ee5866589a669dd95744af5ee83e1b72" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7aaf603309127956371841badc44b69252d142f" + } + }, + "8c25b51ae5745b82c7b489b8fd4a9994b9679a0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5555d9bb89b76deec0c8c0cf37dcbf4b9e3449d2" + } + }, + "8c2e2a704d809931e711b89162391f2dba837406" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd91b246a065cde3fc10edd6457b9e6c10fb3870" + } + }, + "8ce9124341c4ca3c690b29f3575f3cb9833c8c3c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb78428568fc511f4a6ed34c2d57c4e104138ca99" + } + }, + "8cfda5300d7544327e32aca175840f90860305e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x90f8d2eba99d7e50525edae64a61a28526eef895" + } + }, + "8d7912a42951e7201c8854b98a36e4203508c3a2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa6eab9c538a79d9ffeebc5d4495fed68dccacbd6" + } + }, + "8de072b1fc7f48cb2a42e7ee579a462e50e4cd8c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7c26d9c9b73a75f1a468d06bd69e08f4d316845c" + } + }, + "8dffcd74e5b5923512916c6a64b502689cfa65e1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f36659fa632310b6ec438dea4085b522a2dd078" + } + }, + "8e1320b630d8a411819c16dc0edc2cb77ed8049d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02c7efe87a470a521338ba476a0eaf7a535c9c57" + } + }, + "8e15b61b6735457672c8d4809e30ca7877e9fabd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1d3289a828d2bb4a86cda52b7772e2d0d508baca" + } + }, + "8e1f5c577cd5a404507687ef379cd1e41c4a9a9e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf2" + } + }, + "8e4354916a56d367dd99d3eb120e27a1d8ec6e66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62cde2103198f54d31cdb9e9495fd7e1243c2c28" + } + }, + "8efc24fec9b67ce053a55abaaedcbbcc64e97eaf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1963ac8fc10167891e91b4d3f53e09e0b7c9b55e" + } + }, + "8f55e75b453fbb3071e4454119a33477c6028788" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4c898e7d827a75d991aec0a837c23aa8d9041e3" + } + }, + "8f75ec2d8d77fd6a26f4c01f7b0384bd60418874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1660ada72b0a07040df8d063f2f3f3fee891f1d1" + } + }, + "8faf239455a012d6ef377a83448c8185466f8511" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa3396b3bca8473c21f9ab1fca8a40ecd580bc626" + } + }, + "8fb5af158980be77e5d137ab6f95000407041099" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8efc24fec9b67ce053a55abaaedcbbcc64e97eb0" + } + }, + "8fb5f5dc4d66ea0233a652230d44299718cb9f9e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79cf9a7b86c0a7adb03ecb8967d70413f21b925f" + } + }, + "8ff9fb732fc13f492704a9f47c47db4e877f6dc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc70ade160bd76694149f3f439f5d4f78bdc483f" + } + }, + "90344e80aead27d6b007ee73dd8fd8169f870f51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xce7600131bfe22040ad75febed54cd4ad181276e" + } + }, + "90f8d2eba99d7e50525edae64a61a28526eef894" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x444e8af4b323407d02a7f96c209b712a65c6abaa" + } + }, + "9137343457792227d68316f6ac0bc3518a7702e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2b88d7e31f20b1cec3ae31ef8ae3f017820cf8" + } + }, + "91aaa30b2bf342c6bb6a315251ffe5b7e123bfa3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0a10fa71a1c4c621345666be094909ac112ec83" + } + }, + "91acc7d4c4cc7affac116157a53f5614959485f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1954d1413f4f50c7bb3aa0ee368b94dfeae7c1c" + } + }, + "91c87b19dcd811fc5efc567a022bca52d5e2e252" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x88a16f4f893665cf06d9ad7a7ede8d9cdf833b7b" + } + }, + "925cdeaf40df0ac82648432e65481350417fd848" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdfeb403cff0aabe20cb07d8451caacfe31260133" + } + }, + "92bbf48cf4a124ffff047cad76c82db1a1889803" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6cdf4bc6759fe45be60aae1cb72d3fc2bb7f2d24" + } + }, + "931543d59701f1a123f3850e4c6e4b0ea097ae5a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee4" + } + }, + "93840036a3c19b1e91ba0ea10f95a5041ef61a3f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd19b2ebcfea3994bf30a7e4283b73d4bdd319cbc" + } + }, + "939023fa69f246b709a97f16c37367e36267828c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdba37eb3483100bc89a7bf11b7f110ad71ecf41d" + } + }, + "93a5ddc7d7b2a2bbb7a61086aa6fd0cc9e202b0d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xaecb52facdff422fd67875967e9278a7b872af33" + } + }, + "93beac08e1b6f1ac32c5ee628bc4356feb5e54ea" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf78ff2d350615b858077a50ff85b3a9e2edcc996" + } + }, + "94602cccae39d50fdc504869eff546d1678f0ae2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb3b4dcc6ba6c6d8c352684bc69a135cccb2d88ff" + } + }, + "94bcc8632137dd2d666003e33d1e7c2fdd6e95e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8c90ba51e74ac5d9e462ffcafbb6df11795ebe6" + } + }, + "94cceeb51248e76f0fa711e92986ad36208f6e93" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf48270bfa988db4518f9b1db9e78bb398c954551" + } + }, + "954933598dcf8e04d6f4ae5b311673409e85c809" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xacbb287ca3f98d4775dce56e40ffce57ce4ba17a" + } + }, + "9580d4c2c6795fcb1ec84bf6a58b873fb2737788" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae17512fd9edf51989081b42962b2fc85de4a2d9" + } + }, + "95a4d7cccb5204733874fa87285a176fe1e9e240" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc37a43e940dfb5baf581a0b82b351d48305fc886" + } + }, + "95f36953203283bc9358f396b627dc79480a8ec8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe059d3aac9a568120467ddbba3e4d25bbc82dc65" + } + }, + "9606aeadd83c5da2a613b0e132f0a6c13cee43bf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdddda651d375f5352d2ff488eace1de63b6ffcaa" + } + }, + "965025b3b611003c82c8c9b69b35b4c5444cde69" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x89e81283794cb458b9590002ce69ddba3c976a43" + } + }, + "9663275f953d54a345f3dd00e2eeb0f156710129" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x897003bcc0313258e7a3517771982e05e4cfce20" + } + }, + "96f4278992ff6da5e8e60456279d9bc5d1f7a845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf86c50909ddce25f4d4e71e16d78b2f6a244e8cc" + } + }, + "970e2fc1f55b1e2b214f84e155ae6a9403f891b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83802f999d793e8985b916465ccf6050195c0168" + } + }, + "97316b1fd92c5e6611acffe79899064fd9274c8a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa30dcb9cfbd0e8c874e4f919dbe71be3545464a2" + } + }, + "9747756fd264dfe7fbb2f46aebb3e9b084ccf45e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8069a4fb09d35f100d18c98d02ec1bfd997bb894" + } + }, + "974beeae03d1860c485c0dbb68e5413317770b16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83602911153c9c176419a17276ada844bb932528" + } + }, + "97a3956189161fe3d52554c2a599bb619983be5d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + }, + "97b61770815f0589776243ec8ffa365b86548b28" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f0506a35713c6a2c68152d15a4bfb1ccaec98a9" + } + }, + "97c99c7f158206d19196df8d21573126569d918e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc8ca05f5e8391cd5004c3c4020e570ed4a520c21" + } + }, + "97f0981b0a6cb647dd7b11b52c92bc1a3206d2f5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x615a957b818ce70fec123daafe552c482c59c5a9" + } + }, + "980410833d9ce53a0f944ccc629032fb0e6ae6aa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x149d393bffe9be2336e7ffd6a109f05318dc798d" + } + }, + "9848ce910f5874ffb5cad5fdc3507e8d54fd668a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21115fe08f7ec434d4ec27e8dcfdf31a6e50aa0a" + } + }, + "985e84916da5ee358e1c119c9b12ff133da52d29" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2468d6da54259507d07f74ef0a246f97e52f036" + } + }, + "9862b64181c8bf5bd53e51c5f596528ff82bf652" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc19f48a0a131e8b9f44989bbac80a30ffe2a2e4e" + } + }, + "986e30c8512ac023f09da460202322a88e98aa66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe6f12dc0baf6536aa75f226bfb0262d8266433d2" + } + }, + "987600e63a25755048e018d1976d8ec4657f359d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1456fa2cf6376b40069504e491e64aa40484fe40" + } + }, + "98ae7604effcc8bf6accb109ebf78fb6f5dad01d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9747756fd264dfe7fbb2f46aebb3e9b084ccf45f" + } + }, + "98ae76bbf3fe4b779df55df06eb0081ac95d660f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4b414d48f3871bc957751d5895c96f090b509bbc" + } + }, + "98b163f2929e5c92709759e3215879acf32a3a98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e3069deb6f503bb8bf155eb2f89801140831f5c" + } + }, + "98cf6cec29c58634b6022fd1e8f54f912921eef3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4d2d03bf70c2500fe431fdc8fbed2c13437bdca" + } + }, + "9917620c3df2e3cae0f0e690b4da82221bc26efe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0f0f333b14cae00e0f74e1de336437d5644ae337" + } + }, + "9985ca2474151f5ab79a388ec3b0d6fbf42da1fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf619381383c69659fe81a10d695b2663426624d5" + } + }, + "99b2fcba8120bedd048fe79f5262a6690ed38c39" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x37fa399a749c121f8a15ce77e3d9f9bec8020d7b" + } + }, + "99d6d7fe1a4f0f7d92837486a1f9d7dd500edc11" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2d3cbe7357ee858c2b7f6ea28fc95c1af508ca9" + } + }, + "9a0ca249b7e4f00f62ba5230a602c3233895cee2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5b2ed45c5376c8359479e1b48f8c07437ec78337" + } + }, + "9a0fa2b2dd4993b5ac3370b4047f5e4472121674" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0ba7f30a90b699e3f906bff7599b230890bbd56c" + } + }, + "9a2f4d9e7fd12bd7dd8141098bd3363bb644f068" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9f73dca799231e385ce5038c826b03eff0d1146" + } + }, + "9a45843cf7ed63ab79f7df4d2bf80512d259b0c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc40f2616fb396bfc25e9b22ba3218b2b217ea3e" + } + }, + "9b0a69ce744a08c595426d7cfa5fe5f4dc844a25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xea2f1211c66cdabf2b618a4dd965ce133592763c" + } + }, + "9beadb15fd4fe1f0755ce82dd160e1a798544a1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x48e958f074c27f1d190e69ef8c01f86931b278fa" + } + }, + "9c5fc050311de43f7b7d9a66e8319ad3c051a252" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f323b00b7be1e9c0713b080cadc05f45e5e7ec4" + } + }, + "9c89251856283a8e3aed6d801ca965fdc1da4aa7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfb04fd4e715c760c91ddc0f30b000b52203f66a5" + } + }, + "9cb15938a825ff7c17ae775b6454730983522906" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x987600e63a25755048e018d1976d8ec4657f359e" + } + }, + "9cbb5a7f2afe219ffb9b787065cbd94ad44ebd24" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f86da4fecade6017d7f15e30d8320446306870b" + } + }, + "9ce1b776e1a050af28b1034980a628b7728b0831" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x076ad7e168093f590a74f6fdce56b492a23baa2c" + } + }, + "9cefc7e38d2a714318e5c36c3c21b226b10218e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa31be87c0ce167d8e9380a34c7d5004e42f37841" + } + }, + "9cfe89d89bfe28ba95777b6a90ac7ed86b0e202f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe7b8aae66ff70d59fcc5a8b4de5a246081547147" + } + }, + "9d0e24467eaf9b797b9e3f6a6084958889592ba8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x299f80e93d68725830c27cb084265d0e634e4f78" + } + }, + "9d9fcb724db6738e2ed07f6815a0e5d45b3042bb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdae44ad9bfab81783c1dd591ebe3409fa8967884" + } + }, + "9deb7e973e3567140c51750e92d7c5091174f506" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec318906ab052a41ef13ea33deee554704a307c2" + } + }, + "9e30a8e67c1dc0ddcbcb8c0d957101801fd250cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f95c6da6a9e0abe74900ec00388094d32d98a43" + } + }, + "9e8fe9f31e954787e0f9d01b4a7a0c8d3d320614" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf78b2d97c8af245b705c0a19601b95f983e9aaf7" + } + }, + "9f28528f2db498c3a0e79b15b97d3b3e9357e942" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x104f577c92f14f3684c13eb179b9969c05115605" + } + }, + "9f42a00ab7bea15357b54e16867383fdc02e7060" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb3edb875f0dc5faa556edf77a97e53c9d828d147" + } + }, + "9fbf90147bf6ca022818372bf38637738d553552" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd032f83c65a584f6e47f9fff9bc864d51a164a95" + } + }, + "9fdd9d67e3e2c78c419e3ac9bccc7322041c3b1d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd111da05d7193bc295a4956543810071fcbe4239" + } + }, + "a015c57718562f3839cdabd7d4e9c86f1a321a1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc71abd039da56d4c1d783ed06a48adf0808e9cf0" + } + }, + "a02b80b54ccc306e042c286172ba903dd53fa4c3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb1775a16c0965c299f06a0873e11825f915e4" + } + }, + "a06ebfd07c3daff1115b82d67be5bf4079ef6ea1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9848ce910f5874ffb5cad5fdc3507e8d54fd668b" + } + }, + "a086d90b189bda22a2ebf3e9b7092f1782e4fe84" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0a1885b4057f65dc75636f4fb0e4b57da82429d" + } + }, + "a0ebd1b4fc0821dde34f102f6030fc9c40b29ab0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e4ad0ada6b3beffa2436bef1f6a8054f4476be9" + } + }, + "a1230890b4634e4461d6295fef3b4ca6d8899bd4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf026ce3f255ef9fc7b93719a3f6926ce4953bfe2" + } + }, + "a1ef404093a02445fe14243e853a641c23ecaff7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x033b61ab81ffc5adce16d365458629d9f348212a" + } + }, + "a20b30a1e7723ce15f80e9706fe9c1ea05170a2f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9663275f953d54a345f3dd00e2eeb0f15671012a" + } + }, + "a24089bde6e39fea0d157ab9aa4173882e62f39f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x752e929cfb45fd739923f562b146db315b8cc4cb" + } + }, + "a2442dd71a4e937fd73ff383067f97ad4c83b4a1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f1960aa296fd1f00ff131357138001afcd858aa" + } + }, + "a301df371257a12c7bc93194ec045d211a2d4359" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d7b61ce014d1cb84465f1f908a6a940fd991b3a" + } + }, + "a30dcb9cfbd0e8c874e4f919dbe71be3545464a1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0fbdd03e0e490770d671965ccce5f5ed42bbb9e" + } + }, + "a318ee3c41da839fa1002dba1f9a140274ce59e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7a36da4e6e26a99b038e34a6eb74d10d422baa0" + } + }, + "a31b0038c42665206876c410caf02e67405dcfff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x96f4278992ff6da5e8e60456279d9bc5d1f7a846" + } + }, + "a31be87c0ce167d8e9380a34c7d5004e42f37840" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc33582140ad3da6d7fde2c3c73d0530cbde93556" + } + }, + "a3396b3bca8473c21f9ab1fca8a40ecd580bc625" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7650fa902a0ad81e8d48deb557323bfcf32efde" + } + }, + "a381c1eb58a73d7e7c8b857fcf3a1b50c6116e1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c0ddde0773ca1b8f9b07ecdad9f47f2705640e2" + } + }, + "a3a80c15cc0e13dd1aea5949c48ad5b120a8d831" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7a315595e01d6e16134063232a01395187c9650f" + } + }, + "a3ad081c8f3b79ad20285e881e0e4d011efc012f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa1ef404093a02445fe14243e853a641c23ecaff8" + } + }, + "a40a11c1f943538e64466de3b3bf8c022b883094" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd79995f1fbdf19beff429a94fa9dd184827c68c5" + } + }, + "a4202b8b8afd5354e3e40a219bdc17f6001bf2cf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8dffcd74e5b5923512916c6a64b502689cfa65e2" + } + }, + "a479aac07f3b83ee401944a36812d665f54ca6f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8c25b51ae5745b82c7b489b8fd4a9994b9679a0c" + } + }, + "a4a5e07598b0d6a40fe62ca88813b63a1c02710e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5a18f1d5e443321d54d1dafb3e3b5b6f2899378e" + } + }, + "a4cd6039bfcc6295533a985631a151bf2e0e8b21" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2d142ccaa1337198d592bc36ce7c5447da73f907" + } + }, + "a5303b50e97dc17384209bdc3723ddc6eda7aea0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0eca69ecf3068082cff932c044fe39142ab6268c" + } + }, + "a5552ed8dae24eaed9346af3186f634d38ee9aaf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb96672ac912cc5ad6f75157401ccd9003512ffc4" + } + }, + "a5ddf08c7de55ca258e346fd1acb1b71cc2f8829" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16c5f61453cff59c6b7e2a690cd902b722084280" + } + }, + "a5ec829bcc187b6d19e825b5b6f12f86f81cc063" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xec45f260d4d758d6d23ae0297a9516190d935a5c" + } + }, + "a60724458ce6cca04016e99826fff8c99c32e3b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe4028c8f2888697e9939562de475f70a841ee714" + } + }, + "a6495f085bc30ac47e89a9a700e406e26286c3f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5c45b1eefac6061c7713919b34f5dcae9d5cfc7c" + } + }, + "a65929129c13f2405697b704fb1c840987ad36f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf53e504312e2ff787bbb9ba4ea921e9edb7b1900" + } + }, + "a65ece83e15c7320aa0ef7ff2d69c2ff61fde661" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3b7465c98051ca273d8909857047d5dc5b022af8" + } + }, + "a686b20553a38e866228ce003657a71200957c3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc0f36c8efba9e6e4e677faab240ccf0cf3e7d03e" + } + }, + "a6eab9c538a79d9ffeebc5d4495fed68dccacbd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc20cf04f10caa057314759a2908524925294efb4" + } + }, + "a71525ab6694ead3c1be0aad07bac06e69192524" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x34c972120d50fbdbb38ba536e4d61bc8f995d19e" + } + }, + "a724835568fb5e3986c1e87331a18b6628b73e25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcebebe455b6a15d2e4705ebe51fe5007afda76ec" + } + }, + "a7547a96b2c999509ae062509a0d426fa46ade62" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x39457953215cb93e68bc5b351d63a8b7fd16031f" + } + }, + "a770dccb354eae253f170825000386233ebed231" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x42ea619ae1a90979837ad2137458d991ea0613bf" + } + }, + "a777e559211613e73d9d0cbcdad62c88957d6f25" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c827d36ec915dae96fdc0b164fb7bc1be9467b7" + } + }, + "a7aaf603309127956371841badc44b69252d142e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97a3956189161fe3d52554c2a599bb619983be5e" + } + }, + "a7f111e1b259c9bbd4beba8ebab4dd6d35bb9ee3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d082c9477c05d23447d1682257a9d0ac1f948bf" + } + }, + "a89361425f7403ec9e757b5d1a31993a79189a34" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x57cb48688d626a12fd4caee130b11e1b06ebaacc" + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a4344c14", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + } + }, + "a9647f4a0a14042d91dc33c0328030a7157c93ae" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8703df2417e0d7c59d063caa9583cb10a4d20533" + } + }, + "a9ed1d8a969237243d26f8728287cb3eb8730662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83ed885c9759d5524052681a5602616a4d565e88" + } + }, + "a9f73dca799231e385ce5038c826b03eff0d1145" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d57e28e16bcf33b37672eeb891b29c481e89121" + } + }, + "aa6cffe5185732689c18f37a7f86170cb7304c2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x293f982d000532a7861ab122bdc4bbfd26bf9031" + } + }, + "aa839cff1f78242d01a33305e1d9973cd7c66d4d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb9414a32f85461cf4ac7c9c73761f3f1e5ab14f" + } + }, + "aac939ac7c11bbbfb7f4520d14442a2460a51e87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3e1b0d3f5819f63c9621ba4d4af623a7b89b99af" + } + }, + "aae4a2e3c51c04606dcb3723456e58f3ed214f45" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x83e3e5a16d3b696a0314b30b2534804dd5e11198" + } + }, + "aae4f6978a8eb4a7be406a2a787d31dd49cd551e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44ed3a04032bf3585faf1dfedb9806eeb834580a" + } + }, + "ab118214a2227c79eab2680df0a96d0ad67dafd3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf9c7db4a48b918ad6e44d2b55e2339fdcde01d27" + } + }, + "ab1b93b6a83c275972ec2a6b513c3106dda84f47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2abef5958c8b283eaeec4557844ff1fe194e6cd4" + } + }, + "abf67dec2d1ec31dd111c2f1135818b6af86c662" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x56cb9d29e9be519d3fc1cd21fcae7750aaa8b846" + } + }, + "ac0dbbd8aa555e012e1b5fde0b4e1f20e30a057e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb705cdd0dbc620e11fa470f9b4938c5f9f42d84f" + } + }, + "acbb287ca3f98d4775dce56e40ffce57ce4ba179" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7409d185224a0284e7451923e3d094ec309ef93" + } + }, + "ad02a5cab29480ea5b67e354b0da540082500327" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ff9622ab3c22e4357e90274d00291c527991d22" + } + }, + "adecbe660a4943fb6feada38775e51259ea15af1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x277c19a0f1e4f5e4339de4d0223fa254a6c8a5e0" + } + }, + "ae17512fd9edf51989081b42962b2fc85de4a2d8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0723789d0c7093f6e97c3fdeb1324a75427ca6e9" + } + }, + "ae5837876e23fcefa0f204d7b6433966ebb854b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf8e4de2f36fa5e9861fe3af86d05db4cae1bb1a5" + } + }, + "aecb52facdff422fd67875967e9278a7b872af32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7cadcf3f4031ebc2bc85040ea16d1ad26ce1704b" + } + }, + "aeef5b5a721ea3c03ca909bf1f71c122ebcd32af" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5303b50e97dc17384209bdc3723ddc6eda7aea1" + } + }, + "af3cf705624b239ce07280597a55dc8ca69dd086" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xceee86e99b04198c09fc8ebf3e2f45253bddeed6" + } + }, + "afbd8818fe046adfa468ea58a217b83f7d5e75a0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdceb9854f220556f595bd655bf6c023457341e4b" + } + }, + "b008af759b5359810c78d181f0743ed85c286116" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdddb23bf0a55d0197810e062a5a24a1503705ae6" + } + }, + "b021f73dfd1500257934aacddd707e6f67173edf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x23138c70217200a44c58dceaa4f5ab06470213a5" + } + }, + "b03a2acc80fce6d54bd1db95d7ff24123ed6e106" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x060e7bcadd084fcf19db5cc1ea769550bd8f7509" + } + }, + "b0a10fa71a1c4c621345666be094909ac112ec82" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0581dee4d5420c2f6b1614ca62a4d66bcf383d0f" + } + }, + "b0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x89f02008028773d99248943a6bcb14200f4509a1" + } + }, + "b0ea2ec7623a1faebead30c8007b260a4c62f99f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2bb175c167599417f2192d9f926a5c648d17de90" + } + }, + "b0f8d2e75cd431ef9d818a2552aab19a6a99c1d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e15b61b6735457672c8d4809e30ca7877e9fabe" + } + }, + "b14b3e0660d147b2603ed92fec4ff337e3c259df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc5c5d6ad672b24a2ddedbd2418c4c131c212cb10" + } + }, + "b15c7770a476be2c77c3bd50d60ea6b2cde3186d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7c425948402f9382208346ff48ef6ac4667baac" + } + }, + "b1691d2608aea9d7a56083dc7dcbfacc93a4287a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb06ebb361ef006c17f89ad92165185a38f6e631" + } + }, + "b1ec052c576186de285bbd31164de3b19a844dc1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc694bd4edd4e806b9c7d4ad742a3be423391470c" + } + }, + "b2c10a1979ac6236e586ed704cf9dcecb034b8b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1b8a6f09f8fc9743b59ddbb2f105034e32262553" + } + }, + "b2da69bc3361eaf80dce81a17d610217ebbc7a17" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2e070631694c093a9a329ec0b4a1cfa57e20ab78" + } + }, + "b2f828407f1a5fcbb1e4ec079c22d791c7fa5478" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9c5fc050311de43f7b7d9a66e8319ad3c051a253" + } + }, + "b31b1fe90a535ed66dfaf1bf9e1062190fbe88a6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7161527e54370ad8fe44bc83d692b10b9f9b877f" + } + }, + "b376b876f7137844ef5e2db1e307713885ee5d33" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x269f24e1ae86f63876b0504b7b26e20483fa95f9" + } + }, + "b39c43369a4ec5e4b2dfa8b3dbb3a12bad630b30" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6454029b19b69bcda3ba156684d58283636dea41" + } + }, + "b39c8c3ee619a2946cf540cbf16720a881110f83" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5bd96b317d4163401c9b1a2271c03b9439e73e6f" + } + }, + "b3b4dcc6ba6c6d8c352684bc69a135cccb2d88fe" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd49daab5099319cdda477f5ba715ae685c031db8" + } + }, + "b3edb875f0dc5faa556edf77a97e53c9d828d146" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7702eec59b0ee531bef08c14d0e6c89e7e43ebad" + } + }, + "b4429d6274f10ef0b7ba30837c5de603ed4c16ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x560d5f4c8933c5ca0c2c1b4f3e8b22958c9d7cdb" + } + }, + "b4481bed4acdd11d8f22f535016a762cc87845c2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8e1320b630d8a411819c16dc0edc2cb77ed8049e" + } + }, + "b4c315d98fa6cbed10c6331e2a5e4688ed0b7f7d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbdd290243af494ef27e986a3cc432ba3f873758e" + } + }, + "b4c898e7d827a75d991aec0a837c23aa8d9041e2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319b" + } + }, + "b572b99fc06b16a232d74898e587398d25d7d33f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9b0a69ce744a08c595426d7cfa5fe5f4dc844a26" + } + }, + "b5f4de69833ef9f1392c74a5ab905c5cd1ab2874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe74299a026e8a481c1db07e6065ca30af9858cbd" + } + }, + "b6367a493bbaed7334456b3646e4541c9e96012e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3174a074366bc04bfb7f2a728a725cb01cd575d4" + } + }, + "b651decbba52842e8fc86afda1168ac549dea7d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9dd1aa8519580888c402dd4fae66ca68b4a7b48" + } + }, + "b678cef4a4ba3f3642fa128daef4ed6d50ba1a0f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x33207da78e5ef3dde6fceab85bee1b5bf717e13a" + } + }, + "b6bcc464b7b7f0359e87e9a9517d10823a2e0c93" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb7fbcbcd3389df89233f8bf6bfa8acf892958a34" + } + }, + "b705cdd0dbc620e11fa470f9b4938c5f9f42d84e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x02c577c9c1b247c0ea60b1dd50fa895c086e2f2b" + } + }, + "b7650fa902a0ad81e8d48deb557323bfcf32efdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7343c0aaebc045465ffebca00e201c1f554c2eeb" + } + }, + "b78428568fc511f4a6ed34c2d57c4e104138ca98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb678cef4a4ba3f3642fa128daef4ed6d50ba1a10" + } + }, + "b7b7c5f65fc11a6bee686b9363884811be247c43" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x72969d083705c924922b857922930f2087426ca1" + } + }, + "b7c425948402f9382208346ff48ef6ac4667baab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x73c85788bca3bc1fb2e9b3056c595a4a7b3d2e47" + } + }, + "b7fbcbcd3389df89233f8bf6bfa8acf892958a33" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd80ba0ac6edb71367c1634ae5bf72970e596a99d" + } + }, + "b88173b953f6c1b613b6e878cfdb34899e3339ac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb2c10a1979ac6236e586ed704cf9dcecb034b8b8" + } + }, + "b8fc89fa4eae09e1b4bbb51f4c1791e589368801" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa5ddf08c7de55ca258e346fd1acb1b71cc2f882a" + } + }, + "b9261902783bf36bab49f18323a9c8e4ad86519f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x130d08c2381d23796ff403d8f1fbaf204d90e3b9" + } + }, + "b94d3b46afb9954a375e50a6fede26705800a057" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x94602cccae39d50fdc504869eff546d1678f0ae3" + } + }, + "b96672ac912cc5ad6f75157401ccd9003512ffc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x986e30c8512ac023f09da460202322a88e98aa67" + } + }, + "b96982fae6a70aff19c2d99c3b2adc57b151d784" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa770dccb354eae253f170825000386233ebed232" + } + }, + "b9f7e8e7ea5b1a7f184a152373526ac7acf4477c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d3b079a8306f7cc89f1b9b23319ec904e3ad854" + } + }, + "ba158ff71047c0322b1474461f94c0246d0dfb2e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7f57dd2b577f0d5cb1fad7bbb2cf8f07ec0f019a" + } + }, + "ba3adb3b7ccccb748a65932e0254e52ce092c5b5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd25b7ae72c049f91091a4abedc4d618e5a05e1e1" + } + }, + "ba56f0f804625c0ff8b7b119bd03af0a10b5886e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc0cbd80b185007c05f50e6f2fbb03e8d6b2ed653" + } + }, + "ba70f98f64f041290dd6794e5cbc9e8144c8c914" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x134c36c64db09ad23fde5b43a3a7a92d84dd5301" + } + }, + "baf332c908b38d0c5e825b41a500525fa990b0cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x69afd0683057a214d3bb3cc7d438961cf8c8b201" + } + }, + "bb26680f6bb423720c6437fab35913d0a86e2a78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ebc77b7203cce293550d92b2b5587621cf5321a" + } + }, + "bb7a0556525b43c750e380a0ac1ca3bb719e601c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5cf45d08c0b55dd9c34cc4cb718c917333f2e9fa" + } + }, + "bbdb82e2b1ebae617370e1c27542ea087a4fa937" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x711b5163728968ec016a924238f743fa04f2d120" + } + }, + "bc2929a7819bb70f10676f4bc004fff40ce5a52b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfabaccc45975d14c53b830fd4fa0576da541d22f" + } + }, + "bc843b0159d8f7cf6fa1bda55e3ddcf78e1617b2" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa7547a96b2c999509ae062509a0d426fa46ade63" + } + }, + "bc845b8623c7af6b07eda7a5363298989cc007db" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0199dd91369b5ce0467b68d57beaf1d96fdc769b" + } + }, + "bccf73dc6498406a51b4183e22c4be57de5c4975" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd7ae2e59d0776d0ba96fb4b23d1eccb3d57a14ec" + } + }, + "bd4f71cc4a8facf8612158e418fa394cabef27b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd09bf9b58980d6a5776bb391d8c6881bcca2aea" + } + }, + "bdb0e729f9136a166efc4ddea366fc3b6bf6bf5c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfcdb751de1dc7c5246ce698b4b104016d034cfdc" + } + }, + "bdd290243af494ef27e986a3cc432ba3f873758d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3c4a4ef39f21e45a8f56e5c8bf8bacfaba78a778" + } + }, + "bddd1619fd3c4703733b1648b7db0ffa6dd09a19" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd0a97217cb0a4211e28a58222c1b038c44a3f212" + } + }, + "bea830535682332041ad318232044f5e914af083" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x387b1112283308ce33f63062a7531e6fe0f3af17" + } + }, + "becf51bad165c4b8544ecc57c7859ee946e610df" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2c4a413bc345da77b2d07a17313b6d89aef2c2c2" + } + }, + "bed1a42fdb56c7d562a773650bb2785737caca3b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1c32901c93008d3e09928bdf3385f32ecff9500f" + } + }, + "bf36bc1d23eebe66f84a0f119552dc7b46fe2402" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1cd52bab323ca2180a747d3c8b8405397003feba" + } + }, + "bf574eebdcc7ff3617200fe07c8c7154a8d129f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe355b484879e20943aca2c6655953ec8121b64e9" + } + }, + "c052f8b19df2c41d807bde1c041a8ba2e87f15d5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc3d826f0bcf2d353afaea99ec55eb9162438e316" + } + }, + "c06bd5d93ac2ecab95942d1639b700e3a2cc48b8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6af2602221d2477af828ddb2c1dec8f70a24abe1" + } + }, + "c071690916c15657eba376c7c6b4b06d38e815be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5d3292b79851f68d3907a550dc1a0b569d603f67" + } + }, + "c07b721215b231d9820dc8d186e3dcabc6c75e66" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3671a99d2a485b30fafa2a65f405b6b03ed32eaa" + } + }, + "c0cbd80b185007c05f50e6f2fbb03e8d6b2ed652" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd9d8272a3b205f71494f9009705f4f30dd31c608" + } + }, + "c0f36c8efba9e6e4e677faab240ccf0cf3e7d03d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd87693ae6d35928467daf90aac749654e9c57645" + } + }, + "c101a7eb0ac863e824eea705432530c65aa0c518" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4af174d239e86ee19d40026eae04486804602062" + } + }, + "c19f48a0a131e8b9f44989bbac80a30ffe2a2e4d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1a6bbe5380998bea238848b7a5927fa87e7b9fe2" + } + }, + "c1ab531ecade623c0c908c1fbf104fb8c647a37e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38fe3b47fed5fa6d060bde66598bf5a773b831ec" + } + }, + "c1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0b3647d7252d53d397fa6af6d9da4749f4caae0" + } + }, + "c20cf04f10caa057314759a2908524925294efb3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0b98f3276e76e9982d7f6996878ea5196fda62f2" + } + }, + "c291bf92ff9bdc0e60f049e6a5b143b940658857" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8ce9124341c4ca3c690b29f3575f3cb9833c8c3d" + } + }, + "c2a603dfbb0734c098e5b6b7c8a9b64bab11054e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x44d13c51fb706efb7394346b00debea9ea46e9f4" + } + }, + "c2afed79b83fc6b8d98802f52b1fea6648571ee7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x723bce7438e7c70d113e954e9aad5dfb4551dc00" + } + }, + "c30727a70f64c82d0d8837f1b45b931ebf80b106" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xee439948c6dead863ab2ba9105b70916d45f9e7a" + } + }, + "c33582140ad3da6d7fde2c3c73d0530cbde93555" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0b4b7f08623d9b3d6514baf529399e4f1c0ad945" + } + }, + "c37a43e940dfb5baf581a0b82b351d48305fc885" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf735071cbee190d76b704ce68384fc21e389fbe8" + } + }, + "c37d1d79868b6a4c25db68301b8575ae4a8336fb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd0dea1a583400fc29051c8192b70022d8d92c49" + } + }, + "c3d826f0bcf2d353afaea99ec55eb9162438e315" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa65929129c13f2405697b704fb1c840987ad36f2" + } + }, + "c4170be517e6c67a9e65dddb09220df58e547102" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdb4ed990c69c3b67a04a96ccf079649facb9c434" + } + }, + "c44e39eed84adf0c399a9d5af8d0053715d0f5f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf9d417c0b18ff731a88a17f3b31d9d6ed1e288f2" + } + }, + "c489e22b54124b98b17b68e7c38676efb81c1862" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9f28528f2db498c3a0e79b15b97d3b3e9357e943" + } + }, + "c4be49d4dcee6efd96c35ddf346b969db9981091" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87b02d6f0e02d90fb05adf14ae74570ea8ca6aec" + } + }, + "c57abf0b9724f82736bee2a05a9238a45de5512a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb39c8c3ee619a2946cf540cbf16720a881110f84" + } + }, + "c5a28cdc8c4b089c87ed4938ed4718253c48dd7a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb203eec55c1da2fd38977032c79ada414cc914d" + } + }, + "c5c5d6ad672b24a2ddedbd2418c4c131c212cb0f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b6945d5fd5172355825871803b93e57c5040654" + } + }, + "c608a6fa0f9f3a6af68270740ed6c998e145eede" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb1ec052c576186de285bbd31164de3b19a844dc2" + } + }, + "c694bd4edd4e806b9c7d4ad742a3be423391470b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbddd1619fd3c4703733b1648b7db0ffa6dd09a1a" + } + }, + "c71253e1b049c2b5acba1893c74007a26797e111" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf3b37fd9258f2c883c44e8ddaa90f91bfe9f5d52" + } + }, + "c71abd039da56d4c1d783ed06a48adf0808e9cef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x80a784f83657ad12a742b94e01c3bbaf3fb2c6be" + } + }, + "c775193c9d81ed6ee806f6005a874b927e96ff19" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0802fc1dc1a5dec7fcbf1d50f3d8a944099ad72f" + } + }, + "c7e31a320a9a7969a6f4c3cf98bd6d92a6119055" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d33e2eaa419844043bc41073bf3a2bc0a6c1b1f" + } + }, + "c82d5a989ed7c8ffdf79ea0724b3c9ba3fb84e57" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x27b3a0698a207d5ed960cf71b1ee9fc54c229eb5" + } + }, + "c8732f022b6c57d291b26c830c651b3617c75b2a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x99d6d7fe1a4f0f7d92837486a1f9d7dd500edc12" + } + }, + "c8b331eb5ad444567964f34dc24757bdd3425943" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xad02a5cab29480ea5b67e354b0da540082500328" + } + }, + "c8c3cf855531e1d06c07245e76c5298b4fc90d8a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4ec27065c52d294799b93700dcee6e32778f1b19" + } + }, + "c8c90ba51e74ac5d9e462ffcafbb6df11795ebe5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x65e3776618742b90f1d9844c907b276854869abd" + } + }, + "c8ca05f5e8391cd5004c3c4020e570ed4a520c20" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x66e68e1d0f65b4379c2864f5228d98de265c5e31" + } + }, + "c9113ae38fc632738ad4722046d8e07ba9363ca7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfff1cd2c481ce0fba0c97ef77c79227d3b67832b" + } + }, + "c95ee3b530d4b057840c2d9cb542a51e4e3a00cd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7d699e5ea61a26a7f677478cc79887e2f27ab346" + } + }, + "c98b82b246d3eca7562ae19d8ca605e77cd53a3a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4bb5fc5d686cfb132c177aee8ef426e5de98cc6c" + } + }, + "caf720d275e228b58bcd8b2686714ed8819cdc2b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbd4f71cc4a8facf8612158e418fa394cabef27b8" + } + }, + "cb0ef5a0d3f9427d66aa2b00d4b25c2445d96cf1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x46aa4a5c336dbecbabd4cdfef3b9fa65a8a12a16" + } + }, + "cb5e208c02a68f2d97601da482c419af989e097f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd5144e55ee02feec18f2ff293f08b8379d1509d4" + } + }, + "cc0302264a5d0f269e26ca3ac24d7695b562b4f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1591af76c716952018e52e54c716e8b2226d494c" + } + }, + "cc40f2616fb396bfc25e9b22ba3218b2b217ea3d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x317fda8ec45232a8259546a4ca8ebef16338d47c" + } + }, + "cc7c2f8a3070489cfca48f5fa0db9fa2d65e40e4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4a5e07598b0d6a40fe62ca88813b63a1c02710f" + } + }, + "ccc8cd23dc6755bbb516af6ef2a04cc82a5ce5c7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9fbf90147bf6ca022818372bf38637738d553553" + } + }, + "ccce4f34ac3a550c95747823a00fecce349734f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe21b2668bb1e9cf057606c44d49648f1c140aa77" + } + }, + "cce1e6f23dccba1aa1830b1b7714fe985f9f2032" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2f171d1f2cf19f4a458b7dc4db89fa7cd818dda1" + } + }, + "cd1171381ba62ff31b56a001b8144e64e365eba1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38450559e7ed9b72c80aa00855b942f9bac1b282" + } + }, + "cd2910fb9ae3395ed149b28a1ce7c3cc58bc5481" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62e75c838a732abab87e1846f361721f03e7d974" + } + }, + "cd5fca46bbc468b84b493f7b52ff50386b174d40" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdd8317eb76e8949315e601fa8a6959e2ffd277c2" + } + }, + "cdc1f2aa2853b37723f415aeb181583e11ae7b8f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2be9413f150b2eaf2666b42ee719fc66e5066f2" + } + }, + "cdcc86f0d7e95ea5b2f9f5e802015c8ff855b257" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc71253e1b049c2b5acba1893c74007a26797e112" + } + }, + "ce20ac750c9549b466d48c90352a255f6b7c8294" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3ef5e42a0012b430169dae579f8dac0f6ef5dc39" + } + }, + "ce7600131bfe22040ad75febed54cd4ad181276d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x786102f7205ad86bb77b14a1b80d8b26cbf3562c" + } + }, + "cebebe455b6a15d2e4705ebe51fe5007afda76eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4f5af8eccb582ad30e2702d07577479599461c55" + } + }, + "cedbc4eaa94298536ad368e8ac9819c5e7448738" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ebf86bf849b6097c8af6dae10c52438538a0712" + } + }, + "ceee86e99b04198c09fc8ebf3e2f45253bddeed5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d5" + } + }, + "cf3f58bfe41401084fd1e997e8e36dfb35e363cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe703236fc6d1dcc955b9abf34f490e2bf5057fde" + } + }, + "cfb0d9c00c0b7ad292f221584394a3ae7d30e0ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc9113ae38fc632738ad4722046d8e07ba9363ca8" + } + }, + "cfb86844738d5373ad23eb3185e1e9fc5d517ae6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6c14bbac448312636b86fe713185cf7d8ea6f1bf" + } + }, + "d032f83c65a584f6e47f9fff9bc864d51a164a94" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf94e8e9f1511f8cede3bfd8e1be0db35085e8e6e" + } + }, + "d09a49b1cdb208e2504486267ca2418c87152962" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5f1703b93938752face6e4657a90825b77f455db" + } + }, + "d0a97217cb0a4211e28a58222c1b038c44a3f211" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc86915f4e8884b49adeb6f23a8f69e643d9db7c" + } + }, + "d10afb219e80a211c9072b18de0ff2317f67e573" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a45843cf7ed63ab79f7df4d2bf80512d259b0c3" + } + }, + "d111da05d7193bc295a4956543810071fcbe4238" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0d11b1966fa90191f6927943c476d36fa3a31557" + } + }, + "d19b2ebcfea3994bf30a7e4283b73d4bdd319cbb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdf50b2ca876e4174d276dac0c64e644cb1b5a119" + } + }, + "d2468d6da54259507d07f74ef0a246f97e52f035" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6cc6da179301a7ec4290cc0a5860a42ad18839a0" + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62c01474f089b07dae603491675dc5b5748f704a" + } + }, + "d25b7ae72c049f91091a4abedc4d618e5a05e1e0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdc19c28fa6124ee9d0688d0e2879f1269b4b7fc6" + } + }, + "d269786262f853ed769ef3ea9a7e5b98db3bfb32" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1ec26f14651cc567ce691ce83ef09eced6b12a6f" + } + }, + "d2a0b130c0834eb0ad2717ad13233242280a6fd0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97c99c7f158206d19196df8d21573126569d918f" + } + }, + "d2be9413f150b2eaf2666b42ee719fc66e5066f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9862b64181c8bf5bd53e51c5f596528ff82bf653" + } + }, + "d2c8bda3e1481b96b4a3ee0a2e1f3f1aa6299feb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2eabf4237f49d4cd44ec256436b99ba41828d36d" + } + }, + "d2e450aa145ce97dc054b1bcf391407fbf202bd5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda1849a4f9df2e58d30c94732ff5f3aea19ccd8e" + } + }, + "d3a4f3cc7113eb16572eced68ab395a40ceeda1c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87dbe63fcbb0c90d20021f9c01a03e7d94916b3c" + } + }, + "d3ba8bc2aa219ba0aacc8960b92832c3b0693bac" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x30b37f280d6735ee04239de0963b071f83c13a28" + } + }, + "d3c1c3359ed1906851379272964b7d96e2977654" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6c3bed6efc677ccb136c0d886a6f3fdb375798c2" + } + }, + "d49825eca3314ad0c5918472615055010cf4a4fa" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd5b134edd8931ca2102693d88070dd49fc13351" + } + }, + "d49daab5099319cdda477f5ba715ae685c031db7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa777e559211613e73d9d0cbcdad62c88957d6f26" + } + }, + "d5144e55ee02feec18f2ff293f08b8379d1509d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7797a5c4bb655b5ea51bc966875abb3b19c0d106" + } + }, + "d577d44f2748e151afdb1ded254c942ca9933b0b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3f5bf6c71c4fae1a91c1cca72b539dd83762a717" + } + }, + "d65386ce109ffa3570dd27e54f32e2528fe01fc3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8405a655c77ae3ebef4410c924cba9ef22a57f43" + } + }, + "d7409d185224a0284e7451923e3d094ec309ef92" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x81b26e12027f5df776edd5539791e683dc2e57f1" + } + }, + "d743161f0f7beed30155e171b4d577d5ce2a70d3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d4ad735b52df9e88fbebebac2de1ede991f9995" + } + }, + "d758e9a701769fe9e5a80b3a09180e7631866f55" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc843b0159d8f7cf6fa1bda55e3ddcf78e1617b3" + } + }, + "d79995f1fbdf19beff429a94fa9dd184827c68c4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad8" + } + }, + "d7a36da4e6e26a99b038e34a6eb74d10d422ba9f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf74f956ea3d122e47f4aa0066b5e3605c80d0283" + } + }, + "d7ae2e59d0776d0ba96fb4b23d1eccb3d57a14eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x01b26e834122a942828698305a84789ec47c0455" + } + }, + "d80ba0ac6edb71367c1634ae5bf72970e596a99c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xeb67f5e410e28c16861fea7a2ecc1e0011a760" + } + }, + "d87693ae6d35928467daf90aac749654e9c57644" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x833bafb51e8a34c93f3100430fffc5ba61ef95ca" + } + }, + "d9860a22b84f982363ab9684d767a347a5c4fb74" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcfb0d9c00c0b7ad292f221584394a3ae7d30e0ac" + } + }, + "d99befc655ecd5df508569aaadd729af7371687e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x844301835752f15f39550cdf531e07ccef5d133e" + } + }, + "d9d8272a3b205f71494f9009705f4f30dd31c607" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc98b82b246d3eca7562ae19d8ca605e77cd53a3b" + } + }, + "d9dd1aa8519580888c402dd4fae66ca68b4a7b47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8bbe1ac3ee5866589a669dd95744af5ee83e1b73" + } + }, + "da1849a4f9df2e58d30c94732ff5f3aea19ccd8d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfd096ec4540dacfebbabf2dd6ffd3493a09cc390" + } + }, + "da3580da73b2986fe0da9b6caebe17818b7b3645" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a2f4d9e7fd12bd7dd8141098bd3363bb644f069" + } + }, + "da5828cee8e61bd0d8af71ef5da9a7a9019ade13" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe475b2b441a9b1cdf24e0ea992dfaecedd58d6d1" + } + }, + "da7555a43e7a3790290cd20a19ec19032e28a6dd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0c1e13b0604290abd900eba3fb6b7560b3401f59" + } + }, + "dae44ad9bfab81783c1dd591ebe3409fa8967883" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xebff1a1539630b2f7b5260a93ea602372e539367" + } + }, + "db06ebb361ef006c17f89ad92165185a38f6e630" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x980410833d9ce53a0f944ccc629032fb0e6ae6ab" + } + }, + "db4ed990c69c3b67a04a96ccf079649facb9c433" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc0302264a5d0f269e26ca3ac24d7695b562b4f5" + } + }, + "db58d0b35d26edeb0efcb49f7eb627cf49bb3a47" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6a31cc57646f3d9ae3b63e1f604dde04d1ba52b8" + } + }, + "dba37eb3483100bc89a7bf11b7f110ad71ecf41c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9beadb15fd4fe1f0755ce82dd160e1a798544a1c" + } + }, + "dc19c28fa6124ee9d0688d0e2879f1269b4b7fc5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa65ece83e15c7320aa0ef7ff2d69c2ff61fde662" + } + }, + "dc1baaa8621b513d62e8aeb02543ce5c7b8020c0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe326d4acceedb3e572b98d4a45a6f1e37ee42502" + } + }, + "dc280f2887ea315f70692eb247e399b18a07bda8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f5" + } + }, + "dce512ecde5a4c27da464f846e71c8272da4ad80" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91acc7d4c4cc7affac116157a53f5614959485fa" + } + }, + "dceb9854f220556f595bd655bf6c023457341e4a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbf574eebdcc7ff3617200fe07c8c7154a8d129f5" + } + }, + "dd0eda6e9a3dccc3d430e5dd333c83b759cc7883" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x32a48ace80773ad092de1d9bcaa00787353b5fae" + } + }, + "dd8317eb76e8949315e601fa8a6959e2ffd277c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf475a28a9649aa00ab8a40af393f1961587c2276" + } + }, + "ddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1209046d7bf46e81d8202422e630719c906653db" + } + }, + "dddb23bf0a55d0197810e062a5a24a1503705ae5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf134cf7fd6ed2e962db26c4b3d99ee5884102c86" + } + }, + "dddda651d375f5352d2ff488eace1de63b6ffca9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5ff4ef866c3ad4102444d020c1d21c3d35a119ec" + } + }, + "dde0b1e9b9ecc980c5614012f9afae25cb1a1c16" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3fabe5e3c3a59fd322cb638dc5295d1e94cbcea4" + } + }, + "ddfb1c855ea2b2f198d2b6c7dc8ea0ee16d7319a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x253a31b068a402910eb30758704b78c375ea349b" + } + }, + "de63eef4b269d8572b6b00574ad8e34c471a07d6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xce20ac750c9549b466d48c90352a255f6b7c8295" + } + }, + "def94fccb1b7dfbe1cf0b3dcaa03a77cf58ae768" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa06ebfd07c3daff1115b82d67be5bf4079ef6ea2" + } + }, + "df50b2ca876e4174d276dac0c64e644cb1b5a118" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e5cd86dc5f716ebbdf6ef572a369c227986bde5" + } + }, + "df5767dc4d8111e8641198f637e4423c62e57e27" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc845b8623c7af6b07eda7a5363298989cc007dc" + } + }, + "dfc26965c20fea217850a28c08021f1468146101" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1cd063768378c77cbcb93dab0ba4c345d76bb0ff" + } + }, + "dfeb403cff0aabe20cb07d8451caacfe31260132" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x82afbc3f6dba388dba71ee35f56ea772a53033a9" + } + }, + "e026a4835edf27c2705c97f237e5b59b7b5da1f7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x12eed250610e4d59e841381dc46deaea3d9305b2" + } + }, + "e059d3aac9a568120467ddbba3e4d25bbc82dc64" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x21190aebff29feb773919d8572f8cc825bbf7145" + } + }, + "e089f14df5e00aff3b03cac5e1236f5cf5832d5f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x970e2fc1f55b1e2b214f84e155ae6a9403f891b4" + } + }, + "e0a1885b4057f65dc75636f4fb0e4b57da82429c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa24089bde6e39fea0d157ab9aa4173882e62f3a0" + } + }, + "e0b3647d7252d53d397fa6af6d9da4749f4caadf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbc2929a7819bb70f10676f4bc004fff40ce5a52c" + } + }, + "e0e5744863b26418baf12f94f0bdad2ef2546a92" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x791812110230af4583a4a6dff7eb425b0b0dfab5" + } + }, + "e0e8eb511c8a93cbc42dec4e3c0b8492ca1d81f4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x795d6e09eedae3febc172169c017fb67aa62efbd" + } + }, + "e0f04368af17d56c8cdb50f0fd5f1847d9a49cb1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8142cb33b22222bb9e39a66b53af12c6ca0b5376" + } + }, + "e0fbdd03e0e490770d671965ccce5f5ed42bbb9d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8d7912a42951e7201c8854b98a36e4203508c3a3" + } + }, + "e134cc9b2be1a15b9e270a9f7baacbda3c8b3659" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4cd33b31663c159fbd73cbb32f616eb46f7b18a3" + } + }, + "e14b8b08ed9b569d2945b078fe94225924c5987e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2559cea11e9d8fd293253a8ffada7558c9c4db87" + } + }, + "e1954d1413f4f50c7bb3aa0ee368b94dfeae7c1b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x629fdbc407b70b57eaa1523ab12c5178e81a5d53" + } + }, + "e19f216f6b8b78ff1e705cb56d0cb07db60a05ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8cfda5300d7544327e32aca175840f90860305e8" + } + }, + "e1e31732ce0075070c8d7e2ef7a44b93949493d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0441738f9f0a045afd77a72ef8398475c1111472" + } + }, + "e1f79aa1d6477ffd08d4e5ce185637434147e4f8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa479aac07f3b83ee401944a36812d665f54ca6f8" + } + }, + "e21b2668bb1e9cf057606c44d49648f1c140aa76" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa4cd6039bfcc6295533a985631a151bf2e0e8b22" + } + }, + "e24778b9ec00cc9bef91643e31885deee719207e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1bce33a58c2741f74daab60067f759e9fc5f8c41" + } + }, + "e28a959abf1b36ad7778737d992690cb73a51a91" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d1f3f15f36d76d52d65b1b78a4ac85e91f33d26" + } + }, + "e292ba16ee32e94ba88b4b72821bf90fe7b1b845" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe1e31732ce0075070c8d7e2ef7a44b93949493d1" + } + }, + "e2982af9c977c39cb4633346b916a3897ffeb6f9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x09957f64c3396f36daa03c68fa6c997eb7903df2" + } + }, + "e326d4acceedb3e572b98d4a45a6f1e37ee42501" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x62123ac69c46a06f7e3644b0dfcfcded535b8728" + } + }, + "e32bec776748185042cb02d58fad1d5027bbaeff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3debce965330c2da68edb1cdd3ac380d5ce67b11" + } + }, + "e3443d812bb8204255a1d249b82aa19508dff5c9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bda06aef03a04b8eb3e4c7d1ef001fc806f5f70" + } + }, + "e355b484879e20943aca2c6655953ec8121b64e8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x22df73cba33d8fd14fc985fccded670de4041f26" + } + }, + "e365d9256480b1e9d3cc6eafdcad5912b75ad149" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5affb7ff218092cf60bc1ba4b32ea65a32cd6845" + } + }, + "e3d08fe78f595bede290f820ec0e878572803a6a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf25da1517af0e2fce2b9d75fd964e8827cc0cb73" + } + }, + "e4028c8f2888697e9939562de475f70a841ee713" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6123d3be4335107712685be2d575958b17501068" + } + }, + "e475b2b441a9b1cdf24e0ea992dfaecedd58d6d0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x01619145d576c5b3130eeed16f29501f2773c959" + } + }, + "e49d92946422e69977a94d1b4b769f97efcfb8eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7845e6c6f5d014cabfeffe6d4d9d18c547d00fa8" + } + }, + "e50c29688b2c3dbe6633797d2a200ed7c2cb1cba" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcc7c2f8a3070489cfca48f5fa0db9fa2d65e40e5" + } + }, + "e59b406835db0d4c63ae28072c64c664da637557" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa086d90b189bda22a2ebf3e9b7092f1782e4fe85" + } + }, + "e5baf7303b008f333c57491345e604d52fce0d63" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x87946e396d4fd04d02f117adf25ac427895878b4" + } + }, + "e5fa8de537f7665e2aed751b8ca7c6b5bf0cdca0" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0d1e5ab3b0c2d1ad5a562c123b7f01f4145074cf" + } + }, + "e635349c1e038d62f774f4201cbda082b8af403c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xabf67dec2d1ec31dd111c2f1135818b6af86c663" + } + }, + "e64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e98" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0462dd089e0519c581654520d17763635011fe00" + } + }, + "e6df36db61ae2c46d2cda2f6c8d1856ac181e6cc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x73f9912db6e86599f256f090dffd915a845a9632" + } + }, + "e6f12dc0baf6536aa75f226bfb0262d8266433d1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xdde0b1e9b9ecc980c5614012f9afae25cb1a1c17" + } + }, + "e703236fc6d1dcc955b9abf34f490e2bf5057fdd" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8719f47f3dd875955760868a4fb23f761cf7d4ae" + } + }, + "e71d6b1facc3de5c246f7d14e35a2b4a2d983c11" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4e76fc5e619a4200846eecdd5545b39499debb11" + } + }, + "e74299a026e8a481c1db07e6065ca30af9858cbc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xbaf332c908b38d0c5e825b41a500525fa990b0cd" + } + }, + "e75900e645ce8d1abbb97d408989b159b2a50a1c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb0a9ac49b7fc9a45c9e7b358cc2e9e09dfe361d2" + } + }, + "e7b8aae66ff70d59fcc5a8b4de5a246081547146" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x08d19f247ca974ee89d4f988cac4becf7a177724" + } + }, + "e81f08cfb60f7c156cf7dcbee1b8790901a1eadc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x298b8bde7997684bfe4434cf6d24d50ddabb69b3" + } + }, + "e8373e7e464120da8a84da82c8137872cda65780" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7e2bd10d506af5eaada030590c8073495230f37d" + } + }, + "e857a6c6f502dd2bd0ec341b2d4ed55f2e87e8e7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xab1b93b6a83c275972ec2a6b513c3106dda84f48" + } + }, + "e908278cc1515f214049c48c3a8908524f2cc407" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf12be871bc1a1f3ca254eb027786085dd79494c6" + } + }, + "e913f5b697154f99bfc159a132c6c253b457ef18" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x5ff4d4daf0a832422c4675a77720abbfb5afbba9" + } + }, + "e93e7128f80bef53e3217782f21f4bd6a6d19c7c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x54819bf1efa86437d2f38b4211bdd5229247d9b6" + } + }, + "e9d157e81c306452f8494f681813037b146660eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x0e700a2aba22bd639abf05addbb24c53c3f0f3cc" + } + }, + "ea186a9a4815581b71403480abae5cc7c57c00be" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x09986b78d02ae7c8eaa8b62053a3ee78deba79ac" + } + }, + "ea216bc75a65a838ea3d63f7c05588c2840ec1ab" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x305773e25e157761c9d55cb7d9e24fc1b953a8ba" + } + }, + "ea2f1211c66cdabf2b618a4dd965ce133592763b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1872142d84f7023b181766b790a4487f4012527d" + } + }, + "eadf36b1baf942879b0b5c45469fa05add1d61b3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc30727a70f64c82d0d8837f1b45b931ebf80b107" + } + }, + "eb203eec55c1da2fd38977032c79ada414cc914c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc95ee3b530d4b057840c2d9cb542a51e4e3a00ce" + } + }, + "eb4e97f22f12995949c371f2df690f68f71070eb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfc55e6958f11444ae56c09af726f2ec57525db59" + } + }, + "eb5ad2481a57a6b7ede3a16ad8bfe2991eef3ad7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc3d96a0eaddf7975da5c8718c26d65de0de59c" + } + }, + "eb9414a32f85461cf4ac7c9c73761f3f1e5ab14e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x16cab73035afa73268745a3c2937b551813c4961" + } + }, + "ebff1a1539630b2f7b5260a93ea602372e539366" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x81d6578dc3e3c0fb07a8d62f66c1eaf3b97dc2af" + } + }, + "ec184f693f222b3e48622f5253c134339e7e2e7d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x1f01dbf8bd02bed14cc0a21831e044faa3f66fcb" + } + }, + "ec318906ab052a41ef13ea33deee554704a307c1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x14a76e43bc292a0e69bace56681c4eb50d8e52d8" + } + }, + "ec45f260d4d758d6d23ae0297a9516190d935a5b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa1230890b4634e4461d6295fef3b4ca6d8899bd5" + } + }, + "ec5f2ac1947c51c5982eb0ab63d1e6439f45c2e3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6f257471f06ece199232aaaa082d2b1ae7ddb484" + } + }, + "eca2fc261f07a269c2487e6d1b0539d0950ff792" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa60724458ce6cca04016e99826fff8c99c32e3b4" + } + }, + "ecb643ddbca1cfa6dd22964c20ef57ab47c0fda9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe635349c1e038d62f774f4201cbda082b8af403d" + } + }, + "ecd38089d14a75b93afa634276bbe8965f5642dc" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf00d30ecf763691115d2314d14ea1e11f61ad875" + } + }, + "ece9d0b9393f64338ec6ca5b0efbcec2175f19ec" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd49825eca3314ad0c5918472615055010cf4a4fb" + } + }, + "ed1a5e97e3415b484e6bc8b84bd170dbdd879cb3" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x059ec3d5a255df8a5b592659ea5fdd963e9bd0c3" + } + }, + "ee21d08004e0b6f2c1cd4bcb2a04ab74f7b7b708" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x511b33319d0f7df487e07c4f5d149b27cecace47" + } + }, + "ee439948c6dead863ab2ba9105b70916d45f9e79" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6bed38b822d8823a2cb71883522f932cdde95b0b" + } + }, + "ee6f3914a1e5d955fd62a29562ee0ab776235ff5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x97316b1fd92c5e6611acffe79899064fd9274c8b" + } + }, + "ef36b064bb706bc0540e4ed2b341ae8a0b7756b7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xafbd8818fe046adfa468ea58a217b83f7d5e75a1" + } + }, + "efe2a6d8859b14ecc69baf66dcd47f4067df18e5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd5fca46bbc468b84b493f7b52ff50386b174d41" + } + }, + "f00d30ecf763691115d2314d14ea1e11f61ad874" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x69fd2b9233b83e54861436496ad6b9fb28afaf41" + } + }, + "f026ce3f255ef9fc7b93719a3f6926ce4953bfe1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7fe4672c6fd2a05c7a91676e5ae2e75ea197567d" + } + }, + "f07ee5b0729c565f7b57995a108f94e4fcb81558" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcd2910fb9ae3395ed149b28a1ce7c3cc58bc5482" + } + }, + "f0dc197380bc632e5078f75f5ef0b814b7eb2ec6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x814a465f554f949e6e2a6878539c705f319c627e" + } + }, + "f12be871bc1a1f3ca254eb027786085dd79494c5" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3b7d7653d3a7c2712d08bd29668163cb775c74aa" + } + }, + "f134cf7fd6ed2e962db26c4b3d99ee5884102c85" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd269786262f853ed769ef3ea9a7e5b98db3bfb33" + } + }, + "f191a9c00fe780f63cf4f68a06e895bd53981254" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8a05aa8ab787526a0591016c2aee95037b8a478c" + } + }, + "f1970ea5af8456fee42cc087e79bd5c6a6efaa87" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x9a0ca249b7e4f00f62ba5230a602c3233895cee3" + } + }, + "f1ba5e0a4a27d8dafcf87f049b178fe83574ac06" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4a466c64765157e1a9dee46e1a26d95ac2664c50" + } + }, + "f25da1517af0e2fce2b9d75fd964e8827cc0cb72" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa2442dd71a4e937fd73ff383067f97ad4c83b4a2" + } + }, + "f2866fb67103c69f10edaed228d2dd64b7e6df83" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2f8ac479ce5baade6a63ecadf9599bfb0ecdecdf" + } + }, + "f2d3cbe7357ee858c2b7f6ea28fc95c1af508ca8" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfb5d7c75f272b07450867579978314661c3e1207" + } + }, + "f2d923a66a9684f2268530094ce8e3f8b8cae52e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf2866fb67103c69f10edaed228d2dd64b7e6df84" + } + }, + "f3b37fd9258f2c883c44e8ddaa90f91bfe9f5d51" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x38c622aecb7e84ad4fcfc327ae9a1a17e2dbc36f" + } + }, + "f3c5a341248911dda9d694ee74bf997365941dbf" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x82d03794122107972c0d075f16754791224b507d" + } + }, + "f4489af2af8424c6edf0d0adc525680dea208a31" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6d27b8cb6b9af8a56fca98f13033d15f10f66da5" + } + }, + "f475a28a9649aa00ab8a40af393f1961587c2275" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x702433f6bfbd76274ec1bb641c4a0428298487f2" + } + }, + "f48270bfa988db4518f9b1db9e78bb398c954550" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xcf3f58bfe41401084fd1e997e8e36dfb35e363cd" + } + }, + "f49ecf0e4378b1957686d8d0b227f83e48e5523c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6ac56f1ceee102b85819d789e6b29308eabc373d" + } + }, + "f4a32ec7fde64e7d3ceb53fcc00511ffe13ff5d4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xfe8d768de7a723c23583162dbef207b6dcb4fb59" + } + }, + "f4d2d03bf70c2500fe431fdc8fbed2c13437bdc9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x6b5ced188780878d8a72b3e6f02618db2bb97585" + } + }, + "f4e76b020a22e8c1929ba2163e413385fc0cf884" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf0dc197380bc632e5078f75f5ef0b814b7eb2ec7" + } + }, + "f53e504312e2ff787bbb9ba4ea921e9edb7b18ff" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x58cbb2379b1fdac0a036bf75bb598e7d4fa232bc" + } + }, + "f5472ede25cb83dc2fe392b01111133b777709b9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd3c1c3359ed1906851379272964b7d96e2977655" + } + }, + "f619381383c69659fe81a10d695b2663426624d4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x79225179187b35144fe9e8505cce2bcff3986ffa" + } + }, + "f62f676443b29c513964f01cbb356165ace54b78" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc608a6fa0f9f3a6af68270740ed6c998e145eedf" + } + }, + "f6ee7d8bf313f837bbfed7f10b16fb2f182fd416" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2a0b130c0834eb0ad2717ad13233242280a6fd1" + } + }, + "f735071cbee190d76b704ce68384fc21e389fbe7" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31c640b92c21a1f1465c91070b4b3b4d68541960" + } + }, + "f74f956ea3d122e47f4aa0066b5e3605c80d0282" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x479544e8b67a7e82120d3c5d7869b4c55f4a0de4" + } + }, + "f783f583fc06d2c88e9e0d263a6ab66f8b8a0514" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xab118214a2227c79eab2680df0a96d0ad67dafd4" + } + }, + "f78b2d97c8af245b705c0a19601b95f983e9aaf6" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xccce4f34ac3a550c95747823a00fecce349734f8" + } + }, + "f78ff2d350615b858077a50ff85b3a9e2edcc995" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8f75ec2d8d77fd6a26f4c01f7b0384bd60418875" + } + }, + "f85aaa082ae886506141245ea3b43ee74babca65" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb39c43369a4ec5e4b2dfa8b3dbb3a12bad630b31" + } + }, + "f86c50909ddce25f4d4e71e16d78b2f6a244e8cb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x90344e80aead27d6b007ee73dd8fd8169f870f52" + } + }, + "f8e4de2f36fa5e9861fe3af86d05db4cae1bb1a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4d7a1e5009218cf5176a313f6922c3ab01d4970e" + } + }, + "f8fc32491119dea2b7fda5080ef9cf0027590265" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe59b406835db0d4c63ae28072c64c664da637558" + } + }, + "f904cb6a599db50cc635bb70f3c23f056e39914e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xa9ed1d8a969237243d26f8728287cb3eb8730663" + } + }, + "f94e8e9f1511f8cede3bfd8e1be0db35085e8e6d" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x91aaa30b2bf342c6bb6a315251ffe5b7e123bfa4" + } + }, + "f9c7db4a48b918ad6e44d2b55e2339fdcde01d26" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x714213a080e1d2988acadbfc5e441df5173f81bb" + } + }, + "f9d417c0b18ff731a88a17f3b31d9d6ed1e288f1" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x065c627bc67fca3636da49c34994b6efb2adaad1" + } + }, + "fa849bc1ece08222f4bf249ca06a6468b3de5b1a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb4c315d98fa6cbed10c6331e2a5e4688ed0b7f7e" + } + }, + "fa9c2ac45638e511b06ebe051411ebdc2c4c228a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x187dea0407359c9579adbdf1ba9fad4a92fb358c" + } + }, + "fabaccc45975d14c53b830fd4fa0576da541d22e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xae5837876e23fcefa0f204d7b6433966ebb854b4" + } + }, + "fac000880bdfdbd780ffa7c4a1d5d8b4a1d87b03" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x7ab73fe69000d4087d0b9ceedfda0af8c4fe2d2b" + } + }, + "fafa31e9b477adf7a26b651aa9913f8664e536a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2652f49b5ad98503231b3befe7587c231be8a5e9" + } + }, + "fb04fd4e715c760c91ddc0f30b000b52203f66a4" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8692f270fea1b23b492dea1755f48cdd1dd78535" + } + }, + "fb5d7c75f272b07450867579978314661c3e1206" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd2e450aa145ce97dc054b1bcf391407fbf202bd6" + } + }, + "fbdc8132551b0ed5c50b6c0f279097592b5c87ef" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x95f36953203283bc9358f396b627dc79480a8ec9" + } + }, + "fc55e6958f11444ae56c09af726f2ec57525db58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x692a1a4da0b418dd701f5133e2b3c5686015a3e0" + } + }, + "fc70ade160bd76694149f3f439f5d4f78bdc483e" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x50dc3dab5836e25872ec87bb2bb30ab57a35fb0d" + } + }, + "fc86915f4e8884b49adeb6f23a8f69e643d9db7b" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x93beac08e1b6f1ac32c5ee628bc4356feb5e54eb" + } + }, + "fcdb751de1dc7c5246ce698b4b104016d034cfdb" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x769277251b9d3f0906a338f156238b159bc126de" + } + }, + "fcf47e5c1414303d55afc40c75c41cf42079d560" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x2099c5bdda1d98ce3b99988d768fa9f812a21f25" + } + }, + "fd096ec4540dacfebbabf2dd6ffd3493a09cc38f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xd577d44f2748e151afdb1ded254c942ca9933b0c" + } + }, + "fd09bf9b58980d6a5776bb391d8c6881bcca2ae9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x67df3bc5f86456f2bc57f75c99a0389bca7e5851" + } + }, + "fd0dea1a583400fc29051c8192b70022d8d92c48" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xe64dff0ba3f0eb9e054a638d4d5f6f0cb47e1e99" + } + }, + "fd437bf9d51bac3a2757bf4b8bf38045e78d5ada" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x8fb5af158980be77e5d137ab6f9500040704109a" + } + }, + "fd5b134edd8931ca2102693d88070dd49fc13350" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xddb6aeb5e1bb4cdb44ca3a9b979996c529d9fa3d" + } + }, + "fd91b246a065cde3fc10edd6457b9e6c10fb386f" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb15c7770a476be2c77c3bd50d60ea6b2cde3186e" + } + }, + "fdc6c80a86ea555b5de26c3db49a779eea6beb0c" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xf3c5a341248911dda9d694ee74bf997365941dc0" + } + }, + "fe4f48d16a7ec27241b987f3545423291c7cce77" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xc1ff6275aeeeacd2c79dc02f8cd5cdb44a81e6bf" + } + }, + "fe686acb3b7cc09ec6379af828b4b3b638898130" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x31a87a9e67b2728c14767de26753f205b793c5ad" + } + }, + "fe8d768de7a723c23583162dbef207b6dcb4fb58" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x4582048e819b7d55b3c6f47e46ef8dd8fdd12039" + } + }, + "fed73d1755549bd523a775e81cf80a1a507eec50" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xda7555a43e7a3790290cd20a19ec19032e28a6de" + } + }, + "ffb9bfb24fb671413a3aae05e0f21b870eeb2ab9" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3432c3f9f90cb61e79f39d310bdc6cb8dcb3a49b" + } + }, + "ffc4569dfb86db2e584a1138a75747dffb794466" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0x3d64e9c7cee7c3d41cfbeed851fff8642bd0200c" + } + }, + "fff1cd2c481ce0fba0c97ef77c79227d3b67832a" : { + "balance" : "0x00", + "code" : "0x", + "nonce" : "0x01", + "storage" : { + "0x00" : "0xb96982fae6a70aff19c2d99c3b2adc57b151d785" + } + } + }, + "postStateRoot" : "5c22bc6ec2ea240c8170de424002a2b5c93bfd2b3ac1c2cf8cb92cb5f549b17d", + "pre" : { + "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { + "balance" : "0x01312d00", + "code" : "0x602060006000396001602060006000f001600055", + "nonce" : "0x00", + "storage" : { + } + }, + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x", + "nonce" : "0x00", + "storage" : { + } + } + }, + "transaction" : { + "data" : "", + "gasLimit" : "0x3b9aca00", + "gasPrice" : "0x01", + "nonce" : "0x00", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", + "value" : "0x0186a0" + } } } \ No newline at end of file diff --git a/tests/files/StateTests/stSolidityTest.json b/tests/files/StateTests/stSolidityTest.json index 8a2cb1bd55..c64073b5f4 100644 --- a/tests/files/StateTests/stSolidityTest.json +++ b/tests/files/StateTests/stSolidityTest.json @@ -268,42 +268,50 @@ }, "logs" : [ ], - "out" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "out" : "0x0000000000000000000000000000000000000000000000000000000000000001", "post" : { - "0000000000000000000000000000000000000000" : { - "balance" : "0x00", - "code" : "0x", - "nonce" : "0x00", - "storage" : { - } - }, "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x0186a0", - "code" : "0x6000357c0100000000000000000000000000000000000000000000000000000000900480633e0bca3b1461003a578063c04062261461004c57005b610042610099565b8060005260206000f35b61005461005e565b8060005260206000f35b6000610068610099565b600060006101000a81548160ff02191690830217905550600060009054906101000a900460ff169050610096565b90565b60006000600060019250825060018273ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100fd57005b505060005163ffffffff1614156101135761011c565b60009250610194565b60028173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161017457005b505060005163ffffffff16141561018a57610193565b60009250610194565b5b50509056", - "nonce" : "0x00", + "code" : "0x7c010000000000000000000000000000000000000000000000000000000060003504633e0bca3b8114610039578063c0406226146100a857005b6100b55b600160008060456101ec8339604560006000f091508173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161011957005b6100bf60006100c961003d565b8060005260206000f35b8060005260206000f35b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016919091179081905560ff16919050565b505060005163ffffffff166002141561019d575b5b505090565b505060005163ffffffff1660011415610194575b60456101a7600039604560006000f090508073ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100ff57005b60009250610114565b600092506101145600603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", + "nonce" : "0x02", "storage" : { + "0x00" : "0x01" } }, "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : { - "balance" : "0xca69", + "balance" : "0x01f758", "code" : "0x", "nonce" : "0x00", "storage" : { } }, "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "0x02fa2617", + "balance" : "0x02f8f928", "code" : "0x", "nonce" : "0x01", "storage" : { } + }, + "b88de88b35ecbf3c141e3caae2baf35834d18f63" : { + "balance" : "0x00", + "code" : "0x7c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3", + "nonce" : "0x00", + "storage" : { + } + }, + "d2571607e241ecf590ed94b12d87c94babe36db6" : { + "balance" : "0x00", + "code" : "0x7c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", + "nonce" : "0x00", + "storage" : { + } } }, - "postStateRoot" : "ed06b00015d227623175bd12a5d960281781493ea1d9fed79d6c40a20e2c6ef7", + "postStateRoot" : "e7f84d674881d1cfd115be59e3e390271435c0b3474a482f7add54c3fe429d85", "pre" : { "095e7baea6a6c7c4c2dfeb977efac326af552d87" : { "balance" : "0x0186a0", - "code" : "0x6000357c0100000000000000000000000000000000000000000000000000000000900480633e0bca3b1461003a578063c04062261461004c57005b610042610099565b8060005260206000f35b61005461005e565b8060005260206000f35b6000610068610099565b600060006101000a81548160ff02191690830217905550600060009054906101000a900460ff169050610096565b90565b60006000600060019250825060018273ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100fd57005b505060005163ffffffff1614156101135761011c565b60009250610194565b60028173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161017457005b505060005163ffffffff16141561018a57610193565b60009250610194565b5b50509056", + "code" : "0x7c010000000000000000000000000000000000000000000000000000000060003504633e0bca3b8114610039578063c0406226146100a857005b6100b55b600160008060456101ec8339604560006000f091508173ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f161011957005b6100bf60006100c961003d565b8060005260206000f35b8060005260206000f35b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016919091179081905560ff16919050565b505060005163ffffffff166002141561019d575b5b505090565b505060005163ffffffff1660011415610194575b60456101a7600039604560006000f090508073ffffffffffffffffffffffffffffffffffffffff166381bda09b60206000827c010000000000000000000000000000000000000000000000000000000002600052600460006000866161da5a03f16100ff57005b60009250610114565b600092506101145600603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60026000818152602090f3603980600c6000396000f3007c0100000000000000000000000000000000000000000000000000000000600035046381bda09b8114602d57005b60016000818152602090f3", "nonce" : "0x00", "storage" : { } diff --git a/tests/files/VMTests/vmArithmeticTest.json b/tests/files/VMTests/vmArithmeticTest.json index 7c82c9d4d4..88d3c1e5b2 100644 --- a/tests/files/VMTests/vmArithmeticTest.json +++ b/tests/files/VMTests/vmArithmeticTest.json @@ -356,6 +356,8 @@ } }, "addmod1_overflow3" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -369,11 +371,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056001600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef406", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056001600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -385,6 +401,8 @@ } }, "addmod1_overflow4" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -398,11 +416,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056002600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef406", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056002600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x02" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -414,6 +446,8 @@ } }, "addmod1_overflowDiff" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -427,11 +461,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x60056002600003600160000308600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef400", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60056002600003600160000308600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x04" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -842,6 +890,51 @@ } } }, + "addmodDivByZero3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60016000600060000803600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000600060000803600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000600060000803600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "arith1" : { "callcreates" : [ ], @@ -1152,6 +1245,51 @@ } } }, + "divByZero_2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60076000600d0401600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60076000600d0401600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x07" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60076000600d0401600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "exp0" : { "callcreates" : [ ], @@ -5498,6 +5636,51 @@ } } }, + "modByZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x6001600060030603600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600060030603600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x6001600060030603600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "mul0" : { "callcreates" : [ ], @@ -6017,6 +6200,8 @@ } }, "mulmod1_overflow2" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6030,11 +6215,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000009600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000009600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6046,6 +6245,8 @@ } }, "mulmod1_overflow3" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6059,11 +6260,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff09600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff09600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x04" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6075,6 +6290,8 @@ } }, "mulmod1_overflow4" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -6088,11 +6305,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000109600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0f4240", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x0ef40c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600560027f800000000000000000000000000000000000000000000000000000000000000109600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x03" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -6502,6 +6733,51 @@ } } }, + "mulmoddivByZero3" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60006000600009600103600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60006000600009600103600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60006000600009600103600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "not1" : { "callcreates" : [ ], @@ -7081,6 +7357,51 @@ } } }, + "sdivByZero2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf923bdff6000030501600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "sdiv_dejavu" : { "callcreates" : [ ], @@ -8109,6 +8430,8 @@ } }, "smod6" : { + "callcreates" : [ + ], "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "0x0100", @@ -8122,11 +8445,25 @@ "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000307600055", "data" : "0x", - "gas" : "0x2710", + "gas" : "0x0186a0", "gasPrice" : "0x5af3107a4000", "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", "value" : "0x0de0b6b3a7640000" }, + "gas" : "0x01386c", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60000307600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0x01" + } + } + }, "pre" : { "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { "balance" : "0x0de0b6b3a7640000", @@ -8181,6 +8518,140 @@ } } }, + "smod8_byZero" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600d600060c86000030703600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013866", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600d600060c86000030703600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600d600060c86000030703600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "smod_i256min1" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x0172fe", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "nonce" : "0x00", + "storage" : { + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x60016000037f800000000000000000000000000000000000000000000000000000000000000060000307600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, + "smod_i256min2" : { + "callcreates" : [ + ], + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "0x0100", + "currentGasLimit" : "0x0f4240", + "currentNumber" : "0x00", + "currentTimestamp" : "0x01", + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "exec" : { + "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", + "caller" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "data" : "0x", + "gas" : "0x0186a0", + "gasPrice" : "0x5af3107a4000", + "origin" : "cd1722f2947def4cf144679da39c4c32bdc35681", + "value" : "0x0de0b6b3a7640000" + }, + "gas" : "0x013860", + "logs" : [ + ], + "out" : "0x", + "post" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "nonce" : "0x00", + "storage" : { + "0x00" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + } + }, + "pre" : { + "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { + "balance" : "0x0de0b6b3a7640000", + "code" : "0x600160016000037f80000000000000000000000000000000000000000000000000000000000000006000030703600055", + "nonce" : "0x00", + "storage" : { + } + } + } + }, "stop" : { "callcreates" : [ ], From c67424ecc8a75d7c0bc942227a4c4e5c5628d7bc Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 17 May 2015 01:42:30 +0200 Subject: [PATCH 08/59] core: parallelise nonce checking when processing blocks ChainManager now uses a parallel approach to block processing where all nonces are checked seperatly from the block processing process. This speeds up the process by about 3 times on my i7 --- cmd/utils/flags.go | 2 +- core/block_processor.go | 14 ++++--- core/chain_manager.go | 89 ++++++++++++++++++++++++++++++++++++++--- eth/backend.go | 4 +- 4 files changed, 94 insertions(+), 15 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 6ec4fdc552..f646e4fccd 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -336,8 +336,8 @@ func GetChain(ctx *cli.Context) (*core.ChainManager, common.Database, common.Dat } eventMux := new(event.TypeMux) - chainManager := core.NewChainManager(blockDb, stateDb, eventMux) pow := ethash.New() + chainManager := core.NewChainManager(blockDb, stateDb, pow, eventMux) txPool := core.NewTxPool(eventMux, chainManager.State, chainManager.GasLimit) blockProcessor := core.NewBlockProcessor(stateDb, extraDb, pow, txPool, chainManager, eventMux) chainManager.SetProcessor(blockProcessor) diff --git a/core/block_processor.go b/core/block_processor.go index cae618b390..a021086c0f 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -189,7 +189,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st state := state.New(parent.Root(), sm.db) // Block validation - if err = sm.ValidateHeader(block.Header(), parent.Header()); err != nil { + if err = sm.ValidateHeader(block.Header(), parent.Header(), false); err != nil { return } @@ -269,7 +269,7 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st // Validates the current block. Returns an error if the block was invalid, // an uncle or anything that isn't on the current block chain. // Validation validates easy over difficult (dagger takes longer time = difficult) -func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error { +func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header, checkPow bool) error { if big.NewInt(int64(len(block.Extra))).Cmp(params.MaximumExtraDataSize) == 1 { return fmt.Errorf("Block extra data too long (%d)", len(block.Extra)) } @@ -300,9 +300,11 @@ func (sm *BlockProcessor) ValidateHeader(block, parent *types.Header) error { return BlockEqualTSErr //ValidationError("Block timestamp equal or less than previous block (%v - %v)", block.Time, parent.Time) } - // Verify the nonce of the block. Return an error if it's not valid - if !sm.Pow.Verify(types.NewBlockWithHeader(block)) { - return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + if checkPow { + // Verify the nonce of the block. Return an error if it's not valid + if !sm.Pow.Verify(types.NewBlockWithHeader(block)) { + return ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + } } return nil @@ -358,7 +360,7 @@ func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *ty return UncleError("uncle[%d](%x)'s parent unknown (%x)", i, hash[:4], uncle.ParentHash[0:4]) } - if err := sm.ValidateHeader(uncle, ancestorHeaders[uncle.ParentHash]); err != nil { + if err := sm.ValidateHeader(uncle, ancestorHeaders[uncle.ParentHash], true); err != nil { return ValidationError(fmt.Sprintf("uncle[%d](%x) header invalid: %v", i, hash[:4], err)) } } diff --git a/core/chain_manager.go b/core/chain_manager.go index 62e518ca0d..355e203c74 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math/big" + "runtime" "sync" "time" @@ -15,6 +16,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" ) @@ -100,9 +102,11 @@ type ChainManager struct { quit chan struct{} wg sync.WaitGroup + + pow pow.PoW } -func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *ChainManager { +func NewChainManager(blockDb, stateDb common.Database, pow pow.PoW, mux *event.TypeMux) *ChainManager { bc := &ChainManager{ blockDb: blockDb, stateDb: stateDb, @@ -110,6 +114,7 @@ func NewChainManager(blockDb, stateDb common.Database, mux *event.TypeMux) *Chai eventMux: mux, quit: make(chan struct{}), cache: NewBlockCache(blockCacheLimit), + pow: pow, } bc.setLastState() @@ -529,10 +534,19 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { stats struct{ queued, processed, ignored int } tstart = time.Now() ) + + // check the nonce in parallel to the block processing + // this speeds catching up significantly + nonceErrCh := make(chan error) + go func() { + nonceErrCh <- verifyNonces(self.pow, chain) + }() + for i, block := range chain { if block == nil { continue } + // Setting block.Td regardless of error (known for example) prevents errors down the line // in the protocol handler block.Td = new(big.Int).Set(CalcTD(block, self.GetBlock(block.ParentHash()))) @@ -562,11 +576,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { continue } - h := block.Header() - - glog.V(logger.Error).Infof("INVALID block #%v (%x)\n", h.Number, h.Hash().Bytes()) - glog.V(logger.Error).Infoln(err) - glog.V(logger.Debug).Infoln(block) + blockErr(block, err) return i, err } @@ -620,6 +630,13 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) { } + // check and wait for the nonce error channel and + // make sure no nonce error was thrown in the process + err := <-nonceErrCh + if err != nil { + return 0, err + } + if (stats.queued > 0 || stats.processed > 0 || stats.ignored > 0) && bool(glog.V(logger.Info)) { tend := time.Since(tstart) start, end := chain[0], chain[len(chain)-1] @@ -718,3 +735,63 @@ out: } } } + +func blockErr(block *types.Block, err error) { + h := block.Header() + glog.V(logger.Error).Infof("INVALID block #%v (%x)\n", h.Number, h.Hash().Bytes()) + glog.V(logger.Error).Infoln(err) + glog.V(logger.Debug).Infoln(block) +} + +// verifyNonces verifies nonces of the given blocks in parallel and returns +// an error if one of the blocks nonce verifications failed. +func verifyNonces(pow pow.PoW, blocks []*types.Block) error { + // Spawn a few workers. They listen for blocks on the in channel + // and send results on done. The workers will exit in the + // background when in is closed. + var ( + in = make(chan *types.Block) + done = make(chan error, runtime.GOMAXPROCS(0)) + ) + defer close(in) + for i := 0; i < cap(done); i++ { + go verifyNonce(pow, in, done) + } + // Feed blocks to the workers, aborting at the first invalid nonce. + var ( + running, i int + block *types.Block + sendin = in + ) + for i < len(blocks) || running > 0 { + if i == len(blocks) { + // Disable sending to in. + sendin = nil + } else { + block = blocks[i] + i++ + } + select { + case sendin <- block: + running++ + case err := <-done: + running-- + if err != nil { + return err + } + } + } + return nil +} + +// verifyNonce is a worker for the verifyNonces method. It will run until +// in is closed. +func verifyNonce(pow pow.PoW, in <-chan *types.Block, done chan<- error) { + for block := range in { + if !pow.Verify(block) { + done <- ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + } else { + done <- nil + } + } +} diff --git a/eth/backend.go b/eth/backend.go index a7107f8d8e..519a4c4108 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -266,9 +266,9 @@ func New(config *Config) (*Ethereum, error) { MinerThreads: config.MinerThreads, } - eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.EventMux()) - eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock) eth.pow = ethash.New() + eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.pow, eth.EventMux()) + eth.downloader = downloader.New(eth.EventMux(), eth.chainManager.HasBlock, eth.chainManager.GetBlock) eth.txPool = core.NewTxPool(eth.EventMux(), eth.chainManager.State, eth.chainManager.GasLimit) eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.txPool, eth.chainManager, eth.EventMux()) eth.chainManager.SetProcessor(eth.blockProcessor) From 7778740315f322a9a31219090f180374a5620ec0 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Mon, 18 May 2015 15:13:58 +0200 Subject: [PATCH 09/59] fixed race condition in miner --- miner/agent.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/miner/agent.go b/miner/agent.go index da2a2008df..b4c776c657 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -40,7 +40,6 @@ func (self *CpuAgent) Stop() { defer self.mu.Unlock() close(self.quit) - close(self.quitCurrentOp) } func (self *CpuAgent) Start() { @@ -50,7 +49,6 @@ func (self *CpuAgent) Start() { self.quit = make(chan struct{}) // creating current op ch makes sure we're not closing a nil ch // later on - self.quitCurrentOp = make(chan struct{}) self.workCh = make(chan *types.Block, 1) go self.update() @@ -62,10 +60,12 @@ out: select { case block := <-self.workCh: self.mu.Lock() - close(self.quitCurrentOp) + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + } + self.quitCurrentOp = make(chan struct{}) + go self.mine(block, self.quitCurrentOp) self.mu.Unlock() - - go self.mine(block) case <-self.quit: break out } @@ -84,16 +84,11 @@ done: } } -func (self *CpuAgent) mine(block *types.Block) { +func (self *CpuAgent) mine(block *types.Block, stop <- chan struct{}) { glog.V(logger.Debug).Infof("(re)started agent[%d]. mining...\n", self.index) - // Reset the channel - self.mu.Lock() - self.quitCurrentOp = make(chan struct{}) - self.mu.Unlock() - // Mine - nonce, mixDigest := self.pow.Search(block, self.quitCurrentOp) + nonce, mixDigest := self.pow.Search(block, stop) if nonce != 0 { block.SetNonce(nonce) block.Header().MixDigest = common.BytesToHash(mixDigest) From 60561cdca26b84843ddb4d96158c6ca7d8c32ec1 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Mon, 18 May 2015 16:09:01 +0200 Subject: [PATCH 10/59] fixed issue when miner is not stopping af stop command --- miner/agent.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/miner/agent.go b/miner/agent.go index b4c776c657..3ed3ba839e 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -67,6 +67,12 @@ out: go self.mine(block, self.quitCurrentOp) self.mu.Unlock() case <-self.quit: + self.mu.Lock() + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + self.quitCurrentOp = nil + } + self.mu.Unlock() break out } } From d381d9a74cc2cb4e8cebf21aa9e4927a6e1867d6 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 09:16:10 -0500 Subject: [PATCH 11/59] Return nil for certain fields on eth_getBlockByNumber pending --- rpc/api.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rpc/api.go b/rpc/api.go index b59253ef73..47409b4aff 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -231,6 +231,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err block := api.xeth().EthBlockByNumber(args.BlockNumber) br := NewBlockRes(block, args.IncludeTxs) + if args.BlockNumber == -2 { + br.BlockHash = nil + br.BlockNumber = nil + br.Miner = nil + br.Nonce = nil + br.LogsBloom = nil + } *reply = br case "eth_getTransactionByHash": args := new(HashArgs) From 1d51cada3cd27e2de956cc7e326c6dd8455d8391 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 18 May 2015 16:23:20 +0200 Subject: [PATCH 12/59] Handle call depth exception for CREATE --- core/execution.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/execution.go b/core/execution.go index 9adf98032e..522c904493 100644 --- a/core/execution.go +++ b/core/execution.go @@ -38,6 +38,12 @@ func (self *Execution) Create(caller vm.ContextRef) (ret []byte, err error, acco code := self.input self.input = nil ret, err = self.exec(nil, code, caller) + // Here we get an error if we run into maximum stack depth, + // See: https://github.com/ethereum/yellowpaper/pull/131 + // and YP definitions for CREATE instruction + if err != nil { + return nil, err, nil + } account = self.env.State().GetStateObject(*self.address) return } From 6a72cd45e20ad220f27d9ead3120e98020802022 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 18 May 2015 16:28:54 +0200 Subject: [PATCH 13/59] Add wrapper for BlockTests/bcWalletTest.json --- tests/block_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/block_test.go b/tests/block_test.go index 0ba0aefa21..d17cab4779 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -48,6 +48,10 @@ func TestBcTotalDifficulty(t *testing.T) { runBlockTestsInFile("files/BlockTests/bcTotalDifficultyTest.json", []string{}, t) } +func TestBcWallet(t *testing.T) { + runBlockTestsInFile("files/BlockTests/bcWalletTest.json", []string{}, t) +} + func runBlockTestsInFile(filepath string, snafus []string, t *testing.T) { bt, err := LoadBlockTests(filepath) if err != nil { From a528bd04db4adc8de707f8b5a3a7b2cef52a2fbc Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:09:00 -0500 Subject: [PATCH 14/59] Return nil for certain fields on eth_getTransactionByHash when not part of a block --- rpc/api.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/rpc/api.go b/rpc/api.go index 47409b4aff..495f078355 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -1,6 +1,7 @@ package rpc import ( + "bytes" "encoding/json" "math/big" // "sync" @@ -247,9 +248,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err tx, bhash, bnum, txi := api.xeth().EthTransactionByHash(args.Hash) if tx != nil { v := NewTransactionRes(tx) - v.BlockHash = newHexData(bhash) - v.BlockNumber = newHexNum(bnum) - v.TxIndex = newHexNum(txi) + // if the blockhash is 0, assume this is a pending transaction + if bytes.Compare(bhash.Bytes(), []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) != 0 { + v.BlockHash = newHexData(bhash) + v.BlockNumber = newHexNum(bnum) + v.TxIndex = newHexNum(txi) + } *reply = v } case "eth_getTransactionByBlockHashAndIndex": From 62d76b8e1f0ebfe213c50006bec7dc1b5473029a Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:11:27 -0500 Subject: [PATCH 15/59] Cleanup --- rpc/api.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rpc/api.go b/rpc/api.go index 495f078355..b2566cfc5d 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/json" "math/big" - // "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" @@ -231,7 +230,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err block := api.xeth().EthBlockByNumber(args.BlockNumber) br := NewBlockRes(block, args.IncludeTxs) - if args.BlockNumber == -2 { br.BlockHash = nil br.BlockNumber = nil @@ -588,7 +586,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return NewNotImplementedError(req.Method) } - glog.V(logger.Detail).Infof("Reply: %T %s\n", reply, reply) + // glog.V(logger.Detail).Infof("Reply: %v\n", reply) return nil } From a2598e649de8b41727084749527aa0bc27965856 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:31:03 -0500 Subject: [PATCH 16/59] Permit multiple CORS domains Separated by spaces --- rpc/http.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpc/http.go b/rpc/http.go index 9b3fa51426..f37e102f5d 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -6,6 +6,7 @@ import ( "io" "io/ioutil" "net/http" + "strings" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -39,7 +40,7 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { if len(config.CorsDomain) > 0 { var opts cors.Options opts.AllowedMethods = []string{"POST"} - opts.AllowedOrigins = []string{config.CorsDomain} + opts.AllowedOrigins = strings.Split(config.CorsDomain, " ") c := cors.New(opts) handler = newStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) From 54b5c8273db33ebc2bee762b92fa4a6c24e6ad94 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:41:56 -0500 Subject: [PATCH 17/59] XEth comment clarification --- xeth/xeth.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/xeth/xeth.go b/xeth/xeth.go index 88cd30afce..2d01bc6812 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -304,6 +304,8 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block { } func (self *XEth) EthTransactionByHash(hash string) (tx *types.Transaction, blhash common.Hash, blnum *big.Int, txi uint64) { + // Due to increasing return params and need to determine if this is from transaction pool or + // some chain, this probably needs to be refactored for more expressiveness data, _ := self.backend.ExtraDb().Get(common.FromHex(hash)) if len(data) != 0 { tx = types.NewTransactionFromBytes(data) @@ -357,7 +359,7 @@ func (self *XEth) Block(v interface{}) *Block { return self.BlockByNumber(int64(n)) } else if str, ok := v.(string); ok { return self.BlockByHash(str) - } else if f, ok := v.(float64); ok { // Don't ask ... + } else if f, ok := v.(float64); ok { // JSON numbers are represented as float64 return self.BlockByNumber(int64(f)) } @@ -778,7 +780,7 @@ func (self *XEth) PushTx(encodedTx string) (string, error) { } func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, string, error) { - statedb := self.State().State().Copy() //self.eth.ChainManager().TransState() + statedb := self.State().State().Copy() var from *state.StateObject if len(fromStr) == 0 { accounts, err := self.backend.AccountManager().Accounts() @@ -869,6 +871,7 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS contractCreation bool ) + // 2015-05-18 Is this still needed? // TODO if no_private_key then //if _, exists := p.register[args.From]; exists { // p.register[args.From] = append(p.register[args.From], args) From fe41bd6fe854248d9937ba24e58baeaf672cf94e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 10:54:15 -0500 Subject: [PATCH 18/59] Add "removedb" command to Geth Removes the state and blockchain databases --- cmd/geth/main.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b0970212ec..b103477816 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -230,6 +230,11 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso Name: "upgradedb", Usage: "upgrade chainblock database", }, + { + Action: removeDb, + Name: "removedb", + Usage: "Remove blockchain and state databases", + }, } app.Flags = []cli.Flag{ utils.IdentityFlag, @@ -543,6 +548,16 @@ func exportchain(ctx *cli.Context) { return } +func removeDb(ctx *cli.Context) { + fmt.Println("Removing chain and state databases...") + start := time.Now() + + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + + fmt.Printf("Removed in %v\n", time.Since(start)) +} + func upgradeDb(ctx *cli.Context) { fmt.Println("Upgrade blockchain DB") From bc5e60cd632b7ee38eb0ea9dcd80e1ca9a4ba4af Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 17 May 2015 17:51:34 +0200 Subject: [PATCH 19/59] miner: stale block notification --- miner/worker.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/miner/worker.go b/miner/worker.go index d5f9dd8c55..5fa5d3777e 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -224,7 +224,13 @@ func (self *worker) wait() { } self.mux.Post(core.NewMinedBlockEvent{block}) - glog.V(logger.Info).Infof("🔨 Mined block #%v", block.Number()) + var stale string + canonBlock := self.chain.GetBlockByNumber(block.NumberU64()) + if canonBlock != nil && canonBlock.Hash() != block.Hash() { + stale = "stale-" + } + + glog.V(logger.Info).Infof("🔨 Mined %sblock #%v (%x)", stale, block.Number(), block.Hash().Bytes()[:4]) jsonlogger.LogJson(&logger.EthMinerNewBlock{ BlockHash: block.Hash().Hex(), From 59c0d014189db1b85f45ef17f458bcbc20c267b2 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 16:04:10 +0200 Subject: [PATCH 20/59] core: chain manager no longer exports genesis block --- cmd/geth/js_test.go | 2 ++ core/chain_manager.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index e02e8f7047..6368efbfcc 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -172,6 +172,8 @@ func TestBlockChain(t *testing.T) { tmpfile := filepath.Join(extmp, "export.chain") tmpfileq := strconv.Quote(tmpfile) + ethereum.ChainManager().Reset() + checkEvalJSON(t, repl, `admin.export(`+tmpfileq+`)`, `true`) if _, err := os.Stat(tmpfile); err != nil { t.Fatal(err) diff --git a/core/chain_manager.go b/core/chain_manager.go index 355e203c74..7dff7dffd5 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -348,7 +348,7 @@ func (self *ChainManager) Export(w io.Writer) error { last := self.currentBlock.NumberU64() - for nr := uint64(0); nr <= last; nr++ { + for nr := uint64(1); nr <= last; nr++ { block := self.GetBlockByNumber(nr) if block == nil { return fmt.Errorf("export failed on #%d: not found", nr) @@ -789,7 +789,7 @@ func verifyNonces(pow pow.PoW, blocks []*types.Block) error { func verifyNonce(pow pow.PoW, in <-chan *types.Block, done chan<- error) { for block := range in { if !pow.Verify(block) { - done <- ValidationError("Block's nonce is invalid (= %x)", block.Nonce) + done <- ValidationError("Block(#%v) nonce is invalid (= %x)", block.Number(), block.Nonce) } else { done <- nil } From 40717465bc8c0e2feb0f1e48ddc721c7292ba992 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 17:46:47 +0200 Subject: [PATCH 21/59] core: fixed tests --- core/block_processor_test.go | 6 +++--- core/chain_makers.go | 2 +- core/chain_manager_test.go | 15 +++++++++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/block_processor_test.go b/core/block_processor_test.go index 02524a4c15..e0aa5fb4c4 100644 --- a/core/block_processor_test.go +++ b/core/block_processor_test.go @@ -14,7 +14,7 @@ func proc() (*BlockProcessor, *ChainManager) { db, _ := ethdb.NewMemDatabase() var mux event.TypeMux - chainMan := NewChainManager(db, db, &mux) + chainMan := NewChainManager(db, db, thePow(), &mux) return NewBlockProcessor(db, db, ezp.New(), nil, chainMan, &mux), chainMan } @@ -24,13 +24,13 @@ func TestNumber(t *testing.T) { block1.Header().Number = big.NewInt(3) block1.Header().Time-- - err := bp.ValidateHeader(block1.Header(), chain.Genesis().Header()) + err := bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false) if err != BlockNumberErr { t.Errorf("expected block number error %v", err) } block1 = chain.NewBlock(common.Address{}) - err = bp.ValidateHeader(block1.Header(), chain.Genesis().Header()) + err = bp.ValidateHeader(block1.Header(), chain.Genesis().Header(), false) if err == BlockNumberErr { t.Errorf("didn't expect block number error") } diff --git a/core/chain_makers.go b/core/chain_makers.go index acf7b39cc5..44f17cc335 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -109,7 +109,7 @@ func makeChain(bman *BlockProcessor, parent *types.Block, max int, db common.Dat // Effectively a fork factory func newChainManager(block *types.Block, eventMux *event.TypeMux, db common.Database) *ChainManager { genesis := GenesisBlock(db) - bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux} + bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: eventMux, pow: FakePow{}} bc.txState = state.ManageState(state.New(genesis.Root(), db)) bc.futureBlocks = NewBlockCache(1000) if block == nil { diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index b5155e223d..56bef24f32 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -9,11 +9,13 @@ import ( "strconv" "testing" + "github.com/ethereum/ethash" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" ) @@ -21,6 +23,11 @@ func init() { runtime.GOMAXPROCS(runtime.NumCPU()) } +func thePow() pow.PoW { + pow, _ := ethash.NewForTesting() + return pow +} + // Test fork of length N starting from block i func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big.Int)) { // switch databases to process the new chain @@ -259,7 +266,7 @@ func TestChainInsertions(t *testing.T) { } var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) txPool := NewTxPool(&eventMux, chainMan.State, func() *big.Int { return big.NewInt(100000000) }) blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) @@ -305,7 +312,7 @@ func TestChainMultipleInsertions(t *testing.T) { } } var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) txPool := NewTxPool(&eventMux, chainMan.State, func() *big.Int { return big.NewInt(100000000) }) blockMan := NewBlockProcessor(db, db, nil, txPool, chainMan, &eventMux) chainMan.SetProcessor(blockMan) @@ -334,7 +341,7 @@ func TestGetAncestors(t *testing.T) { db, _ := ethdb.NewMemDatabase() var eventMux event.TypeMux - chainMan := NewChainManager(db, db, &eventMux) + chainMan := NewChainManager(db, db, thePow(), &eventMux) chain, err := loadChain("valid1", t) if err != nil { fmt.Println(err) @@ -372,7 +379,7 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block func chm(genesis *types.Block, db common.Database) *ChainManager { var eventMux event.TypeMux - bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux} + bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux, pow: FakePow{}} bc.cache = NewBlockCache(100) bc.futureBlocks = NewBlockCache(100) bc.processor = bproc{} From 36a4ba32485fb6605ea23f03896ae8d7c4cc44ae Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:04:35 -0500 Subject: [PATCH 22/59] Add user confirmation for removedb --- cmd/geth/main.go | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index b103477816..7db175eb92 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -549,13 +549,22 @@ func exportchain(ctx *cli.Context) { } func removeDb(ctx *cli.Context) { - fmt.Println("Removing chain and state databases...") - start := time.Now() + confirm, err := readConfirm("Remove local databases?") + if err != nil { + utils.Fatalf("%v", err) + } - os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) - os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + if confirm { + fmt.Println("Removing chain and state databases...") + start := time.Now() - fmt.Printf("Removed in %v\n", time.Since(start)) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "blockchain")) + os.RemoveAll(filepath.Join(ctx.GlobalString(utils.DataDirFlag.Name), "state")) + + fmt.Printf("Removed in %v\n", time.Since(start)) + } else { + fmt.Println("Operation aborted") + } } func upgradeDb(ctx *cli.Context) { @@ -682,6 +691,32 @@ func hashish(x string) bool { return err != nil } +func readConfirm(prompt string) (bool, error) { + var ( + input string + err error + ) + prompt = prompt + " [y/N] " + + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + input, err = lr.Prompt(prompt) + } else { + fmt.Print(prompt) + input, err = bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + } + + if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { + return true, nil + } else { + return false, nil + } + + return false, err +} + func readPassword(prompt string, warnTerm bool) (string, error) { if liner.TerminalSupported() { lr := liner.NewLiner() From f14feea43683fee58e26a48a51145e72d3ae7ad8 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:24:30 -0500 Subject: [PATCH 23/59] Refactor user prompts into utils --- cmd/geth/admin.go | 6 +++--- cmd/geth/main.go | 49 +++-------------------------------------------- cmd/utils/cmd.go | 44 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 49 deletions(-) diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index ebdf3512a9..53dd0e6ad8 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -383,7 +383,7 @@ func (js *jsre) unlock(call otto.FunctionCall) otto.Value { var passphrase string if arg.IsUndefined() { fmt.Println("Please enter a passphrase now.") - passphrase, err = readPassword("Passphrase: ", true) + passphrase, err = utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() @@ -410,12 +410,12 @@ func (js *jsre) newAccount(call otto.FunctionCall) otto.Value { if arg.IsUndefined() { fmt.Println("The new account will be encrypted with a passphrase.") fmt.Println("Please enter a passphrase now.") - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { fmt.Println(err) return otto.FalseValue() } - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { fmt.Println(err) return otto.FalseValue() diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 7db175eb92..df0af3e79c 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -21,7 +21,6 @@ package main import ( - "bufio" "fmt" "io" "io/ioutil" @@ -44,7 +43,6 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/mattn/go-colorable" "github.com/mattn/go-isatty" - "github.com/peterh/liner" ) import _ "net/http/pprof" @@ -426,12 +424,12 @@ func getPassPhrase(ctx *cli.Context, desc string, confirmation bool) (passphrase passfile := ctx.GlobalString(utils.PasswordFileFlag.Name) if len(passfile) == 0 { fmt.Println(desc) - auth, err := readPassword("Passphrase: ", true) + auth, err := utils.PromptPassword("Passphrase: ", true) if err != nil { utils.Fatalf("%v", err) } if confirmation { - confirm, err := readPassword("Repeat Passphrase: ", false) + confirm, err := utils.PromptPassword("Repeat Passphrase: ", false) if err != nil { utils.Fatalf("%v", err) } @@ -549,7 +547,7 @@ func exportchain(ctx *cli.Context) { } func removeDb(ctx *cli.Context) { - confirm, err := readConfirm("Remove local databases?") + confirm, err := utils.PromptConfirm("Remove local databases?") if err != nil { utils.Fatalf("%v", err) } @@ -690,44 +688,3 @@ func hashish(x string) bool { _, err := strconv.Atoi(x) return err != nil } - -func readConfirm(prompt string) (bool, error) { - var ( - input string - err error - ) - prompt = prompt + " [y/N] " - - if liner.TerminalSupported() { - lr := liner.NewLiner() - defer lr.Close() - input, err = lr.Prompt(prompt) - } else { - fmt.Print(prompt) - input, err = bufio.NewReader(os.Stdin).ReadString('\n') - fmt.Println() - } - - if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { - return true, nil - } else { - return false, nil - } - - return false, err -} - -func readPassword(prompt string, warnTerm bool) (string, error) { - if liner.TerminalSupported() { - lr := liner.NewLiner() - defer lr.Close() - return lr.PasswordPrompt(prompt) - } - if warnTerm { - fmt.Println("!! Unsupported terminal, password will be echoed.") - } - fmt.Print(prompt) - input, err := bufio.NewReader(os.Stdin).ReadString('\n') - fmt.Println() - return input, err -} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index fb55a64af6..62d3500666 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -22,11 +22,13 @@ package utils import ( + "bufio" "fmt" "io" "os" "os/signal" "regexp" + "strings" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -35,6 +37,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/rlp" + "github.com/peterh/liner" ) var interruptCallbacks = []func(os.Signal){} @@ -85,6 +88,47 @@ func confirm(message string) bool { return r == "y" } +func PromptConfirm(prompt string) (bool, error) { + var ( + input string + err error + ) + prompt = prompt + " [y/N] " + + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + input, err = lr.Prompt(prompt) + } else { + fmt.Print(prompt) + input, err = bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + } + + if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { + return true, nil + } else { + return false, nil + } + + return false, err +} + +func PromptPassword(prompt string, warnTerm bool) (string, error) { + if liner.TerminalSupported() { + lr := liner.NewLiner() + defer lr.Close() + return lr.PasswordPrompt(prompt) + } + if warnTerm { + fmt.Println("!! Unsupported terminal, password will be echoed.") + } + fmt.Print(prompt) + input, err := bufio.NewReader(os.Stdin).ReadString('\n') + fmt.Println() + return input, err +} + func initDataDir(Datadir string) { _, err := os.Stat(Datadir) if err != nil { From 0864f1fc8e281bdfd87daaa24881f9f96d6bd10c Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 18 May 2015 12:25:33 -0500 Subject: [PATCH 24/59] Remove unused confirm() method --- cmd/utils/cmd.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 62d3500666..39b4e46da2 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -74,20 +74,6 @@ func openLogFile(Datadir string, filename string) *os.File { return file } -func confirm(message string) bool { - fmt.Println(message, "Are you sure? (y/n)") - var r string - fmt.Scanln(&r) - for ; ; fmt.Scanln(&r) { - if r == "n" || r == "y" { - break - } else { - fmt.Printf("Yes or no? (%s)", r) - } - } - return r == "y" -} - func PromptConfirm(prompt string) (bool, error) { var ( input string From 5422fe51256e45c42939d1bfbcf13e07d2660f8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 18 May 2015 21:33:37 +0300 Subject: [PATCH 25/59] eth: make the peer set thread safe --- eth/handler.go | 65 +++++++++---------------- eth/peer.go | 129 +++++++++++++++++++++++++++++++++++++++++++++---- eth/sync.go | 36 +++++++------- 3 files changed, 162 insertions(+), 68 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index b2d7412953..835097d843 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -47,9 +47,7 @@ type ProtocolManager struct { txpool txPool chainman *core.ChainManager downloader *downloader.Downloader - - pmu sync.Mutex - peers map[string]*peer + peers *peerSet SubProtocol p2p.Protocol @@ -73,7 +71,7 @@ func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpo txpool: txpool, chainman: chainman, downloader: downloader, - peers: make(map[string]*peer), + peers: newPeerSet(), newPeerCh: make(chan *peer, 1), quitSync: make(chan struct{}), } @@ -95,10 +93,14 @@ func NewProtocolManager(protocolVersion, networkId int, mux *event.TypeMux, txpo } func (pm *ProtocolManager) removePeer(peer *peer) { - pm.pmu.Lock() - defer pm.pmu.Unlock() + // Unregister the peer from the downloader pm.downloader.UnregisterPeer(peer.id) - delete(pm.peers, peer.id) + + // Remove the peer from the Ethereum peer set too + glog.V(logger.Detail).Infoln("Removing peer", peer.id) + if err := pm.peers.Unregister(peer.id); err != nil { + glog.V(logger.Error).Infoln("Removal failed:", err) + } } func (pm *ProtocolManager) Start() { @@ -136,31 +138,32 @@ func (pm *ProtocolManager) newPeer(pv, nv int, p *p2p.Peer, rw p2p.MsgReadWriter } func (pm *ProtocolManager) handle(p *peer) error { + // Execute the Ethereum handshake, short circuit if fails if err := p.handleStatus(); err != nil { return err } - pm.pmu.Lock() - pm.peers[p.id] = p - pm.pmu.Unlock() - - pm.downloader.RegisterPeer(p.id, p.recentHash, p.requestHashes, p.requestBlocks) - defer func() { - pm.removePeer(p) - }() + // Register the peer locally and in the downloader too + glog.V(logger.Detail).Infoln("Adding peer", p.id) + if err := pm.peers.Register(p); err != nil { + glog.V(logger.Error).Infoln("Addition failed:", err) + return err + } + defer pm.removePeer(p) + if err := pm.downloader.RegisterPeer(p.id, p.recentHash, p.requestHashes, p.requestBlocks); err != nil { + return err + } // propagate existing transactions. new transactions appearing // after this will be sent via broadcasts. if err := p.sendTransactions(pm.txpool.GetTransactions()); err != nil { return err } - // main loop. handle incoming messages. for { if err := pm.handleMsg(p); err != nil { return err } } - return nil } @@ -346,18 +349,8 @@ func (pm *ProtocolManager) verifyTd(peer *peer, request newBlockMsgData) error { // out which peers do not contain the block in their block set and will do a // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) { - pm.pmu.Lock() - defer pm.pmu.Unlock() - - // Find peers who don't know anything about the given hash. Peers that - // don't know about the hash will be a candidate for the broadcast loop - var peers []*peer - for _, peer := range pm.peers { - if !peer.blockHashes.Has(hash) { - peers = append(peers, peer) - } - } - // Broadcast block to peer set + // Broadcast block to a batch of peers not knowing about it + peers := pm.peers.BlockLackingPeers(hash) peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendNewBlock(block) @@ -369,18 +362,8 @@ func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) // out which peers do not contain the block in their block set and will do a // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastTx(hash common.Hash, tx *types.Transaction) { - pm.pmu.Lock() - defer pm.pmu.Unlock() - - // Find peers who don't know anything about the given hash. Peers that - // don't know about the hash will be a candidate for the broadcast loop - var peers []*peer - for _, peer := range pm.peers { - if !peer.txHashes.Has(hash) { - peers = append(peers, peer) - } - } - // Broadcast block to peer set + // Broadcast transaction to a batch of peers not knowing about it + peers := pm.peers.TxLackingPeers(hash) //FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendTransaction(tx) diff --git a/eth/peer.go b/eth/peer.go index 861efaaec6..369e16221c 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -1,8 +1,10 @@ package eth import ( + "errors" "fmt" "math/big" + "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -12,6 +14,11 @@ import ( "gopkg.in/fatih/set.v0" ) +var ( + errAlreadyRegistered = errors.New("peer is already registered") + errNotRegistered = errors.New("peer is not registered") +) + type statusMsgData struct { ProtocolVersion uint32 NetworkId uint32 @@ -25,16 +32,6 @@ type getBlockHashesMsgData struct { Amount uint64 } -func getBestPeer(peers map[string]*peer) *peer { - var peer *peer - for _, cp := range peers { - if peer == nil || cp.td.Cmp(peer.td) > 0 { - peer = cp - } - } - return peer -} - type peer struct { *p2p.Peer @@ -159,3 +156,115 @@ func (p *peer) handleStatus() error { return <-errc } + +// peerSet represents the collection of active peers currently participating in +// the Ethereum sub-protocol. +type peerSet struct { + peers map[string]*peer + lock sync.RWMutex +} + +// newPeerSet creates a new peer set to track the active participants. +func newPeerSet() *peerSet { + return &peerSet{ + peers: make(map[string]*peer), + } +} + +// Register injects a new peer into the working set, or returns an error if the +// peer is already known. +func (ps *peerSet) Register(p *peer) error { + ps.lock.Lock() + defer ps.lock.Unlock() + + if _, ok := ps.peers[p.id]; ok { + return errAlreadyRegistered + } + ps.peers[p.id] = p + return nil +} + +// Unregister removes a remote peer from the active set, disabling any further +// actions to/from that particular entity. +func (ps *peerSet) Unregister(id string) error { + ps.lock.Lock() + defer ps.lock.Unlock() + + if _, ok := ps.peers[id]; !ok { + return errNotRegistered + } + delete(ps.peers, id) + return nil +} + +// Peer retrieves the registered peer with the given id. +func (ps *peerSet) Peer(id string) *peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + return ps.peers[id] +} + +// Len returns if the current number of peers in the set. +func (ps *peerSet) Len() int { + ps.lock.RLock() + defer ps.lock.RUnlock() + + return len(ps.peers) +} + +// BlockLackingPeers retrieves a list of peers that do not have a given block +// in their set of known hashes. +func (ps *peerSet) BlockLackingPeers(hash common.Hash) []*peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + list := make([]*peer, 0, len(ps.peers)) + for _, p := range ps.peers { + if !p.blockHashes.Has(hash) { + list = append(list, p) + } + } + return list +} + +// TxLackingPeers retrieves a list of peers that do not have a given transaction +// in their set of known hashes. +func (ps *peerSet) TxLackingPeers(hash common.Hash) []*peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + list := make([]*peer, 0, len(ps.peers)) + for _, p := range ps.peers { + if !p.txHashes.Has(hash) { + list = append(list, p) + } + } + return list +} + +// AllPeers retrieves a flat list of all the peers within the set. +func (ps *peerSet) AllPeers() []*peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + list := make([]*peer, 0, len(ps.peers)) + for _, p := range ps.peers { + list = append(list, p) + } + return list +} + +// BestPeer retrieves the known peer with the currently highest total difficulty. +func (ps *peerSet) BestPeer() *peer { + ps.lock.RLock() + defer ps.lock.RUnlock() + + var best *peer + for _, p := range ps.peers { + if best == nil || p.td.Cmp(best.td) > 0 { + best = p + } + } + return best +} diff --git a/eth/sync.go b/eth/sync.go index aa7ebc77b8..62d08acb68 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -10,8 +10,8 @@ import ( "github.com/ethereum/go-ethereum/logger/glog" ) -// Sync contains all synchronisation code for the eth protocol - +// update periodically tries to synchronise with the network, both downloading +// hashes and blocks as well as retrieving cached ones. func (pm *ProtocolManager) update() { forceSync := time.Tick(forceSyncCycle) blockProc := time.Tick(blockProcCycle) @@ -20,22 +20,16 @@ func (pm *ProtocolManager) update() { for { select { case <-pm.newPeerCh: - // Meet the `minDesiredPeerCount` before we select our best peer - if len(pm.peers) < minDesiredPeerCount { + // Make sure we have peers to select from, then sync + if pm.peers.Len() < minDesiredPeerCount { break } - // Find the best peer and synchronise with it - peer := getBestPeer(pm.peers) - if peer == nil { - glog.V(logger.Debug).Infoln("Sync attempt canceled. No peers available") - } - go pm.synchronise(peer) + go pm.synchronise(pm.peers.BestPeer()) case <-forceSync: // Force a sync even if not enough peers are present - if peer := getBestPeer(pm.peers); peer != nil { - go pm.synchronise(peer) - } + go pm.synchronise(pm.peers.BestPeer()) + case <-blockProc: // Try to pull some blocks from the downloaded if atomic.CompareAndSwapInt32(&blockProcPend, 0, 1) { @@ -51,10 +45,9 @@ func (pm *ProtocolManager) update() { } } -// processBlocks will attempt to reconstruct a chain by checking the first item and check if it's -// a known parent. The first block in the chain may be unknown during downloading. When the -// downloader isn't downloading blocks will be dropped with an unknown parent until either it -// has depleted the list or found a known parent. +// processBlocks retrieves downloaded blocks from the download cache and tries +// to construct the local block chain with it. Note, since the block retrieval +// order matters, access to this function *must* be synchronized/serialized. func (pm *ProtocolManager) processBlocks() error { pm.wg.Add(1) defer pm.wg.Done() @@ -79,15 +72,24 @@ func (pm *ProtocolManager) processBlocks() error { return nil } +// synchronise tries to sync up our local block chain with a remote peer, both +// adding various sanity checks as well as wrapping it with various log entries. func (pm *ProtocolManager) synchronise(peer *peer) { + // Short circuit if no peers are available + if peer == nil { + glog.V(logger.Debug).Infoln("Synchronisation canceled: no peers available") + return + } // Make sure the peer's TD is higher than our own. If not drop. if peer.td.Cmp(pm.chainman.Td()) <= 0 { + glog.V(logger.Debug).Infoln("Synchronisation canceled: peer TD too small") return } // FIXME if we have the hash in our chain and the TD of the peer is // much higher than ours, something is wrong with us or the peer. // Check if the hash is on our own chain if pm.chainman.HasBlock(peer.recentHash) { + glog.V(logger.Debug).Infoln("Synchronisation canceled: head already known") return } // Get the hashes from the peer (synchronously) From 4755caeb2d07db057e152df555d58d0dd89bda03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Mon, 18 May 2015 21:35:42 +0300 Subject: [PATCH 26/59] eth: remote a superfluous peerSet method --- eth/peer.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/eth/peer.go b/eth/peer.go index 369e16221c..a23449acd3 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -243,18 +243,6 @@ func (ps *peerSet) TxLackingPeers(hash common.Hash) []*peer { return list } -// AllPeers retrieves a flat list of all the peers within the set. -func (ps *peerSet) AllPeers() []*peer { - ps.lock.RLock() - defer ps.lock.RUnlock() - - list := make([]*peer, 0, len(ps.peers)) - for _, p := range ps.peers { - list = append(list, p) - } - return list -} - // BestPeer retrieves the known peer with the currently highest total difficulty. func (ps *peerSet) BestPeer() *peer { ps.lock.RLock() From b7baceefdab01e4594b66500b54e089c91f2727a Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 20:26:41 +0200 Subject: [PATCH 27/59] xeth: remove nonce on error. Fixes #1026 --- xeth/xeth.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xeth/xeth.go b/xeth/xeth.go index 88cd30afce..4d9611cbc4 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -924,9 +924,11 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS tx.SetNonce(nonce) if err := self.sign(tx, from, false); err != nil { + state.RemoveNonce(from, tx.Nonce()) return "", err } if err := self.backend.TxPool().Add(tx); err != nil { + state.RemoveNonce(from, tx.Nonce()) return "", err } From 7d9a13e0d5a3c7745a0219957ccd2bcc5a301c58 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 19 May 2015 12:59:12 +0200 Subject: [PATCH 28/59] core: disable cash tmp --- core/chain_manager.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/chain_manager.go b/core/chain_manager.go index 7dff7dffd5..4fb7506e53 100644 --- a/core/chain_manager.go +++ b/core/chain_manager.go @@ -412,9 +412,11 @@ func (self *ChainManager) GetBlockHashesFromHash(hash common.Hash, max uint64) ( } func (self *ChainManager) GetBlock(hash common.Hash) *types.Block { - if block := self.cache.Get(hash); block != nil { - return block - } + /* + if block := self.cache.Get(hash); block != nil { + return block + } + */ data, _ := self.blockDb.Get(append(blockHashPre, hash[:]...)) if len(data) == 0 { From 748263d2f011382c832cbebb8d4e10fba8a09f71 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 19 May 2015 08:14:48 -0500 Subject: [PATCH 29/59] Use bytes.Repeat() instead of 32-byte literal --- rpc/api.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rpc/api.go b/rpc/api.go index b2566cfc5d..0c1409d71b 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -230,6 +230,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err block := api.xeth().EthBlockByNumber(args.BlockNumber) br := NewBlockRes(block, args.IncludeTxs) + // If request was for "pending", nil nonsensical fields if args.BlockNumber == -2 { br.BlockHash = nil br.BlockNumber = nil @@ -247,7 +248,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err if tx != nil { v := NewTransactionRes(tx) // if the blockhash is 0, assume this is a pending transaction - if bytes.Compare(bhash.Bytes(), []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) != 0 { + if bytes.Compare(bhash.Bytes(), bytes.Repeat([]byte{0}, 32)) != 0 { v.BlockHash = newHexData(bhash) v.BlockNumber = newHexNum(bnum) v.TxIndex = newHexNum(txi) From af8ada45e7d98527a21049e06a8bda307a083301 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 19 May 2015 13:40:41 -0500 Subject: [PATCH 30/59] Allow unlocking multiple accounts #1045 Separate accounts with spaces when using --unlock --- cmd/geth/main.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index df0af3e79c..28a558d682 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -364,11 +364,12 @@ func execJSFiles(ctx *cli.Context) { func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (passphrase string) { var err error // Load startup keys. XXX we are going to need a different format - // Attempt to unlock the account - passphrase = getPassPhrase(ctx, "", false) + if len(account) == 0 { utils.Fatalf("Invalid account address '%s'", account) } + // Attempt to unlock the account + passphrase = getPassPhrase(ctx, "Unlocking account "+account, false) err = am.Unlock(common.HexToAddress(account), passphrase) if err != nil { utils.Fatalf("Unlock account failed '%v'", err) @@ -384,15 +385,18 @@ func startEth(ctx *cli.Context, eth *eth.Ethereum) { am := eth.AccountManager() account := ctx.GlobalString(utils.UnlockedAccountFlag.Name) - if len(account) > 0 { - if account == "primary" { - primaryAcc, err := am.Primary() - if err != nil { - utils.Fatalf("no primary account: %v", err) + accounts := strings.Split(account, " ") + for _, account := range accounts { + if len(account) > 0 { + if account == "primary" { + primaryAcc, err := am.Primary() + if err != nil { + utils.Fatalf("no primary account: %v", err) + } + account = primaryAcc.Hex() } - account = primaryAcc.Hex() + unlockAccount(ctx, am, account) } - unlockAccount(ctx, am, account) } // Start auxiliary services if enabled. if ctx.GlobalBool(utils.RPCEnabledFlag.Name) { From 32b8565022d7d6ccb437769b5ed68121c5c34657 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 19 May 2015 14:46:32 -0500 Subject: [PATCH 31/59] Support multiple account unlock attempts --- cmd/geth/main.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 28a558d682..2afc92f10e 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -368,9 +368,16 @@ func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (pass if len(account) == 0 { utils.Fatalf("Invalid account address '%s'", account) } - // Attempt to unlock the account - passphrase = getPassPhrase(ctx, "Unlocking account "+account, false) - err = am.Unlock(common.HexToAddress(account), passphrase) + // Attempt to unlock the account 3 times + attempts := 3 + for tries := 0; tries < attempts; tries++ { + msg := fmt.Sprintf("Unlocking account %s...%s | Attempt %d/%d", account[:8], account[len(account)-6:], tries+1, attempts) + passphrase = getPassPhrase(ctx, msg, false) + err = am.Unlock(common.HexToAddress(account), passphrase) + if err == nil { + break + } + } if err != nil { utils.Fatalf("Unlock account failed '%v'", err) } From 87a05c8f38dd34728e4375dee51fcd20da1048ec Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 19 May 2015 21:50:26 +0200 Subject: [PATCH 32/59] core: skipped tests while cache disabled --- core/chain_manager_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/chain_manager_test.go b/core/chain_manager_test.go index 56bef24f32..7dc7358c05 100644 --- a/core/chain_manager_test.go +++ b/core/chain_manager_test.go @@ -390,6 +390,7 @@ func chm(genesis *types.Block, db common.Database) *ChainManager { } func TestReorgLongest(t *testing.T) { + t.Skip("skipped while cache is removed") db, _ := ethdb.NewMemDatabase() genesis := GenesisBlock(db) bc := chm(genesis, db) @@ -409,6 +410,7 @@ func TestReorgLongest(t *testing.T) { } func TestReorgShortest(t *testing.T) { + t.Skip("skipped while cache is removed") db, _ := ethdb.NewMemDatabase() genesis := GenesisBlock(db) bc := chm(genesis, db) From 8dac28f2e3394934a621fc493a870c46078819ac Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 19 May 2015 17:52:44 +0200 Subject: [PATCH 33/59] core: block cache Has method thread safe --- core/block_cache.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/block_cache.go b/core/block_cache.go index eeef5c41dc..0c747d37cb 100644 --- a/core/block_cache.go +++ b/core/block_cache.go @@ -85,6 +85,9 @@ func (bc *BlockCache) Get(hash common.Hash) *types.Block { } func (bc *BlockCache) Has(hash common.Hash) bool { + bc.mu.RLock() + defer bc.mu.RUnlock() + _, ok := bc.blocks[hash] return ok } From 648b352424e70f099f62cc18a768babb90434350 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 19 May 2015 17:22:41 +0200 Subject: [PATCH 34/59] tests/vm: updated tests and skipped output for specific tests Skipped tests due to large return value --- tests/vm/gh_test.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index 838050fa1e..b014484205 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -87,7 +87,7 @@ func RunVmTest(p string, t *testing.T) { vm.Debug = true glog.SetV(4) glog.SetToStderr(true) - if name != "stackLimitPush32_1024" { + if name != "Call50000_sha256" { continue } */ @@ -128,9 +128,15 @@ func RunVmTest(p string, t *testing.T) { ret, logs, gas, err = helper.RunState(statedb, env, test.Transaction) } - rexp := helper.FromHex(test.Out) - if bytes.Compare(rexp, ret) != 0 { - t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + switch name { + // the memory required for these tests (4294967297 bytes) would take too much time. + // on 19 May 2015 decided to skip these tests their output. + case "mload32bitBound_return", "mload32bitBound_return2": + default: + rexp := helper.FromHex(test.Out) + if bytes.Compare(rexp, ret) != 0 { + t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret) + } } if isVmTest { @@ -246,8 +252,7 @@ func TestLogTest(t *testing.T) { } func TestPerformance(t *testing.T) { - t.Skip() - const fn = "../files/VMTests/vmPerformance.json" + const fn = "../files/VMTests/vmPerformanceTest.json" RunVmTest(fn, t) } @@ -342,13 +347,11 @@ func TestMemory(t *testing.T) { } func TestMemoryStress(t *testing.T) { - t.Skip("Skipped due to...consuming too much memory :D") const fn = "../files/StateTests/stMemoryStressTest.json" RunVmTest(fn, t) } func TestQuadraticComplexity(t *testing.T) { - t.Skip() // takes too long const fn = "../files/StateTests/stQuadraticComplexityTest.json" RunVmTest(fn, t) } From f5af1fdca8dc7d44b4c2025195c19819886729b6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 19 May 2015 17:26:38 +0200 Subject: [PATCH 35/59] core/vm: RETURN op code returns pointer to memory rather than copy --- core/vm/memory.go | 12 ++++++++++++ core/vm/vm.go | 2 +- tests/vm/gh_test.go | 8 ++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/vm/memory.go b/core/vm/memory.go index b77d486ebb..d20aa95910 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -49,6 +49,18 @@ func (self *Memory) Get(offset, size int64) (cpy []byte) { return } +func (self *Memory) GetPtr(offset, size int64) []byte { + if size == 0 { + return nil + } + + if len(self.store) > int(offset) { + return self.store[offset : offset+size] + } + + return nil +} + func (m *Memory) Len() int { return len(m.store) } diff --git a/core/vm/vm.go b/core/vm/vm.go index 927b672936..35fa19d038 100644 --- a/core/vm/vm.go +++ b/core/vm/vm.go @@ -695,7 +695,7 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) { self.Printf("resume %x (%v)", context.Address(), context.Gas) case RETURN: offset, size := stack.pop(), stack.pop() - ret := mem.Get(offset.Int64(), size.Int64()) + ret := mem.GetPtr(offset.Int64(), size.Int64()) self.Printf(" => [%v, %v] (%d) 0x%x", offset, size, len(ret), ret).Endl() diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index b014484205..827d8ec8ba 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -286,13 +286,13 @@ func TestInputLimitsLight(t *testing.T) { RunVmTest(fn, t) } -func TestStateExample(t *testing.T) { - const fn = "../files/StateTests/stExample.json" +func TestStateSystemOperations(t *testing.T) { + const fn = "../files/StateTests/stSystemOperationsTest.json" RunVmTest(fn, t) } -func TestStateSystemOperations(t *testing.T) { - const fn = "../files/StateTests/stSystemOperationsTest.json" +func TestStateExample(t *testing.T) { + const fn = "../files/StateTests/stExample.json" RunVmTest(fn, t) } From 9617aa8e19b660ead51c201b76c510ea079f40eb Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 20 May 2015 00:20:07 +0200 Subject: [PATCH 36/59] tests: added conditional skip on long running VM tests Set the TEST_VM_COMPLEX env var to test complex vm tests which require a lot of ram and quite some time. --- tests/vm/gh_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index 827d8ec8ba..68eb4cb45c 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -4,6 +4,7 @@ import ( "bytes" "io/ioutil" "math/big" + "os" "path/filepath" "strconv" "testing" @@ -347,11 +348,17 @@ func TestMemory(t *testing.T) { } func TestMemoryStress(t *testing.T) { + if os.Getenv("TEST_VM_COMPLEX") == "" { + t.Skip() + } const fn = "../files/StateTests/stMemoryStressTest.json" RunVmTest(fn, t) } func TestQuadraticComplexity(t *testing.T) { + if os.Getenv("TEST_VM_COMPLEX") == "" { + t.Skip() + } const fn = "../files/StateTests/stQuadraticComplexityTest.json" RunVmTest(fn, t) } From f9abcee0f9185d41c71cc24af1303133497ebeb0 Mon Sep 17 00:00:00 2001 From: zelig Date: Mon, 18 May 2015 15:31:26 +0100 Subject: [PATCH 37/59] fix solc tests unskip --- cmd/geth/info_test.json | 2 +- cmd/geth/js_test.go | 33 ++++++++++++++++++-------------- common/compiler/solidity.go | 2 +- common/compiler/solidity_test.go | 30 ++++++++++++++++------------- miner/worker.go | 1 + rpc/api_test.go | 20 ++++++++++--------- 6 files changed, 50 insertions(+), 38 deletions(-) diff --git a/cmd/geth/info_test.json b/cmd/geth/info_test.json index 1e0c271ac9..63f2163a9c 100644 --- a/cmd/geth/info_test.json +++ b/cmd/geth/info_test.json @@ -1 +1 @@ -{"code":"605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056","info":{"abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"compilerVersion":"0.9.17","developerDoc":{"methods":{}},"language":"Solidity","languageVersion":"0","source":"contract test {\n /// @notice Will multiply `a` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply `a` by 7."}}}}} \ No newline at end of file +{"code":"0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056","info":{"abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"compilerVersion":"0.9.23","developerDoc":{"methods":{}},"language":"Solidity","languageVersion":"0","source":"contract test {\n /// @notice Will multiply `a` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply `a` by 7."}}}}} \ No newline at end of file diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 6368efbfcc..2f29612d3e 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -24,7 +24,7 @@ import ( const ( testSolcPath = "" - solcVersion = "0.9.17" + solcVersion = "0.9.23" testKey = "e6fab74a43941f82d89cb7faa408e227cdad3153c4720e540e855c19b15e6674" testAddress = "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182" @@ -34,6 +34,7 @@ const ( ) var ( + versionRE = regexp.MustCompile(strconv.Quote(`"compilerVersion":"` + solcVersion + `"`)) testGenesis = `{"` + testAddress[2:] + `": {"balance": "` + testBalance + `"}}` ) @@ -246,7 +247,6 @@ func TestSignature(t *testing.T) { } func TestContract(t *testing.T) { - t.Skip() tmp, repl, ethereum := testJEthRE(t) if err := ethereum.Start(); err != nil { @@ -259,7 +259,9 @@ func TestContract(t *testing.T) { var txc uint64 coinbase := common.HexToAddress(testAddress) resolver.New(repl.xeth).CreateContracts(coinbase) + // time.Sleep(1000 * time.Millisecond) + // checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `2`) source := `contract test {\n` + " /// @notice Will multiply `a` by 7." + `\n` + ` function multiply(uint a) returns(uint d) {\n` + @@ -279,10 +281,9 @@ func TestContract(t *testing.T) { // if solc is found with right version, test it, otherwise read from file sol, err := compiler.New("") if err != nil { - t.Logf("solc not found: skipping compiler test") + t.Logf("solc not found: mocking contract compilation step") } else if sol.Version() != solcVersion { - err = fmt.Errorf("solc wrong version found (%v, expect %v): skipping compiler test", sol.Version(), solcVersion) - t.Log(err) + t.Logf("WARNING: solc different version found (%v, test written for %v, may need to update)", sol.Version(), solcVersion) } if err != nil { @@ -298,7 +299,7 @@ func TestContract(t *testing.T) { checkEvalJSON(t, repl, `contract = eth.compile.solidity(source)`, string(contractInfo)) } - checkEvalJSON(t, repl, `contract.code`, `"605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056"`) + checkEvalJSON(t, repl, `contract.code`, `"0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056"`) checkEvalJSON( t, repl, @@ -310,13 +311,14 @@ func TestContract(t *testing.T) { Multiply7 = eth.contract(abiDef); multiply7 = new Multiply7(contractaddress); ` - + // time.Sleep(1500 * time.Millisecond) _, err = repl.re.Run(callSetup) if err != nil { - t.Errorf("unexpected error registering, got %v", err) + t.Errorf("unexpected error setting up contract, got %v", err) } - // updatespec + // checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `3`) + // why is this sometimes failing? // checkEvalJSON(t, repl, `multiply7.multiply.call(6)`, `42`) expNotice := "" @@ -324,20 +326,23 @@ multiply7 = new Multiply7(contractaddress); t.Errorf("incorrect confirmation message: expected %v, got %v", expNotice, repl.lastConfirm) } - // why 0? - checkEvalJSON(t, repl, `eth.getBlock("pending", true).transactions.length`, `0`) - txc, repl.xeth = repl.xeth.ApplyTestTxs(repl.stateDb, coinbase, txc) checkEvalJSON(t, repl, `admin.contractInfo.start()`, `true`) checkEvalJSON(t, repl, `multiply7.multiply.sendTransaction(6, { from: primary, gas: "1000000", gasPrice: "100000" })`, `undefined`) - expNotice = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x4a6c99e127191d2ee302e42182c338344b39a37a47cdbb17ab0f26b6802eb4d1'): {"params":[{"to":"0x5dcaace5982778b409c524873b319667eba5d074","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` + expNotice = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x87e2802265838c7f14bb69eecd2112911af6767907a702eeaa445239fb20711b'): {"params":[{"to":"0x5dcaace5982778b409c524873b319667eba5d074","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` if repl.lastConfirm != expNotice { t.Errorf("incorrect confirmation message: expected %v, got %v", expNotice, repl.lastConfirm) } + var contenthash = `"0x86d2b7cf1e72e9a7a3f8d96601f0151742a2f780f1526414304fbe413dc7f9bd"` + if sol != nil { + modContractInfo := versionRE.ReplaceAll(contractInfo, []byte(`"compilerVersion":"`+sol.Version()+`"`)) + _ = modContractInfo + // contenthash = crypto.Sha3(modContractInfo) + } checkEvalJSON(t, repl, `filename = "/tmp/info.json"`, `"/tmp/info.json"`) - checkEvalJSON(t, repl, `contenthash = admin.contractInfo.register(primary, contractaddress, contract, filename)`, `"0x0d067e2dd99a4d8f0c0279738b17130dd415a89f24a23f0e7cf68c546ae3089d"`) + checkEvalJSON(t, repl, `contenthash = admin.contractInfo.register(primary, contractaddress, contract, filename)`, contenthash) checkEvalJSON(t, repl, `admin.contractInfo.registerUrl(primary, contenthash, "file://"+filename)`, `true`) if err != nil { t.Errorf("unexpected error registering, got %v", err) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 6790f9a1d3..bc1697692b 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -164,7 +164,7 @@ func (sol *Solidity) Compile(source string) (contract *Contract, err error) { err = json.Unmarshal(developerDocJson, &developerDoc) contract = &Contract{ - Code: string(code), + Code: "0x" + string(code), Info: ContractInfo{ Source: source, Language: "Solidity", diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 68e54a7ecf..2b0ca148fe 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" ) -const solcVersion = "0.9.17" +const solcVersion = "0.9.23" var ( source = ` @@ -20,33 +20,37 @@ contract test { } } ` - code = "605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056" - info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0","compilerVersion":"0.9.17","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` + code = "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056" + info = `{"source":"\ncontract test {\n /// @notice Will multiply ` + "`a`" + ` by 7.\n function multiply(uint a) returns(uint d) {\n return a * 7;\n }\n}\n","language":"Solidity","languageVersion":"0","compilerVersion":"0.9.23","abiDefinition":[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}],"userDoc":{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}},"developerDoc":{"methods":{}}}` - infohash = common.HexToHash("0x834075768a68e500e459b9c3213750c84de3df47156500cb01bb664d3f88c60a") + infohash = common.HexToHash("0xea782f674eb898e477c20e8a7cf11c2c28b09fa68b5278732104f7a101aed255") ) func TestCompiler(t *testing.T) { sol, err := New("") if err != nil { - t.Skip("no solc installed") + t.Skip("solc not found: skip") + } else if sol.Version() != solcVersion { + t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } contract, err := sol.Compile(source) if err != nil { t.Errorf("error compiling source. result %v: %v", contract, err) return } - /* - if contract.Code != code { - t.Errorf("wrong code, expected\n%s, got\n%s", code, contract.Code) - } - */ + + if contract.Code != code { + t.Errorf("wrong code, expected\n%s, got\n%s", code, contract.Code) + } + } func TestCompileError(t *testing.T) { sol, err := New("") if err != nil || sol.version != solcVersion { - t.Skip("no solc installed") + t.Skip("solc not found: skip") + } else if sol.Version() != solcVersion { + t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } contract, err := sol.Compile(source[2:]) if err == nil { @@ -78,11 +82,11 @@ func TestExtractInfo(t *testing.T) { os.Remove(filename) cinfohash, err := ExtractInfo(contract, filename) if err != nil { - t.Errorf("%v", err) + t.Errorf("error extracting info: %v", err) } got, err := ioutil.ReadFile(filename) if err != nil { - t.Errorf("%v", err) + t.Errorf("error reading '%v': %v", filename, err) } if string(got) != info { t.Errorf("incorrect info.json extracted, expected:\n%s\ngot\n%s", info, string(got)) diff --git a/miner/worker.go b/miner/worker.go index 5fa5d3777e..5e4ff7510f 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -270,6 +270,7 @@ func (self *worker) makeCurrent() { } block.Header().Extra = self.extra + // when 08 is processed ancestors contain 07 (quick block) current := env(block, self.eth) for _, ancestor := range self.chain.GetAncestors(block, 7) { for _, uncle := range ancestor.Uncles() { diff --git a/rpc/api_test.go b/rpc/api_test.go index b49e27bd1a..263e9666d7 100644 --- a/rpc/api_test.go +++ b/rpc/api_test.go @@ -30,12 +30,15 @@ func TestWeb3Sha3(t *testing.T) { } } +const solcVersion = "0.9.23" + func TestCompileSolidity(t *testing.T) { - t.Skip() solc, err := compiler.New("") if solc == nil { - t.Skip("no solidity compiler") + t.Skip("no solc found: skip") + } else if solc.Version() != solcVersion { + t.Logf("WARNING: solc different version found (%v, test written for %v, may need to update)", solc.Version(), solcVersion) } source := `contract test {\n` + " /// @notice Will multiply `a` by 7." + `\n` + @@ -46,11 +49,11 @@ func TestCompileSolidity(t *testing.T) { jsonstr := `{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["` + source + `"],"id":64}` - //expCode := "605280600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b60376004356041565b8060005260206000f35b6000600782029050604d565b91905056" + expCode := "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056" expAbiDefinition := `[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]` expUserDoc := `{"methods":{"multiply(uint256)":{"notice":"Will multiply ` + "`a`" + ` by 7."}}}` expDeveloperDoc := `{"methods":{}}` - expCompilerVersion := `0.9.13` + expCompilerVersion := solc.Version() expLanguage := "Solidity" expLanguageVersion := "0" expSource := source @@ -76,11 +79,10 @@ func TestCompileSolidity(t *testing.T) { t.Errorf("expected no error, got %v", err) } - /* - if contract.Code != expCode { - t.Errorf("Expected %s got %s", expCode, contract.Code) - } - */ + if contract.Code != expCode { + t.Errorf("Expected \n%s got \n%s", expCode, contract.Code) + } + if strconv.Quote(contract.Info.Source) != `"`+expSource+`"` { t.Errorf("Expected \n'%s' got \n'%s'", expSource, strconv.Quote(contract.Info.Source)) } From 22b694ee1e1044e68c906fbd864797ac2f8a4ab0 Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 02:04:52 +0100 Subject: [PATCH 38/59] solc now in ethereum, fixes solc path setting; setSolc() didnt work --- cmd/geth/js.go | 3 +-- cmd/geth/js_test.go | 3 ++- cmd/geth/main.go | 2 -- cmd/utils/flags.go | 1 + eth/backend.go | 20 ++++++++++++++++++++ xeth/xeth.go | 12 ++---------- 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/cmd/geth/js.go b/cmd/geth/js.go index 4ddb3bd9ca..f99051a1e9 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -71,7 +71,7 @@ type jsre struct { prompter } -func newJSRE(ethereum *eth.Ethereum, libPath, solcPath, corsDomain string, interactive bool, f xeth.Frontend) *jsre { +func newJSRE(ethereum *eth.Ethereum, libPath, corsDomain string, interactive bool, f xeth.Frontend) *jsre { js := &jsre{ethereum: ethereum, ps1: "> "} // set default cors domain used by startRpc from CLI flag js.corsDomain = corsDomain @@ -81,7 +81,6 @@ func newJSRE(ethereum *eth.Ethereum, libPath, solcPath, corsDomain string, inter js.xeth = xeth.New(ethereum, f) js.wait = js.xeth.UpdateState() // update state in separare forever blocks - js.xeth.SetSolc(solcPath) js.re = re.New(libPath) js.apiBindings(f) js.adminBindings() diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 2f29612d3e..8ffef49700 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -76,6 +76,7 @@ func testJEthRE(t *testing.T) (string, *testjethre, *eth.Ethereum) { AccountManager: am, MaxPeers: 0, Name: "test", + SolcPath: testSolcPath, }) if err != nil { t.Fatal("%v", err) @@ -102,7 +103,7 @@ func testJEthRE(t *testing.T) (string, *testjethre, *eth.Ethereum) { t.Errorf("Error creating DocServer: %v", err) } tf := &testjethre{ds: ds, stateDb: ethereum.ChainManager().State().Copy()} - repl := newJSRE(ethereum, assetPath, testSolcPath, "", false, tf) + repl := newJSRE(ethereum, assetPath, "", false, tf) tf.jsre = repl return tmp, tf, ethereum } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 2afc92f10e..d102e3158c 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -326,7 +326,6 @@ func console(ctx *cli.Context) { repl := newJSRE( ethereum, ctx.String(utils.JSpathFlag.Name), - ctx.String(utils.SolcPathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), true, nil, @@ -348,7 +347,6 @@ func execJSFiles(ctx *cli.Context) { repl := newJSRE( ethereum, ctx.String(utils.JSpathFlag.Name), - ctx.String(utils.SolcPathFlag.Name), ctx.GlobalString(utils.RPCCORSDomainFlag.Name), false, nil, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index f646e4fccd..2766e75171 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -313,6 +313,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { Dial: true, BootNodes: ctx.GlobalString(BootnodesFlag.Name), GasPrice: common.String2Big(ctx.GlobalString(GasPriceFlag.Name)), + SolcPath: ctx.GlobalString(SolcPathFlag.Name), } } diff --git a/eth/backend.go b/eth/backend.go index 519a4c4108..44ceb89e8e 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -14,6 +14,7 @@ import ( "github.com/ethereum/ethash" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/compiler" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/vm" @@ -79,6 +80,7 @@ type Config struct { GasPrice *big.Int MinerThreads int AccountManager *accounts.Manager + SolcPath string // NewDB is used to create databases. // If nil, the default is to create leveldb databases on disk. @@ -181,6 +183,8 @@ type Ethereum struct { pow *ethash.Ethash protocolManager *ProtocolManager downloader *downloader.Downloader + SolcPath string + solc *compiler.Solidity net *p2p.Server eventMux *event.TypeMux @@ -264,6 +268,7 @@ func New(config *Config) (*Ethereum, error) { netVersionId: config.NetworkId, NatSpec: config.NatSpec, MinerThreads: config.MinerThreads, + SolcPath: config.SolcPath, } eth.pow = ethash.New() @@ -571,3 +576,18 @@ func saveBlockchainVersion(db common.Database, bcVersion int) { db.Put([]byte("BlockchainVersion"), common.NewValue(bcVersion).Bytes()) } } + +func (self *Ethereum) Solc() (*compiler.Solidity, error) { + var err error + if self.solc == nil { + self.solc, err = compiler.New(self.SolcPath) + } + return self.solc, err +} + +// set in js console via admin interface or wrapper from cli flags +func (self *Ethereum) SetSolc(solcPath string) (*compiler.Solidity, error) { + self.SolcPath = solcPath + self.solc = nil + return self.Solc() +} diff --git a/xeth/xeth.go b/xeth/xeth.go index 7de3e31be4..81197d3818 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -66,9 +66,6 @@ type XEth struct { // regmut sync.Mutex // register map[string][]*interface{} // TODO improve return type - solcPath string - solc *compiler.Solidity - agent *miner.RemoteAgent } @@ -379,17 +376,12 @@ func (self *XEth) Accounts() []string { // accessor for solidity compiler. // memoized if available, retried on-demand if not func (self *XEth) Solc() (*compiler.Solidity, error) { - var err error - if self.solc == nil { - self.solc, err = compiler.New(self.solcPath) - } - return self.solc, err + return self.backend.Solc() } // set in js console via admin interface or wrapper from cli flags func (self *XEth) SetSolc(solcPath string) (*compiler.Solidity, error) { - self.solcPath = solcPath - self.solc = nil + self.backend.SetSolc(solcPath) return self.Solc() } From 4201a181178c1b72bcd30c07ef026dee1bbfde88 Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 02:15:33 +0100 Subject: [PATCH 39/59] remove solc flair --- common/compiler/solidity.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index bc1697692b..19d5849fb3 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -18,7 +18,8 @@ import ( ) const ( - flair = "Christian and Lefteris (c) 2014-2015" + // flair = "Christian and Lefteris (c) 2014-2015" + flair = "" languageVersion = "0" ) From d92172f3d484cf54653e1dcdfde5a94f100448fa Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 02:42:10 +0100 Subject: [PATCH 40/59] add usage doc to wallet import --- cmd/geth/main.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index d102e3158c..ba253bbebb 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -99,7 +99,15 @@ The output of this command is supposed to be machine-readable. Usage: "import ethereum presale wallet", }, }, - }, + Description: ` + + get wallet import /path/to/my/presale.wallet + +will prompt for your password and imports your ether presale account. +It can be used non-interactively with the --password option taking a +passwordfile as argument containing the wallet password in plaintext. + +`}, { Action: accountList, Name: "account", From ea893aca8fbda0d821424ab7509a0a0cfef1f77d Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 02:58:49 +0100 Subject: [PATCH 41/59] update web3.js to 0.4.2 --- jsre/ethereum_js.go | 2568 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 2077 insertions(+), 491 deletions(-) diff --git a/jsre/ethereum_js.go b/jsre/ethereum_js.go index a61ffcbbf4..6c0ae33d7b 100644 --- a/jsre/ethereum_js.go +++ b/jsre/ethereum_js.go @@ -1,7 +1,6 @@ package jsre -const Ethereum_JS = ` -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o. */ -/** - * @file abi.js - * @author Marek Kotewicz - * @author Gav Wood - * @date 2014 - */ - -var utils = require('../utils/utils'); -var coder = require('./coder'); -var solUtils = require('./utils'); - /** - * Formats input params to bytes - * - * @method formatInput - * @param {Array} abi inputs of method - * @param {Array} params that will be formatted to bytes - * @returns bytes representation of input params - */ -var formatInput = function (inputs, params) { - var i = inputs.map(function (input) { - return input.type; - }); - return coder.encodeParams(i, params); -}; - -/** - * Formats output bytes back to param list - * - * @method formatOutput - * @param {Array} abi outputs of method - * @param {String} bytes represention of output - * @returns {Array} output params - */ -var formatOutput = function (outs, bytes) { - var o = outs.map(function (out) { - return out.type; - }); - - return coder.decodeParams(o, bytes); -}; - -/** - * Should be called to create input parser for contract with given abi - * - * @method inputParser - * @param {Array} contract abi - * @returns {Object} input parser object for given json abi - * TODO: refactor creating the parser, do not double logic from contract - */ -var inputParser = function (json) { - var parser = {}; - json.forEach(function (method) { - var displayName = utils.extractDisplayName(method.name); - var typeName = utils.extractTypeName(method.name); - - var impl = function () { - var params = Array.prototype.slice.call(arguments); - return formatInput(method.inputs, params); - }; - - if (parser[displayName] === undefined) { - parser[displayName] = impl; - } - - parser[displayName][typeName] = impl; - }); - - return parser; -}; - -/** - * Should be called to create output parser for contract with given abi - * - * @method outputParser - * @param {Array} contract abi - * @returns {Object} output parser for given json abi - */ -var outputParser = function (json) { - var parser = {}; - json.forEach(function (method) { - - var displayName = utils.extractDisplayName(method.name); - var typeName = utils.extractTypeName(method.name); - - var impl = function (output) { - return formatOutput(method.outputs, output); - }; - - if (parser[displayName] === undefined) { - parser[displayName] = impl; - } - - parser[displayName][typeName] = impl; - }); - - return parser; -}; - -var formatConstructorParams = function (abi, params) { - var constructor = solUtils.getConstructor(abi, params.length); - if (!constructor) { - if (params.length > 0) { - console.warn("didn't found matching constructor, using default one"); - } - return ''; - } - return formatInput(constructor.inputs, params); -}; - -module.exports = { - inputParser: inputParser, - outputParser: outputParser, - formatInput: formatInput, - formatOutput: formatOutput, - formatConstructorParams: formatConstructorParams -}; - -},{"../utils/utils":8,"./coder":2,"./utils":5}],2:[function(require,module,exports){ -/* - This file is part of ethereum.js. - - ethereum.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - ethereum.js is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . -*/ -/** * @file coder.js * @author Marek Kotewicz * @date 2015 @@ -208,7 +72,7 @@ SolidityType.prototype.isType = function (name) { * @method formatInput * @param {Object} param - plain object, or an array of objects * @param {Bool} arrayType - true if a param should be encoded as an array - * @return {SolidityParam} encoded param wrapped in SolidityParam object + * @return {SolidityParam} encoded param wrapped in SolidityParam object */ SolidityType.prototype.formatInput = function (param, arrayType) { if (utils.isArray(param) && arrayType) { // TODO: should fail if this two are not the same @@ -216,10 +80,9 @@ SolidityType.prototype.formatInput = function (param, arrayType) { return param.map(function (p) { return self._inputFormatter(p); }).reduce(function (acc, current) { - acc.appendArrayElement(current); - return acc; - }, new SolidityParam(f.formatInputInt(param.length).value)); - } + return acc.combine(current); + }, f.formatInputInt(param.length)).withOffset(32); + } return this._inputFormatter(param); }; @@ -233,11 +96,11 @@ SolidityType.prototype.formatInput = function (param, arrayType) { */ SolidityType.prototype.formatOutput = function (param, arrayType) { if (arrayType) { - // let's assume, that we solidity will never return long arrays :P + // let's assume, that we solidity will never return long arrays :P var result = []; - var length = new BigNumber(param.value, 16); + var length = new BigNumber(param.dynamicPart().slice(0, 64), 16); for (var i = 0; i < length * 64; i += 64) { - result.push(this._outputFormatter(new SolidityParam(param.suffix.slice(i, i + 64)))); + result.push(this._outputFormatter(new SolidityParam(param.dynamicPart().substr(i + 64, 64)))); } return result; } @@ -245,31 +108,21 @@ SolidityType.prototype.formatOutput = function (param, arrayType) { }; /** - * Should be used to check if a type is variadic + * Should be used to slice single param from bytes * - * @method isVariadicType + * @method sliceParam + * @param {String} bytes + * @param {Number} index of param to slice * @param {String} type - * @returns {Bool} true if the type is variadic + * @returns {SolidityParam} param */ -SolidityType.prototype.isVariadicType = function (type) { - return isArrayType(type) || this._mode === 'bytes'; -}; - -/** - * Should be used to shift param from params group - * - * @method shiftParam - * @param {String} type - * @returns {SolidityParam} shifted param - */ -SolidityType.prototype.shiftParam = function (type, param) { +SolidityType.prototype.sliceParam = function (bytes, index, type) { if (this._mode === 'bytes') { - return param.shiftBytes(); + return SolidityParam.decodeBytes(bytes, index); } else if (isArrayType(type)) { - var length = new BigNumber(param.value.slice(0, 64), 16); - return param.shiftArray(length); + return SolidityParam.decodeArray(bytes, index); } - return param.shiftValue(); + return SolidityParam.decodeParam(bytes, index); }; /** @@ -284,7 +137,7 @@ var SolidityCoder = function (types) { * * @method _requireType * @param {String} type - * @returns {SolidityType} + * @returns {SolidityType} * @throws {Error} throws if no matching type is found */ SolidityCoder.prototype._requireType = function (type) { @@ -299,20 +152,6 @@ SolidityCoder.prototype._requireType = function (type) { return solidityType; }; -/** - * Should be used to transform plain bytes to SolidityParam object - * - * @method _bytesToParam - * @param {Array} types of params - * @param {String} bytes to be transformed to SolidityParam - * @return {SolidityParam} SolidityParam for this group of params - */ -SolidityCoder.prototype._bytesToParam = function (types, bytes) { - var value = bytes.slice(0, types.length * 64); - var suffix = bytes.slice(types.length * 64); - return new SolidityParam(value, suffix); -}; - /** * Should be used to transform plain param of given type to SolidityParam * @@ -347,24 +186,11 @@ SolidityCoder.prototype.encodeParam = function (type, param) { */ SolidityCoder.prototype.encodeParams = function (types, params) { var self = this; - return types.map(function (type, index) { + var solidityParams = types.map(function (type, index) { return self._formatInput(type, params[index]); - }).reduce(function (acc, solidityParam) { - acc.append(solidityParam); - return acc; - }, new SolidityParam()).encode(); -}; + }); -/** - * Should be used to transform SolidityParam to plain param - * - * @method _formatOutput - * @param {String} type - * @param {SolidityParam} param - * @return {Object} plain param - */ -SolidityCoder.prototype._formatOutput = function (type, param) { - return this._requireType(type).formatOutput(param, isArrayType(type)); + return SolidityParam.encodeList(solidityParams); }; /** @@ -376,7 +202,7 @@ SolidityCoder.prototype._formatOutput = function (type, param) { * @return {Object} plain param */ SolidityCoder.prototype.decodeParam = function (type, bytes) { - return this._formatOutput(type, this._bytesToParam([type], bytes)); + return this.decodeParams([type], bytes)[0]; }; /** @@ -389,10 +215,9 @@ SolidityCoder.prototype.decodeParam = function (type, bytes) { */ SolidityCoder.prototype.decodeParams = function (types, bytes) { var self = this; - var param = this._bytesToParam(types, bytes); - return types.map(function (type) { + return types.map(function (type, index) { var solidityType = self._requireType(type); - var p = solidityType.shiftParam(type, param); + var p = solidityType.sliceParam(bytes, index, type); return solidityType.formatOutput(p, isArrayType(type)); }); }; @@ -459,7 +284,7 @@ var coder = new SolidityCoder([ module.exports = coder; -},{"../utils/utils":8,"./formatters":3,"./param":4,"bignumber.js":"bignumber.js"}],3:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":2,"./param":3,"bignumber.js":"bignumber.js"}],2:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -476,7 +301,7 @@ module.exports = coder; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @date 2015 @@ -525,7 +350,7 @@ var formatInputBytes = function (value) { */ var formatInputDynamicBytes = function (value) { var result = utils.fromAscii(value, c.ETH_PADDING).substr(2); - return new SolidityParam(formatInputInt(value.length).value, result); + return new SolidityParam(formatInputInt(value.length).value + result, 32); }; /** @@ -571,7 +396,7 @@ var signedIsNegative = function (value) { * @returns {BigNumber} right-aligned output bytes formatted to big number */ var formatOutputInt = function (param) { - var value = param.value || "0"; + var value = param.staticPart() || "0"; // check if it's negative number // it it is, return two's complement @@ -589,7 +414,7 @@ var formatOutputInt = function (param) { * @returns {BigNumeber} right-aligned output bytes formatted to uint */ var formatOutputUInt = function (param) { - var value = param.value || "0"; + var value = param.staticPart() || "0"; return new BigNumber(value, 16); }; @@ -601,7 +426,7 @@ var formatOutputUInt = function (param) { * @returns {BigNumber} input bytes formatted to real */ var formatOutputReal = function (param) { - return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -612,7 +437,7 @@ var formatOutputReal = function (param) { * @returns {BigNumber} input bytes formatted to ureal */ var formatOutputUReal = function (param) { - return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); + return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); }; /** @@ -623,7 +448,7 @@ var formatOutputUReal = function (param) { * @returns {Boolean} right-aligned input bytes formatted to bool */ var formatOutputBool = function (param) { - return param.value === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; + return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; }; /** @@ -635,7 +460,7 @@ var formatOutputBool = function (param) { */ var formatOutputBytes = function (param) { // length might also be important! - return utils.toAscii(param.value); + return utils.toAscii(param.staticPart()); }; /** @@ -647,7 +472,7 @@ var formatOutputBytes = function (param) { */ var formatOutputDynamicBytes = function (param) { // length might also be important! - return utils.toAscii(param.suffix); + return utils.toAscii(param.dynamicPart().slice(64)); }; /** @@ -658,7 +483,7 @@ var formatOutputDynamicBytes = function (param) { * @returns {String} address */ var formatOutputAddress = function (param) { - var value = param.value; + var value = param.staticPart(); return "0x" + value.slice(value.length - 40, value.length); }; @@ -679,7 +504,7 @@ module.exports = { }; -},{"../utils/config":7,"../utils/utils":8,"./param":4,"bignumber.js":"bignumber.js"}],4:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7,"./param":3,"bignumber.js":"bignumber.js"}],3:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -696,136 +521,202 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file param.js * @author Marek Kotewicz * @date 2015 */ +var utils = require('../utils/utils'); + /** * SolidityParam object prototype. * Should be used when encoding, decoding solidity bytes */ -var SolidityParam = function (value, suffix) { +var SolidityParam = function (value, offset) { this.value = value || ''; - this.suffix = suffix || ''; + this.offset = offset; // offset in bytes }; /** - * This method should be used to encode two params one after another + * This method should be used to get length of params's dynamic part * - * @method append - * @param {SolidityParam} param that it appended after this + * @method dynamicPartLength + * @returns {Number} length of dynamic part (in bytes) */ -SolidityParam.prototype.append = function (param) { - this.value += param.value; - this.suffix += param.suffix; +SolidityParam.prototype.dynamicPartLength = function () { + return this.dynamicPart().length / 2; }; /** - * This method should be used to encode next param in an array + * This method should be used to create copy of solidity param with different offset * - * @method appendArrayElement - * @param {SolidityParam} param that is appended to an array + * @method withOffset + * @param {Number} offset length in bytes + * @returns {SolidityParam} new solidity param with applied offset */ -SolidityParam.prototype.appendArrayElement = function (param) { - this.suffix += param.value; - //this.suffix += param.suffix; // we do not support nested dynamic types +SolidityParam.prototype.withOffset = function (offset) { + return new SolidityParam(this.value, offset); }; /** - * This method should be used to create bytearrays from param + * This method should be used to combine solidity params together + * eg. when appending an array + * + * @method combine + * @param {SolidityParam} param with which we should combine + * @param {SolidityParam} result of combination + */ +SolidityParam.prototype.combine = function (param) { + return new SolidityParam(this.value + param.value); +}; + +/** + * This method should be called to check if param has dynamic size. + * If it has, it returns true, otherwise false + * + * @method isDynamic + * @returns {Boolean} + */ +SolidityParam.prototype.isDynamic = function () { + return this.value.length > 64; +}; + +/** + * This method should be called to transform offset to bytes + * + * @method offsetAsBytes + * @returns {String} bytes representation of offset + */ +SolidityParam.prototype.offsetAsBytes = function () { + return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64); +}; + +/** + * This method should be called to get static part of param + * + * @method staticPart + * @returns {String} offset if it is a dynamic param, otherwise value + */ +SolidityParam.prototype.staticPart = function () { + if (!this.isDynamic()) { + return this.value; + } + return this.offsetAsBytes(); +}; + +/** + * This method should be called to get dynamic part of param + * + * @method dynamicPart + * @returns {String} returns a value if it is a dynamic param, otherwise empty string + */ +SolidityParam.prototype.dynamicPart = function () { + return this.isDynamic() ? this.value : ''; +}; + +/** + * This method should be called to encode param * * @method encode - * @return {String} encoded param(s) + * @returns {String} */ SolidityParam.prototype.encode = function () { - return this.value + this.suffix; + return this.staticPart() + this.dynamicPart(); }; /** - * This method should be used to shift first param from group of params + * This method should be called to encode array of params * - * @method shiftValue - * @return {SolidityParam} first value param + * @method encodeList + * @param {Array[SolidityParam]} params + * @returns {String} */ -SolidityParam.prototype.shiftValue = function () { - var value = this.value.slice(0, 64); - this.value = this.value.slice(64); - return new SolidityParam(value); +SolidityParam.encodeList = function (params) { + + // updating offsets + var totalOffset = params.length * 32; + var offsetParams = params.map(function (param) { + if (!param.isDynamic()) { + return param; + } + var offset = totalOffset; + totalOffset += param.dynamicPartLength(); + return param.withOffset(offset); + }); + + // encode everything! + return offsetParams.reduce(function (result, param) { + return result + param.dynamicPart(); + }, offsetParams.reduce(function (result, param) { + return result + param.staticPart(); + }, '')); }; /** - * This method should be used to first bytes param from group of params + * This method should be used to decode plain (static) solidity param at given index * - * @method shiftBytes - * @return {SolidityParam} first bytes param + * @method decodeParam + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} */ -SolidityParam.prototype.shiftBytes = function () { - return this.shiftArray(1); +SolidityParam.decodeParam = function (bytes, index) { + index = index || 0; + return new SolidityParam(bytes.substr(index * 64, 64)); }; /** - * This method should be used to shift an array from group of params - * - * @method shiftArray - * @param {Number} size of an array to shift - * @return {SolidityParam} first array param + * This method should be called to get offset value from bytes at given index + * + * @method getOffset + * @param {String} bytes + * @param {Number} index + * @returns {Number} offset as number */ -SolidityParam.prototype.shiftArray = function (length) { - var value = this.value.slice(0, 64); - this.value = this.value.slice(64); - var suffix = this.suffix.slice(0, 64 * length); - this.suffix = this.suffix.slice(64 * length); - return new SolidityParam(value, suffix); +var getOffset = function (bytes, index) { + // we can do this cause offset is rather small + return parseInt('0x' + bytes.substr(index * 64, 64)); +}; + +/** + * This method should be called to decode solidity bytes param at given index + * + * @method decodeBytes + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} + */ +SolidityParam.decodeBytes = function (bytes, index) { + index = index || 0; + //TODO add support for strings longer than 32 bytes + //var length = parseInt('0x' + bytes.substr(offset * 64, 64)); + + var offset = getOffset(bytes, index); + + // 2 * , cause we also parse length + return new SolidityParam(bytes.substr(offset * 2, 2 * 64)); +}; + +/** + * This method should be used to decode solidity array at given index + * + * @method decodeArray + * @param {String} bytes + * @param {Number} index + * @returns {SolidityParam} + */ +SolidityParam.decodeArray = function (bytes, index) { + index = index || 0; + var offset = getOffset(bytes, index); + var length = parseInt('0x' + bytes.substr(offset * 2, 64)); + return new SolidityParam(bytes.substr(offset * 2, (length + 1) * 64)); }; module.exports = SolidityParam; -},{}],5:[function(require,module,exports){ -/* - This file is part of ethereum.js. - - ethereum.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - ethereum.js is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with ethereum.js. If not, see . -*/ -/** - * @file utils.js - * @author Marek Kotewicz - * @date 2015 - */ - -/** - * Returns the contstructor with matching number of arguments - * - * @method getConstructor - * @param {Array} abi - * @param {Number} numberOfArgs - * @returns {Object} constructor function abi - */ -var getConstructor = function (abi, numberOfArgs) { - return abi.filter(function (f) { - return f.type === 'constructor' && f.inputs.length === numberOfArgs; - })[0]; -}; - -module.exports = { - getConstructor: getConstructor -}; - - -},{}],6:[function(require,module,exports){ +},{"../utils/utils":7}],4:[function(require,module,exports){ 'use strict'; // go env doesn't have and need XMLHttpRequest @@ -836,7 +727,7 @@ if (typeof XMLHttpRequest === 'undefined') { } -},{}],7:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -861,13 +752,13 @@ if (typeof XMLHttpRequest === 'undefined') { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] config * @constructor */ @@ -875,26 +766,26 @@ if (typeof XMLHttpRequest === 'undefined') { /// required to define ETH_BIGNUMBER_ROUNDING_MODE var BigNumber = require('bignumber.js'); -var ETH_UNITS = [ - 'wei', - 'Kwei', - 'Mwei', - 'Gwei', - 'szabo', - 'finney', - 'ether', - 'grand', - 'Mether', - 'Gether', - 'Tether', - 'Pether', - 'Eether', - 'Zether', - 'Yether', - 'Nether', - 'Dether', - 'Vether', - 'Uether' +var ETH_UNITS = [ + 'wei', + 'Kwei', + 'Mwei', + 'Gwei', + 'szabo', + 'finney', + 'ether', + 'grand', + 'Mether', + 'Gether', + 'Tether', + 'Pether', + 'Eether', + 'Zether', + 'Yether', + 'Nether', + 'Dether', + 'Vether', + 'Uether' ]; module.exports = { @@ -908,7 +799,7 @@ module.exports = { }; -},{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){ +},{"bignumber.js":"bignumber.js"}],6:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -925,7 +816,39 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** + * @file sha3.js + * @author Marek Kotewicz + * @date 2015 + */ + +var sha3 = require('crypto-js/sha3'); + +module.exports = function (str) { + return sha3(str, { + outputLength: 256 + }).toString(); +}; + + +},{"crypto-js/sha3":30}],7:[function(require,module,exports){ +/* + This file is part of ethereum.js. + + ethereum.js is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethereum.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see . +*/ +/** * @file utils.js * @author Marek Kotewicz * @date 2015 @@ -933,13 +856,13 @@ module.exports = { /** * Utils - * + * * @module utils */ /** * Utility functions - * + * * @class [utils] utils * @constructor */ @@ -978,7 +901,7 @@ var padLeft = function (string, chars, sign) { return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; }; -/** +/** * Should be called to get sting from it's hex representation * * @method toAscii @@ -1003,9 +926,9 @@ var toAscii = function(hex) { return str; }; - + /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of ascii string * * @method toHexNative * @param {String} string @@ -1022,7 +945,7 @@ var toHexNative = function(str) { }; /** - * Shold be called to get hex representation (prefixed by 0x) of ascii string + * Shold be called to get hex representation (prefixed by 0x) of ascii string * * @method fromAscii * @param {String} string @@ -1055,13 +978,13 @@ var transformToFullName = function (json) { /** * Should be called to get display name of contract function - * + * * @method extractDisplayName * @param {String} name of function/event * @returns {String} display name for function/event eg. multiply(uint256) -> multiply */ var extractDisplayName = function (name) { - var length = name.indexOf('('); + var length = name.indexOf('('); return length !== -1 ? name.substr(0, length) : name; }; @@ -1169,7 +1092,7 @@ var getValueOfUnit = function (unit) { var fromWei = function(number, unit) { var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -1195,7 +1118,7 @@ var fromWei = function(number, unit) { var toWei = function(number, unit) { var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); - return isBigNumber(number) ? returnValue : returnValue.toString(10); + return isBigNumber(number) ? returnValue : returnValue.toString(10); }; /** @@ -1214,7 +1137,7 @@ var toBigNumber = function(number) { if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { return new BigNumber(number.replace('0x',''), 16); } - + return new BigNumber(number.toString(10), 10); }; @@ -1266,7 +1189,7 @@ var toAddress = function (address) { if (isStrictAddress(address)) { return address; } - + if (/^[0-9a-f]{40}$/.test(address)) { return '0x' + address; } @@ -1274,12 +1197,13 @@ var toAddress = function (address) { return '0x' + padLeft(toHex(address).substr(2), 40); }; + /** * Returns true if object is BigNumber, otherwise false * * @method isBigNumber * @param {Object} - * @return {Boolean} + * @return {Boolean} */ var isBigNumber = function (object) { return object instanceof BigNumber || @@ -1288,7 +1212,7 @@ var isBigNumber = function (object) { /** * Returns true if object is string, otherwise false - * + * * @method isString * @param {Object} * @return {Boolean} @@ -1339,12 +1263,12 @@ var isBoolean = function (object) { * @return {Boolean} */ var isArray = function (object) { - return object instanceof Array; + return object instanceof Array; }; /** * Returns true if given string is valid json object - * + * * @method isJson * @param {String} * @return {Boolean} @@ -1384,12 +1308,12 @@ module.exports = { }; -},{"bignumber.js":"bignumber.js"}],9:[function(require,module,exports){ +},{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){ module.exports={ - "version": "0.3.5" + "version": "0.4.2" } -},{}],10:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1427,16 +1351,9 @@ var utils = require('./utils/utils'); var formatters = require('./web3/formatters'); var RequestManager = require('./web3/requestmanager'); var c = require('./utils/config'); -var Method = require('./web3/method'); var Property = require('./web3/property'); - -var web3Methods = [ - new Method({ - name: 'sha3', - call: 'web3_sha3', - params: 1 - }) -]; +var Batch = require('./web3/batch'); +var sha3 = require('./utils/sha3'); var web3Properties = [ new Property({ @@ -1521,6 +1438,10 @@ web3.toBigNumber = utils.toBigNumber; web3.toWei = utils.toWei; web3.fromWei = utils.fromWei; web3.isAddress = utils.isAddress; +web3.sha3 = sha3; +web3.createBatch = function () { + return new Batch(); +}; // ADD defaultblock Object.defineProperty(web3.eth, 'defaultBlock', { @@ -1544,7 +1465,6 @@ Object.defineProperty(web3.eth, 'defaultAccount', { }); /// setups all api methods -setupMethods(web3, web3Methods); setupProperties(web3, web3Properties); setupMethods(web3.net, net.methods); setupProperties(web3.net, net.properties); @@ -1556,7 +1476,7 @@ setupMethods(web3.shh, shh.methods); module.exports = web3; -},{"./utils/config":7,"./utils/utils":8,"./version.json":9,"./web3/db":12,"./web3/eth":14,"./web3/filter":16,"./web3/formatters":17,"./web3/method":21,"./web3/net":22,"./web3/property":23,"./web3/requestmanager":25,"./web3/shh":26,"./web3/watches":27}],11:[function(require,module,exports){ +},{"./utils/config":5,"./utils/sha3":6,"./utils/utils":7,"./version.json":8,"./web3/batch":10,"./web3/db":12,"./web3/eth":14,"./web3/filter":16,"./web3/formatters":17,"./web3/net":22,"./web3/property":23,"./web3/requestmanager":25,"./web3/shh":26,"./web3/watches":27}],10:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1573,20 +1493,109 @@ module.exports = web3; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** + * @file batch.js + * @author Marek Kotewicz + * @date 2015 + */ + +var RequestManager = require('./requestmanager'); + +var Batch = function () { + this.requests = []; +}; + +/** + * Should be called to add create new request to batch request + * + * @method add + * @param {Object} jsonrpc requet object + */ +Batch.prototype.add = function (request) { + this.requests.push(request); +}; + +/** + * Should be called to execute batch request + * + * @method execute + */ +Batch.prototype.execute = function () { + var requests = this.requests; + RequestManager.getInstance().sendBatch(requests, function (err, results) { + results = results || []; + requests.map(function (request, index) { + return results[index] || {}; + }).map(function (result, index) { + return requests[index].format ? requests[index].format(result.result) : result.result; + }).forEach(function (result, index) { + if (requests[index].callback) { + requests[index].callback(err, result); + } + }); + }); +}; + +module.exports = Batch; + + +},{"./requestmanager":25}],11:[function(require,module,exports){ +/* + This file is part of ethereum.js. + + ethereum.js is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethereum.js is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with ethereum.js. If not, see . +*/ +/** * @file contract.js * @author Marek Kotewicz * @date 2014 */ -var web3 = require('../web3'); -var solAbi = require('../solidity/abi'); +var web3 = require('../web3'); var utils = require('../utils/utils'); +var coder = require('../solidity/coder'); var SolidityEvent = require('./event'); var SolidityFunction = require('./function'); -var addFunctionsToContract = function (contract, desc) { - desc.filter(function (json) { +/** + * Should be called to encode constructor params + * + * @method encodeConstructorParams + * @param {Array} abi + * @param {Array} constructor params + */ +var encodeConstructorParams = function (abi, params) { + return abi.filter(function (json) { + return json.type === 'constructor' && json.inputs.length === params.length; + }).map(function (json) { + return json.inputs.map(function (input) { + return input.type; + }); + }).map(function (types) { + return coder.encodeParams(types, params); + })[0] || ''; +}; + +/** + * Should be called to add functions to contract object + * + * @method addFunctionsToContract + * @param {Contract} contract + * @param {Array} abi + */ +var addFunctionsToContract = function (contract, abi) { + abi.filter(function (json) { return json.type === 'function'; }).map(function (json) { return new SolidityFunction(json, contract.address); @@ -1595,8 +1604,15 @@ var addFunctionsToContract = function (contract, desc) { }); }; -var addEventsToContract = function (contract, desc) { - desc.filter(function (json) { +/** + * Should be called to add events to contract object + * + * @method addEventsToContract + * @param {Contract} contract + * @param {Array} abi + */ +var addEventsToContract = function (contract, abi) { + abi.filter(function (json) { return json.type === 'event'; }).map(function (json) { return new SolidityEvent(json, contract.address); @@ -1606,65 +1622,106 @@ var addEventsToContract = function (contract, desc) { }; /** - * This method should be called when we want to call / transact some solidity method from javascript - * it returns an object which has same methods available as solidity contract description - * usage example: + * Should be called to create new ContractFactory * - * var abi = [{ - * name: 'myMethod', - * inputs: [{ name: 'a', type: 'string' }], - * outputs: [{name: 'd', type: 'string' }] - * }]; // contract abi - * - * var MyContract = web3.eth.contract(abi); // creation of contract prototype - * - * var contractInstance = new MyContract('0x0123123121'); - * - * contractInstance.myMethod('this is test string param for call'); // myMethod call (implicit, default) - * contractInstance.call().myMethod('this is test string param for call'); // myMethod call (explicit) - * contractInstance.sendTransaction().myMethod('this is test string param for transact'); // myMethod sendTransaction - * - * @param abi - abi json description of the contract, which is being created - * @returns contract object + * @method contract + * @param {Array} abi + * @returns {ContractFactory} new contract factory */ var contract = function (abi) { - - // return prototype - return Contract.bind(null, abi); + return new ContractFactory(abi); }; -var Contract = function (abi, options) { +/** + * Should be called to create new ContractFactory instance + * + * @method ContractFactory + * @param {Array} abi + */ +var ContractFactory = function (abi) { + this.abi = abi; +}; - this.address = ''; - if (utils.isAddress(options)) { - this.address = options; - } else { // is an object! - // TODO, parse the rest of the args - options = options || {}; - var args = Array.prototype.slice.call(arguments, 2); - var bytes = solAbi.formatConstructorParams(abi, args); - options.data += bytes; - this.address = web3.eth.sendTransaction(options); +/** + * Should be called to create new contract on a blockchain + * + * @method new + * @param {Any} contract constructor param1 (optional) + * @param {Any} contract constructor param2 (optional) + * @param {Object} contract transaction object (required) + * @param {Function} callback + * @returns {Contract} returns contract if no callback was passed, + * otherwise calls callback function (err, contract) + */ +ContractFactory.prototype.new = function () { + // parse arguments + var options = {}; // required! + var callback; + + var args = Array.prototype.slice.call(arguments); + if (utils.isFunction(args[args.length - 1])) { + callback = args.pop(); } + var last = args[args.length - 1]; + if (utils.isObject(last) && !utils.isArray(last)) { + options = args.pop(); + } + + // throw an error if there are no options + + var bytes = encodeConstructorParams(this.abi, args); + options.data += bytes; + + if (!callback) { + var address = web3.eth.sendTransaction(options); + return this.at(address); + } + + var self = this; + web3.eth.sendTransaction(options, function (err, address) { + if (err) { + callback(err); + } + self.at(address, callback); + }); +}; + +/** + * Should be called to get access to existing contract on a blockchain + * + * @method at + * @param {Address} contract address (required) + * @param {Function} callback {optional) + * @returns {Contract} returns contract if no callback was passed, + * otherwise calls callback function (err, contract) + */ +ContractFactory.prototype.at = function (address, callback) { + // TODO: address is required + + if (callback) { + callback(null, new Contract(this.abi, address)); + } + return new Contract(this.abi, address); +}; + +/** + * Should be called to create new contract instance + * + * @method Contract + * @param {Array} abi + * @param {Address} contract address + */ +var Contract = function (abi, address) { + this.address = address; addFunctionsToContract(this, abi); addEventsToContract(this, abi); }; -Contract.prototype.call = function () { - console.error('contract.call is deprecated'); - return this; -}; - -Contract.prototype.sendTransaction = function () { - console.error('contract.sendTransact is deprecated'); - return this; -}; - module.exports = contract; -},{"../solidity/abi":1,"../utils/utils":8,"../web3":10,"./event":15,"./function":18}],12:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/utils":7,"../web3":9,"./event":15,"./function":18}],12:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -1739,7 +1796,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file errors.js * @author Marek Kotewicz * @date 2015 @@ -1925,12 +1982,6 @@ var getTransactionCount = new Method({ outputFormatter: utils.toDecimal }); -var sign = new Method({ - name: 'sign', - call: 'eth_sign', - params: 1 -}); - var sendTransaction = new Method({ name: 'sendTransaction', call: 'eth_sendTransaction', @@ -1945,6 +1996,14 @@ var call = new Method({ inputFormatter: [formatters.inputTransactionFormatter, formatters.inputDefaultBlockNumberFormatter] }); +var estimateGas = new Method({ + name: 'estimateGas', + call: 'eth_estimateGas', + params: 1, + inputFormatter: [formatters.inputTransactionFormatter], + outputFormatter: utils.toDecimal +}); + var compileSolidity = new Method({ name: 'compile.solidity', call: 'eth_compileSolidity', @@ -1963,6 +2022,18 @@ var compileSerpent = new Method({ params: 1 }); +var submitWork = new Method({ + name: 'submitWork', + call: 'eth_submitWork', + params: 3 +}); + +var getWork = new Method({ + name: 'getWork', + call: 'eth_getWork', + params: 0 +}); + var methods = [ getBalance, getStorageAt, @@ -1976,11 +2047,13 @@ var methods = [ getTransactionFromBlock, getTransactionCount, call, - sign, + estimateGas, sendTransaction, compileSolidity, compileLLL, compileSerpent, + submitWork, + getWork ]; /// @returns an array of objects describing web3.eth api properties @@ -2023,7 +2096,7 @@ module.exports = { }; -},{"../utils/utils":8,"./formatters":17,"./method":21,"./property":23}],15:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":17,"./method":21,"./property":23}],15:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2040,7 +2113,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file event.js * @author Marek Kotewicz * @date 2014 @@ -2050,6 +2123,7 @@ var utils = require('../utils/utils'); var coder = require('../solidity/coder'); var web3 = require('../web3'); var formatters = require('./formatters'); +var sha3 = require('../utils/sha3'); /** * This prototype should be used to create event filters @@ -2103,12 +2177,12 @@ SolidityEvent.prototype.typeName = function () { * @return {String} event signature */ SolidityEvent.prototype.signature = function () { - return web3.sha3(web3.fromAscii(this._name)).slice(2); + return sha3(this._name); }; /** * Should be used to encode indexed params and options to one final object - * + * * @method encode * @param {Object} indexed * @param {Object} options @@ -2139,7 +2213,7 @@ SolidityEvent.prototype.encode = function (indexed, options) { if (value === undefined || value === null) { return null; } - + if (utils.isArray(value)) { return value.map(function (v) { return '0x' + coder.encodeParam(i.type, v); @@ -2161,17 +2235,17 @@ SolidityEvent.prototype.encode = function (indexed, options) { * @return {Object} result object with decoded indexed && not indexed params */ SolidityEvent.prototype.decode = function (data) { - + data.data = data.data || ''; data.topics = data.topics || []; var argTopics = this._anonymous ? data.topics : data.topics.slice(1); var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); - var indexedParams = coder.decodeParams(this.types(true), indexedData); + var indexedParams = coder.decodeParams(this.types(true), indexedData); var notIndexedData = data.data.slice(2); var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); - + var result = formatters.outputLogFormatter(data); result.event = this.displayName(); result.address = data.address; @@ -2219,7 +2293,7 @@ SolidityEvent.prototype.attachToContract = function (contract) { module.exports = SolidityEvent; -},{"../solidity/coder":2,"../utils/utils":8,"../web3":10,"./formatters":17}],16:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"../web3":9,"./formatters":17}],16:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2276,7 +2350,7 @@ var getOptions = function (options) { if (utils.isString(options)) { return options; - } + } options = options || {}; @@ -2292,8 +2366,8 @@ var getOptions = function (options) { to: options.to, address: options.address, fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), - toBlock: formatters.inputBlockNumberFormatter(options.toBlock) - }; + toBlock: formatters.inputBlockNumberFormatter(options.toBlock) + }; }; var Filter = function (options, methods, formatter) { @@ -2376,7 +2450,7 @@ Filter.prototype.get = function (callback) { module.exports = Filter; -},{"../utils/utils":8,"./formatters":17,"./requestmanager":25}],17:[function(require,module,exports){ +},{"../utils/utils":7,"./formatters":17,"./requestmanager":25}],17:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2393,7 +2467,7 @@ module.exports = Filter; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file formatters.js * @author Marek Kotewicz * @author Fabian Vogelsteller @@ -2451,18 +2525,18 @@ var inputTransactionFormatter = function (options){ delete options.code; } - ['gasPrice', 'gas', 'value'].filter(function (key) { + ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { return options[key] !== undefined; }).forEach(function(key){ options[key] = utils.fromDecimal(options[key]); }); - return options; + return options; }; /** * Formats the output of a transaction to its proper values - * + * * @method outputTransactionFormatter * @param {Object} transaction * @returns {Object} transaction @@ -2481,7 +2555,7 @@ var outputTransactionFormatter = function (tx){ * Formats the output of a block to its proper values * * @method outputBlockFormatter - * @param {Object} block object + * @param {Object} block object * @returns {Object} block object */ var outputBlockFormatter = function(block) { @@ -2508,7 +2582,7 @@ var outputBlockFormatter = function(block) { /** * Formats the output of a log - * + * * @method outputLogFormatter * @param {Object} log object * @returns {Object} log @@ -2549,7 +2623,7 @@ var inputPostFormatter = function(post) { return utils.fromAscii(topic); }); - return post; + return post; }; /** @@ -2596,7 +2670,7 @@ module.exports = { }; -},{"../utils/config":7,"../utils/utils":8}],18:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7}],18:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2613,7 +2687,7 @@ module.exports = { You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file function.js * @author Marek Kotewicz * @date 2015 @@ -2622,6 +2696,7 @@ module.exports = { var web3 = require('../web3'); var coder = require('../solidity/coder'); var utils = require('../utils/utils'); +var sha3 = require('../utils/sha3'); /** * This prototype should be used to call/sendTransaction to solidity functions @@ -2638,18 +2713,23 @@ var SolidityFunction = function (json, address) { this._address = address; }; +SolidityFunction.prototype.extractCallback = function (args) { + if (utils.isFunction(args[args.length - 1])) { + return args.pop(); // modify the args array! + } +}; + /** * Should be used to create payload from arguments * * @method toPayload - * @param {...} solidity function params + * @param {Array} solidity function params * @param {Object} optional payload options */ -SolidityFunction.prototype.toPayload = function () { - var args = Array.prototype.slice.call(arguments); +SolidityFunction.prototype.toPayload = function (args) { var options = {}; if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { - options = args.pop(); + options = args[args.length - 1]; } options.to = this._address; options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); @@ -2663,24 +2743,46 @@ SolidityFunction.prototype.toPayload = function () { * @return {String} function signature */ SolidityFunction.prototype.signature = function () { - return web3.sha3(web3.fromAscii(this._name)).slice(2, 10); + return sha3(this._name).slice(0, 8); }; -/** - * Should be used to call function - * - * @method call - * @param {Object} options - * @return {String} output bytes - */ -SolidityFunction.prototype.call = function () { - var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments)); - var output = web3.eth.call(payload); + +SolidityFunction.prototype.unpackOutput = function (output) { + if (output === null) { + return; + } + output = output.length >= 2 ? output.slice(2) : output; var result = coder.decodeParams(this._outputTypes, output); return result.length === 1 ? result[0] : result; }; +/** + * Calls a contract function. + * + * @method call + * @param {...Object} Contract function arguments + * @param {function} If the last argument is a function, the contract function + * call will be asynchronous, and the callback will be passed the + * error and result. + * @return {String} output bytes + */ +SolidityFunction.prototype.call = function () { + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + + if (!callback) { + var output = web3.eth.call(payload); + return this.unpackOutput(output); + } + + var self = this; + web3.eth.call(payload, function (error, output) { + callback(error, self.unpackOutput(output)); + }); +}; + /** * Should be used to sendTransaction to solidity function * @@ -2688,8 +2790,16 @@ SolidityFunction.prototype.call = function () { * @param {Object} options */ SolidityFunction.prototype.sendTransaction = function () { - var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments)); - web3.eth.sendTransaction(payload); + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + + if (!callback) { + web3.eth.sendTransaction(payload); + return; + } + + web3.eth.sendTransaction(payload, callback); }; /** @@ -2704,7 +2814,7 @@ SolidityFunction.prototype.displayName = function () { /** * Should be used to get function type name - * + * * @method typeName * @return {String} type name of the function */ @@ -2712,6 +2822,25 @@ SolidityFunction.prototype.typeName = function () { return utils.extractTypeName(this._name); }; +/** + * Should be called to get rpc requests from solidity function + * + * @method request + * @returns {Object} + */ +SolidityFunction.prototype.request = function () { + var args = Array.prototype.slice.call(arguments); + var callback = this.extractCallback(args); + var payload = this.toPayload(args); + var format = this.unpackOutput.bind(this); + + return { + callback: callback, + payload: payload, + format: format + }; +}; + /** * Should be called to execute function * @@ -2719,7 +2848,7 @@ SolidityFunction.prototype.typeName = function () { */ SolidityFunction.prototype.execute = function () { var transaction = !this._constant; - + // send transaction if (transaction) { return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); @@ -2737,6 +2866,7 @@ SolidityFunction.prototype.execute = function () { */ SolidityFunction.prototype.attachToContract = function (contract) { var execute = this.execute.bind(this); + execute.request = this.request.bind(this); execute.call = this.call.bind(this); execute.sendTransaction = this.sendTransaction.bind(this); var displayName = this.displayName(); @@ -2749,7 +2879,7 @@ SolidityFunction.prototype.attachToContract = function (contract) { module.exports = SolidityFunction; -},{"../solidity/coder":2,"../utils/utils":8,"../web3":10}],19:[function(require,module,exports){ +},{"../solidity/coder":1,"../utils/sha3":6,"../utils/utils":7,"../web3":9}],19:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2787,7 +2917,7 @@ HttpProvider.prototype.send = function (payload) { var request = new XMLHttpRequest(); request.open('POST', this.host, false); - + try { request.send(JSON.stringify(payload)); } catch(error) { @@ -2800,15 +2930,32 @@ HttpProvider.prototype.send = function (payload) { //if (request.status !== 200) { //return; //} - return JSON.parse(request.responseText); + + var result = request.responseText; + + try { + result = JSON.parse(result); + } catch(e) { + throw errors.InvalidResponse(result); + } + + return result; }; HttpProvider.prototype.sendAsync = function (payload, callback) { var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState === 4) { - // TODO: handle the error properly here!!! - callback(null, JSON.parse(request.responseText)); + var result = request.responseText; + var error = null; + + try { + result = JSON.parse(result); + } catch(e) { + error = errors.InvalidResponse(result); + } + + callback(error, result); } }; @@ -2824,7 +2971,7 @@ HttpProvider.prototype.sendAsync = function (payload, callback) { module.exports = HttpProvider; -},{"./errors":13,"xmlhttprequest":6}],20:[function(require,module,exports){ +},{"./errors":13,"xmlhttprequest":4}],20:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -2974,12 +3121,11 @@ Method.prototype.extractCallback = function (args) { if (utils.isFunction(args[args.length - 1])) { return args.pop(); // modify the args array! } - return null; }; /** * Should be called to check if the number of arguments is correct - * + * * @method validateArgs * @param {Array} arguments * @throws {Error} if it is not @@ -2992,7 +3138,7 @@ Method.prototype.validateArgs = function (args) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -3020,20 +3166,21 @@ Method.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} */ Method.prototype.attachToObject = function (obj) { var func = this.send.bind(this); + func.request = this.request.bind(this); func.call = this.call; // that's ugly. filter.js uses it var name = this.name.split('.'); if (name.length > 1) { obj[name[0]] = obj[name[0]] || {}; obj[name[0]][name[1]] = func; } else { - obj[name[0]] = func; + obj[name[0]] = func; } }; @@ -3057,6 +3204,19 @@ Method.prototype.toPayload = function (args) { }; }; +/** + * Should be called to create pure JSONRPC request which can be used in batch request + * + * @method request + * @param {...} params + * @return {Object} jsonrpc request + */ +Method.prototype.request = function () { + var payload = this.toPayload(Array.prototype.slice.call(arguments)); + payload.format = this.formatOutput.bind(this); + return payload; +}; + /** * Should send request to the API * @@ -3069,7 +3229,7 @@ Method.prototype.send = function () { if (payload.callback) { var self = this; return RequestManager.getInstance().sendAsync(payload, function (err, result) { - payload.callback(null, self.formatOutput(result)); + payload.callback(err, self.formatOutput(result)); }); } return this.formatOutput(RequestManager.getInstance().send(payload)); @@ -3078,7 +3238,7 @@ Method.prototype.send = function () { module.exports = Method; -},{"../utils/utils":8,"./errors":13,"./requestmanager":25}],22:[function(require,module,exports){ +},{"../utils/utils":7,"./errors":13,"./requestmanager":25}],22:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3128,7 +3288,7 @@ module.exports = { }; -},{"../utils/utils":8,"./property":23}],23:[function(require,module,exports){ +},{"../utils/utils":7,"./property":23}],23:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3164,7 +3324,7 @@ var Property = function (options) { /** * Should be called to format input args of method - * + * * @method formatInput * @param {Array} * @return {Array} @@ -3186,7 +3346,7 @@ Property.prototype.formatOutput = function (result) { /** * Should attach function to method - * + * * @method attachToObject * @param {Object} * @param {Function} @@ -3194,16 +3354,23 @@ Property.prototype.formatOutput = function (result) { Property.prototype.attachToObject = function (obj) { var proto = { get: this.get.bind(this), - set: this.set.bind(this) }; - var name = this.name.split('.'); - if (name.length > 1) { - obj[name[0]] = obj[name[0]] || {}; - Object.defineProperty(obj[name[0]], name[1], proto); - } else { - Object.defineProperty(obj, name[0], proto); + var names = this.name.split('.'); + var name = names[0]; + if (names.length > 1) { + obj[names[0]] = obj[names[0]] || {}; + obj = obj[names[0]]; + name = names[1]; } + + Object.defineProperty(obj, name, proto); + + var toAsyncName = function (prefix, name) { + return prefix + name.charAt(0).toUpperCase() + name.slice(1); + }; + + obj[toAsyncName('get', name)] = this.getAsync.bind(this); }; /** @@ -3219,15 +3386,20 @@ Property.prototype.get = function () { }; /** - * Should be used to set value of the property + * Should be used to asynchrounously get value of property * - * @method set - * @param {Object} new value of the property + * @method getAsync + * @param {Function} */ -Property.prototype.set = function (value) { - return RequestManager.getInstance().send({ - method: this.setter, - params: [this.formatInput(value)] +Property.prototype.getAsync = function (callback) { + var self = this; + RequestManager.getInstance().sendAsync({ + method: this.getter + }, function (err, result) { + if (err) { + return callback(err); + } + callback(err, self.formatOutput(result)); }); }; @@ -3286,7 +3458,7 @@ module.exports = QtSyncProvider; You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file requestmanager.js * @author Jeffrey Wilcke * @author Marek Kotewicz @@ -3368,7 +3540,7 @@ RequestManager.prototype.sendAsync = function (data, callback) { if (err) { return callback(err); } - + if (!Jsonrpc.getInstance().isValidResponse(result)) { return callback(errors.InvalidResponse(result)); } @@ -3377,6 +3549,33 @@ RequestManager.prototype.sendAsync = function (data, callback) { }); }; +/** + * Should be called to asynchronously send batch request + * + * @method sendBatch + * @param {Array} batch data + * @param {Function} callback + */ +RequestManager.prototype.sendBatch = function (data, callback) { + if (!this.provider) { + return callback(errors.InvalidProvider()); + } + + var payload = Jsonrpc.getInstance().toBatchPayload(data); + + this.provider.sendAsync(payload, function (err, results) { + if (err) { + return callback(err); + } + + if (!utils.isArray(results)) { + return callback(errors.InvalidResponse(results)); + } + + callback(err, results); + }); +}; + /** * Should be used to set provider of request manager * @@ -3427,7 +3626,7 @@ RequestManager.prototype.stopPolling = function (pollId) { */ RequestManager.prototype.reset = function () { this.polls.forEach(function (poll) { - poll.uninstall(poll.id); + poll.uninstall(poll.id); }); this.polls = []; @@ -3465,7 +3664,7 @@ RequestManager.prototype.poll = function () { if (error) { return; } - + if (!utils.isArray(results)) { throw errors.InvalidResponse(results); } @@ -3490,7 +3689,7 @@ RequestManager.prototype.poll = function () { module.exports = RequestManager; -},{"../utils/config":7,"../utils/utils":8,"./errors":13,"./jsonrpc":20}],26:[function(require,module,exports){ +},{"../utils/config":5,"../utils/utils":7,"./errors":13,"./jsonrpc":20}],26:[function(require,module,exports){ /* This file is part of ethereum.js. @@ -3517,8 +3716,8 @@ var Method = require('./method'); var formatters = require('./formatters'); var post = new Method({ - name: 'post', - call: 'shh_post', + name: 'post', + call: 'shh_post', params: 1, inputFormatter: [formatters.inputPostFormatter] }); @@ -3588,7 +3787,20 @@ var Method = require('./method'); /// @returns an array of objects describing web3.eth.filter api methods var eth = function () { var newFilterCall = function (args) { - return typeof args[0] === 'string' ? 'eth_newBlockFilter' : 'eth_newFilter'; + var type = args[0]; + + switch(type) { + case 'latest': + args.pop(); + this.params = 0; + return 'eth_newBlockFilter'; + case 'pending': + args.pop(); + this.params = 0; + return 'eth_newPendingTransactionFilter'; + default: + return 'eth_newFilter'; + } }; var newFilter = new Method({ @@ -3665,7 +3877,1382 @@ module.exports = { },{"./method":21}],28:[function(require,module,exports){ -},{}],"bignumber.js":[function(require,module,exports){ +},{}],29:[function(require,module,exports){ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + function F() {} + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + F.prototype = this; + var subtype = new F(); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init')) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else if (thatWords.length > 0xffff) { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } else { + // Copy all words at once + thisWords.push.apply(thisWords, thatWords); + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + return CryptoJS; + +})); +},{}],30:[function(require,module,exports){ +;(function (root, factory, undef) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core"), require("./x64-core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core", "./x64-core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + return CryptoJS.SHA3; + +})); +},{"./core":29,"./x64-core":31}],31:[function(require,module,exports){ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(require("./core")); + } + else if (typeof define === "function" && define.amd) { + // AMD + define(["./core"], factory); + } + else { + // Global (browser) + factory(root.CryptoJS); + } +}(this, function (CryptoJS) { + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + return CryptoJS; + +})); +},{"./core":29}],"bignumber.js":[function(require,module,exports){ 'use strict'; module.exports = BigNumber; // jshint ignore:line @@ -3676,7 +5263,6 @@ var web3 = require('./lib/web3'); web3.providers.HttpProvider = require('./lib/web3/httpprovider'); web3.providers.QtSyncProvider = require('./lib/web3/qtsync'); web3.eth.contract = require('./lib/web3/contract'); -web3.abi = require('./lib/solidity/abi'); // dont override global variable if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') { @@ -3686,7 +5272,7 @@ if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') { module.exports = web3; -},{"./lib/solidity/abi":1,"./lib/web3":10,"./lib/web3/contract":11,"./lib/web3/httpprovider":19,"./lib/web3/qtsync":24}]},{},["web3"]) +},{"./lib/web3":9,"./lib/web3/contract":11,"./lib/web3/httpprovider":19,"./lib/web3/qtsync":24}]},{},["web3"]) //# sourceMappingURL=web3-light.js.map From b0ae84aa0dae65f00492f981bb61887331def2a5 Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 04:11:48 +0100 Subject: [PATCH 42/59] multiple contract source for solidity compiler: returns contract array if multiple contracts. fixes #1023 --- cmd/geth/js_test.go | 6 +- common/compiler/solidity.go | 99 ++++++++++++++++---------------- common/compiler/solidity_test.go | 16 ++++-- rpc/api.go | 5 +- rpc/api_test.go | 24 ++++---- xeth/xeth.go | 7 +++ 6 files changed, 87 insertions(+), 70 deletions(-) diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 8ffef49700..71c1fedb9e 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -234,7 +234,7 @@ func TestSignature(t *testing.T) { // This is a very preliminary test, lacking actual signature verification if err != nil { - t.Errorf("Error runnig js: %v", err) + t.Errorf("Error running js: %v", err) return } output := val.String() @@ -297,7 +297,7 @@ func TestContract(t *testing.T) { t.Errorf("%v", err) } } else { - checkEvalJSON(t, repl, `contract = eth.compile.solidity(source)`, string(contractInfo)) + checkEvalJSON(t, repl, `contract = eth.compile.solidity(source).test`, string(contractInfo)) } checkEvalJSON(t, repl, `contract.code`, `"0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056"`) @@ -310,7 +310,7 @@ func TestContract(t *testing.T) { callSetup := `abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]'); Multiply7 = eth.contract(abiDef); -multiply7 = new Multiply7(contractaddress); +multiply7 = Multiply7.at(contractaddress); ` // time.Sleep(1500 * time.Millisecond) _, err = repl.re.Run(callSetup) diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 19d5849fb3..0cfd41c95c 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -92,7 +92,7 @@ func (sol *Solidity) Version() string { return sol.version } -func (sol *Solidity) Compile(source string) (contract *Contract, err error) { +func (sol *Solidity) Compile(source string) (contracts map[string]*Contract, err error) { if len(source) == 0 { err = fmt.Errorf("empty source") @@ -123,58 +123,61 @@ func (sol *Solidity) Compile(source string) (contract *Contract, err error) { err = fmt.Errorf("solc error: missing code output") return } - if len(matches) > 1 { - err = fmt.Errorf("multi-contract sources are not supported") - return - } - _, file := filepath.Split(matches[0]) - base := strings.Split(file, ".")[0] - codeFile := filepath.Join(wd, base+".binary") - abiDefinitionFile := filepath.Join(wd, base+".abi") - userDocFile := filepath.Join(wd, base+".docuser") - developerDocFile := filepath.Join(wd, base+".docdev") + contracts = make(map[string]*Contract) + for _, path := range matches { + _, file := filepath.Split(path) + base := strings.Split(file, ".")[0] - code, err := ioutil.ReadFile(codeFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for code: %v", err) - return - } - abiDefinitionJson, err := ioutil.ReadFile(abiDefinitionFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) - return - } - var abiDefinition interface{} - err = json.Unmarshal(abiDefinitionJson, &abiDefinition) + codeFile := filepath.Join(wd, base+".binary") + abiDefinitionFile := filepath.Join(wd, base+".abi") + userDocFile := filepath.Join(wd, base+".docuser") + developerDocFile := filepath.Join(wd, base+".docdev") - userDocJson, err := ioutil.ReadFile(userDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for userDoc: %v", err) - return - } - var userDoc interface{} - err = json.Unmarshal(userDocJson, &userDoc) + var code, abiDefinitionJson, userDocJson, developerDocJson []byte + code, err = ioutil.ReadFile(codeFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for code: %v", err) + return + } + abiDefinitionJson, err = ioutil.ReadFile(abiDefinitionFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for abiDefinition: %v", err) + return + } + var abiDefinition interface{} + err = json.Unmarshal(abiDefinitionJson, &abiDefinition) - developerDocJson, err := ioutil.ReadFile(developerDocFile) - if err != nil { - err = fmt.Errorf("error reading compiler output for developerDoc: %v", err) - return - } - var developerDoc interface{} - err = json.Unmarshal(developerDocJson, &developerDoc) + userDocJson, err = ioutil.ReadFile(userDocFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for userDoc: %v", err) + return + } + var userDoc interface{} + err = json.Unmarshal(userDocJson, &userDoc) - contract = &Contract{ - Code: "0x" + string(code), - Info: ContractInfo{ - Source: source, - Language: "Solidity", - LanguageVersion: languageVersion, - CompilerVersion: sol.version, - AbiDefinition: abiDefinition, - UserDoc: userDoc, - DeveloperDoc: developerDoc, - }, + developerDocJson, err = ioutil.ReadFile(developerDocFile) + if err != nil { + err = fmt.Errorf("error reading compiler output for developerDoc: %v", err) + return + } + var developerDoc interface{} + err = json.Unmarshal(developerDocJson, &developerDoc) + + contract := &Contract{ + Code: "0x" + string(code), + Info: ContractInfo{ + Source: source, + Language: "Solidity", + LanguageVersion: languageVersion, + CompilerVersion: sol.version, + AbiDefinition: abiDefinition, + UserDoc: userDoc, + DeveloperDoc: developerDoc, + }, + } + + contracts[base] = contract } return diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 2b0ca148fe..46f733e59d 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -33,14 +33,18 @@ func TestCompiler(t *testing.T) { } else if sol.Version() != solcVersion { t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } - contract, err := sol.Compile(source) + contracts, err := sol.Compile(source) if err != nil { - t.Errorf("error compiling source. result %v: %v", contract, err) + t.Errorf("error compiling source. result %v: %v", contracts, err) return } - if contract.Code != code { - t.Errorf("wrong code, expected\n%s, got\n%s", code, contract.Code) + if len(contracts) != 1 { + t.Errorf("one contract expected, got\n%s", len(contracts)) + } + + if contracts["test"].Code != code { + t.Errorf("wrong code, expected\n%s, got\n%s", code, contracts["test"].Code) } } @@ -52,9 +56,9 @@ func TestCompileError(t *testing.T) { } else if sol.Version() != solcVersion { t.Logf("WARNING: a newer version of solc found (%v, expect %v)", sol.Version(), solcVersion) } - contract, err := sol.Compile(source[2:]) + contracts, err := sol.Compile(source[2:]) if err == nil { - t.Errorf("error expected compiling source. got none. result %v", contract) + t.Errorf("error expected compiling source. got none. result %v", contracts) return } } diff --git a/rpc/api.go b/rpc/api.go index 0c1409d71b..4b705c7812 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -355,12 +355,11 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return err } - contract, err := solc.Compile(args.Source) + contracts, err := solc.Compile(args.Source) if err != nil { return err } - contract.Code = newHexData(contract.Code).String() - *reply = contract + *reply = contracts case "eth_newFilter": args := new(BlockFilterArgs) diff --git a/rpc/api_test.go b/rpc/api_test.go index 263e9666d7..d1dcad2667 100644 --- a/rpc/api_test.go +++ b/rpc/api_test.go @@ -2,14 +2,11 @@ package rpc import ( "encoding/json" - // "sync" - "testing" - // "time" - // "fmt" - "io/ioutil" "strconv" + "testing" "github.com/ethereum/go-ethereum/common/compiler" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/xeth" ) @@ -58,7 +55,7 @@ func TestCompileSolidity(t *testing.T) { expLanguageVersion := "0" expSource := source - api := NewEthereumApi(&xeth.XEth{}) + api := NewEthereumApi(xeth.NewTest(ð.Ethereum{}, nil)) var req RpcRequest json.Unmarshal([]byte(jsonstr), &req) @@ -73,12 +70,18 @@ func TestCompileSolidity(t *testing.T) { t.Errorf("expected no error, got %v", err) } - var contract = compiler.Contract{} - err = json.Unmarshal(respjson, &contract) + var contracts = make(map[string]*compiler.Contract) + err = json.Unmarshal(respjson, &contracts) if err != nil { t.Errorf("expected no error, got %v", err) } + if len(contracts) != 1 { + t.Errorf("expected one contract, got %v", len(contracts)) + } + + contract := contracts["test"] + if contract.Code != expCode { t.Errorf("Expected \n%s got \n%s", expCode, contract.Code) } @@ -86,12 +89,15 @@ func TestCompileSolidity(t *testing.T) { if strconv.Quote(contract.Info.Source) != `"`+expSource+`"` { t.Errorf("Expected \n'%s' got \n'%s'", expSource, strconv.Quote(contract.Info.Source)) } + if contract.Info.Language != expLanguage { t.Errorf("Expected %s got %s", expLanguage, contract.Info.Language) } + if contract.Info.LanguageVersion != expLanguageVersion { t.Errorf("Expected %s got %s", expLanguageVersion, contract.Info.LanguageVersion) } + if contract.Info.CompilerVersion != expCompilerVersion { t.Errorf("Expected %s got %s", expCompilerVersion, contract.Info.CompilerVersion) } @@ -114,8 +120,6 @@ func TestCompileSolidity(t *testing.T) { if string(abidef) != expAbiDefinition { t.Errorf("Expected \n'%s' got \n'%s'", expAbiDefinition, string(abidef)) } - ioutil.WriteFile("/tmp/abidef", []byte(string(abidef)), 0700) - ioutil.WriteFile("/tmp/expabidef", []byte(expAbiDefinition), 0700) if string(userdoc) != expUserDoc { t.Errorf("Expected \n'%s' got \n'%s'", expUserDoc, string(userdoc)) diff --git a/xeth/xeth.go b/xeth/xeth.go index 81197d3818..4925fe635b 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -69,6 +69,13 @@ type XEth struct { agent *miner.RemoteAgent } +func NewTest(eth *eth.Ethereum, frontend Frontend) *XEth { + return &XEth{ + backend: eth, + frontend: frontend, + } +} + // New creates an XEth that uses the given frontend. // If a nil Frontend is provided, a default frontend which // confirms all transactions will be used. From 00f59f5014360cda47e50d9791caf7dd88022c20 Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 04:38:20 +0100 Subject: [PATCH 43/59] fix eth.sign. now implemented in admin jsre until web3.js has it . --- cmd/geth/admin.go | 25 ++++++++++++++++++ cmd/geth/js_test.go | 2 +- rpc/api.go | 20 +++++++------- rpc/args.go | 64 ++++++++++++++++++++++----------------------- 4 files changed, 68 insertions(+), 43 deletions(-) diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 53dd0e6ad8..523b7c4065 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -35,6 +35,7 @@ func (js *jsre) adminBindings() { eth := ethO.Object() eth.Set("pendingTransactions", js.pendingTransactions) eth.Set("resend", js.resend) + eth.Set("sign", js.sign) js.re.Set("admin", struct{}{}) t, _ := js.re.Get("admin") @@ -177,6 +178,30 @@ func (js *jsre) resend(call otto.FunctionCall) otto.Value { return otto.FalseValue() } +func (js *jsre) sign(call otto.FunctionCall) otto.Value { + if len(call.ArgumentList) != 2 { + fmt.Println("requires 2 arguments: eth.sign(signer, data)") + return otto.UndefinedValue() + } + signer, err := call.Argument(0).ToString() + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + + data, err := call.Argument(1).ToString() + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + v, err := js.xeth.Sign(signer, data, false) + if err != nil { + fmt.Println(err) + return otto.UndefinedValue() + } + return js.re.ToVal(v) +} + func (js *jsre) debugBlock(call otto.FunctionCall) otto.Value { block, err := js.getBlock(call) if err != nil { diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 71c1fedb9e..41e1034e9f 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -230,7 +230,7 @@ func TestSignature(t *testing.T) { defer ethereum.Stop() defer os.RemoveAll(tmp) - val, err := repl.re.Run(`eth.sign({from: "` + testAddress + `", data: "` + testHash + `"})`) + val, err := repl.re.Run(`eth.sign("` + testAddress + `", "` + testHash + `")`) // This is a very preliminary test, lacking actual signature verification if err != nil { diff --git a/rpc/api.go b/rpc/api.go index 4b705c7812..2536ffd74c 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -158,16 +158,16 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err v := api.xethAtStateNum(args.BlockNumber).CodeAtBytes(args.Address) *reply = newHexData(v) - case "eth_sign": - args := new(NewSigArgs) - if err := json.Unmarshal(req.Params, &args); err != nil { - return err - } - v, err := api.xeth().Sign(args.From, args.Data, false) - if err != nil { - return err - } - *reply = v + // case "eth_sign": + // args := new(NewSigArgs) + // if err := json.Unmarshal(req.Params, &args); err != nil { + // return err + // } + // v, err := api.xeth().Sign(args.From, args.Data, false) + // if err != nil { + // return err + // } + // *reply = v case "eth_sendTransaction", "eth_transact": args := new(NewTxArgs) diff --git a/rpc/args.go b/rpc/args.go index 686872a598..27824f12c8 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -166,45 +166,45 @@ type NewTxArgs struct { BlockNumber int64 } -type NewSigArgs struct { - From string - Data string -} +// type NewSigArgs struct { +// From string +// Data string +// } -func (args *NewSigArgs) UnmarshalJSON(b []byte) (err error) { - var obj []json.RawMessage - var ext struct { - From string - Data string - } +// func (args *NewSigArgs) UnmarshalJSON(b []byte) (err error) { +// var obj []json.RawMessage +// var ext struct { +// From string +// Data string +// } - // Decode byte slice to array of RawMessages - if err := json.Unmarshal(b, &obj); err != nil { - return NewDecodeParamError(err.Error()) - } +// // Decode byte slice to array of RawMessages +// if err := json.Unmarshal(b, &obj); err != nil { +// return NewDecodeParamError(err.Error()) +// } - // Check for sufficient params - if len(obj) < 1 { - return NewInsufficientParamsError(len(obj), 1) - } +// // Check for sufficient params +// if len(obj) < 1 { +// return NewInsufficientParamsError(len(obj), 1) +// } - // Decode 0th RawMessage to temporary struct - if err := json.Unmarshal(obj[0], &ext); err != nil { - return NewDecodeParamError(err.Error()) - } +// // Decode 0th RawMessage to temporary struct +// if err := json.Unmarshal(obj[0], &ext); err != nil { +// return NewDecodeParamError(err.Error()) +// } - if len(ext.From) == 0 { - return NewValidationError("from", "is required") - } +// if len(ext.From) == 0 { +// return NewValidationError("from", "is required") +// } - if len(ext.Data) == 0 { - return NewValidationError("data", "is required") - } +// if len(ext.Data) == 0 { +// return NewValidationError("data", "is required") +// } - args.From = ext.From - args.Data = ext.Data - return nil -} +// args.From = ext.From +// args.Data = ext.Data +// return nil +// } func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { var obj []json.RawMessage From e1d1417729b82f00bcb62dffa36358cb74ab790f Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 05:29:28 +0100 Subject: [PATCH 44/59] rpc: NewNotAvailableError instead of NewNotImplementedError if no solc --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/api.go b/rpc/api.go index 2536ffd74c..b6f6ac3f91 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -347,7 +347,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err solc, _ := api.xeth().Solc() if solc == nil { - return NewNotImplementedError(req.Method) + return NewNotAvailableError(req.Method, "solc (solidity compiler) not found") } args := new(SourceArgs) From 00ec4132f89527a6e2ae6b1d3842c447cab38cef Mon Sep 17 00:00:00 2001 From: zsfelfoldi Date: Wed, 20 May 2015 06:41:50 +0200 Subject: [PATCH 45/59] Storing tx receipts in extraDb --- core/block_processor.go | 16 ++++++++++++++++ xeth/xeth.go | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/core/block_processor.go b/core/block_processor.go index 20e6722a4f..3a224059b9 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -23,6 +23,8 @@ const ( BlockChainVersion = 2 ) +var receiptsPre = []byte("receipts-") + type BlockProcessor struct { db common.Database extraDb common.Database @@ -262,9 +264,23 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (logs st putTx(sm.extraDb, tx, block, uint64(i)) } + receiptsRlp := block.Receipts().RlpEncode() + sm.extraDb.Put(append(receiptsPre, block.Hash().Bytes()...), receiptsRlp) + return state.Logs(), nil } +func (self *BlockProcessor) GetBlockReceipts(bhash common.Hash) (receipts types.Receipts, err error) { + var rdata []byte + rdata, err = self.extraDb.Get(append(receiptsPre, bhash[:]...)) + + if err == nil { + err = rlp.DecodeBytes(rdata, &receipts) + } + return + +} + // Validates the current block. Returns an error if the block was invalid, // an uncle or anything that isn't on the current block chain. // Validation validates easy over difficult (dagger takes longer time = difficult) diff --git a/xeth/xeth.go b/xeth/xeth.go index 7de3e31be4..3772146de6 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -350,6 +350,24 @@ func (self *XEth) CurrentBlock() *types.Block { return self.backend.ChainManager().CurrentBlock() } +func (self *XEth) GetBlockReceipts(bhash common.Hash) (receipts types.Receipts, err error) { + return self.backend.BlockProcessor().GetBlockReceipts(bhash) +} + +func (self *XEth) GetTxReceipt(txhash common.Hash) (receipt *types.Receipt, err error) { + _, bhash, _, txi := self.EthTransactionByHash(common.ToHex(txhash[:])) + var receipts types.Receipts + receipts, err = self.backend.BlockProcessor().GetBlockReceipts(bhash) + if err == nil { + if txi < uint64(len(receipts)) { + receipt = receipts[txi] + } else { + err = fmt.Errorf("Invalid tx index") + } + } + return +} + func (self *XEth) GasLimit() *big.Int { return self.backend.ChainManager().GasLimit() } From 6f54eb6d9a2375f4ee78df77068919ec0847fb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 20 May 2015 10:15:42 +0300 Subject: [PATCH 46/59] eth/downloader: fix test to it doesn't time out on a slow machine --- eth/downloader/downloader_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 19d64ac67f..98fdef6963 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -382,7 +382,7 @@ func TestRepeatingHashAttack(t *testing.T) { // Make sure that syncing returns and does so with a failure select { - case <-time.After(100 * time.Millisecond): + case <-time.After(time.Second): t.Fatalf("synchronisation blocked") case err := <-errc: if err == nil { From 3c8227b935fdc9eda7a6cfacc2e0d0d189e7bb36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 20 May 2015 10:34:45 +0300 Subject: [PATCH 47/59] eth: fix odd method names in peer set --- eth/handler.go | 4 ++-- eth/peer.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eth/handler.go b/eth/handler.go index 835097d843..8dd254b1a3 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -350,7 +350,7 @@ func (pm *ProtocolManager) verifyTd(peer *peer, request newBlockMsgData) error { // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) { // Broadcast block to a batch of peers not knowing about it - peers := pm.peers.BlockLackingPeers(hash) + peers := pm.peers.PeersWithoutBlock(hash) peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendNewBlock(block) @@ -363,7 +363,7 @@ func (pm *ProtocolManager) BroadcastBlock(hash common.Hash, block *types.Block) // sqrt(peers) to determine the amount of peers we broadcast to. func (pm *ProtocolManager) BroadcastTx(hash common.Hash, tx *types.Transaction) { // Broadcast transaction to a batch of peers not knowing about it - peers := pm.peers.TxLackingPeers(hash) + peers := pm.peers.PeersWithoutTx(hash) //FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))] for _, peer := range peers { peer.sendTransaction(tx) diff --git a/eth/peer.go b/eth/peer.go index a23449acd3..fdd8152932 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -213,9 +213,9 @@ func (ps *peerSet) Len() int { return len(ps.peers) } -// BlockLackingPeers retrieves a list of peers that do not have a given block -// in their set of known hashes. -func (ps *peerSet) BlockLackingPeers(hash common.Hash) []*peer { +// PeersWithoutBlock retrieves a list of peers that do not have a given block in +// their set of known hashes. +func (ps *peerSet) PeersWithoutBlock(hash common.Hash) []*peer { ps.lock.RLock() defer ps.lock.RUnlock() @@ -228,9 +228,9 @@ func (ps *peerSet) BlockLackingPeers(hash common.Hash) []*peer { return list } -// TxLackingPeers retrieves a list of peers that do not have a given transaction +// PeersWithoutTx retrieves a list of peers that do not have a given transaction // in their set of known hashes. -func (ps *peerSet) TxLackingPeers(hash common.Hash) []*peer { +func (ps *peerSet) PeersWithoutTx(hash common.Hash) []*peer { ps.lock.RLock() defer ps.lock.RUnlock() From e8b22b9253da400cc350dbc673d07789f93f57bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 21 May 2015 08:07:58 +0300 Subject: [PATCH 48/59] eth/downloader: prevent a peer from dripping bad hashes --- eth/downloader/downloader.go | 20 ++++++++++++-------- eth/downloader/downloader_test.go | 25 ++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d817b223cc..f3a8664414 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -28,10 +28,11 @@ var ( ) var ( - errLowTd = errors.New("peer's TD is too low") + errLowTd = errors.New("peers TD is too low") ErrBusy = errors.New("busy") - errUnknownPeer = errors.New("peer's unknown or unhealthy") + errUnknownPeer = errors.New("peer is unknown or unhealthy") ErrBadPeer = errors.New("action from bad peer ignored") + ErrStallingPeer = errors.New("peer is stalling") errNoPeers = errors.New("no peers to keep download active") ErrPendingQueue = errors.New("pending items in queue") ErrTimeout = errors.New("timeout") @@ -283,15 +284,18 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { return ErrBadPeer } if !done { + // Check that the peer is not stalling the sync + if len(inserts) < maxHashFetch { + return ErrStallingPeer + } // Try and fetch a random block to verify the hash batch // Skip the last hash as the cross check races with the next hash fetch - if len(inserts) > 1 { - cross := inserts[rand.Intn(len(inserts)-1)] - glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + cross := inserts[rand.Intn(len(inserts)-1)] + glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + + d.checks[cross] = time.Now().Add(blockTTL) + active.getBlocks([]common.Hash{cross}) - d.checks[cross] = time.Now().Add(blockTTL) - active.getBlocks([]common.Hash{cross}) - } // Also fetch a fresh active.getHashes(head) continue diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 19d64ac67f..8ed3289c69 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -53,6 +53,8 @@ type downloadTester struct { blocks map[common.Hash]*types.Block // Blocks associated with the hashes chain []common.Hash // Block-chain being constructed + maxHashFetch int // Overrides the maximum number of retrieved hashes + t *testing.T pcount int done chan bool @@ -133,8 +135,12 @@ func (dl *downloadTester) getBlock(hash common.Hash) *types.Block { // getHashes retrieves a batch of hashes for reconstructing the chain. func (dl *downloadTester) getHashes(head common.Hash) error { + limit := maxHashFetch + if dl.maxHashFetch > 0 { + limit = dl.maxHashFetch + } // Gather the next batch of hashes - hashes := make([]common.Hash, 0, maxHashFetch) + hashes := make([]common.Hash, 0, limit) for i, hash := range dl.hashes { if hash == head { i++ @@ -469,6 +475,23 @@ func TestMadeupHashChainAttack(t *testing.T) { } } +// Tests that if a malicious peer makes up a random hash chain, and tries to push +// indefinitely, one hash at a time, it actually gets caught with it. The reason +// this is separate from the classical made up chain attack is that sending hashes +// one by one prevents reliable block/parent verification. +func TestMadeupHashChainDrippingAttack(t *testing.T) { + // Create a random chain of hashes to drip + hashes := createHashes(0, 16*blockCacheLimit) + tester := newTester(t, hashes, nil) + + // Try and sync with the attacker, one hash at a time + tester.maxHashFetch = 1 + tester.newPeer("attack", big.NewInt(10000), hashes[0]) + if _, err := tester.syncTake("attack", hashes[0]); err != ErrStallingPeer { + t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrStallingPeer) + } +} + // Tests that if a malicious peer makes up a random block chain, and tried to // push indefinitely, it actually gets caught with it. func TestMadeupBlockChainAttack(t *testing.T) { From 52db6d8be577669bd5ba659ac223acf61956b05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 21 May 2015 08:37:27 +0300 Subject: [PATCH 49/59] eth/downloader: circumvent a forged block chain with known parent attack --- eth/downloader/downloader.go | 33 +++++++++++++++++----------- eth/downloader/downloader_test.go | 36 ++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f3a8664414..f0629a551e 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -61,13 +61,18 @@ type hashPack struct { hashes []common.Hash } +type crossCheck struct { + expire time.Time + parent common.Hash +} + type Downloader struct { mux *event.TypeMux mu sync.RWMutex - queue *queue // Scheduler for selecting the hashes to download - peers *peerSet // Set of active peers from which download can proceed - checks map[common.Hash]time.Time // Pending cross checks to verify a hash chain + queue *queue // Scheduler for selecting the hashes to download + peers *peerSet // Set of active peers from which download can proceed + checks map[common.Hash]*crossCheck // Pending cross checks to verify a hash chain // Callbacks hasBlock hashCheckFn @@ -158,7 +163,7 @@ func (d *Downloader) Synchronise(id string, hash common.Hash) error { // Reset the queue and peer set to clean any internal leftover state d.queue.Reset() d.peers.Reset() - d.checks = make(map[common.Hash]time.Time) + d.checks = make(map[common.Hash]*crossCheck) // Retrieve the origin peer and initiate the downloading process p := d.peers.Peer(id) @@ -290,11 +295,15 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { } // Try and fetch a random block to verify the hash batch // Skip the last hash as the cross check races with the next hash fetch - cross := inserts[rand.Intn(len(inserts)-1)] - glog.V(logger.Detail).Infof("Cross checking (%s) with %x", active.id, cross) + cross := rand.Intn(len(inserts) - 1) + origin, parent := inserts[cross], inserts[cross+1] + glog.V(logger.Detail).Infof("Cross checking (%s) with %x/%x", active.id, origin, parent) - d.checks[cross] = time.Now().Add(blockTTL) - active.getBlocks([]common.Hash{cross}) + d.checks[origin] = &crossCheck{ + expire: time.Now().Add(blockTTL), + parent: parent, + } + active.getBlocks([]common.Hash{origin}) // Also fetch a fresh active.getHashes(head) @@ -314,8 +323,8 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { continue } block := blockPack.blocks[0] - if _, ok := d.checks[block.Hash()]; ok { - if !d.queue.Has(block.ParentHash()) { + if check, ok := d.checks[block.Hash()]; ok { + if block.ParentHash() != check.parent { return ErrCrossCheckFailed } delete(d.checks, block.Hash()) @@ -323,8 +332,8 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { case <-crossTicker.C: // Iterate over all the cross checks and fail the hash chain if they're not verified - for hash, deadline := range d.checks { - if time.Now().After(deadline) { + for hash, check := range d.checks { + if time.Now().After(check.expire) { glog.V(logger.Debug).Infof("Cross check timeout for %x", hash) return ErrCrossCheckFailed } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 8ed3289c69..d623a7c767 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -502,7 +502,7 @@ func TestMadeupBlockChainAttack(t *testing.T) { crossCheckCycle = 25 * time.Millisecond // Create a long chain of blocks and simulate an invalid chain by dropping every second - hashes := createHashes(0, 32*blockCacheLimit) + hashes := createHashes(0, 16*blockCacheLimit) blocks := createBlocksFromHashes(hashes) gapped := make([]common.Hash, len(hashes)/2) @@ -525,3 +525,37 @@ func TestMadeupBlockChainAttack(t *testing.T) { t.Fatalf("failed to synchronise blocks: %v", err) } } + +// Advanced form of the above forged blockchain attack, where not only does the +// attacker make up a valid hashes for random blocks, but also forges the block +// parents to point to existing hashes. +func TestMadeupParentBlockChainAttack(t *testing.T) { + defaultBlockTTL := blockTTL + defaultCrossCheckCycle := crossCheckCycle + + blockTTL = 100 * time.Millisecond + crossCheckCycle = 25 * time.Millisecond + + // Create a long chain of blocks and simulate an invalid chain by dropping every second + hashes := createHashes(0, 16*blockCacheLimit) + blocks := createBlocksFromHashes(hashes) + forges := createBlocksFromHashes(hashes) + for hash, block := range forges { + block.ParentHeaderHash = hash // Simulate pointing to already known hash + } + // Try and sync with the malicious node and check that it fails + tester := newTester(t, hashes, forges) + tester.newPeer("attack", big.NewInt(10000), hashes[0]) + if _, err := tester.syncTake("attack", hashes[0]); err != ErrCrossCheckFailed { + t.Fatalf("synchronisation error mismatch: have %v, want %v", err, ErrCrossCheckFailed) + } + // Ensure that a valid chain can still pass sync + blockTTL = defaultBlockTTL + crossCheckCycle = defaultCrossCheckCycle + + tester.blocks = blocks + tester.newPeer("valid", big.NewInt(20000), hashes[0]) + if _, err := tester.syncTake("valid", hashes[0]); err != nil { + t.Fatalf("failed to synchronise blocks: %v", err) + } +} From ff1630834cddb768826cec0e555a645e13c7bc9c Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 11:36:05 +0200 Subject: [PATCH 50/59] xeth: removed `Value` --- xeth/xeth.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xeth/xeth.go b/xeth/xeth.go index 3ec3f7dd40..b90e0aa474 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -881,7 +881,7 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS var ( from = common.HexToAddress(fromStr) to = common.HexToAddress(toStr) - value = common.NewValue(valueStr) + value = common.Big(valueStr) gas = common.Big(gasStr) price = common.Big(gasPriceStr) data []byte @@ -928,9 +928,9 @@ func (self *XEth) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceS var tx *types.Transaction if contractCreation { - tx = types.NewContractCreationTx(value.BigInt(), gas, price, data) + tx = types.NewContractCreationTx(value, gas, price, data) } else { - tx = types.NewTransactionMessage(to, value.BigInt(), gas, price, data) + tx = types.NewTransactionMessage(to, value, gas, price, data) } state := self.backend.ChainManager().TxState() From ef8744d9fcc363ae1dfd4784902a8c8824fffda1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 11:36:39 +0200 Subject: [PATCH 51/59] core: switched back to `set.Set` for uncle verification --- core/block_processor.go | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/core/block_processor.go b/core/block_processor.go index 3a224059b9..3f10e5efde 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -15,6 +15,7 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" + "gopkg.in/fatih/set.v0" ) const ( @@ -346,50 +347,39 @@ func AccumulateRewards(statedb *state.StateDB, block *types.Block) { } func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *types.Block) error { - //ancestors := set.New() - //uncles := set.New() - ancestors := make(map[common.Hash]struct{}) - uncles := make(map[common.Hash]struct{}) + ancestors := set.New() + uncles := set.New() ancestorHeaders := make(map[common.Hash]*types.Header) for _, ancestor := range sm.bc.GetAncestors(block, 7) { ancestorHeaders[ancestor.Hash()] = ancestor.Header() - //ancestors.Add(ancestor.Hash()) - ancestors[ancestor.Hash()] = struct{}{} + ancestors.Add(ancestor.Hash()) // Include ancestors uncles in the uncle set. Uncles must be unique. for _, uncle := range ancestor.Uncles() { - //uncles.Add(uncle.Hash()) - uncles[uncle.Hash()] = struct{}{} + uncles.Add(uncle.Hash()) } } - //uncles.Add(block.Hash()) - uncles[block.Hash()] = struct{}{} + uncles.Add(block.Hash()) for i, uncle := range block.Uncles() { hash := uncle.Hash() - //if uncles.Has(hash) { - if _, has := uncles[hash]; has { + if uncles.Has(hash) { // Error not unique return UncleError("uncle[%d](%x) not unique", i, hash[:4]) } - uncles[hash] = struct{}{} + uncles.Add(hash) - //if ancestors.Has(hash) { - if _, has := ancestors[hash]; has { - var branch string - //ancestors.Each(func(item interface{}) bool { - for hash := range ancestors { + if ancestors.Has(hash) { + branch := fmt.Sprintf(" O - %x\n |\n", block.Hash()) + ancestors.Each(func(item interface{}) bool { branch += fmt.Sprintf(" O - %x\n |\n", hash) - //return true - } - //}) - branch += fmt.Sprintf(" O - %x\n |\n", block.Hash()) + return true + }) glog.Infoln(branch) return UncleError("uncle[%d](%x) is ancestor", i, hash[:4]) } - //if !ancestors.Has(uncle.ParentHash) { - if _, has := ancestors[uncle.ParentHash]; !has { + if !ancestors.Has(uncle.ParentHash) { return UncleError("uncle[%d](%x)'s parent unknown (%x)", i, hash[:4], uncle.ParentHash[0:4]) } From 84cd618585ce21c7a1907798ddc69601402e9de5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 11:43:05 +0200 Subject: [PATCH 52/59] ethdb: documentation and corruption recovery --- ethdb/database.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ethdb/database.go b/ethdb/database.go index c351c024a1..9bf09467b4 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" "github.com/syndtr/goleveldb/leveldb/opt" ) @@ -24,9 +25,17 @@ type LDBDatabase struct { quit chan struct{} } +// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by +// it self but requires a background poller which syncs every X. `Flush` should be called +// when data needs to be stored and written to disk. func NewLDBDatabase(file string) (*LDBDatabase, error) { // Open the db db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: OpenFileLimit}) + // check for curruption and attempt to recover + if _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted { + db, err = leveldb.RecoverFile(file, nil) + } + // (re) check for errors and abort if opening of the db failed if err != nil { return nil, err } @@ -44,21 +53,15 @@ func (self *LDBDatabase) makeQueue() { self.queue = make(map[string][]byte) } +// Put puts the given key / value to the queue func (self *LDBDatabase) Put(key []byte, value []byte) { self.mu.Lock() defer self.mu.Unlock() self.queue[string(key)] = value - /* - value = rle.Compress(value) - - err := self.db.Put(key, value, nil) - if err != nil { - fmt.Println("Error put", err) - } - */ } +// Get returns the given key if it's present. func (self *LDBDatabase) Get(key []byte) ([]byte, error) { self.mu.Lock() defer self.mu.Unlock() @@ -76,6 +79,7 @@ func (self *LDBDatabase) Get(key []byte) ([]byte, error) { return rle.Decompress(dat) } +// Delete deletes the key from the queue and database func (self *LDBDatabase) Delete(key []byte) error { self.mu.Lock() defer self.mu.Unlock() @@ -100,6 +104,7 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator { return self.db.NewIterator(nil, nil) } +// Flush flushes out the queue to leveldb func (self *LDBDatabase) Flush() error { self.mu.Lock() defer self.mu.Unlock() From 207bd5575161fa2bc61a7ccf659c11878575dd32 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 11:45:35 +0200 Subject: [PATCH 53/59] eth: reduced max open files for LevelDB --- eth/backend.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth/backend.go b/eth/backend.go index 44ceb89e8e..69504fd941 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -213,7 +213,7 @@ func New(config *Config) (*Ethereum, error) { // Let the database take 3/4 of the max open files (TODO figure out a way to get the actual limit of the open files) const dbCount = 3 - ethdb.OpenFileLimit = 256 / (dbCount + 1) + ethdb.OpenFileLimit = 128 / (dbCount + 1) newdb := config.NewDB if newdb == nil { From 907848997bbf79382a98b0c82e4aa61ca2eecd16 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 11:57:00 +0200 Subject: [PATCH 54/59] miner: one-shot update loop --- miner/miner.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/miner/miner.go b/miner/miner.go index 3f87e81515..c9427f3023 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -39,6 +39,10 @@ func New(eth core.Backend, mux *event.TypeMux, pow pow.PoW) *Miner { return miner } +// update keeps track of the downloader events. Please be aware that this is a one shot type of update loop. +// It's entered once and as soon as `Done` or `Failed` has been broadcasted the events are unregistered and +// the loop is exited. This to prevent a major security vuln where external parties can DOS you with blocks +// and halt your mining operation for as long as the DOS continues. func (self *Miner) update() { events := self.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{}) for ev := range events.Chan() { @@ -59,6 +63,8 @@ func (self *Miner) update() { self.Start(self.coinbase, self.threads) } } + // unsubscribe. we're only interested in this event once + events.Unsubscribe() } } From a61e6788db492b292baaa9c9be09eac9334ff56e Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Thu, 21 May 2015 15:20:38 +0200 Subject: [PATCH 55/59] prefix dapp key/value entries in extradb --- xeth/xeth.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/xeth/xeth.go b/xeth/xeth.go index b90e0aa474..157fe76c74 100644 --- a/xeth/xeth.go +++ b/xeth/xeth.go @@ -28,6 +28,7 @@ var ( filterTickerTime = 5 * time.Minute defaultGasPrice = big.NewInt(10000000000000) //150000000000 defaultGas = big.NewInt(90000) //500000 + dappStorePre = []byte("dapp-") ) // byte will be inferred @@ -410,13 +411,15 @@ func (self *XEth) SetSolc(solcPath string) (*compiler.Solidity, error) { return self.Solc() } +// store DApp value in extra database func (self *XEth) DbPut(key, val []byte) bool { - self.backend.ExtraDb().Put(key, val) + self.backend.ExtraDb().Put(append(dappStorePre, key...), val) return true } +// retrieve DApp value from extra database func (self *XEth) DbGet(key []byte) ([]byte, error) { - val, err := self.backend.ExtraDb().Get(key) + val, err := self.backend.ExtraDb().Get(append(dappStorePre, key...)) return val, err } From bed80133e0573ebeefa201a15b20188198adf0ac Mon Sep 17 00:00:00 2001 From: zelig Date: Wed, 20 May 2015 16:56:17 +0100 Subject: [PATCH 56/59] automatic DAG pregeneration for smooth epoch transitions - backend: AutoDAG bool flag passed from cli/eth.Config to ethereum, autoDAG loop started if true - backend: autoDAG loop start/stop, remove previous DAG - cli: AutoDAG bool flag, off by default, but automatically ON if mining - admin jsre: add startAutoDAG stopAutoDAG and makeDAG in miner section - switch on/off DAG autogeneration when miner started/stopped on console --- cmd/geth/admin.go | 32 +++++++++++++++++ cmd/geth/main.go | 3 +- cmd/utils/flags.go | 5 +++ eth/backend.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 1 deletion(-) diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 523b7c4065..4c8f110e43 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -8,6 +8,7 @@ import ( "strconv" "time" + "github.com/ethereum/ethash" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/common" @@ -73,6 +74,9 @@ func (js *jsre) adminBindings() { miner.Set("hashrate", js.hashrate) miner.Set("setExtra", js.setExtra) miner.Set("setGasPrice", js.setGasPrice) + miner.Set("startAutoDAG", js.startAutoDAG) + miner.Set("stopAutoDAG", js.stopAutoDAG) + miner.Set("makeDAG", js.makeDAG) admin.Set("debug", struct{}{}) t, _ = admin.Get("debug") @@ -278,6 +282,30 @@ func (js *jsre) hashrate(otto.FunctionCall) otto.Value { return js.re.ToVal(js.ethereum.Miner().HashRate()) } +func (js *jsre) makeDAG(call otto.FunctionCall) otto.Value { + blockNumber, err := call.Argument(1).ToInteger() + if err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + err = ethash.MakeDAG(uint64(blockNumber), "") + if err != nil { + return otto.FalseValue() + } + return otto.TrueValue() +} + +func (js *jsre) startAutoDAG(otto.FunctionCall) otto.Value { + js.ethereum.StartAutoDAG() + return otto.TrueValue() +} + +func (js *jsre) stopAutoDAG(otto.FunctionCall) otto.Value { + js.ethereum.StopAutoDAG() + return otto.TrueValue() +} + func (js *jsre) backtrace(call otto.FunctionCall) otto.Value { tracestr, err := call.Argument(0).ToString() if err != nil { @@ -316,6 +344,9 @@ func (js *jsre) startMining(call otto.FunctionCall) otto.Value { threads = int64(js.ethereum.MinerThreads) } + // switch on DAG autogeneration when miner starts + js.ethereum.StartAutoDAG() + err = js.ethereum.StartMining(int(threads)) if err != nil { fmt.Println(err) @@ -327,6 +358,7 @@ func (js *jsre) startMining(call otto.FunctionCall) otto.Value { func (js *jsre) stopMining(call otto.FunctionCall) otto.Value { js.ethereum.StopMining() + js.ethereum.StopAutoDAG() return otto.TrueValue() } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index ba253bbebb..6d345a18bf 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -117,7 +117,7 @@ passwordfile as argument containing the wallet password in plaintext. Manage accounts lets you create new accounts, list all existing accounts, import a private key into a new account. -'account help' shows a list of subcommands or help for one subcommand. +' help' shows a list of subcommands or help for one subcommand. It supports interactive mode, when you are prompted for password as well as non-interactive mode where passwords are supplied via a given password file. @@ -257,6 +257,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.GasPriceFlag, utils.MinerThreadsFlag, utils.MiningEnabledFlag, + utils.AutoDAGFlag, utils.NATFlag, utils.NatspecEnabledFlag, utils.NodeKeyFileFlag, diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 2766e75171..cb774aa5bf 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -112,6 +112,10 @@ var ( Name: "mine", Usage: "Enable mining", } + AutoDAGFlag = cli.BoolFlag{ + Name: "autodag", + Usage: "Enable automatic DAG pregeneration", + } EtherbaseFlag = cli.StringFlag{ Name: "etherbase", Usage: "Public address for block mining rewards. By default the address of your primary account is used", @@ -314,6 +318,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { BootNodes: ctx.GlobalString(BootnodesFlag.Name), GasPrice: common.String2Big(ctx.GlobalString(GasPriceFlag.Name)), SolcPath: ctx.GlobalString(SolcPathFlag.Name), + AutoDAG: ctx.GlobalBool(AutoDAGFlag.Name) || ctx.GlobalBool(MiningEnabledFlag.Name), } } diff --git a/eth/backend.go b/eth/backend.go index 69504fd941..938071fc7e 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -31,6 +31,14 @@ import ( "github.com/ethereum/go-ethereum/whisper" ) +const ( + epochLength = 30000 + ethashRevision = 23 + + autoDAGcheckInterval = 10 * time.Hour + autoDAGepochHeight = epochLength / 2 +) + var ( jsonlogger = logger.NewJsonLogger() @@ -60,6 +68,7 @@ type Config struct { LogJSON string VmDebug bool NatSpec bool + AutoDAG bool MaxPeers int MaxPendingPeers int @@ -197,6 +206,8 @@ type Ethereum struct { MinerThreads int NatSpec bool DataDir string + AutoDAG bool + autodagquit chan bool etherbase common.Address clientVersion string ethVersionId int @@ -269,6 +280,7 @@ func New(config *Config) (*Ethereum, error) { NatSpec: config.NatSpec, MinerThreads: config.MinerThreads, SolcPath: config.SolcPath, + AutoDAG: config.AutoDAG, } eth.pow = ethash.New() @@ -448,6 +460,10 @@ func (s *Ethereum) Start() error { // periodically flush databases go s.syncDatabases() + if s.AutoDAG { + s.StartAutoDAG() + } + // Start services go s.txPool.Start() s.protocolManager.Start() @@ -526,6 +542,7 @@ func (s *Ethereum) Stop() { if s.whisper != nil { s.whisper.Stop() } + s.StopAutoDAG() glog.V(logger.Info).Infoln("Server stopped") close(s.shutdownChan) @@ -559,6 +576,77 @@ func (self *Ethereum) syncAccounts(tx *types.Transaction) { } } +// StartAutoDAG() spawns a go routine that checks the DAG every autoDAGcheckInterval +// by default that is 10 times per epoch +// in epoch n, if we past autoDAGepochHeight within-epoch blocks, +// it calls ethash.MakeDAG to pregenerate the DAG for the next epoch n+1 +// if it does not exist yet as well as remove the DAG for epoch n-1 +// the loop quits if autodagquit channel is closed, it can safely restart and +// stop any number of times. +// For any more sophisticated pattern of DAG generation, use CLI subcommand +// makedag +func (self *Ethereum) StartAutoDAG() { + if self.autodagquit != nil { + return // already started + } + go func() { + glog.V(logger.Info).Infof("Automatic pregeneration of ethash DAG ON (ethash dir: %s)", ethash.DefaultDir) + var nextEpoch uint64 + timer := time.After(0) + self.autodagquit = make(chan bool) + for { + select { + case <-timer: + glog.V(logger.Info).Infof("checking DAG (ethash dir: %s)", ethash.DefaultDir) + currentBlock := self.ChainManager().CurrentBlock().NumberU64() + thisEpoch := currentBlock / epochLength + if nextEpoch <= thisEpoch { + if currentBlock%epochLength > autoDAGepochHeight { + if thisEpoch > 0 { + previousDag, previousDagFull := dagFiles(thisEpoch - 1) + os.Remove(filepath.Join(ethash.DefaultDir, previousDag)) + os.Remove(filepath.Join(ethash.DefaultDir, previousDagFull)) + glog.V(logger.Info).Infof("removed DAG for epoch %d (%s)", thisEpoch-1, previousDag) + } + nextEpoch = thisEpoch + 1 + dag, _ := dagFiles(nextEpoch) + if _, err := os.Stat(dag); os.IsNotExist(err) { + glog.V(logger.Info).Infof("Pregenerating DAG for epoch %d (%s)", nextEpoch, dag) + err := ethash.MakeDAG(nextEpoch*epochLength, "") // "" -> ethash.DefaultDir + if err != nil { + glog.V(logger.Error).Infof("Error generating DAG for epoch %d (%s)", nextEpoch, dag) + return + } + } else { + glog.V(logger.Error).Infof("DAG for epoch %d (%s)", nextEpoch, dag) + } + } + } + timer = time.After(autoDAGcheckInterval) + case <-self.autodagquit: + return + } + } + }() +} + +// dagFiles(epoch) returns the two alternative DAG filenames (not a path) +// 1) - 2) full-R- +func dagFiles(epoch uint64) (string, string) { + seedHash, _ := ethash.GetSeedHash(epoch * epochLength) + dag := fmt.Sprintf("full-R%d-%x", ethashRevision, seedHash[:8]) + return dag, "full-R" + dag +} + +// stopAutoDAG stops automatic DAG pregeneration by quitting the loop +func (self *Ethereum) StopAutoDAG() { + if self.autodagquit != nil { + close(self.autodagquit) + self.autodagquit = nil + } + glog.V(logger.Info).Infof("Automatic pregeneration of ethash DAG OFF (ethash dir: %s)", ethash.DefaultDir) +} + func saveProtocolVersion(db common.Database, protov int) { d, _ := db.Get([]byte("ProtocolVersion")) protocolVersion := common.NewValue(d).Uint() From 06a041589f3c2d4b3e66a1ce51e3e03e209fdbff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 21 May 2015 18:16:04 +0300 Subject: [PATCH 57/59] eth, eth/downloader: remove duplicate consts, bump hash fetch to 2K --- eth/downloader/downloader.go | 10 ++++++---- eth/downloader/downloader_test.go | 2 +- eth/downloader/queue.go | 2 +- eth/handler.go | 6 +++--- eth/peer.go | 5 +++-- eth/protocol.go | 2 -- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index f0629a551e..fd588d2f30 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -15,8 +15,10 @@ import ( ) const ( - maxHashFetch = 512 // Amount of hashes to be fetched per chunk - maxBlockFetch = 128 // Amount of blocks to be fetched per chunk + MinHashFetch = 512 // Minimum amount of hashes to not consider a peer stalling + MaxHashFetch = 2048 // Amount of hashes to be fetched per retrieval request + MaxBlockFetch = 128 // Amount of blocks to be fetched per retrieval request + peerCountTimeout = 12 * time.Second // Amount of time it takes for the peer handler to ignore minDesiredPeerCount hashTTL = 5 * time.Second // Time it takes for a hash request to time out ) @@ -290,7 +292,7 @@ func (d *Downloader) fetchHashes(p *peer, h common.Hash) error { } if !done { // Check that the peer is not stalling the sync - if len(inserts) < maxHashFetch { + if len(inserts) < MinHashFetch { return ErrStallingPeer } // Try and fetch a random block to verify the hash batch @@ -451,7 +453,7 @@ out: } // Get a possible chunk. If nil is returned no chunk // could be returned due to no hashes available. - request := d.queue.Reserve(peer, maxBlockFetch) + request := d.queue.Reserve(peer, MaxBlockFetch) if request == nil { continue } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index d623a7c767..6299ea1622 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -135,7 +135,7 @@ func (dl *downloadTester) getBlock(hash common.Hash) *types.Block { // getHashes retrieves a batch of hashes for reconstructing the chain. func (dl *downloadTester) getHashes(head common.Hash) error { - limit := maxHashFetch + limit := MaxHashFetch if dl.maxHashFetch > 0 { limit = dl.maxHashFetch } diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index 13ec9a5209..591a37773d 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -17,7 +17,7 @@ import ( ) const ( - blockCacheLimit = 1024 // Maximum number of blocks to cache before throttling the download + blockCacheLimit = 8 * MaxBlockFetch // Maximum number of blocks to cache before throttling the download ) // fetchRequest is a currently running block retrieval operation. diff --git a/eth/handler.go b/eth/handler.go index 835097d843..63b1d50f61 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -206,8 +206,8 @@ func (self *ProtocolManager) handleMsg(p *peer) error { return errResp(ErrDecode, "->msg %v: %v", msg, err) } - if request.Amount > maxHashes { - request.Amount = maxHashes + if request.Amount > downloader.MaxHashFetch { + request.Amount = downloader.MaxHashFetch } hashes := self.chainman.GetBlockHashesFromHash(request.Hash, request.Amount) @@ -254,7 +254,7 @@ func (self *ProtocolManager) handleMsg(p *peer) error { if block != nil { blocks = append(blocks, block) } - if i == maxBlocks { + if i == downloader.MaxBlockFetch { break } } diff --git a/eth/peer.go b/eth/peer.go index a23449acd3..1ef032d384 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" "github.com/ethereum/go-ethereum/p2p" @@ -100,8 +101,8 @@ func (p *peer) sendTransaction(tx *types.Transaction) error { } func (p *peer) requestHashes(from common.Hash) error { - glog.V(logger.Debug).Infof("[%s] fetching hashes (%d) %x...\n", p.id, maxHashes, from[:4]) - return p2p.Send(p.rw, GetBlockHashesMsg, getBlockHashesMsgData{from, maxHashes}) + glog.V(logger.Debug).Infof("[%s] fetching hashes (%d) %x...\n", p.id, downloader.MaxHashFetch, from[:4]) + return p2p.Send(p.rw, GetBlockHashesMsg, getBlockHashesMsgData{from, downloader.MaxHashFetch}) } func (p *peer) requestBlocks(hashes []common.Hash) error { diff --git a/eth/protocol.go b/eth/protocol.go index 48f37b59c9..948051ed1f 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -12,8 +12,6 @@ const ( NetworkId = 0 ProtocolLength = uint64(8) ProtocolMaxMsgSize = 10 * 1024 * 1024 - maxHashes = 512 - maxBlocks = 128 ) // eth protocol message codes From 4600ecb5c71e1f311c1c31e8d596a2a43ce6a51b Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 17:56:06 +0200 Subject: [PATCH 58/59] cmd/geth: bump version 0.9.23 --- cmd/geth/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 6d345a18bf..513b405ffc 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -48,7 +48,7 @@ import _ "net/http/pprof" const ( ClientIdentifier = "Geth" - Version = "0.9.22" + Version = "0.9.23" ) var ( From 3ea9868b656077c38af5ea8590761c3218ce558e Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 18:14:32 +0200 Subject: [PATCH 59/59] miner: on downloader.Done/Fail stop immediately. Ignore pending evs --- miner/miner.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/miner/miner.go b/miner/miner.go index c9427f3023..4e99245f8c 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -65,6 +65,8 @@ func (self *Miner) update() { } // unsubscribe. we're only interested in this event once events.Unsubscribe() + // stop immediately and ignore all further pending events + break } }