Глоссарий / Lightning и layer 2
Короткий идентификатор канала
Другие названия: scid.
- Что такое короткий идентификатор канала?
- Короткий идентификатор канала представляет собой указатель размером 8 байт, которым Lightning называет канал: в нем упакованы высота блока транзакции финансирования, ее индекс в этом блоке и индекс выхода.
Lightning называет публичный канал по тому, где находится его выход финансирования в блокчейне, а не по произвольной метке. Три байта несут высоту блока, три несут индекс транзакции и два несут индекс выхода, что в сумме составляет 64 бита и записывается для людей как 539268x845x1. Именно эта координата позволяет проверить по цепи канал, через который маршрутизирует платежи ваш кошелек, не доверяя ничьей панели управления.
Как это работает
Три компонента короткого идентификатора канала объединяются от старшего к младшему: высота блока транзакции финансирования, индекс этой транзакции внутри блока и индекс выхода, который оплачивает канал. Фиксированная ширина ограничивает высоту и индекс транзакции значением 16 777 215, а индекс выхода значением 65 535.
При записи для человека числа печатаются в десятичном виде и соединяются строчной буквой x, поэтому канал на выходе 1 транзакции с индексом 845 в блоке на высоте 539 268 записывается как 539268x845x1. Причины, названные в спецификации: строчная x в большинстве шрифтов заметно меньше цифры, поэтому глаз отделяет части друг от друга, а двойной щелчок выделяет весь идентификатор целиком.
В упакованном виде это обычное число из 64 бит, и тестовый вектор BOLT 11 это показывает: подсказка маршрута 66051x263430x1800 представляет собой последовательность байтов 01 02 03 04 05 06 07 08 по порядку, потому что 66051 равно 0x010203, 263430 равно 0x040506, а 1800 равно 0x0708.
Будучи позицией, а не хешем, короткий идентификатор канала перестает быть верным, если блок, который он называет, меняется. Поэтому канал не объявляется, пока его транзакция финансирования не получит не менее 6 подтверждений, и поэтому узел должен игнорировать объявление, у которого выход имеет меньше подтверждений. Сплайсинг тоже сдвигает идентификатор: канал после сплайса объявляется заново под коротким идентификатором канала транзакции сплайса, а узлы продолжают передавать платежи, которые все еще используют прежний идентификатор.
У канала, который никто не объявил, нет публичного идентификатора, поэтому стороны обмениваются вместо него псевдонимом (alias); обновление, несущее его, должно выставлять флаг dont_forward и никогда не должно передаваться дальше, в целях приватности.
Где это встречается
Короткие идентификаторы каналов образуют слой адресации в gossip-протоколе Lightning, и они встречаются в каждом сообщении о конкретном канале.
Сообщение типа 259, announcement_signatures, несет такой идентификатор, когда два узла договариваются опубликовать свой канал. Тип 256, channel_announcement, несет тот идентификатор, который все остальные узлы используют, чтобы найти выход финансирования в цепи. Тип 258, channel_update, повторяет его при каждом изменении комиссии или срока действия, по одному разу на каждое направление. Тип 261, query_short_channel_ids, запрашивает у узла объявления, стоящие за списком таких идентификаторов, который отправляется как возрастающий массив с байтом кодировки 0; байт кодировки 1 когда-то означал сжатие zlib и теперь запрещен полностью. Узел может удалять любой канал, последнее обновление которого в любом из двух направлений старше двух недель, то есть 1 209 600 секунд.
Обычный пользователь встречает такой идентификатор лишь в одном месте: в запросе на платеж: поле r счета BOLT 11 несет подсказки маршрута, и каждый шаг маршрута состоит из публичного ключа узла, короткого идентификатора канала из 64 бит, двух значений комиссии и дельты срока действия. Приведенный в спецификации пример указывает на 589390x3312x1.
Короткий идентификатор канала vs outpoint
Короткий идентификатор канала и outpoint оба называют один выход транзакции, но делают это с противоположных сторон. Outpoint занимает 36 байтов, а именно идентификатор транзакции из 32 байтов, за которым следует индекс из 4 байтов, и называет выход по транзакции, которая его создала; короткий идентификатор канала занимает 8 байтов и называет тот же выход по тому месту, куда он попал.
Обмен идет между размером и стабильностью. Outpoint действителен с момента, когда транзакция существует, в том числе без подтверждений, и никогда не меняется. Короткий идентификатор канала не существует, пока транзакция не попала в блок, а реорганизация, которая заново добудет ее на другой высоте или в другой позиции, даст другой идентификатор для того же канала. Lightning принимает это, потому что координата одновременно служит указанием, как найти выход, а 8 байтов, которые канал передает через gossip, обходятся гораздо дешевле, чем 36.