أوراكل عشوائي يعتمد على التوقيع الرقمي في blockchain

من الفكرة إلى التنفيذ: نقوم بتعديل نظام التوقيع الرقمي المنحنى الإهليلجي الحالي بحيث يكون حتميًا، وبناءً عليه نقدم وظائف للحصول على أرقام عشوائية زائفة يمكن التحقق منها داخل blockchain.

أوراكل عشوائي يعتمد على التوقيع الرقمي في blockchain

فكرة

في خريف عام 2018، تم تضمين Waves blockchain تفعيل العقود الذكية الأولى، نشأ السؤال على الفور حول إمكانية الحصول عليها أرقام عشوائية زائفةيمكنك الوثوق به.

وفي حيرة من أمري بشأن هذا السؤال، توصلت أخيرًا إلى نتيجة مفادها أن أي سلسلة كتل هي عبارة عن خلية؛ ومن المستحيل الحصول على مصدر موثوق للإنتروبيا في نظام مغلق.

لكن ما زلت أحب فكرة واحدة: إذا أوراكل عشوائي سيتم توقيع بيانات المستخدم باستخدام خوارزمية حتمية، وسيتمكن المستخدم دائمًا من التحقق من هذا التوقيع باستخدام المفتاح العام، وسيكون متأكدًا من أن القيمة الناتجة فريدة. أوراكل، بغض النظر عن مدى صعوبة ذلك، غير قادر على تغيير أي شيء، وتنتج الخوارزمية نتيجة لا لبس فيها. في الأساس، يسجل المستخدم النتيجة، لكنه لا يعرفها حتى تنشرها أوراكل. اتضح أنه لا يمكنك الوثوق بأوراكل على الإطلاق، ولكن التحقق من نتيجة عملها. ثم، في حالة التحقق الناجح، يمكن اعتبار مثل هذا التوقيع مصدرًا للانتروبيا لرقم عشوائي زائف.

تستخدم منصة Waves blockchain نظام التوقيع إدسا خيار Ed25519. في هذا المخطط يتكون التوقيع من القيمتين R وS، حيث تعتمد R على قيمة عشوائية، ويتم حساب S بناءً على الرسالة التي تم توقيعها والمفتاح الخاص ونفس الرقم العشوائي مثل R. وتبين أن لا يوجد اعتماد فريد على نفسه. هناك العديد من التوقيعات الصالحة لرسالة المستخدم.

من الواضح، في شكله النقي، لا يمكن استخدام هذا التوقيع كمصدر للأرقام العشوائية الزائفة، لأنه غير حتمي، وبالتالي، يمكن التلاعب به بسهولة بواسطة أوراكل.

ولكن، كما اتضح فيما بعد، من الممكن في الواقع جعل الأمر حتميًا.

كان لدي آمال كبيرة ل وظيفة عشوائية يمكن التحقق منها (VRF)ولكن بعد دراسة الأجهزة اضطررت إلى التخلي عن هذا الخيار. على الرغم من أن VRF يقدم نسخة حتمية للتوقيع وإثباته، إلا أن هناك مكانًا غريبًا في الخوارزمية يفتح ثقبًا أسود للتلاعب بالأوراكل. وهي عند حساب قيمة k (قسم 5.1) يتم استخدام مفتاح خاص، والذي يظل غير معروف للمستخدم، مما يعني أنه لا يمكن للمستخدم التحقق من صحة حساب k، مما يعني أن أوراكل يمكنه استخدام أي قيمة k يحتاجها وفي نفس الوقت الاحتفاظ بقاعدة بيانات للمراسلات k والبيانات الموقعة حتى تتمكن دائمًا من إعادة حساب النتيجة الصحيحة من وجهة نظر VRF . إذا رأيت رسمًا يعتمد على VRF دون الكشف عن المفتاح الخاص، فيمكنك أن تكون ذكيًا: قم بالإشارة إلى الحاجة إما إلى الكشف عن المفتاح، أو استبعاده من حساب k، ثم سيتم الكشف عن المفتاح الخاص تلقائيًا عند ظهور التوقيع الأول . بشكل عام، كما سبق ذكره، مخطط غريب لأوراكل عشوائي.

وبعد قليل من التفكير والحصول على دعم المحللين المحليين، وُلد مخطط عمل VECRO.

VECRO هو اختصار لـ Verifiable Elliptic Curve Random Oracle، والذي يعني باللغة الروسية أوراكل عشوائي يمكن التحقق منه على المنحنيات الإهليلجية.

اتضح أن كل شيء بسيط للغاية، لتحقيق الحتمية، تحتاج إلى إصلاح قيمة R قبل ظهور الرسالة المراد توقيعها. إذا كان R ملتزمًا وكان جزءًا من الرسالة التي تم توقيعها، مما يضمن أيضًا التزام R في الرسالة التي تم توقيعها، فسيتم تحديد قيمة S بشكل فريد من خلال رسالة المستخدم وبالتالي يمكن استخدامها كمصدر للأرقام العشوائية الزائفة.

في مثل هذا المخطط، لا يهم كيفية تثبيت R؛ تظل هذه مسؤولية أوراكل. من المهم أن يتم تحديد S بشكل فريد من قبل المستخدم، ولكن قيمته غير معروفة حتى تقوم أوراكل بنشره. كل ما أردناه!

عند الحديث عن R الثابت، لاحظ ذلك إعادة استخدامها ر عند التوقيع على رسائل مختلفة، فإنه يكشف بشكل فريد عن المفتاح الخاص في مخطط EdDSA. يصبح من المهم للغاية بالنسبة لمالك Oracle إلغاء إمكانية إعادة استخدام R لتوقيع رسائل مستخدم مختلفة. وهذا يعني أنه مع أي تلاعب أو تواطؤ، فإن أوراكل ستخاطر دائمًا بفقدان مفتاحها الخاص.

