swaponline / tether.research

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Atomic Swap between Omni Layer's currencies and other cryptocurrencies

Atomic Swap на Omni Layer

Предположим, что Алиса и Боб желают совершить межблокчейновый обмен криптовалют - Алиса хочет обменять a единиц какой-либо Omni валюты, например TetherUS (валюта имеет идентификатор валюты #31 в Mainnet, далее в тексте будем говорить только об этой валюте протокола Omni, так как она на данный момент она является самой популярной, но приведенный ниже алгоритм будет работать также для любой валюты протокола Omni) на b единиц криптовалюты работающей на другом блокчейне (Напомним, что Omni работает поверх блокчейна биткоина, конечно, по приведенному ниже алгоритму можно произвести обмен TetherUS на биткоины, но в силу их работы на одном блокчейне такой обмен может быть совершен другим, более эффективным способом).

Обозначения

A - блокчейн биткоина.
B - блокчейн той криптовалюты на которую производится обмен TetherUS.
a - сумма TetherUS, которую Алиса хочет обменять.
b - сумма криптовалюты исполюзующей блокчейн B, на которую Алиса хочет обменять свои a TetherUS.

Создание транзакции

1)Боб генерируетслучайное значение secret.

2)Боб высчитывает secretHash проведя следующую операцию: secretHash = RIPEMD160( secret )

3)Боб создает и передает в блокчейн B htlc-транзакцию, закрытую значением secretHash

4)Боб передает Алисе значение secretHash, и хэш созданной им в предыдущем пункте htlc-транзакции, для того чтобы Алиса могла убедиться в том, что в блокчейне B действительно присуствует нужная htlc-транзакция.

5)Алиса получив от Боба secretHash и хэш созданной Бобом htlc-транзакции, убеждается в том, что такая транзакция действительно находится в блокчейне B, и в том, что это действительно htlc-транзакция закрытая значением secretHash.

6)Алиса используя полученный secretHash создает следующую транзакцию и транслирует её в блокчейн биткоина:

Funding_tx

назовем такую транзакцию funding_tx, по факту это почти обычная биткоиновая htlc-транзакция которая используется в atomic swap с той лишь разницей, что в поле amount 546 сатошей - это минимальное количество биткоинов которое может быть на выходе транзакции, ниже этого значение протокол биткоина считает транзакцию пылью(dust) и не проводит её.

7)Алиса создает транзакцию по следующей схеме:

Redeem_tx

назовем такую транзакцию redeem_tx. Алиса создает такую транзакцию с двумя входами: первый - это вход ссылающиеся на выход funding_tx который содержит htlc скрипт этот вход Алиса не подписывает, то есть поле SigScript остается вообще пустым. второй вход - это вход ссылающиеся на любой непотраченый выход Алисы, главное условия чтобы на этом выходе было достаточное количество биткоинов для оплаты transaction fee, этот вход Алиса подписывает своим приватным ключом обязательно с типом подписи SIGHASH_ALL(то есть подписывает всю транзакцию кроме полей SigScript на входах транзакции, что делает эту транзакцию неизменяемой. выходы же транзакции представляют собой обыкновенный Simple Send a TetherUS от Алисы Бобу(подробнее о том, что такое Simple Send, payload и как это работает в другом разделе).

8)Алиса отправляет Бобу созданную в предыдущем пункте и подписанную собой redeem_tx.

9)Боб получив отправленную Алисой redeem_tx, проверяет её - просто просматривает входы, и выходы, убеждается в том, что это действительно транзакция которую должна была создать Алиса используя настоящий алгоритм. После чего Боб подписывает транзакцию своим приватным ключом и предоставляет значение secret в SigScript соответствующего входа redeem_tx.

10)Боб транслирует подписанную собоё транзакцию redeem_tx в блокчейн, тем самым производя перевод валюты TetherUS от Алисы себе. Примечание - перед проведением этого шага, еще нужно проверить, что на адресе Алисы действительно есть необходимая сумма TetherUS.

