以太坊彩票合约代码

编辑 彩票合约代码

pragma solidity ^0.4.24;


contract Lotter {
    // 1.管理员: 负责开奖和退奖
    // 2.彩民池: address[] players
    // 3.当前期数:round ,每期结束后加一
    // 4.当前中奖者
    address public manager;
    address[] public players;
    uint256 public round;
    address winner;

    constructor() public {
        //设置合约的部署人为管理者
        manager = msg.sender;
    }

    //投注函数
    // 1.每个人可以投多次,但是每次只能投 1 ether
    function play() payable public {
        // 1.每个人可以投多次,但是每次只能投 1 ether
        require(msg.value == 1 ether);
        // 2.把参与者加入彩民池中
        players.push(msg.sender);
    }

    //开奖函数
    // 目标: 从彩民池(数组)中找到一个随机彩民(找一个随机数)
    // 找到一个特别大的数(随机) ,对我们彩民数组长度求余数
    // 用哈希数值来实现大的随机数。 v3
    // 哈希内容的随机:当前时间,区块的挖矿难度,彩民数量,作为输入
    // bytes memory v1 = abi.encodePacked(block.timestamp,block.difficulty,play.length
    // Bytes32 v2 = keccak256(v1)
    // uint256 v3 = uint256(v2)
    function kaiJiang() onlyManager public {
        bytes memory v1 = abi.encodePacked(block.timestamp, block.difficulty, players.length);
        bytes32 v2 = keccak256(v1);
        uint256 v3 = uint256(v2);

        //求余
        uint256 index = v3 % players.length;

        //设置中奖者
        winner = players[index];

        //拿到合约的金额 ,中奖者拿90% 10% 给管理者
        //
        uint256 monry = address(this).balance * 90 / 100;
        uint256 monry1 = address(this).balance - monry;
        //给中奖者和管理员转钱
        winner.transfer(monry);
        manager.transfer(monry1);
        //清理工作
        // 期数+1
        round++;
        //清空中奖者
        delete players;
    }

    // 退奖逻辑
    // 1.遍历player 数组,zu一退款1ether
    // 2.期数加一
    // 3.彩民池清0
    // 调用者花费手续费(管理员)
    function tuiJiang() onlyManager public {
        for (uint256 i = 0; i < players.length; i++) {
            players[i].transfer(1 ether);
        }
        round++;
        delete players;
    }

    // 设置只能管理员能开奖
    modifier onlyManager{
        require(msg.sender == manager);
        _;
    }

    //返回当前参与的人数
    function getPlayCount() public view returns (uint256){
        return players.length;
    }

    // 查看当前余额
    function getBalance() public view returns (uint256){
        return address(this).balance;
    }
    //返回所有的彩民和参考者
    function getPlayers() public view returns (address[]){
        return players;
    }

}

 

 

posted @ 2019-12-11 14:21  jackluo  阅读(1063)  评论(0编辑  收藏  举报