以太坊彩票合約代碼


編輯 彩票合約代碼

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

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM