Lightning-Network

如何將頻道 ID 從 c-lightning 轉換為 lnd?

  • January 25, 2022

抱歉這個愚蠢的問題,但我在閃電網路中不是很好……所以我有兩個守護程序:c-lightningLND.

來自的頻道c-lightning是這樣的505580:1917:1;來自的頻道LND是這樣的556369376388317185

是否可以將它們轉換為單一格式?例如c-lightning轉換為簡單的整數LND,以便從兩個守護程序中找到相同的通道?

規範描述short_channel_id格式如下:

short_channel_id是資金交易的唯一描述。它的構造如下:

  1. 最高3個字節:表示塊高度
  2. 接下來的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 &gt;&gt; 40),
       TxIndex:     uint32(chanID&gt;&gt;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) &lt;&lt; 40) | (uint64(c.TxIndex) &lt;&lt; 16) |
       (uint64(c.TxPosition)))
}

引用自:https://bitcoin.stackexchange.com/questions/78029