什麼是隨機數攻擊?
許多合約直接使用區塊信息如 timestamp、blockhash 等在合約內生成隨機數。這很容易被 MINER 操控,因為他們可以選擇哪些交易打包進區塊。黑客可以在獲知隨機數生成算法後,操控其中變量獲取有利結果。
生成安全隨機數的方法:
使用 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 scheme
function commit(bytes32 hash) external;
function reveal(uint value) external;
function random() external view returns (uint) {
// 使用 commit 和 reveal 值來生成隨機數
}