Эта статья — отчет о моем участии во втором этапе хакатоне, организованного компанией karma.red. Подробнее о хакатоне можно почитать на специальной страничке.
Для тех, кто любит читать код, а не статьи — репозиторий проекта.
Любители видео тоже не обижены :) В этом видео можно послушать краткое содержание статьи, посмотреть, как реализуется биржа шаг за шагом и увидеть вживую ее работу.
Статья еще одного участника хакатона из Владивостока (трем парням из Владика и одному из Улан-Уде организаторы по результатам онлайн этапа оплатили пролет и проживание в Москве).
Фотографии в статье — Вадима Францева, картинки — мои, из собранной на скорую руку презентации к защите проекта :) Итак, с формальностями покончено, поехали.
После выдачи заданий у меня стоял выбор — или взяться за децентрализованную биржу, или за третейский суд. В задаче с судом нужно было бы создать систему с репутацией, запрограммировать моделирование. Это было бы слишком просто и немного похоже на мой проект в первом этапе.
Работа децентрализованной биржи основана на атомарных межблокчейн обменах (свопах), в них я давно хотел разобраться, но все руки не доходили. Дав себе час на исследования (если бы не получилось разобраться, пришлось бы браться за суд) я пошел читать. Почитав документацию к реализации обменов для нескольких блокчейнов, я понял, что все легко и взялся за биржу.
Из чего состоит настоящая децентрализованная биржа:
- Движок. Это может быть собственный блокчейн или смартконтракт на другом блокчейне. В обязанности входит прием распоряжений (order, ордер) на покупку/продажу, их сопоставление (matching, матчинг)
- Блокчейны с поддержкой блокировки монет с разблокировкой по времени\секрету. Такие как ethereum, bitcoin и его форки, eos и т.д.
- Интерфейс (опционально). Для просмотра стакана, подачи распоряжений, уведомлений и т.д.
Для простоты на биржах можно производить обмен только через валюту биржи. В таком случае биржа сможет инициировать атомарные обмены в блокчейне биржи.
Т.к. кроме ethereum других блокчейнов со смарт-контактами сейчас нет, то его я и выбрал для прототипирования. В боевой бирже его использование кажется маловероятным из-за цены газа и его ограничений. В этом плане есть некоторая надежда на EOS.
Атомарные обмены
Подробную документацию вы можете прочитать тут. Очень краткий пересказ:
- У Даши есть 1 биткойн, у Маши 10 эфиров. Они хотят обменять их так, чтобы ни у кого не получилось друг друга обмануть
- Даша генерирует секрет и хэш от секрета
- (Шаг initiate) Даша блокирует 1 биткойн так, что его получить сможет только Маша, указав секрет, или сама Даша через двое суток после блокировки
- Даша передает ид транзакции с блокировкой и хэш от секрета Маше
- (Шаг participate) Маша проверяет транзакцию Даши и, если все верно, Маша с помощью смартконтракта блокирует 10 эфиров так, что их получить сможет только Даша, указав секрет, или сама Маша через сутки после блокировки
- Маша передает Даше ид транзакции с блокировкой средств
- (Шаг redeem) Даша проверяет транзакцию и, если сумма и дата блокировки верны, забирает 10 эфиров, указав секрет
- (Шаг redeem) Маша узнает секрет и забирает с помощью него биткойн
Собираем все вместе
- Даша отправляет ордер на продажу 1 биткойна по цене 10 эфиров за биткойн
- Маша вносит депозит в 20 эфиров на контракт биржи
- Маша отправляет ордер на покупку 2 биткойнов по цене 10 эфиров за биткойн
- Биржа матчит распоряжения
- Создается ордер для Маши на покупку 1 биткойна по цене 10 эфиров за биткойн
- Инициируется атомарный обмен. При этом 10 эфиров снимаются с баланса Маши и блокируются в контракте атомарного обмена. Т.к. для инициации нужен секрет и хэш от секрета, то покупатель (в данном случае Маша) должен внести на биржу запас хэшей секретов, для того, чтобы на каждый инициированный обмен был новый хэш.
- Дальше происходят все действия, описанные в предыдущем разделе, независимо от биржи
Моя реализация
За основу контракта атомарных свопов я взял эту реализацию: github.com/AltCoinExchange/ethatomicswap. Особенность данной реализации в том, что для нового атомарного обмена нет необходимости деплоить новый контракт. Все происходит в нем, как в неком реестре атомарных обменов.
В этот контракт я добавил возможность указывать вручную инициатора и второго участника обмена, для того, чтобы указывать их при инициации обмена из контракта биржи. Итоговая версия тут.
В движке биржи реализовано следующее:
- Добавление запаса хэшей
- Депозит и вывод средств
- Подача распоряжений на покупку и продажу, но с некоторыми ограничениями, обусловленными прототипностью контракта и ограничением времени:
- Нет никаких проверок на лимит газа: циклы не ограничиваются, в боевых контрактах так делать нельзя
- Для сопоставлений распоряжений берется встречное распоряжение не с лучшей ценой, а первое попавшееся
- Разделяются только подаваемые заявки при сопоставлении с более мелкой. Например, если была заявка на покупку 10 эфира, а вы подаете заявку на продажу 2х, то распоряжения не сматчатся.
- Инициирование атомарного обмена в контракте реестра атомарных обменов
Для того, чтобы не писать интерфейс, я обернул контракты в конструкторы для платформы smartz.io и задеплоил контракты через эти конструкторы, быстро получив тем самым интерфейс для управления контрактами.
Для демонстрации обмена эфира на биткойн у меня уже не оставалось времени, поэтому я показал обмен эфира из тестовой сети rinkeby на эфир их тестовой сети kovan:
Пара картинок и ссылок
Ссылки на панели управления для задеплоенных мной контрактов (нужно установить расширение браузера metamask для доступа в блокчейн ethereum из браузера). При желании вы можете задеплоить свои
- Панель управления реестром атомарных свопов в rinkeby
- Панель управления биржей в rinkeby
- Панель управления реестром атомарных свопов в kovan
Картинки для нежелающих ставить расширения:
Панель управления реестром
Панель управления биржей
Комментарии (6)
sgenie
24.05.2018 00:44А если секрет неверен? Тогда 10 эфиров уже ушли, а 1 биткоин забран быть не может…
quantum Автор
24.05.2018 00:46Второй пользователь лочит свои средства на тот же самый секрет
Tirael12
24.05.2018 14:52-1Значит можно забрать средства и свои и второго пользователя, т.к. секрет один и тот же)))
Гениально))quantum Автор
24.05.2018 14:53(Шаг initiate) Даша блокирует 1 биткойн так, что его получить сможет только Маша, указав секрет, или сама Даша через двое суток после блокировки
Маша с помощью смартконтракта блокирует 10 эфиров так, что их получить сможет только Даша, указав секрет, или сама Маша через сутки после блокировки
b0a
> (Шаг redeem) Даша проверяет транзакцию и, если сумма и дата блокировки верны, забирает 10 эфиров, указав секрет
> (Шаг redeem) Маша узнает секрет и забирает с помощью него биткойн
Если я правильно понимаю, между этими двумя шагами кто угодно может успеть быстрее Маши забрать биткоины, воспользовавшись уже ставшим публичным секретом.
quantum Автор
Биткойны блокируются таким образом, что их получит только Маша, даже если кто-то другой укажет секрет