Смарт-контракты на Биткойн
Вопреки распространенному мнению, Биткойн с момента своего создания поддерживает умные контракты с собственным стековым языком программирования под названием Скрипт. Каждая биткойн-транзакция состоит из входов и выходов. Каждый вывод блокирует некоторые биткойны с помощью сценария, который диктует обязательства по контракту. Если на входе есть сценарий, который выполняет контракт на выходе, он разблокирует биткойны² в этом выходе и перемещает их на новые выходы. Вот как работает передача владения биткойнами.
Скрипт обычно считается чрезвычайно ограниченным и, следовательно, неспособным к сложным смарт-контрактам. Один из часто упоминаемых недостатков смарт-контрактов Биткойн - это отсутствие состояния. Это одно из основных ограничений, которое Ethereum предполагает преодолеть, что оправдывает его существование.
Некоторые контракты по своей сути имеют состояние, поскольку они требуют, чтобы договаривающиеся стороны взаимодействовали в несколько этапов и зависят от изменяющихся во времени состояний, таких как голосование в цепочке и игры. Мы показываем общий механизм поддержания состояния в смарт-контрактах Биткойн. Мы также реализуем контракт с отслеживанием состояния в sCrypt, языке высокого уровня, который компилируется в собственный скрипт.
Предварительное условие: OP_PUSH_TX
Прежде чем мы рассмотрим, как поддерживать состояние в смарт-контрактах Биткойн, мы представляем мощную технику под названием OP_PUSH_TX. Его можно рассматривать как псевдо код операции ³, который помещает текущую транзакцию в стек, который затем можно проверить во время выполнения. Точнее, он позволяет проверять прообраз, используемый при проверке подписи, определенной в BIP143. Формат прообраза следующий:
Реализация контракта с отслеживанием состояния
Как только мы сможем проверить контекст транзакции контракта, мы можем наложить произвольные ограничения на его входы и выходы.
Один из способов реализовать состояние в контракте - разделить контракт в скрипте блокировки на две части: данные и код. Часть данных - это состояние. Часть кода содержит бизнес-логику контракта, который кодирует правила перехода между состояниями. Данные пассивно добавляются к коду как OP_RETURN ‹data› или OP_PUSHDATA ‹data› OP_DROP. Даже если он не оценивается, он все равно влияет на действительность контракта, поскольку предыдущая часть кода проверяет его.
Используя OP_PUSH_TX, мы можем получить сценарий блокировки потраченного вывода из части 5 и нового вывода из части 8. Чтобы поддерживать состояние, мы требуем, чтобы часть кода сценария блокировки не изменялась, а изменения данных / состояния должны соответствовать правилам перехода состояний в части кода. Это аналогично концепции объекта в объектно-ориентированном программировании, где код является методами и данные являются переменными-членами объекта. Методы неизменны⁴. Переменные-члены инкапсулированы и могут быть изменены только с помощью методов⁵. Методы вызываются из сценария разблокировки, кодируя вызываемый метод и их аргументы.
Пример контракта: счетчик
Давайте посмотрим на простой пример контракта с отслеживанием состояния: встречный контракт отслеживает, сколько раз была вызвана его функция increment (). Его код показан ниже со встроенными комментариями.
Строка 3 обеспечивает прообраз текущей транзакции. Мы получаем предыдущий сценарий блокировки в строке 6, также известный как scriptCode в части 5 прообраза. Предыдущее состояние счетчика извлекается из scriptCode в строке 9, после чего оно увеличивается и помещается в новый сценарий блокировки в строке 15. Обратите внимание, что счетчик - единственная часть, которая изменяется в сценарии блокировки. Остальное гарантирует, что вывод содержит новый сценарий блокировки.
Вот код для развертывания контракта и многократного вызова его функции increment (). Пример контракта с приращением счетчика от 0 до 9 можно найти: 0 - › 1 -› 2 - › 3 -› 4 - › 5 -› 6 - › 7 -› 8 - › 9 . Обратите внимание, что состояние счетчика находится в конце сценария вывода первой транзакции.
Заключение
Это часть серии, которую мы пишем, чтобы продемонстрировать, на что способны смарт-контракты Биткойн и как их реализовать. Многие предполагаемые ограничения сценария связаны с неспособностью реализовать его потенциал. Когда мы объясним и продемонстрируем больше возможностей сценария, люди обнаружат, что он чрезвычайно расширяемый, универсальный и ориентированный на будущее. Мы покажем, что Биткойн без искусственных ограничений может запускать любые смарт-контракты, которые могут выполняться другими блокчейнами, при этом имея возможность неограниченно масштабироваться. Его можно использовать для повышения эффективности и безопасности многих приложений в различных отраслях за счет экономических стимулов.
Благодарности
Особая благодарность nChain за предоставленную оригинальную идею OP_PUSH_TX. Мы также благодарим Джорджа Папагеоргиу, Джеймса Белдинга, Брентона Ганнинга и Джоэла Далайса за ценные предложения по более раннему черновику этой статьи.
[1]: В статье мы называем Bitcoin SV как Bitcoin, поскольку он следует оригинальной конструкции протокола.
[2]: Существует исключение, что некоторые выходы содержат нулевые биткойны, отмеченные, например, OP_RETURN.
[3]: Код операции - это основная единица скрипта.
[4]: Есть некоторые исключения из этого общего правила в некоторых динамических языках ООП.
[5]: Есть также некоторые исключения из этого общего правила.
Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик