Что такое Atomic Swaps и как это реализовать

Инструкция по блокчейн-разработке.

Введение

ACCS – Atomic cross-chain swap – позволяет двум сторонам производить обмен криптовалюты между двумя блокчейнами без посредников.

Пост подготовила команда компании по блокчейн разработке AXIOMA GROUP, и он со значительным погружением в тематику, поэтому актуален для читателей с уже имеющимися базовыми знаниями тематики.

Технология находится в процессе развития. Только часть блокчейнов поддерживается в настоящий момент. Для реализации обмена поддержка блокчкейном классических смарт-контрактов не требуется.

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

  • Непосредственно на блокчейне (on-chain) — часть блокчейнов уже поддерживается. (подробнее описано далее)
  • Используя какой-л. платежный канал (off-chain) — разработка сейчас идет только для Lightning Network и Raiden. Готовые реализации отсутствуют даже для тестовых сетей. (подробнее описано далее)

Технология базируется на инструменте, который называется Hashed Time-Locked Contract (HTLC). Это схема криптографического подтверждения легальности действий участников, при этом сами действия разнесены во времени. Как следует из названия, этот инструмент объединяет два механизма блокировки выхода транзакции: по времени (time lock) и по секретному числу , хэш которого записывается в блокчейн (hash lock). Такая схема обеспечивает обратимость операции, когда одна из сторон сделки “пропадает”, то есть не выполняет положенную часть действий. HTLC - проверенный инструмент, который используется, в частности, в Lightning network. Обязательными условиями возможности атомарного свопа на конкретной паре блокчейнов является поддержка в нем HTLC, а также реализация вычисления одинаковой хэш-функции.

Для исключения возможности мошенничества, блокчейн не должен позволять пластичность транзакции. Идентификатор транзакции не может произвольно меняться, т.к. это может ввести в заблуждение партнера по обмену. Активация Segwit на блокчейне закрывает эту потенциальную уязвимость и также является одним из необходимых условий поддержки ACCS.

Реализация ACCS на платежных каналах

Несмотря на то, что концепции, стоящие в основе ACCS и платежных каналов являются общими, следует различать эти два явления. Открыв платежный канал между собой, пара участников имеет возможность произвести множество транзакций. Для обмена между блокчейнами, потребуется открытый платежный канал в каждом из них. После этого, участники закрывают платежный канал, фиксируя таким образом факт обмена непосредственно в блокчейне.

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

Впервые подобный обмен был произведен между Bitcoin и Litecoin с помощью Lightning network [1].

Проведение ACCS на блокчейне

Концепция впервые описана в 2013 году Тиером Ноланом [2]. Первый Proof-of-Concept (POC) создан Decred: блог [3], исходные тексты и инструкции [4]. Первый обмен совершен в сентябре 2017 года между Decred и Litecoin [5]. С того времени код в репозитории был изменен. Мы рассмотрим здесь современную версию.

Две стороны (Алиса и Боб) договариваются об обмене. Алиса платит Бобу 1 BTC, Боб платит Алисе 10 LTC. Возникающие комиссии блокчейнов стороны договорились оплачивать самостоятельно.

Шаг 1. Алиса и Боб создают по 1 новому адресу и обмениваются ими. Алиса передает Бобу адрес АА в блокчейне LTC, Боб передает Алисе адрес АБ в блокчейне BTC.

Шаг 2. Алиса генерирует секретный ключ К и его односторонний хэш КХ. Алиса создает транзакцию - контракт ТА стоимостью 1 BTC. ТА попадает в блокчейн в момент времени Вта.

Шаг 3. Алиса сообщает Бобу детали ТА, из которых Боб узнает хэш КХ, а также проверяет контракт.

Шаг 4. Если все в порядке, Боб создает транзакцию - контракт ТБ стоимостью 10 LTC. ТБ попадает в блокчейн в момент времени ВТБ. Боб сообщает Алисе детали ТБ.