11)Алиса просматривая блокчейн A получает значение secret и используя его в блокчейне B переводит себе средства с созданной Бобом в пункте 3 htlc-транзакции. Обмен на этом завершается.

Очевидное примечание: естественно значение timelock используемое Бобом при создание htlc-транзакции должно быть значительно больше timelock который использует Алиса, так как её htlc-транзакция должна тратиться первее чем htlc созданный Бобом. Это необходимо для того, чтобы Боб не смог успеть потратить оба htlc

Что такое payload, Simple Send и как с ними работать?

Что такое Omni Layer?

Omni - это протокол, работающий над блокчейном биткоина, позволяющий всем желающим сконструировать свою собственную валюту(чем-то похоже на токены эфира, только со в значительной степени меньшими возможностями).

Как Omni проводит транзакции

Для проведения транзакции Omni нужно создать обычную биткоин транзакцию-перевод 546 сатошей(минимум) с дополнительным выходом - хранящим payload посредством оп-кода OP_RETURN, Пример такой транзакции. Payload - это обязательная часть любой Omni транзакции, является последовательностью байтов, содержащей всю информацию об транзакции.

Рассмотрим, какую информацию хранит в себе payload:

  1. transaction marker - 4 байта, обязательная часть любого Omni payload, всегда равна 0x6f6d6e69 - ASCII код omni. Если первые 4 байта последовательности не равны 0x6f6d6e69, то эта последовательность не является payload Omni. В коде смотреть строки 62-65.
  2. version - 2 байта, аналог версии транзакции в биткоине. Для работы описанного алгоритма, используется версия 0, или что то же самое 0x0000. Omni. В коде смотреть строки 68-69.
    3.transaction type - 2 байта, тип транзакции, для проведения atomic swap достатояно использовать только "Simple send" транзакции, simple send - это обычное отправление omni валюты со своего адреса на адрес получателя. simple send соответствует коду типа транзакции 0 то есть следующие 2 байта 0x0000. другие возможные типы транзакции существующие в омни. Omni. В коде смотреть строки 72-73.
    4.token identifier - 4 байта, идентификатор используемой валюты, Например TetherUS имеет идентификатор 31 или 0x0000001f. Все созданные протоколом Omni на данный момент времени токены можно увидеть по следующей ссыки - https://www.omniexplorer.info/properties/production . Omni. В коде смотреть строки 76-79.
  3. amount - 8 байт, для транзакции типа Simple send, это количество отправляемой валюты. Omni. В коде смотреть строки 82-86.

Как можно заметить, payload не хранит в себе адреса отправителей и получателей транзакции, эти адреса протокол определяет по биткоиновой транзакции в которой был обнаружен выход с payload'ом. Omni протокол просматривая входы определяет кто производит перевод, найдя среди входов транзакции p2pkh выход соответствующего адресу отправите. Если у транзакции несколько p2pkh входов, то оправителем считается адрес чей индекс входа минимальный. По аналогии определяется получая, просматривая уже все выходы транзакции, протокол находит выход p2pkh на адрес, этот адрес и считается адресом получателем omni-транзакции.

Таким образом для передачи от Алисы к Бобу, например 50,000,000 TetherUS, нужно создать биткоин транзакцию один из входов которой будет ссылаться на p2pkh выход соответствующий адресу Алисы, так же важно чтобы этот вход был первым в этой транзакции (индекс этого входа в полученной транзакции был бы минимален или вообще равен нулю). Один из выходов этой транзакции должен быть выход p2pkh на адрес Боба, и еще один из выходов был быть выход со следующей payload:

Payload

Пример такой транзакции:https://www.blockchain.com/ru/btc/tx/1f359902f666249b73f7bf8a1ea778259fa4b4eb904538e9713c487e091d4756, https://www.omniexplorer.info/search/1f359902f666249b73f7bf8a1ea778259fa4b4eb904538e9713c487e091d4756 .

Примеры

testnet

В следующих примерах:
Адрес Алисы - mgco3HEFvZ1iTaovhCEz1ZjF2wNR6Xu6oz.
Адрес Боба - mk3dDgfZPTn3aiNUFZAd3wWcDgV6S7gjAA

