github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/rlp/decode.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  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package rlp
    26  
    27  import (
    28  	"bufio"
    29  	"bytes"
    30  	"encoding/binary"
    31  	"errors"
    32  	"fmt"
    33  	"io"
    34  	"math/big"
    35  	"reflect"
    36  	"strings"
    37  )
    38  
    39  var (
    40  //当前列表结束时返回EOL
    41  //已在流式处理期间到达。
    42  	EOL = errors.New("rlp: end of list")
    43  
    44  //实际误差
    45  	ErrExpectedString   = errors.New("rlp: expected String or Byte")
    46  	ErrExpectedList     = errors.New("rlp: expected List")
    47  	ErrCanonInt         = errors.New("rlp: non-canonical integer format")
    48  	ErrCanonSize        = errors.New("rlp: non-canonical size information")
    49  	ErrElemTooLarge     = errors.New("rlp: element is larger than containing list")
    50  	ErrValueTooLarge    = errors.New("rlp: value size exceeds available input length")
    51  	ErrMoreThanOneValue = errors.New("rlp: input contains more than one value")
    52  
    53  //内部错误
    54  	errNotInList     = errors.New("rlp: call of ListEnd outside of any list")
    55  	errNotAtEOL      = errors.New("rlp: call of ListEnd not positioned at EOL")
    56  	errUintOverflow  = errors.New("rlp: uint overflow")
    57  	errNoPointer     = errors.New("rlp: interface given to Decode must be a pointer")
    58  	errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil")
    59  )
    60  
    61  //解码器由需要自定义rlp的类型实现
    62  //解码规则或需要解码为私有字段。
    63  //
    64  //decoderlp方法应从给定的
    65  //溪流。不禁止少读或多读,但可能
    66  //令人困惑。
    67  type Decoder interface {
    68  	DecodeRLP(*Stream) error
    69  }
    70  
    71  //解码解析r中的rlp编码数据,并将结果存储在
    72  //val.val指向的值必须是非零指针。如果R确实如此
    73  //不实现bytereader,decode将自己进行缓冲。
    74  //
    75  //解码使用以下与类型相关的解码规则:
    76  //
    77  //如果类型实现解码器接口,则解码调用
    78  //DecodeRLP。
    79  //
    80  //要解码为指针,解码将解码为指向的值
    81  //去。如果指针为零,则指针元素的新值
    82  //类型已分配。如果指针为非零,则为现有值
    83  //将被重复使用。
    84  //
    85  //要解码为结构,decode要求输入为rlp
    86  //名单。列表的解码元素被分配给每个公共
    87  //字段的顺序由结构定义给出。输入表
    88  //必须为每个解码字段包含一个元素。decode返回
    89  //元素太少或太多时出错。
    90  //
    91  //对结构字段的解码将授予某些结构标记“tail”,
    92  //“零”和“-”。
    93  //
    94  //“-”标记忽略字段。
    95  //
    96  //有关“tail”的解释,请参见示例。
    97  //
    98  //“nil”标记应用于指针类型的字段并更改解码
    99  //字段的规则,使大小为零的输入值解码为零
   100  //指针。此标记在解码递归类型时很有用。
   101  //
   102  //类型结构WithEmptyok结构
   103  //foo*[20]字节'rlp:“nil”`
   104  //}
   105  //
   106  //要解码成一个切片,输入必须是一个列表和结果
   107  //slice将按顺序包含输入元素。对于字节片,
   108  //输入必须是RLP字符串。数组类型解码类似,使用
   109  //输入元素数量(或
   110  //字节)必须与数组的长度匹配。
   111  //
   112  //要解码为go字符串,输入必须是rlp字符串。这个
   113  //输入字节按原样处理,不一定是有效的UTF-8。
   114  //
   115  //要解码为无符号整数类型,输入还必须是RLP
   116  //字符串。字节被解释为
   117  //整数。如果RLP字符串大于
   118  //类型,decode将返回错误。decode还支持*big.int。
   119  //大整数没有大小限制。
   120  //
   121  //要解码为接口值,decode将存储其中一个值
   122  //价值:
   123  //
   124  //[]接口,用于RLP列表
   125  //[]字节,用于RLP字符串
   126  //
   127  //不支持非空接口类型,布尔值也不支持,
   128  //有符号整数、浮点数、映射、通道和
   129  //功能。
   130  //
   131  //请注意,decode不为所有读卡器设置输入限制
   132  //而且可能容易受到巨大价值规模导致的恐慌。如果
   133  //您需要输入限制,使用
   134  //
   135  //新闻流(R,限制)。解码(VAL)
   136  func Decode(r io.Reader, val interface{}) error {
   137  //TODO:这可能使用来自池的流。
   138  	return NewStream(r, 0).Decode(val)
   139  }
   140  
   141  //decodebytes将rlp数据从b解析为val。
   142  //解码规则见解码文档。
   143  //输入必须正好包含一个值,并且没有尾随数据。
   144  func DecodeBytes(b []byte, val interface{}) error {
   145  //TODO:这可能使用来自池的流。
   146  	r := bytes.NewReader(b)
   147  	if err := NewStream(r, uint64(len(b))).Decode(val); err != nil {
   148  		return err
   149  	}
   150  	if r.Len() > 0 {
   151  		return ErrMoreThanOneValue
   152  	}
   153  	return nil
   154  }
   155  
   156  type decodeError struct {
   157  	msg string
   158  	typ reflect.Type
   159  	ctx []string
   160  }
   161  
   162  func (err *decodeError) Error() string {
   163  	ctx := ""
   164  	if len(err.ctx) > 0 {
   165  		ctx = ", decoding into "
   166  		for i := len(err.ctx) - 1; i >= 0; i-- {
   167  			ctx += err.ctx[i]
   168  		}
   169  	}
   170  	return fmt.Sprintf("rlp: %s for %v%s", err.msg, err.typ, ctx)
   171  }
   172  
   173  func wrapStreamError(err error, typ reflect.Type) error {
   174  	switch err {
   175  	case ErrCanonInt:
   176  		return &decodeError{msg: "non-canonical integer (leading zero bytes)", typ: typ}
   177  	case ErrCanonSize:
   178  		return &decodeError{msg: "non-canonical size information", typ: typ}
   179  	case ErrExpectedList:
   180  		return &decodeError{msg: "expected input list", typ: typ}
   181  	case ErrExpectedString:
   182  		return &decodeError{msg: "expected input string or byte", typ: typ}
   183  	case errUintOverflow:
   184  		return &decodeError{msg: "input string too long", typ: typ}
   185  	case errNotAtEOL:
   186  		return &decodeError{msg: "input list has too many elements", typ: typ}
   187  	}
   188  	return err
   189  }
   190  
   191  func addErrorContext(err error, ctx string) error {
   192  	if decErr, ok := err.(*decodeError); ok {
   193  		decErr.ctx = append(decErr.ctx, ctx)
   194  	}
   195  	return err
   196  }
   197  
   198  var (
   199  	decoderInterface = reflect.TypeOf(new(Decoder)).Elem()
   200  	bigInt           = reflect.TypeOf(big.Int{})
   201  )
   202  
   203  func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) {
   204  	kind := typ.Kind()
   205  	switch {
   206  	case typ == rawValueType:
   207  		return decodeRawValue, nil
   208  	case typ.Implements(decoderInterface):
   209  		return decodeDecoder, nil
   210  	case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface):
   211  		return decodeDecoderNoPtr, nil
   212  	case typ.AssignableTo(reflect.PtrTo(bigInt)):
   213  		return decodeBigInt, nil
   214  	case typ.AssignableTo(bigInt):
   215  		return decodeBigIntNoPtr, nil
   216  	case isUint(kind):
   217  		return decodeUint, nil
   218  	case kind == reflect.Bool:
   219  		return decodeBool, nil
   220  	case kind == reflect.String:
   221  		return decodeString, nil
   222  	case kind == reflect.Slice || kind == reflect.Array:
   223  		return makeListDecoder(typ, tags)
   224  	case kind == reflect.Struct:
   225  		return makeStructDecoder(typ)
   226  	case kind == reflect.Ptr:
   227  		if tags.nilOK {
   228  			return makeOptionalPtrDecoder(typ)
   229  		}
   230  		return makePtrDecoder(typ)
   231  	case kind == reflect.Interface:
   232  		return decodeInterface, nil
   233  	default:
   234  		return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
   235  	}
   236  }
   237  
   238  func decodeRawValue(s *Stream, val reflect.Value) error {
   239  	r, err := s.Raw()
   240  	if err != nil {
   241  		return err
   242  	}
   243  	val.SetBytes(r)
   244  	return nil
   245  }
   246  
   247  func decodeUint(s *Stream, val reflect.Value) error {
   248  	typ := val.Type()
   249  	num, err := s.uint(typ.Bits())
   250  	if err != nil {
   251  		return wrapStreamError(err, val.Type())
   252  	}
   253  	val.SetUint(num)
   254  	return nil
   255  }
   256  
   257  func decodeBool(s *Stream, val reflect.Value) error {
   258  	b, err := s.Bool()
   259  	if err != nil {
   260  		return wrapStreamError(err, val.Type())
   261  	}
   262  	val.SetBool(b)
   263  	return nil
   264  }
   265  
   266  func decodeString(s *Stream, val reflect.Value) error {
   267  	b, err := s.Bytes()
   268  	if err != nil {
   269  		return wrapStreamError(err, val.Type())
   270  	}
   271  	val.SetString(string(b))
   272  	return nil
   273  }
   274  
   275  func decodeBigIntNoPtr(s *Stream, val reflect.Value) error {
   276  	return decodeBigInt(s, val.Addr())
   277  }
   278  
   279  func decodeBigInt(s *Stream, val reflect.Value) error {
   280  	b, err := s.Bytes()
   281  	if err != nil {
   282  		return wrapStreamError(err, val.Type())
   283  	}
   284  	i := val.Interface().(*big.Int)
   285  	if i == nil {
   286  		i = new(big.Int)
   287  		val.Set(reflect.ValueOf(i))
   288  	}
   289  //拒绝前导零字节
   290  	if len(b) > 0 && b[0] == 0 {
   291  		return wrapStreamError(ErrCanonInt, val.Type())
   292  	}
   293  	i.SetBytes(b)
   294  	return nil
   295  }
   296  
   297  func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) {
   298  	etype := typ.Elem()
   299  	if etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) {
   300  		if typ.Kind() == reflect.Array {
   301  			return decodeByteArray, nil
   302  		}
   303  		return decodeByteSlice, nil
   304  	}
   305  	etypeinfo, err := cachedTypeInfo1(etype, tags{})
   306  	if err != nil {
   307  		return nil, err
   308  	}
   309  	var dec decoder
   310  	switch {
   311  	case typ.Kind() == reflect.Array:
   312  		dec = func(s *Stream, val reflect.Value) error {
   313  			return decodeListArray(s, val, etypeinfo.decoder)
   314  		}
   315  	case tag.tail:
   316  //带有“tail”标记的切片可以作为最后一个字段出现
   317  //一个结构的,应该吞下所有剩余的
   318  //列出元素。结构解码器已经调用了s.list,
   319  //直接解码元素。
   320  		dec = func(s *Stream, val reflect.Value) error {
   321  			return decodeSliceElems(s, val, etypeinfo.decoder)
   322  		}
   323  	default:
   324  		dec = func(s *Stream, val reflect.Value) error {
   325  			return decodeListSlice(s, val, etypeinfo.decoder)
   326  		}
   327  	}
   328  	return dec, nil
   329  }
   330  
   331  func decodeListSlice(s *Stream, val reflect.Value, elemdec decoder) error {
   332  	size, err := s.List()
   333  	if err != nil {
   334  		return wrapStreamError(err, val.Type())
   335  	}
   336  	if size == 0 {
   337  		val.Set(reflect.MakeSlice(val.Type(), 0, 0))
   338  		return s.ListEnd()
   339  	}
   340  	if err := decodeSliceElems(s, val, elemdec); err != nil {
   341  		return err
   342  	}
   343  	return s.ListEnd()
   344  }
   345  
   346  func decodeSliceElems(s *Stream, val reflect.Value, elemdec decoder) error {
   347  	i := 0
   348  	for ; ; i++ {
   349  //必要时增加切片
   350  		if i >= val.Cap() {
   351  			newcap := val.Cap() + val.Cap()/2
   352  			if newcap < 4 {
   353  				newcap = 4
   354  			}
   355  			newv := reflect.MakeSlice(val.Type(), val.Len(), newcap)
   356  			reflect.Copy(newv, val)
   357  			val.Set(newv)
   358  		}
   359  		if i >= val.Len() {
   360  			val.SetLen(i + 1)
   361  		}
   362  //解码为元素
   363  		if err := elemdec(s, val.Index(i)); err == EOL {
   364  			break
   365  		} else if err != nil {
   366  			return addErrorContext(err, fmt.Sprint("[", i, "]"))
   367  		}
   368  	}
   369  	if i < val.Len() {
   370  		val.SetLen(i)
   371  	}
   372  	return nil
   373  }
   374  
   375  func decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error {
   376  	if _, err := s.List(); err != nil {
   377  		return wrapStreamError(err, val.Type())
   378  	}
   379  	vlen := val.Len()
   380  	i := 0
   381  	for ; i < vlen; i++ {
   382  		if err := elemdec(s, val.Index(i)); err == EOL {
   383  			break
   384  		} else if err != nil {
   385  			return addErrorContext(err, fmt.Sprint("[", i, "]"))
   386  		}
   387  	}
   388  	if i < vlen {
   389  		return &decodeError{msg: "input list has too few elements", typ: val.Type()}
   390  	}
   391  	return wrapStreamError(s.ListEnd(), val.Type())
   392  }
   393  
   394  func decodeByteSlice(s *Stream, val reflect.Value) error {
   395  	b, err := s.Bytes()
   396  	if err != nil {
   397  		return wrapStreamError(err, val.Type())
   398  	}
   399  	val.SetBytes(b)
   400  	return nil
   401  }
   402  
   403  func decodeByteArray(s *Stream, val reflect.Value) error {
   404  	kind, size, err := s.Kind()
   405  	if err != nil {
   406  		return err
   407  	}
   408  	vlen := val.Len()
   409  	switch kind {
   410  	case Byte:
   411  		if vlen == 0 {
   412  			return &decodeError{msg: "input string too long", typ: val.Type()}
   413  		}
   414  		if vlen > 1 {
   415  			return &decodeError{msg: "input string too short", typ: val.Type()}
   416  		}
   417  		bv, _ := s.Uint()
   418  		val.Index(0).SetUint(bv)
   419  	case String:
   420  		if uint64(vlen) < size {
   421  			return &decodeError{msg: "input string too long", typ: val.Type()}
   422  		}
   423  		if uint64(vlen) > size {
   424  			return &decodeError{msg: "input string too short", typ: val.Type()}
   425  		}
   426  		slice := val.Slice(0, vlen).Interface().([]byte)
   427  		if err := s.readFull(slice); err != nil {
   428  			return err
   429  		}
   430  //拒绝应该使用单字节编码的情况。
   431  		if size == 1 && slice[0] < 128 {
   432  			return wrapStreamError(ErrCanonSize, val.Type())
   433  		}
   434  	case List:
   435  		return wrapStreamError(ErrExpectedString, val.Type())
   436  	}
   437  	return nil
   438  }
   439  
   440  func makeStructDecoder(typ reflect.Type) (decoder, error) {
   441  	fields, err := structFields(typ)
   442  	if err != nil {
   443  		return nil, err
   444  	}
   445  	dec := func(s *Stream, val reflect.Value) (err error) {
   446  		if _, err := s.List(); err != nil {
   447  			return wrapStreamError(err, typ)
   448  		}
   449  		for _, f := range fields {
   450  			err := f.info.decoder(s, val.Field(f.index))
   451  			if err == EOL {
   452  				return &decodeError{msg: "too few elements", typ: typ}
   453  			} else if err != nil {
   454  				return addErrorContext(err, "."+typ.Field(f.index).Name)
   455  			}
   456  		}
   457  		return wrapStreamError(s.ListEnd(), typ)
   458  	}
   459  	return dec, nil
   460  }
   461  
   462  //makeptrdecoder创建一个解码为
   463  //指针的元素类型。
   464  func makePtrDecoder(typ reflect.Type) (decoder, error) {
   465  	etype := typ.Elem()
   466  	etypeinfo, err := cachedTypeInfo1(etype, tags{})
   467  	if err != nil {
   468  		return nil, err
   469  	}
   470  	dec := func(s *Stream, val reflect.Value) (err error) {
   471  		newval := val
   472  		if val.IsNil() {
   473  			newval = reflect.New(etype)
   474  		}
   475  		if err = etypeinfo.decoder(s, newval.Elem()); err == nil {
   476  			val.Set(newval)
   477  		}
   478  		return err
   479  	}
   480  	return dec, nil
   481  }
   482  
   483  //makeoptionalptrDecoder创建一个解码空值的解码器
   484  //为零。将非空值解码为元素类型的值,
   485  //就像makeptrecoder一样。
   486  //
   487  //此解码器用于结构标记为“nil”的指针类型结构字段。
   488  func makeOptionalPtrDecoder(typ reflect.Type) (decoder, error) {
   489  	etype := typ.Elem()
   490  	etypeinfo, err := cachedTypeInfo1(etype, tags{})
   491  	if err != nil {
   492  		return nil, err
   493  	}
   494  	dec := func(s *Stream, val reflect.Value) (err error) {
   495  		kind, size, err := s.Kind()
   496  		if err != nil || size == 0 && kind != Byte {
   497  //重新武装S类。这很重要,因为输入
   498  //位置必须前进到下一个值,即使
   499  //我们什么都不看。
   500  			s.kind = -1
   501  //将指针设置为零。
   502  			val.Set(reflect.Zero(typ))
   503  			return err
   504  		}
   505  		newval := val
   506  		if val.IsNil() {
   507  			newval = reflect.New(etype)
   508  		}
   509  		if err = etypeinfo.decoder(s, newval.Elem()); err == nil {
   510  			val.Set(newval)
   511  		}
   512  		return err
   513  	}
   514  	return dec, nil
   515  }
   516  
   517  var ifsliceType = reflect.TypeOf([]interface{}{})
   518  
   519  func decodeInterface(s *Stream, val reflect.Value) error {
   520  	if val.Type().NumMethod() != 0 {
   521  		return fmt.Errorf("rlp: type %v is not RLP-serializable", val.Type())
   522  	}
   523  	kind, _, err := s.Kind()
   524  	if err != nil {
   525  		return err
   526  	}
   527  	if kind == List {
   528  		slice := reflect.New(ifsliceType).Elem()
   529  		if err := decodeListSlice(s, slice, decodeInterface); err != nil {
   530  			return err
   531  		}
   532  		val.Set(slice)
   533  	} else {
   534  		b, err := s.Bytes()
   535  		if err != nil {
   536  			return err
   537  		}
   538  		val.Set(reflect.ValueOf(b))
   539  	}
   540  	return nil
   541  }
   542  
   543  //此解码器用于类型的非指针值
   544  //使用指针接收器实现解码器接口的方法。
   545  func decodeDecoderNoPtr(s *Stream, val reflect.Value) error {
   546  	return val.Addr().Interface().(Decoder).DecodeRLP(s)
   547  }
   548  
   549  func decodeDecoder(s *Stream, val reflect.Value) error {
   550  //如果类型为
   551  //使用指针接收器实现解码器(即始终)
   552  //因为它可能专门处理空值。
   553  //在这种情况下,我们需要在这里分配一个,就像makeptrdecoder一样。
   554  	if val.Kind() == reflect.Ptr && val.IsNil() {
   555  		val.Set(reflect.New(val.Type().Elem()))
   556  	}
   557  	return val.Interface().(Decoder).DecodeRLP(s)
   558  }
   559  
   560  //kind表示RLP流中包含的值的类型。
   561  type Kind int
   562  
   563  const (
   564  	Byte Kind = iota
   565  	String
   566  	List
   567  )
   568  
   569  func (k Kind) String() string {
   570  	switch k {
   571  	case Byte:
   572  		return "Byte"
   573  	case String:
   574  		return "String"
   575  	case List:
   576  		return "List"
   577  	default:
   578  		return fmt.Sprintf("Unknown(%d)", k)
   579  	}
   580  }
   581  
   582  //bytereader必须由流的任何输入读取器实现。它
   583  //由bufio.reader和bytes.reader等实现。
   584  type ByteReader interface {
   585  	io.Reader
   586  	io.ByteReader
   587  }
   588  
   589  //流可用于输入流的逐段解码。这个
   590  //如果输入非常大或解码规则
   591  //类型取决于输入结构。流不保留
   592  //内部缓冲区。解码值后,输入读卡器将
   593  //位于下一个值的类型信息之前。
   594  //
   595  //当解码列表时,输入位置达到声明的
   596  //列表的长度,所有操作都将返回错误eol。
   597  //必须使用list end继续确认列表结尾
   598  //正在读取封闭列表。
   599  //
   600  //流对于并发使用不安全。
   601  type Stream struct {
   602  	r ByteReader
   603  
   604  //要从r中读取的剩余字节数。
   605  	remaining uint64
   606  	limited   bool
   607  
   608  //整数译码辅助缓冲区
   609  	uintbuf []byte
   610  
   611  kind    Kind   //未来的价值
   612  size    uint64 //前面的价值大小
   613  byteval byte   //类型标记中单个字节的值
   614  kinderr error  //上次readkind出错
   615  	stack   []listpos
   616  }
   617  
   618  type listpos struct{ pos, size uint64 }
   619  
   620  //Newstream创建了一个新的解码流读取R。
   621  //
   622  //如果r实现了bytereader接口,那么流将
   623  //不要引入任何缓冲。
   624  //
   625  //对于非顶级值,流返回errelemtoolarge
   626  //用于不适合封闭列表的值。
   627  //
   628  //流支持可选的输入限制。如果设置了限制,则
   629  //任何顶级值的大小将与其余值进行检查
   630  //输入长度。遇到超过值的流操作
   631  //剩余的输入长度将返回errValuetoolArge。极限
   632  //可以通过为inputLimit传递非零值来设置。
   633  //
   634  //如果r是bytes.reader或strings.reader,则输入限制设置为
   635  //r的基础数据的长度,除非显式限制为
   636  //提供。
   637  func NewStream(r io.Reader, inputLimit uint64) *Stream {
   638  	s := new(Stream)
   639  	s.Reset(r, inputLimit)
   640  	return s
   641  }
   642  
   643  //newliststream创建一个新的流,它假装被定位
   644  //在给定长度的编码列表中。
   645  func NewListStream(r io.Reader, len uint64) *Stream {
   646  	s := new(Stream)
   647  	s.Reset(r, len)
   648  	s.kind = List
   649  	s.size = len
   650  	return s
   651  }
   652  
   653  //字节读取一个rlp字符串并将其内容作为字节片返回。
   654  //如果输入不包含rlp字符串,则返回
   655  //错误将是errExpectedString。
   656  func (s *Stream) Bytes() ([]byte, error) {
   657  	kind, size, err := s.Kind()
   658  	if err != nil {
   659  		return nil, err
   660  	}
   661  	switch kind {
   662  	case Byte:
   663  s.kind = -1 //重整种类
   664  		return []byte{s.byteval}, nil
   665  	case String:
   666  		b := make([]byte, size)
   667  		if err = s.readFull(b); err != nil {
   668  			return nil, err
   669  		}
   670  		if size == 1 && b[0] < 128 {
   671  			return nil, ErrCanonSize
   672  		}
   673  		return b, nil
   674  	default:
   675  		return nil, ErrExpectedString
   676  	}
   677  }
   678  
   679  //raw读取包含rlp类型信息的原始编码值。
   680  func (s *Stream) Raw() ([]byte, error) {
   681  	kind, size, err := s.Kind()
   682  	if err != nil {
   683  		return nil, err
   684  	}
   685  	if kind == Byte {
   686  s.kind = -1 //重整种类
   687  		return []byte{s.byteval}, nil
   688  	}
   689  //原始头已被读取,不再是
   690  //可用。阅读内容并在其前面放置一个新标题。
   691  	start := headsize(size)
   692  	buf := make([]byte, uint64(start)+size)
   693  	if err := s.readFull(buf[start:]); err != nil {
   694  		return nil, err
   695  	}
   696  	if kind == String {
   697  		puthead(buf, 0x80, 0xB7, size)
   698  	} else {
   699  		puthead(buf, 0xC0, 0xF7, size)
   700  	}
   701  	return buf, nil
   702  }
   703  
   704  //uint读取最多8个字节的rlp字符串并返回其内容
   705  //作为无符号整数。如果输入不包含rlp字符串,则
   706  //返回的错误将是errExpectedString。
   707  func (s *Stream) Uint() (uint64, error) {
   708  	return s.uint(64)
   709  }
   710  
   711  func (s *Stream) uint(maxbits int) (uint64, error) {
   712  	kind, size, err := s.Kind()
   713  	if err != nil {
   714  		return 0, err
   715  	}
   716  	switch kind {
   717  	case Byte:
   718  		if s.byteval == 0 {
   719  			return 0, ErrCanonInt
   720  		}
   721  s.kind = -1 //重整种类
   722  		return uint64(s.byteval), nil
   723  	case String:
   724  		if size > uint64(maxbits/8) {
   725  			return 0, errUintOverflow
   726  		}
   727  		v, err := s.readUint(byte(size))
   728  		switch {
   729  		case err == ErrCanonSize:
   730  //调整错误,因为我们现在没有读取大小。
   731  			return 0, ErrCanonInt
   732  		case err != nil:
   733  			return 0, err
   734  		case size > 0 && v < 128:
   735  			return 0, ErrCanonSize
   736  		default:
   737  			return v, nil
   738  		}
   739  	default:
   740  		return 0, ErrExpectedString
   741  	}
   742  }
   743  
   744  //bool读取最多1字节的rlp字符串并返回其内容
   745  //作为布尔值。如果输入不包含rlp字符串,则
   746  //返回的错误将是errExpectedString。
   747  func (s *Stream) Bool() (bool, error) {
   748  	num, err := s.uint(8)
   749  	if err != nil {
   750  		return false, err
   751  	}
   752  	switch num {
   753  	case 0:
   754  		return false, nil
   755  	case 1:
   756  		return true, nil
   757  	default:
   758  		return false, fmt.Errorf("rlp: invalid boolean value: %d", num)
   759  	}
   760  }
   761  
   762  //list开始解码rlp列表。如果输入不包含
   763  //列表中,返回的错误将是errExpectedList。当名单的
   764  //已到达END,任何流操作都将返回EOL。
   765  func (s *Stream) List() (size uint64, err error) {
   766  	kind, size, err := s.Kind()
   767  	if err != nil {
   768  		return 0, err
   769  	}
   770  	if kind != List {
   771  		return 0, ErrExpectedList
   772  	}
   773  	s.stack = append(s.stack, listpos{0, size})
   774  	s.kind = -1
   775  	s.size = 0
   776  	return size, nil
   777  }
   778  
   779  //listened返回到封闭列表。
   780  //输入读取器必须位于列表的末尾。
   781  func (s *Stream) ListEnd() error {
   782  	if len(s.stack) == 0 {
   783  		return errNotInList
   784  	}
   785  	tos := s.stack[len(s.stack)-1]
   786  	if tos.pos != tos.size {
   787  		return errNotAtEOL
   788  	}
   789  s.stack = s.stack[:len(s.stack)-1] //流行音乐
   790  	if len(s.stack) > 0 {
   791  		s.stack[len(s.stack)-1].pos += tos.size
   792  	}
   793  	s.kind = -1
   794  	s.size = 0
   795  	return nil
   796  }
   797  
   798  //解码解码解码值并将结果存储在指向的值中
   799  //按VAL。有关解码功能,请参阅文档。
   800  //了解解码规则。
   801  func (s *Stream) Decode(val interface{}) error {
   802  	if val == nil {
   803  		return errDecodeIntoNil
   804  	}
   805  	rval := reflect.ValueOf(val)
   806  	rtyp := rval.Type()
   807  	if rtyp.Kind() != reflect.Ptr {
   808  		return errNoPointer
   809  	}
   810  	if rval.IsNil() {
   811  		return errDecodeIntoNil
   812  	}
   813  	info, err := cachedTypeInfo(rtyp.Elem(), tags{})
   814  	if err != nil {
   815  		return err
   816  	}
   817  
   818  	err = info.decoder(s, rval.Elem())
   819  	if decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 {
   820  //将解码目标类型添加到错误中,以便上下文具有更多含义
   821  		decErr.ctx = append(decErr.ctx, fmt.Sprint("(", rtyp.Elem(), ")"))
   822  	}
   823  	return err
   824  }
   825  
   826  //重置将丢弃有关当前解码上下文的任何信息
   827  //并从R开始读取。此方法旨在促进重用
   828  //在许多解码操作中预先分配的流。
   829  //
   830  //如果r不同时实现bytereader,则流将自己执行。
   831  //缓冲。
   832  func (s *Stream) Reset(r io.Reader, inputLimit uint64) {
   833  	if inputLimit > 0 {
   834  		s.remaining = inputLimit
   835  		s.limited = true
   836  	} else {
   837  //尝试自动发现
   838  //从字节片读取时的限制。
   839  		switch br := r.(type) {
   840  		case *bytes.Reader:
   841  			s.remaining = uint64(br.Len())
   842  			s.limited = true
   843  		case *strings.Reader:
   844  			s.remaining = uint64(br.Len())
   845  			s.limited = true
   846  		default:
   847  			s.limited = false
   848  		}
   849  	}
   850  //如果没有缓冲区,用缓冲区包装R。
   851  	bufr, ok := r.(ByteReader)
   852  	if !ok {
   853  		bufr = bufio.NewReader(r)
   854  	}
   855  	s.r = bufr
   856  //重置解码上下文。
   857  	s.stack = s.stack[:0]
   858  	s.size = 0
   859  	s.kind = -1
   860  	s.kinderr = nil
   861  	if s.uintbuf == nil {
   862  		s.uintbuf = make([]byte, 8)
   863  	}
   864  }
   865  
   866  //kind返回
   867  //输入流。
   868  //
   869  //返回的大小是组成该值的字节数。
   870  //对于kind==byte,大小为零,因为值为
   871  //包含在类型标记中。
   872  //
   873  //第一次调用kind将从输入中读取大小信息
   874  //读卡器并将其保留在
   875  //价值。后续对kind的调用(直到值被解码)
   876  //不会提升输入读取器并返回缓存信息。
   877  func (s *Stream) Kind() (kind Kind, size uint64, err error) {
   878  	var tos *listpos
   879  	if len(s.stack) > 0 {
   880  		tos = &s.stack[len(s.stack)-1]
   881  	}
   882  	if s.kind < 0 {
   883  		s.kinderr = nil
   884  //如果我们在
   885  //最内层列表。
   886  		if tos != nil && tos.pos == tos.size {
   887  			return 0, 0, EOL
   888  		}
   889  		s.kind, s.size, s.kinderr = s.readKind()
   890  		if s.kinderr == nil {
   891  			if tos == nil {
   892  //在顶层,检查该值是否较小
   893  //大于剩余的输入长度。
   894  				if s.limited && s.size > s.remaining {
   895  					s.kinderr = ErrValueTooLarge
   896  				}
   897  			} else {
   898  //在列表中,检查该值是否溢出列表。
   899  				if s.size > tos.size-tos.pos {
   900  					s.kinderr = ErrElemTooLarge
   901  				}
   902  			}
   903  		}
   904  	}
   905  //注意:这可能会返回一个生成的粘性错误
   906  //通过早期的readkind调用。
   907  	return s.kind, s.size, s.kinderr
   908  }
   909  
   910  func (s *Stream) readKind() (kind Kind, size uint64, err error) {
   911  	b, err := s.readByte()
   912  	if err != nil {
   913  		if len(s.stack) == 0 {
   914  //在顶层,将误差调整为实际的EOF。IOF是
   915  //被调用方用于确定何时停止解码。
   916  			switch err {
   917  			case io.ErrUnexpectedEOF:
   918  				err = io.EOF
   919  			case ErrValueTooLarge:
   920  				err = io.EOF
   921  			}
   922  		}
   923  		return 0, 0, err
   924  	}
   925  	s.byteval = 0
   926  	switch {
   927  	case b < 0x80:
   928  //对于值在[0x00,0x7f]范围内的单个字节,该字节
   929  //是它自己的RLP编码。
   930  		s.byteval = b
   931  		return Byte, 0, nil
   932  	case b < 0xB8:
   933  //否则,如果字符串的长度为0-55字节,
   934  //RLP编码由一个值为0x80的单字节加上
   935  //字符串的长度,后跟字符串。第一个的范围
   936  //因此,字节为[0x80,0xB7]。
   937  		return String, uint64(b - 0x80), nil
   938  	case b < 0xC0:
   939  //如果字符串的长度超过55个字节,则
   940  //RLP编码由一个单字节组成,值为0xB7加上长度
   941  //以二进制形式表示的字符串长度,后跟
   942  //字符串,后跟字符串。例如,长度为1024的字符串
   943  //将编码为0xB90400,后跟字符串。范围
   944  //因此,第一个字节是[0xB8,0xBF]。
   945  		size, err = s.readUint(b - 0xB7)
   946  		if err == nil && size < 56 {
   947  			err = ErrCanonSize
   948  		}
   949  		return String, size, err
   950  	case b < 0xF8:
   951  //如果列表的总有效负载
   952  //(即,所有项目的组合长度)为0-55字节长,
   953  //RLP编码由一个值为0xC0的单字节加上长度组成。
   954  //列表的后面是
   955  //项目。因此,第一个字节的范围是[0xc0,0xf7]。
   956  		return List, uint64(b - 0xC0), nil
   957  	default:
   958  //如果列表的总有效负载长度超过55字节,
   959  //RLP编码由一个值为0xF7的单字节组成。
   960  //加上以二进制表示的有效载荷长度
   961  //形式,后跟有效载荷的长度,然后是
   962  //项目的rlp编码的串联。这个
   963  //因此,第一个字节的范围是[0xf8,0xff]。
   964  		size, err = s.readUint(b - 0xF7)
   965  		if err == nil && size < 56 {
   966  			err = ErrCanonSize
   967  		}
   968  		return List, size, err
   969  	}
   970  }
   971  
   972  func (s *Stream) readUint(size byte) (uint64, error) {
   973  	switch size {
   974  	case 0:
   975  s.kind = -1 //重整种类
   976  		return 0, nil
   977  	case 1:
   978  		b, err := s.readByte()
   979  		return uint64(b), err
   980  	default:
   981  		start := int(8 - size)
   982  		for i := 0; i < start; i++ {
   983  			s.uintbuf[i] = 0
   984  		}
   985  		if err := s.readFull(s.uintbuf[start:]); err != nil {
   986  			return 0, err
   987  		}
   988  		if s.uintbuf[start] == 0 {
   989  //注意:readuint也用于解码整数
   990  //价值观。需要调整误差
   991  //在本例中是errconInt。
   992  			return 0, ErrCanonSize
   993  		}
   994  		return binary.BigEndian.Uint64(s.uintbuf), nil
   995  	}
   996  }
   997  
   998  func (s *Stream) readFull(buf []byte) (err error) {
   999  	if err := s.willRead(uint64(len(buf))); err != nil {
  1000  		return err
  1001  	}
  1002  	var nn, n int
  1003  	for n < len(buf) && err == nil {
  1004  		nn, err = s.r.Read(buf[n:])
  1005  		n += nn
  1006  	}
  1007  	if err == io.EOF {
  1008  		err = io.ErrUnexpectedEOF
  1009  	}
  1010  	return err
  1011  }
  1012  
  1013  func (s *Stream) readByte() (byte, error) {
  1014  	if err := s.willRead(1); err != nil {
  1015  		return 0, err
  1016  	}
  1017  	b, err := s.r.ReadByte()
  1018  	if err == io.EOF {
  1019  		err = io.ErrUnexpectedEOF
  1020  	}
  1021  	return b, err
  1022  }
  1023  
  1024  func (s *Stream) willRead(n uint64) error {
  1025  s.kind = -1 //重整种类
  1026  
  1027  	if len(s.stack) > 0 {
  1028  //检查列表溢出
  1029  		tos := s.stack[len(s.stack)-1]
  1030  		if n > tos.size-tos.pos {
  1031  			return ErrElemTooLarge
  1032  		}
  1033  		s.stack[len(s.stack)-1].pos += n
  1034  	}
  1035  	if s.limited {
  1036  		if n > s.remaining {
  1037  			return ErrValueTooLarge
  1038  		}
  1039  		s.remaining -= n
  1040  	}
  1041  	return nil
  1042  }