什么是随机数攻击?
许多合约直接使用区块信息如 timestamp、blockhash 等在合约内生成随机数。这很容易被 MINER 操控,因为他们可以选择哪些交易打包进区块。黑客可以在获知随机数生成算法后,操控其中变量获取有利结果。
生成安全随机数的方法:
使用 Chainlink VRF 等去中心化随机数生成服务
将随机数生成过程放在链下,并利用预言机将结果上链
使用多方 Commit-Reveal 机制,由多个实体共同参与随机数生成
引入不确定因素如用户交互增加不可预测性
代码示例:
// Use 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) {
// Use commit and reveal values to generate random number
}