From 28ba374f27b81ba143005e285be6f8a986134936 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 16 May 2015 17:43:19 +0200 Subject: [PATCH 01/65] 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 02/65] 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 3a51d5e80c50b8992a3b0462f64421604435f480 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 17 May 2015 21:34:28 +0200 Subject: [PATCH 03/65] cmd/geth: fixed ver num --- 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 e9deec61f2..3f3af2b64c 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -50,7 +50,7 @@ import _ "net/http/pprof" const ( ClientIdentifier = "Geth" - Version = "0.9.21.1" + Version = "0.9.22" ) var ( From e323f0e83120edb759dfa1e99325eff13e975b3b Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 10:13:50 +0200 Subject: [PATCH 04/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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/65] 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 } } From 054abe20b81ada11a820405f4a42f59cea9f9199 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 21 May 2015 19:53:27 +0200 Subject: [PATCH 60/65] miner: moved break INSIDE the switch ... --- miner/miner.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/miner/miner.go b/miner/miner.go index 4e99245f8c..20ca81648a 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -45,6 +45,7 @@ func New(eth core.Backend, mux *event.TypeMux, pow pow.PoW) *Miner { // 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{}) +out: for ev := range events.Chan() { switch ev.(type) { case downloader.StartEvent: @@ -62,11 +63,11 @@ func (self *Miner) update() { if shouldStart { self.Start(self.coinbase, self.threads) } + // unsubscribe. we're only interested in this event once + events.Unsubscribe() + // stop immediately and ignore all further pending events + break out } - // unsubscribe. we're only interested in this event once - events.Unsubscribe() - // stop immediately and ignore all further pending events - break } } From 6ad817e17b1243ada369b04eec3096403ea3499c Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Thu, 21 May 2015 23:04:46 +0200 Subject: [PATCH 61/65] Add StateTests/RandomTests and VMTests/RandomTests --- tests/vm/gh_test.go | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/tests/vm/gh_test.go b/tests/vm/gh_test.go index 68eb4cb45c..2f76084d0f 100644 --- a/tests/vm/gh_test.go +++ b/tests/vm/gh_test.go @@ -2,7 +2,6 @@ package vm import ( "bytes" - "io/ioutil" "math/big" "os" "path/filepath" @@ -373,21 +372,16 @@ func TestWallet(t *testing.T) { RunVmTest(fn, t) } -func TestRandom(t *testing.T) { - // TODO: fix JSON EOF bug and unskip - t.Skip() - fileNames := make([]string, 1024) - fileInfos, err := ioutil.ReadDir("../files/StateTests/RandomTests") - if err != nil { - t.Errorf("Could not read StateTests/RandomTests dir: %v", err) - return +func TestStateTestsRandom(t *testing.T) { + fns, _ := filepath.Glob("../files/StateTests/RandomTests/*") + for _, fn := range fns { + RunVmTest(fn, t) + } +} + +func TestVMRandom(t *testing.T) { + fns, _ := filepath.Glob("../files/VMTests/RandomTests/*") + for _, fn := range fns { + RunVmTest(fn, t) } - for _, fileInfo := range fileInfos { - fileNames = append(fileNames, fileInfo.Name()) - } - - //for _, f := range fileNames { - path := filepath.Join("../files/StateTests/RandomTests/", fileNames[0]) - RunVmTest(path, t) - //} } From 821b578f7e05e956a9751e1664b58b3a455b9653 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Fri, 22 May 2015 09:13:45 +0200 Subject: [PATCH 62/65] make registrar available in console --- cmd/geth/js.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/geth/js.go b/cmd/geth/js.go index f99051a1e9..342a80bd22 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -141,7 +141,7 @@ var net = web3.net; utils.Fatalf("Error setting namespaces: %v", err) } - js.re.Eval(globalRegistrar + "registrar = new GlobalRegistrar(\"" + globalRegistrarAddr + "\");") + js.re.Eval(globalRegistrar + "registrar = GlobalRegistrar.at(\"" + globalRegistrarAddr + "\");") } var ds, _ = docserver.New("/") From 6539ccae7cc34ed164fd7e6d6750804fa3378261 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 22 May 2015 13:00:04 +0200 Subject: [PATCH 63/65] core: added RPC sign back in --- rpc/api.go | 20 ++++++++--------- rpc/args.go | 64 ++++++++++++++++++++++++++--------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/rpc/api.go b/rpc/api.go index b6f6ac3f91..a9a0ae6093 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 27824f12c8..686872a598 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 7381be8edb3bec412d31a97977174cf52eed8094 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 22 May 2015 15:38:46 +0200 Subject: [PATCH 64/65] core/vm, rpc: added disasm to `ext_` RPC --- core/vm/disasm.go | 21 +++++++++++++++++++++ rpc/api.go | 9 ++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 core/vm/disasm.go diff --git a/core/vm/disasm.go b/core/vm/disasm.go new file mode 100644 index 0000000000..858ee684aa --- /dev/null +++ b/core/vm/disasm.go @@ -0,0 +1,21 @@ +package vm + +import "fmt" + +func Disasm(code []byte) []string { + var out []string + for pc := uint64(0); pc < uint64(len(code)); pc++ { + op := OpCode(code[pc]) + out = append(out, op.String()) + + switch op { + case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: + a := uint64(op) - uint64(PUSH1) + 1 + out = append(out, fmt.Sprintf("0x%x", code[pc+1:pc+1+a])) + + pc += a + } + } + + return out +} diff --git a/rpc/api.go b/rpc/api.go index a9a0ae6093..6b37acb034 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -6,6 +6,7 @@ import ( "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger/glog" @@ -344,7 +345,6 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err return NewNotImplementedError(req.Method) case "eth_compileSolidity": - solc, _ := api.xeth().Solc() if solc == nil { return NewNotAvailableError(req.Method, "solc (solidity compiler) not found") @@ -562,6 +562,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err case "eth_hashrate": *reply = newHexNum(api.xeth().HashRate()) + case "ext_disasm": + args := new(SourceArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + *reply = vm.Disasm(common.FromHex(args.Source)) // case "eth_register": // // Placeholder for actual type From 3aac38f60fbb4b747a6e26635e8e6b6860709634 Mon Sep 17 00:00:00 2001 From: zelig Date: Fri, 22 May 2015 04:30:51 +0100 Subject: [PATCH 65/65] Resolver: registries use global registrar * global registrar now in resolver, console jsre refers to resolver.abi/addr, geth/contracts.go removed * add Call to resolver backend interface * global registrar name registry interface in resolver * the hashReg and UrlHing contracts now initialised from global registry * if not registered one can call the CreateContracts which creates them, reserved and registers them * tests * newRegistry returns the contract addresses for HashReg and UrlHint --- cmd/geth/admin.go | 12 +- cmd/geth/contracts.go | 6 - cmd/geth/js.go | 3 +- cmd/geth/js_test.go | 4 +- common/natspec/natspec_e2e_test.go | 5 +- common/resolver/contracts.go | 2 + common/resolver/resolver.go | 181 ++++++++++++++++++++++++++--- common/resolver/resolver_test.go | 30 +++-- 8 files changed, 200 insertions(+), 43 deletions(-) delete mode 100644 cmd/geth/contracts.go diff --git a/cmd/geth/admin.go b/cmd/geth/admin.go index 4c8f110e43..abb214fc2d 100644 --- a/cmd/geth/admin.go +++ b/cmd/geth/admin.go @@ -781,22 +781,22 @@ func (js *jsre) newRegistry(call otto.FunctionCall) otto.Value { if len(call.ArgumentList) != 1 { fmt.Println("requires 1 argument: admin.contractInfo.newRegistry(adminaddress)") - return otto.FalseValue() + return otto.UndefinedValue() } addr, err := call.Argument(0).ToString() if err != nil { fmt.Println(err) - return otto.FalseValue() + return otto.UndefinedValue() } - + var hashReg, urlHint string registry := resolver.New(js.xeth) - err = registry.CreateContracts(common.HexToAddress(addr)) + hashReg, urlHint, err = registry.CreateContracts(common.HexToAddress(addr)) if err != nil { fmt.Println(err) - return otto.FalseValue() + return otto.UndefinedValue() } - return otto.TrueValue() + return js.re.ToVal([]string{hashReg, urlHint}) } // internal transaction type which will allow us to resend transactions using `eth.resend` diff --git a/cmd/geth/contracts.go b/cmd/geth/contracts.go deleted file mode 100644 index 1f27838d15..0000000000 --- a/cmd/geth/contracts.go +++ /dev/null @@ -1,6 +0,0 @@ -package main - -var ( - globalRegistrar = `var GlobalRegistrar = web3.eth.contract([{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"Registrar","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"}],"name":"PrimaryChanged","type":"event"}]);` - globalRegistrarAddr = "0xc6d9d2cd449a754c494264e1809c50e34d64562b" -) diff --git a/cmd/geth/js.go b/cmd/geth/js.go index 342a80bd22..ad37d55645 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -29,6 +29,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/docserver" "github.com/ethereum/go-ethereum/common/natspec" + "github.com/ethereum/go-ethereum/common/resolver" "github.com/ethereum/go-ethereum/eth" re "github.com/ethereum/go-ethereum/jsre" "github.com/ethereum/go-ethereum/rpc" @@ -141,7 +142,7 @@ var net = web3.net; utils.Fatalf("Error setting namespaces: %v", err) } - js.re.Eval(globalRegistrar + "registrar = GlobalRegistrar.at(\"" + globalRegistrarAddr + "\");") + js.re.Eval(resolver.GlobalRegistrar + "registrar = GlobalRegistrar.at(\"" + resolver.GlobalRegistrarAddr + "\");") } var ds, _ = docserver.New("/") diff --git a/cmd/geth/js_test.go b/cmd/geth/js_test.go index 41e1034e9f..7a1f899193 100644 --- a/cmd/geth/js_test.go +++ b/cmd/geth/js_test.go @@ -305,7 +305,7 @@ func TestContract(t *testing.T) { checkEvalJSON( t, repl, `contractaddress = eth.sendTransaction({from: primary, data: contract.code })`, - `"0x5dcaace5982778b409c524873b319667eba5d074"`, + `"0x291293d57e0a0ab47effe97c02577f90d9211567"`, ) callSetup := `abiDef = JSON.parse('[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"type":"function"}]'); @@ -331,7 +331,7 @@ multiply7 = Multiply7.at(contractaddress); 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 '0x87e2802265838c7f14bb69eecd2112911af6767907a702eeaa445239fb20711b'): {"params":[{"to":"0x5dcaace5982778b409c524873b319667eba5d074","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` + expNotice = `About to submit transaction (no NatSpec info found for contract: content hash not found for '0x87e2802265838c7f14bb69eecd2112911af6767907a702eeaa445239fb20711b'): {"params":[{"to":"0x291293d57e0a0ab47effe97c02577f90d9211567","data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}]}` if repl.lastConfirm != expNotice { t.Errorf("incorrect confirmation message: expected %v, got %v", expNotice, repl.lastConfirm) } diff --git a/common/natspec/natspec_e2e_test.go b/common/natspec/natspec_e2e_test.go index a8d318b57a..f6368c9c56 100644 --- a/common/natspec/natspec_e2e_test.go +++ b/common/natspec/natspec_e2e_test.go @@ -197,8 +197,11 @@ func TestNatspecE2E(t *testing.T) { codehash := common.BytesToHash(crypto.Sha3(codeb)) // use resolver to register codehash->dochash->url + // test if globalregistry works + // resolver.HashRefContractAddress = "0x0" + // resolver.UrlHintContractAddress = "0x0" registry := resolver.New(tf.xeth) - _, err := registry.Register(tf.coinbase, codehash, dochash, "file:///"+testFileName) + _, err := registry.RegisterAddrWithUrl(tf.coinbase, codehash, dochash, "file:///"+testFileName) if err != nil { t.Errorf("error registering: %v", err) } diff --git a/common/resolver/contracts.go b/common/resolver/contracts.go index 4aad95e436..eba5de1b58 100644 --- a/common/resolver/contracts.go +++ b/common/resolver/contracts.go @@ -33,4 +33,6 @@ const ( // built-in contracts address and code } */ + GlobalRegistrar = `var GlobalRegistrar = web3.eth.contract([{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"name","outputs":[{"name":"o_name","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"content","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"addr","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"subRegistrar","outputs":[{"name":"o_subRegistrar","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_newOwner","type":"address"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_registrar","type":"address"}],"name":"setSubRegistrar","outputs":[],"type":"function"},{"constant":false,"inputs":[],"name":"Registrar","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_a","type":"address"},{"name":"_primary","type":"bool"}],"name":"setAddress","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_content","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"disown","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"}],"name":"Changed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"addr","type":"address"}],"name":"PrimaryChanged","type":"event"}]);` + GlobalRegistrarAddr = "0xc6d9d2cd449a754c494264e1809c50e34d64562b" ) diff --git a/common/resolver/resolver.go b/common/resolver/resolver.go index 9016547e10..1f44f638c1 100644 --- a/common/resolver/resolver.go +++ b/common/resolver/resolver.go @@ -20,7 +20,10 @@ of a url scheme */ // // contract addresses will be hardcoded after they're created -var UrlHintContractAddress, HashRegContractAddress string +var ( + UrlHintContractAddress = "0x0" + HashRegContractAddress = "0x0" +) const ( txValue = "0" @@ -28,42 +31,167 @@ const ( txGasPrice = "1000000000000" ) -func abi(s string) string { +func abiSignature(s string) string { return common.ToHex(crypto.Sha3([]byte(s))[:4]) } var ( - registerContentHashAbi = abi("register(uint256,uint256)") - registerUrlAbi = abi("register(uint256,uint8,uint256)") - setOwnerAbi = abi("setowner()") + HashReg = "HashReg" + UrlHint = "UrlHint" + + registerContentHashAbi = abiSignature("register(uint256,uint256)") + registerUrlAbi = abiSignature("register(uint256,uint8,uint256)") + setOwnerAbi = abiSignature("setowner()") + reserveAbi = abiSignature("reserve(bytes32)") + resolveAbi = abiSignature("addr(bytes32)") + registerAbi = abiSignature("setAddress(bytes32,address,bool)") + addressAbiPrefix = string(make([]byte, 24)) ) type Backend interface { StorageAt(string, string) string Transact(fromStr, toStr, nonceStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, error) + Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, string, error) } type Resolver struct { backend Backend } -func New(eth Backend) *Resolver { - return &Resolver{eth} +func New(eth Backend) (res *Resolver) { + res = &Resolver{eth} + res.setContracts() + return } -// for testing and play temporarily -// ideally the HashReg and UrlHint contracts should be in the genesis block -// if we got build-in support for natspec/contract info -// there should be only one of these officially endorsed -// addresses as constants -// TODO: could get around this with namereg, check -func (self *Resolver) CreateContracts(addr common.Address) (err error) { - HashRegContractAddress, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeHashReg) +func (self *Resolver) setContracts() { + var err error + if HashRegContractAddress != "0x0" { + return + } + // reset iff error anywhere + defer func() { + if err != nil { + HashRegContractAddress = "0x0" + } + }() + hashRegAbi := registerAbi + string(common.Hex2BytesFixed(HashRegContractAddress[2:], 32)) + HashRegContractAddress, _, err = self.backend.Call("", GlobalRegistrarAddr, "", "", "", hashRegAbi) + if err != nil { + err = fmt.Errorf("HashReg address not found: %v", err) + return + } + + if UrlHintContractAddress != "0x0" { + return + } + // reset iff error anywhere + defer func() { + if err != nil { + UrlHintContractAddress = "0x0" + } + }() + + urlHintAbi := registerAbi + string(common.Hex2BytesFixed(UrlHintContractAddress[2:], 32)) + UrlHintContractAddress, _, err = self.backend.Call("", GlobalRegistrarAddr, "", "", "", urlHintAbi) + if err != nil { + err = fmt.Errorf("UrlHint address not found: %v", err) + return + } + + glog.V(logger.Detail).Infof("HashReg @ %v\nUrlHint @ %v\n", HashRegContractAddress, UrlHintContractAddress) +} + +// This can be safely called from tests to or private chains to create +// new HashReg and UrlHint contracts (requires transaction) +// It does nothing if addresses are set +func (self *Resolver) CreateContracts(addr common.Address) (hashReg, urlHint string, err error) { + if HashRegContractAddress != "0x0" { + err = fmt.Errorf("HashReg already exists at %v", HashRegContractAddress) + return + } + hashReg, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeHashReg) if err != nil { return } - UrlHintContractAddress, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeURLhint) + _, err = self.Reserve(addr, HashReg) + if err != nil { + return + } + _, err = self.RegisterAddress(addr, HashReg, common.HexToAddress(hashReg)) + if err != nil { + return + } + + if UrlHintContractAddress != "0x0" { + err = fmt.Errorf("UrlHint already exists at %v", UrlHintContractAddress) + return + } + urlHint, err = self.backend.Transact(addr.Hex(), "", "", txValue, txGas, txGasPrice, ContractCodeURLhint) + if err != nil { + return + } + _, err = self.Reserve(addr, UrlHint) + if err != nil { + return + } + _, err = self.RegisterAddress(addr, UrlHint, common.HexToAddress(urlHint)) + if err != nil { + return + } + HashRegContractAddress = hashReg + UrlHintContractAddress = urlHint glog.V(logger.Detail).Infof("HashReg @ %v\nUrlHint @ %v\n", HashRegContractAddress, UrlHintContractAddress) + + return +} + +// Reserve(from, name) reserves name for the sender address in the globalRegistrar +// the tx needs to be mined to take effect +func (self *Resolver) Reserve(address common.Address, name string) (txh string, err error) { + nameHex, extra := encodeName(name, 6) + abi := reserveAbi + nameHex + extra + return self.backend.Transact( + address.Hex(), + GlobalRegistrarAddr, + "", txValue, txGas, txGasPrice, + abi, + ) +} + +// RegisterAddress(from, name, addr) will set the Address to address for name +// in the globalRegistrar using from as the sender of the transaction +// the tx needs to be mined to take effect +func (self *Resolver) RegisterAddress(from common.Address, name string, address common.Address) (txh string, err error) { + nameHex, extra := encodeName(name, 6) + addrHex := encodeAddress(address) + + trueHex := make([]byte, 64) + trueHex[63] = 1 + + abi := registerAbi + nameHex + addrHex + extra + return self.backend.Transact( + from.Hex(), + GlobalRegistrarAddr, + "", txValue, txGas, txGasPrice, + abi, + ) +} + +// NameToAddr(from, name) queries the registrar for the address on +func (self *Resolver) NameToAddr(from common.Address, name string) (address common.Address, err error) { + nameHex, extra := encodeName(name, 2) + abi := resolveAbi + nameHex + extra + res, _, err := self.backend.Call( + from.Hex(), + GlobalRegistrarAddr, + txValue, txGas, txGasPrice, + abi, + ) + if err != nil { + return + } + address = common.HexToAddress(res) return } @@ -138,7 +266,7 @@ func (self *Resolver) RegisterUrl(address common.Address, hash common.Hash, url return } -func (self *Resolver) Register(address common.Address, codehash, dochash common.Hash, url string) (txh string, err error) { +func (self *Resolver) RegisterAddrWithUrl(address common.Address, codehash, dochash common.Hash, url string) (txh string, err error) { _, err = self.RegisterContentHash(address, codehash, dochash) if err != nil { @@ -151,7 +279,7 @@ func (self *Resolver) Register(address common.Address, codehash, dochash common. // implemented as direct retrieval from db func (self *Resolver) KeyToContentHash(khash common.Hash) (chash common.Hash, err error) { // look up in hashReg - at := common.Bytes2Hex(common.FromHex(HashRegContractAddress)) + at := HashRegContractAddress[2:] key := storageAddress(storageMapping(storageIdx2Addr(1), khash[:])) hash := self.backend.StorageAt(at, key) @@ -172,7 +300,7 @@ func (self *Resolver) ContentHashToUrl(chash common.Hash) (uri string, err error for len(str) > 0 { mapaddr := storageMapping(storageIdx2Addr(1), chash[:]) key := storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(idx))) - hex := self.backend.StorageAt(UrlHintContractAddress, key) + hex := self.backend.StorageAt(UrlHintContractAddress[2:], key) str = string(common.Hex2Bytes(hex[2:])) l := len(str) for (l > 0) && (str[l-1] == 0) { @@ -230,3 +358,18 @@ func storageFixedArray(addr, idx []byte) []byte { func storageAddress(addr []byte) string { return common.ToHex(addr) } + +func encodeAddress(address common.Address) string { + return addressAbiPrefix + address.Hex()[2:] +} + +func encodeName(name string, index uint8) (nameHex, extra string) { + nameHexBytes := make([]byte, 64) + if len(name) > 32 { + nameHexBytes[63] = byte(index) + extra = common.Bytes2Hex([]byte(name)) + } else { + copy(nameHexBytes, []byte(name)) + } + return string(nameHexBytes), extra +} diff --git a/common/resolver/resolver_test.go b/common/resolver/resolver_test.go index 02d12592e5..958d0f97fd 100644 --- a/common/resolver/resolver_test.go +++ b/common/resolver/resolver_test.go @@ -20,22 +20,22 @@ var ( ) func NewTestBackend() *testBackend { - HashRegContractAddress = common.BigToAddress(common.Big0).Hex()[2:] - UrlHintContractAddress = common.BigToAddress(common.Big1).Hex()[2:] + HashRegContractAddress = common.BigToAddress(common.Big0).Hex() //[2:] + UrlHintContractAddress = common.BigToAddress(common.Big1).Hex() //[2:] self := &testBackend{} self.contracts = make(map[string](map[string]string)) - self.contracts[HashRegContractAddress] = make(map[string]string) + self.contracts[HashRegContractAddress[2:]] = make(map[string]string) key := storageAddress(storageMapping(storageIdx2Addr(1), codehash[:])) - self.contracts[HashRegContractAddress][key] = hash.Hex() + self.contracts[HashRegContractAddress[2:]][key] = hash.Hex() - self.contracts[UrlHintContractAddress] = make(map[string]string) + self.contracts[UrlHintContractAddress[2:]] = make(map[string]string) mapaddr := storageMapping(storageIdx2Addr(1), hash[:]) key = storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(0))) - self.contracts[UrlHintContractAddress][key] = common.ToHex([]byte(url)) + self.contracts[UrlHintContractAddress[2:]][key] = common.ToHex([]byte(url)) key = storageAddress(storageFixedArray(mapaddr, storageIdx2Addr(1))) - self.contracts[UrlHintContractAddress][key] = "0x00" + self.contracts[UrlHintContractAddress[2:]][key] = "0x0" return self } @@ -52,6 +52,20 @@ func (self *testBackend) Transact(fromStr, toStr, nonceStr, valueStr, gasStr, ga return "", nil } +func (self *testBackend) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeStr string) (string, string, error) { + return "", "", nil +} + +func TestCreateContractsExists(t *testing.T) { + b := NewTestBackend() + res := New(b) + _, _, err := res.CreateContracts(common.BigToAddress(common.Big0)) + exp := "HashReg already exists at 0x0000000000000000000000000000000000000000" + if err == nil || err.Error() != exp { + t.Errorf("expected error '%s', got '%v'", exp, err) + } +} + func TestKeyToContentHash(t *testing.T) { b := NewTestBackend() res := New(b) @@ -71,7 +85,7 @@ func TestContentHashToUrl(t *testing.T) { res := New(b) got, err := res.ContentHashToUrl(hash) if err != nil { - t.Errorf("expected no error, got %v", err) + t.Errorf("expected error, got %v", err) } else { if got != url { t.Errorf("incorrect result, expected '%v', got '%s'", url, got)