المواصفة الكاملة هي docs/spec.md في proxy-shopping-go. تلخّص هذه الصفحة أساسياتها.

المفاتيح

تُشتق كل المفاتيح من عبارة استرداد واحدة (BIP39)، مفتاح لكل غرض (وكلها secp256k1).

الغرض المسار
الهوية (Nostr) m/44'/1237'/0'/0/0 (NIP-06)
libp2p m/7333'/0'/0'
مفتاح BTC للطلب (المستخدم، المتسوّق) m/7333'/1'/{idx}' (يأتي idx من تجزئة معرّف الطلب)
مفتاح BTC للطلب (الوسيط الضامن) m/7333'/2'/{idx}. مفتاح xpub علني، لذا يستطيع الآخرون اشتقاقه والوسيط الضامن غير متصل
محفظة BTC m/84'/1'/0'/0/0
EVM m/44'/60'/0'/0/0

الثقة

kind يوقّعه المحتوى
30500 المنسّق (coordinator) تفويض لمشغّل؛ ويُسحب بـ revoked
30501 المشغّل (operator) قائمة المنطقة × المتسوّق × الوسيط الضامن، والمرحّلات ونقاط اتصال السلاسل الموصى بها
30502 / 30503 المتسوّق (shopper) / الوسيط الضامن (escrow) الملف التعريفي (الرسوم، والمناطق النقدية، وxpub، وعناوين الاستلام)
10050 الجميع المرحّلات التي يتلقّى عليها المرء رسائله

يحدّد إصدار الوسم v أيّها أحدث (عادةً وقت UNIX عند التوقيع). لا شيء تنتهي صلاحيته. تنتقل الأحداث عبر مرحّلات Nostr وعبر libp2p gossipsub معًا؛ وتمرّر عُقد Go ما تتلقاه من أحدهما إلى الآخر.

الرسائل

تُغلَّف الرسائل باستخدام NIP-59 (gift wrap ← seal ← المحتوى). المحتوى حدث موقَّع (kind 5400)، كي يتمكّن الوسيط الضامن من التحقق منه بصفته طرفًا ثالثًا في النزاع.

  • تُرسَل الرسالة إلى k على الأقل (افتراضيًا 2) من مرحّلات صندوق وارد المستلم.
  • يردّ المستلم بـ ack؛ ويعيد المرسل الإرسال حتى يتلقّاه.
  • الحد الأقصى للرسالة 28000 بايت. أما الأدلة الكبيرة مثل لقطات الشاشة فيُشار إليها بتجزئتها فقط؛ وفي النزاع تُرسَل إلى الوسيط الضامن على أجزاء كرسائل 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 (ارتفاعات الكتل). إذا لم يؤكّد المستخدم الاستلام أبدًا وانقضى T1، يستطيع المتسوّق أخذ الأموال وحده. وإذا اختفى المتسوّق، يستطيع المستخدم استردادها وحده بعد T2. ويجب على الوسيط الضامن أن يحكم في النزاع قبل T1.

USDC (Safe v1.4.1)

  • يحصل كل طلب على Safe بثلاثة مالكين وعتبة توقيع قدرها اثنان.
  • يأتي عنوانه من CREATE2، لذا يمكن حسابه مسبقًا من معرّف الطلب.
  • الأقفال الزمنية مُنفَّذة كوحدة Safe ‏(PSEscrowModule).
    • بعد t1، يستطيع المتسوّق أخذ الأموال عبر claimByShopper.
    • بعد t2، يستطيع المستخدم استردادها عبر refundToUser.
  • المدفوعات والأحكام معاملات SafeTx موقّعة بـ EIP-712. ويستخدم تقسيم الحكم MultiSendCallOnly.

ربط الهوية بالمفاتيح

يحمل كل طلب شراء (order.request) قيمة key_proof: توقيعًا بمفتاح السلسلة الذي يدخل في المحفظة متعددة التوقيع (مفتاح BTC للطلب أو حساب EVM)، يُثبت أنه يعود إلى الشخص نفسه صاحب هوية Nostr. ومن دونه، تستطيع هوية أخرى نسخ المفاتيح العامة للمستخدم إلى طلبها الخاص والادعاء أمام الوسيط الضامن بأنها المستخدم.

عنوان التسليم

يُشفَّر العنوان بمفتاح لمرة واحدة K ‏(XChaCha20-Poly1305).

  • يُغلَّف K بـ NIP-44 للمتسوّق، وبشكل منفصل للوسيط الضامن.
  • نسخة الوسيط الضامن ليست جزءًا من الطلب: بل تُسلَّم إلى المتسوّق في order.escrow_key (والطلب يحمل تجزئتها فقط). ويمرّرها المتسوّق (أو المستخدم) إلى الوسيط الضامن عند النزاع، لذا لا يستطيع الوسيط الضامن قراءة عنوان الطلبات التي لا نزاع فيها.

المناطق

تُطابَق الرموز بالبادئة: JP > JP-13 (طوكيو) > JP-13-13104 (شينجوكو). ويستخدم مستوى البلديات رموز الحكومات المحلية اليابانية.