Atomic Swaps In A Nutshell

Состоянием на июль 2019 года существует порядка 2000 криптовалют, однако единого механизма обмена между разными блокчейнами нет. В этой статье мы упрощенно рассмотрим как устроена одна из технологий обмена без посредников — атомарные обмены (atomic swaps).
Приятного чтения!


logo


Atomic Swaps: что это такое и с чем его едят?


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


  • поддержка смарт контрактов (генератор этой самой "начальной" транзакции);
  • использование одной и той же криптомагии (хеш-функции).

Смарт контракты? Не, не слышали

Smart contracts — в широком смысле, "неприклонный" алгоритм, выполняющий действия при заведомо определенных условиях и никак иначе. В нашем случае смарт контракт можно расссматривать как большой черный ящик, которому скармливают адрес получателя, адрес отправителя, сумму отправки, время удержания денег и присваивают уникальный идентификаор (hash). На выходе получается желаемая транзакция с условиями.


Хеш и его друзья

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


Когда все идет гладко


Рассмотрим обмен между Алисой(да, да, Алиса уже не та) и Бобом. У Алисы есть Bitcoin (btc), у Боба есть Ether (eth). Оба персонажа имеют адреса на обоих блокчейнах. Прм.: большие знаки криптовалют символизируют блокчейны.



Алиса генерирует ключ (большое число) и скромно никому его не сообщает:



На основе ключа она считает хеш:



Создает контракт с уникальным идентификатором равным хешу:



Отправляет на контракт деньги. Теперь она не может их тратить определенное время(timelock):


Время истекло, или timelock

Timelock — время, после которого создатель контракта сможет вернуть деньги, если отправит транзакцию определенного типа (назовем ее "refund"). Для этой транзакции не нужен секретный ключ. Другой пользователь может снять деньги на адресс указаного в контракте получателя(важно: не на свой), если отправит транзакцию другого типа(назовем ее redeem) с указанием секретного ключа.


В целом механизм обработки транзакций контрактом следующий:


if (transaction_type == "refund"  and sender == contract_creater and timelock < now()) {
     send_to(creator_address);
} else if (transaction_type == "redeem"  and hash(secret_key) == contract_id) {
   send_to(receiver_address);
}


Алиса сообщает хеш Бобу. Теперь он может проаудировать (проверить) все поля контракта: убедиться в правильности адресов, сумме отправки, времени хранения денег на контракте(период втечении которого Алиса не сможет их снять):



Если все good, Боб создает конракт на втором блокчейне аналогичный Алисиному (с тем же идентификатором). Меняется получатель и, возможно сумма (если курс не 1 к 1).



Алиса аудирует контракт:



Если ее все утраивает, она создает транзакцию на Ethereum, которая тратит деньги на контракте Боба. Единственный способ это сделать — предоставить ключ. Теперь он известен:



Алиса получает eth:



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



Успех! Волки сыты, овцы целы!


Когда мир не идеален


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


Допустим Алиса как порядочная девушка отправила деньги на контракт, но Боб после аудита передумал расставаться с эфирами :



Алиса ждет истечения timelock, указаного в контракте (допустим, 48 часов) и возвращает кровные биточки:



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



Боб ждет время блокировки денег (оно обычно меньше Алисиного, чтобы Алиса не сняла деньги Боба в последнюю минуту, а потом не вернула свои; допустим 24 часа). Алиса возвращает свои деньги по истечению своего timelock.



Заключение


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


Подытожив, в обмене между А и C на блокчейнах Б1 и Б2 можно выделить такие шаги:


  1. инициализация контракта на Б1 участником А;
  2. аудирование контракта на Б1 участиком С;
  3. инициализация контракта на Б2 участником С;
  4. аудирование контракта на Б2 участиком А;
  5. предоставление ключа и снятие денег на Б2 участником А;
  6. получение ключа на Б2 участником С;
  7. снятие денег на Б1 участником С.

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

Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 10

    0
    Хорошая статья и картинки забавные, спасибо.) Но, мне кажется, было бы очень уместно объяснить, как организовать таймлок таким образом, что Алиса не может снять деньги до истечения срока, а остальные — могут.) Или я что-то не понял и таймлок устроен не так?
      +1
      Все верно, допишу)
      +1
      А если Боб перехватив транзакцию Алисы в пуле транзакций пока она еще не попала в блокчейн создаст конкурирующую транзакцию? Тогда по идее в эфириуме в пуле транзакций будут две конкурирующие транзакции, а которая из них попадет в блокчейн выбирать уже майнеру?
      Или от такого сценария тоже защита предусмотрена?
        0
        Предусмотрена. Деньги Боба на Эфириуме залочены на определенное время (в примере, 24 часа). В течение этого времени транзакции Алисы ничего не угрожает, поскольку транзакции Боба с этими деньгами будут невалидны. Транзакция Боба действительно попадет в пул, но не будет принята. Возможно, в спойлере «Время истекло, или timelock» вы найдете чуть больше информации.
          +1
          Похоже что описание в статье упрощенное.
          Вот тут в примере алгоритма видно что помимо секрета(который в вашей статье ключ хэширования) используются ECDA подписи и транзакцию Алисы нельзя изменить используя только секрет.
          A creates TX1: "Pay w BTC to <B's public key> if (x for H(x) known and signed by B) or (signed by A & B)"
          B creates TX3: "Pay v alt-coins to <A-public-key> if (x for H(x) known and signed by A) or (signed by A & B)"
            0
            есть только нюанс — временами при минимальной комиссии транзакция в биткойне может висеть неделю, а то и две. тогда время «лока» выйдет и можно будет отправить повторную транзакцию с бОльшей комиссией. в итоге эта транзакция пройдет, а первая, когда до нее дойдет дело, получит отказ. Защита пала. Уот так уот.
              0
              Вообще есть способ отправить две транзакции ссылающиеся на один выход. Когда то пришлось такое делать как раз из за маленькой комиссии. Пришлось сделать новый кошелек, импортировать туда приватный ключ и сформировать транзакцию в оффлайне, пока пул транзакций моей ноды не получил застрявшую. Со старым кошельком такое было сделать невозможно — он как раз хранил информацию о застрявшей и сразу ее в сеть отправлял.
              В блокчейн попала транзакция с большей комиссией.
                0
                Новый кошелек заводить было необязательно: abandontransaction RPC
                  0
                  это относительно свежая команда, раньше ее не было)
                  0
                  еще можно было не делать новый кошелек, если была копия старого до отправки) хотя вариант с импортом ключа вполне даже нормальный

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

          Самое читаемое