التواقيع الحلقية
كيف تُثبت "أنني أملك أحد هذه المفاتيح" دون أن تقول أيها
يُثبت التوقيع الحلقي أن الموقّع يعرف المفتاح الخاص لـواحد من n مفتاحًا عامًا في الحلقة، دون الكشف عن أيها. يستخدم Monero نسخة قابلة للربط — تأتي مع التوقيع key image كي لا يمكن إنفاق المخرج نفسه مرتين. المخطط المستخدم اليوم هو CLSAG، بحجم حلقة 16.
أولًا — توقيع Schnorr العادي
لفهم الحلقات، انظر أولًا كيف تُثبت معرفة مفتاح واحد x لـ P = x·G:
- يختار الموقّع
αعشوائيًا ويحسبα·G. - يحسب التحدي
c = Hs(message ‖ α·G). - يحسب الاستجابة
s = α − c·x. والتوقيع هو(c, s). - يعيد المتحقق بناء
s·G + c·P = (α − cx)·G + c·x·G = α·Gويتحقق من أنHs(message ‖ α·G) = c.
من دون معرفة x لا يمكنك إيجاد s لـ c معطى: فـ c يعتمد على α·G، الذي يجب تثبيته قبل أن تعرف c.
فكرة الحلقة: إغلاق سلسلة التحديات
لدينا الآن n مفتاحًا عامًا P₀ … Pₙ₋₁ ونعرف مفتاح واحد منها فقط، وليكن Pπ. الحيلة: يُحسب كل تحدٍّ من الحلقة السابقة في السلسلة، وتُغلق السلسلة على شكل حلقة.
- في موضع المفتاح الحقيقي π، خذ
αعشوائيًا واحسب التحدي التالي:c_{π+1} = Hs(m ‖ α·G). - لكل مفتاح تالٍ (غريب) اختر
sᵢعشوائيًا واحسبc_{i+1} = Hs(m ‖ sᵢ·G + cᵢ·Pᵢ). ودُر حول الحلقة. - عُد إلى π، وأنت الآن تعرف
c_π. ولكي تُغلق الحلقة نحتاج إلىs_π·G + c_π·P_π = α·G، أيs_π = α − c_π·x. ولا يمكن حساب هذا إلا بمعرفة x. - التوقيع:
(c₀, s₀, s₁, …, sₙ₋₁).
يبدأ المتحقق من c₀، ويمر على كل حلقة في السلسلة بالصيغة نفسها، ويتحقق من أنه عاد إلى c₀ نفسه. جميع الحلقات تبدو متشابهة — ولا يمكنك أن تعرف من التوقيع أين حدث "الإغلاق".
قابلية الربط: LSAG
التوقيع الحلقي العادي لا يمنع إنفاق المخرج نفسه مرتين في حلقات مختلفة. لذا يستخدم Monero توقيعًا قابلًا للربط: ينشر الموقّع key image I = x·Hp(P_π) ويُثبت إضافةً في كل حلقة من السلسلة أن x نفسه يربط I وHp(Pᵢ):
استخدامان للمفتاح نفسه يعطيان I نفسها — فترفض الشبكة الإنفاق الثاني.
MLSAG ← CLSAG
في RingCT يجب إثبات عبارتين لا عبارة واحدة لكل عضو في الحلقة: معرفة مفتاح المخرج، وأن فرق الالتزامات التزام بالصفر (انظر RingCT). في البداية (2017) كان ذلك يتم بـ MLSAG — وهي في جوهرها حلقتان ملصقتان معًا: قيمتا s لكل عضو في الحلقة.
في أكتوبر 2020 (الانقسام الصلب v13) استُبدلت بـ CLSAG (LSAG الموجز): يُطوى المفتاحان في الموضع الواحد إلى مفتاح واحد عبر تركيبة خطية عشوائية بمعاملات من التجزئة. قيمة s واحدة لكل عضو. فصار التوقيع أصغر بنحو 25% وأسرع في التحقق.
تاريخ حجم الحلقة
| متى | الحد الأدنى للأعضاء | تعليق |
|---|---|---|
| 2014 | 1 (بلا مدخلات وهمية) | إرث CryptoNote: كانت معاملات "0-mixin" مسموحة |
| 2016 | 3 | انقسام صلب، حُظرت الحلقات الخالية من المدخلات الوهمية |
| 2017 | 5 | مع RingCT |
| أبريل 2018 | 7 | بعد أبحاث حول التفاعلات المتسلسلة |
| أكتوبر 2018 | 11، ثابت | أصبح حجم الحلقة موحدًا للجميع |
| أغسطس 2022 | 16، ثابت | الانقسام الصلب v15 (مع Bulletproofs+ وview tags) |
لماذا ثابت؟ لو اختار كل واحد حجمه، لكان حجم الحلقة غير المعتاد بصمة تكشف المحفظة.
لماذا لا 1000؟
يكبر حجم CLSAG وزمن التحقق منه خطيًا مع حجم الحلقة. حلقة من 1000 عضو تعني نحو 32 KB لكل مدخل ومزامنة للعقد أبطأ بعشرات المرات. بُحثت مخططات بحجم لوغاريتمي (Triptych، Arcturus، Seraphis)، لكن Monero اختار في النهاية الخيار الجذري — FCMP++، حيث "الحلقة" هي سلسلة الكتل كلها.