Перейти к содержимому
buybitcoinsmart

Глоссарий / 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 принудительное закрытие

Скрипт закрытия определяет, куда придут деньги, только при кооперативном закрытии.

Принудительное закрытие обходит переговоры: вы публикуете последнюю транзакцию обязательства, и ее выходы выплачивают ключам, производным от базовых точек, которыми обменялись стороны при открытии канала, а не указанному вами адресу. Скрипт, который вы тщательно настроили, не влияет на единственный выход, не требующий разрешения вашего контрагента. Настройте его для закрытия, которое планируете, и храните резервную копию каналов для того, которое не планируете.

Не путать с

Часто задаваемые вопросы

Можно ли указать адрес Taproot в качестве скрипта закрытия?

Только если вы и ваш контрагент согласовали option_shutdown_anysegwit, биты функций 26 и 27. Без этого BOLT 2 допускает лишь две формы: вставку данных из 20 байт или из 32 байт после OP_0, которые являются двумя типами скриптов версии свидетеля 0.

Применяется ли скрипт закрытия при принудительном закрытии?

Нет. Принудительное закрытие публикует последнюю транзакцию обязательства, выходы которой выплачивают ключам, производным от базовых точек, которыми обе стороны обменялись при открытии канала, поэтому адрес, указанный вами в сообщении shutdown, не играет в нем никакой роли.

Почему закрывающая транзакция может вообще ничего не выплатить моей стороне?

Потому что option_simple_close позволяет закрывающей стороне, чей баланс слишком мал, чтобы стоить отдельного выхода, указать вместо него скрипт OP_RETURN, а спецификация требует, чтобы сумма этого выхода была нулевой, поэтому баланс уходит майнерам как комиссия.

Читайте далее

Связанные термины

Еще в разделе «Lightning и layer 2»

Читать эту страницу на английском