You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.5 KiB
48 lines
1.5 KiB
package lnwire |
|
|
|
import ( |
|
"fmt" |
|
) |
|
|
|
// ShortChannelID represents the set of data which is needed to retrieve all |
|
// necessary data to validate the channel existence. |
|
type ShortChannelID struct { |
|
// BlockHeight is the height of the block where funding transaction |
|
// located. |
|
// |
|
// NOTE: This field is limited to 3 bytes. |
|
BlockHeight uint32 |
|
|
|
// TxIndex is a position of funding transaction within a block. |
|
// |
|
// NOTE: This field is limited to 3 bytes. |
|
TxIndex uint32 |
|
|
|
// TxPosition indicating transaction output which pays to the channel. |
|
TxPosition uint16 |
|
} |
|
|
|
// NewShortChanIDFromInt returns a new ShortChannelID which is the decoded |
|
// version of the compact channel ID encoded within the uint64. The format of |
|
// the compact channel ID is as follows: 3 bytes for the block height, 3 bytes |
|
// for the transaction index, and 2 bytes for the output index. |
|
func NewShortChanIDFromInt(chanID uint64) ShortChannelID { |
|
return ShortChannelID{ |
|
BlockHeight: uint32(chanID >> 40), |
|
TxIndex: uint32(chanID>>16) & 0xFFFFFF, |
|
TxPosition: uint16(chanID), |
|
} |
|
} |
|
|
|
// ToUint64 converts the ShortChannelID into a compact format encoded within a |
|
// uint64 (8 bytes). |
|
func (c ShortChannelID) ToUint64() uint64 { |
|
// TODO(roasbeef): explicit error on overflow? |
|
return ((uint64(c.BlockHeight) << 40) | (uint64(c.TxIndex) << 16) | |
|
(uint64(c.TxPosition))) |
|
} |
|
|
|
// String generates a human-readable representation of the channel ID. |
|
func (c ShortChannelID) String() string { |
|
return fmt.Sprintf("%d:%d:%d", c.BlockHeight, c.TxIndex, c.TxPosition) |
|
}
|
|
|