コンテンツにスキップ

VRF(検証可能なランダム関数)

当社のガチャマシンは、**検証可能なランダム関数(VRF)**を使用して、すべての抽選が証明可能に公平で改ざん防止されていることを保証します。サーバーもユーザーも結果を操作することはできません - そして誰でも独立して検証できます。

仕組み

VRFは、サーバーとクライアントの両方からのエントロピーを組み合わせて、決定論的で検証可能なランダム数を生成します。完全なフローは次のとおりです:

sequenceDiagram
  participant User
  participant Client App
  participant Server
  participant Blockchain

  User->>Client App: ガチャ抽選を開始
  Client App->>Server: 新しい抽選セッションをリクエスト
  Server->>Server: initialEntropyを生成(nanoid)
  Server-->>Client App: pullId + initialEntropyを返す
  Client App->>Client App: clientEntropyを生成(random)
  Client App->>Blockchain: pullId|clientEntropyで支払いを送信
  Blockchain-->>Server: 支払いが確認されました
  Server->>Server: エントロピーを結合して署名
  Server->>Server: ハッシュ → finalEntropy
  Server->>Server: ランダム数に変換 [1-10000]
  Server->>Server: ティア範囲に基づいて賞品を選択
  Server-->>Client App: 賞品 + VRF証明データを返す
  Client App->>Client App: 署名とハッシュの整合性を検証
  User->>User: 独立して結果を検証できます

VRFプロセスのステップバイステップ

1. 初期エントロピー(サーバー側)

ガチャ抽選を開始すると、サーバーはnanoidを使用して10文字のランダム文字列を生成します。これは支払いを行う_前に_データベースにコミットされ、サーバーが後で変更することを防ぎます。

2. クライアントエントロピー(ユーザー側)

あなたのデバイスは独自のランダムデータを生成します。このエントロピーはブロックチェーン上の支払いトランザクションに含まれ、サーバーが変更できない不変の記録を作成します。

3. 結合エントロピー

2つのエントロピーソースが連結されます:

combinedEntropy = initialEntropy + clientEntropy

4. 署名された結合エントロピー

サーバーはEd25519(TweetNaCl経由)を使用して結合エントロピーに署名します:

signedCombinedEntropy = Ed25519.sign(combinedEntropy, serverSecretKey)

この署名は、サーバーが特定のエントロピー値を処理したことを証明します。

5. 最終エントロピー

署名はSHA-256を使用してハッシュ化され、最終エントロピーを生成します:

finalEntropy = SHA256(signedCombinedEntropy)

6. ランダム数生成

最終エントロピーは[1, 10000]の範囲の数値に変換されます:

randomNumber = (BigInt(finalEntropy) % 10000) + 1

これにより、0.01%の精度で均一に分布したランダム数が得られます。

7. 賞品ティアの選択

ランダム数は、設定された確率範囲に基づいて賞品ティアにマッピングされます。各ガチャマシンには独自のティア構成があります。

なぜこれが公平なのか

flowchart TD
  subgraph ServerCantCheat ["サーバーは不正できない"]
      A[初期エントロピーは<br/>支払い前にコミット] --> B[クライアントエントロピーを<br/>見た後に変更できない]
  end

  subgraph UserCantCheat ["ユーザーは不正できない"]
      C[クライアントエントロピーは<br/>ブロックチェーントランザクション内] --> D[初期エントロピーを<br/>見た後に変更できない]
  end

  subgraph Deterministic ["結果は決定論的"]
      E[同じ入力は常に<br/>同じ出力を生成] --> F[誰でも<br/>計算を検証できる]
  end

  B --> G[公平な結果]
  D --> G
  F --> G

サーバーは結果を操作できない 理由:

  • 初期エントロピーは支払い前にデータベースにコミットされます
  • サーバーはコミット後までクライアントエントロピーを知りません
  • 何かを変更すると暗号署名が無効になります

ユーザーは結果を操作できない 理由:

  • クライアントエントロピーはブロックチェーントランザクションに埋め込まれています
  • 一度送信すると変更できません
  • サーバーの初期エントロピーはすでに固定されています

結果は検証可能 理由:

  • すべてのエントロピー値は抽選後に返されます
  • 署名検証用の公開鍵が公開されています
  • 誰でも正確な計算を再現できます

結果の検証

各ガチャ抽選後、完全なVRF証明データを受け取ります:

  1. Initial Entropy - サーバーのランダム文字列(支払い前にコミット)
  2. Client Entropy - あなたのランダムデータ(ブロックチェーントランザクションから)
  3. Signed Combined Entropy - サーバーのEd25519署名
  4. Final Entropy - 署名のSHA-256ハッシュ
  5. Random Number - 導出された数値 [1-10000]
  6. Prize Tier - あなたのロールが着地したティア

アプリは自動的に検証します:

  • ✓ 署名が公開鍵と一致する
  • ✓ 署名のハッシュが最終エントロピーと等しい
  • ✓ ランダム数の計算が正しい

Ed25519とSHA-256の任意の実装を使用して手動で検証することもできます。

技術仕様

コンポーネント実装
Initial entropynanoid(10) - 10文字のランダム文字列
Signature algorithmEd25519(TweetNaCl)
Hash functionSHA-256
Random range[1, 10000] 包括的
Precision0.01%(100ベーシスポイント)

公開鍵

署名検証用のVRF公開鍵:

i5ScBBvmGh6my9B/X+NpcUIlvRSWz7+U8M7/GprNzYk=

これはbase64エンコードされた32バイトのEd25519公開鍵です。検証に使用するには、base64からデコードして生バイトを取得し、任意のEd25519実装(TweetNaClなど)を使用してこのキーで署名を検証します。