From 1131425cfdaa792a730b4d194c683c2e14703ce2 Mon Sep 17 00:00:00 2001 From: VictorTrustyDev Date: Mon, 1 Jan 2024 01:51:00 +0700 Subject: [PATCH 1/4] add new inspect commands --- cmd/evmd/inspect/block.go | 82 +++++++++++++++++++++++++ cmd/evmd/inspect/inspect.go | 27 ++++++++ cmd/evmd/inspect/latest_block_number.go | 35 +++++++++++ 3 files changed, 144 insertions(+) create mode 100644 cmd/evmd/inspect/block.go create mode 100644 cmd/evmd/inspect/inspect.go create mode 100644 cmd/evmd/inspect/latest_block_number.go diff --git a/cmd/evmd/inspect/block.go b/cmd/evmd/inspect/block.go new file mode 100644 index 0000000000..f7e7583674 --- /dev/null +++ b/cmd/evmd/inspect/block.go @@ -0,0 +1,82 @@ +package inspect + +import ( + "cosmossdk.io/errors" + "encoding/json" + "fmt" + dbm "github.com/cometbft/cometbft-db" + tmstore "github.com/cometbft/cometbft/store" + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" + "path/filepath" + "strconv" + "strings" +) + +func BlockCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "block [latest | ]", + Short: "Inspect a specific block or latest block persisted in the db", + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + var reqHeight int64 + + reqHeightStr := strings.TrimSpace(strings.ToLower(args[0])) + + switch strings.TrimSpace(strings.ToLower(args[0])) { + case "latest", "last", "0", "newest", "-1", "": + reqHeight = 0 // ya I know, but it's enhance the readability of the code + break + default: + var err error + reqHeight, err = strconv.ParseInt(reqHeightStr, 10, 64) + if err != nil { + panic(errors.Wrap(err, fmt.Sprintf("bad block height: %s", reqHeightStr))) + } + if reqHeight < 0 { + panic("invalid block height") + } + break + } + + serverCtx := server.GetServerContextFromCmd(cmd) + cfg := serverCtx.Config + home := cfg.RootDir + + dataDir := filepath.Join(home, "data") + db, err := dbm.NewDB("blockstore", server.GetAppDBBackend(serverCtx.Viper), dataDir) + if err != nil { + panic(errors.Wrap(err, "error while opening db")) + } + + blockStoreState := tmstore.LoadBlockStoreState(db) + + if reqHeight == 0 { + reqHeight = blockStoreState.Height + } else { + if reqHeight > blockStoreState.Height { + panic(fmt.Sprintf("requested height %d is greater than latest height %d in db", reqHeight, blockStoreState.Height)) + } + } + + if reqHeight == blockStoreState.Height { + fmt.Println("Requested latest block height:", reqHeight) + } else { + fmt.Println("Latest block height:", blockStoreState.Height) + fmt.Println("Requested block height:", reqHeight) + } + + blockStore := tmstore.NewBlockStore(db) + block := blockStore.LoadBlock(reqHeight) + + bz, err := json.Marshal(block) + if err != nil { + panic(errors.Wrap(err, "failed to marshal block to JSON")) + } + + fmt.Println(string(bz)) + }, + } + + return cmd +} diff --git a/cmd/evmd/inspect/inspect.go b/cmd/evmd/inspect/inspect.go new file mode 100644 index 0000000000..515c407bf9 --- /dev/null +++ b/cmd/evmd/inspect/inspect.go @@ -0,0 +1,27 @@ +package inspect + +import ( + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" +) + +// Cmd creates a main CLI command +func Cmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "inspect", + Short: "Inspect local database", + PersistentPostRunE: func(cmd *cobra.Command, _ []string) error { + // Bind flags to the Context's Viper so the app construction can set + // options accordingly. + serverCtx := server.GetServerContextFromCmd(cmd) + return serverCtx.Viper.BindPFlags(cmd.Flags()) + }, + } + + cmd.AddCommand( + BlockCmd(), + LatestBlockNumberCmd(), + ) + + return cmd +} diff --git a/cmd/evmd/inspect/latest_block_number.go b/cmd/evmd/inspect/latest_block_number.go new file mode 100644 index 0000000000..5b98ea8427 --- /dev/null +++ b/cmd/evmd/inspect/latest_block_number.go @@ -0,0 +1,35 @@ +package inspect + +import ( + "cosmossdk.io/errors" + "fmt" + dbm "github.com/cometbft/cometbft-db" + tmstore "github.com/cometbft/cometbft/store" + "github.com/cosmos/cosmos-sdk/server" + "github.com/spf13/cobra" + "path/filepath" +) + +func LatestBlockNumberCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "latest-block-number", + Short: "Get the latest block number persisted in the db", + Run: func(cmd *cobra.Command, args []string) { + serverCtx := server.GetServerContextFromCmd(cmd) + cfg := serverCtx.Config + home := cfg.RootDir + + dataDir := filepath.Join(home, "data") + db, err := dbm.NewDB("blockstore", server.GetAppDBBackend(serverCtx.Viper), dataDir) + if err != nil { + panic(errors.Wrap(err, "error while opening db")) + } + + blockStoreState := tmstore.LoadBlockStoreState(db) + + fmt.Println("Latest block height available in database:", blockStoreState.Height) + }, + } + + return cmd +} From 9217af8c7d7ac74a9019863895fe1dadc0fb883b Mon Sep 17 00:00:00 2001 From: VictorTrustyDev Date: Mon, 1 Jan 2024 01:51:17 +0700 Subject: [PATCH 2/4] register new inspect command and sub commands --- cmd/evmd/root.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/evmd/root.go b/cmd/evmd/root.go index 4c0661c684..a9580c12e7 100644 --- a/cmd/evmd/root.go +++ b/cmd/evmd/root.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "github.com/EscanBE/evermint/v12/cmd/evmd/inspect" "github.com/EscanBE/evermint/v12/constants" "github.com/cosmos/cosmos-sdk/client/snapshot" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" @@ -160,6 +161,7 @@ You gonna get "data/application.db" unpacked ) return snapshotCmd }(), + inspect.Cmd(), } // End of command rename chain From b8995a711967b67aaba11985912322b09d76f3f7 Mon Sep 17 00:00:00 2001 From: VictorTrustyDev Date: Mon, 1 Jan 2024 01:52:24 +0700 Subject: [PATCH 3/4] update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7189e3c91e..80eb620b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features - (store) [#12](https://github.com/EscanBE/evermint/pull/12) Add local `snapshots` management commands +- (store) [#14](https://github.com/EscanBE/evermint/pull/14) Add `inspect` command and sub-commands ### Improvement From f925648274b5c553a4d0d34c7577f901b0473b73 Mon Sep 17 00:00:00 2001 From: VictorTrustyDev Date: Mon, 1 Jan 2024 01:56:47 +0700 Subject: [PATCH 4/4] also print block meta --- cmd/evmd/inspect/block.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmd/evmd/inspect/block.go b/cmd/evmd/inspect/block.go index f7e7583674..4274c66b2d 100644 --- a/cmd/evmd/inspect/block.go +++ b/cmd/evmd/inspect/block.go @@ -16,7 +16,7 @@ import ( func BlockCmd() *cobra.Command { cmd := &cobra.Command{ Use: "block [latest | ]", - Short: "Inspect a specific block or latest block persisted in the db", + Short: "Get a specific block or latest block persisted in the db, marshal to JSON and print out", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { var reqHeight int64 @@ -74,6 +74,16 @@ func BlockCmd() *cobra.Command { panic(errors.Wrap(err, "failed to marshal block to JSON")) } + fmt.Println("--- Block ---") + fmt.Println(string(bz)) + + meta := blockStore.LoadBaseMeta() + bz, err = json.Marshal(meta) + if err != nil { + panic(errors.Wrap(err, "failed to marshal block meta to JSON")) + } + + fmt.Println("--- Meta ---") fmt.Println(string(bz)) }, }