Глоссарий / Lightning и layer 2
Дельта истечения CLTV
- Что такое дельта истечения CLTV?
- Дельта истечения CLTV представляет собой число блоков, которое узел Lightning вычитает из временной блокировки входящего платежа, прежде чем передать его дальше; она публикуется в gossip для каждого направления канала.
Каждый узел, выполняющий пересылку на маршруте Lightning, взимает две платы, комиссию в миллисатоши и задержку в блоках, и дельта истечения CLTV является этой задержкой. BOLT 7 передает ее как 16-битное поле в сообщении channel_update рядом с fee_base_msat, и каждая сторона канала публикует свое значение независимо. Если платеж застревает, эта сумма блоков показывает, как долго ваши средства остаются замороженными.
Как это работает
Дельту истечения CLTV выбирает узел, который будет выполнять пересылку, и она управляет только его исходящим направлением.
Формулировка спецификации точна: узел обязан задать полю число блоков, которое он вычтет из cltv_expiry входящего HTLC. Таким образом, дельта представляет собой не крайний срок, а разрыв. Узел принимает платеж, заблокированный до некоторой абсолютной высоты блока, оставляет дельту себе и предлагает следующему переходу платеж, заблокированный до этой высоты минус дельта. Этот разрыв является запасом безопасности узла: если следующий переход рассчитывается в последний возможный момент, у узла остается столько блоков, чтобы получить платеж выше по маршруту.
Каждый публичный канал несет два таких числа, по одному на направление, каждое подписано узлом, который его установил. Они передаются в channel_update, типе сообщения 258, рядом с htlc_minimum_msat и двумя полями комиссии. Значение имеют только обновления, объявленные узлами, которые будут пересылать: на маршруте A к B к C к D плательщик использует обновление B для перехода от B к C и обновление C для перехода от C к D, и ни одного из собственных.
Поэтому маршруты строятся в обратном порядке. Плательщик начинает в пункте назначения с минимального конечного срока истечения, который требует invoice, движется назад, прибавляя объявленную дельту каждого перехода, и накопленный итог становится временной блокировкой HTLC, который он передает своему первому контрагенту. Когда узел пересматривает свои цены, BOLT 7 просит его продолжать принимать прежние параметры в течение 10 минут, потому что gossip доходит не до всех плательщиков одновременно.
Где это проявляется
Дельты истечения CLTV определяют, как долго застрявший платеж Lightning связывает ваш баланс, и собственный пример маршрутизации из BOLT 7 приводит цифры для двух в остальном одинаковых маршрутов.
Четыре узла образуют ромб: A, B, C и D, объявляющие 10, 20, 30 и 40 блоков, при этом C требует конечную дельту истечения 18, которую спецификация называет значением по умолчанию. A отправляет 4 999 999 миллисатоши узлу C. При маршрутизации через B узел A передает своему контрагенту 5 010 198 миллисатоши, из которых 10 199 составляет комиссия B, и первый HTLC истекает на текущей высоте блока плюс 80: 20 блоков для перехода через B, 18 для C и еще 42 в качестве запаса. При маршрутизации через D тот же платеж стоит 5 020 398 миллисатоши и истекает на текущей высоте плюс 100. Тот же отправитель, тот же получатель, та же сумма, и на 20 блоков больше риска.
Эти 42 не являются произвольным запасом. BOLT 7 предупреждает, что маршрут, построенный честным суммированием дельт, позволяет промежуточному узлу определить свое положение и отсюда угадать, кому платят, поэтому плательщику советуют добавить случайное смещение, найденное обходом графа наружу от получателя с суммированием встречающихся дельт. Спецификация называет результат расширением теневого маршрута (shadow route extension).
Ничто из этого не задается вами, если только вы не управляете пересылающим узлом. Phoenix, который в нашем обзоре назван настоящим самостоятельным узлом Lightning на смартфоне, публикует свою цену отправки как 0,4 % плюс 4 sat, и эта таблица оценивает деньги, а не блоки.
Дельта истечения CLTV vs OP_CHECKLOCKTIMEVERIFY
Дельта истечения CLTV представляет собой показатель политики маршрутизации, публикуемый в gossip, тогда как OP_CHECKLOCKTIMEVERIFY является опкодом скрипта биткоина, который обеспечивает абсолютный срок ончейн.
Их объединяют три буквы и мало что еще. Дельта относительна и существует полностью вне блокчейна: она не появляется ни в одном скрипте, ни один полный узел ее не проверяет, и установивший ее узел пересматривает ее новым channel_update. OP_CHECKLOCKTIMEVERIFY записывается в монету, проверяется каждым полным узлом и не может быть изменен после того, как монета создана.