Не столь умные контракты: дилемма на дилемме. Спикер: Александр Чепурной (Часть 1)

7 месяцев назад
65 в блокчейн

Технологические аспекты работы с умными контрактами - тема доклада, которую раскроет Александр Чепурной в двух лекциях.

Краткая информация о спикере:

Александр работает в сфере Блокчейн с 2013 года. В 2014-2015 занимался разработкой в Nxt. В это же время спикер стал сооснователем проекта SmartContract.com. С 2016 года и по сегодняшний день Александр работает в компании IOHK Research, которая известна созданием Cardano и разработкой клиента Ethereum Classic. Также, спикер является сооснователем блокчейна Ergo Platform.

Для начала рассмотрим одно из основных отличий традиционных денег от криптовалюты

Снимок экрана 2018-04-02 в 17.20.07.png

У традиционных денег нет методов защиты.

Снимок экрана 2018-04-02 в 17.20.19.png

С появлением криптовалюты появилась программируемая логика денег. Изображение иллюстрирует монету Биткоин, которая защищена публичным ключом и потратить монету может только владелец приватного ключа, ассоциируемого с данным публичным ключом.

Монеты в цифровом мире выглядят следующим образом

Снимок экрана 2018-04-02 в 17.20.32.png

Отметим особенности цифровых монет:

  • Цифровые монеты имеют произвольный номинал, поскольку в цифровом мире не существует фиксированного номинала
  • Во избежании двойной траты, цифровые объекты при подаче на вход становятся невалидными

Разберем схему транзакции в Биткоин подробнее:

Транзакция создает несколько монет, которые называются выходы. Также, транзакция тратит несколько монет произвольного номинала, то есть, когда кошелек с адресом ассоциирован с балансом, в системе есть определенное количество монет, которые связаны с определенным публичным ключом, а публичный ключ, в свою очередь, связан с адресом.

Вернемся к вопросу защищенности цифровых объектов

В Биткоин монету защищает программа, написанная на языке Bitcoin Script. При запуске узла Биткоин, идет проверка всех транзакций с первого блока, при этом множество раз запускается интерпретатор, который проверяет валидность потраченных монет.

Обобщая данную информацию, введем понятие язык аутентификации

Язык аутентификации - язык, который связан со следующей схемой:

Снимок экрана 2018-04-02 в 17.29.52.png

На вход подается:

  • Монета, которая защищена детерминированной программой
  • Общий контекст - состояние блокчейн-системы на указанный момент
  • Доказательство траты данной монеты

Далее интерпретатор использует полученную информацию для принятия одного из двух возможных выходных значений - да или нет. В данном случае, ответа можно ли потратить монету.

Развивая концепт языка аутентификации, рассмотрим еще один пример - умные бюллетени

