Лотереянын мисалын колдонуп, кокустук оракулду колдонуу

Бир күнү эртең менен мен жөнүндө макала чыкты текшерилүүчү кокустук сандар генератору Waves платформа блокчейнинде.

Жалпы сүрөт айкын болгон, бирок конкреттүү ишке ашыруу ыкмасы болгон эмес. Кээ бир коддор, кол, эмне, кайда, эмне үчүн?

Oracle автору менен бир нече консультациялардын натыйжасында, чийме логикасын (PHPде ишке ашырылган) кокус санды алуу алгоритми менен айкалыштырууга мүмкүн болду.

  1. Турнирдин/турдун башталышында биз oracleдан коддун биринчи бөлүгүн (R-код) талап кылабыз.

    Учурда оюнчулардын саны, байгелүү орундардын саны, байге төлөмдөрүнүн өлчөмү же жалпысынан лотерея бар экендиги тууралуу маалымат жок. Оракл транзакция аркылуу жеке кокус кодду чыгарат, аны андан кийин бир гана жолу жана аны сурагандар гана колдоно алышат. Айтмакчы, R-кодду “сатып алууга” болот (суроо-талап транзакциясынын наркы + жооп транзакциясы үчүн oracle үчүн компенсация дегенди билдирет, бул учурдагы курс боюнча болжол менен 0.015 долларды түзөт, коддун өзү акысыз чыгарылат. ) кийинчерээк жооп транзакциясынын алынышын күтпөш үчүн, алдын ала бир нече жолу. Мен маалымат базасында дайыма жаңыланып турган кичинекей буфер жасадым.

  2. Турнир адатта Waves платформасынын блокчейнинин 60 блогуна созулат, учурда болжол менен 1 саатты түзөт. Эгерде 60 блоктон кийин анда экиден кем эмес билет болсо, турнир аяктады жана жабылды деп эсептелинет, антпесе турнирди өткөрүү убактысы кийинки 60 блокко узартылат.
  3. Турнир жабылгандан кийин дароо биз дата транзакциясын түзөбүз жана жөнөтөбүз (ошондой эле ал үчүн болжол менен $ 0.005 комиссия төлөйбүз), зарыл болсо, бир нече, анда тираждын бардык шарттары жазылган жана оюнчулардын тизмеси (билеттер) анын ичинен жеңүүчүлөрдү тандап алышыбыз керек.
  4. Бул этапта бизде коддун биринчи бөлүгү (R-код) жана транзакциянын датасы ID (TXID) бар. Биз аларды бириктирүү (R-код + TXID) түрүндө oracle кол коюуга жөнөтөбүз, кайра комиссия + компенсация төлөйбүз. Oracle алынган маалыматтардын уникалдуулугун жана тиешелүүлүгүн текшерет жана жооп катары бизге коддун экинчи бөлүгүн (S-код) sha256 форматында жөнөтөт, бул кокус сандар генератору үчүн баштапкы чекит болуп саналат.
  5. Утуп алган билеттин ырааттуу номерин көрсөтүүчү кокустук санды алуу үчүн, S-кодун sha256 бинардык маалыматтарынан он алтылык (HEX) өкүлчүлүгүнө айландырабыз. Андан кийин алынган HEX саптан биз санды алабыз. Алынган санды билеттердин санына (бардык_билеттерге) бөлгөндөн калган сумманы алабыз жана натыйжага 1ди кошобуз (бардык_билеттерден мурун 1 санын алуу үчүн). Натыйжада, биз жеңүүчүнүн сериялык номерин алабыз.
  6. Эгерде тираждын шарттарына ылайык, бир нече жеңүүчүлөр аныкталса, анда биз мурунку операцияларды байгелүү орундардын санына барабар суммада кайталайбыз. Бул учурда, биз ар бир жолу тизмеден утуп алган билетти алып салабыз жана бардык_билеттерди 1ге азайтабыз жана S-коддун ордуна мурунку алынган санды көрсөтөбүз.

Конкреттүү реалдуу мисалды, №119 турнирди карайлы:

Бардыгы болуп 7 билет (бардыгы_билет)
Билет баасы 50 тыйын (Коюм)
Оюн акысы 10% (акы)

Лотереянын шарты боюнча 30% акчалай байгеге, б.а. бул учурда 2 билет байге алышы керек, анын өлчөмү (Bet*all_tickets-Fee)/2 формуласы боюнча эсептелет.

1. Алынган R-код: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Турнир жабылгандан кийин бизде жуп түрүндөгү билеттердин тизмеси бар: номер + дарек (турнирге катышуу үчүн төлөм жасалган капчыктын дареги). Сураныч, даректер кайталанышы мүмкүн экенин эске алыңыз, бул бир катышуучу бир турнирге бир нече билет сатып алганын билдирет, бул эрежеде тыюу салынбайт.

Жөнөтүлгөн транзакция күнү: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Суралган S-код: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV комментарий менен (R-код + 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.

Source: www.habr.com

Комментарий кошуу