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 }