Как работает обмен USDT на Monero в MoneroP2P
Коротко: ваши USDT лежат в смарт-контракте, который может заплатить продавцу, только если тот раскроет секрет. Этот же секрет — недостающая вам половина ключа от адреса Monero, куда продавец положил XMR. Поэтому своп «атомарный»: либо завершаются обе стороны, либо ни одна. Если что-то пойдёт не так, контракт вернёт ваши USDT.
Для новичков
Представьте сейф с двумя замками:
- Вы и продавец («мейкер») вместе создаёте адрес Monero, и у каждого только половина ключа. Без обеих половин никто не может переместить то, что там лежит.
- Вы вносите USDT в контракт. Контракт умеет проверять половину ключа мейкера, но не знает её.
- Мейкер вносит XMR на общий адрес. Приложение проверяет, что пришла нужная сумма.
- Вы подтверждаете в контракте, что всё в порядке.
- Мейкер забирает USDT и для этого должен передать контракту свою половину ключа, а контракт публикует её в блокчейне.
- Приложение берёт эту половину ключа, соединяет с вашей и отправляет XMR на ваш адрес.
Если мейкер так и не внесёт XMR, вы не подтверждаете и получаете свои USDT обратно через возврат.
Что нужно
| Что нужно | Зачем |
|---|---|
| Браузерный кошелёк (MetaMask или совместимый) с USDT | Внести депозит в контракт |
| Немного монеты сети (например, ETH в Arbitrum) | Оплатить газ |
| Адрес Monero | Получить XMR (как создать кошелёк) |
| Файл восстановления, защищённый паролем | Продолжить своп, если вы закроете вкладку |
Два срока (t0 и t1)
| Момент | Что можете вы | Что может мейкер |
|---|---|---|
| До t0, ещё без подтверждения | Подтвердить или сделать возврат | Ничего |
| После подтверждения или между t0 и t1 | Ждать | Забрать оплату (раскрыв свой секрет) |
| Начиная с t1 | Сделать возврат | Ничего |
Важно: если вы не подтвердите и не сделаете возврат до t0, контракт позволит мейкеру забрать оплату, даже если он не внёс XMR. Поэтому приложение само просит сделать возврат, когда XMR не проверены к приближению t0, и поэтому нужно хранить файл восстановления.
Техническое объяснение
- Половины ключа. Каждая сторона выбирает 252-битный скаляр
s. Ключ траты общего адреса —S_taker + S_maker(ed25519); ключ просмотра —v_taker + v_maker. - Доказательство DLEQ. Каждая сторона доказывает, не раскрывая его, что за её ключом ed25519 (Monero) и ключом secp256k1 стоит один и тот же
s— именно это проверяет контракт. Мы используем конструкциюsigma_fun, как в eigenwallet. - Контракт. Один эскроу на своп (клон EIP-1167) хранит
keccak(s_maker·G)иkeccak(s_taker·G).claim(s_maker)иrefund(s_taker)проверяют секрет с помощью трюка сecrecover. Их окна никогда не пересекаются. - Проверка XMR. Мейкер отправляет ID транзакции и ключ транзакции; приложение проверяет платёж через
check_tx_key, не синхронизируя весь кошелёк. - Вывод. Как только секрет мейкера появляется в событии
Claimed, приложение вычисляетs_taker + s_makerи отправляет XMR на ваш адрес.
Полное описание — в документе об архитектуре (на испанском); протокол основан на работе AthanorLabs.