乱数攻撃とは何ですか?
多くの契約は、timestamp、blockhash などのブロック情報を直接使用して契約内で乱数を生成します。これは、マイナーがどの取引をブロックにパッケージ化するかを選択できるため、簡単に操作される可能性があります。ハッカーは乱数生成アルゴリズムを知った後、その変数を操作して有利な結果を得ることができます。
安全な乱数を生成する方法:
Chainlink VRF などの分散型乱数生成サービスを使用する
乱数生成プロセスをオフチェーンに配置し、結果をオラクルを使用してチェーンに送信する
複数のエンティティが共同して乱数生成に参加するマルチパーティ Commit-Reveal メカニズムを使用する
ユーザーインタラクションなどの不確定要素を導入して予測不可能性を増やす
コード例:
// 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;
}
// Commit-Revealスキーム
function commit(bytes32 hash) external;
function reveal(uint value) external;
function random() external view returns (uint) {
// コミットおよびリベール値を使用して乱数を生成する
}