Термин появился сравнительно недавно, в 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) - выплата хешу публичного ключа
  • Снимок экрана 2018-04-03 в 0.30.27.png

    Выходы транзакций в биткоин защищены скриптом, состоящим из четырех инструкций.

    Скрипт из двух элементов тратит монету.

    Исполнение скрипта в Биткоин

    Сначала соединяется входной и выходной скрипты. В результате получается следующая программа, стек пустой

    Снимок экрана 2018-04-03 в 0.43.22.png

    На вершине неисполненных инструкций списка находится подпись и публичный ключ, которые выносятся на вершину стека

    Снимок экрана 2018-04-03 в 0.50.45.png

    Далее следует операция (OP_DUP) - дубликация последнего элемента, то есть на вершину стека записывается не один публичный ключ, а два

    Снимок экрана 2018-04-03 в 6.21.26.png

    OP_HASH160 - вычислить 160-битный хеш от вершины стека. Вычисляем:

    Снимок экрана 2018-04-03 в 6.26.37.png

    <pubKeyHash> - хеш из защищающего скрипта

    Снимок экрана 2018-04-03 в 6.31.13.png

    Затем инструкция OP_EQUALVERIFY сравнивает два элемента на вершине стека, если они не равны - тратить монету нельзя.

    В разбираемом случае данные показатели равны. Соответственно остается одна инструкция OP_CHECKSIG

    Снимок экрана 2018-04-03 в 6.39.14.png

    Для проверки подписи необходимо сообщение, на основе которого будет сделана проверка.

    Снимок экрана 2018-04-03 в 6.45.39.png

    В качестве сообщения выступает неявный аргумент - байты транзакции. И если подпись соответствует байтам транзакции и публичному ключу, то на вершине стека находится значение true.

    Если вершина стека непустая и не равна нулю - монету тратить можно!

    Bitcoin Script необходим для экономии пространства.

    • Обмен цифровыми активами между двумя блокчейнами (Atomic Cross-Chain Swaps)
    • Снимок экрана 2018-04-03 в 6.58.35.png

      У Алисы есть токены в блокчейне А, у Боба в блокчейне Б. Каким образом участникам криптографического протокола обменятся токенами без посредников?

      Рассмотрим один из вариантов решения данной задачи - Atomic Cross-Chain Swaps

      Снимок экрана 2018-04-03 в 7.13.47.png

      Алиса выбирает некоторое большое случайное число Х и вычисляет хеш от данного числа. Соответственно, в пространстве возможных значений Х найти без полного перебора уже нельзя.

      Алиса с помощью скрипта сообщает определенные условия:

      • Первая строка - условия возврата токенов

      Высота более 1000 блоков плюс значение А - это таймаут, который специфичен для Алисы
      Если прошло времени больше, чем таймаут, то подписи Алисы достаточно чтобы потратить данные токены

      • Вторая строка сообщает, что до таймаута токены может потратить Боб, в случае если он знает секрет, который сгенерировала Алиса

      Боб, в свою очередь, создает подобный скрипт, с некоторыми различиями:

      Разные начальные моменты времени, поскольку время в блокчейнах течет по-разному
      Разные таймауты

      Обобщим принцип работы данной схемы:

      Чтобы Алисе потратить монету Боба, ей необходимо предъявить секрет Х. Поскольку в блокчейне транзакции прозрачны, при трате монеты Алисой, Боб узнает секрет Х и может потратить монету Алисы.

      Важно соблюдать условие, что таймаут у Алисы должен быть больше, чем таймаут у Боба, поскольку Алиса может потратить монету Боба и раскрыть секрет перед окончанием таймаута. В таком случае, Боб может не успеть потратить монету Алисы.

      Как и все языки программирования, Bitcoin Script не лишен недостатков. Выделим основные минусы:

      • Фиксированные криптографические функции
      • Лимитированная поддержка криптографических протоколов
      • В языке обнаружено достаточно много уязвимостей, позволяющих совершать DoS атаки

      Как следствие, появилась потребность создания более мощного языка, сохраняя его простоту, при этом увеличивая эффективность и безопасность.

      Разработки за это время в области Bitcoin Script можно разделить на две категории:

      • Улучшение существующего языка Bitcoin Script путем разработки языка высокого уровня, который будет скомпилирован в Bitcoin Script
      • Разработка новых языков программирования, поддерживающих стандарт умных подписей. Подобные подписи объединяют определенную криптографию, подтверждение секретной информации и некоторые программируемые возможности.

      Выделим один из способов, с помощью которого, можно создать более продуктивный вариант языка на модели блокчейна Биткоин без потери гарантий безопасности

      В Биткоине состояние языка - это байты транзакций и текущий момент времени.

      Увеличение контекста в памяти способствует повышению продуктивности языка.

      В качестве примера рассмотрим скрипт краудфандинга проекта схожего с Kickstarter

      Снимок экрана 2018-04-03 в 12.24.39.png

      Проект намерен собрать 100 000 монет не позже, чем будет создан 100 блок. У проекта публичный ключ - х2.

      Чтобы пожертвовать средства, необходимо создать монету с двумя условиями:

      • Первая строка - строка возврата монет после 100 блока
      • Вторая строка - до 100 блока - exists - функция, которая проверяет соответствие объекта outputs (выходы тратящей транзакции) определенному условию

      В результате, монета может быть потрачена, если транзакция набрала не менее 100 000 монет и ассоциирована с публичным ключом х2.

      Cкрипт краудфандинга в Ergo выглядит как набор логических условий:

      Снимок экрана 2018-04-03 в 12.50.01.png

      Рассмотрим еще один пример - валюту с Демерредж (Demurrage)

      Демередж - плата за простой. Соответственно валюта с демередж - деньги, которые теряют ценность с течением времени. Данный тип денег подходит для стимулирования циркуляции денежных средств.

      Снимок экрана 2018-04-03 в 12.53.48.png

      Для создание подобной валюты каждая монета системы должна иметь условия траты по типу:

      • regular_script v - пользовательский скрипт
      • Предположительно переменная self - содержит время создания монеты
      • Если высота больше чем, высота на которой создана монета плюс период демереджа и тратящая транзакция создает монету у которой номинал не меньше, чем у данной монеты минус стоимость демереджа и новая монета содержит такой же скрипт, то рассматриваемая монета может быть потрачена.

      Вспомним название лекции и рассмотрим дилеммы, которые могут возникнуть в умных контрактах

      Дилемма №1

      Языки программирования зачастую создаются исходя из противоречивых требований с целью расширения возможностей блокчейн-системы. Но, существует множество ограничений, в частности любой скрипт, использующий контекст может исполняться в рамках строго определенного времени.

      Чем больше добавляется новых возможностей в язык и контекст, тем сложнее становится анализ достижимости цели гарантированного завершения в назначенный период.

      Следите за новостями, продолжение лекции в следующей публикации.

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.