編輯 彩票合約代碼
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; } }

