تقني › من استلم؟

العناوين لمرة واحدة

العناوين الخفية: إرسال المال إلى عنوان دون كتابته على سلسلة الكتل

باختصار

يختار المرسِل r عشوائيًا، وينشر R = r·G، ويرسل المال إلى المفتاح لمرة واحدة P = Hs(8·r·A ‖ i)·G + B. ويعثر عليه المستلم بحساب الشيء نفسه عبر a: Hs(8·a·R ‖ i)·G + B. وينفقه بالمفتاح الخاص x = Hs(8·a·R ‖ i) + b.

المهمة

نريد:

  1. ألا يظهر على سلسلة الكتل عنوان المستلم ولا أي شيء يتكرر عبر المدفوعات إلى الشخص نفسه؛
  2. أن يعثر المستلم على مخرجاته بنفسه، دون التواصل مع المرسِل؛
  3. ألا يستطيع إنفاق المخرج إلا المستلم.

الحل هو تبادل مفاتيح Diffie–Hellman مدمج في كل معاملة.

خطوة بخطوة

المرسِل المستلم r (عشوائي) R = r·G يعرف العنوان: A, B السر المشترك: 8·r·A P = Hs(8rA ‖ i)·G + B إلى السلسلة: R وP (ولا شيء آخر عن العنوان) a, b (مفاتيحه) يرى R في المعاملة السر المشترك: 8·a·R = 8·a·r·G = 8·r·A يتحقق: Hs(8aR ‖ i)·G + B == P ?

1. يختار المرسِل r عشوائيًا

r عشوائي جديد (المفتاح الخاص للمعاملة) لكل معاملة. وتُكتب نسخته العامة R = r·G (المفتاح العام للمعاملة) في حقل tx_extra الخاص بالمعاملة.

2. السر المشترك

يحسب المرسِل 8·r·A (حيث A هو مفتاح العرض العام من العنوان). ولاحقًا يحسب المستلم 8·a·R. إنها النقطة نفسها، لأن a·R = a·r·G = r·a·G = r·A. وفي شيفرة Monero تُسمّى اشتقاق المفتاح (key derivation).

العامل 8 (العامل المرافق) "ينظّف" النقطة من أي مكوّن ذي رتبة صغيرة: فحتى لو قدّم أحدهم R خبيثًا، تقع النتيجة في الزمرة الجزئية الصحيحة.

3. المفتاح لمرة واحدة

P = Hs( 8·r·A ‖ i )·G + B i هو فهرس المخرج في المعاملة (varint)، لذا يحصل مخرجان من المعاملة نفسها على مفتاحين مختلفين

هذا هو العنوان لمرة واحدة (المفتاح العام للمخرج). يبدو كنقطة عشوائية: فمن دون a أو r لا يوجد ما يُقارَن به.

4. المستلم يمسح

لكل معاملة جديدة ولكل مخرج i تحسب المحفظة Hs(8·a·R ‖ i)·G + B وتقارنه بـ P. إذا تطابقا — فالمخرج لنا. ولا يحتاج هذا إلا إلى مفتاح العرض a والمفتاح العام B — لذا تستطيع محفظة العرض فقط العثور على المدفوعات الواردة.

5. المستلم ينفق

المفتاح الخاص للمخرج لمرة واحدة:

x = Hs( 8·a·R ‖ i ) + b التحقق: x·G = Hs(…)·G + b·G = Hs(…)·G + B = P ✓

يتطلب هذا مفتاح الإنفاق b. يوقّع المفتاح x عملية الإنفاق، ومنه تُحسب key image.

المبلغ أيضًا مشفّر بالسر المشترك

يُشتق قناع للمبلغ من السر المشترك نفسه. يُخزَّن مبلغ المخرج (8 بايتات) على شكل amount ⊕ Keccak("amount" ‖ Hs(8rA ‖ i))[0..8]، وعامل التعمية للالتزام على شكل Hs("commitment_mask" ‖ Hs(8rA ‖ i)). يحسب المستلم الشيء نفسه ويفك تشفير المبلغ. المزيد في التزامات Pedersen.

نقاط الضعف

  • المسح مكلف: عملية ضرب نقطة لكل مخرج في كل معاملة. عولج ذلك جزئيًا بـ view tags.
  • هجوم Janus: المرسِل الذي يشك في أن عنوانين فرعيين يعودان لشخص واحد يمكنه بناء مخرج من أجزاء الاثنين ومعرفة ما إذا كان المستلم "سيلاحظ" الدفعة. لدى المحافظ حماية جزئية؛ وCarrot يسدّها تمامًا.
  • المرسِل يعرف r ويستطيع أن يُثبت لطرف ثالث أنه دفع إلى عنوان معيّن (وهذا مفيد أحيانًا — "إثبات الدفع").