github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/cmd/fbchaind/mpt/mpt_viewer.go (about) 1 package mpt 2 3 import ( 4 "fmt" 5 "log" 6 7 ethcmn "github.com/ethereum/go-ethereum/common" 8 ethcrypto "github.com/ethereum/go-ethereum/crypto" 9 "github.com/ethereum/go-ethereum/trie" 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt" 12 "github.com/spf13/cobra" 13 ) 14 15 func mptViewerCmd(ctx *server.Context) *cobra.Command { 16 cmd := &cobra.Command{ 17 Use: "mptviewer", 18 Args: cobra.ExactArgs(1), 19 Short: "iterate mpt store (acc, evm)", 20 PreRunE: func(cmd *cobra.Command, args []string) error { 21 return checkValidKey(args[0]) 22 }, 23 Run: func(cmd *cobra.Command, args []string) { 24 log.Printf("--------- iterate %s data start ---------\n", args[0]) 25 switch args[0] { 26 case accStoreKey: 27 iterateAccMpt(ctx) 28 case evmStoreKey: 29 iterateEvmMpt(ctx) 30 } 31 log.Printf("--------- iterate %s data end ---------\n", args[0]) 32 }, 33 } 34 return cmd 35 } 36 37 func iterateAccMpt(ctx *server.Context) { 38 accMptDb := mpt.InstanceOfMptStore() 39 heightBytes, err := accMptDb.TrieDB().DiskDB().Get(mpt.KeyPrefixAccLatestStoredHeight) 40 panicError(err) 41 rootHash, err := accMptDb.TrieDB().DiskDB().Get(append(mpt.KeyPrefixAccRootMptHash, heightBytes...)) 42 panicError(err) 43 accTrie, err := accMptDb.OpenTrie(ethcmn.BytesToHash(rootHash)) 44 panicError(err) 45 fmt.Println("accTrie root hash:", accTrie.Hash()) 46 47 itr := trie.NewIterator(accTrie.NodeIterator(nil)) 48 for itr.Next() { 49 fmt.Printf("%s: %s\n", ethcmn.Bytes2Hex(itr.Key), ethcmn.Bytes2Hex(itr.Value)) 50 } 51 } 52 53 func iterateEvmMpt(ctx *server.Context) { 54 evmMptDb := mpt.InstanceOfMptStore() 55 hhash, err := evmMptDb.TrieDB().DiskDB().Get(mpt.KeyPrefixAccLatestStoredHeight) 56 panicError(err) 57 rootHash, err := evmMptDb.TrieDB().DiskDB().Get(append(mpt.KeyPrefixEvmRootMptHash, hhash...)) 58 panicError(err) 59 evmTrie, err := evmMptDb.OpenTrie(ethcmn.BytesToHash(rootHash)) 60 panicError(err) 61 fmt.Println("evmTrie root hash:", evmTrie.Hash()) 62 63 var stateRoot ethcmn.Hash 64 itr := trie.NewIterator(evmTrie.NodeIterator(nil)) 65 for itr.Next() { 66 addr := ethcmn.BytesToAddress(evmTrie.GetKey(itr.Key)) 67 addrHash := ethcrypto.Keccak256Hash(addr[:]) 68 stateRoot.SetBytes(itr.Value) 69 70 contractTrie := getStorageTrie(evmMptDb, addrHash, stateRoot) 71 fmt.Println(addr.String(), contractTrie.Hash()) 72 73 cItr := trie.NewIterator(contractTrie.NodeIterator(nil)) 74 for cItr.Next() { 75 fmt.Printf("%s: %s\n", ethcmn.Bytes2Hex(cItr.Key), ethcmn.Bytes2Hex(cItr.Value)) 76 } 77 } 78 }