¿Cómo convertir la identificación del canal de c-lightning a lnd?

Perdón por la pregunta tonta, pero no soy muy bueno en Lightning Network... Así que tengo dos demonios: c-lightningy LND.

Canales de la c-lightningviene así 505580:1917:1; Canales de la LNDviene así 556369376388317185;

¿Es posible llevarlos a un solo formato? Por ejemplo , ¿ c-lightningconvertir a un número entero simple LNDpara encontrar los mismos canales de ambos demonios?

En la reunión de especificaciones de noviembre se acordó hacer que el formato del ID de canal corto formara parte del protocolo. En implementaciones futuras, se debe usar el formato clightning con xcomo separador en lugar de :, mientras que los dos puntos eran muy legibles, se puede hacer doble clic en los identificadores de canales cortos que usan x como separador.

Respuestas (2)

La especificación de short_channel_iddescribe el formato de la siguiente manera:

es la short_channel_iddescripción única de la transacción de financiación. Se construye de la siguiente manera:

  1. los 3 bytes más significativos: indicando la altura del bloque
  2. los siguientes 3 bytes: indicando el índice de transacción dentro del bloque
  3. los 2 bytes menos significativos: indica el índice de salida que paga al canal.

Por lo tanto, para convertir entre los dos formatos, puede usar los siguientes fragmentos de 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]

La razón por la que (c-lightning) usamos el formato punteado es porque nos permite buscar el TX de financiamiento sin tener que hacer una conversión (y generalmente es más corto que la u64representación)

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