宝くじを例にしたランダムオラクルの使用

ある朝、こんな記事を見つけました。 検証可能な乱数生成器 Waves プラットフォームのブロックチェーン上で。

全体像は明確でしたが、具体的な実装方法は明確ではありませんでした。 いくつかのコード、署名、何が、どこで、なぜ?

オラクルの作者と何度か協議した結果、描画ロジック (PHP で実装) と乱数を取得するアルゴリズムを組み合わせることができました。

  1. トーナメント/ラウンドの開始時に、コードの最初の部分 (R コード) をオラクルにリクエストします。

    現時点では、プレーヤーの数、賞の場所の数、賞金の支払い額、または宝くじの存在全般についての情報はありません。 オラクルはトランザクションを通じて個人用のランダム コードを発行し、そのコードは要求した人だけが一度だけ使用できます。 ちなみに、Rコードは「購入」することができます(リクエストトランザクションのコスト+レスポンストランザクションに対するオラクルへの補償を意味します。これは現在のレートで約0.015ドルの金額です、コード自体は無料で発行されます) ) 後で応答トランザクションの受信を待たないように、事前に数回送信します。 データベース内に定期的に更新される小さなバッファを作成しました。

  2. トーナメントは通常、Waves プラットフォームのブロックチェーンの 60 ブロックで続きますが、現時点では約 1 時間です。 60 ブロック後に少なくとも 60 枚のチケットがある場合、トーナメントは完了して終了したとみなされます。そうでない場合、トーナメントのアクティビティ時間は次の XNUMX ブロックに延長されます。
  3. トーナメントが終了した直後に、必要に応じて、抽選のすべての条件とプレーヤー (チケット) の順序付きリストが記録された複数の日付トランザクションを生成して送信します (これに対して約 0.005 ドルの手数料も支払います)。そこから勝者を選択する必要があります。
  4. この段階では、コードの最初の部分 (R コード) とトランザクション日付 ID (TXID) がすでにあります。 署名のためにそれらを連結 (R コード + TXID) の形式でオラクルに送信し、ここでも手数料 + 補償金を支払います。 オラクルは受信したデータの一意性と帰属性をチェックし、それに応答してコードの 256 番目の部分 (S コード) を shaXNUMX 形式で送信します。これが乱数発生器の開始点です。
  5. 当選チケットのシーケンス番号を示す乱数を取得するには、S コードを sha256 バイナリ データから 1 進数 (HEX) 表現に変換します。 次に、結果の 1 進数文字列から数値を取得します。 結果の数値をチケット数 (all_tickets) で割った余りを取得し、その結果に XNUMX を加算します (all_tickets の前に数値 XNUMX を取得するため)。 その結果、当選者のシリアル番号を取得します。
  6. 抽選の条件に従って複数の当選者がいる場合は、当選枠の数に等しい量だけ前の操作を繰り返します。 この場合、すでに当選したチケットをリストから削除して all_tickets を 1 ずつ減らし、S コードの代わりに以前に受け取った番号を示します。

具体的な実際の例、トーナメント番号 119 を見てみましょう。

チケット合計 7 枚 (all_tickets)
チケット料金 50コイン(ベット)
ゲーム料金 10%(手数料)

宝くじの条件によれば、賞金の 30% が賞金となります。 この場合、2 枚のチケットが賞品を受け取る必要があり、そのサイズは式 (Bet*all_tickets-Fee)/2 に従って計算されます。

1. 受信した R コード: RdbAiAhKhveAtR4eyTKq75noMxdcEoxbE6BvojJjM13VE

2. トーナメントが終了すると、番号 + アドレス (トーナメント参加費の支払いが行われたウォレットのアドレス) のペアの形式でチケットのリストが作成されます。 アドレスが繰り返される場合があることに注意してください。これは、XNUMX 人の参加者が XNUMX つのトーナメントの複数のチケットを購入したことを意味します。これはルールで禁止されていません。

送信されたトランザクション日: 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.

出所: habr.com

コメントを追加します