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 }