package rpc import ( "context" "fmt" "strconv" "github.com/spf13/cobra" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec/legacy" ) // BlockCommand returns the verified block data for a given heights func BlockCommand() *cobra.Command { cmd := &cobra.Command{ Use: "block [height]", Short: "Get verified data for the block at given height", Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx, err := client.GetClientQueryContext(cmd) if err != nil { return err } var height *int64 // optional height if len(args) > 0 { h, err := strconv.Atoi(args[0]) if err != nil { return err } if h > 0 { tmp := int64(h) height = &tmp } } output, err := getBlock(clientCtx, height) if err != nil { return err } fmt.Println(string(output)) return nil }, } cmd.Flags().StringP(flags.FlagNode, "n", "tcp://localhost:26657", "Node to connect to") return cmd } func getBlock(clientCtx client.Context, height *int64) ([]byte, error) { // get the node node, err := clientCtx.GetNode() if err != nil { return nil, err } // header -> BlockchainInfo // header, tx -> Block // results -> BlockResults res, err := node.Block(context.Background(), height) if err != nil { return nil, err } return legacy.Cdc.MarshalJSON(res) } // get the current blockchain height func GetChainHeight(clientCtx client.Context) (int64, error) { node, err := clientCtx.GetNode() if err != nil { return -1, err } status, err := node.Status(context.Background()) if err != nil { return -1, err } height := status.SyncInfo.LatestBlockHeight return height, nil }