Шаг 5. Алиса проверяет контракт ТБ. Она должна убедиться, что в “Recipient address” установлен ее LTC адрес, который она сгенерировала на первом шаге и отправила Бобу. Стоимость контракта должна соответствовать первоначальной договоренности, то есть иметь значение 10 LTC. Значение поля “Secret hash” должно быть равно хэшу секретного ключа КХ, который Алиса отправила Бобу на шаге 2. Также необходимо, чтобы контракт еще был действителен, то есть установленный Locktime должен позволить завершить обмен.

Если все в порядке, Алиса переводит 10 LTC с транзакции ТБ на другой адрес своего кошелька. Этим действием Алиса сообщает Бобу ключ К. Теперь, когда Боб узнал ключ - он имеет доступ к транзакции ТА.

Боб переводит 1 BTC с транзакции ТА на другой адрес своего кошелька. На этом процесс обмена завершен.

Условия использования средств на контракте ТА: Боб может потратить средства, если он узнает ключ К, в промежуток времени (Вта, Вта + 48 часов). По истечении времени ВТА + 48 часов Алиса также может потратить неиспользованные средства.

Условия использования средств на контракте ТБ: Алиса может потратить средства, используя свой ключ К, в промежуток времени (Втб, Втб + 24 часа). По истечении времени Втб + 24 часа, Боб также может вернуть себе неиспользованные средства.

В итоге, у Алисы появилось 10 LTC минус комиссия LTC за транзакцию, Алиса потратила 1 BTC плюс комиссия BTC за транзакцию. У Боба появился 1 BTC минус комиссия BTC за транзакцию, он потратил 10 LTC плюс комиссия LTC за транзакцию.

Таким образом, благодаря использованию в контрактах задержки, у каждой стороны есть достаточно времени, чтобы получить свою сумму по контракту. Если Боб не создает контракт ТБ, Алиса через 48 часов может получить свои BTC назад. Если Алиса не получает средства с контракта ТБ, Боб сможет получить LTC назад через 24 часа. Алиса в этом случае через 48 часов заберет назад BTC, к которым не получит доступ Боб.

Поэтому данная сделка, состоящая из двух контрактов, называется атомарной. Каждый получает причитающуюся ему сумму, либо оба остаются при своих, за вычетом комиссии.

Обмен Bitcoin с Litecoin

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

Я буду выполнять обмен на Ubuntu 16.04. У меня уже установлен Bitcoin Core 0.17.0, скачан блокчейн testnet и создан кошелек. Я скачал Litecoin Core 0.16.3, также скачал testnet и создал кошелек. Затем я установил и настроил Golang и менеджер зависимостей dep. По этой ссылке находятся рекомендации по работе с проектами на Golang.

В репозитории есть подробная инструкция. Для сборки скриптов необходимо выполнить раздел “Build instructions”. После этого в консоли станут доступны команды btcatomicswap и ltcatomicswap.

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

Обмен Ethereum с Bitcoin

Блокчейн Ethereum по своему устройству имеет существенные отличия от Bitcoin. Его популярность и широкое распространение смарт-контрактов добавляют большую ценность ACCS. Изложенная ранее техника обмена применима и в данном случае, хотя есть некоторые изменения. Здесь для блокировки средств применяется полноценный смарт-контракт. Контракт содержит базу транзакций обмена, каждый обмен идентифицируется по хэшу секретного ключа.

Для проведения обмена устанавливаем Go Ethereum и скачиваем блокчейн. Аналогично предыдущему обмену, используем тестовую сеть.

$ geth --rinkeby --syncmode "fast" --rpc --rpcapi eth,net,web3,personal

Код, который был применен для проведения первого обмена между BTC и ETH, мы не будем использовать, потому что он основан на другой хэш-функции. Вместо этого будем применять производный код, который в настоящее время предложен в виде pull request в уже использованном нами при иллюстрации обмена BTC на LTC репозитории.

Добавим новый форк в этот репозиторий, переключимся на ветку, где реализованы нужные функции. После этого подготовим команду ethatomicswap.

$ git checkout ethatomicswap

$ dep ensure

$ go install ./cmd/ethatomicswap/

Нам понадобится адрес смарт-контракта, который сможет хранить данные атомарных свопов. Репозиторий содержит код смарт-контракта AtomicSwap. Используя его, мы добавим свой смарт-контракт в блокчейн. В качестве альтернативы можно использовать адрес добавленного ранее контракта с аналогичной спецификацией (имеющего аналогичный ABI).

