Блокчейн/Уровень IV · Глубины протокола/4.2 Обновления/Урок 2
Tapscript и деревья скриптов (MAST)
Дерево, скрывающее контракт
МатериалыБлок-эксплорер с возможностью просмотра witness-данныхКошелёк с поддержкой Taproot и деревьев скриптовМиллиметровая бумага для рисования двоичных деревьев Меркла
Любопытство
- Почему трата по одному пункту контракта должна раскрывать весь контракт?
- Что делает кооперативную трату неотличимой от простой подписи?
- Как один ключ может зафиксировать целую библиотеку скрытых условий траты?
Исследование
- Мерклизованные абстрактные синтаксические деревья (MAST) впервые описал Рассел О’Коннор в 2013 году, а в 2016 и 2017 годах концепция получила развитие в ряде предложений. Идея состояла в том, чтобы поместить альтернативные условия траты в дерево Меркла, позволив тратящему раскрыть только ту ветвь, которую он использует. Термин «абстрактное синтаксическое дерево» отсылал к структурам компиляторов, где каждое условие порождает новый узел, однако реализация в биткоине развивалась иначе. Позднее Энтони Таунс придумал бэкроним «Merklized Alternative Script Tree», чтобы описать фактически принятую структуру: набор полных независимых скриптов, из которых при трате выбирается только один.
- Taproot встроил эту древовидную структуру в правила консенсуса через BIP341. Каждый лист дерева Меркла содержит скрипт, а корень дерева участвует в формировании итогового ключа выхода. При трате по скрипту (script path) тратящий раскрывает конкретный скрипт-лист, его входные данные и доказательство Меркла — хеши соседних узлов на каждом уровне. Неиспользованные ветви остаются скрытыми в блокчейне, что сохраняет приватность сложных схем вроде мультисига или таймлоков, которые прежде приходилось упаковывать в обёртки P2SH.
- Tapscript (BIP342) — особый диалект для таких скриптов-листьев, который в нескольких принципиальных моментах отличается от устаревшего Bitcoin Script. OP_CHECKMULTISIG в tapscript отключён. Пришедший ему на смену OP_CHECKSIGADD проверяет одну подпись по одному ключу и прибавляет 1 к счётчику; пустая подпись ничего не добавляет, а недействительная непустая приводит к провалу всего скрипта; скрипт выстраивает по одной такой проверке на каждый ключ и сравнивает счётчик с порогом. Каждая подпись сопоставляется с известным ключом, поэтому перебор вариантов не нужен, а подписи можно проверять пакетно.
- Tapscript также оставляет место для обновлений с помощью опкодов OP_SUCCESS: сегодня любой скрипт, содержащий такой опкод, безусловно считается успешным, поэтому их никто не использует, а будущий софтфорк может придать им ограничительный смысл, не сделав недействительным ничего из используемого. Унаследованный лимит размера скрипта в 10 000 байт в tapscript снят; теперь размер скрипта ограничен только весом блока и правилами политики (policy). Кроме того, бюджет операций с подписями масштабируется в зависимости от размера witness, что предотвращает DoS-атаки через чрезмерную проверку подписей.
- Рассмотрим практический пример: пользователь держит средства с тратой по ключу 2-из-2 (key path) для повседневных расходов — обе стороны подписывают совместно, и в блокчейне видна лишь стандартная подпись Шнорра. Однако в дереве скриптов есть скрытый лист, позволяющий одному ключу тратить средства самостоятельно после годового таймлока. Если партнёр перестаёт отвечать, пользователь может задействовать эту ветвь восстановления. Доказательство Меркла раскрывает только этот конкретный скрипт с таймлоком, а другие возможные ветви — например, социальное восстановление или хешлоки — остаются полностью скрытыми.
- Чтобы проверить эти механизмы на практике, откройте блок-эксплорер и найдите транзакцию Taproot, потраченную по скрипту (script path). Изучите witness: входные данные скрипта, сам скрипт-лист и контрольный блок (control block), первый байт которого объединяет версию листа (0xc0 для tapscript) с битом чётности, а за ним следуют внутренний ключ и по одному 32-байтовому хешу на каждый уровень дерева. Сравните это с тратой по ключу (key path) с адреса того же типа: в ней видна только подпись длиной 64 или 65 байт и никаких данных скрипта — это показывает, как сложные контракты остаются невидимыми, пока ими не воспользовались.
Ключевые факты
- MAST расшифровывается как Merklized Alternative Script Tree — бэкроним, придуманный Энтони Таунсом для описания структуры Taproot.
- Tapscript снимает унаследованный лимит размера скрипта в 10 000 байт: скрипты ограничены только весом блока и правилами политики.
- OP_CHECKSIGADD в tapscript заменяет OP_CHECKMULTISIG, обеспечивая пороговые проверки, совместимые с пакетной верификацией.
- Трата по скрипту раскрывает скрипт-лист, его входные данные и доказательство Меркла из хешей соседних узлов.
- Опкоды OP_SUCCESS оставляют место для будущих софтфорков, не нарушая работу существующих tapscript-скриптов.
- Версия листа 0xc0 обозначает tapscript; неизвестные версии листа остаются без ограничений ради будущих софтфорков.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 различных условий траты (например, мультисиг, таймлок, хешлок), которые можно разместить в дереве скриптов Taproot. Укажите основное назначение каждого условия.
6СгруппироватьСгруппируйте 9 условий в 6 категорий по их влиянию на приватность: полностью скрытые, частично раскрываемые, всегда видимые или подчинённые другим структурным ограничениям.
3Выделить главноеСведите 6 групп к 3 основным причинам, по которым сокрытие отдельных ветвей скрипта важно для эффективности блокчейна и безопасности пользователей.
1КристаллизоватьНапишите одно предложение о том, как дерево Меркла позволяет одному публичному ключу зафиксировать несколько взаимоисключающих правил траты, не раскрывая их.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.
- BIP341: Taproot: SegWit version 1 spending rules
- BIP342: Validation of Taproot Scripts
- Bitcoin Optech, 'MAST' and 'Tapscript' topics
- Anthony Towns, 'Merklized Alternative Script Trees' proposal discussions