266-ethereum抽奖小游戏






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++;
    }
    
}







 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值