以太坊 solidity 随机抽奖合约——搏一搏,单车变摩托

   最近准备做一个以太坊的抽奖游戏,今天先把合约完成。

   智能合约只实现关键部分的功能,包括随机选取中奖者,存储每个人的中奖情况,以及开奖的时机;

现在我们一个一个模块来说一下;

第一个选择中奖者,这个函数的基础是生成随机数;

function winnerNumber() private returns(uint) {
        uint winner = uint(keccak256(abi.encodePacked(now, msg.sender, nonce))) % 3;
        nonce++;
        return winner;
    }

我们使用时间、抽奖着地址、nonce值,通过encodePacked进行编码,然后进行hash处理(keccak256);取得一个随机数,然后对3取余,就可以随机选取一个获胜者;其实目前以太坊智能合约中很难生成无法预测的随机数,可以使用Oracalize服务,不过是收费的。不过个人觉得资金比较小的时候,其实还是可以使用时间,blockhash等链上信息生产随机数,如果资金比较大了之后,需要注意。

第二个参加抽奖,这个函数逼近简单,就是记录了参加抽奖人的地址信息;

    function draw() public payable {
        require(msg.value == 0.01 ether);
        require(participantsCount < 3);
        require(drawSituation(msg.sender) == false);
        cormorants[Count] = msg.sender;
        Count++;
        if (Count == 3) {
            produceWinner();
        }
    }

    function drawSituation(address _cormorant) private view returns(bool) {
        bool contains = false;
        for(uint i = 0; i < 3; i++) {
            if (cormorants[i] == _cormorant) {
                contains = true;
            }
        }
        return contains;
    }

这个没有太复杂需要解释的,就是当有三个人参加抽奖之后,就开奖了;

第三个选择中奖者,这个函数其实是第一个函数的一个封装;

    function produceWinner() private returns(address) {
        require(Count == 3);
        address winner = cormorants[winnerNumber()];
        winner.transfer(address(this).balance);
        delete cormorants;
        Count = 0;
        return winner;
    }

选择了中奖者之后,把奖池里的所有奖金都发送飞中奖者;

到这已经把抽奖的智能合约写完了,这里只是简单写了一个模版,需要复杂功能的朋友,例如,人数,中奖时机,奖金分配方式等,可以自行进行修改调试。

github 地址:https://github.com/XuHugo/solidityproject/tree/master/lottery

以太坊 solidity 随机抽奖合约——搏一搏,单车变摩托_第1张图片

你可能感兴趣的:(以太坊那点币事儿,智能合约安全与实践)