基于以太坊的抽奖demo

操作系统:centos 7.6
当前目录:$HOME/workspace/

  1. 安装 truffle
npm install -g truffle
  1. 创建项目目录 eth-lottery
mkdir eth-lottery
cd eth-lottery
  1. 初始化 truffle 项目,直接借用别人写好的react模版
truffle unbox react
  1. 添加抽奖相关的合约
cd contracts
vim Lottery.sol

Lottery.sol

pragma solidity ^0.5.0;

contract Lottery {
        address payable public manager;
        address payable[] public playersSlice;
        mapping(address => bool) public playersMap;
        uint256 public round = 0;
        address payable public winner;

        constructor() public {
                manager = msg.sender;
        }   

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

        function play() public payable {
                require(msg.value == 1 ether);
                require(!playersMap[msg.sender]);
                playersMap[msg.sender] = true;
                playersSlice.push(msg.sender);
        }   

        function getBalance() public view returns(uint256) {
                return address(this).balance;
        }   

        function getPlayersSlice() public view returns(address payable[] memory) {
                return playersSlice;
        }   

        function getPlayersCnt() public view returns(uint256) {
                return playersSlice.length;
        }   

        function randomUInt256(uint256 seed) private view returns(uint256) {
                bytes memory v1 = abi.encodePacked(block.timestamp, block.difficulty, seed);
                bytes32 v2 = keccak256(v1);
                return uint256(v2);
        }   

        function calBonusAndIncome(uint256 balance) private pure returns(uint256, uint256) {
                uint256 bonus = balance * 9 / 10; 
                uint256 income = balance - bonus;
                return (bonus, income);
        }   

        function drawPrize() onlyManager public {
                uint256 len = playersSlice.length;
                require(len > 0); 
                uint256 idx = randomUInt256(len) % len;
                winner = playersSlice[idx];
                uint256 bonus;
                uint256 income;
                (bonus, income) = calBonusAndIncome(getBalance());
                manager.transfer(income);
                winner.transfer(bonus);
                ++round;
                for (uint256 i = 0; i < len; ++i) {
                        delete(playersMap[playersSlice[i]]);
                }
         }

        function withdrawPrize() onlyManager public {
                for (uint256 i = 0; i < playersSlice.length; ++i) {
                        address payable player = playersSlice[i];
                        delete(playersMap[player]);
                        player.transfer(1 ether);
                }
                delete(playersSlice);
        }
}
    <
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值