今天這個章節開始看一些小合約,當然我會當一下搬磚工順便複習自己的蓋念
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;
contract redpacket {
//定義此合約發紅包的人
address payable public rich;
//定義要發幾個紅包
uint public number;
constructor(uint _number) payable {
rich = payable(msg.sender);
number = _number;
}
//取得發紅包的人身上餘額
function getBalance() public view returns (uint){
return address(this).balance;
}
//搶紅包
function stakeMoney() public payable returns(bool){
//紅包數須大於0
require(number>0);
//取得餘額需要大於0
require(getBalance()>0);
number --;
//此方法是 random 100內的數字
uint random = uint(keccak256(abi.encode(block.timestamp,msg.sender,"rich")))%100;
uint balance = getBalance();
address payable someone = payable(msg.sender);
//把錢給搶到紅包的人
someone.transfer(balance * random/100);
return true;
}
//合約銷毀
function kill() public{
require(msg.sender == rich);
//透過此function 可以拿來銷毀合約
selfdestruct(rich);
}
}
這裡可以看到有大量的payable 修飾詞,這部分就是表示可以交易eth
uint(keccak256(abi.encode(block.timestamp,msg.sender,"rich")))%100;
這段小弟也沒有很清楚,簡單說就是產生隨機數100內的
someone.transfer
(balance * random/100);
這段transfer
還蠻常用到的,就是轉帳到某個address,在寫的時候需特別注意+多測試。
require(msg.sender == rich);
我們可以看到其實在智能合約裡面是有權限的概念的,所以建議在部署智能合約時都要先規劃好。
有任何問題可反饋: [email protected]