Смарт-контракты на Биткойн

Вопреки распространенному мнению, Биткойн с момента своего создания поддерживает умные контракты с собственным стековым языком программирования под названием Скрипт. Каждая биткойн-транзакция состоит из входов и выходов. Каждый вывод блокирует некоторые биткойны с помощью сценария, который диктует обязательства по контракту. Если на входе есть сценарий, который выполняет контракт на выходе, он разблокирует биткойны² в этом выходе и перемещает их на новые выходы. Вот как работает передача владения биткойнами.

Скрипт обычно считается чрезвычайно ограниченным и, следовательно, неспособным к сложным смарт-контрактам. Один из часто упоминаемых недостатков смарт-контрактов Биткойн - это отсутствие состояния. Это одно из основных ограничений, которое 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]: Есть также некоторые исключения из этого общего правила.

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик