การใช้ไพ่พยากรณ์แบบสุ่มโดยใช้ตัวอย่างลอตเตอรี

เช้าวันหนึ่ง ผมไปเจอบทความเกี่ยวกับ เครื่องกำเนิดตัวเลขสุ่มที่ตรวจสอบได้ บนบล็อกเชนแพลตฟอร์ม Waves

ภาพรวมมีความชัดเจนแต่วิธีการปฏิบัติเฉพาะไม่ชัดเจน รหัสบางส่วน ลายเซ็น อะไร ที่ไหน ทำไม?

การปรึกษาหารือหลายครั้งกับผู้เขียน oracle ส่งผลให้สามารถรวมตรรกะการวาด (ใช้งานใน PHP) เข้ากับอัลกอริทึมในการรับตัวเลขสุ่ม

  1. เมื่อเริ่มต้นทัวร์นาเมนต์/รอบ เราขอรหัสส่วนแรก (R-code) จาก oracle

    ขณะนี้ยังไม่มีข้อมูลเกี่ยวกับจำนวนผู้เล่น จำนวนรางวัล ขนาดการจ่ายรางวัล หรือการมีอยู่ของลอตเตอรีโดยทั่วไป ออราเคิลจะออกรหัสสุ่มส่วนตัวผ่านการทำธุรกรรม ซึ่งสามารถใช้ได้เพียงครั้งเดียวเท่านั้นโดยผู้ที่ร้องขอเท่านั้น อย่างไรก็ตาม สามารถ "ซื้อรหัส R" ได้ (หมายถึงต้นทุนของธุรกรรมคำขอ + การชดเชยให้กับ oracle สำหรับธุรกรรมการตอบสนอง ซึ่งเป็นจำนวนประมาณ $0.015 ในอัตราปัจจุบัน รหัสนั้นออกให้โดยไม่เสียค่าใช้จ่าย ) ล่วงหน้าหลายครั้งเพื่อไม่ให้รอรับธุรกรรมตอบกลับในภายหลัง ฉันสร้างบัฟเฟอร์ที่อัปเดตเป็นประจำเล็กน้อยในฐานข้อมูล

  2. โดยปกติทัวร์นาเมนต์จะใช้เวลา 60 บล็อกของแพลตฟอร์มบล็อกเชน Waves ในขณะนี้จะใช้เวลาประมาณ 1 ชั่วโมง การแข่งขันจะถือว่าเสร็จสมบูรณ์และปิดลง หากหลังจาก 60 บล็อก มีตั๋วอย่างน้อยสองใบ มิฉะนั้น เวลากิจกรรมทัวร์นาเมนต์จะขยายออกไปอีก 60 บล็อกถัดไป
  3. ทันทีหลังจากทัวร์นาเมนต์ปิด เราจะสร้างและส่งธุรกรรมวันที่ (เรายังจ่ายค่าคอมมิชชันประมาณ $0.005 สำหรับธุรกรรมนั้น) หากจำเป็น หลายรายการ โดยจะมีการบันทึกเงื่อนไขทั้งหมดของการจับรางวัลและรายชื่อผู้เล่นที่เรียงลำดับ (ตั๋ว) ซึ่งเราต้องเลือกผู้ชนะ
  4. ในขั้นตอนนี้ เรามีส่วนแรกของรหัส (R-code) บวกกับรหัสวันที่ทำธุรกรรม (TXID) แล้ว เราส่งพวกเขาเพื่อขอลายเซ็นไปยัง oracle ในรูปแบบของการต่อข้อมูล (รหัส R + TXID) เราจะจ่ายค่าคอมมิชชั่น + ค่าตอบแทนอีกครั้ง ออราเคิลจะตรวจสอบข้อมูลที่ได้รับเพื่อดูเอกลักษณ์และความเป็นเจ้าของ และในการตอบกลับจะส่งส่วนที่สองของโค้ด (S-code) ในรูปแบบ sha256 ซึ่งเป็นจุดเริ่มต้นสำหรับเครื่องสร้างตัวเลขสุ่ม
  5. เพื่อให้ได้ตัวเลขสุ่มที่จะระบุหมายเลขลำดับของตั๋วที่ชนะ เราจะแปลงรหัส S จากข้อมูลไบนารี sha256 ให้เป็นเลขฐานสิบหก (HEX) จากนั้นเราจะได้ตัวเลขจากสตริง HEX ที่เป็นผลลัพธ์ เราจะได้ส่วนที่เหลือจากการหารจำนวนผลลัพธ์ด้วยจำนวนตั๋ว (all_tickets) และบวก 1 เข้ากับผลลัพธ์ (เพื่อให้ได้หมายเลข 1 ก่อน all_tickets) เป็นผลให้เราได้รับหมายเลขซีเรียลของผู้ชนะ
  6. ตามเงื่อนไขของการจับรางวัล หากมีผู้ชนะหลายราย เราจะทำซ้ำการดำเนินการก่อนหน้านี้ในจำนวนเท่ากับจำนวนรางวัล ในกรณีนี้ แต่ละครั้งเราจะลบตั๋วที่ชนะแล้วออกจากรายการและลด all_tickets ลง 1 และแทนที่จะเป็นรหัส S เราจะระบุหมายเลขก่อนหน้าที่ได้รับ

มาดูตัวอย่างจริงของทัวร์นาเมนต์ที่ 119:

บัตรทั้งหมด 7 ใบ (all_tickets)
ตั๋วราคา 50 เหรียญ (เดิมพัน)
ค่าธรรมเนียมเกม 10% (ค่าธรรมเนียม)

ตามเงื่อนไขของลอตเตอรี 30% จะเป็นเงินรางวัล เช่น ในกรณีนี้จะต้องได้รับรางวัล 2 ใบ ซึ่งขนาดจะคำนวณตามสูตร (เดิมพัน*all_tickets-ค่าธรรมเนียม)/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.

ที่มา: will.com

เพิ่มความคิดเห็น