1. 程式人生 > >03.彩票專案程式碼解析

03.彩票專案程式碼解析

1.業務結構

2.程式碼整體結構

3.程式碼重要函式

pragma solidity ^0.4.24;


contract Lottery {
    //      管理員
    address public manager;
    //      彩民集合
    address[] public players;
    address public winner;
    //      第幾期
    uint256 public round;
    
    constructor() public payable {
        manager = msg.sender;
    }
function play() public payable { //\1. 投錢 //\2. 把這個人新增到彩民集合 //msg.value 是通過 web3.js 的send中的value欄位傳進來的 require(msg.value == 1 ether, "111111"); players.push(msg.sender); } //開獎函式,由管理員執行 function kaijiang() onlyManager public { // require(msg.sender == manager);
// 業務邏輯: // 1. 隨機找一個玩家, // 1. 玩家在陣列中players,我們要找一個隨機數,作為下標,找到幸運玩家 // 2. // 2. 給這個人轉合約內所有的錢 // 3. 期數加1 // 4. 彩民池清零 require(players.length != 0, "players length is 0"); uint256 res = uint256(sha3(block.difficulty, now, players.length)); uint index =
res % players.length; winner = players[index]; winner.transfer(address(this).balance); round++; delete players; } //修飾器,限定只有管理可以進行開獎 modifier onlyManager() { require(msg.sender == manager, "111111"); _; } // 業務邏輯: // 1. 對所有參與人進行轉賬,每人1 ether // 2. 期數加一 // 3. 參與池清零 // 條件: // 1. 只有管理員有許可權 // 2. 必須有人蔘與才進行退獎(可選) function tuijiang() onlyManager public{ //Require只有remix新版本才可以看自定義的第二個引數 require(players.length != 0, 'players should not be 0'); for (uint256 i = 0; i < players.length; i++) { players[i].transfer(1 ether); } round++; delete players; } // 1. 返回所有玩家 function getPlayers() public view returns(address[]) { return players; } // 2. 返回玩家人數 function getPlayersCount() public view returns(uint256) { return players.length; } function getBalance() public view returns(uint256) { return address(this).balance; } }