Giao thức
Đặc tả đầy đủ là docs/spec.md trong proxy-shopping-go. Trang này tóm tắt những điểm cốt lõi.
Khóa
Mọi khóa đều được dẫn xuất từ một mnemonic (BIP39), mỗi mục đích một khóa (tất cả đều là secp256k1).
| Mục đích | Đường dẫn |
|---|---|
| danh tính (Nostr) | m/44'/1237'/0'/0/0 (NIP-06) |
| libp2p | m/7333'/0'/0' |
| khóa BTC cho đơn hàng (người dùng, người mua hộ) | m/7333'/1'/{idx}' (idx lấy từ hash của mã đơn hàng) |
| khóa BTC cho đơn hàng (bên ký quỹ) | m/7333'/2'/{idx}. xpub được công khai, nên người khác có thể dẫn xuất nó ngay cả khi bên ký quỹ đang ngoại tuyến |
| ví BTC | m/84'/1'/0'/0/0 |
| EVM | m/44'/60'/0'/0/0 |
Lòng tin
| kind | Người ký | Nội dung |
|---|---|---|
| 30500 | điều phối viên (coordinator) | ủy quyền cho một nhà vận hành; thu hồi bằng revoked |
| 30501 | nhà vận hành (operator) | danh sách khu vực × người mua hộ × bên ký quỹ, các relay và endpoint chuỗi được đề xuất |
| 30502 / 30503 | người mua hộ (shopper) / bên ký quỹ (escrow) | hồ sơ (phí, khu vực tiền mặt, xpub, địa chỉ nhận tiền) |
| 10050 | mọi người | các relay nơi một người nhận thông điệp |
Phiên bản trong thẻ v quyết định cái nào mới hơn (thường là thời gian UNIX lúc ký). Không có gì hết hạn.
Sự kiện đi qua cả relay Nostr lẫn libp2p gossipsub; node Go chuyển tiếp những gì nhận được từ bên này sang bên kia.
Thông điệp
Thông điệp được bọc bằng NIP-59 (gift wrap → seal → nội dung). Nội dung là một sự kiện đã ký (kind 5400), để bên ký quỹ có thể kiểm chứng nó với tư cách bên thứ ba khi có tranh chấp.
- Một thông điệp được gửi đến ít nhất k (mặc định 2) relay hộp thư của người nhận.
- Người nhận trả lời bằng
ack; người gửi gửi lại cho đến khi nhận được. - Một thông điệp tối đa 28000 byte. Bằng chứng lớn như ảnh chụp màn hình chỉ được tham chiếu bằng hash;
khi có tranh chấp, nó được gửi đến bên ký quỹ thành từng phần dưới dạng thông điệp
attachment.
order.request + order.escrow_key → order.quote → order.accept → (funding) → order.funded + escrow.notice
→ order.purchased → order.shipping → order.release → order.completed
cancel and refund: order.cancel (before funding), order.refund (cooperative refund from the shopper)
other: ack (receipt), chat
dispute: dispute.open → dispute.evidence_request → dispute.evidence (+ attachment) → dispute.ruling → dispute.countersigned
report: report (to the operator)
BTC (P2WSH)
OP_IF
OP_2 <user> <shopper> <escrow> OP_3 OP_CHECKMULTISIG
OP_ELSE
OP_IF <T1> OP_CHECKLOCKTIMEVERIFY OP_DROP <shopper> OP_CHECKSIG
OP_ELSE <T2> OP_CHECKLOCKTIMEVERIFY OP_DROP <user> OP_CHECKSIG
OP_ENDIF
OP_ENDIF
T1 < T2 (chiều cao khối). Nếu người dùng không bao giờ xác nhận đã nhận hàng và T1 đã qua, người mua hộ có thể một mình lấy số tiền. Nếu người mua hộ biến mất, người dùng có thể một mình lấy lại tiền sau T2. Bên ký quỹ phải phân xử tranh chấp trước T1.
USDC (Safe v1.4.1)
- Mỗi đơn hàng có một Safe với ba chủ sở hữu và ngưỡng là hai.
- Địa chỉ của nó đến từ CREATE2, nên có thể tính trước từ mã đơn hàng.
- Timelock được hiện thực dưới dạng một module của Safe (
PSEscrowModule).- Sau t1, người mua hộ có thể lấy tiền bằng
claimByShopper. - Sau t2, người dùng có thể lấy lại tiền bằng
refundToUser.
- Sau t1, người mua hộ có thể lấy tiền bằng
- Việc thanh toán và phán quyết là các SafeTx được ký bằng EIP-712. Phần chia của phán quyết dùng
MultiSendCallOnly.
Gắn danh tính với các khóa
Mỗi yêu cầu đặt hàng (order.request) mang theo một key_proof:
một chữ ký bằng khóa chuỗi được đưa vào multisig (khóa BTC cho đơn hàng hoặc tài khoản EVM),
chứng minh rằng nó thuộc về cùng một người với danh tính Nostr.
Nếu không có nó, một danh tính khác có thể chép khóa công khai của người dùng vào yêu cầu của mình và tuyên bố với bên ký quỹ rằng mình là người dùng đó.
Địa chỉ giao hàng
Địa chỉ được mã hóa bằng một khóa dùng một lần K (XChaCha20-Poly1305).
- K được bọc bằng NIP-44 cho người mua hộ và, riêng biệt, cho bên ký quỹ.
- Bản dành cho bên ký quỹ không nằm trong yêu cầu: nó được giao cho người mua hộ trong
order.escrow_key(yêu cầu chỉ mang hash của nó). Người mua hộ (hoặc người dùng) chuyển nó cho bên ký quỹ khi có tranh chấp, nên bên ký quỹ không thể đọc địa chỉ của những đơn hàng không có tranh chấp.
Khu vực
Mã được so khớp theo tiền tố: JP > JP-13 (Tokyo) > JP-13-13104 (Shinjuku).
Cấp đô thị dùng mã chính quyền địa phương của Nhật Bản.