Sử dụng một nhà tiên tri ngẫu nhiên sử dụng ví dụ về xổ số

Một buổi sáng tôi tình cờ đọc được một bài viết về Trình tạo số ngẫu nhiên có thể kiểm chứng trên nền tảng blockchain Waves.

Bức tranh tổng thể đã rõ ràng nhưng phương pháp thực hiện cụ thể thì chưa. Một số mật mã, chữ ký, cái gì, ở đâu, tại sao?

Kết quả là, sau một số cuộc tham vấn với tác giả của lời tiên tri, có thể kết hợp logic vẽ (được triển khai bằng PHP) với thuật toán để lấy số ngẫu nhiên.

  1. Khi bắt đầu giải đấu/vòng, chúng tôi yêu cầu phần đầu tiên của mã (mã R) từ nhà tiên tri.

    Tại thời điểm này, không có thông tin về số lượng người chơi, số lượng nơi nhận giải, quy mô thanh toán giải thưởng hay sự tồn tại của xổ số nói chung. Nhà tiên tri, thông qua một giao dịch, sẽ phát hành một mã ngẫu nhiên cá nhân, mã này sau đó chỉ có thể được sử dụng một lần và chỉ bởi những người yêu cầu mã đó. Nhân tiện, mã R có thể được "mua" (nghĩa là chi phí của giao dịch yêu cầu + khoản bồi thường cho nhà tiên tri cho giao dịch phản hồi, đây là số tiền khoảng 0.015 USD theo tỷ giá hiện tại, bản thân mã được phát hành miễn phí ) trước vài lần, để không phải đợi sau này nhận được giao dịch phản hồi. Tôi đã tạo một bộ đệm nhỏ được cập nhật thường xuyên trong cơ sở dữ liệu.

  2. Giải đấu thường kéo dài 60 khối blockchain của nền tảng Waves, hiện tại kéo dài khoảng 1 giờ. Giải đấu được coi là hoàn thành và kết thúc nếu sau 60 khối có ít nhất hai vé trong đó, nếu không thời gian hoạt động của giải đấu sẽ được kéo dài cho 60 khối tiếp theo.
  3. Ngay sau khi giải đấu kết thúc, chúng tôi tạo và gửi một giao dịch theo ngày (chúng tôi cũng trả một khoản hoa hồng khoảng 0.005 USD cho giao dịch đó), nếu cần, một số giao dịch trong đó tất cả các điều kiện của bản vẽ được ghi lại và danh sách người chơi (vé) theo thứ tự. từ đó chúng ta cần chọn ra người chiến thắng.
  4. Ở giai đoạn này, chúng ta đã có phần đầu tiên của mã (R-code) cộng với ID ngày giao dịch (TXID). Chúng tôi gửi chúng để lấy chữ ký cho oracle dưới dạng ghép nối (mã R + TXID), một lần nữa chúng tôi trả hoa hồng + tiền bồi thường. Oracle kiểm tra tính duy nhất và thuộc tính của dữ liệu nhận được, đồng thời gửi cho chúng tôi phần thứ hai của mã (mã S) ở định dạng sha256, đây là điểm khởi đầu cho trình tạo số ngẫu nhiên.
  5. Để có được một số ngẫu nhiên cho biết số thứ tự của vé trúng thưởng, chúng tôi chuyển đổi mã S từ dữ liệu nhị phân sha256 sang biểu diễn thập lục phân (HEX). Sau đó từ chuỗi HEX kết quả, chúng ta nhận được một số. Chúng ta lấy phần còn lại của việc chia số kết quả cho số vé (all_tickets) và cộng 1 vào kết quả (để có số 1 trước all_tickets). Kết quả là chúng ta có được số sê-ri của người chiến thắng.
  6. Nếu theo điều kiện của cuộc xổ số mà có nhiều người trúng giải thì chúng ta lặp lại các thao tác trước đó với số tiền bằng số giải thưởng. Trong trường hợp này, mỗi lần chúng tôi xóa khỏi danh sách một vé đã thắng và giảm all_tickets đi 1 và thay vì mã S, chúng tôi chỉ ra số đã nhận trước đó.

Hãy xem một ví dụ thực tế cụ thể, giải đấu số 119:

Tổng cộng 7 vé (all_tickets)
Giá vé 50 xu (Đặt cược)
Phí trò chơi 10% (Phí)

Theo các điều kiện của xổ số, 30% sẽ được chuyển vào tiền thưởng, tức là. trong trường hợp này, 2 vé phải nhận được giải thưởng, quy mô giải thưởng được tính theo công thức (Bet*all_tickets-Fee)/2.

1. Nhận mã R: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. Sau khi giải đấu kết thúc, chúng ta có danh sách vé theo dạng cặp: số + địa chỉ (địa chỉ ví đã thực hiện thanh toán để tham gia giải đấu). Xin lưu ý rằng các địa chỉ có thể được lặp lại, điều này có nghĩa là một người tham gia đã mua nhiều vé tham dự một giải đấu; điều này không bị quy định nghiêm cấm.

Ngày giao dịch được gửi: 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

3. Mã S được yêu cầu: FTF3uRyaa4F2uAyD6z5a3CNbTXbQLc7fSR6CFNVjgZYV với nhận xét (mã R + TXID):
RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE 82JTMzhHM5xEA2fQ9Qscd5QAJU3DAd8nShLjdVHTer5S

4. Nhận được S-code: Ri89jHB4UXZDXY6gT1m4LBDXGMTaYzHozMk4nxiuqVXdC

5. Người chiến thắng đã được xác định.

6. Đã gửi thanh toán

Do đó, chúng tôi có bản ghi từng bước về quy trình rút thưởng trong blockchain với khả năng kiểm tra bất kỳ lúc nào. Người tổ chức gần như không thể thao túng kết quả, ít nhất sẽ không thể làm điều đó mà không bị chú ý nữa.

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.

Nguồn: www.habr.com

Thêm một lời nhận xét