角色分析:发红包的人和抢红包的人
功能分析:
msg.sender.transfer(amount)
(amount为金额);
function selfdestruct(address user)
合约代码:
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销毁合约,实现退还红包余额。