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  }