学习以太坊部署智能合约(八) — 智能合约彩票项目

这里小编主要分享出合约代码,仅供参考!

pragma solidity ^0.4.24;

// 彩票项目

contract Lottery {
    
    
    // 1. 管理员: 负责开奖和退钱
    // 2. 彩民池,address[] player
    // 3. 当前期数, round ,每期结束加一

    address public manager;
    address[] public players;
    uint256 public round;
    address public winner;

    // 管理员
    constructor() public {
    
    
        manager = msg.sender;
    }

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

    modifier onlyManager {
    
    
        require(msg.sender == manager);
        _;
    }

    // 开奖函数:从彩民池(数组)中找到一个随机彩民(找随机数)
    // 找到一个特别大的数(随机),对我们的彩民数组长度求余数
    // 用哈希数值来实现大的随机数
    // 哈希内容的随机:当前时间,区块的挖矿难度,彩民数量,作为输入

    // 找随机数
    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];

        // require(msg.sender == manager); // 限定管理员

        uint256 money = address(this).balance * 90 / 100;
        uint256 money1 = address(this).balance - money;

        winner.transfer(money);
        manager.transfer(money1);

        round++;  //期数加一
        delete players;  // 一轮之后清理彩民池

    }

    // 退奖逻辑
    // 1. 遍历players数组,逐一退款1 ether
    // 2. 期数加一
    // 3. 彩民池清零
    ///  调用者的花费手续费(管理者)

    function tuijiang() onlyManager public {
    
    
        for(uint256 i = 0; i < players.length; i++){
    
    
            players[i].transfer(1 ether);
        }

        round++;
        delete players;
    }

    // 获取彩民数
    function getPlayersCount() 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;
    }



}

如果大家想实现前端交互,大家可以参考以下博文!!!

https://blog.csdn.net/i_CodeBoy/article/details/107772444

猜你喜欢

转载自blog.csdn.net/YM_1111/article/details/115919672