Коришћење случајног пророчишта на примеру лутрије

Једног јутра наишао сам на чланак о проверљиви генератор случајних бројева на блокчејну платформе Вавес.

Укупна слика је била јасна, али конкретан метод имплементације није. Неке шифре, потписи, шта, где, зашто?

Неколико консултација са аутором оракула, као резултат, било је могуће комбиновати логику цртања (примењену у ПХП-у) са алгоритмом за добијање случајног броја.

  1. На почетку турнира/рунда тражимо први део кода (Р-код) од оракула.

    У овом тренутку нема информација о броју играча, броју наградних места, величини исплата награда, нити о постојању лутрије уопште. Пророчанство, путем трансакције, издаје лични случајни код, који онда могу користити само једном и само они који су то затражили. Узгред, Р-код се може „купити“ (што значи трошак трансакције захтева + компензација пророчишту за трансакцију одговора, ово је износ од око 0.015 долара по тренутном курсу, сам код се издаје бесплатно ) неколико пута унапред, како не би касније чекали пријем трансакције одговора. Направио сам мали бафер који се редовно ажурира у бази података.

  2. Турнир обично траје 60 блокова платформе Вавес блоцкцхаин, тренутно је отприлике 1 сат. Турнир се сматра завршеним и затвореним ако после 60 блокова има најмање две карте у њему, у супротном се време активности турнира продужава за наредних 60 блокова.
  3. Одмах по затварању турнира генеришемо и шаљемо трансакцију датума (такође плаћамо провизију од око 0.005$ за њу), ако је потребно, неколико, у којима су забележени сви услови извлачења и наређена листа играча (карте) од којих треба да изаберемо победнике.
  4. У овој фази већ имамо први део кода (Р-код) плус ИД датума трансакције (ТКСИД). Шаљемо их на потпис оракулу у виду конкатенације (Р-код + ТКСИД), опет плаћамо провизију + компензацију. Пророчиште проверава примљене податке на јединственост и припадност, и као одговор нам шаље други део кода (С-цоде) у формату сха256, који је полазна тачка за генератор случајних бројева.
  5. Да бисмо добили насумични број који ће указивати на редни број добитног тикета, конвертујемо С-код из бинарних података сха256 у хексадецимални (ХЕКС) приказ. Затим из резултујућег ХЕКС стринга добијамо број. Добијамо остатак дељења резултујућег броја бројем карата (алл_тицкетс) и додамо 1 резултату (да бисмо добили број 1 пре свих_тицкетс). Као резултат, добијамо серијски број победника.
  6. Ако, према условима извлачења, има неколико добитника, онда понављамо претходне операције у износу једнаком броју наградних места. У овом случају, сваки пут уклонимо са листе тикет који је већ победио и смањимо алл_тицкетс за 1, а уместо С-кода наведемо претходни примљени број.

Погледајмо конкретан прави пример, турнир број 119:

Укупно 7 карата (алл_тицкетс)
Улазница кошта 50 новчића (Оклада)
Накнада за игру 10% (накнада)

Према условима лутрије, 30% иде на новчану награду, тј. у овом случају, 2 тикета морају добити награду, чија се величина израчунава према формули (Бет*алл_тицкетс-Фее)/2.

1. Примљени Р код: РдбАиАхКхвеАтР4еиТКк75ноМкдцЕокбЕ6БвојЈјМ13ВЕ

2. Након затварања турнира, имамо листу улазница у виду парова: број + адреса (адреса новчаника из којег је извршена уплата за учешће на турниру). Имајте на уму да се адресе могу понављати, што значи да је један учесник купио више карата за један турнир, што није забрањено правилима.

Датум трансакције послат: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Захтевани С код: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV са коментаром (Р-код + ТКСИД):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Примљени С код: 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.

Извор: ввв.хабр.цом

Додај коментар