| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // 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. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | package core | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	"compress/gzip" | 
					
						
							|  |  |  | 	"encoding/base64" | 
					
						
							| 
									
										
										
										
											2015-02-20 18:05:46 +01:00
										 |  |  | 	"encoding/json" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	"io" | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2015-06-19 01:57:16 +02:00
										 |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2014-08-21 14:47:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-17 11:19:23 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2015-03-23 16:59:09 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/state" | 
					
						
							| 
									
										
										
										
											2015-03-31 15:30:55 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/core/types" | 
					
						
							| 
									
										
										
										
											2015-09-14 09:35:57 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethdb" | 
					
						
							| 
									
										
										
										
											2015-07-25 21:48:53 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/logger" | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/logger/glog" | 
					
						
							| 
									
										
										
										
											2015-04-02 05:17:15 +02:00
										 |  |  | 	"github.com/ethereum/go-ethereum/params" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | // WriteGenesisBlock writes the genesis block to the database as block number 0 | 
					
						
							| 
									
										
										
										
											2015-09-14 09:35:57 +02:00
										 |  |  | func WriteGenesisBlock(chainDb ethdb.Database, reader io.Reader) (*types.Block, error) { | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	contents, err := ioutil.ReadAll(reader) | 
					
						
							| 
									
										
										
										
											2015-02-20 18:05:46 +01:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2015-02-20 18:05:46 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var genesis struct { | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 		ChainConfig *params.ChainConfig `json:"config"` | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 		Nonce       string | 
					
						
							|  |  |  | 		Timestamp   string | 
					
						
							|  |  |  | 		ParentHash  string | 
					
						
							|  |  |  | 		ExtraData   string | 
					
						
							|  |  |  | 		GasLimit    string | 
					
						
							|  |  |  | 		Difficulty  string | 
					
						
							|  |  |  | 		Mixhash     string | 
					
						
							|  |  |  | 		Coinbase    string | 
					
						
							|  |  |  | 		Alloc       map[string]struct { | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 			Code    string | 
					
						
							|  |  |  | 			Storage map[string]string | 
					
						
							|  |  |  | 			Balance string | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-12-23 13:48:44 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	if err := json.Unmarshal(contents, &genesis); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 16:35:55 +02:00
										 |  |  | 	// creating with empty hash always works | 
					
						
							|  |  |  | 	statedb, _ := state.New(common.Hash{}, chainDb) | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	for addr, account := range genesis.Alloc { | 
					
						
							|  |  |  | 		address := common.HexToAddress(addr) | 
					
						
							|  |  |  | 		statedb.AddBalance(address, common.String2Big(account.Balance)) | 
					
						
							|  |  |  | 		statedb.SetCode(address, common.Hex2Bytes(account.Code)) | 
					
						
							|  |  |  | 		for key, value := range account.Storage { | 
					
						
							|  |  |  | 			statedb.SetState(address, common.HexToHash(key), common.HexToHash(value)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 	root, stateBatch := statedb.CommitBatch(false) | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	difficulty := common.String2Big(genesis.Difficulty) | 
					
						
							| 
									
										
										
										
											2015-06-16 12:41:50 +02:00
										 |  |  | 	block := types.NewBlock(&types.Header{ | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		Nonce:      types.EncodeNonce(common.String2Big(genesis.Nonce).Uint64()), | 
					
						
							| 
									
										
										
										
											2015-08-24 02:52:53 +02:00
										 |  |  | 		Time:       common.String2Big(genesis.Timestamp), | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		ParentHash: common.HexToHash(genesis.ParentHash), | 
					
						
							| 
									
										
										
										
											2015-07-26 14:25:25 +02:00
										 |  |  | 		Extra:      common.FromHex(genesis.ExtraData), | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		GasLimit:   common.String2Big(genesis.GasLimit), | 
					
						
							|  |  |  | 		Difficulty: difficulty, | 
					
						
							|  |  |  | 		MixDigest:  common.HexToHash(genesis.Mixhash), | 
					
						
							|  |  |  | 		Coinbase:   common.HexToAddress(genesis.Coinbase), | 
					
						
							| 
									
										
										
										
											2015-08-18 14:14:45 +02:00
										 |  |  | 		Root:       root, | 
					
						
							| 
									
										
										
										
											2015-06-16 12:41:50 +02:00
										 |  |  | 	}, nil, nil, nil) | 
					
						
							| 
									
										
										
										
											2015-02-20 18:05:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-05 15:22:04 +02:00
										 |  |  | 	if block := GetBlock(chainDb, block.Hash(), block.NumberU64()); block != nil { | 
					
						
							| 
									
										
										
										
											2015-07-25 21:48:53 +02:00
										 |  |  | 		glog.V(logger.Info).Infoln("Genesis block already in chain. Writing canonical number") | 
					
						
							| 
									
										
										
										
											2015-09-07 20:43:01 +03:00
										 |  |  | 		err := WriteCanonicalHash(chainDb, block.Hash(), block.NumberU64()) | 
					
						
							| 
									
										
										
										
											2015-07-25 21:48:53 +02:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return block, nil | 
					
						
							| 
									
										
										
										
											2015-07-25 16:53:35 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-18 14:14:45 +02:00
										 |  |  | 	if err := stateBatch.Write(); err != nil { | 
					
						
							|  |  |  | 		return nil, fmt.Errorf("cannot write state: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-05 15:22:04 +02:00
										 |  |  | 	if err := WriteTd(chainDb, block.Hash(), block.NumberU64(), difficulty); err != nil { | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-09-07 20:43:01 +03:00
										 |  |  | 	if err := WriteBlock(chainDb, block); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-05 15:22:04 +02:00
										 |  |  | 	if err := WriteBlockReceipts(chainDb, block.Hash(), block.NumberU64(), nil); err != nil { | 
					
						
							| 
									
										
										
										
											2015-09-24 19:36:23 +03:00
										 |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-09-07 20:43:01 +03:00
										 |  |  | 	if err := WriteCanonicalHash(chainDb, block.Hash(), block.NumberU64()); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := WriteHeadBlockHash(chainDb, block.Hash()); err != nil { | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 	if err := WriteChainConfig(chainDb, block.Hash(), genesis.ChainConfig); err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	return block, nil | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-19 01:57:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // GenesisBlockForTesting creates a block in which addr has the given wei balance. | 
					
						
							| 
									
										
										
										
											2015-10-06 16:35:55 +02:00
										 |  |  | // The state trie of the block is written to db. the passed db needs to contain a state root | 
					
						
							| 
									
										
										
										
											2015-09-14 09:35:57 +02:00
										 |  |  | func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block { | 
					
						
							| 
									
										
										
										
											2015-10-06 16:35:55 +02:00
										 |  |  | 	statedb, _ := state.New(common.Hash{}, db) | 
					
						
							| 
									
										
										
										
											2015-06-19 01:57:16 +02:00
										 |  |  | 	obj := statedb.GetOrNewStateObject(addr) | 
					
						
							|  |  |  | 	obj.SetBalance(balance) | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 	root, err := statedb.Commit(false) | 
					
						
							| 
									
										
										
										
											2015-08-18 14:14:45 +02:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("cannot write state: %v", err)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-06-19 01:57:16 +02:00
										 |  |  | 	block := types.NewBlock(&types.Header{ | 
					
						
							|  |  |  | 		Difficulty: params.GenesisDifficulty, | 
					
						
							|  |  |  | 		GasLimit:   params.GenesisGasLimit, | 
					
						
							| 
									
										
										
										
											2015-08-18 14:14:45 +02:00
										 |  |  | 		Root:       root, | 
					
						
							| 
									
										
										
										
											2015-06-19 01:57:16 +02:00
										 |  |  | 	}, nil, nil, nil) | 
					
						
							|  |  |  | 	return block | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 14:01:41 +02:00
										 |  |  | type GenesisAccount struct { | 
					
						
							|  |  |  | 	Address common.Address | 
					
						
							|  |  |  | 	Balance *big.Int | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func WriteGenesisBlockForTesting(db ethdb.Database, accounts ...GenesisAccount) *types.Block { | 
					
						
							|  |  |  | 	accountJson := "{" | 
					
						
							|  |  |  | 	for i, account := range accounts { | 
					
						
							|  |  |  | 		if i != 0 { | 
					
						
							|  |  |  | 			accountJson += "," | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		accountJson += fmt.Sprintf(`"0x%x":{"balance":"0x%x"}`, account.Address, account.Balance.Bytes()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	accountJson += "}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	testGenesis := fmt.Sprintf(`{ | 
					
						
							|  |  |  | 	"nonce":"0x%x", | 
					
						
							|  |  |  | 	"gasLimit":"0x%x", | 
					
						
							|  |  |  | 	"difficulty":"0x%x", | 
					
						
							| 
									
										
										
										
											2015-08-17 14:01:41 +02:00
										 |  |  | 	"alloc": %s | 
					
						
							|  |  |  | }`, types.EncodeNonce(0), params.GenesisGasLimit.Bytes(), params.GenesisDifficulty.Bytes(), accountJson) | 
					
						
							| 
									
										
										
										
											2015-08-06 19:57:39 +02:00
										 |  |  | 	block, _ := WriteGenesisBlock(db, strings.NewReader(testGenesis)) | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	return block | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | // WriteDefaultGenesisBlock assembles the official Ethereum genesis block and | 
					
						
							|  |  |  | // writes it - along with all associated state - into a chain database. | 
					
						
							|  |  |  | func WriteDefaultGenesisBlock(chainDb ethdb.Database) (*types.Block, error) { | 
					
						
							|  |  |  | 	return WriteGenesisBlock(chainDb, strings.NewReader(DefaultGenesisBlock())) | 
					
						
							| 
									
										
										
										
											2015-10-05 13:01:34 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | // WriteTestNetGenesisBlock assembles the Morden test network genesis block and | 
					
						
							|  |  |  | // writes it - along with all associated state - into a chain database. | 
					
						
							|  |  |  | func WriteTestNetGenesisBlock(chainDb ethdb.Database) (*types.Block, error) { | 
					
						
							|  |  |  | 	return WriteGenesisBlock(chainDb, strings.NewReader(TestNetGenesisBlock())) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // WriteOlympicGenesisBlock assembles the Olympic genesis block and writes it | 
					
						
							|  |  |  | // along with all associated state into a chain database. | 
					
						
							|  |  |  | func WriteOlympicGenesisBlock(db ethdb.Database) (*types.Block, error) { | 
					
						
							|  |  |  | 	return WriteGenesisBlock(db, strings.NewReader(OlympicGenesisBlock())) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DefaultGenesisBlock assembles a JSON string representing the default Ethereum | 
					
						
							|  |  |  | // genesis block. | 
					
						
							|  |  |  | func DefaultGenesisBlock() string { | 
					
						
							|  |  |  | 	reader, err := gzip.NewReader(base64.NewDecoder(base64.StdEncoding, strings.NewReader(defaultGenesisBlock))) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("failed to access default genesis: %v", err)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	blob, err := ioutil.ReadAll(reader) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("failed to load default genesis: %v", err)) | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-17 18:33:25 +02:00
										 |  |  | 	return string(blob) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // OlympicGenesisBlock assembles a JSON string representing the Olympic genesis | 
					
						
							|  |  |  | // block. | 
					
						
							|  |  |  | func OlympicGenesisBlock() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf(`{ | 
					
						
							|  |  |  | 		"nonce":"0x%x", | 
					
						
							|  |  |  | 		"gasLimit":"0x%x", | 
					
						
							|  |  |  | 		"difficulty":"0x%x", | 
					
						
							|  |  |  | 		"alloc": { | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000001": {"balance": "1"}, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000002": {"balance": "1"}, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000003": {"balance": "1"}, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000004": {"balance": "1"}, | 
					
						
							|  |  |  | 			"dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"e4157b34ea9615cfbde6b4fda419828124b70c78": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"b9c015918bdaba24b4ff057a92a3873d6eb201be": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"6c386a4b26f73c802f34673f7248bb118f97424a": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"cd2a3d9f938e13cd947ec05abc7fe734df8dd826": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"2ef47100e0787b915105fd5e3f4ff6752079d5cb": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"e6716f9544a56c530d868e4bfbacb172315bdead": {"balance": "1606938044258990275541962092341162602522202993782792835301376"}, | 
					
						
							|  |  |  | 			"1a26338f0d905e295fccb71fa9ea849ffa12aaf4": {"balance": "1606938044258990275541962092341162602522202993782792835301376"} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}`, types.EncodeNonce(42), params.GenesisGasLimit.Bytes(), params.GenesisDifficulty.Bytes()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TestNetGenesisBlock assembles a JSON string representing the Morden test net | 
					
						
							|  |  |  | // genenis block. | 
					
						
							|  |  |  | func TestNetGenesisBlock() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf(`{ | 
					
						
							|  |  |  | 		"nonce": "0x%x", | 
					
						
							|  |  |  | 		"difficulty": "0x20000", | 
					
						
							|  |  |  | 		"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578", | 
					
						
							|  |  |  | 		"coinbase": "0x0000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 		"timestamp": "0x00", | 
					
						
							|  |  |  | 		"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", | 
					
						
							|  |  |  | 		"extraData": "0x", | 
					
						
							|  |  |  | 		"gasLimit": "0x2FEFD8", | 
					
						
							|  |  |  | 		"alloc": { | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000001": { "balance": "1" }, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000002": { "balance": "1" }, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000003": { "balance": "1" }, | 
					
						
							|  |  |  | 			"0000000000000000000000000000000000000004": { "balance": "1" }, | 
					
						
							|  |  |  | 			"102e61f5d8f9bc71d0ad4a084df4e65e05ce0e1c": { "balance": "1606938044258990275541962092341162602522202993782792835301376" } | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}`, types.EncodeNonce(0x6d6f7264656e)) | 
					
						
							| 
									
										
										
										
											2015-07-10 14:29:40 +02:00
										 |  |  | } |