OSDN Git Service

Hulk did something
[bytom/vapor.git] / cmd / bytomcli / commands / block.go
diff --git a/cmd/bytomcli/commands/block.go b/cmd/bytomcli/commands/block.go
new file mode 100644 (file)
index 0000000..9ce4196
--- /dev/null
@@ -0,0 +1,219 @@
+package commands
+
+import (
+       "encoding/hex"
+       "os"
+       "strconv"
+       "unicode"
+
+       "github.com/spf13/cobra"
+       jww "github.com/spf13/jwalterweatherman"
+
+       chainjson "github.com/vapor/encoding/json"
+       "github.com/vapor/util"
+)
+
+func init() {
+       getDifficultyCmd.PersistentFlags().StringVar(&blockHash, "hash", "", "hash of block")
+       getDifficultyCmd.PersistentFlags().IntVar(&blockHeight, "height", 0, "height of block")
+
+       getHashRateCmd.PersistentFlags().StringVar(&blockHash, "hash", "", "hash of block")
+       getHashRateCmd.PersistentFlags().IntVar(&blockHeight, "height", 0, "height of block")
+}
+
+var (
+       blockHash   = ""
+       blockHeight = 0
+)
+
+var getBlockHashCmd = &cobra.Command{
+       Use:   "get-block-hash",
+       Short: "Get the hash of most recent block",
+       Args:  cobra.NoArgs,
+       Run: func(cmd *cobra.Command, args []string) {
+               data, exitCode := util.ClientCall("get-block-hash")
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}
+
+var getBlockCountCmd = &cobra.Command{
+       Use:   "get-block-count",
+       Short: "Get the number of most recent block",
+       Args:  cobra.NoArgs,
+       Run: func(cmd *cobra.Command, args []string) {
+               data, exitCode := util.ClientCall("/get-block-count")
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}
+
+var getBlockCmd = &cobra.Command{
+       Use:   "get-block <hash> | <height>",
+       Short: "Get a whole block matching the given hash or height",
+       Args:  cobra.ExactArgs(1),
+       Run: func(cmd *cobra.Command, args []string) {
+               var hash chainjson.HexBytes
+               var height uint64
+               var err error
+               isNumber := false
+
+               for _, ch := range args[0] {
+                       // check whether the char is hex digit
+                       if !(unicode.IsNumber(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
+                               jww.ERROR.Printf("Invalid value for hash or height")
+                               os.Exit(util.ErrLocalExe)
+                       }
+
+                       if !unicode.IsNumber(ch) {
+                               isNumber = true
+                       }
+               }
+
+               if isNumber {
+                       if len(args[0]) != 64 {
+                               jww.ERROR.Printf("Invalid hash length")
+                               os.Exit(util.ErrLocalExe)
+                       }
+
+                       hash, err = hex.DecodeString(args[0])
+                       if err != nil {
+                               jww.ERROR.Println(err)
+                               os.Exit(util.ErrLocalExe)
+                       }
+               } else {
+                       height, err = strconv.ParseUint(args[0], 10, 64)
+                       if err != nil {
+                               jww.ERROR.Printf("Invalid height value")
+                               os.Exit(util.ErrLocalExe)
+                       }
+               }
+
+               blockReq := &struct {
+                       BlockHeight uint64             `json:"block_height"`
+                       BlockHash   chainjson.HexBytes `json:"block_hash"`
+               }{BlockHeight: height, BlockHash: hash}
+
+               data, exitCode := util.ClientCall("/get-block", blockReq)
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}
+
+var getBlockHeaderCmd = &cobra.Command{
+       Use:   "get-block-header <hash> | <height>",
+       Short: "Get the header of a block matching the given hash or height",
+       Args:  cobra.ExactArgs(1),
+       Run: func(cmd *cobra.Command, args []string) {
+               var hash chainjson.HexBytes
+               var height uint64
+               var err error
+               isNumber := false
+
+               for _, ch := range args[0] {
+                       // check whether the char is hex digit
+                       if !(unicode.IsNumber(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
+                               jww.ERROR.Printf("Invalid value for hash or height")
+                               os.Exit(util.ErrLocalExe)
+                       }
+
+                       if !unicode.IsNumber(ch) {
+                               isNumber = true
+                       }
+               }
+
+               if isNumber {
+                       if len(args[0]) != 64 {
+                               jww.ERROR.Printf("Invalid hash length")
+                               os.Exit(util.ErrLocalExe)
+                       }
+
+                       hash, err = hex.DecodeString(args[0])
+                       if err != nil {
+                               jww.ERROR.Println(err)
+                               os.Exit(util.ErrLocalExe)
+                       }
+               } else {
+                       height, err = strconv.ParseUint(args[0], 10, 64)
+                       if err != nil {
+                               jww.ERROR.Printf("Invalid height value")
+                               os.Exit(util.ErrLocalExe)
+                       }
+               }
+
+               req := &struct {
+                       BlockHeight uint64             `json:"block_height"`
+                       BlockHash   chainjson.HexBytes `json:"block_hash"`
+               }{BlockHeight: height, BlockHash: hash}
+
+               data, exitCode := util.ClientCall("/get-block-header", req)
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}
+
+var getDifficultyCmd = &cobra.Command{
+       Use:   "get-difficulty",
+       Short: "Get the difficulty of most recent block",
+       Args:  cobra.NoArgs,
+       Run: func(cmd *cobra.Command, args []string) {
+               var hash chainjson.HexBytes
+               var err error
+
+               if blockHash != "" {
+                       hash, err = hex.DecodeString(blockHash)
+                       if err != nil {
+                               jww.ERROR.Println(err)
+                               os.Exit(util.ErrLocalExe)
+                       }
+               }
+
+               req := &struct {
+                       BlockHeight uint64             `json:"block_height"`
+                       BlockHash   chainjson.HexBytes `json:"block_hash"`
+               }{BlockHeight: uint64(blockHeight), BlockHash: hash}
+
+               data, exitCode := util.ClientCall("/get-difficulty", req)
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}
+
+var getHashRateCmd = &cobra.Command{
+       Use:   "get-hash-rate",
+       Short: "Get the nonce of most recent block",
+       Args:  cobra.NoArgs,
+       Run: func(cmd *cobra.Command, args []string) {
+               var hash chainjson.HexBytes
+               var err error
+
+               if blockHash != "" {
+                       hash, err = hex.DecodeString(blockHash)
+                       if err != nil {
+                               jww.ERROR.Println(err)
+                               os.Exit(util.ErrLocalExe)
+                       }
+               }
+
+               req := &struct {
+                       BlockHeight uint64             `json:"block_height"`
+                       BlockHash   chainjson.HexBytes `json:"block_hash"`
+               }{BlockHeight: uint64(blockHeight), BlockHash: hash}
+
+               data, exitCode := util.ClientCall("/get-hash-rate", req)
+               if exitCode != util.Success {
+                       os.Exit(exitCode)
+               }
+               printJSON(data)
+       },
+}