Piyango örneğini kullanarak rastgele bir kahin kullanma

Bir sabah şöyle bir yazıya rastladım: doğrulanabilir rastgele sayı üreteci Waves platformu blok zincirinde.

Genel resim açıktı ancak spesifik uygulama yöntemi açık değildi. Bazı kodlar, imzalar, ne, nerede, neden?

Oracle'ın yazarıyla yapılan birkaç istişare sonucunda, çizim mantığını (PHP'de uygulanan) rastgele bir sayı elde etmek için bir algoritma ile birleştirmek mümkün oldu.

  1. Turnuvanın/turun başlangıcında kahinden kodun ilk kısmını (R-kodu) talep ediyoruz.

    Şu anda oyuncu sayısı, ödül yerlerinin sayısı, ödül ödemelerinin büyüklüğü veya genel olarak piyangonun varlığı hakkında herhangi bir bilgi bulunmuyor. Oracle, bir işlem aracılığıyla, kişisel bir rastgele kod yayınlar ve bu kod, yalnızca bir kez ve yalnızca talep edenler tarafından kullanılabilir. Bu arada, R-kodu "satın alınabilir" (istek işleminin maliyeti + yanıt işlemi için Oracle'a ödenen tazminat anlamına gelir, bu mevcut kur üzerinden yaklaşık 0.015 ABD Doları tutarında bir miktardır, kodun kendisi ücretsiz olarak verilir) ) daha sonra yanıt işleminin alınmasını beklememek için önceden birkaç kez. Veritabanında düzenli olarak güncellenen küçük bir arabellek oluşturdum.

  2. Turnuva genellikle Waves platformu blok zincirinin 60 bloğundan oluşuyor, şu anda yaklaşık 1 saat sürüyor. 60 bloktan sonra en az iki bilet varsa turnuva tamamlanmış ve kapatılmış sayılır, aksi takdirde turnuva etkinlik süresi sonraki 60 blok için uzatılır.
  3. Turnuva kapandıktan hemen sonra, bir tarih işlemi oluşturup gönderiyoruz (ayrıca bunun için yaklaşık 0.005 $ komisyon ödüyoruz), gerekirse birkaç tane, çekilişin tüm koşullarının kaydedildiği ve sıralı bir oyuncu listesi (biletler) kazananları seçmemiz gerekiyor.
  4. Bu aşamada, kodun ilk kısmına (R-kodu) ve işlem tarihi kimliğine (TXID) zaten sahibiz. Bunları birleştirme (R-kodu + TXID) şeklinde kehanete imza için gönderiyoruz, yine komisyon + tazminat ödüyoruz. Oracle, alınan verileri benzersizlik ve aitlik açısından kontrol eder ve yanıt olarak rastgele sayı üretecinin başlangıç ​​noktası olan kodun ikinci bölümünü (S kodu) sha256 formatında gönderir.
  5. Kazanan biletin sıra numarasını gösterecek rastgele bir sayı elde etmek için S kodunu sha256 ikili verisinden onaltılık (HEX) gösterime dönüştürüyoruz. Daha sonra ortaya çıkan HEX dizisinden bir sayı elde ederiz. Ortaya çıkan sayıyı bilet sayısına (tüm_biletler) bölmenin geri kalanını alıyoruz ve sonuca 1 ekliyoruz (tüm_biletlerden önceki 1 sayısını elde etmek için). Sonuç olarak kazananın seri numarasını alıyoruz.
  6. Çekiliş koşullarına göre birden fazla kazanan varsa, ödül yerlerinin sayısına eşit miktarda önceki işlemleri tekrarlarız. Bu durumda, her seferinde zaten kazanmış olan bir bileti listeden çıkarırız ve all_tickets'i 1 azaltırız ve S kodu yerine önceki alınan numarayı belirtiriz.

Belirli bir gerçek örneğe bakalım: 119 numaralı turnuva:

Toplam 7 bilet (all_tickets)
Bilet ücreti 50 jeton (Bahis)
Oyun ücreti %10 (Ücret)

Çekiliş şartlarına göre %30'u para ödülüne gidiyor, yani. bu durumda, büyüklüğü (Bet*all_tickets-Fee)/2 formülüne göre hesaplanan 2 bilete bir ödül verilmelidir.

1. Alınan R kodu: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Turnuva kapandıktan sonra çiftler halinde bir bilet listemiz olur: sayı + adres (turnuvaya katılım ödemesinin yapıldığı cüzdanın adresi). Adreslerin tekrarlanabileceğini lütfen unutmayın; bu, bir katılımcının bir turnuva için birden fazla bilet satın aldığı anlamına gelir; bu, kurallarca yasak değildir.

Gönderilen işlem tarihi: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. İstenen S-kodu: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV yorumlu (R kodu + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Alınan S-kodu: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Kazananlar belirlendi.

6. Ödemeler gönderildi

Sonuç olarak, ödül çekiliş prosedürünün blok zincirinde adım adım kaydedilmesine ve bunu istediğiniz zaman kontrol edebilme olanağına sahibiz. Organizatörün sonuçları manipüle etmesi neredeyse imkansızdır; en azından bunu fark edilmeden yapmak artık mümkün olmayacaktır.

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.

Kaynak: habr.com

Yorum ekle