经典智能合约案例之发红包

简介: 经典智能合约案例之发红包

经典智能合约案例:发红包

角色分析:发红包的人和抢红包的人

功能分析:

  • 发红包:发红包的功能,可以借助构造函数实现,核心是将ether打入合约;

  • 抢红包:抢红包的功能,抢成功需要一些断言判断,核心操作是合约转账给抢红包的人;

  • 退还:当红包有剩余的时候,允许发红包的人收回余额,可以用合约销毁来实现;

实现发红包功能

  • 需要一个有支付功能的地址,用于发红包(谁创建合约,谁就是发红包的人)

  • 需要传入一个红包的数量(number),红包的金额从msg.value传入

  • 在构造函数中,指定发红包的人和红包数量

  • 需要一个查询红包余额的功能函数(提示:address(this).balance)

实现抢红包的功能

  • 需要一个给抢红包的人转账的功能函数

  • 函数中需要判断:1. 红包余额大于0; 2. 红包剩余个数大于0;(提示:断言)

  • 红包数量随着函数执行的次数相应减少;

  • 抢红包的金额采用随机的方式(提示:用keccak256函数计算当前时间戳的哈希),红包的金额是100以内的数(提示:哈希值对100取余)

  • 转账功能:msg.sender.transfer(amount) (amount为金额);

实现退还红包余额

  • 可以借助selfdestruct函数,用于销毁合约,其原型如下:

    function selfdestruct(address user)

  • user代表合约销毁时的受益人;

  • 实现一个kill函数,用它来销毁合约,指定发红包的人为受益人;

合约代码:

pragma solidity ^0.6.1;

contract red_pocket{
    uint256 public number;
    address payable public pocket_sender;
    mapping(address => bool) isGot;
    // Send red packets
    // Specify the person and the number of red envelopes
    constructor(uint256 count) public payable{
        require(msg.value > 0, "msg.value must >0");
        require(count > 0, "count must > 0");
        number = count;
        pocket_sender = msg.sender;
    }

    // Query the balance of the red envelope
    function getBalance() public view returns(uint256){
        return address(this).balance;
    }

    // GetPocket
    function getPocket() public payable {
        require(!isGot[msg.sender],"msg.sender must not get");
        require(number > 0, "number must >0");
        require(getBalance() > 0, "getBalance() must > 0");
        uint256 amount = uint256 (keccak256(abi.encode(msg.sender,pocket_sender,now,number)))%100;
        msg.sender.transfer(amount);
        number --;
        isGot[msg.sender] = true;
    }

    // Refund the balance of the red envelope
    function kill() public{
        selfdestruct(pocket_sender);
    }
}

合约执行截图:

首先deploy该红包合约:

deploy.png

在抢红包之前先查询一下相关的信息:

可见总额度为20230324wei,按照delpoy,一共是6个红包,发送者的地址如下:

prequery.png

然后进行抢红包:

可见,总额度相应减少,红包的个数也减少1。

getpocket.png

最后,kill销毁合约,实现退还红包余额。

kill.png

目录
相关文章
|
2月前
|
存储 安全 区块链
DAPP持币生息系统开发|模式案例|开发指南
智能合约是一种计算机协议,在协议制定和部署后,不需要外加人为干预,即可实现自我执行和自我验证
|
3月前
|
安全 区块链 数据库
DAPP持币生息项目系统开发|步骤逻辑|源码案例
智能保证执行安全,并减少交易成本。智能合约允许在没有第三方的情况下进行可信交易,且交易可追踪、不可逆转
|
7月前
|
安全
dapp预约抢单排单互助系统开发逻辑详细/功能说明/案例分析/方案规则/源码出售
Allow users to register accounts and verify their identities to ensure that the identities of participants are valid and authentic.
|
6月前
|
存储 安全 前端开发
DApp公排互助预约抢单排单模式系统开发参考版/详细流程/方案逻辑/规则玩法/案例设计/源码程序
需求分析:与团队明确系统的需求、目标和范围,包括公排互助预约抢单排单模式系统的功能、规则、奖励机制等方面
|
6月前
|
存储 安全 API
NFT/dapp卡牌链游智能合约系统开发详细指南/案例设计/规则玩法/源码项目
DApp智能合约系统开发功能是指为构建去中心化应用程序(DApp)而设计和开发的智能合约的功能。
|
8月前
|
安全 区块链
区块链DApp盲盒抽奖游戏开发合约部署源码详情
区块链DApp盲盒抽奖游戏开发合约部署源码详情
|
8月前
|
安全 区块链
BSC链盲盒游戏系统开发详情案例丨dapp链上合约盲盒游戏系统开发方案项目/逻辑规则/成熟技术/源码功能
  DApp(去中心化应用程序)盲盒游戏系统的开发涉及到在区块链上构建和运行盲盒游戏。
|
8月前
|
安全 区块链 存储
区块链dapp哈希竞猜游戏系统开发(开发案例)丨DAPP哈希竞猜智能合约游戏系统开发规则玩法/方案详细/稳定版/源码案例
哈希函数是一种将任意长度的数据转换成固定长度的数据的过程。该过程是不可逆的,这意味着很难从哈希值还原原始数据
|
8月前
|
存储 前端开发 安全
BSC链盲盒游戏系统开发实现技术原理丨dapp盲盒游戏系统开发案例规则/源码设计/方案项目
  智能合约:它们是存储在区块链上的计算机程序,在满足预定条件时运行,智能合约是用Solidity语言编写的