Сугалааны жишээг ашиглан санамсаргүй таамаглалыг ашиглах

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

Ерөнхий дүр зураг тодорхой байсан ч хэрэгжүүлэх арга нь тодорхойгүй байв. Зарим код, гарын үсэг, юу, хаана, яагаад?

Oracle-ийн зохиогчтой хэд хэдэн зөвлөлдсөний үр дүнд зургийн логикийг (PHP-д хэрэгжүүлсэн) санамсаргүй тоог олж авах алгоритмтай хослуулах боломжтой болсон.

  1. Тэмцээн/тур эхлэхэд бид кодын эхний хэсгийг (R-код) oracle-аас хүсч байна.

    Одоогоор тоглогчдын тоо, шагналын байруудын тоо, шагналын төлбөрийн хэмжээ, ерөнхийдөө сугалаа байгаа эсэх талаар мэдээлэл алга байна. Оркул нь гүйлгээгээр дамжуулан хувийн санамсаргүй код гаргадаг бөгөөд дараа нь үүнийг хүссэн хүмүүс зөвхөн нэг удаа ашиглах боломжтой. Дашрамд хэлэхэд, R кодыг "худалдан авах" боломжтой (хүсэлтийн гүйлгээний зардал + хариу гүйлгээний oracle-д өгөх нөхөн олговор гэсэн үг, энэ нь одоогийн ханшаар ойролцоогоор $ 0.015 байна, код нь өөрөө үнэ төлбөргүй гардаг. ) дараа нь хариу гүйлгээг хүлээн авахыг хүлээхгүйн тулд хэд хэдэн удаа урьдчилан. Би мэдээллийн санд байнга шинэчлэгддэг жижиг буфер хийсэн.

  2. Тэмцээн нь ихэвчлэн Waves платформ блокчейн 60 блок үргэлжилдэг бөгөөд одоогоор ойролцоогоор 1 цаг болж байна. Хэрэв 60 блокийн дараа дор хаяж хоёр тасалбар байгаа бол тэмцээн дууссан бөгөөд хаагдсан гэж үзнэ, эс тэгвээс тэмцээний үргэлжлэх хугацааг дараагийн 60 блокоор сунгана.
  3. Тэмцээн хаагдсаны дараа бид огнооны гүйлгээг үүсгэж, илгээдэг (бид мөн үүний төлөө ойролцоогоор 0.005 долларын комисс төлдөг), шаардлагатай бол хэд хэдэн, сугалааны бүх нөхцөлийг бүртгэж, тоглогчдын захиалсан жагсаалтыг (тасалбар) гаргадаг. үүнээс бид ялагчдыг сонгох хэрэгтэй.
  4. Энэ үе шатанд бид аль хэдийн кодын эхний хэсэг (R-код) болон гүйлгээний огнооны ID (TXID) байна. Бид тэдгээрийг гарын үсэг зурахаар oracle руу холбох хэлбэрээр илгээдэг (R-код + TXID), бид дахин комисс + нөхөн төлбөр төлдөг. Oracle нь хүлээн авсан өгөгдлийн өвөрмөц байдал, хамаарлыг шалгаж, хариуд нь кодын хоёр дахь хэсгийг (S-код) sha256 форматаар илгээдэг бөгөөд энэ нь санамсаргүй тоо үүсгэгчийн эхлэлийн цэг юм.
  5. Ялагч тасалбарын дарааллын дугаарыг зааж өгөх санамсаргүй тоог олж авахын тулд бид sha256 хоёртын өгөгдлөөс S кодыг арван зургаатын (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.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх