استفاده از یک اوراکل تصادفی با استفاده از مثال قرعه کشی

یک روز صبح به مقاله ای در مورد آن برخوردم مولد اعداد تصادفی قابل تایید در بلاک چین پلتفرم Waves.

تصویر کلی واضح بود، اما روش اجرای خاص مشخص نبود. چند کد، امضا، چه، کجا، چرا؟

چندین مشاوره با نویسنده اوراکل، در نتیجه، ترکیب منطق ترسیم (اجرا شده در PHP) با الگوریتمی برای به دست آوردن یک عدد تصادفی امکان پذیر شد.

  1. در شروع مسابقات/راند، قسمت اول کد (R-code) را از اوراکل درخواست می کنیم.

    در حال حاضر اطلاعاتی در مورد تعداد بازیکنان، تعداد مکان های جوایز، میزان پرداختی جوایز و یا به طور کلی وجود قرعه کشی وجود ندارد. اوراکل، از طریق یک تراکنش، یک کد تصادفی شخصی صادر می کند، که پس از آن فقط یک بار و تنها توسط کسانی که آن را درخواست کرده اند، می توان از آن استفاده کرد. به هر حال، R-code را می توان "خرید" کرد (به معنای هزینه تراکنش درخواست + غرامت به اوراکل برای تراکنش پاسخ، این مبلغ حدود 0.015 دلار با نرخ فعلی است، خود کد به صورت رایگان صادر می شود. ) چندین بار از قبل، تا بعدا منتظر دریافت تراکنش پاسخ نباشید. من یک بافر کوچک که به طور منظم به روز می شود در پایگاه داده ساخته ام.

  2. این مسابقات معمولاً 60 بلوک از بلاک چین پلتفرم Waves طول می کشد، در حال حاضر تقریباً 1 ساعت است. اگر بعد از 60 بلوک حداقل دو بلیط در آن وجود داشته باشد، مسابقات تکمیل شده و بسته می شود، در غیر این صورت زمان فعالیت مسابقات برای 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. اگر طبق شرایط قرعه کشی چندین برنده وجود داشته باشد، عملیات قبلی را به مقداری معادل تعداد مکان های جایزه تکرار می کنیم. در این صورت هر بار بلیطی را که قبلاً برنده شده است از لیست حذف می کنیم و all_tickets را 1 کاهش می دهیم و به جای S-code شماره دریافتی قبلی را نشان می دهیم.

بیایید به یک مثال واقعی خاص، مسابقات شماره 119 نگاه کنیم:

مجموعا 7 بلیط (all_tickets)
قیمت بلیط 50 سکه (شرط)
هزینه بازی 10% (کارمزد)

طبق شرایط قرعه کشی، 30 درصد به پول جایزه تعلق می گیرد، یعنی. در این صورت 2 بلیط باید جایزه دریافت کنند که اندازه آن طبق فرمول (Bet*all_tickets-Fee)/2 محاسبه می شود.

1. دریافت کد R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. پس از بسته شدن مسابقات، ما لیستی از بلیط ها را به صورت جفت داریم: شماره + آدرس (آدرس کیف پولی که از آن پرداخت برای شرکت در مسابقات انجام شده است). لطفاً توجه داشته باشید که آدرس‌ها ممکن است تکرار شوند، به این معنی که یک شرکت‌کننده چندین بلیط برای یک تورنمنت خریداری کرده است؛ این توسط قوانین منع نشده است.

تاریخ ارسال معامله: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. S-code درخواستی: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV با نظر (R-code + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. دریافت کد S: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. برندگان مشخص شدند.

6. پرداخت ها را ارسال کرد

در نتیجه، ما یک ضبط گام به گام از روند قرعه کشی جوایز در بلاک چین با قابلیت بررسی آن در هر زمان داریم. دستکاری نتایج برای سازمان‌دهنده تقریباً غیرممکن است؛ حداقل، دیگر نمی‌توان این کار را بدون توجه انجام داد.

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

اضافه کردن نظر