Defnyddio oracl ar hap gan ddefnyddio'r enghraifft o loteri

Un bore des i ar draws erthygl am generadur haprif dilysadwy ar y Blockchain llwyfan Waves.

Roedd y darlun cyffredinol yn glir, ond nid oedd y dull gweithredu penodol. Rhai codau, llofnodion, beth, ble, pam?

Mae sawl ymgynghoriad gydag awdur yr oracl, o ganlyniad, bu'n bosibl cyfuno'r rhesymeg lluniadu (a weithredwyd yn PHP) ag algorithm ar gyfer cael rhif ar hap.

  1. Ar ddechrau'r twrnamaint / rownd, rydyn ni'n gofyn am ran gyntaf y cod (cod R) o'r oracl.

    Ar hyn o bryd, nid oes unrhyw wybodaeth am nifer y chwaraewyr, nifer y lleoedd gwobrau, maint y taliadau gwobrau, na bodolaeth y loteri yn gyffredinol. Mae'r oracl, trwy drafodiad, yn cyhoeddi cod ar hap personol, y gellir ei ddefnyddio unwaith yn unig a dim ond gan y rhai a ofynnodd amdano. Gyda llaw, gellir “prynu” cod R (sy'n golygu cost y trafodiad cais + iawndal i'r oracl am y trafodiad ymateb, mae hwn yn swm o tua $ 0.015 ar y gyfradd gyfredol, mae'r cod ei hun yn cael ei gyhoeddi yn rhad ac am ddim ) sawl gwaith ymlaen llaw, er mwyn peidio ag aros am dderbyn y trafodiad ymateb yn ddiweddarach. Gwneuthum glustog fach sy'n cael ei diweddaru'n rheolaidd yn y gronfa ddata.

  2. Mae'r twrnamaint fel arfer yn para 60 bloc o blockchain platfform Waves, ar hyn o bryd mae tua 1 awr. Ystyrir bod y twrnamaint wedi'i gwblhau a'i gau os, ar ôl 60 bloc, mae o leiaf ddau docyn ynddo, fel arall mae amser gweithgaredd y twrnamaint yn cael ei ymestyn am y 60 bloc nesaf.
  3. Yn syth ar ôl i'r twrnamaint gau, rydym yn cynhyrchu ac yn anfon trafodiad dyddiad (rydym hefyd yn talu comisiwn o tua $ 0.005 amdano), os oes angen, sawl un, lle mae holl amodau'r llun yn cael eu cofnodi a rhestr archebu o chwaraewyr (tocynnau) y mae angen inni ddewis yr enillwyr ohonynt.
  4. Ar y cam hwn, mae gennym eisoes ran gyntaf y cod (cod-R) ynghyd â'r ID dyddiad trafodiad (TXID). Rydym yn eu hanfon i'w llofnodi i'r oracl ar ffurf concatenation (Cod R + TXID), eto rydym yn talu comisiwn + iawndal. Mae'r oracl yn gwirio'r data a dderbyniwyd am unigrywiaeth a pherthyn, ac mewn ymateb mae'n anfon ail ran y cod (cod S) atom mewn fformat sha256, sef y man cychwyn ar gyfer y generadur haprifau.
  5. I gael rhif ar hap a fydd yn nodi rhif dilyniant y tocyn buddugol, rydym yn trosi'r cod S o'r data deuaidd sha256 i gynrychioliad hecsadegol (HEX). Yna o'r llinyn HEX sy'n deillio o hynny, rydyn ni'n cael rhif. Cawn y gweddill o rannu'r rhif canlyniadol gyda nifer y tocynnau (all_tickets) ac ychwanegu 1 at y canlyniad (i gael y rhif 1 cyn all_tickets). O ganlyniad, rydym yn cael rhif cyfresol yr enillydd.
  6. Os, yn ôl amodau'r llun, mae yna nifer o enillwyr, yna rydym yn ailadrodd y gweithrediadau blaenorol mewn swm sy'n hafal i nifer y lleoedd gwobr. Yn yr achos hwn, bob tro rydyn ni'n tynnu tocyn sydd eisoes wedi'i ennill o'r rhestr ac yn lleihau all_tickets o 1, ac yn lle cod S rydyn ni'n nodi'r rhif blaenorol a dderbyniwyd.

Edrychwn ar enghraifft wirioneddol benodol, twrnamaint Rhif 119:

Cyfanswm o 7 tocyn (pob_tocyn)
Tocyn yn costio 50 darn arian (Bet)
Ffi gêm 10% (Ffi)

Yn ôl amodau’r loteri, mae 30% yn mynd at y wobr ariannol, h.y. yn yr achos hwn, rhaid i 2 docyn dderbyn gwobr, y mae ei maint yn cael ei gyfrifo yn ôl y fformiwla (Bet*all_tickets-Fee)/2.

1. Derbyniwyd cod R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Ar ôl i'r twrnamaint gau, mae gennym restr o docynnau ar ffurf parau: rhif + cyfeiriad (cyfeiriad y waled y gwnaed taliad am gymryd rhan yn y twrnamaint ohono). Sylwch y gall cyfeiriadau gael eu hailadrodd, mae hyn yn golygu bod un cyfranogwr wedi prynu sawl tocyn i un twrnamaint;

Dyddiad trafod a anfonwyd: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Cod S y gofynnwyd amdano: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV gyda sylw (cod R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Cod S a dderbyniwyd: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Roedd yr enillwyr yn benderfynol.

6. Anfonwyd taliadau

O ganlyniad, mae gennym recordiad cam wrth gam o'r weithdrefn tynnu gwobrau yn y blockchain gyda'r gallu i'w wirio ar unrhyw adeg. Mae bron yn amhosibl i'r trefnydd drin y canlyniadau; o leiaf, ni fydd yn bosibl ei wneud yn ddisylw mwyach.

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.

Ffynhonnell: hab.com

Ychwanegu sylw