تقني › من أرسل؟

التواقيع الحلقية

كيف تُثبت "أنني أملك أحد هذه المفاتيح" دون أن تقول أيها

باختصار

يُثبت التوقيع الحلقي أن الموقّع يعرف المفتاح الخاص لـواحد من n مفتاحًا عامًا في الحلقة، دون الكشف عن أيها. يستخدم Monero نسخة قابلة للربط — تأتي مع التوقيع key image كي لا يمكن إنفاق المخرج نفسه مرتين. المخطط المستخدم اليوم هو CLSAG، بحجم حلقة 16.

أولًا — توقيع Schnorr العادي

لفهم الحلقات، انظر أولًا كيف تُثبت معرفة مفتاح واحد x لـ P = x·G:

  1. يختار الموقّع α عشوائيًا ويحسب α·G.
  2. يحسب التحدي c = Hs(message ‖ α·G).
  3. يحسب الاستجابة s = α − c·x. والتوقيع هو (c, s).
  4. يعيد المتحقق بناء s·G + c·P = (α − cx)·G + c·x·G = α·G ويتحقق من أن Hs(message ‖ α·G) = c.

من دون معرفة x لا يمكنك إيجاد s لـ c معطى: فـ c يعتمد على α·G، الذي يجب تثبيته قبل أن تعرف c.

فكرة الحلقة: إغلاق سلسلة التحديات

لدينا الآن n مفتاحًا عامًا P₀ … Pₙ₋₁ ونعرف مفتاح واحد منها فقط، وليكن Pπ. الحيلة: يُحسب كل تحدٍّ من الحلقة السابقة في السلسلة، وتُغلق السلسلة على شكل حلقة.

P₀ (π) P₁ P₂ P₃ P₄ P₅ c₁ c₂ c₃ c₄ c₅ c₀ cᵢ₊₁ = Hs(m ‖ sᵢ·G + cᵢ·Pᵢ) π — المفتاح الحقيقي: الموضع الوحيد الذي "تُغلق" فيه الحلقة باستخدام x جميع sᵢ الأخرى مجرد قيم عشوائية
  1. في موضع المفتاح الحقيقي π، خذ α عشوائيًا واحسب التحدي التالي: c_{π+1} = Hs(m ‖ α·G).
  2. لكل مفتاح تالٍ (غريب) اختر sᵢ عشوائيًا واحسب c_{i+1} = Hs(m ‖ sᵢ·G + cᵢ·Pᵢ). ودُر حول الحلقة.
  3. عُد إلى π، وأنت الآن تعرف c_π. ولكي تُغلق الحلقة نحتاج إلى s_π·G + c_π·P_π = α·G، أي s_π = α − c_π·x. ولا يمكن حساب هذا إلا بمعرفة x.
  4. التوقيع: (c₀, s₀, s₁, …, sₙ₋₁).

يبدأ المتحقق من c₀، ويمر على كل حلقة في السلسلة بالصيغة نفسها، ويتحقق من أنه عاد إلى c₀ نفسه. جميع الحلقات تبدو متشابهة — ولا يمكنك أن تعرف من التوقيع أين حدث "الإغلاق".

قابلية الربط: LSAG

التوقيع الحلقي العادي لا يمنع إنفاق المخرج نفسه مرتين في حلقات مختلفة. لذا يستخدم Monero توقيعًا قابلًا للربط: ينشر الموقّع key image I = x·Hp(P_π) ويُثبت إضافةً في كل حلقة من السلسلة أن x نفسه يربط I وHp(Pᵢ):

c_{i+1} = Hs( m ‖ sᵢ·G + cᵢ·Pᵢ ‖ sᵢ·Hp(Pᵢ) + cᵢ·I )

استخدامان للمفتاح نفسه يعطيان I نفسها — فترفض الشبكة الإنفاق الثاني.

MLSAG ← CLSAG

في RingCT يجب إثبات عبارتين لا عبارة واحدة لكل عضو في الحلقة: معرفة مفتاح المخرج، وأن فرق الالتزامات التزام بالصفر (انظر RingCT). في البداية (2017) كان ذلك يتم بـ MLSAG — وهي في جوهرها حلقتان ملصقتان معًا: قيمتا s لكل عضو في الحلقة.

في أكتوبر 2020 (الانقسام الصلب v13) استُبدلت بـ CLSAG (LSAG الموجز): يُطوى المفتاحان في الموضع الواحد إلى مفتاح واحد عبر تركيبة خطية عشوائية بمعاملات من التجزئة. قيمة s واحدة لكل عضو. فصار التوقيع أصغر بنحو 25% وأسرع في التحقق.

W_i = μ_P·P_i + μ_C·(C_i − C̃)     prove knowledge of the key for W_π

تاريخ حجم الحلقة

متىالحد الأدنى للأعضاءتعليق
20141 (بلا مدخلات وهمية)إرث CryptoNote: كانت معاملات "0-mixin" مسموحة
20163انقسام صلب، حُظرت الحلقات الخالية من المدخلات الوهمية
20175مع RingCT
أبريل 20187بعد أبحاث حول التفاعلات المتسلسلة
أكتوبر 201811، ثابتأصبح حجم الحلقة موحدًا للجميع
أغسطس 202216، ثابتالانقسام الصلب v15 (مع Bulletproofs+ وview tags)

لماذا ثابت؟ لو اختار كل واحد حجمه، لكان حجم الحلقة غير المعتاد بصمة تكشف المحفظة.

لماذا لا 1000؟

يكبر حجم CLSAG وزمن التحقق منه خطيًا مع حجم الحلقة. حلقة من 1000 عضو تعني نحو 32 KB لكل مدخل ومزامنة للعقد أبطأ بعشرات المرات. بُحثت مخططات بحجم لوغاريتمي (Triptych، Arcturus، Seraphis)، لكن Monero اختار في النهاية الخيار الجذري — FCMP++، حيث "الحلقة" هي سلسلة الكتل كلها.