經(jīng)典智能合約案例:發(fā)紅包
角色分析:發(fā)紅包的人和搶紅包的人
功能分析:
-
發(fā)紅包:發(fā)紅包的功能,可以借助構(gòu)造函數(shù)實(shí)現(xiàn),核心是將ether打入合約;
-
搶紅包:搶紅包的功能,搶成功需要一些斷言判斷,核心操作是合約轉(zhuǎn)賬給搶紅包的人;
-
退還:當(dāng)紅包有剩余的時(shí)候,允許發(fā)紅包的人收回余額,可以用合約銷(xiāo)毀來(lái)實(shí)現(xiàn);
實(shí)現(xiàn)發(fā)紅包功能
-
需要一個(gè)有支付功能的地址,用于發(fā)紅包(誰(shuí)創(chuàng)建合約,誰(shuí)就是發(fā)紅包的人)
-
需要傳入一個(gè)紅包的數(shù)量(number),紅包的金額從msg.value傳入
-
在構(gòu)造函數(shù)中,指定發(fā)紅包的人和紅包數(shù)量
-
需要一個(gè)查詢(xún)紅包余額的功能函數(shù)(提示:address(this).balance)
實(shí)現(xiàn)搶紅包的功能
-
需要一個(gè)給搶紅包的人轉(zhuǎn)賬的功能函數(shù)
-
函數(shù)中需要判斷:1. 紅包余額大于0; 2. 紅包剩余個(gè)數(shù)大于0;(提示:斷言)
-
紅包數(shù)量隨著函數(shù)執(zhí)行的次數(shù)相應(yīng)減少;
-
搶紅包的金額采用隨機(jī)的方式(提示:用keccak256函數(shù)計(jì)算當(dāng)前時(shí)間戳的哈希),紅包的金額是100以?xún)?nèi)的數(shù)(提示:哈希值對(duì)100取余)
-
轉(zhuǎn)賬功能:
msg.sender.transfer(amount)
(amount為金額);
實(shí)現(xiàn)退還紅包余額
-
可以借助selfdestruct函數(shù),用于銷(xiāo)毀合約,其原型如下:
function selfdestruct(address user)
-
user代表合約銷(xiāo)毀時(shí)的受益人;
-
實(shí)現(xiàn)一個(gè)kill函數(shù),用它來(lái)銷(xiāo)毀合約,指定發(fā)紅包的人為受益人;
合約代碼:
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);
}
}
合約執(zhí)行截圖:
首先deploy該紅包合約:
在搶紅包之前先查詢(xún)一下相關(guān)的信息:
可見(jiàn)總額度為20230324wei,按照delpoy,一共是6個(gè)紅包,發(fā)送者的地址如下:
然后進(jìn)行搶紅包:
可見(jiàn),總額度相應(yīng)減少,紅包的個(gè)數(shù)也減少1。
最后,kill銷(xiāo)毀合約,實(shí)現(xiàn)退還紅包余額。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-725969.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-725969.html
到了這里,關(guān)于經(jīng)典智能合約案例之發(fā)紅包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!