github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/rlp/encode.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  	"fmt"
    29  	"io"
    30  	"math/big"
    31  	"reflect"
    32  	"sync"
    33  )
    34  
    35  var (
    36  //通用编码值。
    37  //这些在实现encoderlp时很有用。
    38  	EmptyString = []byte{0x80}
    39  	EmptyList   = []byte{0xC0}
    40  )
    41  
    42  //编码器由需要自定义的类型实现
    43  //编码规则或要对私有字段进行编码。
    44  type Encoder interface {
    45  //encoderlp应将其接收器的rlp编码写入w。
    46  //如果实现是一个指针方法,它也可以是
    47  //要求零指针。
    48  //
    49  //实现应该生成有效的rlp。写入的数据是
    50  //目前尚未验证,但将来的版本可能会验证。它是
    51  //建议只写一个值,但写多个值
    52  //也允许有值或没有值。
    53  	EncodeRLP(io.Writer) error
    54  }
    55  
    56  //encode将val的rlp编码写入w。注意,encode可以
    57  //在某些情况下执行许多小的写入操作。考虑使w
    58  //缓冲的。
    59  //
    60  //encode使用以下与类型相关的编码规则:
    61  //
    62  //如果类型实现编码器接口,则编码调用
    63  //EncodeRLP。这是真的,即使没有指针,请看
    64  //编码器文件。
    65  //
    66  //要对指针进行编码,将对指向的值进行编码。为零
    67  //指针,encode将对类型的零值进行编码。零
    68  //指向结构类型的指针始终编码为空的rlp列表。
    69  //指向数组的nil指针编码为空列表(或空字符串
    70  //如果数组具有元素类型byte)。
    71  //
    72  //结构值被编码为其所有编码的rlp列表
    73  //公共领域。支持递归结构类型。
    74  //
    75  //为了对切片和数组进行编码,元素被编码为rlp
    76  //值元素的列表。注意数组和切片
    77  //元素类型uint8或byte始终编码为rlp字符串。
    78  //
    79  //go字符串编码为rlp字符串。
    80  //
    81  //无符号整数值编码为RLP字符串。零总是
    82  //编码为空的rlp字符串。encode还支持*big.int。
    83  //
    84  //接口值编码为接口中包含的值。
    85  //
    86  //不支持布尔值,也不支持有符号整数,浮动
    87  //点编号、地图、通道和功能。
    88  func Encode(w io.Writer, val interface{}) error {
    89  	if outer, ok := w.(*encbuf); ok {
    90  //encode被某个类型的encoderlp调用。
    91  //避免通过直接写入外部encbuf进行复制。
    92  		return outer.encode(val)
    93  	}
    94  	eb := encbufPool.Get().(*encbuf)
    95  	defer encbufPool.Put(eb)
    96  	eb.reset()
    97  	if err := eb.encode(val); err != nil {
    98  		return err
    99  	}
   100  	return eb.toWriter(w)
   101  }
   102  
   103  //encodeToBytes返回val的rlp编码。
   104  //编码规则请参见Encode文档。
   105  func EncodeToBytes(val interface{}) ([]byte, error) {
   106  	eb := encbufPool.Get().(*encbuf)
   107  	defer encbufPool.Put(eb)
   108  	eb.reset()
   109  	if err := eb.encode(val); err != nil {
   110  		return nil, err
   111  	}
   112  	return eb.toBytes(), nil
   113  }
   114  
   115  //encodetoreader返回一个读卡器,其中val的rlp编码来自该读卡器
   116  //可以阅读。返回的大小是已编码的
   117  //数据。
   118  //
   119  //编码规则请参见Encode文档。
   120  func EncodeToReader(val interface{}) (size int, r io.Reader, err error) {
   121  	eb := encbufPool.Get().(*encbuf)
   122  	eb.reset()
   123  	if err := eb.encode(val); err != nil {
   124  		return 0, nil, err
   125  	}
   126  	return eb.size(), &encReader{buf: eb}, nil
   127  }
   128  
   129  type encbuf struct {
   130  str     []byte      //字符串数据,包含除列表头以外的所有内容
   131  lheads  []*listhead //
   132  lhsize  int         //所有编码列表头的大小总和
   133  sizebuf []byte      //用于uint编码的9字节辅助缓冲区
   134  }
   135  
   136  type listhead struct {
   137  offset int //字符串数据中此头的索引
   138  size   int //编码数据的总大小(包括列表头)
   139  }
   140  
   141  //编码写入头到给定的缓冲区,该缓冲区必须至少为
   142  //9字节长。它返回编码的字节。
   143  func (head *listhead) encode(buf []byte) []byte {
   144  	return buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))]
   145  }
   146  
   147  //headsize返回列表或字符串头的大小
   148  //对于给定大小的值。
   149  func headsize(size uint64) int {
   150  	if size < 56 {
   151  		return 1
   152  	}
   153  	return 1 + intsize(size)
   154  }
   155  
   156  //puthead将列表或字符串头写入buf。
   157  //buf的长度必须至少为9个字节。
   158  func puthead(buf []byte, smalltag, largetag byte, size uint64) int {
   159  	if size < 56 {
   160  		buf[0] = smalltag + byte(size)
   161  		return 1
   162  	}
   163  	sizesize := putint(buf[1:], size)
   164  	buf[0] = largetag + byte(sizesize)
   165  	return sizesize + 1
   166  }
   167  
   168  //围场是集合的。
   169  var encbufPool = sync.Pool{
   170  	New: func() interface{} { return &encbuf{sizebuf: make([]byte, 9)} },
   171  }
   172  
   173  func (w *encbuf) reset() {
   174  	w.lhsize = 0
   175  	if w.str != nil {
   176  		w.str = w.str[:0]
   177  	}
   178  	if w.lheads != nil {
   179  		w.lheads = w.lheads[:0]
   180  	}
   181  }
   182  
   183  //encbuf实现io.writer,以便将其传递到encoderlp。
   184  func (w *encbuf) Write(b []byte) (int, error) {
   185  	w.str = append(w.str, b...)
   186  	return len(b), nil
   187  }
   188  
   189  func (w *encbuf) encode(val interface{}) error {
   190  	rval := reflect.ValueOf(val)
   191  	ti, err := cachedTypeInfo(rval.Type(), tags{})
   192  	if err != nil {
   193  		return err
   194  	}
   195  	return ti.writer(rval, w)
   196  }
   197  
   198  func (w *encbuf) encodeStringHeader(size int) {
   199  	if size < 56 {
   200  		w.str = append(w.str, 0x80+byte(size))
   201  	} else {
   202  //TODO:直接编码到w.str
   203  		sizesize := putint(w.sizebuf[1:], uint64(size))
   204  		w.sizebuf[0] = 0xB7 + byte(sizesize)
   205  		w.str = append(w.str, w.sizebuf[:sizesize+1]...)
   206  	}
   207  }
   208  
   209  func (w *encbuf) encodeString(b []byte) {
   210  	if len(b) == 1 && b[0] <= 0x7F {
   211  //适合单字节,无字符串头
   212  		w.str = append(w.str, b[0])
   213  	} else {
   214  		w.encodeStringHeader(len(b))
   215  		w.str = append(w.str, b...)
   216  	}
   217  }
   218  
   219  func (w *encbuf) list() *listhead {
   220  	lh := &listhead{offset: len(w.str), size: w.lhsize}
   221  	w.lheads = append(w.lheads, lh)
   222  	return lh
   223  }
   224  
   225  func (w *encbuf) listEnd(lh *listhead) {
   226  	lh.size = w.size() - lh.offset - lh.size
   227  	if lh.size < 56 {
   228  w.lhsize++ //编码为种类标记的长度
   229  	} else {
   230  		w.lhsize += 1 + intsize(uint64(lh.size))
   231  	}
   232  }
   233  
   234  func (w *encbuf) size() int {
   235  	return len(w.str) + w.lhsize
   236  }
   237  
   238  func (w *encbuf) toBytes() []byte {
   239  	out := make([]byte, w.size())
   240  	strpos := 0
   241  	pos := 0
   242  	for _, head := range w.lheads {
   243  //在头之前写入字符串数据
   244  		n := copy(out[pos:], w.str[strpos:head.offset])
   245  		pos += n
   246  		strpos += n
   247  //写标题
   248  		enc := head.encode(out[pos:])
   249  		pos += len(enc)
   250  	}
   251  //将字符串数据复制到最后一个列表头之后
   252  	copy(out[pos:], w.str[strpos:])
   253  	return out
   254  }
   255  
   256  func (w *encbuf) toWriter(out io.Writer) (err error) {
   257  	strpos := 0
   258  	for _, head := range w.lheads {
   259  //在头之前写入字符串数据
   260  		if head.offset-strpos > 0 {
   261  			n, err := out.Write(w.str[strpos:head.offset])
   262  			strpos += n
   263  			if err != nil {
   264  				return err
   265  			}
   266  		}
   267  //写标题
   268  		enc := head.encode(w.sizebuf)
   269  		if _, err = out.Write(enc); err != nil {
   270  			return err
   271  		}
   272  	}
   273  	if strpos < len(w.str) {
   274  //在最后一个列表头后写入字符串数据
   275  		_, err = out.Write(w.str[strpos:])
   276  	}
   277  	return err
   278  }
   279  
   280  //Encrader是EncodeToReader返回的IO.Reader。
   281  //它在EOF时释放ENCBUF。
   282  type encReader struct {
   283  buf    *encbuf //我们正在读取的缓冲区。当我们到达终点时,这是零。
   284  lhpos  int     //正在读取的列表标题索引
   285  strpos int     //字符串缓冲区中的当前位置
   286  piece  []byte  //下一篇要读
   287  }
   288  
   289  func (r *encReader) Read(b []byte) (n int, err error) {
   290  	for {
   291  		if r.piece = r.next(); r.piece == nil {
   292  //在EOF时将编码缓冲区放回池中
   293  //是第一次遇到。后续呼叫仍返回EOF
   294  //但是缓冲区不再有效。
   295  			if r.buf != nil {
   296  				encbufPool.Put(r.buf)
   297  				r.buf = nil
   298  			}
   299  			return n, io.EOF
   300  		}
   301  		nn := copy(b[n:], r.piece)
   302  		n += nn
   303  		if nn < len(r.piece) {
   304  //这件不合适,下次见。
   305  			r.piece = r.piece[nn:]
   306  			return n, nil
   307  		}
   308  		r.piece = nil
   309  	}
   310  }
   311  
   312  //Next返回下一段要读取的数据。
   313  //在EOF时返回零。
   314  func (r *encReader) next() []byte {
   315  	switch {
   316  	case r.buf == nil:
   317  		return nil
   318  
   319  	case r.piece != nil:
   320  //仍有数据可供读取。
   321  		return r.piece
   322  
   323  	case r.lhpos < len(r.buf.lheads):
   324  //我们在最后一个列表标题之前。
   325  		head := r.buf.lheads[r.lhpos]
   326  		sizebefore := head.offset - r.strpos
   327  		if sizebefore > 0 {
   328  //头前的字符串数据。
   329  			p := r.buf.str[r.strpos:head.offset]
   330  			r.strpos += sizebefore
   331  			return p
   332  		}
   333  		r.lhpos++
   334  		return head.encode(r.buf.sizebuf)
   335  
   336  	case r.strpos < len(r.buf.str):
   337  //在所有列表头之后,在末尾字符串数据。
   338  		p := r.buf.str[r.strpos:]
   339  		r.strpos = len(r.buf.str)
   340  		return p
   341  
   342  	default:
   343  		return nil
   344  	}
   345  }
   346  
   347  var (
   348  	encoderInterface = reflect.TypeOf(new(Encoder)).Elem()
   349  	big0             = big.NewInt(0)
   350  )
   351  
   352  //makewriter为给定类型创建一个writer函数。
   353  func makeWriter(typ reflect.Type, ts tags) (writer, error) {
   354  	kind := typ.Kind()
   355  	switch {
   356  	case typ == rawValueType:
   357  		return writeRawValue, nil
   358  	case typ.Implements(encoderInterface):
   359  		return writeEncoder, nil
   360  	case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(encoderInterface):
   361  		return writeEncoderNoPtr, nil
   362  	case kind == reflect.Interface:
   363  		return writeInterface, nil
   364  	case typ.AssignableTo(reflect.PtrTo(bigInt)):
   365  		return writeBigIntPtr, nil
   366  	case typ.AssignableTo(bigInt):
   367  		return writeBigIntNoPtr, nil
   368  	case isUint(kind):
   369  		return writeUint, nil
   370  	case kind == reflect.Bool:
   371  		return writeBool, nil
   372  	case kind == reflect.String:
   373  		return writeString, nil
   374  	case kind == reflect.Slice && isByte(typ.Elem()):
   375  		return writeBytes, nil
   376  	case kind == reflect.Array && isByte(typ.Elem()):
   377  		return writeByteArray, nil
   378  	case kind == reflect.Slice || kind == reflect.Array:
   379  		return makeSliceWriter(typ, ts)
   380  	case kind == reflect.Struct:
   381  		return makeStructWriter(typ)
   382  	case kind == reflect.Ptr:
   383  		return makePtrWriter(typ)
   384  	default:
   385  		return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ)
   386  	}
   387  }
   388  
   389  func isByte(typ reflect.Type) bool {
   390  	return typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface)
   391  }
   392  
   393  func writeRawValue(val reflect.Value, w *encbuf) error {
   394  	w.str = append(w.str, val.Bytes()...)
   395  	return nil
   396  }
   397  
   398  func writeUint(val reflect.Value, w *encbuf) error {
   399  	i := val.Uint()
   400  	if i == 0 {
   401  		w.str = append(w.str, 0x80)
   402  	} else if i < 128 {
   403  //适合单字节
   404  		w.str = append(w.str, byte(i))
   405  	} else {
   406  //TODO:直接将int编码为w.str
   407  		s := putint(w.sizebuf[1:], i)
   408  		w.sizebuf[0] = 0x80 + byte(s)
   409  		w.str = append(w.str, w.sizebuf[:s+1]...)
   410  	}
   411  	return nil
   412  }
   413  
   414  func writeBool(val reflect.Value, w *encbuf) error {
   415  	if val.Bool() {
   416  		w.str = append(w.str, 0x01)
   417  	} else {
   418  		w.str = append(w.str, 0x80)
   419  	}
   420  	return nil
   421  }
   422  
   423  func writeBigIntPtr(val reflect.Value, w *encbuf) error {
   424  	ptr := val.Interface().(*big.Int)
   425  	if ptr == nil {
   426  		w.str = append(w.str, 0x80)
   427  		return nil
   428  	}
   429  	return writeBigInt(ptr, w)
   430  }
   431  
   432  func writeBigIntNoPtr(val reflect.Value, w *encbuf) error {
   433  	i := val.Interface().(big.Int)
   434  	return writeBigInt(&i, w)
   435  }
   436  
   437  func writeBigInt(i *big.Int, w *encbuf) error {
   438  	if cmp := i.Cmp(big0); cmp == -1 {
   439  		return fmt.Errorf("rlp: cannot encode negative *big.Int")
   440  	} else if cmp == 0 {
   441  		w.str = append(w.str, 0x80)
   442  	} else {
   443  		w.encodeString(i.Bytes())
   444  	}
   445  	return nil
   446  }
   447  
   448  func writeBytes(val reflect.Value, w *encbuf) error {
   449  	w.encodeString(val.Bytes())
   450  	return nil
   451  }
   452  
   453  func writeByteArray(val reflect.Value, w *encbuf) error {
   454  	if !val.CanAddr() {
   455  //切片要求值是可寻址的。
   456  //通过复制使其可寻址。
   457  		copy := reflect.New(val.Type()).Elem()
   458  		copy.Set(val)
   459  		val = copy
   460  	}
   461  	size := val.Len()
   462  	slice := val.Slice(0, size).Bytes()
   463  	w.encodeString(slice)
   464  	return nil
   465  }
   466  
   467  func writeString(val reflect.Value, w *encbuf) error {
   468  	s := val.String()
   469  	if len(s) == 1 && s[0] <= 0x7f {
   470  //适合单字节,无字符串头
   471  		w.str = append(w.str, s[0])
   472  	} else {
   473  		w.encodeStringHeader(len(s))
   474  		w.str = append(w.str, s...)
   475  	}
   476  	return nil
   477  }
   478  
   479  func writeEncoder(val reflect.Value, w *encbuf) error {
   480  	return val.Interface().(Encoder).EncodeRLP(w)
   481  }
   482  
   483  //WriteEncoderNoptr处理实现编码器的非指针值
   484  //带指针接收器。
   485  func writeEncoderNoPtr(val reflect.Value, w *encbuf) error {
   486  	if !val.CanAddr() {
   487  //我们找不到地址。它可以使
   488  //通过创建一个浅副本可寻址的值,但是
   489  //造成其他问题,所以我们还没有做。
   490  //
   491  //包json只是不调用marshaljson来处理类似的情况
   492  //但对值进行编码,就好像它没有实现
   493  //接口。我们不想那样处理。
   494  		return fmt.Errorf("rlp: game over: unadressable value of type %v, EncodeRLP is pointer method", val.Type())
   495  	}
   496  	return val.Addr().Interface().(Encoder).EncodeRLP(w)
   497  }
   498  
   499  func writeInterface(val reflect.Value, w *encbuf) error {
   500  	if val.IsNil() {
   501  //写空列表。这与之前的RLP一致
   502  //我们拥有的编码器,因此应该避免
   503  //问题。
   504  		w.str = append(w.str, 0xC0)
   505  		return nil
   506  	}
   507  	eval := val.Elem()
   508  	ti, err := cachedTypeInfo(eval.Type(), tags{})
   509  	if err != nil {
   510  		return err
   511  	}
   512  	return ti.writer(eval, w)
   513  }
   514  
   515  func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) {
   516  	etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})
   517  	if err != nil {
   518  		return nil, err
   519  	}
   520  	writer := func(val reflect.Value, w *encbuf) error {
   521  		if !ts.tail {
   522  			defer w.listEnd(w.list())
   523  		}
   524  		vlen := val.Len()
   525  		for i := 0; i < vlen; i++ {
   526  			if err := etypeinfo.writer(val.Index(i), w); err != nil {
   527  				return err
   528  			}
   529  		}
   530  		return nil
   531  	}
   532  	return writer, nil
   533  }
   534  
   535  func makeStructWriter(typ reflect.Type) (writer, error) {
   536  	fields, err := structFields(typ)
   537  	if err != nil {
   538  		return nil, err
   539  	}
   540  	writer := func(val reflect.Value, w *encbuf) error {
   541  		lh := w.list()
   542  		for _, f := range fields {
   543  			if err := f.info.writer(val.Field(f.index), w); err != nil {
   544  				return err
   545  			}
   546  		}
   547  		w.listEnd(lh)
   548  		return nil
   549  	}
   550  	return writer, nil
   551  }
   552  
   553  func makePtrWriter(typ reflect.Type) (writer, error) {
   554  	etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})
   555  	if err != nil {
   556  		return nil, err
   557  	}
   558  
   559  //确定零指针处理程序
   560  	var nilfunc func(*encbuf) error
   561  	kind := typ.Elem().Kind()
   562  	switch {
   563  	case kind == reflect.Array && isByte(typ.Elem().Elem()):
   564  		nilfunc = func(w *encbuf) error {
   565  			w.str = append(w.str, 0x80)
   566  			return nil
   567  		}
   568  	case kind == reflect.Struct || kind == reflect.Array:
   569  		nilfunc = func(w *encbuf) error {
   570  //对结构/数组的零值进行编码可能会触发
   571  //无限递归,避免这种情况。
   572  			w.listEnd(w.list())
   573  			return nil
   574  		}
   575  	default:
   576  		zero := reflect.Zero(typ.Elem())
   577  		nilfunc = func(w *encbuf) error {
   578  			return etypeinfo.writer(zero, w)
   579  		}
   580  	}
   581  
   582  	writer := func(val reflect.Value, w *encbuf) error {
   583  		if val.IsNil() {
   584  			return nilfunc(w)
   585  		}
   586  		return etypeinfo.writer(val.Elem(), w)
   587  	}
   588  	return writer, err
   589  }
   590  
   591  //putint用big endian字节将i写入b的开头
   592  //顺序,使用表示i所需的最小字节数。
   593  func putint(b []byte, i uint64) (size int) {
   594  	switch {
   595  	case i < (1 << 8):
   596  		b[0] = byte(i)
   597  		return 1
   598  	case i < (1 << 16):
   599  		b[0] = byte(i >> 8)
   600  		b[1] = byte(i)
   601  		return 2
   602  	case i < (1 << 24):
   603  		b[0] = byte(i >> 16)
   604  		b[1] = byte(i >> 8)
   605  		b[2] = byte(i)
   606  		return 3
   607  	case i < (1 << 32):
   608  		b[0] = byte(i >> 24)
   609  		b[1] = byte(i >> 16)
   610  		b[2] = byte(i >> 8)
   611  		b[3] = byte(i)
   612  		return 4
   613  	case i < (1 << 40):
   614  		b[0] = byte(i >> 32)
   615  		b[1] = byte(i >> 24)
   616  		b[2] = byte(i >> 16)
   617  		b[3] = byte(i >> 8)
   618  		b[4] = byte(i)
   619  		return 5
   620  	case i < (1 << 48):
   621  		b[0] = byte(i >> 40)
   622  		b[1] = byte(i >> 32)
   623  		b[2] = byte(i >> 24)
   624  		b[3] = byte(i >> 16)
   625  		b[4] = byte(i >> 8)
   626  		b[5] = byte(i)
   627  		return 6
   628  	case i < (1 << 56):
   629  		b[0] = byte(i >> 48)
   630  		b[1] = byte(i >> 40)
   631  		b[2] = byte(i >> 32)
   632  		b[3] = byte(i >> 24)
   633  		b[4] = byte(i >> 16)
   634  		b[5] = byte(i >> 8)
   635  		b[6] = byte(i)
   636  		return 7
   637  	default:
   638  		b[0] = byte(i >> 56)
   639  		b[1] = byte(i >> 48)
   640  		b[2] = byte(i >> 40)
   641  		b[3] = byte(i >> 32)
   642  		b[4] = byte(i >> 24)
   643  		b[5] = byte(i >> 16)
   644  		b[6] = byte(i >> 8)
   645  		b[7] = byte(i)
   646  		return 8
   647  	}
   648  }
   649  
   650  //IntSize计算存储i所需的最小字节数。
   651  func intsize(i uint64) (size int) {
   652  	for size = 1; ; size++ {
   653  		if i >>= 8; i == 0 {
   654  			return size
   655  		}
   656  	}
   657  }