github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/rlp/decode.go (about)

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