github.com/decred/dcrlnd@v0.7.6/channeldb/migration/lnwire21/lnwire.go (about) 1 package lnwire 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "image/color" 8 "io" 9 "math" 10 11 "net" 12 13 "github.com/decred/dcrd/chaincfg/chainhash" 14 "github.com/decred/dcrd/dcrec/secp256k1/v4" 15 "github.com/decred/dcrd/dcrutil/v4" 16 "github.com/decred/dcrd/wire" 17 "github.com/decred/dcrlnd/tor" 18 "github.com/go-errors/errors" 19 ) 20 21 // MaxSliceLength is the maximum allowed length for any opaque byte slices in 22 // the wire protocol. 23 const MaxSliceLength = 65535 24 25 // PkScript is simple type definition which represents a raw serialized public 26 // key script. 27 type PkScript []byte 28 29 // addressType specifies the network protocol and version that should be used 30 // when connecting to a node at a particular address. 31 type addressType uint8 32 33 const ( 34 // noAddr denotes a blank address. An address of this type indicates 35 // that a node doesn't have any advertised addresses. 36 noAddr addressType = 0 37 38 // tcp4Addr denotes an IPv4 TCP address. 39 tcp4Addr addressType = 1 40 41 // tcp6Addr denotes an IPv6 TCP address. 42 tcp6Addr addressType = 2 43 44 // v2OnionAddr denotes a version 2 Tor onion service address. 45 v2OnionAddr addressType = 3 46 47 // v3OnionAddr denotes a version 3 Tor (prop224) onion service address. 48 v3OnionAddr addressType = 4 49 ) 50 51 // AddrLen returns the number of bytes that it takes to encode the target 52 // address. 53 func (a addressType) AddrLen() uint16 { 54 switch a { 55 case noAddr: 56 return 0 57 case tcp4Addr: 58 return 6 59 case tcp6Addr: 60 return 18 61 case v2OnionAddr: 62 return 12 63 case v3OnionAddr: 64 return 37 65 default: 66 return 0 67 } 68 } 69 70 // WriteElement is a one-stop shop to write the big endian representation of 71 // any element which is to be serialized for the wire protocol. The passed 72 // io.Writer should be backed by an appropriately sized byte slice, or be able 73 // to dynamically expand to accommodate additional data. 74 // 75 // TODO(roasbeef): this should eventually draw from a buffer pool for 76 // serialization. 77 func WriteElement(w io.Writer, element interface{}) error { 78 switch e := element.(type) { 79 case NodeAlias: 80 if _, err := w.Write(e[:]); err != nil { 81 return err 82 } 83 84 case ShortChanIDEncoding: 85 var b [1]byte 86 b[0] = uint8(e) 87 if _, err := w.Write(b[:]); err != nil { 88 return err 89 } 90 case uint8: 91 var b [1]byte 92 b[0] = e 93 if _, err := w.Write(b[:]); err != nil { 94 return err 95 } 96 case FundingFlag: 97 var b [1]byte 98 b[0] = uint8(e) 99 if _, err := w.Write(b[:]); err != nil { 100 return err 101 } 102 case uint16: 103 var b [2]byte 104 binary.BigEndian.PutUint16(b[:], e) 105 if _, err := w.Write(b[:]); err != nil { 106 return err 107 } 108 case ChanUpdateMsgFlags: 109 var b [1]byte 110 b[0] = uint8(e) 111 if _, err := w.Write(b[:]); err != nil { 112 return err 113 } 114 case ChanUpdateChanFlags: 115 var b [1]byte 116 b[0] = uint8(e) 117 if _, err := w.Write(b[:]); err != nil { 118 return err 119 } 120 case MilliAtom: 121 var b [8]byte 122 binary.BigEndian.PutUint64(b[:], uint64(e)) 123 if _, err := w.Write(b[:]); err != nil { 124 return err 125 } 126 case dcrutil.Amount: 127 var b [8]byte 128 binary.BigEndian.PutUint64(b[:], uint64(e)) 129 if _, err := w.Write(b[:]); err != nil { 130 return err 131 } 132 case uint32: 133 var b [4]byte 134 binary.BigEndian.PutUint32(b[:], e) 135 if _, err := w.Write(b[:]); err != nil { 136 return err 137 } 138 case uint64: 139 var b [8]byte 140 binary.BigEndian.PutUint64(b[:], e) 141 if _, err := w.Write(b[:]); err != nil { 142 return err 143 } 144 case *secp256k1.PublicKey: 145 if e == nil { 146 return fmt.Errorf("cannot write nil pubkey") 147 } 148 149 var b [33]byte 150 serializedPubkey := e.SerializeCompressed() 151 copy(b[:], serializedPubkey) 152 if _, err := w.Write(b[:]); err != nil { 153 return err 154 } 155 case []Sig: 156 var b [2]byte 157 numSigs := uint16(len(e)) 158 binary.BigEndian.PutUint16(b[:], numSigs) 159 if _, err := w.Write(b[:]); err != nil { 160 return err 161 } 162 163 for _, sig := range e { 164 if err := WriteElement(w, sig); err != nil { 165 return err 166 } 167 } 168 case Sig: 169 // Write buffer 170 if _, err := w.Write(e[:]); err != nil { 171 return err 172 } 173 case PingPayload: 174 var l [2]byte 175 binary.BigEndian.PutUint16(l[:], uint16(len(e))) 176 if _, err := w.Write(l[:]); err != nil { 177 return err 178 } 179 180 if _, err := w.Write(e[:]); err != nil { 181 return err 182 } 183 case PongPayload: 184 var l [2]byte 185 binary.BigEndian.PutUint16(l[:], uint16(len(e))) 186 if _, err := w.Write(l[:]); err != nil { 187 return err 188 } 189 190 if _, err := w.Write(e[:]); err != nil { 191 return err 192 } 193 case ErrorData: 194 var l [2]byte 195 binary.BigEndian.PutUint16(l[:], uint16(len(e))) 196 if _, err := w.Write(l[:]); err != nil { 197 return err 198 } 199 200 if _, err := w.Write(e[:]); err != nil { 201 return err 202 } 203 case OpaqueReason: 204 var l [2]byte 205 binary.BigEndian.PutUint16(l[:], uint16(len(e))) 206 if _, err := w.Write(l[:]); err != nil { 207 return err 208 } 209 210 if _, err := w.Write(e[:]); err != nil { 211 return err 212 } 213 case [33]byte: 214 if _, err := w.Write(e[:]); err != nil { 215 return err 216 } 217 case []byte: 218 if _, err := w.Write(e); err != nil { 219 return err 220 } 221 case PkScript: 222 // The largest script we'll accept is a p2wsh which is exactly 223 // 34 bytes long. 224 scriptLength := len(e) 225 if scriptLength > 34 { 226 return fmt.Errorf("'PkScript' too long") 227 } 228 229 if err := wire.WriteVarBytes(w, 0, e); err != nil { 230 return err 231 } 232 case *RawFeatureVector: 233 if e == nil { 234 return fmt.Errorf("cannot write nil feature vector") 235 } 236 237 if err := e.Encode(w); err != nil { 238 return err 239 } 240 241 case wire.OutPoint: 242 var h [32]byte 243 copy(h[:], e.Hash[:]) 244 if _, err := w.Write(h[:]); err != nil { 245 return err 246 } 247 248 if e.Index > math.MaxUint16 { 249 return fmt.Errorf("index for outpoint (%v) is "+ 250 "greater than max index of %v", e.Index, 251 math.MaxUint16) 252 } 253 254 var idx [2]byte 255 binary.BigEndian.PutUint16(idx[:], uint16(e.Index)) 256 if _, err := w.Write(idx[:]); err != nil { 257 return err 258 } 259 260 case ChannelID: 261 if _, err := w.Write(e[:]); err != nil { 262 return err 263 } 264 case FailCode: 265 if err := WriteElement(w, uint16(e)); err != nil { 266 return err 267 } 268 case ShortChannelID: 269 // Check that field fit in 3 bytes and write the blockHeight 270 if e.BlockHeight > ((1 << 24) - 1) { 271 return errors.New("block height should fit in 3 bytes") 272 } 273 274 var blockHeight [4]byte 275 binary.BigEndian.PutUint32(blockHeight[:], e.BlockHeight) 276 277 if _, err := w.Write(blockHeight[1:]); err != nil { 278 return err 279 } 280 281 // Check that field fit in 3 bytes and write the txIndex 282 if e.TxIndex > ((1 << 24) - 1) { 283 return errors.New("tx index should fit in 3 bytes") 284 } 285 286 var txIndex [4]byte 287 binary.BigEndian.PutUint32(txIndex[:], e.TxIndex) 288 if _, err := w.Write(txIndex[1:]); err != nil { 289 return err 290 } 291 292 // Write the txPosition 293 var txPosition [2]byte 294 binary.BigEndian.PutUint16(txPosition[:], e.TxPosition) 295 if _, err := w.Write(txPosition[:]); err != nil { 296 return err 297 } 298 299 case *net.TCPAddr: 300 if e == nil { 301 return fmt.Errorf("cannot write nil TCPAddr") 302 } 303 304 if e.IP.To4() != nil { 305 var descriptor [1]byte 306 descriptor[0] = uint8(tcp4Addr) 307 if _, err := w.Write(descriptor[:]); err != nil { 308 return err 309 } 310 311 var ip [4]byte 312 copy(ip[:], e.IP.To4()) 313 if _, err := w.Write(ip[:]); err != nil { 314 return err 315 } 316 } else { 317 var descriptor [1]byte 318 descriptor[0] = uint8(tcp6Addr) 319 if _, err := w.Write(descriptor[:]); err != nil { 320 return err 321 } 322 var ip [16]byte 323 copy(ip[:], e.IP.To16()) 324 if _, err := w.Write(ip[:]); err != nil { 325 return err 326 } 327 } 328 var port [2]byte 329 binary.BigEndian.PutUint16(port[:], uint16(e.Port)) 330 if _, err := w.Write(port[:]); err != nil { 331 return err 332 } 333 334 case *tor.OnionAddr: 335 if e == nil { 336 return errors.New("cannot write nil onion address") 337 } 338 339 var suffixIndex int 340 switch len(e.OnionService) { 341 case tor.V2Len: 342 descriptor := []byte{byte(v2OnionAddr)} 343 if _, err := w.Write(descriptor); err != nil { 344 return err 345 } 346 suffixIndex = tor.V2Len - tor.OnionSuffixLen 347 case tor.V3Len: 348 descriptor := []byte{byte(v3OnionAddr)} 349 if _, err := w.Write(descriptor); err != nil { 350 return err 351 } 352 suffixIndex = tor.V3Len - tor.OnionSuffixLen 353 default: 354 return errors.New("unknown onion service length") 355 } 356 357 host, err := tor.Base32Encoding.DecodeString( 358 e.OnionService[:suffixIndex], 359 ) 360 if err != nil { 361 return err 362 } 363 if _, err := w.Write(host); err != nil { 364 return err 365 } 366 367 var port [2]byte 368 binary.BigEndian.PutUint16(port[:], uint16(e.Port)) 369 if _, err := w.Write(port[:]); err != nil { 370 return err 371 } 372 373 case []net.Addr: 374 // First, we'll encode all the addresses into an intermediate 375 // buffer. We need to do this in order to compute the total 376 // length of the addresses. 377 var addrBuf bytes.Buffer 378 for _, address := range e { 379 if err := WriteElement(&addrBuf, address); err != nil { 380 return err 381 } 382 } 383 384 // With the addresses fully encoded, we can now write out the 385 // number of bytes needed to encode them. 386 addrLen := addrBuf.Len() 387 if err := WriteElement(w, uint16(addrLen)); err != nil { 388 return err 389 } 390 391 // Finally, we'll write out the raw addresses themselves, but 392 // only if we have any bytes to write. 393 if addrLen > 0 { 394 if _, err := w.Write(addrBuf.Bytes()); err != nil { 395 return err 396 } 397 } 398 case color.RGBA: 399 if err := WriteElements(w, e.R, e.G, e.B); err != nil { 400 return err 401 } 402 403 case DeliveryAddress: 404 var length [2]byte 405 binary.BigEndian.PutUint16(length[:], uint16(len(e))) 406 if _, err := w.Write(length[:]); err != nil { 407 return err 408 } 409 if _, err := w.Write(e[:]); err != nil { 410 return err 411 } 412 413 case bool: 414 var b [1]byte 415 if e { 416 b[0] = 1 417 } 418 if _, err := w.Write(b[:]); err != nil { 419 return err 420 } 421 default: 422 return fmt.Errorf("unknown type in WriteElement: %T", e) 423 } 424 425 return nil 426 } 427 428 // WriteElements is writes each element in the elements slice to the passed 429 // io.Writer using WriteElement. 430 func WriteElements(w io.Writer, elements ...interface{}) error { 431 for _, element := range elements { 432 err := WriteElement(w, element) 433 if err != nil { 434 return err 435 } 436 } 437 return nil 438 } 439 440 // ReadElement is a one-stop utility function to deserialize any datastructure 441 // encoded using the serialization format of lnwire. 442 func ReadElement(r io.Reader, element interface{}) error { 443 var err error 444 switch e := element.(type) { 445 case *bool: 446 var b [1]byte 447 if _, err := io.ReadFull(r, b[:]); err != nil { 448 return err 449 } 450 451 if b[0] == 1 { 452 *e = true 453 } 454 455 case *NodeAlias: 456 var a [32]byte 457 if _, err := io.ReadFull(r, a[:]); err != nil { 458 return err 459 } 460 461 alias, err := NewNodeAlias(string(a[:])) 462 if err != nil { 463 return err 464 } 465 466 *e = alias 467 case *ShortChanIDEncoding: 468 var b [1]uint8 469 if _, err := r.Read(b[:]); err != nil { 470 return err 471 } 472 *e = ShortChanIDEncoding(b[0]) 473 case *uint8: 474 var b [1]uint8 475 if _, err := r.Read(b[:]); err != nil { 476 return err 477 } 478 *e = b[0] 479 case *FundingFlag: 480 var b [1]uint8 481 if _, err := r.Read(b[:]); err != nil { 482 return err 483 } 484 *e = FundingFlag(b[0]) 485 case *uint16: 486 var b [2]byte 487 if _, err := io.ReadFull(r, b[:]); err != nil { 488 return err 489 } 490 *e = binary.BigEndian.Uint16(b[:]) 491 case *ChanUpdateMsgFlags: 492 var b [1]uint8 493 if _, err := r.Read(b[:]); err != nil { 494 return err 495 } 496 *e = ChanUpdateMsgFlags(b[0]) 497 case *ChanUpdateChanFlags: 498 var b [1]uint8 499 if _, err := r.Read(b[:]); err != nil { 500 return err 501 } 502 *e = ChanUpdateChanFlags(b[0]) 503 case *uint32: 504 var b [4]byte 505 if _, err := io.ReadFull(r, b[:]); err != nil { 506 return err 507 } 508 *e = binary.BigEndian.Uint32(b[:]) 509 case *uint64: 510 var b [8]byte 511 if _, err := io.ReadFull(r, b[:]); err != nil { 512 return err 513 } 514 *e = binary.BigEndian.Uint64(b[:]) 515 case *MilliAtom: 516 var b [8]byte 517 if _, err := io.ReadFull(r, b[:]); err != nil { 518 return err 519 } 520 *e = MilliAtom(int64(binary.BigEndian.Uint64(b[:]))) 521 case *dcrutil.Amount: 522 var b [8]byte 523 if _, err := io.ReadFull(r, b[:]); err != nil { 524 return err 525 } 526 *e = dcrutil.Amount(int64(binary.BigEndian.Uint64(b[:]))) 527 case **secp256k1.PublicKey: 528 var b [secp256k1.PubKeyBytesLenCompressed]byte 529 if _, err = io.ReadFull(r, b[:]); err != nil { 530 return err 531 } 532 533 pubKey, err := secp256k1.ParsePubKey(b[:]) 534 if err != nil { 535 return err 536 } 537 *e = pubKey 538 case **RawFeatureVector: 539 f := NewRawFeatureVector() 540 err = f.Decode(r) 541 if err != nil { 542 return err 543 } 544 545 *e = f 546 547 case *[]Sig: 548 var l [2]byte 549 if _, err := io.ReadFull(r, l[:]); err != nil { 550 return err 551 } 552 numSigs := binary.BigEndian.Uint16(l[:]) 553 554 var sigs []Sig 555 if numSigs > 0 { 556 sigs = make([]Sig, numSigs) 557 for i := 0; i < int(numSigs); i++ { 558 if err := ReadElement(r, &sigs[i]); err != nil { 559 return err 560 } 561 } 562 } 563 564 *e = sigs 565 566 case *Sig: 567 if _, err := io.ReadFull(r, e[:]); err != nil { 568 return err 569 } 570 case *OpaqueReason: 571 var l [2]byte 572 if _, err := io.ReadFull(r, l[:]); err != nil { 573 return err 574 } 575 reasonLen := binary.BigEndian.Uint16(l[:]) 576 577 *e = OpaqueReason(make([]byte, reasonLen)) 578 if _, err := io.ReadFull(r, *e); err != nil { 579 return err 580 } 581 case *ErrorData: 582 var l [2]byte 583 if _, err := io.ReadFull(r, l[:]); err != nil { 584 return err 585 } 586 errorLen := binary.BigEndian.Uint16(l[:]) 587 588 *e = ErrorData(make([]byte, errorLen)) 589 if _, err := io.ReadFull(r, *e); err != nil { 590 return err 591 } 592 case *PingPayload: 593 var l [2]byte 594 if _, err := io.ReadFull(r, l[:]); err != nil { 595 return err 596 } 597 pingLen := binary.BigEndian.Uint16(l[:]) 598 599 *e = PingPayload(make([]byte, pingLen)) 600 if _, err := io.ReadFull(r, *e); err != nil { 601 return err 602 } 603 case *PongPayload: 604 var l [2]byte 605 if _, err := io.ReadFull(r, l[:]); err != nil { 606 return err 607 } 608 pongLen := binary.BigEndian.Uint16(l[:]) 609 610 *e = PongPayload(make([]byte, pongLen)) 611 if _, err := io.ReadFull(r, *e); err != nil { 612 return err 613 } 614 case *[33]byte: 615 if _, err := io.ReadFull(r, e[:]); err != nil { 616 return err 617 } 618 case []byte: 619 if _, err := io.ReadFull(r, e); err != nil { 620 return err 621 } 622 case *PkScript: 623 pkScript, err := wire.ReadVarBytes(r, 0, 34, "pkscript") 624 if err != nil { 625 return err 626 } 627 *e = pkScript 628 case *wire.OutPoint: 629 var h [32]byte 630 if _, err = io.ReadFull(r, h[:]); err != nil { 631 return err 632 } 633 hash, err := chainhash.NewHash(h[:]) 634 if err != nil { 635 return err 636 } 637 638 var idxBytes [2]byte 639 _, err = io.ReadFull(r, idxBytes[:]) 640 if err != nil { 641 return err 642 } 643 index := binary.BigEndian.Uint16(idxBytes[:]) 644 645 *e = wire.OutPoint{ 646 Hash: *hash, 647 Index: uint32(index), 648 } 649 case *FailCode: 650 if err := ReadElement(r, (*uint16)(e)); err != nil { 651 return err 652 } 653 case *ChannelID: 654 if _, err := io.ReadFull(r, e[:]); err != nil { 655 return err 656 } 657 658 case *ShortChannelID: 659 var blockHeight [4]byte 660 if _, err = io.ReadFull(r, blockHeight[1:]); err != nil { 661 return err 662 } 663 664 var txIndex [4]byte 665 if _, err = io.ReadFull(r, txIndex[1:]); err != nil { 666 return err 667 } 668 669 var txPosition [2]byte 670 if _, err = io.ReadFull(r, txPosition[:]); err != nil { 671 return err 672 } 673 674 *e = ShortChannelID{ 675 BlockHeight: binary.BigEndian.Uint32(blockHeight[:]), 676 TxIndex: binary.BigEndian.Uint32(txIndex[:]), 677 TxPosition: binary.BigEndian.Uint16(txPosition[:]), 678 } 679 680 case *[]net.Addr: 681 // First, we'll read the number of total bytes that have been 682 // used to encode the set of addresses. 683 var numAddrsBytes [2]byte 684 if _, err = io.ReadFull(r, numAddrsBytes[:]); err != nil { 685 return err 686 } 687 addrsLen := binary.BigEndian.Uint16(numAddrsBytes[:]) 688 689 // With the number of addresses, read, we'll now pull in the 690 // buffer of the encoded addresses into memory. 691 addrs := make([]byte, addrsLen) 692 if _, err := io.ReadFull(r, addrs); err != nil { 693 return err 694 } 695 addrBuf := bytes.NewReader(addrs) 696 697 // Finally, we'll parse the remaining address payload in 698 // series, using the first byte to denote how to decode the 699 // address itself. 700 var ( 701 addresses []net.Addr 702 addrBytesRead uint16 703 ) 704 705 for addrBytesRead < addrsLen { 706 var descriptor [1]byte 707 if _, err = io.ReadFull(addrBuf, descriptor[:]); err != nil { 708 return err 709 } 710 711 addrBytesRead++ 712 713 var address net.Addr 714 switch aType := addressType(descriptor[0]); aType { 715 case noAddr: 716 addrBytesRead += aType.AddrLen() 717 continue 718 719 case tcp4Addr: 720 var ip [4]byte 721 if _, err := io.ReadFull(addrBuf, ip[:]); err != nil { 722 return err 723 } 724 725 var port [2]byte 726 if _, err := io.ReadFull(addrBuf, port[:]); err != nil { 727 return err 728 } 729 730 address = &net.TCPAddr{ 731 IP: net.IP(ip[:]), 732 Port: int(binary.BigEndian.Uint16(port[:])), 733 } 734 addrBytesRead += aType.AddrLen() 735 736 case tcp6Addr: 737 var ip [16]byte 738 if _, err := io.ReadFull(addrBuf, ip[:]); err != nil { 739 return err 740 } 741 742 var port [2]byte 743 if _, err := io.ReadFull(addrBuf, port[:]); err != nil { 744 return err 745 } 746 747 address = &net.TCPAddr{ 748 IP: net.IP(ip[:]), 749 Port: int(binary.BigEndian.Uint16(port[:])), 750 } 751 addrBytesRead += aType.AddrLen() 752 753 case v2OnionAddr: 754 var h [tor.V2DecodedLen]byte 755 if _, err := io.ReadFull(addrBuf, h[:]); err != nil { 756 return err 757 } 758 759 var p [2]byte 760 if _, err := io.ReadFull(addrBuf, p[:]); err != nil { 761 return err 762 } 763 764 onionService := tor.Base32Encoding.EncodeToString(h[:]) 765 onionService += tor.OnionSuffix 766 port := int(binary.BigEndian.Uint16(p[:])) 767 768 address = &tor.OnionAddr{ 769 OnionService: onionService, 770 Port: port, 771 } 772 addrBytesRead += aType.AddrLen() 773 774 case v3OnionAddr: 775 var h [tor.V3DecodedLen]byte 776 if _, err := io.ReadFull(addrBuf, h[:]); err != nil { 777 return err 778 } 779 780 var p [2]byte 781 if _, err := io.ReadFull(addrBuf, p[:]); err != nil { 782 return err 783 } 784 785 onionService := tor.Base32Encoding.EncodeToString(h[:]) 786 onionService += tor.OnionSuffix 787 port := int(binary.BigEndian.Uint16(p[:])) 788 789 address = &tor.OnionAddr{ 790 OnionService: onionService, 791 Port: port, 792 } 793 addrBytesRead += aType.AddrLen() 794 795 default: 796 return &ErrUnknownAddrType{aType} 797 } 798 799 addresses = append(addresses, address) 800 } 801 802 *e = addresses 803 case *color.RGBA: 804 err := ReadElements(r, 805 &e.R, 806 &e.G, 807 &e.B, 808 ) 809 if err != nil { 810 return err 811 } 812 case *DeliveryAddress: 813 var addrLen [2]byte 814 if _, err = io.ReadFull(r, addrLen[:]); err != nil { 815 return err 816 } 817 length := binary.BigEndian.Uint16(addrLen[:]) 818 819 var addrBytes [deliveryAddressMaxSize]byte 820 if length > deliveryAddressMaxSize { 821 return fmt.Errorf("cannot read %d bytes into addrBytes", length) 822 } 823 if _, err = io.ReadFull(r, addrBytes[:length]); err != nil { 824 return err 825 } 826 *e = addrBytes[:length] 827 default: 828 return fmt.Errorf("unknown type in ReadElement: %T", e) 829 } 830 831 return nil 832 } 833 834 // ReadElements deserializes a variable number of elements into the passed 835 // io.Reader, with each element being deserialized according to the ReadElement 836 // function. 837 func ReadElements(r io.Reader, elements ...interface{}) error { 838 for _, element := range elements { 839 err := ReadElement(r, element) 840 if err != nil { 841 return err 842 } 843 } 844 return nil 845 }