github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/state/dump.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2014 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package state 26 27 import ( 28 "encoding/json" 29 "fmt" 30 31 "github.com/ethereum/go-ethereum/common" 32 "github.com/ethereum/go-ethereum/rlp" 33 "github.com/ethereum/go-ethereum/trie" 34 ) 35 36 type DumpAccount struct { 37 Balance string `json:"balance"` 38 Nonce uint64 `json:"nonce"` 39 Root string `json:"root"` 40 CodeHash string `json:"codeHash"` 41 Code string `json:"code"` 42 Storage map[string]string `json:"storage"` 43 } 44 45 type Dump struct { 46 Root string `json:"root"` 47 Accounts map[string]DumpAccount `json:"accounts"` 48 } 49 50 func (self *StateDB) RawDump() Dump { 51 dump := Dump{ 52 Root: fmt.Sprintf("%x", self.trie.Hash()), 53 Accounts: make(map[string]DumpAccount), 54 } 55 56 it := trie.NewIterator(self.trie.NodeIterator(nil)) 57 for it.Next() { 58 addr := self.trie.GetKey(it.Key) 59 var data Account 60 if err := rlp.DecodeBytes(it.Value, &data); err != nil { 61 panic(err) 62 } 63 64 obj := newObject(nil, common.BytesToAddress(addr), data) 65 account := DumpAccount{ 66 Balance: data.Balance.String(), 67 Nonce: data.Nonce, 68 Root: common.Bytes2Hex(data.Root[:]), 69 CodeHash: common.Bytes2Hex(data.CodeHash), 70 Code: common.Bytes2Hex(obj.Code(self.db)), 71 Storage: make(map[string]string), 72 } 73 storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) 74 for storageIt.Next() { 75 account.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value) 76 } 77 dump.Accounts[common.Bytes2Hex(addr)] = account 78 } 79 return dump 80 } 81 82 func (self *StateDB) Dump() []byte { 83 json, err := json.MarshalIndent(self.RawDump(), "", " ") 84 if err != nil { 85 fmt.Println("dump err", err) 86 } 87 88 return json 89 }