github.com/chain5j/chain5j-pkg@v1.0.7/codec/rlp/decode.go (about) 1 // Copyright 2014 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package rlp 18 19 import ( 20 "bufio" 21 "bytes" 22 "encoding/binary" 23 "errors" 24 "fmt" 25 "io" 26 "math/big" 27 "reflect" 28 "strings" 29 "sync" 30 31 "github.com/chain5j/chain5j-pkg/codec/rlp/internal/rlpstruct" 32 ) 33 34 //lint:ignore ST1012 EOL is not an error. 35 36 // EOL is returned when the end of the current list 37 // has been reached during streaming. 38 var EOL = errors.New("rlp: end of list") 39 40 var ( 41 ErrExpectedString = errors.New("rlp: expected String or Byte") 42 ErrExpectedList = errors.New("rlp: expected List") 43 ErrCanonInt = errors.New("rlp: non-canonical integer format") 44 ErrCanonSize = errors.New("rlp: non-canonical size information") 45 ErrElemTooLarge = errors.New("rlp: element is larger than containing list") 46 ErrValueTooLarge = errors.New("rlp: value size exceeds available input length") 47 ErrMoreThanOneValue = errors.New("rlp: input contains more than one value") 48 49 // internal errors 50 errNotInList = errors.New("rlp: call of ListEnd outside of any list") 51 errNotAtEOL = errors.New("rlp: call of ListEnd not positioned at EOL") 52 errUintOverflow = errors.New("rlp: uint overflow") 53 errNoPointer = errors.New("rlp: interface given to Decode must be a pointer") 54 errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil") 55 56 streamPool = sync.Pool{ 57 New: func() interface{} { return new(Stream) }, 58 } 59 ) 60 61 // Decoder is implemented by types that require custom RLP decoding rules or need to decode 62 // into private fields. 63 // 64 // The DecodeRLP method should read one value from the given Stream. It is not forbidden to 65 // read less or more, but it might be confusing. 66 type Decoder interface { 67 DecodeRLP(*Stream) error 68 } 69 70 // Decode parses RLP-encoded data from r and stores the result in the value pointed to by 71 // val. Please see package-level documentation for the decoding rules. Val must be a 72 // non-nil pointer. 73 // 74 // If r does not implement ByteReader, Decode will do its own buffering. 75 // 76 // Note that Decode does not set an input limit for all readers and may be vulnerable to 77 // panics cause by huge value sizes. If you need an input limit, use 78 // 79 // NewStream(r, limit).Decode(val) 80 func Decode(r io.Reader, val interface{}) error { 81 stream := streamPool.Get().(*Stream) 82 defer streamPool.Put(stream) 83 84 stream.Reset(r, 0) 85 return stream.Decode(val) 86 } 87 88 // DecodeBytes parses RLP data from b into val. Please see package-level documentation for 89 // the decoding rules. The input must contain exactly one value and no trailing data. 90 func DecodeBytes(b []byte, val interface{}) error { 91 r := bytes.NewReader(b) 92 93 stream := streamPool.Get().(*Stream) 94 defer streamPool.Put(stream) 95 96 stream.Reset(r, uint64(len(b))) 97 if err := stream.Decode(val); err != nil { 98 return err 99 } 100 if r.Len() > 0 { 101 return ErrMoreThanOneValue 102 } 103 return nil 104 } 105 106 type decodeError struct { 107 msg string 108 typ reflect.Type 109 ctx []string 110 } 111 112 func (err *decodeError) Error() string { 113 ctx := "" 114 if len(err.ctx) > 0 { 115 ctx = ", decoding into " 116 for i := len(err.ctx) - 1; i >= 0; i-- { 117 ctx += err.ctx[i] 118 } 119 } 120 return fmt.Sprintf("rlp: %s for %v%s", err.msg, err.typ, ctx) 121 } 122 123 func wrapStreamError(err error, typ reflect.Type) error { 124 switch err { 125 case ErrCanonInt: 126 return &decodeError{msg: "non-canonical integer (leading zero bytes)", typ: typ} 127 case ErrCanonSize: 128 return &decodeError{msg: "non-canonical size information", typ: typ} 129 case ErrExpectedList: 130 return &decodeError{msg: "expected input list", typ: typ} 131 case ErrExpectedString: 132 return &decodeError{msg: "expected input string or byte", typ: typ} 133 case errUintOverflow: 134 return &decodeError{msg: "input string too long", typ: typ} 135 case errNotAtEOL: 136 return &decodeError{msg: "input list has too many elements", typ: typ} 137 } 138 return err 139 } 140 141 func addErrorContext(err error, ctx string) error { 142 if decErr, ok := err.(*decodeError); ok { 143 decErr.ctx = append(decErr.ctx, ctx) 144 } 145 return err 146 } 147 148 var ( 149 decoderInterface = reflect.TypeOf(new(Decoder)).Elem() 150 bigInt = reflect.TypeOf(big.Int{}) 151 ) 152 153 func makeDecoder(typ reflect.Type, tags rlpstruct.Tags) (dec decoder, err error) { 154 kind := typ.Kind() 155 switch { 156 case typ == rawValueType: 157 return decodeRawValue, nil 158 case typ.AssignableTo(reflect.PtrTo(bigInt)): 159 return decodeBigInt, nil 160 case typ.AssignableTo(bigInt): 161 return decodeBigIntNoPtr, nil 162 case kind == reflect.Ptr: 163 return makePtrDecoder(typ, tags) 164 case reflect.PtrTo(typ).Implements(decoderInterface): 165 return decodeDecoder, nil 166 case isUint(kind): 167 return decodeUint, nil 168 case kind == reflect.Bool: 169 return decodeBool, nil 170 case kind == reflect.String: 171 return decodeString, nil 172 case kind == reflect.Slice || kind == reflect.Array: 173 return makeListDecoder(typ, tags) 174 case kind == reflect.Struct: 175 return makeStructDecoder(typ) 176 case kind == reflect.Interface: 177 return decodeInterface, nil 178 default: 179 return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ) 180 } 181 } 182 183 func decodeRawValue(s *Stream, val reflect.Value) error { 184 r, err := s.Raw() 185 if err != nil { 186 return err 187 } 188 val.SetBytes(r) 189 return nil 190 } 191 192 func decodeUint(s *Stream, val reflect.Value) error { 193 typ := val.Type() 194 num, err := s.uint(typ.Bits()) 195 if err != nil { 196 return wrapStreamError(err, val.Type()) 197 } 198 val.SetUint(num) 199 return nil 200 } 201 202 func decodeBool(s *Stream, val reflect.Value) error { 203 b, err := s.Bool() 204 if err != nil { 205 return wrapStreamError(err, val.Type()) 206 } 207 val.SetBool(b) 208 return nil 209 } 210 211 func decodeString(s *Stream, val reflect.Value) error { 212 b, err := s.Bytes() 213 if err != nil { 214 return wrapStreamError(err, val.Type()) 215 } 216 val.SetString(string(b)) 217 return nil 218 } 219 220 func decodeBigIntNoPtr(s *Stream, val reflect.Value) error { 221 return decodeBigInt(s, val.Addr()) 222 } 223 224 func decodeBigInt(s *Stream, val reflect.Value) error { 225 i := val.Interface().(*big.Int) 226 if i == nil { 227 i = new(big.Int) 228 val.Set(reflect.ValueOf(i)) 229 } 230 231 err := s.decodeBigInt(i) 232 if err != nil { 233 return wrapStreamError(err, val.Type()) 234 } 235 return nil 236 } 237 238 func makeListDecoder(typ reflect.Type, tag rlpstruct.Tags) (decoder, error) { 239 etype := typ.Elem() 240 if etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) { 241 if typ.Kind() == reflect.Array { 242 return decodeByteArray, nil 243 } 244 return decodeByteSlice, nil 245 } 246 etypeinfo := theTC.infoWhileGenerating(etype, rlpstruct.Tags{}) 247 if etypeinfo.decoderErr != nil { 248 return nil, etypeinfo.decoderErr 249 } 250 var dec decoder 251 switch { 252 case typ.Kind() == reflect.Array: 253 dec = func(s *Stream, val reflect.Value) error { 254 return decodeListArray(s, val, etypeinfo.decoder) 255 } 256 case tag.Tail: 257 // A slice with "tail" tag can occur as the last field 258 // of a struct and is supposed to swallow all remaining 259 // list elements. The struct decoder already called s.List, 260 // proceed directly to decoding the elements. 261 dec = func(s *Stream, val reflect.Value) error { 262 return decodeSliceElems(s, val, etypeinfo.decoder) 263 } 264 default: 265 dec = func(s *Stream, val reflect.Value) error { 266 return decodeListSlice(s, val, etypeinfo.decoder) 267 } 268 } 269 return dec, nil 270 } 271 272 func decodeListSlice(s *Stream, val reflect.Value, elemdec decoder) error { 273 size, err := s.List() 274 if err != nil { 275 return wrapStreamError(err, val.Type()) 276 } 277 if size == 0 { 278 val.Set(reflect.MakeSlice(val.Type(), 0, 0)) 279 return s.ListEnd() 280 } 281 if err := decodeSliceElems(s, val, elemdec); err != nil { 282 return err 283 } 284 return s.ListEnd() 285 } 286 287 func decodeSliceElems(s *Stream, val reflect.Value, elemdec decoder) error { 288 i := 0 289 for ; ; i++ { 290 // grow slice if necessary 291 if i >= val.Cap() { 292 newcap := val.Cap() + val.Cap()/2 293 if newcap < 4 { 294 newcap = 4 295 } 296 newv := reflect.MakeSlice(val.Type(), val.Len(), newcap) 297 reflect.Copy(newv, val) 298 val.Set(newv) 299 } 300 if i >= val.Len() { 301 val.SetLen(i + 1) 302 } 303 // decode into element 304 if err := elemdec(s, val.Index(i)); err == EOL { 305 break 306 } else if err != nil { 307 return addErrorContext(err, fmt.Sprint("[", i, "]")) 308 } 309 } 310 if i < val.Len() { 311 val.SetLen(i) 312 } 313 return nil 314 } 315 316 func decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error { 317 if _, err := s.List(); err != nil { 318 return wrapStreamError(err, val.Type()) 319 } 320 vlen := val.Len() 321 i := 0 322 for ; i < vlen; i++ { 323 if err := elemdec(s, val.Index(i)); err == EOL { 324 break 325 } else if err != nil { 326 return addErrorContext(err, fmt.Sprint("[", i, "]")) 327 } 328 } 329 if i < vlen { 330 return &decodeError{msg: "input list has too few elements", typ: val.Type()} 331 } 332 return wrapStreamError(s.ListEnd(), val.Type()) 333 } 334 335 func decodeByteSlice(s *Stream, val reflect.Value) error { 336 b, err := s.Bytes() 337 if err != nil { 338 return wrapStreamError(err, val.Type()) 339 } 340 val.SetBytes(b) 341 return nil 342 } 343 344 func decodeByteArray(s *Stream, val reflect.Value) error { 345 kind, size, err := s.Kind() 346 if err != nil { 347 return err 348 } 349 slice := byteArrayBytes(val, val.Len()) 350 switch kind { 351 case Byte: 352 if len(slice) == 0 { 353 return &decodeError{msg: "input string too long", typ: val.Type()} 354 } else if len(slice) > 1 { 355 return &decodeError{msg: "input string too short", typ: val.Type()} 356 } 357 slice[0] = s.byteval 358 s.kind = -1 359 case String: 360 if uint64(len(slice)) < size { 361 return &decodeError{msg: "input string too long", typ: val.Type()} 362 } 363 if uint64(len(slice)) > size { 364 return &decodeError{msg: "input string too short", typ: val.Type()} 365 } 366 if err := s.readFull(slice); err != nil { 367 return err 368 } 369 // Reject cases where single byte encoding should have been used. 370 if size == 1 && slice[0] < 128 { 371 return wrapStreamError(ErrCanonSize, val.Type()) 372 } 373 case List: 374 return wrapStreamError(ErrExpectedString, val.Type()) 375 } 376 return nil 377 } 378 379 func makeStructDecoder(typ reflect.Type) (decoder, error) { 380 fields, err := structFields(typ) 381 if err != nil { 382 return nil, err 383 } 384 for _, f := range fields { 385 if f.info.decoderErr != nil { 386 return nil, structFieldError{typ, f.index, f.info.decoderErr} 387 } 388 } 389 dec := func(s *Stream, val reflect.Value) (err error) { 390 if _, err := s.List(); err != nil { 391 return wrapStreamError(err, typ) 392 } 393 for i, f := range fields { 394 err := f.info.decoder(s, val.Field(f.index)) 395 if err == EOL { 396 if f.optional { 397 // The field is optional, so reaching the end of the list before 398 // reaching the last field is acceptable. All remaining undecoded 399 // fields are zeroed. 400 zeroFields(val, fields[i:]) 401 break 402 } 403 return &decodeError{msg: "too few elements", typ: typ} 404 } else if err != nil { 405 return addErrorContext(err, "."+typ.Field(f.index).Name) 406 } 407 } 408 return wrapStreamError(s.ListEnd(), typ) 409 } 410 return dec, nil 411 } 412 413 func zeroFields(structval reflect.Value, fields []field) { 414 for _, f := range fields { 415 fv := structval.Field(f.index) 416 fv.Set(reflect.Zero(fv.Type())) 417 } 418 } 419 420 // makePtrDecoder creates a decoder that decodes into the pointer's element type. 421 func makePtrDecoder(typ reflect.Type, tag rlpstruct.Tags) (decoder, error) { 422 etype := typ.Elem() 423 etypeinfo := theTC.infoWhileGenerating(etype, rlpstruct.Tags{}) 424 switch { 425 case etypeinfo.decoderErr != nil: 426 return nil, etypeinfo.decoderErr 427 case !tag.NilOK: 428 return makeSimplePtrDecoder(etype, etypeinfo), nil 429 default: 430 return makeNilPtrDecoder(etype, etypeinfo, tag), nil 431 } 432 } 433 434 func makeSimplePtrDecoder(etype reflect.Type, etypeinfo *typeinfo) decoder { 435 return func(s *Stream, val reflect.Value) (err error) { 436 newval := val 437 if val.IsNil() { 438 newval = reflect.New(etype) 439 } 440 if err = etypeinfo.decoder(s, newval.Elem()); err == nil { 441 val.Set(newval) 442 } 443 return err 444 } 445 } 446 447 // makeNilPtrDecoder creates a decoder that decodes empty values as nil. Non-empty 448 // values are decoded into a value of the element type, just like makePtrDecoder does. 449 // 450 // This decoder is used for pointer-typed struct fields with struct tag "nil". 451 func makeNilPtrDecoder(etype reflect.Type, etypeinfo *typeinfo, ts rlpstruct.Tags) decoder { 452 typ := reflect.PtrTo(etype) 453 nilPtr := reflect.Zero(typ) 454 455 // Determine the value kind that results in nil pointer. 456 nilKind := typeNilKind(etype, ts) 457 458 return func(s *Stream, val reflect.Value) (err error) { 459 kind, size, err := s.Kind() 460 if err != nil { 461 val.Set(nilPtr) 462 return wrapStreamError(err, typ) 463 } 464 // Handle empty values as a nil pointer. 465 if kind != Byte && size == 0 { 466 if kind != nilKind { 467 return &decodeError{ 468 msg: fmt.Sprintf("wrong kind of empty value (got %v, want %v)", kind, nilKind), 469 typ: typ, 470 } 471 } 472 // rearm s.Kind. This is important because the input 473 // position must advance to the next value even though 474 // we don't read anything. 475 s.kind = -1 476 val.Set(nilPtr) 477 return nil 478 } 479 newval := val 480 if val.IsNil() { 481 newval = reflect.New(etype) 482 } 483 if err = etypeinfo.decoder(s, newval.Elem()); err == nil { 484 val.Set(newval) 485 } 486 return err 487 } 488 } 489 490 var ifsliceType = reflect.TypeOf([]interface{}{}) 491 492 func decodeInterface(s *Stream, val reflect.Value) error { 493 if val.Type().NumMethod() != 0 { 494 return fmt.Errorf("rlp: type %v is not RLP-serializable", val.Type()) 495 } 496 kind, _, err := s.Kind() 497 if err != nil { 498 return err 499 } 500 if kind == List { 501 slice := reflect.New(ifsliceType).Elem() 502 if err := decodeListSlice(s, slice, decodeInterface); err != nil { 503 return err 504 } 505 val.Set(slice) 506 } else { 507 b, err := s.Bytes() 508 if err != nil { 509 return err 510 } 511 val.Set(reflect.ValueOf(b)) 512 } 513 return nil 514 } 515 516 func decodeDecoder(s *Stream, val reflect.Value) error { 517 return val.Addr().Interface().(Decoder).DecodeRLP(s) 518 } 519 520 // Kind represents the kind of value contained in an RLP stream. 521 type Kind int8 522 523 const ( 524 Byte Kind = iota 525 String 526 List 527 ) 528 529 func (k Kind) String() string { 530 switch k { 531 case Byte: 532 return "Byte" 533 case String: 534 return "String" 535 case List: 536 return "List" 537 default: 538 return fmt.Sprintf("Unknown(%d)", k) 539 } 540 } 541 542 // ByteReader must be implemented by any input reader for a Stream. It 543 // is implemented by e.g. bufio.Reader and bytes.Reader. 544 type ByteReader interface { 545 io.Reader 546 io.ByteReader 547 } 548 549 // Stream can be used for piecemeal decoding of an input stream. This 550 // is useful if the input is very large or if the decoding rules for a 551 // type depend on the input structure. Stream does not keep an 552 // internal buffer. After decoding a value, the input reader will be 553 // positioned just before the type information for the next value. 554 // 555 // When decoding a list and the input position reaches the declared 556 // length of the list, all operations will return error EOL. 557 // The end of the list must be acknowledged using ListEnd to continue 558 // reading the enclosing list. 559 // 560 // Stream is not safe for concurrent use. 561 type Stream struct { 562 r ByteReader 563 564 remaining uint64 // number of bytes remaining to be read from r 565 size uint64 // size of value ahead 566 kinderr error // error from last readKind 567 stack []uint64 // list sizes 568 uintbuf [32]byte // auxiliary buffer for integer decoding 569 kind Kind // kind of value ahead 570 byteval byte // value of single byte in type tag 571 limited bool // true if input limit is in effect 572 } 573 574 // NewStream creates a new decoding stream reading from r. 575 // 576 // If r implements the ByteReader interface, Stream will 577 // not introduce any buffering. 578 // 579 // For non-toplevel values, Stream returns ErrElemTooLarge 580 // for values that do not fit into the enclosing list. 581 // 582 // Stream supports an optional input limit. If a limit is set, the 583 // size of any toplevel value will be checked against the remaining 584 // input length. Stream operations that encounter a value exceeding 585 // the remaining input length will return ErrValueTooLarge. The limit 586 // can be set by passing a non-zero value for inputLimit. 587 // 588 // If r is a bytes.Reader or strings.Reader, the input limit is set to 589 // the length of r's underlying data unless an explicit limit is 590 // provided. 591 func NewStream(r io.Reader, inputLimit uint64) *Stream { 592 s := new(Stream) 593 s.Reset(r, inputLimit) 594 return s 595 } 596 597 // NewListStream creates a new stream that pretends to be positioned 598 // at an encoded list of the given length. 599 func NewListStream(r io.Reader, len uint64) *Stream { 600 s := new(Stream) 601 s.Reset(r, len) 602 s.kind = List 603 s.size = len 604 return s 605 } 606 607 // Bytes reads an RLP string and returns its contents as a byte slice. 608 // If the input does not contain an RLP string, the returned 609 // error will be ErrExpectedString. 610 func (s *Stream) Bytes() ([]byte, error) { 611 kind, size, err := s.Kind() 612 if err != nil { 613 return nil, err 614 } 615 switch kind { 616 case Byte: 617 s.kind = -1 // rearm Kind 618 return []byte{s.byteval}, nil 619 case String: 620 b := make([]byte, size) 621 if err = s.readFull(b); err != nil { 622 return nil, err 623 } 624 if size == 1 && b[0] < 128 { 625 return nil, ErrCanonSize 626 } 627 return b, nil 628 default: 629 return nil, ErrExpectedString 630 } 631 } 632 633 // ReadBytes decodes the next RLP value and stores the result in b. 634 // The value size must match len(b) exactly. 635 func (s *Stream) ReadBytes(b []byte) error { 636 kind, size, err := s.Kind() 637 if err != nil { 638 return err 639 } 640 switch kind { 641 case Byte: 642 if len(b) != 1 { 643 return fmt.Errorf("input value has wrong size 1, want %d", len(b)) 644 } 645 b[0] = s.byteval 646 s.kind = -1 // rearm Kind 647 return nil 648 case String: 649 if uint64(len(b)) != size { 650 return fmt.Errorf("input value has wrong size %d, want %d", size, len(b)) 651 } 652 if err = s.readFull(b); err != nil { 653 return err 654 } 655 if size == 1 && b[0] < 128 { 656 return ErrCanonSize 657 } 658 return nil 659 default: 660 return ErrExpectedString 661 } 662 } 663 664 // Raw reads a raw encoded value including RLP type information. 665 func (s *Stream) Raw() ([]byte, error) { 666 kind, size, err := s.Kind() 667 if err != nil { 668 return nil, err 669 } 670 if kind == Byte { 671 s.kind = -1 // rearm Kind 672 return []byte{s.byteval}, nil 673 } 674 // The original header has already been read and is no longer 675 // available. Read content and put a new header in front of it. 676 start := headsize(size) 677 buf := make([]byte, uint64(start)+size) 678 if err := s.readFull(buf[start:]); err != nil { 679 return nil, err 680 } 681 if kind == String { 682 puthead(buf, 0x80, 0xB7, size) 683 } else { 684 puthead(buf, 0xC0, 0xF7, size) 685 } 686 return buf, nil 687 } 688 689 // Uint reads an RLP string of up to 8 bytes and returns its contents 690 // as an unsigned integer. If the input does not contain an RLP string, the 691 // returned error will be ErrExpectedString. 692 // 693 // Deprecated: use s.Uint64 instead. 694 func (s *Stream) Uint() (uint64, error) { 695 return s.uint(64) 696 } 697 698 func (s *Stream) Uint64() (uint64, error) { 699 return s.uint(64) 700 } 701 702 func (s *Stream) Uint32() (uint32, error) { 703 i, err := s.uint(32) 704 return uint32(i), err 705 } 706 707 func (s *Stream) Uint16() (uint16, error) { 708 i, err := s.uint(16) 709 return uint16(i), err 710 } 711 712 func (s *Stream) Uint8() (uint8, error) { 713 i, err := s.uint(8) 714 return uint8(i), err 715 } 716 717 func (s *Stream) uint(maxbits int) (uint64, error) { 718 kind, size, err := s.Kind() 719 if err != nil { 720 return 0, err 721 } 722 switch kind { 723 case Byte: 724 if s.byteval == 0 { 725 return 0, ErrCanonInt 726 } 727 s.kind = -1 // rearm Kind 728 return uint64(s.byteval), nil 729 case String: 730 if size > uint64(maxbits/8) { 731 return 0, errUintOverflow 732 } 733 v, err := s.readUint(byte(size)) 734 switch { 735 case err == ErrCanonSize: 736 // Adjust error because we're not reading a size right now. 737 return 0, ErrCanonInt 738 case err != nil: 739 return 0, err 740 case size > 0 && v < 128: 741 return 0, ErrCanonSize 742 default: 743 return v, nil 744 } 745 default: 746 return 0, ErrExpectedString 747 } 748 } 749 750 // Bool reads an RLP string of up to 1 byte and returns its contents 751 // as a boolean. If the input does not contain an RLP string, the 752 // returned error will be ErrExpectedString. 753 func (s *Stream) Bool() (bool, error) { 754 num, err := s.uint(8) 755 if err != nil { 756 return false, err 757 } 758 switch num { 759 case 0: 760 return false, nil 761 case 1: 762 return true, nil 763 default: 764 return false, fmt.Errorf("rlp: invalid boolean value: %d", num) 765 } 766 } 767 768 // List starts decoding an RLP list. If the input does not contain a 769 // list, the returned error will be ErrExpectedList. When the list's 770 // end has been reached, any Stream operation will return EOL. 771 func (s *Stream) List() (size uint64, err error) { 772 kind, size, err := s.Kind() 773 if err != nil { 774 return 0, err 775 } 776 if kind != List { 777 return 0, ErrExpectedList 778 } 779 780 // Remove size of inner list from outer list before pushing the new size 781 // onto the stack. This ensures that the remaining outer list size will 782 // be correct after the matching call to ListEnd. 783 if inList, limit := s.listLimit(); inList { 784 s.stack[len(s.stack)-1] = limit - size 785 } 786 s.stack = append(s.stack, size) 787 s.kind = -1 788 s.size = 0 789 return size, nil 790 } 791 792 // ListEnd returns to the enclosing list. 793 // The input reader must be positioned at the end of a list. 794 func (s *Stream) ListEnd() error { 795 // Ensure that no more data is remaining in the current list. 796 if inList, listLimit := s.listLimit(); !inList { 797 return errNotInList 798 } else if listLimit > 0 { 799 return errNotAtEOL 800 } 801 s.stack = s.stack[:len(s.stack)-1] // pop 802 s.kind = -1 803 s.size = 0 804 return nil 805 } 806 807 // MoreDataInList reports whether the current list context contains 808 // more data to be read. 809 func (s *Stream) MoreDataInList() bool { 810 _, listLimit := s.listLimit() 811 return listLimit > 0 812 } 813 814 // BigInt decodes an arbitrary-size integer value. 815 func (s *Stream) BigInt() (*big.Int, error) { 816 i := new(big.Int) 817 if err := s.decodeBigInt(i); err != nil { 818 return nil, err 819 } 820 return i, nil 821 } 822 823 func (s *Stream) decodeBigInt(dst *big.Int) error { 824 var buffer []byte 825 kind, size, err := s.Kind() 826 switch { 827 case err != nil: 828 return err 829 case kind == List: 830 return ErrExpectedString 831 case kind == Byte: 832 buffer = s.uintbuf[:1] 833 buffer[0] = s.byteval 834 s.kind = -1 // re-arm Kind 835 case size == 0: 836 // Avoid zero-length read. 837 s.kind = -1 838 case size <= uint64(len(s.uintbuf)): 839 // For integers smaller than s.uintbuf, allocating a buffer 840 // can be avoided. 841 buffer = s.uintbuf[:size] 842 if err := s.readFull(buffer); err != nil { 843 return err 844 } 845 // Reject inputs where single byte encoding should have been used. 846 if size == 1 && buffer[0] < 128 { 847 return ErrCanonSize 848 } 849 default: 850 // For large integers, a temporary buffer is needed. 851 buffer = make([]byte, size) 852 if err := s.readFull(buffer); err != nil { 853 return err 854 } 855 } 856 857 // Reject leading zero bytes. 858 if len(buffer) > 0 && buffer[0] == 0 { 859 return ErrCanonInt 860 } 861 // Set the integer bytes. 862 dst.SetBytes(buffer) 863 return nil 864 } 865 866 // Decode decodes a value and stores the result in the value pointed 867 // to by val. Please see the documentation for the Decode function 868 // to learn about the decoding rules. 869 func (s *Stream) Decode(val interface{}) error { 870 if val == nil { 871 return errDecodeIntoNil 872 } 873 rval := reflect.ValueOf(val) 874 rtyp := rval.Type() 875 if rtyp.Kind() != reflect.Ptr { 876 return errNoPointer 877 } 878 if rval.IsNil() { 879 return errDecodeIntoNil 880 } 881 decoder, err := cachedDecoder(rtyp.Elem()) 882 if err != nil { 883 return err 884 } 885 886 err = decoder(s, rval.Elem()) 887 if decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 { 888 // Add decode target type to error so context has more meaning. 889 decErr.ctx = append(decErr.ctx, fmt.Sprint("(", rtyp.Elem(), ")")) 890 } 891 return err 892 } 893 894 // Reset discards any information about the current decoding context 895 // and starts reading from r. This method is meant to facilitate reuse 896 // of a preallocated Stream across many decoding operations. 897 // 898 // If r does not also implement ByteReader, Stream will do its own 899 // buffering. 900 func (s *Stream) Reset(r io.Reader, inputLimit uint64) { 901 if inputLimit > 0 { 902 s.remaining = inputLimit 903 s.limited = true 904 } else { 905 // Attempt to automatically discover 906 // the limit when reading from a byte slice. 907 switch br := r.(type) { 908 case *bytes.Reader: 909 s.remaining = uint64(br.Len()) 910 s.limited = true 911 case *bytes.Buffer: 912 s.remaining = uint64(br.Len()) 913 s.limited = true 914 case *strings.Reader: 915 s.remaining = uint64(br.Len()) 916 s.limited = true 917 default: 918 s.limited = false 919 } 920 } 921 // Wrap r with a buffer if it doesn't have one. 922 bufr, ok := r.(ByteReader) 923 if !ok { 924 bufr = bufio.NewReader(r) 925 } 926 s.r = bufr 927 // Reset the decoding context. 928 s.stack = s.stack[:0] 929 s.size = 0 930 s.kind = -1 931 s.kinderr = nil 932 s.byteval = 0 933 s.uintbuf = [32]byte{} 934 } 935 936 // Kind returns the kind and size of the next value in the 937 // input stream. 938 // 939 // The returned size is the number of bytes that make up the value. 940 // For kind == Byte, the size is zero because the value is 941 // contained in the type tag. 942 // 943 // The first call to Kind will read size information from the input 944 // reader and leave it positioned at the start of the actual bytes of 945 // the value. Subsequent calls to Kind (until the value is decoded) 946 // will not advance the input reader and return cached information. 947 func (s *Stream) Kind() (kind Kind, size uint64, err error) { 948 if s.kind >= 0 { 949 return s.kind, s.size, s.kinderr 950 } 951 952 // Check for end of list. This needs to be done here because readKind 953 // checks against the list size, and would return the wrong error. 954 inList, listLimit := s.listLimit() 955 if inList && listLimit == 0 { 956 return 0, 0, EOL 957 } 958 // Read the actual size tag. 959 s.kind, s.size, s.kinderr = s.readKind() 960 if s.kinderr == nil { 961 // Check the data size of the value ahead against input limits. This 962 // is done here because many decoders require allocating an input 963 // buffer matching the value size. Checking it here protects those 964 // decoders from inputs declaring very large value size. 965 if inList && s.size > listLimit { 966 s.kinderr = ErrElemTooLarge 967 } else if s.limited && s.size > s.remaining { 968 s.kinderr = ErrValueTooLarge 969 } 970 } 971 return s.kind, s.size, s.kinderr 972 } 973 974 func (s *Stream) readKind() (kind Kind, size uint64, err error) { 975 b, err := s.readByte() 976 if err != nil { 977 if len(s.stack) == 0 { 978 // At toplevel, Adjust the error to actual EOF. io.EOF is 979 // used by callers to determine when to stop decoding. 980 switch err { 981 case io.ErrUnexpectedEOF: 982 err = io.EOF 983 case ErrValueTooLarge: 984 err = io.EOF 985 } 986 } 987 return 0, 0, err 988 } 989 s.byteval = 0 990 switch { 991 case b < 0x80: 992 // For a single byte whose value is in the [0x00, 0x7F] range, that byte 993 // is its own RLP encoding. 994 s.byteval = b 995 return Byte, 0, nil 996 case b < 0xB8: 997 // Otherwise, if a string is 0-55 bytes long, the RLP encoding consists 998 // of a single byte with value 0x80 plus the length of the string 999 // followed by the string. The range of the first byte is thus [0x80, 0xB7]. 1000 return String, uint64(b - 0x80), nil 1001 case b < 0xC0: 1002 // If a string is more than 55 bytes long, the RLP encoding consists of a 1003 // single byte with value 0xB7 plus the length of the length of the 1004 // string in binary form, followed by the length of the string, followed 1005 // by the string. For example, a length-1024 string would be encoded as 1006 // 0xB90400 followed by the string. The range of the first byte is thus 1007 // [0xB8, 0xBF]. 1008 size, err = s.readUint(b - 0xB7) 1009 if err == nil && size < 56 { 1010 err = ErrCanonSize 1011 } 1012 return String, size, err 1013 case b < 0xF8: 1014 // If the total payload of a list (i.e. the combined length of all its 1015 // items) is 0-55 bytes long, the RLP encoding consists of a single byte 1016 // with value 0xC0 plus the length of the list followed by the 1017 // concatenation of the RLP encodings of the items. The range of the 1018 // first byte is thus [0xC0, 0xF7]. 1019 return List, uint64(b - 0xC0), nil 1020 default: 1021 // If the total payload of a list is more than 55 bytes long, the RLP 1022 // encoding consists of a single byte with value 0xF7 plus the length of 1023 // the length of the payload in binary form, followed by the length of 1024 // the payload, followed by the concatenation of the RLP encodings of 1025 // the items. The range of the first byte is thus [0xF8, 0xFF]. 1026 size, err = s.readUint(b - 0xF7) 1027 if err == nil && size < 56 { 1028 err = ErrCanonSize 1029 } 1030 return List, size, err 1031 } 1032 } 1033 1034 func (s *Stream) readUint(size byte) (uint64, error) { 1035 switch size { 1036 case 0: 1037 s.kind = -1 // rearm Kind 1038 return 0, nil 1039 case 1: 1040 b, err := s.readByte() 1041 return uint64(b), err 1042 default: 1043 buffer := s.uintbuf[:8] 1044 for i := range buffer { 1045 buffer[i] = 0 1046 } 1047 start := int(8 - size) 1048 if err := s.readFull(buffer[start:]); err != nil { 1049 return 0, err 1050 } 1051 if buffer[start] == 0 { 1052 // Note: readUint is also used to decode integer values. 1053 // The error needs to be adjusted to become ErrCanonInt in this case. 1054 return 0, ErrCanonSize 1055 } 1056 return binary.BigEndian.Uint64(buffer[:]), nil 1057 } 1058 } 1059 1060 // readFull reads into buf from the underlying stream. 1061 func (s *Stream) readFull(buf []byte) (err error) { 1062 if err := s.willRead(uint64(len(buf))); err != nil { 1063 return err 1064 } 1065 var nn, n int 1066 for n < len(buf) && err == nil { 1067 nn, err = s.r.Read(buf[n:]) 1068 n += nn 1069 } 1070 if err == io.EOF { 1071 if n < len(buf) { 1072 err = io.ErrUnexpectedEOF 1073 } else { 1074 // Readers are allowed to give EOF even though the read succeeded. 1075 // In such cases, we discard the EOF, like io.ReadFull() does. 1076 err = nil 1077 } 1078 } 1079 return err 1080 } 1081 1082 // readByte reads a single byte from the underlying stream. 1083 func (s *Stream) readByte() (byte, error) { 1084 if err := s.willRead(1); err != nil { 1085 return 0, err 1086 } 1087 b, err := s.r.ReadByte() 1088 if err == io.EOF { 1089 err = io.ErrUnexpectedEOF 1090 } 1091 return b, err 1092 } 1093 1094 // willRead is called before any read from the underlying stream. It checks 1095 // n against size limits, and updates the limits if n doesn't overflow them. 1096 func (s *Stream) willRead(n uint64) error { 1097 s.kind = -1 // rearm Kind 1098 1099 if inList, limit := s.listLimit(); inList { 1100 if n > limit { 1101 return ErrElemTooLarge 1102 } 1103 s.stack[len(s.stack)-1] = limit - n 1104 } 1105 if s.limited { 1106 if n > s.remaining { 1107 return ErrValueTooLarge 1108 } 1109 s.remaining -= n 1110 } 1111 return nil 1112 } 1113 1114 // listLimit returns the amount of data remaining in the innermost list. 1115 func (s *Stream) listLimit() (inList bool, limit uint64) { 1116 if len(s.stack) == 0 { 1117 return false, 0 1118 } 1119 return true, s.stack[len(s.stack)-1] 1120 }