今天這個章節開始看一些小合約,當然我會當一下搬磚工順便複習自己的蓋念

截圖 2022-03-21 下午8.53.57.png

// 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);
    }
}
  1. 這裡可以看到有大量的payable 修飾詞,這部分就是表示可以交易eth

  2. uint(keccak256(abi.encode(block.timestamp,msg.sender,"rich")))%100;

    這段小弟也沒有很清楚,簡單說就是產生隨機數100內的

  3. someone.transfer(balance * random/100);

    這段transfer還蠻常用到的,就是轉帳到某個address,在寫的時候需特別注意+多測試。

  4. require(msg.sender == rich);

我們可以看到其實在智能合約裡面是有權限的概念的,所以建議在部署智能合約時都要先規劃好。

16.案例2 - 拍賣

有任何問題可反饋: [email protected]