Биткоины управляются компьютерными программами, которые разблокируют средства в обмен на действительное свидетельство. Эти скрипты Биткоина кодируют условия расходования средств, которые определяют, что является и что не является действительным свидетельством. Каждая транзакция опирается на этот механизм. Убедиться в том, что он работает, означает убедиться в том, что транзакции работают. Как обеспечить правильность этих программ, особенно когда они кодируют сложные условия расходования средств? Как мы можем следить за сложностью? Древовидные программы, такие как Miniscript, являются решением этой проблемы.
Деревья, представляющие собой набор узлов, соединенных ребрами, являются одной из самых фундаментальных структур данных. Каждый узел связан с нулем или несколькими дочерними узлами, но только с одним родительским. Дерево "вырастает" из специального корневого узла, не имеющего родителя. В результате мы можем взять любой узел и посмотреть на его потомков: Это меньшее дерево! Дерево рекурсивно состоит из множества меньших деревьев. Это означает, что если мы можем представить данные в виде дерева, мы можем обрабатывать их с помощью рекурсивных алгоритмов, которые разбивают их на части бит за битом. Это облегчает нам такие вещи, как анализ данных.
Поиск деревьев в Биткоине
Miniscript – это подмножество Bitcoin Script. Он накладывает на скрипты древовидную структуру, которая определяет, что делает каждая часть скрипта. Некоторые части запрашивают подпись, другие – прообраз хеша; некоторые обеспечивают таймлок, а другие объединяют части для формирования расширенного условия. Если посмотреть на древовидную структуру, то смысл сценария становится явным. Каждая часть выполняет свою роль, которую можно увидеть в дереве.
Вот пример скрипта Биткоина и древовидной структуры Miniscript, которая располагается "сверху".
Добавленная структура оказывается очень полезной: Свойства сценария можно статически анализировать и индуктивно доказывать, двигаясь вдоль дерева. Мы можем легко показать, что сценарий допускает или отклоняет данного свидетеля, что он взимает определенную плату или что он достигнет лимита ресурсов во время выполнения. Мы даже можем объединить два скрипта в один, кодирующий состав их условий траты. С помощью этого инструментария мы можем кодировать сложные условия расходования средств, будучи уверенными в правильности полученного сценария.
Raw Bitcoin Script лишен вышеперечисленных удобств и поэтому более сложен в использовании. Смысл скрипта неявно определяется реализацией на C++. Скрипты, в целом, не имеют четкой структуры, и о них трудно рассуждать. Кроме того, сам Bitcoin Script не может выразить даже такие фундаментальные операции, как умножение или конкатенация. Эти препятствия затрудняют свободное кодирование условий расходования средств, как нам хотелось бы.
Miniscript улучшает основную функциональность Bitcoin Script, заставляя скрипты напоминать древовидную структуру. Благодаря этому требованию мы включаем небольшие, хорошо управляемые скрипты, которые кодируют ключ, хеш или таймлоки, исключая при этом экзотические сценарии, выполняющие другие действия. Поскольку Miniscript в конечном итоге является Bitcoin Script со структурой сверху, вы можете использовать его сейчас без софт-форка. Только кошельки и другие программы, которые хотят использовать эту структуру, должны быть обновлены для добавления поддержки.
Раздвигая границы
Что мы можем сделать лучше, чем Miniscript, сохранив при этом его полезные свойства? Как сделать систему более мощной, сохранив при этом ее структуру? Эти мысли приводят нас к Simplicity, совершенно новому языку блокчейна, разработанному с нуля в качестве альтернативы Bitcoin Script.
Программы Simplicity представляют собой деревья: корневой узел представляет общую программу, а каждый узел выполняет некоторую часть вычислений. Конкретно, родительский узел имеет доступ к вычислениям своих дочерних узлов и объединяет их результаты в соответствии с некоторой функцией. Это начинается с листьев, где возвращаются постоянные значения, такие как открытые ключи или данные-свидетели. Агрегирование продолжается снизу вверх, пока в корне не будет вычислен общий результат.
Вот набросок программы Simplicity, которая соответствует скрипту Bitcoin, приведенному выше. Обратите внимание, что его структура соответствует древовидной структуре Miniscript. Настоящие программы Simplicity более детализированы (and, or, key и older состоят из более мелких фрагментов программы, называемых комбинаторами), но если мы уменьшим масштаб, то Simplicity и Miniscript будут выглядеть одинаково.
Simplicity является достаточно общей для вычисления произвольных логических функций. Каждую из них можно представить как условие расхода, функцию, которая принимает или отвергает свидетелей. Simplicity может выполнять ковенанты, делегирование, доказательства с нулевым знанием и многое другое. Такая выразительная сила может показаться пугающей, но мы можем проверить программную корректность. Simplicity имеет понятную семантику, поэтому ясно, что делает программа. Нет никаких неприятных сюрпризов. Древовидная структура, опять же, облегчает статический анализ и доказательство свойств. Мы можем показать, что данная программа дешева в исполнении и что она правильно кодирует заданное условие расходования средств. У нас есть тот же набор инструментов, что и для Miniscript, но для гораздо большего набора программ.
В отличие от Miniscript, для Simplicity потребуется софтфорк, чтобы его можно было использовать в Биткоине. Он будет существовать рядом с Bitcoin Script (Miniscript) в новом виде листа Taproot. Следующий шаг – сначала реализовать Simplicity в Elements, платформу с открытым исходным кодом, на которой построена Liquid, чтобы доказать ее потенциал для Биткоина. Это также повлияет на окончательный дизайн языка.
Сближение языков
Мы строим мост между Miniscript и Simplicity. Древовидную структуру Miniscript легко воспроизвести в Simplicity, так что мы сможем преобразовывать скрипты Bitcoin в программы Simplicity, а Miniscript станет подмножеством Simplicity. Вы можете генерировать программы из существующих скриптов, проверять, являются ли программа и скрипт семантически эквивалентными, и впоследствии совершенствовать свои программы, чтобы выйти за пределы того, что может выразить Miniscript. Для тех, кто знаком с Miniscript, это будет отличным введением в мир Simplicity. В следующем посте этой серии мы расскажем об этом мосте более подробно.
Будущее в форме дерева
Древовидные программы, такие как Miniscript, легко читать и анализировать. Целый ряд инструментов работает с этими программами и помогает нам следить за их корректностью. Simplicity идет по этому пути и позволяет выполнять произвольные вычисления с использованием дерева. Он намного мощнее, чем Miniscript, но все еще хорошо управляем благодаря своей структуре. То, что хорошо в Miniscript, перенесено в Simplicity. В результате получился язык, который пользуется преимуществами дерева, но при этом позволяет выполнять произвольные вычисления.
Мы надеемся, что будущее имеет форму дерева. Мы неустанно работаем над тем, чтобы сделать Simplicity реальностью. Преобразование Miniscript в Simplicity с помощью моста – отличный способ начать работу. Следите за новостями о том, как использовать мост самостоятельно!