以太坊dapp智能合约示例——通过映射用户来玩彩票

简介: 在前面的一些文章中,我们学习了以太坊智能合约编程的基础知识。现在我们来建立一个实战以太坊dapp案例:彩票。我们彩票案例的目的是多个玩家能够通过发送钱参与彩票。

在前面的一些文章中,我们学习了以太坊智能合约编程的基础知识。现在我们来建立一个实战以太坊dapp案例:彩票。

我们彩票案例的目的是多个玩家能够通过发送钱参与彩票。玩家发送的钱越多,他赢得所有资金的机会就越大。当彩票的运营发行者决定关闭彩票后,就会选择一个优胜者,并将全部资金转给这名优胜者。

为了存储每个玩家的彩金,我们将看到一个新的数据类型,这就是mappingmappingkey绑定到一个值。声明必须同时指定key的类型和值。例如,这里我们将存储属于某个地址的钱:

mapping(address => uint) usersBet;

usersBet[msg.sender] = 10;

// usersBet[msg.sender] == 10

不爽的是如果索引不是线性的,即使我们知道记录的数量,也无法迭代mapping的值。因此,为了迭代我们的彩金,我们需要单独地存储玩家的数量和玩家在另一个映射中的地址列表。

所以我们将存储3个变量包括彩票运营发行者的地址:

mapping(address => uint) usersBet;
mapping(uint => address) users;
uint nbUsers = 0;
uint totalBets = 0;

address owner;

我们然后构建一个Bet函数。正常账户一样,智能合约可以操控以太坊。我们Bet函数需要有一个支付彩金的功能。当函数被调用的时候他就将投入的彩金值发送给以太坊智能合约,并将发送以太币的数量存储在msg.value

所以当函数被调用时,我们先检查发送的以太币值是否大于零即msg.value>0。然后我们将发送值存储在usersBet的映射中。如果这个玩家的彩金等于0,我们递增我们的nbUsers并存储玩家的地址,这样我们可以在关闭这一期彩票时遍历所有玩家。。

function Bet() public payable  {
    if (msg.value > 0) {
       if (usersBet[msg.sender] == 0) { // Is it a new player
          users[nbUsers] = msg.sender;
          nbUsers += 1;
       }
     usersBet[msg.sender] += msg.value;
     totalBets += msg.value;
    }
}

我们的彩票dapp的最后一部分是挑选优胜者。我们的函数EndLottery()只能由彩票的所有者访问。为了简化程序,我们将选择一个随机数在0与玩家数量之间。然后,我们将进行迭代筛选,并检查谁赢了。当玩家被发现时,我们会简单地将智能合约作为确认优胜者的一个主要依据。他将得到合约中所有的钱。

function EndLottery() public {
    if (msg.sender == owner) {
        uint sum = 0; 
        uint winningNumber = uint(block.blockhash(block.number-1)) % totalBets;
        for (uint i=0; i < nbUsers; i++) {
           sum += usersBet[users[i]]; 
           if (sum >= winningNumber) {
               selfdestruct(users[i]);
               return;
           }
        }
    }
}

一个特别的说明,我们在这个示例中使用了一个非常简单的方法来获取或取值,现实中特别是在处理钱的时候,你需要用一个更好的方法来获得真正的随机数。

下面所有的智能合约代码放在一起:

pragma solidity ^0.4.11;

contract Lottery {

    mapping(address => uint) usersBet;
    mapping(uint => address) users;
    uint nbUsers = 0;
    uint totalBets = 0;

    address owner;

    function Lottery() {
        owner = msg.sender;
    }

    function Bet() public payable  {
        if (msg.value > 0) {
            if (usersBet[msg.sender] == 0) {
                users[nbUsers] = msg.sender;
                nbUsers += 1;
            }
            usersBet[msg.sender] += msg.value;
            totalBets += msg.value;
        }
    }

    function EndLottery() public {
        if (msg.sender == owner) {
            uint sum = 0;
            uint winningNumber = uint(block.blockhash(block.number-1)) % totalBets + 1;
            for (uint i=0; i < nbUsers; i++) {
                sum += usersBet[users[i]];
                if (sum >= winningNumber) {
                    selfdestruct(users[i]);
                    return;
                }
            }
        }
    }

}

所以让我们部署我们的合约并且来玩一把。我们将用我们的两个账户来发送彩金用以太坊币。作为一个功能你会看到我们可以调用函数payable进行支付。

发送了以太币后,你会发现智能合约现在成立了。

如果你从彩票运营者账户调用EntLoTyTye()函数,彩票收益将转移给优胜者,并且智能合约也将结束。

在本文中,我们使用payable修饰符,使它可以发送以太币到我们的智能合约。

  • 以太坊dapp,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

原文转自这个以太坊博客

相关文章
|
算法 Python
合约/现货量化交易/合约交易/秒合约系统开发dapp技术搭建/Python代码规则示例
合约/现货量化交易/合约交易/秒合约系统开发dapp技术搭建/Python代码规则示例
|
4月前
|
存储 区块链
Swap/dapp去中心化交易所系统开发技术逻辑及源码示例
Swap/DApp去中心化交易所系统开发涉及复杂的去中心化交易模型、智能合约和流动性池技术。智能合约用于资产交换、流动性管理等功能,确保交易的安全性和透明度。以下是一个简化的Swap智能合约源码示例,展示了基本的代币交换功能。
|
8月前
|
区块链
关于代币合约项目系统开发DAPP模式方案【源码示例】
以下是一个简单的以太坊代币合约代码示例,它定义了一个名为 `Token` 的代币合约。在实际使用中,请确保您已获得适当的许可并遵循相关法规。
|
8月前
|
区块链
ptahDAO质押智能合约模式系统开发逻辑源码示例
 从Web1.0到Web2.0,是用户与互联网双向深化信息交互的过程。具体体现为用户为参与主体,App为应用载体,但同时也带来一个问题,即平台权力的迅速扩张。
|
安全 区块链
defi丨dapp智能合约代币系统开发(开发案例)/需求详细/逻辑方案/项目源码
The development of the Defi single and dual currency pledge liquidity mining system requires the following steps: requirement analysis, system design, contract writing, front-end and back-end development, testing and deployment. Firstly, conduct a comprehensive requirement analysis of the system&#39;s f
|
10月前
|
安全
dapp发行代币合约质押模式系统开发案例项目/详细功能/教程步骤/源码程序
The development of a DApp (decentralized application) based token issuance and contract pledge mode system involves multiple aspects, including token issuance, smart contract development, and pledge function design. The following is an overview of the logic development process
|
存储 前端开发 编译器
智能合约与DApp的关系与区别
以太坊社区把基于智能合约的应用称为去中心化的应用程序(Decentralized App,简称DApp)。
智能合约与DApp的关系与区别
|
安全 前端开发 网络安全
DAPP三三复制公排系统开发详情模式|智能合约
  去中心化交易所系统的开发需要具备区块链开发、智能合约编程和前端开发等多种技能。在开发过程中需要注重市场需求和用户体验,同时要保证系统的安全性与性能稳定性。
|
存储 区块链
DAPP合约代币三三复制公排系统开发模式详情
要理解智能合约的概念和作用,首先需要了解区块链的基本架构
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。