Глоссарий / Протокол и обновления
Tapscript
- Что такое Tapscript?
- Tapscript представляет собой версию Bitcoin Script, которая выполняется в тратах по пути скрипта Taproot, с подписями Schnorr, без потолка опкодов и с бюджетом подписей вместо прежних счетчиков.
Определено в BIP-342.
Его определяет BIP-342, а байт версии листа 0xc0 помечает ветвь дерева taptree как tapscript, а не как нечто придуманное позже. По сравнению с языком скриптов, который используется во всех остальных случаях, он снимает лимит в 201 операцию, не являющуюся проталкиванием данных, и ограничение размера скрипта в 10 000 байт, а также отключает OP_CHECKMULTISIG. Если вы тратите монету Taproot, раскрывая скрипт, этот скрипт написан именно на этом языке.
Как это работает
Трата tapscript передает сети три вещи в стеке свидетеля: аргументы, которые требует скрипт, сам скрипт и блок управления, доказывающий, что скрипт принадлежит адресу.
Сначала изменилась проверка подписей. OP_CHECKSIG и OP_CHECKSIGVERIFY теперь ожидают публичный ключ x-only длиной 32 байта и подпись Schnorr длиной 64 байта, или 65 байт, когда добавлен тип sighash, отличный от используемого по умолчанию. OP_CHECKMULTISIG и OP_CHECKMULTISIGVERIFY просто завершаются неудачей, а их место занимает OP_CHECKSIGADD.
Во-вторых, изменился учет ресурсов, и именно здесь есть реальные последствия. Прежние счетчики, 201 операция на скрипт и общий счетчик sigop, отменены. Вместо этого каждый вход получает бюджет валидации, который начинается с 50 единиц веса плюс размер его собственного свидетеля, и каждая успешная проверка подписи вычитает из него 50. Работа по проверке покупается байтами, что является более чистым правилом, чем фиксированный счетчик, и означает, что скрипт может содержать столько ключей, сколько вы готовы за это заплатить.
Две двери оставлены открытыми для будущих обновлений. Опкоды 80, 98, 126-129, 131-134, 137, 138, 141, 142, 149-153 и 187-254 стали OP_SUCCESS: если любой из них встречается где-либо в скрипте, даже в ветви, которая никогда не выполняется, скрипт сразу завершается успешно. Публичные ключи любой длины, кроме 32 байт, трактуются как неизвестный тип ключа и проходят. Оба правила позволяют более позднему мягкому форку (soft fork) назначить реальное поведение без жесткого форка (hard fork). Неизменными остались ограничение в 520 байт на один элемент стека и лимит стека в 1000 элементов.
Где это встречается
Tapscript появляется всякий раз, когда выход Taproot тратится трудным способом, путем раскрытия ветви вместо подписи агрегированным ключом.
Самый тяжелый реальный пользователь представляет собой хранение данных. Надпись ordinals представляет собой конверт tapscript, фрагмент содержимого, проталкиваемый по 520 байт за раз между OP_FALSE OP_IF и OP_ENDIF, и она существует в такой форме именно потому, что tapscript снял ограничение скрипта в 10 000 байт и поставил за ним скидку на свидетель. Что бы вы ни думали об этой практике, именно из-за нее большинство людей видели трату tapscript, не зная об этом.
Применения, более близкие к обычному накопителю, скромнее. Ветви восстановления с блокировкой по времени, резервные варианты эскроу и новые скрипты каналов Lightning существуют как листья tapscript, и Bitcoin Core может строить и подписывать их через Miniscript внутри дескриптора tr().
Tapscript vs Bitcoin Script
Bitcoin Script является семейством; tapscript является одним из его членов. В сети одновременно действуют три версии скриптов: унаследованный язык, язык версии 0 SegWit и tapscript, и узел выбирает между ними по тратимому выходу, а не по чему-либо в самом скрипте.
Это важно, когда вы копируете скрипт из руководства. Схема два из трех, написанная с OP_CHECKMULTISIG, действительна в выходе P2WSH и недействительна в листе taptree. Скрипт, который проталкивает 4000 байт, превышает консенсусный лимит в скрипте свидетеля P2WSH и вполне допустим в tapscript. Одни и те же опкоды на странице, но под ними другой свод правил.