github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/cmd/bytomcli/commands/block.go (about)

     1  package commands
     2  
     3  import (
     4  	"encoding/hex"
     5  	"os"
     6  	"strconv"
     7  	"unicode"
     8  
     9  	"github.com/spf13/cobra"
    10  	jww "github.com/spf13/jwalterweatherman"
    11  
    12  	chainjson "github.com/bytom/bytom/encoding/json"
    13  	"github.com/bytom/bytom/util"
    14  )
    15  
    16  func init() {
    17  	getDifficultyCmd.PersistentFlags().StringVar(&blockHash, "hash", "", "hash of block")
    18  	getDifficultyCmd.PersistentFlags().IntVar(&blockHeight, "height", 0, "height of block")
    19  
    20  	getHashRateCmd.PersistentFlags().StringVar(&blockHash, "hash", "", "hash of block")
    21  	getHashRateCmd.PersistentFlags().IntVar(&blockHeight, "height", 0, "height of block")
    22  }
    23  
    24  var (
    25  	blockHash   = ""
    26  	blockHeight = 0
    27  )
    28  
    29  var getBlockHashCmd = &cobra.Command{
    30  	Use:   "get-block-hash",
    31  	Short: "Get the hash of most recent block",
    32  	Args:  cobra.NoArgs,
    33  	Run: func(cmd *cobra.Command, args []string) {
    34  		data, exitCode := util.ClientCall("get-block-hash")
    35  		if exitCode != util.Success {
    36  			os.Exit(exitCode)
    37  		}
    38  		printJSON(data)
    39  	},
    40  }
    41  
    42  var getBlockCountCmd = &cobra.Command{
    43  	Use:   "get-block-count",
    44  	Short: "Get the number of most recent block",
    45  	Args:  cobra.NoArgs,
    46  	Run: func(cmd *cobra.Command, args []string) {
    47  		data, exitCode := util.ClientCall("/get-block-count")
    48  		if exitCode != util.Success {
    49  			os.Exit(exitCode)
    50  		}
    51  		printJSON(data)
    52  	},
    53  }
    54  
    55  var getBlockCmd = &cobra.Command{
    56  	Use:   "get-block <hash> | <height>",
    57  	Short: "Get a whole block matching the given hash or height",
    58  	Args:  cobra.ExactArgs(1),
    59  	Run: func(cmd *cobra.Command, args []string) {
    60  		var hash chainjson.HexBytes
    61  		var height uint64
    62  		var err error
    63  		isNumber := false
    64  
    65  		for _, ch := range args[0] {
    66  			// check whether the char is hex digit
    67  			if !(unicode.IsNumber(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
    68  				jww.ERROR.Printf("Invalid value for hash or height")
    69  				os.Exit(util.ErrLocalExe)
    70  			}
    71  
    72  			if !unicode.IsNumber(ch) {
    73  				isNumber = true
    74  			}
    75  		}
    76  
    77  		if isNumber {
    78  			if len(args[0]) != 64 {
    79  				jww.ERROR.Printf("Invalid hash length")
    80  				os.Exit(util.ErrLocalExe)
    81  			}
    82  
    83  			hash, err = hex.DecodeString(args[0])
    84  			if err != nil {
    85  				jww.ERROR.Println(err)
    86  				os.Exit(util.ErrLocalExe)
    87  			}
    88  		} else {
    89  			height, err = strconv.ParseUint(args[0], 10, 64)
    90  			if err != nil {
    91  				jww.ERROR.Printf("Invalid height value")
    92  				os.Exit(util.ErrLocalExe)
    93  			}
    94  		}
    95  
    96  		blockReq := &struct {
    97  			BlockHeight uint64             `json:"block_height"`
    98  			BlockHash   chainjson.HexBytes `json:"block_hash"`
    99  		}{BlockHeight: height, BlockHash: hash}
   100  
   101  		data, exitCode := util.ClientCall("/get-block", blockReq)
   102  		if exitCode != util.Success {
   103  			os.Exit(exitCode)
   104  		}
   105  		printJSON(data)
   106  	},
   107  }
   108  
   109  var getBlockHeaderCmd = &cobra.Command{
   110  	Use:   "get-block-header <hash> | <height>",
   111  	Short: "Get the header of a block matching the given hash or height",
   112  	Args:  cobra.ExactArgs(1),
   113  	Run: func(cmd *cobra.Command, args []string) {
   114  		var hash chainjson.HexBytes
   115  		var height uint64
   116  		var err error
   117  		isNumber := false
   118  
   119  		for _, ch := range args[0] {
   120  			// check whether the char is hex digit
   121  			if !(unicode.IsNumber(ch) || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F')) {
   122  				jww.ERROR.Printf("Invalid value for hash or height")
   123  				os.Exit(util.ErrLocalExe)
   124  			}
   125  
   126  			if !unicode.IsNumber(ch) {
   127  				isNumber = true
   128  			}
   129  		}
   130  
   131  		if isNumber {
   132  			if len(args[0]) != 64 {
   133  				jww.ERROR.Printf("Invalid hash length")
   134  				os.Exit(util.ErrLocalExe)
   135  			}
   136  
   137  			hash, err = hex.DecodeString(args[0])
   138  			if err != nil {
   139  				jww.ERROR.Println(err)
   140  				os.Exit(util.ErrLocalExe)
   141  			}
   142  		} else {
   143  			height, err = strconv.ParseUint(args[0], 10, 64)
   144  			if err != nil {
   145  				jww.ERROR.Printf("Invalid height value")
   146  				os.Exit(util.ErrLocalExe)
   147  			}
   148  		}
   149  
   150  		req := &struct {
   151  			BlockHeight uint64             `json:"block_height"`
   152  			BlockHash   chainjson.HexBytes `json:"block_hash"`
   153  		}{BlockHeight: height, BlockHash: hash}
   154  
   155  		data, exitCode := util.ClientCall("/get-block-header", req)
   156  		if exitCode != util.Success {
   157  			os.Exit(exitCode)
   158  		}
   159  		printJSON(data)
   160  	},
   161  }
   162  
   163  var getDifficultyCmd = &cobra.Command{
   164  	Use:   "get-difficulty",
   165  	Short: "Get the difficulty of most recent block",
   166  	Args:  cobra.NoArgs,
   167  	Run: func(cmd *cobra.Command, args []string) {
   168  		var hash chainjson.HexBytes
   169  		var err error
   170  
   171  		if blockHash != "" {
   172  			hash, err = hex.DecodeString(blockHash)
   173  			if err != nil {
   174  				jww.ERROR.Println(err)
   175  				os.Exit(util.ErrLocalExe)
   176  			}
   177  		}
   178  
   179  		req := &struct {
   180  			BlockHeight uint64             `json:"block_height"`
   181  			BlockHash   chainjson.HexBytes `json:"block_hash"`
   182  		}{BlockHeight: uint64(blockHeight), BlockHash: hash}
   183  
   184  		data, exitCode := util.ClientCall("/get-difficulty", req)
   185  		if exitCode != util.Success {
   186  			os.Exit(exitCode)
   187  		}
   188  		printJSON(data)
   189  	},
   190  }
   191  
   192  var getHashRateCmd = &cobra.Command{
   193  	Use:   "get-hash-rate",
   194  	Short: "Get the nonce of most recent block",
   195  	Args:  cobra.NoArgs,
   196  	Run: func(cmd *cobra.Command, args []string) {
   197  		var hash chainjson.HexBytes
   198  		var err error
   199  
   200  		if blockHash != "" {
   201  			hash, err = hex.DecodeString(blockHash)
   202  			if err != nil {
   203  				jww.ERROR.Println(err)
   204  				os.Exit(util.ErrLocalExe)
   205  			}
   206  		}
   207  
   208  		req := &struct {
   209  			BlockHeight uint64             `json:"block_height"`
   210  			BlockHash   chainjson.HexBytes `json:"block_hash"`
   211  		}{BlockHeight: uint64(blockHeight), BlockHash: hash}
   212  
   213  		data, exitCode := util.ClientCall("/get-hash-rate", req)
   214  		if exitCode != util.Success {
   215  			os.Exit(exitCode)
   216  		}
   217  		printJSON(data)
   218  	},
   219  }