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