github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/cmd/fbchaind/display_state.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"path/filepath"
     7  
     8  	ethcmn "github.com/ethereum/go-ethereum/common"
     9  	"github.com/fibonacci-chain/fbc/app"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    13  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    14  	"github.com/spf13/cobra"
    15  	"github.com/spf13/viper"
    16  )
    17  
    18  const (
    19  	FlagDisplayVersion string = "version"
    20  	FlagDisplayAddress string = "address"
    21  )
    22  
    23  func displayStateCmd(ctx *server.Context) *cobra.Command {
    24  	cmd := &cobra.Command{
    25  		Use:   "display-state",
    26  		Short: "display account or contract state",
    27  	}
    28  
    29  	cmd.AddCommand(
    30  		displayAccount(ctx),
    31  		displayContract(ctx),
    32  	)
    33  
    34  	return cmd
    35  }
    36  
    37  func displayAccount(ctx *server.Context) *cobra.Command {
    38  	cmd := &cobra.Command{
    39  		Use:   "account",
    40  		Short: "display account info at given height",
    41  		Run: func(cmd *cobra.Command, args []string) {
    42  			log.Println("--------- display account start ---------")
    43  			displayAccountState(ctx)
    44  			log.Println("--------- display account end ---------")
    45  		},
    46  	}
    47  	cmd.Flags().String(FlagDisplayAddress, "", "target contract address to display")
    48  	cmd.Flags().Int64(FlagDisplayVersion, 0, "target state version to display")
    49  	cmd.Flags().String(sdk.FlagDBBackend, tmtypes.DBBackend, "Database backend: goleveldb | rocksdb")
    50  
    51  	return cmd
    52  }
    53  
    54  func displayContract(ctx *server.Context) *cobra.Command {
    55  	cmd := &cobra.Command{
    56  		Use:   "contract",
    57  		Short: "display contract state info at given height",
    58  		Run: func(cmd *cobra.Command, args []string) {
    59  			log.Println("--------- display contract state start ---------")
    60  			displayContractState(ctx)
    61  			log.Println("--------- display contract state end ---------")
    62  		},
    63  	}
    64  	cmd.Flags().String(FlagDisplayAddress, "", "target contract address to display")
    65  	cmd.Flags().Int64(FlagDisplayVersion, 0, "target state version to display")
    66  	cmd.Flags().String(sdk.FlagDBBackend, tmtypes.DBBackend, "Database backend: goleveldb | rocksdb")
    67  
    68  	return cmd
    69  }
    70  
    71  func displayAccountState(ctx *server.Context) {
    72  	dispApp := newDisplayApp(ctx)
    73  
    74  	// load start version
    75  	displayVersion := viper.GetInt64(FlagDisplayVersion)
    76  	dispApp.EvmKeeper.SetTargetMptVersion(displayVersion)
    77  
    78  	err := dispApp.LoadHeight(displayVersion)
    79  	panicError(err)
    80  
    81  	accountAddr := viper.GetString(FlagDisplayAddress)
    82  	accAddr, err := sdk.AccAddressFromBech32(accountAddr)
    83  	if err != nil {
    84  		panic("Fail to parser AccAddress from : " + accountAddr)
    85  	}
    86  
    87  	// init deliver state
    88  	dispApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: displayVersion + 1}})
    89  
    90  	acc := dispApp.AccountKeeper.GetAccount(dispApp.GetDeliverStateCtx(), accAddr)
    91  	fmt.Println("account is: ", acc.String())
    92  }
    93  
    94  func displayContractState(ctx *server.Context) {
    95  	dispApp := newDisplayApp(ctx)
    96  
    97  	// load start version
    98  	displayVersion := viper.GetInt64(FlagDisplayVersion)
    99  	dispApp.EvmKeeper.SetTargetMptVersion(displayVersion)
   100  
   101  	err := dispApp.LoadHeight(displayVersion)
   102  	panicError(err)
   103  
   104  	contractAddr := viper.GetString(FlagDisplayAddress)
   105  	addr := ethcmn.HexToAddress(contractAddr)
   106  
   107  	// init deliver state
   108  	dispApp.BeginBlock(abci.RequestBeginBlock{Header: abci.Header{Height: displayVersion + 1}})
   109  
   110  	_ = dispApp.EvmKeeper.ForEachStorage(dispApp.GetDeliverStateCtx(), addr, func(key, value ethcmn.Hash) bool {
   111  		fmt.Println("Key is: ", key.String(), ", value is: ", value.String())
   112  		return false
   113  	})
   114  }
   115  
   116  func newDisplayApp(ctx *server.Context) *app.FBChainApp {
   117  	rootDir := ctx.Config.RootDir
   118  	dataDir := filepath.Join(rootDir, "data")
   119  	db, err := sdk.NewDB(applicationDB, dataDir)
   120  	if err != nil {
   121  		panic("fail to open application db: " + err.Error())
   122  	}
   123  
   124  	return app.NewFBChainApp(
   125  		ctx.Logger,
   126  		db,
   127  		nil,
   128  		false,
   129  		map[int64]bool{},
   130  		0,
   131  	)
   132  }