ethereum抽奖小游戏
我们先来写合约
pragma solidity ^0.4.24;
contract Lottery{
}
我们分析一下
需要哪些状态变量
1.管理员, 地址
2.彩民池, 地址数组
3.期数, uint
4.赢家, 地址
contract Lottery{
address public manager;
address[] public players;
address public winner;
uint public round;
}
然后我们来写方法
function play() public payable{
//限定每次只能投注1个eth
require(msg.value == 1 ether);
//记录彩民
players.push(msg.sender);
}
然后写一个返回全部玩家的方法
function getPlayers() public view returns(address[]){
return players;
}
现在我们看下完整代码
然后测试一下
pragma solidity >=0.4.22 <0.6.0;
contract Lottery{
address public manager;
address[] public players;
address public winner;
uint public round;
function play() public payable{
//限定每次只能投注1个eth
require(msg.value == 1 ether);
//记录彩民
players.push(msg.sender);
}
function getPlayers() public view returns (address[] memory){
return players;
}
}
我们用remix测试一下
先deploy部署一下
然后用一个地址去调用play()
因为我们设置了必须要1个ether
所以value要给1个ether
然后我们调用play()
调用成功
然后我们调用getPlayers()
调用成功,返回一个玩家
然后如果我们用不同的地址去访问play()
然后再次调用getPlayers()
就有几个不同的玩家地址
继续代码
我们写个方法获取一下当前合约的余额
function getBalance() public view returns(uint){
return address(this).balance;
}
我们加入两个玩家地址
然后调用getBalance()
发现余额为2000000000000000000
正确
开奖逻辑
1.只有管理员可以开奖
2.选择一个随机的彩民
我们可以利用keccak256来生成随机数
3.向中奖者转账
4.彩民池清零
5.期数加1,进入下一期
modifier onlyManager{
require(msg.sender==manager);
_;
}
function draw() public onlyManager{
//获取时间戳,玩家个数,区块链难度
bytes memory infos = abi.encodePacked(block.timestamp,players.length,block.difficult);
//生成hash
bytes32 hash = keccak256(infos);
//求余数
winnerIndex = uint(hash) % players.length;
//赢家
winner = players[winnerIndex];
//转账
winner.transfer(address(this).balance);
//清空彩民池
delete players;
//期数加1
round++;
}
然后我们来看下完整代码
pragma solidity >=0.4.22 <0.6.0;
contract Lottery{
address public manager = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address payable[] public players;
address payable public winner;
uint public round;
function play() public payable{
//限定每次只能投注1个eth
require(msg.value == 1 ether);
//记录彩民
players.push(msg.sender);
}
function getPlayers() public view returns (address payable[] memory){
return players;
}
function getBalance() public view returns(uint){
return address(this).balance;
}
modifier onlyManager{
require(msg.sender==manager);
_;
}
function draw() public onlyManager{
//获取时间戳,玩家个数,区块链难度
bytes memory infos = abi.encodePacked(block.timestamp,players.length,block.difficulty);
//生成hash
bytes32 hash = keccak256(infos);
//求余数
uint winnerIndex = uint(hash) % players.length;
//赢家
winner = players[winnerIndex];
//转账
winner.transfer(address(this).balance);
//清空彩民池
delete players;
//期数加1
round++;
}
}