github.com/decred/dcrlnd@v0.7.6/lnwire/short_channel_id.go (about)

     1  package lnwire
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // ShortChannelID represents the set of data which is needed to retrieve all
     8  // necessary data to validate the channel existence.
     9  type ShortChannelID struct {
    10  	// BlockHeight is the height of the block where funding transaction
    11  	// located.
    12  	//
    13  	// NOTE: This field is limited to 3 bytes.
    14  	BlockHeight uint32
    15  
    16  	// TxIndex is a position of funding transaction within a block.
    17  	//
    18  	// NOTE: This field is limited to 3 bytes.
    19  	TxIndex uint32
    20  
    21  	// TxPosition indicating transaction output which pays to the channel.
    22  	TxPosition uint16
    23  }
    24  
    25  // NewShortChanIDFromInt returns a new ShortChannelID which is the decoded
    26  // version of the compact channel ID encoded within the uint64. The format of
    27  // the compact channel ID is as follows: 3 bytes for the block height, 3 bytes
    28  // for the transaction index, and 2 bytes for the output index.
    29  func NewShortChanIDFromInt(chanID uint64) ShortChannelID {
    30  	return ShortChannelID{
    31  		BlockHeight: uint32(chanID >> 40),
    32  		TxIndex:     uint32(chanID>>16) & 0xFFFFFF,
    33  		TxPosition:  uint16(chanID),
    34  	}
    35  }
    36  
    37  // ToUint64 converts the ShortChannelID into a compact format encoded within a
    38  // uint64 (8 bytes).
    39  func (c ShortChannelID) ToUint64() uint64 {
    40  	// TODO(roasbeef): explicit error on overflow?
    41  	return ((uint64(c.BlockHeight) << 40) | (uint64(c.TxIndex) << 16) |
    42  		(uint64(c.TxPosition)))
    43  }
    44  
    45  // String generates a human-readable representation of the channel ID.
    46  func (c ShortChannelID) String() string {
    47  	return fmt.Sprintf("%d:%d:%d", c.BlockHeight, c.TxIndex, c.TxPosition)
    48  }