استخدام أوراكل عشوائي باستخدام مثال اليانصيب

في صباح أحد الأيام عثرت على مقال حول مولد رقم عشوائي يمكن التحقق منه على منصة Waves blockchain.

وكانت الصورة العامة واضحة، لكن طريقة التنفيذ المحددة لم تكن كذلك. بعض الرموز، التوقيعات، ماذا، أين، لماذا؟

أدت العديد من المشاورات مع مؤلف أوراكل، نتيجة لذلك، إلى الجمع بين منطق الرسم (المنفذ في PHP) مع خوارزمية للحصول على رقم عشوائي.

  1. في بداية البطولة/الجولة، نطلب الجزء الأول من الكود (R-code) من الأوراكل.

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

  2. تستمر البطولة عادةً لمدة 60 كتلة من منصة Waves blockchain، وتبلغ حاليًا حوالي ساعة واحدة. تعتبر البطولة مكتملة ومغلقة إذا كانت هناك تذكرتان على الأقل بعد 1 كتلة، وإلا فسيتم تمديد وقت نشاط البطولة إلى 60 كتلة التالية.
  3. مباشرة بعد انتهاء البطولة، نقوم بإنشاء وإرسال معاملة تاريخ (ندفع أيضًا عمولة تبلغ حوالي 0.005 دولارًا أمريكيًا مقابل ذلك)، إذا لزم الأمر، عدة، حيث يتم تسجيل جميع شروط السحب وقائمة مرتبة من اللاعبين (التذاكر) والتي نحتاج إلى اختيار الفائزين منها.
  4. في هذه المرحلة، لدينا بالفعل الجزء الأول من الكود (R-code) بالإضافة إلى معرف تاريخ المعاملة (TXID). نرسلها للتوقيع إلى أوراكل في شكل سلسلة (R-code + TXID)، مرة أخرى ندفع عمولة + تعويض. تقوم الأوراكل بفحص البيانات المستلمة للتأكد من تفردها وانتمائها، واستجابة لذلك ترسل لنا الجزء الثاني من الكود (S-code) بتنسيق sha256، وهو نقطة البداية لمولد الأرقام العشوائية.
  5. للحصول على رقم عشوائي يشير إلى الرقم التسلسلي للتذكرة الفائزة، نقوم بتحويل رمز S من البيانات الثنائية sha256 إلى تمثيل سداسي عشري (HEX). ثم من سلسلة HEX الناتجة، نحصل على رقم. نحصل على باقي قسمة الرقم الناتج على عدد التذاكر (all_tickets) ونضيف 1 إلى النتيجة (للحصول على الرقم 1 قبل all_tickets). ونتيجة لذلك، نحصل على الرقم التسلسلي للفائز.
  6. إذا كان هناك العديد من الفائزين وفقًا لشروط السحب، فإننا نكرر العمليات السابقة بمبلغ يساوي عدد أماكن الجائزة. في هذه الحالة، في كل مرة نقوم بإزالة التذكرة التي فازت بالفعل من القائمة وتقليل جميع التذاكر بمقدار 1، وبدلاً من رمز S، نشير إلى الرقم السابق الذي تم استلامه.

دعونا نلقي نظرة على مثال حقيقي محدد، البطولة رقم 119:

إجمالي 7 تذاكر (all_tickets)
تكلفة التذكرة 50 قطعة نقدية (الرهان)
رسوم اللعبة 10% (الرسوم)

وفقًا لشروط اليانصيب، تذهب نسبة 30% إلى الجائزة المالية، أي. في هذه الحالة، يجب أن تحصل تذكرتان على جائزة، يتم حساب حجمها وفقًا للصيغة (Bet*all_tickets-Fee)/2.

1. تلقى رمز R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. بعد انتهاء البطولة، لدينا قائمة التذاكر على شكل أزواج: الرقم + العنوان (عنوان المحفظة التي تم الدفع منها للمشاركة في البطولة). يرجى ملاحظة أن العناوين قد تتكرر، وهذا يعني أن أحد المشاركين اشترى عدة تذاكر لبطولة واحدة، وهذا غير محظور بموجب القواعد.

تاريخ إرسال المعاملة: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. رمز S المطلوب: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV مع التعليق (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. تلقى رمز S: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. تم تحديد الفائزين.

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.

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

إضافة تعليق