Glosario / Lightning y capa 2
ID corto de canal
También se conoce como scid.
- ¿Qué es un ID corto de canal?
- Un ID corto de canal es el puntero de 8 bytes que Lightning usa para nombrar un canal y que empaqueta la altura de bloque de la transacción de financiación, su índice dentro de ese bloque y su índice de salida.
Lightning nombra un canal público por el lugar que ocupa su salida de financiación en la blockchain, no con una etiqueta arbitraria. Tres bytes llevan la altura de bloque, tres el índice de transacción y dos el índice de salida: 64 bits en total, escritos para las personas como 539268x845x1. Esa coordenada es lo que le permite verificar contra la cadena un canal a través del cual enruta su billetera, sin confiar en el panel de nadie.
Cómo funciona
Los tres componentes de un ID corto de canal se concatenan de más a menos significativo: la altura de bloque de la transacción de financiación, el índice de esa transacción dentro del bloque y el índice de la salida que paga al canal. Los anchos fijos limitan la altura y el índice de transacción a 16.777.215, y el índice de salida a 65.535.
Escritos para una persona, los números se imprimen en decimal y se unen con una letra x minúscula, de modo que un canal en la salida 1 de la transacción con índice 845 del bloque de altura 539.268 es 539268x845x1. Las razones de la especificación: en la mayoría de las fuentes una x minúscula es visiblemente más pequeña que un dígito, así que la vista separa las partes, y un doble clic selecciona el identificador completo.
Empaquetado, es un simple número de 64 bits, y el vector de prueba de BOLT 11 lo demuestra: el route hint (pista de ruta) 66051x263430x1800 es la secuencia de bytes 01 02 03 04 05 06 07 08 en orden, porque 66051 es 0x010203, 263430 es 0x040506 y 1800 es 0x0708.
Como es una posición y no un hash, un ID corto de canal deja de ser correcto si cambia el bloque que nombra. Por eso un canal no se anuncia hasta que su transacción de financiación tiene al menos 6 confirmaciones, y por eso un nodo debería ignorar un anuncio cuya salida tenga menos. El splicing también mueve el identificador: tras un splice, el canal se anuncia de nuevo bajo el ID corto de canal de la transacción de splice, mientras los nodos siguen reenviando los pagos que todavía usan el anterior.
Un canal que nadie anunció no tiene identificador público, así que los pares se intercambian un alias en su lugar; una actualización que lleve uno debe activar su indicador dont_forward y no debe propagarse nunca, por privacidad.
Dónde aparece
Los ID cortos de canal son la capa de direccionamiento del gossip de Lightning, y aparecen en cada mensaje sobre un canal concreto.
El mensaje de tipo 259, announcement_signatures, lleva uno cuando dos pares acuerdan publicar su canal. El de tipo 256, channel_announcement, lleva el que todos los demás nodos usan para encontrar la salida de financiación on-chain. El de tipo 258, channel_update, lo repite en cada cambio de comisión o de expiración, una vez por sentido. El de tipo 261, query_short_channel_ids, pide a un par los anuncios que hay detrás de una lista de ellos, enviada como una secuencia ascendente con el byte de codificación 0; el byte de codificación 1 significaba antes compresión zlib y ahora está prohibido por completo. Un nodo puede podar cualquier canal cuya actualización más reciente en cualquiera de los dos sentidos tenga más de dos semanas de antigüedad, 1.209.600 segundos.
El único lugar en el que un usuario corriente se encuentra con uno es una solicitud de pago: el campo r de una factura BOLT 11 lleva route hints, y cada salto es una clave pública de nodo, un ID corto de canal de 64 bits, dos cifras de comisión y una delta de expiración. El ejemplo práctico de la especificación apunta a 589390x3312x1.
ID corto de canal frente a outpoint
Un ID corto de canal y un outpoint nombran ambos una salida de transacción, y lo hacen desde extremos opuestos. Un outpoint ocupa 36 bytes, un ID de transacción de 32 bytes seguido de un índice de 4 bytes, y nombra la salida por la transacción que la creó; un ID corto de canal ocupa 8 bytes y nombra la misma salida por el lugar en el que acabó.
La contrapartida es el tamaño frente a la estabilidad. Un outpoint es válido desde el momento en que existe una transacción, incluso sin confirmar, y nunca cambia. Un ID corto de canal no existe hasta que la transacción está en un bloque, y una reorganización de la cadena que la vuelva a minar a otra altura o en otra posición produce un identificador distinto para el mismo canal. Lightning lo acepta porque la coordenada sirve a la vez de instrucción para encontrar la salida, y propagar por gossip 8 bytes por canal sale mucho más barato que 36.