$ ethatomicswap -testnet deploycontract

Deploy fee: 0.001179986 ETH

Chain ID: 4

Contract Address: 2661cbaa149721f7c5fab3fa88c1ea564a683631

Deploy transaction (c14abf6683166eea95edac03980e94e734444671bd0a2d940bcc958c5bbb940c):

f9111e0...313d0d2c

Publish deploy transaction? [y/N] y

Published deploy transaction (c14abf6683166eea95edac03980e94e734444671bd0a2d940bcc958c5bbb940c)

Аналогично предыдущему обмену, новый эксперимент также состоит из 7 шагов и повторяет изложенный выше процесс. Разница заключается в том, что на месте Litecoin теперь находится Ethereum.

Алиса хочет обменять свои 0.2 BTC на 2 ETH, принадлежащие Бобу.

Вывод по результатам экспериментов

Для простоты мы рассмотрели здесь только успешные примеры обмена. Однако нужно понимать, что на любой стадии участники обмена могут вернуть свои средства, если другая сторона бездействует или пытается хитрить. Конечно, для этого требуется подождать, пока снимется блокировка средств. В нашем примере это 2 дня для Алисы и 1 день для Боба, что достаточно долго.

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

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

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

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

Существующие продукты

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

Обменников, которые реализуют честный ACCS, не так много. Поскольку Lightning Network еще далека от повсеместного внедрения, рассмотрим только on-chain решения.

Swap.Online - веб-кошелек криптовалют с возможностью обмена через atomic swap [6]. Ключи пользователей хранятся на стороне клиента. Помимо Bitcoin, Ethereum и множества ERC-20 токенов, осенью 2018 года добавили возможность обмена USDT, EOS, Litecoin.

Имеется возможность создавать новую заявку на обмен, либо выбирать из уже созданных (через Orderbook). При создании заявки можно указать, разрешать ли частичный выкуп. Когда встречная заявка найдена, производится обмен. Он осуществляется автоматически, при условии, что кошелек в данный момент открыт. Оба пользователя создают транзакции на адреса друг друга, затем поочередно забирают полученные средства, путем отправки второй транзакции. Время на операцию обмена составляет 3 часа, после которых имеется возможность вернуть свои средства. Если для обмена в кошельке недостаточно средств, показывается диалог, приглашающий внести недостающую сумму на свой кошелек, включая комиссию за транзакцию. В результате обмена пользователь получает обменянную сумму минус комиссия за вторую транзакцию.

Atomic Wallet - мобильное и десктопное приложение - кошелек с функцией обмена [7]. Имеет широкий набор криптовалют (25) и токенов (более 300). Приложение поддерживает любые стандартные токены, достаточно перевести их на свой Ethereum адрес. Первые выполнили ACCS-обмен Qtum и Bitcoin [8]. Помимо обычного обмена через обменники-партнеры, имеется раздел с атомарными свопами, где можно просматривать существующие заявки, размещать свои и следить за историей своих обменных операций. Поддерживается обмен между Bitcoin, Litecoin и Qtum.

Еще один сервис, Altcoin.io предлагает решение децентрализованной биржи. Спустя месяц после первого обмена между Decred и Litecoin, энтузиасты из Altcoin.io объявили об осуществлении первой ACCS-операции между Ethereum и Bitcoin [9]. После первых испытаний ACCS, в начале 2018 года они запустили в testnet кошелек с функцией атомарных свопов [10]. Летом того же года код кошелька был выложен в открытый доступ, поскольку его намеченный на конец года релиз был отменен. Компания сконцентрировалась на децентрализованной бирже в сети Plasma [11]. В открытый доступ выложен сайт на Angular и кошелек, который представляет из себя набор библиотек для реализации функций кошелька и атомарных свопов. Код кошелька достаточно сырой, судя по всему, проект требует серьезной доработки перед запуском в mainnet.

Ссылки

Пост подготовила команда компании AXIOMA GROUP.

Пообщаемся в комментариях?

33
Начать дискуссию