نواصل سلسلتنا حول تصميم Monero blockchain ، وسوف تركز مقالة اليوم على بروتوكول RingCT (Ring Confidential Transactions) ، الذي يقدم معاملات سرية وتوقيعات حلقة جديدة. لسوء الحظ ، هناك القليل من المعلومات على الإنترنت حول كيفية عملها ، وحاولنا سد هذه الفجوة.
سنتحدث عن كيفية إخفاء الشبكة لمقدار عمليات النقل باستخدام هذا البروتوكول ، ولماذا تخلوا عن توقيعات الحلقة الكلاسيكية لـ cryptonote وكيف ستتطور هذه التكنولوجيا أكثر.
نظرًا لأن هذا البروتوكول هو أحد أكثر التقنيات تعقيدًا في Monero ، سيحتاج القارئ إلى معرفة أساسية بهيكل blockchain وقليل من المعرفة في تشفير المنحنى الإهليلجي (لتحديث هذه المعرفة ، يمكنك قراءة الفصول الأولى من السابقة. مقال عن
بروتوكول RingCT
أحد الهجمات المحتملة على عملات cryptonote هو تحليل blockchain بناءً على معرفة مقدار ووقت المعاملة المرسلة. هذا يسمح
وتجدر الإشارة إلى أن فكرة إخفاء المبالغ ليست جديدة. كان من أوائل من وصفها مطور Bitcoin Core جريج ماكسويل في كتابه
من بين أمور أخرى ، يساعد البروتوكول في التخلص من مشاكل خلط المخرجات المتربة - مخرجات بمبلغ صغير (يتم الحصول عليها عادةً في شكل تغيير من المعاملات) التي تسببت في مشاكل أكثر مما تستحق.
في يناير 2017 ، كانت شبكة Monero شديدة الانقسام ، مما سمح باستخدام اختياري للمعاملات السرية. وبالفعل في سبتمبر من نفس العام ، بدءًا من الإصدار 6 ، أصبحت هذه المعاملات هي المعاملات الوحيدة المسموح بها على الشبكة.
تستخدم RingCT عدة آليات في وقت واحد: تواقيع جماعية مجهولة متعددة الطبقات مرتبطة تلقائيًا (توقيع مجموعة مجهول متعدد الطبقات قابل للربط ، يشار إليه فيما يلي باسم MLSAG) ، مخطط الالتزام (التزامات بيدرسن) وبراهين النطاق (هذا المصطلح ليس له ترجمة ثابتة إلى اللغة الروسية).
يقدم بروتوكول RingCT نوعين من المعاملات مجهولة المصدر: بسيطة وكاملة. تنشأ المحفظة الأولى عندما تستخدم المعاملة أكثر من إدخال واحد ، والثاني - في الوضع المعاكس. تختلف في التحقق من صحة مبالغ المعاملات والبيانات الموقعة بواسطة توقيع MLSAG (المزيد حول هذا أدناه). علاوة على ذلك ، يمكن إنشاء معاملات من النوع الكامل بأي عدد من المدخلات ، ولا يوجد فرق أساسي. في هذا الكتاب
توقيع MLSAG
تذكر ما هي مدخلات المعاملة الموقعة. كل معاملة تنفق بعض المال وتولد. يتم إنشاء الأموال عن طريق إنشاء مخرجات المعاملات (القياس المباشر هو الأوراق النقدية) ، والمخرجات التي تنفقها المعاملة (لأننا في الحياة الواقعية ننفق الأوراق النقدية بالضبط) يصبح المدخل (بعناية ، من السهل جدًا الخلط هنا).
يشير الإدخال إلى مخرجات متعددة ولكنه يستهلك واحدًا فقط ، وبالتالي يتم إنشاء "شاشة دخان" لتجعل من الصعب تحليل تاريخ عمليات النقل. إذا كانت المعاملة تحتوي على أكثر من إدخال واحد ، فيمكن تمثيل هذا الهيكل كمصفوفة ، حيث تكون الصفوف عبارة عن مدخلات والأعمدة عبارة عن مخرجات معجن. لإثبات للشبكة أن المعاملة تنفق مخرجاتها بالضبط (تعرف مفاتيحها السرية) ، يتم توقيع المدخلات بتوقيع خاتم. يضمن هذا التوقيع أن الموقع يعرف المفاتيح السرية لجميع عناصر أي من الأعمدة.
لم تعد المعاملات السرية تستخدم الكلاسيكيات
يطلق عليهم اسم متعدد الطبقات لأنهم يوقعون على عدة مدخلات في وقت واحد ، كل منها مختلط مع العديد من المدخلات الأخرى ، أي أن المصفوفة موقعة وليس صفًا واحدًا. كما سنرى لاحقًا ، يساعد هذا في توفير حجم التوقيع.
دعونا نلقي نظرة على كيفية تكوين توقيع الحلقة باستخدام مثال المعاملة التي تنفق ناتجين حقيقيين وتستخدم m - 2 عشوائيًا من blockchain للمزج. تشير إلى المفاتيح العامة للمخرجات التي ننفقها
، والصور الرئيسية لهم ، على التوالي: وهكذا ، نحصل على مصفوفة بالحجم 2 × م. نحتاج أولاً إلى حساب ما يسمى التحديات لكل زوج من المخرجات:
نبدأ الحسابات بالمخرجات التي ننفقها باستخدام مفاتيحها العامة:وأرقام عشوائيةنتيجة لذلك ، نحصل على القيم:
، والتي نستخدمها لحساب التحدي
الزوج التالي من المخرجات (لتسهيل فهم ما نستبدل به ، قمنا بتسليط الضوء على هذه القيم بألوان مختلفة). يتم حساب جميع القيم التالية في دائرة وفقًا للصيغ الموضحة في الرسم التوضيحي الأول. يتم حساب التحدي c أخيرًا لزوج من المخرجات الحقيقية.
كما نرى ، في جميع الأعمدة ، باستثناء العمود الذي يحتوي على مخرجات حقيقية ، يتم استخدام الأرقام المولدة عشوائيًا.. إلى πالعمود العاشر ، نحتاجها أيضًا. دعونا نتحولفي ق:
التوقيع نفسه عبارة عن مجموعة من كل هذه القيم:
علاوة على ذلك ، يتم كتابة هذه البيانات في المعاملة.
كما نرى ، يحتوي MLSAG على تحدي واحد فقط c0، والذي يسمح لك بحفظ حجم التوقيع (الذي يتطلب بالفعل مساحة كبيرة). علاوة على ذلك ، أي مدقق باستخدام البيانات، يستعيد القيم c1 ، ... ، cm ويتحقق من ذلك. وهكذا ، تم إغلاق الخاتم الخاص بنا والتحقق من التوقيع.
بالنسبة لمعاملات RingCT من النوع الكامل ، يتم إضافة صف آخر إلى المصفوفة بمخرجات مختلطة ، لكننا سنتحدث عن هذا أدناه.
التزامات بيدرسن
تُستخدم التزامات Monero لإخفاء مبلغ التحويلات واستخدام الخيار الأكثر شيوعًا - التزامات Pedersen. بالمناسبة ، حقيقة مثيرة للاهتمام - في البداية ، اقترح المطورون إخفاء الكميات بالخلط المعتاد ، أي إضافة مخرجات بكميات عشوائية من أجل إدخال عدم اليقين ، لكنهم تحولوا بعد ذلك إلى الالتزامات (ليس حقيقة أنهم حفظ على حجم الصفقة كما سنرى أدناه).
بشكل عام ، يبدو الالتزام كما يلي:
حيث C - معنى الالتزام نفسه ، a - مبلغ مخفي H هي نقطة ثابتة على منحنى إهليلجي (مولد إضافي) ، و x - بعض القناع التعسفي الذي يخفي عاملًا عشوائيًا. القناع مطلوب هنا حتى لا يتمكن الطرف الثالث من التقاط قيمة الالتزام بالتعداد البسيط.
عند إنشاء مخرجات جديدة ، تحسب المحفظة التزامًا لها ، وعند إنفاقها ، فإنها تأخذ القيمة المحسوبة أثناء التوليد أو تعيد حسابها مرة أخرى ، اعتمادًا على نوع المعاملة.
RingCT بسيط
في حالة معاملات RingCT البسيطة ، من أجل ضمان أن تكون المخرجات الناتجة عن المعاملة مساوية لمجموع المدخلات (لم يتم جني الأموال من فراغ) ، من الضروري أن يكون مجموع الالتزامات في الأول والثاني هو نفسه ، إنه:
تعتبر لجان الالتزام بشكل مختلف قليلاً - بدون قناع:
حيث a - مقدار العمولة متاح للجمهور.
يتيح لنا هذا النهج أن نثبت للطرف المعتمد أننا نستخدم نفس المبالغ دون الكشف عنها.
لتوضيح الأمور ، دعنا نلقي نظرة على مثال. لنفترض أن المعاملة تنفق ناتجين (أي يصبحان مدخلات) لـ 10 و 5 XMR وتولد ثلاثة مخرجات بقيمة 12 XMR: 3 و 4 و 5 XMR. في نفس الوقت ، يدفع عمولة 3 XMR. وبالتالي ، فإن المبلغ الذي تم إنفاقه بالإضافة إلى المبلغ المتولد والعمولة يساوي 15 XMR. دعنا نحاول حساب الالتزامات وننظر إلى الفرق بين مبالغها (تذكر الرياضيات):
هنا نرى أن المعادلة تتقارب - نحتاج إلى أن تكون مجاميع أقنعة المدخلات والمخرجات هي نفسها. للقيام بذلك ، يتم إنشاء المحفظة بشكل عشوائي x1 و y1 و y2 و y3والباقي x2 يحسب مثل هذا:
باستخدام هذه الأقنعة ، يمكننا أن نثبت لأي مراجع أننا لا نقوم بتوليد أموال أكثر مما ننفقه دون الكشف عن المبلغ. الأصل ، أليس كذلك؟
RingCT ممتلئ
في معاملات RingCT الكاملة ، يكون التحقق من مبالغ التحويل أكثر تعقيدًا إلى حد ما. في هذه المعاملات ، لا تقوم المحفظة بإعادة حساب الالتزامات الخاصة بالمدخلات ، ولكنها تستخدم تلك التي تم حسابها عند إنشائها. في هذه الحالة ، يجب أن نفترض أننا لن نحصل بعد الآن على فرق المبالغ التي تساوي صفرًا ، ولكن بدلاً من ذلك:
ومن z هو الفرق بين أقنعة الإدخال والإخراج. إذا نظرنا zG كمفتاح عام (وهو الأمر الواقع) ، إذن z هو المفتاح الخاص. وبالتالي ، فإننا نعرف المفاتيح العامة والمفاتيح الخاصة المقابلة. باستخدام هذه البيانات ، يمكننا استخدامها في توقيع حلقة MLSAG جنبًا إلى جنب مع المفاتيح العامة للمخرجات المعجن:
وبالتالي ، فإن توقيع الحلقة الصالحة سيضمن أننا نعرف جميع المفاتيح الخاصة لأحد الأعمدة ، ويمكننا فقط معرفة المفتاح الخاص في الصف الأخير إذا لم تولد المعاملة أموالاً أكثر مما تنفقه. بالمناسبة ، إليك إجابة السؤال "لماذا لا يؤدي الاختلاف في مبالغ الالتزامات هنا إلى الصفر" - إذا زج = 0، ثم نقوم بتوسيع العمود بمخرجات حقيقية.
ولكن كيف يكتشف متلقي الأموال مقدار الأموال التي تم إرسالها إليه؟ كل شيء بسيط هنا - مرسل المعاملة ومفاتيح تبادل المستلم باستخدام بروتوكول Diffie-Hellman ، باستخدام مفتاح المعاملة ومفتاح عرض المستلم وحساب السر المشترك. يكتب المرسل في الحقول الخاصة لبيانات المعاملة على كميات المخرجات المشفرة باستخدام هذا المفتاح المشترك.
البراهين النطاق
ولكن ماذا يحدث إذا استخدمت رقمًا سالبًا كمبلغ الالتزامات؟ قد يؤدي هذا إلى توليد عملات إضافية! مثل هذه النتيجة غير مقبولة ، لذلك نحن بحاجة إلى ضمان بأن المبالغ التي نستخدمها ليست سلبية (دون الكشف عن هذه المبالغ ، بالطبع ، وإلا فإن الكثير من العمل وكل هذا عبثًا). بمعنى آخر ، يجب أن نثبت أن المجموع يقع في الفترة [0 ، 2 ن - 1].
للقيام بذلك ، يتم تقسيم مجموع كل ناتج إلى أرقام ثنائية ويتم اعتبار الالتزام لكل رقم على حدة. كيف يحدث هذا أفضل من خلال مثال.
لنفترض أن مجاميعنا صغيرة وتتناسب مع 4 بتات (عمليا 64 بت) ، وننشئ مخرجات بمبلغ 5 XMR. نحن نأخذ في الاعتبار الالتزامات الخاصة بكل فئة والالتزام الإجمالي لكامل المبلغ:
علاوة على ذلك ، يتم خلط كل التزام مع بديل (CI-2iH) وتوقيع أزواج مع توقيع حلقة Borromean (توقيع خاتم آخر) اقترحه Greg Maxwell في عام 2015 (يمكنك قراءة المزيد عنه
بشكل جماعي ، يسمى هذا برهان النطاق ويضمن أن الالتزامات تستخدم مبالغ في النطاق [0 ، 2 ن - 1].
ما هي الخطوة التالية؟
في التطبيق الحالي ، تشغل براهين النطاق مساحة كبيرة - 6176 بايت لكل إخراج. هذا يؤدي إلى معاملات كبيرة ، وبالتالي ، عمولات أعلى. لتقليل حجم معاملة Monero ، يقدم المطورون مواد مضادة للرصاص بدلاً من توقيعات Borromeo - آلية دليل النطاق دون التزامات بت.
اطرح أسئلتك ، واقترح موضوعات لمقالات جديدة حول التقنيات في مجال العملات المشفرة ، واشترك أيضًا في مجموعتنا في
المصدر: www.habr.com