Lightning-Network
如何將頻道 ID 從 c-lightning 轉換為 lnd?
抱歉這個愚蠢的問題,但我在閃電網路中不是很好……所以我有兩個守護程序:
c-lightning
和LND
.來自的頻道
c-lightning
是這樣的505580:1917:1
;來自的頻道LND
是這樣的556369376388317185
;是否可以將它們轉換為單一格式?例如
c-lightning
轉換為簡單的整數LND
,以便從兩個守護程序中找到相同的通道?
的規範描述
short_channel_id
格式如下:這
short_channel_id
是資金交易的唯一描述。它的構造如下:
- 最高3個字節:表示塊高度
- 接下來的3個字節:表示塊內的交易索引
- 最低有效 2 個字節:表示支付給通道的輸出索引。
因此,要在兩種格式之間進行轉換,您可以使用以下 python 片段:
def lnd_to_cl_scid(s): block = s >> 40 tx = s >> 16 & 0xFFFFFF output = s & 0xFFFF return (block, tx, output) def cl_to_lnd_scid(s): s = [int(i) for i in s.split(':')] return (s[0] << 40) | (s[1] << 16) | s[2]
我們(c-lightning)使用點格式的原因是因為它允許我們查找資金 TX 而無需進行轉換(它通常比
u64
表示短)
<https://github.com/lightningnetwork/lnd/blob/8379bbaa9b259544c2c8591782a78d7384680b2a/lnwire/short_channel_id.go#L25-L43>
// 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))) }