截圖 2022-03-22 上午6.55.41.png

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;

contract BetGame {
    //GM
    address public owner;
    bool isFinshed;

    //紀錄玩家用的 struct
    struct Player {
        address payable addr;
        uint amount;
    }

    //存下大的玩家
    Player[] big;
    //存下小的玩家
    Player[] small;

    //下大的總金額
    uint totalBig;
    //下小的總金額
    uint totalSmall;
    uint nowtime;
    constructor () {
        owner = msg.sender;
        totalSmall = 0;
        totalBig = 0;
        isFinshed = false;
        nowtime = block.timestamp;
    }
    function Bet(bool flag)public payable returns (bool){
        require(msg.value>0);
        Player memory p = Player(payable(msg.sender),msg.value);
        //透過bool true 表示下大
        if (flag){
            big.push(p);
            totalBig += p.amount;
        }
        else {
            small.push(p);
            totalSmall += p.amount;
        }
        return true;
    }

    function open() payable public returns(bool){
        //開獎至少要遊戲開始後60秒
        require(block.timestamp > nowtime+60);
        require(!isFinshed);

        //創造出 0-9的變數 0-4為小 5-9為大
        uint points = uint(keccak256(abi.encode(msg.sender,block.timestamp,block.number)))%9;
        uint i = 0;
        Player memory p;
        if (points >=5 ){
            for (i=0; i<big.length; i++){
                p = big[i];
                //給贏家 下注本金+照比例分配獎金
                p.addr.transfer(p.amount+totalSmall*p.amount/totalBig);
            }
        }
        else{
            for(i = 0 ;i< small.length;i++){
                p = small[i];
                p.addr.transfer(p.amount+totalBig*p.amount/totalSmall);
            }
        }
        isFinshed = true;
        return true;
    }
}
  1. 可以想像其實每一檔的活動的智能合約都要有開關來當判定比較好。

  2. constructor 一樣部屬智能合約時給定一次性參數

  3. Player memory p = Player(payable(msg.sender),msg.value);

big.push(p);

small.push(p);

這裏會發現 Player 紀錄參與人的資訊,然後記錄到 押大 or 押小

(試著想像紀錄一個大 或 小的地方)

還可以看到 memory 這個修飾詞,通常是區域變數,標示出來可以讓合約更了解我們的型態

當然這個合約還有可以改善的地方,例如for 的部分可以改變一下使用Map →(address ⇒ Player)

然後直接指定address 查詢較有效率。

18.ERC20

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