MoneroP2P 上的 USDT 兑换门罗币如何运作
简短回答: 你的 USDT 存放在一个智能合约中,只有卖方公开一个秘密,合约才会付款给他。而这个秘密正是你缺少的那一半密钥,用来打开卖方存放 XMR 的门罗币地址。所以这次兑换是「原子的」:要么双方都完成,要么都不完成。如果出现问题,合约会退还你的 USDT。
入门说明
想象一个有两把锁的保险箱:
- 你和卖方(「做市方」)一起创建一个门罗币地址,每人只持有一半密钥。没有两半密钥,谁也动不了里面的东西。
- 你把 USDT 存入合约。 合约能验证做市方那一半密钥,但并不知道它是什么。
- 做市方把 XMR 存入共享地址。应用核对到账金额是否正确。
- 你在合约中确认一切正常。
- 做市方领取 USDT,为此必须把他那一半密钥交给合约,合约会把它公开在链上。
- 应用取得这一半密钥,与你的那一半合并,并把 XMR 发送到你的地址。
如果做市方始终没有存入 XMR,你不要确认,通过退款拿回你的 USDT。
你需要准备
| 你需要 | 用途 |
|---|---|
| 装有 USDT 的浏览器钱包(MetaMask 或兼容钱包) | 存入合约 |
| 少量该网络的币(例如 Arbitrum 上的 ETH) | 支付 Gas |
| 一个门罗币地址 | 接收 XMR(如何创建钱包) |
| 一个受密码保护的恢复文件 | 关闭标签页后继续 |
两个期限(t0 和 t1)
| 时间点 | 你可以做什么 | 做市方可以做什么 |
|---|---|---|
| t0 之前,尚未确认 | 确认或退款 | 不能做任何事 |
| 你确认之后,或 t0 与 t1 之间 | 等待 | 领取(公开他的秘密) |
| 从 t1 起 | 退款 | 不能做任何事 |
重要: 如果你在 t0 之前既没有确认也没有退款,即使做市方从未存入 XMR,合约也会允许他领取。因此,当临近 t0 仍未核验到 XMR 时,应用会自动提示你退款;这也是你必须保存恢复文件的原因。
技术说明
- 半把密钥。 每一方各选一个 252 位的标量
s。共享地址的花费密钥为S_taker + S_maker(ed25519);查看密钥为v_taker + v_maker。 - DLEQ 证明。 每一方在不泄露的情况下证明,其 ed25519 密钥(门罗币)和一个 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 的协议。