في صباح أحد الأيام ، لفتت انتباهي مقالة عن
مولد الأرقام العشوائية المختبرة على blockchain منصة Waves.
كانت الصورة الشاملة مفهومة ، لكن طريقة التنفيذ المحددة لم تكن كذلك. أي رموز ، توقيعات ، ماذا ، أين ، لماذا؟
بعض المشاورات مع مؤلف أوراكل ، ونتيجة لذلك اتضح أن الجمع بين منطق السحب (تنفيذها في PHP) مع خوارزمية للحصول على رقم عشوائي.
- في بداية البطولة / الجولة ، نسأل أوراكل عن الجزء الأول من الكود (R-code).
في هذه اللحظة ، لا توجد معلومات حول عدد اللاعبين ، ولا عن عدد الجوائز ، ولا عن حجم مدفوعات الجوائز وبوجه عام عن وجود يانصيب. يصدر oracle خلال معاملة رمز عشوائي شخصي ، والذي يمكن استخدامه في المستقبل مرة واحدة فقط لأولئك الذين طلبوه. بالمناسبة ، يمكن "شراء" رمز R (بالإشارة إلى تكلفة طلب المعاملة + تعويض أوراكل لمعاملة الاستجابة ، وهذا مبلغ قدره 0.015 دولار حسب السعر الحالي ، يتم إصدار الرمز نفسه مجانًا) مقدمًا ، بحيث لا تضطر إلى انتظار معاملة الاستجابة لاحقًا. أدليت به صغير مؤقت تحديثها بانتظام في قاعدة البيانات. - تستمر البطولة بشكل قياسي مع 60 كتلة من لعبة Waves platform block ، في الوقت الحالي حوالي ساعة واحدة. تعتبر الدورة موقوفة ومغلقة إذا كان هناك ستون على الأقل من التذاكر بعدها 60 قطعة ، وإلا فسيتم تمديد فترة نشاط البطولة في الستين قطعة التالية.
- بعد انتهاء الدورة مباشرة ، نقوم بتكوين وإرسال تاريخ المعاملة (نحن ندفع أيضًا عمولة تبلغ حوالي 0.005 دولار) ، إذا لزم الأمر ، هناك عدد قليل ، يتم فيه تثبيت جميع شروط الرسم وقائمة اللاعبين (التذاكر) المطلوبة والتي نختار منها الفائزين.
- في هذه المرحلة ، لدينا بالفعل الجزء الأول من الكود (رمز R) بالإضافة إلى معرف تاريخ المعاملة (TXID). نرسلهم إلى أوراكل للتوقيع في شكل تسلسل (R-code + TXID) ، مرة أخرى ندفع عمولة + تعويض. يتحقق أوراكل من البيانات للتفرد والانتماء ، وردا على ذلك يرسل لنا الجزء الثاني من الكود (S-code) بتنسيق sha256 ، وهو نقطة الانطلاق لمولد الأرقام العشوائية.
- للحصول على رقم عشوائي يشير إلى رقم تسلسل التذكرة الفائزة ، نقوم بتحويل كود S-code من sha256 بيانات ثنائية إلى تمثيل سداسي عشري (HEX). ثم من سلسلة HEX الناتجة ، نحصل على رقم. نحصل على ما تبقى من تقسيم العدد الناتج على عدد التذاكر (all_tickets) وإضافة إلى النتيجة 1 (للحصول على الرقم 1 إلى all_tickets). نتيجة لذلك ، نحصل على الرقم التسلسلي للفائز.
- إذا كان هناك العديد من الفائزين بموجب شروط السحب ، فإننا نكرر العمليات السابقة بمبلغ يساوي عدد الجوائز. في الوقت نفسه ، في كل مرة نقوم فيها بحذف البطاقة التي فزنا بها بالفعل من القائمة ونخفض عدد التذاكر بنسبة 1 ، وبدلاً من الرمز S ، نشير إلى الرقم السابق الذي تم استلامه.
دعونا نحلل مثالًا ملموسًا للحياة الحقيقية ، البطولة رقم 119:
فقط 7 تذاكر (جميع التذاكر)
سعر التذكرة 50 قطعة نقدية (الرهان)
رسوم اللعبة 10٪ (الرسوم)
وفقًا لشروط اليانصيب ، يحصل 30٪ على الجائزة ، أي في هذه الحالة ، يجب أن تحصل تذكرتان على جائزة يتم حساب حجمها باستخدام الصيغة (Bet * all_tickets-Fee) / 2.
1. تم
استلام كود R:
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE2. بعد انتهاء الدورة ، لدينا قائمة من التذاكر في شكل أزواج: رقم + عنوان (عنوان محفظة دفعت المشاركة في البطولة). لاحظ أنه يمكن تكرار العناوين ، وهذا يعني أن أحد المشاركين اشترى عدة تذاكر في دورة واحدة ، وهذا غير محظور بموجب القواعد.
تاريخ المعاملة المرسلة:
82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S3. رمز S المطلوب:
FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV مع التعليق (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S
4. تم
استلام كود S:
Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC5. تم تحديد الفائزين.
6.
دفعات المرسلةنتيجة لذلك ، لدينا في blockchain تثبيت خطوة بخطوة لعملية السحب على الجائزة مع إمكانية التحقق من ذلك في أي وقت. يكاد يكون من المستحيل التلاعب بنتائج المنظم ، على الأقل لن ينجح الأمر بهدوء.
determine the winner № 1 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:145 Index: 5 Ticket:147 Index: 6 Ticket:149 Index: 7 Ticket:151 1. bin -> hex ( bin2hex(sha256(S-code)) ): Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC -> 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 2. hex -> gmp number: 0xdaf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 99037963059744689166154019807924045947962565922868104113173478160267437352342 3. gmp -> modulo (mod=7): 99037963059744689166154019807924045947962565922868104113173478160267437352342 -> 4 4. modulo -> ticket: 4 -> 145 determine the winner № 2 All_tickets: Index: 1 Ticket:139 Index: 2 Ticket:141 Index: 3 Ticket:143 Index: 4 Ticket:147 Index: 5 Ticket:149 Index: 6 Ticket:151 1. bin -> hex ( bin2hex(sha256(previous hex)) ): daf5802953dcb27f89972e38e8900b898733f6a613e6e1c6c5491362c1832596 -> 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 2. hex -> gmp number: 0x9560e77525e9ea2db92cdb8484dc52046ccafac7c719b8859ff55f0eb92834a0 -> 67565829218838067182838043983962684143266386786567427968312120473742580659360 3. gmp -> modulo (mod=6): 67565829218838067182838043983962684143266386786567427968312120473742580659360 -> 1 4. modulo -> ticket: 1 -> 139 End.