Эта статья — отчет о моем участии во втором этапе хакатоне, организованного компанией karma.red. Подробнее о хакатоне можно почитать на специальной страничке.

Для тех, кто любит читать код, а не статьи — репозиторий проекта.

Любители видео тоже не обижены :) В этом видео можно послушать краткое содержание статьи, посмотреть, как реализуется биржа шаг за шагом и увидеть вживую ее работу.


Статья еще одного участника хакатона из Владивостока (трем парням из Владика и одному из Улан-Уде организаторы по результатам онлайн этапа оплатили пролет и проживание в Москве).

Фотографии в статье — Вадима Францева, картинки — мои, из собранной на скорую руку презентации к защите проекта :) Итак, с формальностями покончено, поехали.

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

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

Из чего состоит настоящая децентрализованная биржа:


  • Движок. Это может быть собственный блокчейн или смартконтракт на другом блокчейне. В обязанности входит прием распоряжений (order, ордер) на покупку/продажу, их сопоставление (matching, матчинг)
  • Блокчейны с поддержкой блокировки монет с разблокировкой по времени\секрету. Такие как ethereum, bitcoin и его форки, eos и т.д.
  • Интерфейс (опционально). Для просмотра стакана, подачи распоряжений, уведомлений и т.д.



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

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

Атомарные обмены


Подробную документацию вы можете прочитать тут. Очень краткий пересказ:

  • У Даши есть 1 биткойн, у Маши 10 эфиров. Они хотят обменять их так, чтобы ни у кого не получилось друг друга обмануть
  • Даша генерирует секрет и хэш от секрета
  • (Шаг initiate) Даша блокирует 1 биткойн так, что его получить сможет только Маша, указав секрет, или сама Даша через двое суток после блокировки
  • Даша передает ид транзакции с блокировкой и хэш от секрета Маше
  • (Шаг participate) Маша проверяет транзакцию Даши и, если все верно, Маша с помощью смартконтракта блокирует 10 эфиров так, что их получить сможет только Даша, указав секрет, или сама Маша через сутки после блокировки
  • Маша передает Даше ид транзакции с блокировкой средств
  • (Шаг redeem) Даша проверяет транзакцию и, если сумма и дата блокировки верны, забирает 10 эфиров, указав секрет
  • (Шаг redeem) Маша узнает секрет и забирает с помощью него биткойн

Собираем все вместе


  • Даша отправляет ордер на продажу 1 биткойна по цене 10 эфиров за биткойн
  • Маша вносит депозит в 20 эфиров на контракт биржи
  • Маша отправляет ордер на покупку 2 биткойнов по цене 10 эфиров за биткойн
  • Биржа матчит распоряжения

    1. Создается ордер для Маши на покупку 1 биткойна по цене 10 эфиров за биткойн
    2. Инициируется атомарный обмен. При этом 10 эфиров снимаются с баланса Маши и блокируются в контракте атомарного обмена. Т.к. для инициации нужен секрет и хэш от секрета, то покупатель (в данном случае Маша) должен внести на биржу запас хэшей секретов, для того, чтобы на каждый инициированный обмен был новый хэш.

  • Дальше происходят все действия, описанные в предыдущем разделе, независимо от биржи



Моя реализация


За основу контракта атомарных свопов я взял эту реализацию: github.com/AltCoinExchange/ethatomicswap. Особенность данной реализации в том, что для нового атомарного обмена нет необходимости деплоить новый контракт. Все происходит в нем, как в неком реестре атомарных обменов.

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

В движке биржи реализовано следующее:

  • Добавление запаса хэшей
  • Депозит и вывод средств
  • Подача распоряжений на покупку и продажу, но с некоторыми ограничениями, обусловленными прототипностью контракта и ограничением времени:

    • Нет никаких проверок на лимит газа: циклы не ограничиваются, в боевых контрактах так делать нельзя
    • Для сопоставлений распоряжений берется встречное распоряжение не с лучшей ценой, а первое попавшееся
    • Разделяются только подаваемые заявки при сопоставлении с более мелкой. Например, если была заявка на покупку 10 эфира, а вы подаете заявку на продажу 2х, то распоряжения не сматчатся.

  • Инициирование атомарного обмена в контракте реестра атомарных обменов

Для того, чтобы не писать интерфейс, я обернул контракты в конструкторы для платформы smartz.io и задеплоил контракты через эти конструкторы, быстро получив тем самым интерфейс для управления контрактами.

Для демонстрации обмена эфира на биткойн у меня уже не оставалось времени, поэтому я показал обмен эфира из тестовой сети rinkeby на эфир их тестовой сети kovan:



Пара картинок и ссылок


Ссылки на панели управления для задеплоенных мной контрактов (нужно установить расширение браузера metamask для доступа в блокчейн ethereum из браузера). При желании вы можете задеплоить свои


Картинки для нежелающих ставить расширения:

Панель управления реестром


Панель управления биржей

Комментарии (6)


  1. b0a
    23.05.2018 21:39
    +1

    > (Шаг redeem) Даша проверяет транзакцию и, если сумма и дата блокировки верны, забирает 10 эфиров, указав секрет
    > (Шаг redeem) Маша узнает секрет и забирает с помощью него биткойн
    Если я правильно понимаю, между этими двумя шагами кто угодно может успеть быстрее Маши забрать биткоины, воспользовавшись уже ставшим публичным секретом.


    1. quantum Автор
      23.05.2018 21:40

      Биткойны блокируются таким образом, что их получит только Маша, даже если кто-то другой укажет секрет


  1. sgenie
    24.05.2018 00:44

    А если секрет неверен? Тогда 10 эфиров уже ушли, а 1 биткоин забран быть не может…


    1. quantum Автор
      24.05.2018 00:46

      Второй пользователь лочит свои средства на тот же самый секрет


      1. Tirael12
        24.05.2018 14:52
        -1

        Значит можно забрать средства и свои и второго пользователя, т.к. секрет один и тот же)))
        Гениально))


        1. quantum Автор
          24.05.2018 14:53

          (Шаг initiate) Даша блокирует 1 биткойн так, что его получить сможет только Маша, указав секрет, или сама Даша через двое суток после блокировки

          Маша с помощью смартконтракта блокирует 10 эфиров так, что их получить сможет только Даша, указав секрет, или сама Маша через сутки после блокировки