使用隨機預言機(以彩券為例)

有一天早上,我看到一篇文章,內容是 可驗證的隨機數產生器 在 Waves 平台區塊鏈上。

整體思路很清晰,但具體實作方法卻不清楚。 一些程式碼、簽名、什麼、在哪裡、為什麼?

與預言機作者進行了多次協商,結果可以將繪圖邏輯(用 PHP 實現)與獲取隨機數的演算法結合。

  1. 在錦標賽/回合開始時,我們向預言機請求代碼的第一部分(R 代碼)。

    目前,還沒有關於玩家人數、獎金名額、獎金金額或彩票是否存在的資訊。 預言機透過交易發出個人隨機代碼,該代碼只能使用一次,並且只能由請求的人使用。 順便說一下,R-code 是可以「購買」的(意思是請求交易的成本 + 響應交易對預言機的補償,按當前匯率計算,這個金額約為 0.015 美元),代碼本身是免費發行的) 提前多次,以免稍後等待回應交易的收到。 我在資料庫中建立了一個定期更新的小型緩衝區。

  2. 錦標賽通常持續 Waves 平台區塊鏈的 60 個區塊,目前約為 1 小時。 如果 60 個區塊後至少有兩張門票,則錦標賽被視為已完成並關閉,否則錦標賽活動時間將延長至接下來的 60 個區塊。
  3. 錦標賽結束後,我們會立即生成並發送一筆日期交易(我們還為此支付大約0.005 美元的佣金),如有必要,還會發送幾筆,其中記錄了抽籤的所有條件以及有序的玩家列表(門票)我們需要從中選出獲勝者。
  4. 在這個階段,我們已經有了代碼的第一部分(R-code)加上交易日期ID(TXID)。 我們以串聯(R-code + TXID)的形式將它們發送給預言機進行簽名,我們再次支付佣金+補償。 預言機檢查接收到的資料的唯一性和歸屬性,並作為回應向我們發送 sha256 格式的程式碼的第二部分(S 程式碼),這是隨機數產生器的起點。
  5. 為了獲得指示中獎彩券序號的隨機數,我們將 S 代碼從 sha256 二進位資料轉換為十六進位 (HEX) 表示形式。 然後從產生的十六進位字串中,我們得到一個數字。 我們得到結果數字除以門票數量 (all_tickets) 的餘數,並將結果加 1(以取得 all_tickets 之前的數字 1)。 結果,我們得到了獲勝者的序號。
  6. 如果根據抽獎的條件,有多個獲獎者,那麼我們重複前面的操作,金額等於獎品名額的數量。 在這種情況下,每次我們從清單中刪除一張已中獎的彩票並將 all_tickets 減少 1 時,我們指示先前收到的號碼而不是 S 代碼。

我們來看一個具體的真實例子,第119場:

共有 7 張門票(all_tickets)
票價 50 個硬幣(投注)
遊戲費10%(費用)

根據抽獎條件,獎金的30%,即在這種情況下,必須有 2 張彩票獲得獎品,獎品大小根據公式 (投注 * 所有門票 - 費用)/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

添加評論