Wie konvertiere ich die Kanal-ID von c-lightning in lnd?

Entschuldigen Sie die dumme Frage, aber ich bin nicht sehr gut im Lightning-Netzwerk ... Also habe ich zwei Daemons: c-lightningund LND.

Kanäle aus dem c-lightningkommt so 505580:1917:1; Kanäle aus dem LNDkommt so 556369376388317185;

Ist es möglich, sie auf ein einziges Format zu bringen? Zum Beispiel c-lightningin eine einfache Ganzzahl konvertieren, LNDum dieselben Kanäle von beiden Daemons zu finden?

Bei der Spezifikationssitzung im November wurde vereinbart, das Format der kurzen Kanal-ID in das Protokoll aufzunehmen. In zukünftigen Implementierungen sollte das Clightning-Format mit xals Trennzeichen verwendet werden, :während der Doppelpunkt gut lesbar war, sind die kurzen Kanal-IDs, die x als Trennzeichen verwenden, doppelklickbar.

Antworten (2)

Die Spezifikation des short_channel_idbeschreibt das Format wie folgt:

Dies short_channel_idist die eindeutige Beschreibung der Finanzierungstransaktion. Es ist wie folgt aufgebaut:

  1. die höchstwertigen 3 Bytes: geben die Blockhöhe an
  2. die nächsten 3 Bytes: geben den Transaktionsindex innerhalb des Blocks an
  3. die niederwertigsten 2 Bytes: geben den Ausgangsindex an, der an den Kanal gezahlt wird.

Um zwischen den beiden Formaten zu konvertieren, können Sie daher die folgenden Python-Snippets verwenden:

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]

Der Grund, warum wir (c-lightning) das gepunktete Format verwenden, ist, dass es uns ermöglicht, die Finanzierungs-TX nachzuschlagen, ohne eine Konvertierung durchführen zu müssen (und es ist normalerweise kürzer als die u64Darstellung) .

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)))
}