使用算法实现随机数的生成
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract GenerateRandomNumber {
// modulo (%)
// 要做的事情是接受一个输入范围,使用加密图形散列算法,得到随机数字
function randMod(uint256 range) external view returns (uint256) {
// abi.encodePacked 可以连接参数
return
uint256(
keccak256(
abi.encodePacked(
block.timestamp,
block.difficulty,
msg.sender
)
)
) % range;
}
}
- 练习,使用oracle dynamic feeds实现随机
Oracle函数
这段代码定义了一个名为 Oracle 的智能合约。智能合约是一种区块链上的自动执行的程序,它遵循由 Solidity 编写的智能合约语言。
在这个智能合约中,定义了一个变量 admin,用来存储发布智能合约的地址。还定义了一个 uint256 类型的公共变量 rand,用来存储一个随机数。
智能合约还定义了一个名为 constructor 的构造函数,它在智能合约被部署时会自动执行。在这个构造函数中,会将 admin 变量的值设置为部署智能合约的地址。
智能合约还定义了一个名为 feedRand 的函数,它允许指定的用户更新随机数的值。这个函数只能由 admin 调用,因为在函数中会检查调用者的地址是否与 admin 的地址相同。如果调用者是 admin,那么函数会将 rand 变量的值设置为传入函数中的参数 _rand。
GenerateRandomNumber函数
这段代码定义了一个名为 GenerateRandomNumber 的智能合约。这个智能合约接受一个输入范围,并使用加密图形散列算法(cryptographic hash function)生成随机数。智能合约定义了一个名为 oracle 的变量,用来引用一个 Oracle 合约的实例。智能合约还定义了一个构造函数,该函数接受一个地址,并使用该地址初始化 oracle 变量。智能合约还定义了一个名为 randMod 的函数,该函数接受一个 uint256 类型的参数 range,并返回一个 uint256 类型的随机数。在函数中,会使用 oracle.rand、区块时间戳、区块难度和调用者地址作为参数,并使用 keccak256 加密图形散列算法计算出一个值。然后,函数会将这个值对 range 取模,并返回模的值作为随机数。
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract Oracle {
address admin;
uint256 public rand;
constructor() public {
admin = msg.sender;
}
function feedRand(uint256 _rand) external {
require(msg.sender == admin);
rand = _rand;
}
}
contract GenerateRandomNumber {
// modulo (%)
// 要做的事情是接受一个输入范围,使用加密图形散列算法,得到随机数字
Oracle oracle;
constructor(address oracleAddress) {
oracle = Oracle(oracleAddress);
}
function randMod(uint256 range) external view returns (uint256) {
// abi.encodePacked 可以连接参数
return
uint256(
keccak256(
abi.encodePacked(
oracle.rand,
block.timestamp,
block.difficulty,
msg.sender
)
)
) % range;
}
}