github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/rlpdump/main.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2015 Go Ethereum作者
    10  //此文件是Go以太坊的一部分。
    11  //
    12  //Go以太坊是免费软件:您可以重新发布和/或修改它
    13  //根据GNU通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊的分布希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU通用公共许可证了解更多详细信息。
    21  //
    22  //你应该已经收到一份GNU通用公共许可证的副本
    23  //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  //
    26  package main
    27  
    28  import (
    29  	"bytes"
    30  	"encoding/hex"
    31  	"flag"
    32  	"fmt"
    33  	"io"
    34  	"os"
    35  	"strings"
    36  
    37  	"github.com/ethereum/go-ethereum/rlp"
    38  )
    39  
    40  var (
    41  	hexMode = flag.String("hex", "", "dump given hex data")
    42  	noASCII = flag.Bool("noascii", false, "don't print ASCII strings readably")
    43  	single  = flag.Bool("single", false, "print only the first element, discard the rest")
    44  )
    45  
    46  func init() {
    47  	flag.Usage = func() {
    48  		fmt.Fprintln(os.Stderr, "Usage:", os.Args[0], "[-noascii] [-hex <data>] [filename]")
    49  		flag.PrintDefaults()
    50  		fmt.Fprintln(os.Stderr, `
    51  Dumps RLP data from the given file in readable form.
    52  If the filename is omitted, data is read from stdin.`)
    53  	}
    54  }
    55  
    56  func main() {
    57  	flag.Parse()
    58  
    59  	var r io.Reader
    60  	switch {
    61  	case *hexMode != "":
    62  		data, err := hex.DecodeString(strings.TrimPrefix(*hexMode, "0x"))
    63  		if err != nil {
    64  			die(err)
    65  		}
    66  		r = bytes.NewReader(data)
    67  
    68  	case flag.NArg() == 0:
    69  		r = os.Stdin
    70  
    71  	case flag.NArg() == 1:
    72  		fd, err := os.Open(flag.Arg(0))
    73  		if err != nil {
    74  			die(err)
    75  		}
    76  		defer fd.Close()
    77  		r = fd
    78  
    79  	default:
    80  		fmt.Fprintln(os.Stderr, "Error: too many arguments")
    81  		flag.Usage()
    82  		os.Exit(2)
    83  	}
    84  
    85  	s := rlp.NewStream(r, 0)
    86  	for {
    87  		if err := dump(s, 0); err != nil {
    88  			if err != io.EOF {
    89  				die(err)
    90  			}
    91  			break
    92  		}
    93  		fmt.Println()
    94  		if *single {
    95  			break
    96  		}
    97  	}
    98  }
    99  
   100  func dump(s *rlp.Stream, depth int) error {
   101  	kind, size, err := s.Kind()
   102  	if err != nil {
   103  		return err
   104  	}
   105  	switch kind {
   106  	case rlp.Byte, rlp.String:
   107  		str, err := s.Bytes()
   108  		if err != nil {
   109  			return err
   110  		}
   111  		if len(str) == 0 || !*noASCII && isASCII(str) {
   112  			fmt.Printf("%s%q", ws(depth), str)
   113  		} else {
   114  			fmt.Printf("%s%x", ws(depth), str)
   115  		}
   116  	case rlp.List:
   117  		s.List()
   118  		defer s.ListEnd()
   119  		if size == 0 {
   120  			fmt.Print(ws(depth) + "[]")
   121  		} else {
   122  			fmt.Println(ws(depth) + "[")
   123  			for i := 0; ; i++ {
   124  				if i > 0 {
   125  					fmt.Print(",\n")
   126  				}
   127  				if err := dump(s, depth+1); err == rlp.EOL {
   128  					break
   129  				} else if err != nil {
   130  					return err
   131  				}
   132  			}
   133  			fmt.Print(ws(depth) + "]")
   134  		}
   135  	}
   136  	return nil
   137  }
   138  
   139  func isASCII(b []byte) bool {
   140  	for _, c := range b {
   141  		if c < 32 || c > 126 {
   142  			return false
   143  		}
   144  	}
   145  	return true
   146  }
   147  
   148  func ws(n int) string {
   149  	return strings.Repeat("  ", n)
   150  }
   151  
   152  func die(args ...interface{}) {
   153  	fmt.Fprintln(os.Stderr, args...)
   154  	os.Exit(1)
   155  }