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 }