في المجمل، يجب أن توفر أوراكل للمستخدمين وظيفتين: التهيئة، التي تعمل على إصلاح القيمة R، والتوقيع، الذي يُرجع القيمة S. في هذه الحالة، الزوج R، S هو التوقيع المعتاد الذي يمكن التحقق منه لرسالة المستخدم التي تحتوي على قيمة ثابتة. قيمة R وبيانات المستخدم التعسفية.

يمكن القول أن هذا المخطط الخاص بـ blockchain ليس أكثر من عادي مخطط الالتزام والتوسيع. في الأساس، نعم، إنها هي. ولكن هناك العديد من الفروق الدقيقة. أولا، تعمل أوراكل دائما بنفس المفتاح في جميع العمليات، على سبيل المثال، هذا مناسب للاستخدام في العقود. ثانيا، هناك خطر من فقدان أوراكل المفتاح الخاص إذا كان يتصرف بشكل غير صحيح، على سبيل المثال، تسمح لك أوراكل بعمل عينات من النتيجة، فيكفي إجراء اختبارين فقط لمعرفة المفتاح الخاص والحصول على كامل الوصول إلى المحفظة. ثالثًا، يعد التوقيع الذي يمكن التحقق منه أصلاً على blockchain والذي يعد مصدرًا للعشوائية أمرًا رائعًا.

لمدة ستة أشهر ظلت فكرة التنفيذ تغلي في رأسي، حتى ظهر الدافع أخيرًا في الشكل منحة من Waves Labs. مع المنحة الكبيرة تأتي مسؤولية كبيرة، لذلك سيكون المشروع موجودًا!

تطبيق

لذلك، في هذا المشروع تم تنفيذ VECRO على Waves blockchain في وضع الاستجابة للطلب باستخدام معاملات النقل بين المستخدم وأوراكل. في الوقت نفسه، يتم تثبيت برنامج نصي على حساب أوراكل، والذي يتحكم في العمل بدقة وفقًا للمنطق الموضح أعلاه. يتم التحقق من معاملات Oracle واستعادة سلسلة تفاعل المستخدم بأكملها. جميع المعاملات الأربع متضمنة في التحقق من القيمة النهائية، حيث يربطها العقد الذكي معًا بخيط تحقق صارم، ويتحقق من جميع القيم خطوة بخطوة ولا يترك مجالًا لأي تلاعب.

مرة أخرى، لنترك الأمر جانبًا ونجعل الأمر أكثر وضوحًا. أوراكل لا يعمل فقط وفقا للمخطط المقترح. يتم التحكم في عملها بالكامل على مستوى blockchain من قبل المنشأة بإحكام مع عقد ذكي. انتقل إلى اليسار ولن تتم المعاملة ببساطة. لذا، إذا تم تضمين معاملة ما في blockchain، فلن يحتاج المستخدم حتى إلى التحقق من أي شيء؛ فقد قامت مئات عقد الشبكة بالفعل بفحص كل شيء نيابةً عنه.

حاليًا، يوجد جهاز VECRO واحد يعمل على شبكة Waves الرئيسية (يمكنك تشغيل جهاز VECRO بنفسك، وهذا ليس بالأمر الصعب، فقط ألق نظرة على مثال التكوين). يعمل الكود الحالي في PHP (on WavesKit، عن ماذا لقد اخبرتك سابقا).

للاستفادة من خدمة أوراكل يجب عليك:

  • إصلاح ر؛
    • أرسل ما لا يقل عن 0.005 موجات إلى الاسم المستعار لـ Oracle init@vecr؛
    • احصل على رمز R في حقل المرفق عند نقل رمز R-vecr واحد من Oracle إلى المستخدم؛
  • الحصول على التوقيع؛
    • أرسل ما لا يقل عن 0.005 موجات إلى الاسم المستعار oracle Random@vecr، ويجب أيضًا الإشارة إلى رمز R الذي تم استلامه مسبقًا وبيانات المستخدم الإضافية في حقل المرفق؛
    • احصل على رمز S في حقل المرفق عند نقل رمز S-vecr واحد من Oracle إلى المستخدم؛
  • استخدم رمز S كمصدر للرقم العشوائي الزائف.

الفروق الدقيقة في التنفيذ الحالي:

  • يتم استخدام الموجات المرسلة إلى Oracle كعمولة لمعاملة الإرجاع إلى المستخدم، بحد أقصى 1 موجة؛
  • رمز R هو سلسلة بايت من الحرف 'R' وقيمة R مشفرة بـ 32 بايت base58؛
  • يجب أن يكون رمز R في المرفق أولاً، وتأتي بيانات المستخدم بعد رمز R؛
  • رمز S هو سلسلة بايت من الحرف 'S' وقيمة مشفرة بأساس 32 مكونة من 58 بايت للحرف S؛
  • S هو نتيجة تقسيم modulo، لذلك لا يمكنك استخدام S كرقم شبه عشوائي كامل 256 بت (يمكن اعتبار هذا الرقم كحد أقصى رقمًا شبه عشوائي 252 بت)؛
  • الخيار الأبسط هو استخدام تجزئة رمز S كرقم عشوائي زائف.

مثال على تلقي رمز S:

من وجهة نظر فنية، أوراكل جاهز تماما للعمل، يمكنك استخدامه بأمان. من وجهة نظر الاستخدام من قبل المستخدم العادي، هناك نقص في الواجهة الرسومية الملائمة، وهذا يجب أن ينتظر.

سأكون سعيدًا بالإجابة على الأسئلة وقبول التعليقات، شكرًا لك.

المصدر: www.habr.com

إضافة تعليق