Баланс OMNI токенов Алисы:
Alice's_Balance

Баланс OMNI токенов Бобаи:
Alice's_Balance

Алиса меняет 1 OMNI на какое-либо число какой-либо криптовалюты Боба. Для проведение обмена необходимо сделать следующие шаги:

  1. Боб сгенерировал секретное значение -0xa8de8a6fc5592d13752c3623754bb9fa1124392ffdb090e409ce56726cda42ea

  2. Хэш секретного значения secretHash=0xf1883766dca084c36332d536e88e3966c2660251, который Боб отправил Алисе.

  3. Алиса создала следующую транзакию и отправила ее в блокчейн (funding_tx):
    funding_tx_Example
    Для наглядности выделем значение secretHash в explorer'е:
    funding_tx_Example (Боб делает в блокчейне B то же самое, но нас эти транзакции сейчас не особо интересует, да и для разных блокчейнов они могут различаться)

  4. Алиса создает следующую транзакцию(redeem_tx), подписывая свой вход SIGHASH_ALL алгоритмом: redeem_tx_without_Bob's_sign
    отправляет её Бобу на подпись(по канал связи между Алисой и Бобом), заметим, что на одном из входов отсуствует SigScript.

5.Боб подписывает предыдущую транзакцию и предоставляет secret, отправляет в блокчейн биткоина уже следующую транзакцию:
redeem_tx
Для наглядности выделем значение secret в explorer'е:
redeem_tx_Example

Таким образом, ввиду присуствия в транзакции, которую Боб последней транслировал в сеть выхода с payload'ом - это транзакция является следующей Omni транзакцией:
omni_tx_Example

Баланс OMNI токенов Алисы после проведения этих транзакции:
Alice's_Balance

Баланс OMNI токенов Боба после проведения этих транзакции:
Alice's_Balance

mainnet

В следующих примерах:
Адрес Алисы - 1QCEnxXU9QAsnqfufArkiuangGNGqdE4in.
Адрес Боба - 1341545XP8GdCiL96osVr3NefXpHbjzoCs

Баланс TetherUS токенов Алисы:

Alice's_Balance

Баланс TetherUS токенов Боба:

Alice's_Balance

Алиса меняет 1 TetherUS на 0.001 биткоинов Боба. Для проведение обмена необходимо сделать следующие шаги:

  1. Боб сгенерировал секретное значение -0x832f296f8f2cff3fe553dee413d8fc84def9102be547bd147c02c36b704ebafb

  2. Хэш секретного значения secretHash=0xbd52a5a7d6d5b8367ddfa8417c271c5639f85322.

  3. Боб создал следующую транзакию и отправила ее в блокчейн (funding_tx):

funding_tx_Example

  1. Боб передает secretHash значение Алисе.

  2. Алиса создала следующую транзакию и отправила ее в блокчейн (funding_tx):

funding_tx_Example

  1. Алиса создает следующую транзакцию(redeem_tx), подписывая свой вход SIGHASH_ALL алгоритмом:

redeem_tx_without_Bob's_sign
отправляет её Бобу на подпись(по канал связи между Алисой и Бобом), заметим, что на одном из входов отсуствует SigScript.

7.Боб подписывает предыдущую транзакцию и предоставляет secret, отправляет в блокчейн биткоина уже следующую транзакцию:

redeem_tx

Таким образом, ввиду присуствия в транзакции, которую Боб последней транслировал в сеть выхода с payload'ом - это транзакция является следующей Omni транзакцией:

omni_tx_Example

  1. Используя secret, который Алиса получила из redeem транзакции Боба, она создает и отправляет в сеть следующую транзакцию:

redeem_txB

Тем самым собирая себе биткоины.

Баланс TetherUS токенов Алисы после проведения этих транзакции:

Alice's_Balance

Баланс TetherUS токенов Боба после проведения этих транзакции:

Alice's_Balance

Как мы видим Боб получил свой TetherUS, а Алиса свои биткоины!

About


Languages

Language:C++ 100.0%