03.彩票專案程式碼解析
阿新 • • 發佈:2018-12-18
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;
}
}