Глоссарий / Lightning и layer 2
Транзакция обязательства
- Что такое транзакция обязательства?
- Транзакция обязательства представляет собой подписанную, но не отправленную в сеть транзакцию биткоина, которую хранит каждая сторона канала Lightning и которая расходует выход финансирования в соответствии с текущим распределением баланса.
Каждый платеж в Lightning заменяет транзакции обязательства обеих сторон новой парой, а старая пара отзывается, а не удаляется. BOLT 3 фиксирует ожидаемый вес обязательства канала с анкорами в 1124 единицы веса плюс 172 на каждый платеж, который еще в пути. Держать такую транзакцию означает держать выход, который вы можете забрать сами, по комиссии, которую ваш пир согласовал неделями раньше.
Как это работает
У транзакции обязательства ровно один вход, выход финансирования канала 2-из-2, а ее выходы представляют собой текущее распределение этих денег.
В любой момент существуют две такие транзакции, по одной у каждого пира, и они намеренно не одинаковы. Каждая копия задерживает выплату своему держателю за блокировкой OP_CHECKSEQUENCEVERIFY на to_self_delay блоков, пока другой стороне платит раньше, поэтому ждет тот, кто ее транслирует. При option_anchors даже другая сторона не получает выплату мгновенно: выход to_remote несет блокировку CSV на один блок, добавленную, чтобы ни один пир не мог заблокировать обязательство, прицепив к нему дешевые дочерние транзакции.
Транзакция скрывает свой собственный счетчик. BOLT 3 задает полю версии значение 2, берет номер обязательства из 48 бит, применяет к нему XOR с младшими 48 битами SHA256 от двух значений payment_basepoint из open_channel и accept_channel, а затем делит результат между двумя полями: старшие 24 бита идут в sequence входа за байтом 0x80, младшие 24 в locktime за 0x20. Оба пира пересчитывают его за мгновение. Любой другой наблюдатель цепи видит два произвольно выглядящих числа и не может посчитать, сколько платежей прошло через канал.
Выход оплачивает тот, кто финансировал канал. Прежде чем разместить какой-либо выход, базовая комиссия вычитается из той стороны, которая финансировала канал, а при option_anchors из этой же стороны выходят два фиксированных анкорных выхода по 330 сатоши каждый. Затем выходы сортируются по стоимости от меньшей к большей, потом по scriptPubKey с побайтовым сравнением, потом по cltv_expiry для выходов HTLC, чтобы оба пира получили побайтово идентичную транзакцию, ни разу не отправив ее друг другу.
Все, что слишком мало, чтобы его стоило записывать, не записывается. BOLT 3 называет такие выходы обрезанными (trimmed outputs): HTLC, сумма которого за вычетом комиссии, которую стоила бы его собственная транзакция второй ступени, оказывается ниже dust_limit_satoshis владельца, не получает выхода вовсе, и деньги становятся комиссией майнера, а не чьим-либо балансом. Пороги, которые перечисляет BOLT 3, заданы в Bitcoin Core: 330 сатоши для pay to witness script hash, 294 для pay to witness pubkey hash, 240 для pay to anchor. Это нижняя граница, а не сама настройка, и BOLT 3 предписывает каналам с анкорами держаться выше нее, потому что в таких каналах транзакция второй ступени не платит комиссию и потому вовсе перестает влиять на обрезание.
Новейшая форма транзакции отказывается от встроенной комиссии. Там, где применяется zero_fee_commitments, поле версии становится 3, feerate_per_kw фиксируется на 0, и один общий выход shared_anchor со скриптом pay to anchor OP_1 <0x4e73> добавляется на этом пределе в 240 сатоши. Потратить его может кто угодно, поэтому обязательство попадает в блок способом child pays for parent по той цене, которую рынок комиссий дает в этот день, а не по той, которая была при подписании пары.
Почему это важно при покупке биткоина
В транзакции обязательства баланс Lightning перестает быть числом на экране и становится сатоши минус комиссии, и два ее правила стоят реальных денег.
Первое правило касается обрезания. Малые суммы внутри канала не округляются, а удаляются, и собственный разобранный пример в спецификации отдает майнеру 1800 сатоши платежей в пути, потому что каждый из них оказался ниже предела пыли плюс стоимость его второй ступени. Это задает нижнюю границу того, что вообще стоит переводить в Lightning. Phoenix, кошелек ACINQ из наших обзоров, берет 1000 сатоши за создание канала и указывает, что восстановление после принудительного закрытия занимает примерно 720 блоков, около пяти дней. Канал, пополненный несколькими тысячами сатоши, представляет собой расчет, который никогда не сходится.
Второе в том, что комиссия внутри транзакции обязательства была выбрана при ее подписании. Баланс финансирующей стороны был уменьшен по feerate_per_kw того дня, и если мемпул с тех пор сдвинулся, транзакция в вашем кошельке может не подтвердиться по той цене, которая в ней заложена. Анкоры существуют именно из-за этого, а zero_fee_commitments существует, чтобы вместо этого перенести решение на момент трансляции.
Ни одно из этих правил вас не касается, если канал держит кто-то другой. Strike, с оценкой 4,6 в наших обзорах бирж, работает нативно в Lightning и является кастодиальным, пока ваш баланс находится в приложении, а Coinbase оценивает свои выводы через Lightning ниже ончейн-отправки для малых сумм и выше для крупных. То, чем вы расплачиваетесь, задокументировано в обзорах кошельков: Wallet of Satoshi, с оценкой 2,7 и пометкой «осторожно», перестал обслуживать клиентов США 23 ноября 2023 года, а позже свернул свой кастодиальный сервис Lightning по всему Европейскому союзу по мере истечения переходных периодов MiCA. Никакой вашей транзакции обязательства, к которой можно было бы обратиться, не существовало.
Разбор примера комиссии из BOLT 3
BOLT 3 публикует один разобранный расчет комиссии, и если пройти его от начала до конца, видно, куда на самом деле уходят деньги канала.
Исходные данные: feerate_per_kw равен 5000, dust_limit_satoshis равен 546, и четыре платежа в пути: предложенные HTLC на 5000 и 1000 сатоши, полученные HTLC на 7000 и 800 сатоши. При такой ставке комиссии транзакция HTLC timeout стоит 3315 сатоши, а транзакция HTLC success стоит 3515.
Вес начинается с 724, величины для канала без option_anchors, каковую форму и предполагает весь этот пример. Предложенный HTLC на 5000 сатоши проходит порог 546 плюс 3315, поэтому получает выход, и вес возрастает до 896. Предложенный HTLC на 1000 сатоши порог не проходит и обрезается. Полученный HTLC на 7000 сатоши проходит порог 546 плюс 3515, поэтому получает выход, и вес возрастает до 1068. Полученный HTLC на 800 сатоши обрезается.
Базовая комиссия получается умножением 5000 на 1068 и делением на 1000, то есть 5340 сатоши, и вычитается она только из выхода финансирующей стороны. Комиссия, которую фактически получает майнер, составляет 7140 сатоши, потому что сверху добавляются два обрезанных HTLC. Из 13 800 сатоши в пути 1800 перестают существовать как чей-либо баланс, и итог может вырасти еще больше, если собственный выход финансирующей стороны опустится ниже предела пыли после вычета комиссии.
Транзакция обязательства vs транзакция штрафа
Транзакция обязательства выплачивает распределение, которое подписали оба пира; транзакция штрафа забирает весь канал у пира, опубликовавшего распределение, которое он уже отозвал.
Эти две транзакции тратят разное. Транзакция обязательства тратит выход финансирования. Транзакция штрафа тратит выходы транзакции обязательства, которая оказалась устаревшей, используя ключ отзыва, переданный ее держателем, когда это состояние было заменено. Скрипт to_local записывает оба будущих исхода в один выход: одна ветка требует отложенного ключа после to_self_delay блоков, другая требует подписи отзыва и работает вовсе без задержки.
Транзакция обязательства vs принудительное закрытие
Транзакция обязательства является объектом, который вы держите; принудительное закрытие является событием, когда кто-то транслирует такую транзакцию.
Различие важно, потому что действовать можете не вы. Если ваш пир принудительно закрывает канал на текущем состоянии, его копия выплачивает вашей стороне без каких-либо действий с вашей стороны, с единственным условием: блокировка CSV на один блок, которую каналы с анкорами ставят на выход to_remote. Ваша собственная копия является запасным вариантом на случай пира, который замолчал, и именно эта копия заставляет вас выжидать всю задержку. Держать транзакцию обязательства нормально, непрерывно и бесплатно; трансляция транзакции является событием, которого вы предпочли бы избежать.