MoneroP2P에서 USDT를 모네로로 교환하는 방식
짧은 답: 여러분의 USDT는 스마트 컨트랙트에 들어가며, 판매자가 비밀을 공개해야만 판매자에게 지급됩니다. 그 비밀이 바로, 판매자가 XMR을 넣어 둔 모네로 주소를 열기 위해 여러분에게 부족한 키의 절반입니다. 그래서 이 스왑은 “아토믹”합니다. 양쪽 모두 완료되거나, 둘 다 완료되지 않습니다. 문제가 생기면 컨트랙트가 USDT를 환불합니다.
처음이라면
자물쇠가 두 개 달린 금고를 떠올려 보세요.
- 여러분과 판매자(“메이커”)가 함께 모네로 주소를 만들고, 각자 키의 절반만 가집니다. 두 절반이 모두 없으면 아무도 안에 든 것을 옮길 수 없습니다.
- 여러분이 USDT를 컨트랙트에 입금합니다. 컨트랙트는 메이커의 키 절반을 검증할 수는 있지만, 그 값은 모릅니다.
- 메이커가 공유 주소에 XMR을 입금합니다. 앱이 정확한 금액이 들어왔는지 확인합니다.
- 여러분이 컨트랙트에서 문제없다고 확인합니다.
- 메이커가 USDT를 수령합니다. 이때 자신의 키 절반을 컨트랙트에 넘겨야 하고, 컨트랙트는 이를 온체인에 공개합니다.
- 앱이 그 키 절반을 가져와 여러분의 절반과 합치고, XMR을 여러분의 주소로 보냅니다.
메이커가 끝내 XMR을 입금하지 않으면, 여러분은 확인하지 않고 환불로 USDT를 돌려받습니다.
필요한 것
| 필요한 것 | 용도 |
|---|---|
| USDT가 든 브라우저 지갑(메타마스크 또는 호환 지갑) | 컨트랙트에 입금 |
| 네트워크 코인 조금(예: Arbitrum의 ETH) | 가스비 지불 |
| 모네로 주소 | 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가 있음을 드러내지 않고 증명하며, 컨트랙트가 확인하는 것이 바로 이것입니다. eigenwallet과 같은sigma_fun구성을 씁니다. - 컨트랙트. 스왑마다 에스크로 하나(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 프로토콜을 바탕으로 합니다.