Глоссарий / Lightning и layer 2
Скрипт закрытия
- Что такое скрипт закрытия?
- Скрипт закрытия представляет собой ончейн-адрес, на который выплачивается ваш баланс Lightning при кооперативном закрытии канала; он указан в сообщении shutdown BOLT 2 как необработанный scriptpubkey.
Каждая сторона закрывающегося канала указывает собственный адрес назначения, и закрывающая транзакция выплачивает обоим именно туда. BOLT 2 присваивает этому сообщению тип 38 и принимает только скрипты версии свидетеля 0, если только стороны не согласовали биты функций 26 и 27. Тот, кто возвращает средства Lightning в холодное хранение, должен проверить этот адрес назначения до закрытия, а не после.
Как это работает
Скрипт закрытия передается внутри сообщения BOLT 2 типа 38, которое содержит идентификатор канала, двухбайтовую длину, а затем сами байты скрипта.
Любая из сторон может отправить это сообщение, и как только не остается необработанных обновлений, другая сторона должна ответить собственным shutdown. С этого момента канал завершает работу: ни один update_add_htlc не может следовать за shutdown, и узлу следует отказываться маршрутизировать любой HTLC, пришедший после него. Сообщение может быть отправлено до channel_ready, поэтому канал, чья транзакция финансирования еще подтверждается, можно бросить раньше.
Спецификация строго определяет, каким может быть скрипт. Всегда допустимы две формы: OP_0 и вставка данных из 20 байт, выход pay to witness public key hash, либо OP_0 и вставка данных из 32 байт, pay to witness script hash. Версии свидетеля с 1 по 16, за которыми следует вставка данных от 2 до 40 байт, допустимы только там, где был согласован option_shutdown_anysegwit, биты функций 26 и 27, поэтому выплата на Taproot зависит от того, поддерживает ли ее ваш контрагент. Третья форма появилась с option_simple_close, битами 60 и 61: OP_RETURN плюс вставка данных от 6 до 75 байт, либо вариант OP_PUSHDATA1 для диапазона от 76 до 80 байт, причем потолок связан с тем, что скрипт OP_RETURN является стандартным в сети биткоина только до 83 байт. Она существует для случая, когда ваша доля слишком мала, чтобы стоить отдельного выхода, и тогда сумма должна быть нулевой, поэтому она уходит майнерам как комиссия.
Узел также может заранее закрепить свой адрес назначения при открытии канала, в TLV-записи upfront_shutdown_script типа 0 сообщений open_channel и accept_channel, биты функций 4 и 5. Если обе стороны объявили о ней и был указан скрипт ненулевой длины, последующий shutdown, называющий что-либо иное, должен привести к разрыву соединения. BOLT 2 прямо говорит о том, что это дает: он называет такое предварительное обязательство "a weak commitment (a malevolent implementation tends to ignore specifications like this one!)" (слабым обязательством: злонамеренная реализация склонна игнорировать подобные спецификации!), стоящим постепенного улучшения, поскольку изменение адреса назначения впоследствии требует сотрудничества вашего контрагента.
Где это встречается
Скрипты закрытия принадлежат тому, кто владеет каналом, а это не всегда вы.
Среди 41 кошелька, обзоры которых есть на этом сайте, сравните Phoenix с оценкой 4,0, который запускает на смартфоне настоящий автономный узел Lightning, с Wallet of Satoshi с оценкой 2,7 и пометкой о повышенном внимании из-за кастодиального режима. В Phoenix каналы принадлежат вам, поэтому кооперативное закрытие помещает в сообщение shutdown адрес, который вы контролируете. В кастодиальном режиме Wallet of Satoshi, прекращенном в США и Европейском союзе, каналы принадлежат компании, скрипты называют ее адреса, а то, что вы держите, является правом требования, а не ключом.
Второе место, где это проявляется, представляет собой закрытие, которое тихо срывается. Старые узлы все еще могут отправлять скрипты закрытия, не относящиеся к segwit, и BOLT 2 отмечает, что закрывающая транзакция, чей не-segwit выход ниже 546 сатоши, что возможно, если dust_limit_satoshis был установлен ниже, вероятно, никогда не дойдет до майнеров. Средства не под угрозой, но канал приходится принудительно закрывать вместо того, чтобы урегулировать. При option_simple_close новый closing_complete отменяет предыдущий, поэтому и комиссию, и скрипт выхода можно пересмотреть, если только вариант с предварительным указанием не зафиксировал адрес назначения при открытии канала.
Скрипт закрытия vs принудительное закрытие
Скрипт закрытия определяет, куда придут деньги, только при кооперативном закрытии.
Принудительное закрытие обходит переговоры: вы публикуете последнюю транзакцию обязательства, и ее выходы выплачивают ключам, производным от базовых точек, которыми обменялись стороны при открытии канала, а не указанному вами адресу. Скрипт, который вы тщательно настроили, не влияет на единственный выход, не требующий разрешения вашего контрагента. Настройте его для закрытия, которое планируете, и храните резервную копию каналов для того, которое не планируете.