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  }