Глоссарий / Справочник разработчика
Скрипт свидетеля
- Что такое скрипт свидетеля?
- Скрипт свидетеля хранит реальные условия расходования выхода P2WSH и передается внутри свидетеля, где его байты учитываются по четверти обычной стоимости.
Определено в BIP-141.
SegWit выделил скриптам собственную секцию транзакции, и именно туда попадает скрипт свидетеля, когда расходуется хранилище с адресом bc1q. Каждый байт внутри свидетеля считается как одна единица веса, а не как четыре, то есть скидка 75 %, которая появилась в блоке 481 824 в августе 2017 года. Из-за этой скидки хранение с мультиподписью перестало быть дорогим.
Как это работает
Скрипт свидетеля фиксируется обычным хешем SHA-256, который находится в выходе, и остается секретным до того дня, когда кто-либо потратит выход. Тот, кто тратит, заполняет стек свидетеля аргументами, которые требуют условия, а затем добавляет сериализованный скрипт последним элементом. Узел хеширует этот элемент, сверяет 32 байта с обязательством и исполняет то, что только что проверил.
Консенсус применяет те же пределы для скриптов, что и у устаревших трат: 10 000 байт скрипта и 201 рабочая инструкция. Политика ретрансляции останавливается намного раньше, на 3600 байтах при не более чем 100 элементах в стеке, поэтому все большее требует прямой договоренности с майнером, а не обычной рассылки.
Поведение изменила именно арифметика. Скрипт 2-из-2 занимает 71 байт: две вставки данных с публичными ключами по 33 байта, два опкода подсчета и опкод проверки. Внутри свидетеля эти 71 байт стоят 71 единицу веса, то есть меньше 18 виртуальных байт. Те же 71 байт, переданные старым способом, в скрипте подписи, стоят 284 единицы веса, или 71 виртуальный байт. В безопасности ничего не изменилось, изменилась только цена ее использования.
Где это встречается
Lightning работает на скриптах свидетеля. Каждый канал пополняется в выход 2-из-2, а транзакции обязательств внутри канала строятся из небольшой библиотеки скриптов для отзыва и платежей с хеш-замком, описанной в BOLT 3, поэтому большинство из них создаются и уничтожаются, так и не попадая в цепочку.
Аппаратные устройства подписи видят их как именованное поле. Формат PSBT определяет слот скрипта свидетеля как во входах, так и в выходах, поэтому координатор может передать второму подписанту точные условия, которые выполняются, и устройство может показать пользователю, с чем он соглашается, а не хеш.
Их также можно встретить в обернутом виде. Вложенный адрес P2SH-P2WSH, частый на биржах, которые так и не обновили экраны вывода, несет 34-байтовый скрипт погашения, единственная задача которого указывать на программу свидетеля, а настоящую работу выполняет скрипт свидетеля под ним.
Резервным копиям нужны байты скрипта, а не только ключи. Храните дескриптор выхода рядом с каждой сид-фразой, потому что скрипт свидетеля, который никто не записал, превращает полностью подписанный кворум в биткоины, которые никто не может переместить.
Скрипт свидетеля vs tapscript
Скрипт свидетеля представляет собой единый скрипт, который раскрывается полностью; лист tapscript является одной ветвью дерева, где публикуется только используемая ветвь. По BIP-341 выход фиксирует корень Меркла над множеством листьев, поэтому хранилище с пятью отдельными путями восстановления показывает во время траты ровно один из них, а остальные четыре навсегда остаются приватными. Tapscript также отменяет предел в 10 000 байт, отключает OP_CHECKMULTISIG в пользу удобного для пакетной проверки OP_CHECKSIGADD и применяет бюджет веса для проверок подписи вместо фиксированного числа инструкций. Если ваш кошелек пишет bc1q, вы используете скрипты свидетеля; bc1p означает иную конструкцию Taproot.