首页 > 其他分享 >经典智能合约案例之发红包

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

时间:2023-05-28 21:01:31浏览次数:35  
标签:红包 sender 智能 抢红包 number 案例 发红包 msg


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

功能分析:

  • 发红包:发红包的功能,可以借助构造函数实现,核心是将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该红包合约:

经典智能合约案例之发红包_构造函数

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

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

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

然后进行抢红包:

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

经典智能合约案例之发红包_构造函数_03

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

经典智能合约案例之发红包_构造函数_04

标签:红包,sender,智能,抢红包,number,案例,发红包,msg
From: https://blog.51cto.com/u_15736437/6366444

相关文章

  • Unity的Undo:详解解析与实用案例
    UnityUndo详解在Unity中,Undo是一个非常重要的功能,它可以让开发者在编辑器中进行操作时,随时撤销之前的操作,从而避免不必要的错误。本文将详细介绍UnityUndo实现原理和使用方法,并提供多个使用例子,帮助开发者更好地理解和应用该功能。实现原理UnityUndo的实现原理是通过记录每个......
  • 马斯克要用人工智能对抗人工智能
    ​      导读:马斯克对人工智能可能变得失控并“摧毁人类”的担忧促使他采取行动,发起了一个名为“TruthGPT”的项目。 本文字数:1400,阅读时长大约:9分钟 亿万富翁埃隆·马斯克在谈到人工智能(AI)的危险时,从他的虚构角色托尼·斯塔克那里得到了启示。 在漫威电影宇宙......
  • Unity的IPostGenerateGradleAndroidProject:深入解析与实用案例
    UnityIPostGenerateGradleAndroidProjectUnity是一款流行的跨平台游戏引擎,它支持多种平台,包括Android。在Unity中,我们可以使用IPostGenerateGradleAndroidProject接口来自定义Gradle构建过程。本文将介绍如何使用IPostGenerateGradleAndroidProject接口,并提供三个使用例子。IPos......
  • Unity的UnityStats: 属性详解与实用案例
    UnityStats属性详解UnityStats是Unity引擎提供的一个用于监测游戏性能的工具,它提供了一系列的属性值,可以帮助开发者解游戏的运行情况,从而进行优化。本文将详细介绍UnityStats的每个属性值,并提供多个使用例子帮助开发者更好地使用UnityStats。帧率相关属性UnityStats.fps......
  • Unity的IGenerateNativePluginsForAssemblies:深入解析与实用案例
    UnityIGenerateNativePluginsForAssembliesUnity是一款非常流行的游戏引擎,它支持多种平台,包括Windows、Mac、Linux、Android、iOS等。在Unity中,我们可以使用C#编写游逻辑,但是有些时候我们需要使用一些原生的代码来实现一些高性能的功能,比如图像处理、音频等。这时候,我们就需要使......
  • Unity的IUnityLinkerProcessor:深入解析与实用案例
    UnityIUnityLinkerProcessorUnityIUnityLinkerProcessor是Unity引擎中的一个接口,它允许开发者在Unity项目构建时对代码进行链接处理。这个接口可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度。接口定义IUnityLinkerProcessor接口定义如下:namespace......
  • Unity的IGenerateNativePluginsForAssemblies:深入解析与实用案例
    UnityIGenerateNativePluginsForAssembliesUnity是一款非常流行的游戏引擎,它支持多种平台,包括Windows、Mac、Linux、Android、iOS等。在Unity中,我们可以使用C#编写游逻辑,但是有些时候我们需要使用一些原生的代码来实现一些高性能的功能,比如图像处理、音频等。这时候,我们就需要使......
  • Unity的IActiveBuildTargetChanged:深入解析与实用案例
    UnityIActiveBuildTargetChangedUnityIActiveBuildTargetChanged是Unity引擎中的一个非常有用的功能,它可以让开发者在切换构建平台时自定义哪些操作需要被执行。这个功能可以帮助开发者更好地控制项目的构建过程,确保在切换构建平台时执行必要的操作。在本文中,我们将介绍UnityIA......
  • Unity的IPreprocessShaders:深入解析与实用案例
    UnityIPreprocessShadersUnityIPreprocessShaders是Unity引擎中的一个非常有用的功能,它可以让开发者在编译Shader时自定义哪些操作需要被执行。这个可以帮助开发者更好地控制Shader的编译过程,确保在编译Shader时执行必要的操作。在本文中,我们介绍UnityIPreprocessShaders的使用......
  • Unity的IPreprocessComputeShaders:深入解析与实用案例
    UnityIPreprocessComputeShadersUnityIPreprocessComputeShaders是Unity引擎中的一个非常有用的功能,它可以让开发者编译ComputeShader时自定义哪些操作需要被执行。这个可以帮助开发者更好地控制ComputeShader的编译过程,确保在编译ComputeShader时执行必要的操作。在本文中,我......