ランダム数攻撃とは何ですか?
多くの契約では、タイムスタンプ、ブロックハッシュなどのブロック情報を使用して契約内でランダム数を生成します。これはマイナーによって簡単に操作される可能性があります。なぜなら、彼らはどのトランザクションをブロックにパッケージ化するかを選択できるからです。ハッカーはランダム数生成アルゴリズムを知った後、その変数を操作して有利な結果を得ることができます。
安全なランダム数の生成方法:
Chainlink VRF などの分散型ランダム数生成サービスを使用する
ランダム数生成プロセスをオフチェーンに配置し、オラクルを使用して結果をオンチェーンにする
複数の参加者が共同してランダム数を生成するためのコミットリベールメカニズムを使用する
ユーザーの相互作用などの不確定要素を導入して予測不能性を高める
コードの例:
// Chainlink VRFを使用する
uint256 public randomResult;
function getRandomNumber() public returns (bytes32 requestId) {
return requestRandomness(keyHash, fee);
}
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
randomResult = randomness;
}
// コミットリベールスキーム
function commit(bytes32 hash) external;
function reveal(uint value) external;
function random() external view returns (uint) {
// コミットとリベールの値を使用してランダム数を生成する
}