经典智能合约案例:发红包
角色分析:发红包的人和抢红包的人
功能分析:
-  发红包:发红包的功能,可以借助构造函数实现,核心是将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个红包,发送者的地址如下:

然后进行抢红包:
可见,总额度相应减少,红包的个数也减少1。

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



![深度学习进阶篇-国内预训练模型[5]:ERINE、ERNIE 3.0、ERNIE-的设计思路、模型结构、应用场景等详解](https://img-blog.csdnimg.cn/img_convert/fe2baa3a11c8b3824ac5dee44b5086cc.png)















![[中间件漏洞]apache漏洞复现](https://img-blog.csdnimg.cn/c823804bc8cf4256b9d21f1ffd539e7a.png)
