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 }