Не столь умные контракты: дилемма на дилемме. Спикер: Александр Чепурной (Часть 1)
Технологические аспекты работы с умными контрактами - тема доклада, которую раскроет Александр Чепурной в двух лекциях.
Краткая информация о спикере:
Александр работает в сфере Блокчейн с 2013 года. В 2014-2015 занимался разработкой в Nxt. В это же время спикер стал сооснователем проекта SmartContract.com. С 2016 года и по сегодняшний день Александр работает в компании IOHK Research, которая известна созданием Cardano и разработкой клиента Ethereum Classic. Также, спикер является сооснователем блокчейна Ergo Platform.
Для начала рассмотрим одно из основных отличий традиционных денег от криптовалюты
У традиционных денег нет методов защиты.
С появлением криптовалюты появилась программируемая логика денег. Изображение иллюстрирует монету Биткоин, которая защищена публичным ключом и потратить монету может только владелец приватного ключа, ассоциируемого с данным публичным ключом.
Монеты в цифровом мире выглядят следующим образом
Отметим особенности цифровых монет:
- Цифровые монеты имеют произвольный номинал, поскольку в цифровом мире не существует фиксированного номинала
- Во избежании двойной траты, цифровые объекты при подаче на вход становятся невалидными
Разберем схему транзакции в Биткоин подробнее:
Транзакция создает несколько монет, которые называются выходы. Также, транзакция тратит несколько монет произвольного номинала, то есть, когда кошелек с адресом ассоциирован с балансом, в системе есть определенное количество монет, которые связаны с определенным публичным ключом, а публичный ключ, в свою очередь, связан с адресом.
Вернемся к вопросу защищенности цифровых объектов
В Биткоин монету защищает программа, написанная на языке Bitcoin Script. При запуске узла Биткоин, идет проверка всех транзакций с первого блока, при этом множество раз запускается интерпретатор, который проверяет валидность потраченных монет.
Обобщая данную информацию, введем понятие язык аутентификации
Язык аутентификации - язык, который связан со следующей схемой:
На вход подается:
- Монета, которая защищена детерминированной программой
- Общий контекст - состояние блокчейн-системы на указанный момент
- Доказательство траты данной монеты
Далее интерпретатор использует полученную информацию для принятия одного из двух возможных выходных значений - да или нет. В данном случае, ответа можно ли потратить монету.
Развивая концепт языка аутентификации, рассмотрим еще один пример - умные бюллетени
Термин появился сравнительно недавно, в 2017 году, и на сегодняшний день существует единственная статья, посвященная умным бюллетеням https://eprint.iacr.org/2017/616
Концепт состоит в том, что в бюллетень вместо голоса можно записать программу, которая будет исполнена относительно контекста.
Тезисно отметим особенности языка Bitcoin Script
- Bitcoin Script - стековый язык. Стек - структура данных, организованная по принципу «первый зашел, первый вышел»
- Доказательством траты монеты Биткоин служит программа, также написанная на Bitcoin Script
- Контекст в Биткоин довольно минималистичный и включает байты тратящей транзакции и текущий момент времени
- В языке есть несколько инструкций работы с криптографией: проверить подпись, проверить несколько подписей, вычислить хеш (OP_CHECKSIG, OP_CHECKMULTISIG, OP_HASH)
Для примера исполним некоторые программы
- P2PKH (Pay-to-Public-Key-Hash) - выплата хешу публичного ключа
- Обмен цифровыми активами между двумя блокчейнами (Atomic Cross-Chain Swaps)
- Первая строка - условия возврата токенов
- Вторая строка сообщает, что до таймаута токены может потратить Боб, в случае если он знает секрет, который сгенерировала Алиса
- Фиксированные криптографические функции
- Лимитированная поддержка криптографических протоколов
- В языке обнаружено достаточно много уязвимостей, позволяющих совершать DoS атаки
- Улучшение существующего языка Bitcoin Script путем разработки языка высокого уровня, который будет скомпилирован в Bitcoin Script
- Разработка новых языков программирования, поддерживающих стандарт умных подписей. Подобные подписи объединяют определенную криптографию, подтверждение секретной информации и некоторые программируемые возможности.
- Первая строка - строка возврата монет после 100 блока
- Вторая строка - до 100 блока - exists - функция, которая проверяет соответствие объекта outputs (выходы тратящей транзакции) определенному условию
- regular_script v - пользовательский скрипт
- Предположительно переменная self - содержит время создания монеты
- Если высота больше чем, высота на которой создана монета плюс период демереджа и тратящая транзакция создает монету у которой номинал не меньше, чем у данной монеты минус стоимость демереджа и новая монета содержит такой же скрипт, то рассматриваемая монета может быть потрачена.
Выходы транзакций в биткоин защищены скриптом, состоящим из четырех инструкций.
Скрипт из двух элементов тратит монету.
Исполнение скрипта в Биткоин
Сначала соединяется входной и выходной скрипты. В результате получается следующая программа, стек пустой
На вершине неисполненных инструкций списка находится подпись и публичный ключ, которые выносятся на вершину стека
Далее следует операция (OP_DUP) - дубликация последнего элемента, то есть на вершину стека записывается не один публичный ключ, а два
OP_HASH160 - вычислить 160-битный хеш от вершины стека. Вычисляем:
<pubKeyHash> - хеш из защищающего скрипта
Затем инструкция OP_EQUALVERIFY сравнивает два элемента на вершине стека, если они не равны - тратить монету нельзя.
В разбираемом случае данные показатели равны. Соответственно остается одна инструкция OP_CHECKSIG
Для проверки подписи необходимо сообщение, на основе которого будет сделана проверка.
В качестве сообщения выступает неявный аргумент - байты транзакции. И если подпись соответствует байтам транзакции и публичному ключу, то на вершине стека находится значение true.
Если вершина стека непустая и не равна нулю - монету тратить можно!
Bitcoin Script необходим для экономии пространства.
У Алисы есть токены в блокчейне А, у Боба в блокчейне Б. Каким образом участникам криптографического протокола обменятся токенами без посредников?
Рассмотрим один из вариантов решения данной задачи - Atomic Cross-Chain Swaps
Алиса выбирает некоторое большое случайное число Х и вычисляет хеш от данного числа. Соответственно, в пространстве возможных значений Х найти без полного перебора уже нельзя.
Алиса с помощью скрипта сообщает определенные условия:
Высота более 1000 блоков плюс значение А - это таймаут, который специфичен для Алисы
Если прошло времени больше, чем таймаут, то подписи Алисы достаточно чтобы потратить данные токены
Боб, в свою очередь, создает подобный скрипт, с некоторыми различиями:
Разные начальные моменты времени, поскольку время в блокчейнах течет по-разному
Разные таймауты
Обобщим принцип работы данной схемы:
Чтобы Алисе потратить монету Боба, ей необходимо предъявить секрет Х. Поскольку в блокчейне транзакции прозрачны, при трате монеты Алисой, Боб узнает секрет Х и может потратить монету Алисы.
Важно соблюдать условие, что таймаут у Алисы должен быть больше, чем таймаут у Боба, поскольку Алиса может потратить монету Боба и раскрыть секрет перед окончанием таймаута. В таком случае, Боб может не успеть потратить монету Алисы.
Как и все языки программирования, Bitcoin Script не лишен недостатков. Выделим основные минусы:
Как следствие, появилась потребность создания более мощного языка, сохраняя его простоту, при этом увеличивая эффективность и безопасность.
Разработки за это время в области Bitcoin Script можно разделить на две категории:
Выделим один из способов, с помощью которого, можно создать более продуктивный вариант языка на модели блокчейна Биткоин без потери гарантий безопасности
В Биткоине состояние языка - это байты транзакций и текущий момент времени.
Увеличение контекста в памяти способствует повышению продуктивности языка.
В качестве примера рассмотрим скрипт краудфандинга проекта схожего с Kickstarter
Проект намерен собрать 100 000 монет не позже, чем будет создан 100 блок. У проекта публичный ключ - х2.
Чтобы пожертвовать средства, необходимо создать монету с двумя условиями:
В результате, монета может быть потрачена, если транзакция набрала не менее 100 000 монет и ассоциирована с публичным ключом х2.
Cкрипт краудфандинга в Ergo выглядит как набор логических условий:
Рассмотрим еще один пример - валюту с Демерредж (Demurrage)
Демередж - плата за простой. Соответственно валюта с демередж - деньги, которые теряют ценность с течением времени. Данный тип денег подходит для стимулирования циркуляции денежных средств.
Для создание подобной валюты каждая монета системы должна иметь условия траты по типу:
Вспомним название лекции и рассмотрим дилеммы, которые могут возникнуть в умных контрактах
Дилемма №1
Языки программирования зачастую создаются исходя из противоречивых требований с целью расширения возможностей блокчейн-системы. Но, существует множество ограничений, в частности любой скрипт, использующий контекст может исполняться в рамках строго определенного времени.
Чем больше добавляется новых возможностей в язык и контекст, тем сложнее становится анализ достижимости цели гарантированного завершения в назначенный период.
Следите за новостями, продолжение лекции в следующей публикации.