MoneroP2PでのUSDTからMoneroへのスワップの仕組み
要点: あなたのUSDTはスマートコントラクトに入り、売り手が秘密を明かしたときにだけ売り手に支払われます。その秘密こそが、売り手がXMRを置いたMoneroアドレスを開くためにあなたに足りない、鍵の半分です。だからこのスワップは「アトミック」なのです。両方が完了するか、どちらも完了しないかのどちらかです。問題があれば、コントラクトがUSDTを返金します。
初心者向け
2つの錠がついた金庫を想像してください。
- あなたと売り手(「メイカー」)が一緒にMoneroアドレスを作り、それぞれが鍵の半分だけを持ちます。両方の半分がなければ、中身は誰も動かせません。
- あなたがUSDTをコントラクトに入金します。 コントラクトはメイカーの鍵の半分を検証できますが、その中身は知りません。
- メイカーが共有アドレスにXMRを入金します。 アプリが正しい金額が届いたかを確認します。
- あなたがコントラクト上で問題ないことを確認します。
- メイカーがUSDTを受け取ります。 そのためには自分の鍵の半分をコントラクトに渡す必要があり、コントラクトはそれをオンチェーンで公開します。
- アプリがその鍵の半分を取得し、あなたの半分と組み合わせて、XMRをあなたのアドレスに送ります。
メイカーがXMRを入金しなければ、あなたは確認せず、返金でUSDTを取り戻します。
必要なもの
| 必要なもの | 用途 |
|---|---|
| USDTの入ったブラウザウォレット(MetaMaskまたは互換) | コントラクトへの入金 |
| ネットワークのコイン少々(例:Arbitrum上のETH) | ガス代の支払い |
| Moneroアドレス | XMRの受け取り(ウォレットの作り方) |
| パスワードで保護された復元ファイル | タブを閉じたときの再開 |
2つの期限(t0とt1)
| タイミング | あなたにできること | メイカーにできること |
|---|---|---|
| t0より前、まだ確認していない | 確認または返金 | 何もできない |
| 確認した後、またはt0からt1の間 | 待つ | 受け取り(秘密を公開) |
| t1以降 | 返金 | 何もできない |
重要: t0までに確認も返金もしないと、メイカーがXMRを入金していなくても、コントラクトはメイカーの受け取りを許してしまいます。そのため、t0が近づいてもXMRが検証できないとアプリが自動で返金を求めます。また、復元ファイルを保管しておく必要があります。
技術的な説明
- 鍵の半分。 各当事者が252ビットのスカラー
sを選びます。共有アドレスの支出鍵はS_taker + S_maker(ed25519)、閲覧鍵はv_taker + v_makerです。 - DLEQ証明。 各当事者は、自分のed25519鍵(Monero)とsecp256k1鍵の背後に同じ
sがあることを、明かさずに証明します。コントラクトが確認するのはこの点です。eigenwalletと同じsigma_funの構成を使っています。 - コントラクト。 スワップごとに1つのエスクロー(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のプロトコルに基づいています。