透明性と証明可能な公平性を保証するため、各マルチプレイヤーゲームに対して1000万個のSHA256ハッシュのチェーンを生成しました。サーバーシークレットから始まり、SHA256の出力が1000万回繰り返して自身にフィードバックされています
Platformの最終ハッシュのSHA256は: eeb4d340bfaed702601b9a08faba2f8088c4810c3e3a883293accaf25053b883
Crashの最終ハッシュのSHA256は: c46f0705f6ba4df891ce44accda8f89f5a6fa8b987eb7c7b445280cf6cabfbc6
Battleの最終ハッシュのSHA256は: 63cb1eb64ec4eb4de02f6bad85e42365d08f37497a1b7e907bd0b9183f27e1b3
これをここに公開することにより、代替のSHA256チェーンを選択する可能性を排除しています。現在、ゲームサーバーはこのハッシュチェーンを逆順で再生し、これらの値を使用して、証明可能な形でゲーム結果を計算しています。
1. シークレット初期ハッシュ: 各マルチプレイヤーゲームタイプには独自のプライベート初期ハッシュ(サーバーのみが知っている)があり、ユニークなハッシュチェーンのルートを形成します。
2. ハッシュチェーン生成: 初期シークレットハッシュから、SHA256を繰り返し適用することで1000万個のハッシュのチェーンを生成します。
func HashSeed(seed string) string {
hash := sha256.Sum256([]byte(seed))
return hex.EncodeToString(hash[:])
}
func CalculateHashChain(firstHash string) []string {
hashes := make([]string, 10_000_000)
for i := int64(0); i <= 10_000_000; i++ {
firstHash = HashSeed(firstHash)
hashes[i] = firstHash
}
return hashes
}
3. 逆順消費: チェーンの最終ハッシュを公開します。各ゲームラウンドはハッシュを逆順で消費します: ラウンド1はhash[10_000_000]を使用し、ラウンド2はhash[9_999_999]を使用し、以下同様...
4. この設計により、将来のハッシュを偽造することは不可能ですが、誰もが以前のすべてのハッシュを検証できます。
予測不可能性: 将来のゲーム結果は、サーバーによってさえ知られたり影響を受けたりすることができません。
検証可能性: プレイヤーは、公開された最終ハッシュのみを使用して、以前のラウンドの完全性を検証できます。
ゲーム分離: 各ゲームタイプには独自のチェーンがあり、ゲーム間の操作を防ぎます。
シングルプレイヤーゲームで証明可能な公平性を確保するために、当プラットフォームは結果シードを生成するための3つの主要コンポーネントに基づくシステムを使用しています:
1. クライアントシード: これはユーザーが制御するシードです。ユーザー登録時に自動生成されますが、ユーザーはいつでも変更できます。クライアントシードの変更により、新しいサーバーシードの生成が開始されます。
2. サーバーシード: サーバーが内部パラメータを使用して生成され、ユーザーには開示されません。現在のクライアントシードに一意にバインドされています。各クライアントシードには対応するサーバーシードがあります。ユーザーがクライアントシードを変更すると、以前のサーバーシードが検証目的で開示されます。
3. ノンス: ベットのタイムスタンプ(ミリ秒単位)に基づいた一意の数値です。繰り返されたアクションでも異なる結果を生成することを保証します。
これら3つの値はHMAC-SHA256を使用して結合およびハッシュされ、最終的なゲームシードを生成します。その後、ゲームの結果を決定するために使用されます。
func GenerateUserGameSeed(userSeed string, userServerSeed string, nonce int64) (string, error) {
data := fmt.Sprintf("%s:%s:%d", userServerSeed, userSeed, nonce)
mac := hmac.New(sha256.New, []byte(data))
gameSeed := hex.EncodeToString(mac.Sum(nil))
return gameSeed, nil
}
サーバーは、任意のベットが行われる前に、現在のサーバーシードのハッシュ化されたバージョンを提供します。
ユーザーがクライアントシードを変更すると、以前に使用されていたサーバーシードが開示されます。
これにより、ユーザーは、以前のサーバーシードで生成されたすべての結果が一貫していて公平であることを検証できます。