2024-05-03|閱讀時間 ‧ 約 28 分鐘

4.3 [實作] 猜數字合約

    大師手把手一步一步來

    1. tutorialpoints

    • block.difficulty: 區塊難度
    • msg.value: 別人傳了多少以太幣進來
    • msg.sender: 誰在跟智能合約互動?

    需求

    1. 老闆要辦猜數字遊戲
    2. ✅參與者: 500個客戶
    3. ✅數字區間: 1-200
    4. ✅獎金: 0.1ETH

    功能

    1. ✅猜數字功能

    • 有什麼結構?可以記錄, 哪個用戶猜了什麼數字?key 跟 value的關係 -> 問chatgpt: solidity有沒有key-value的資料結構
    // 定義映射
    mapping(uint => string) public keyValueMap;

    2. ✅限定客戶才能猜數字

    • 問chatgpt: solidity如何拋出錯誤?
    // require():用於檢查條件是否滿足,如果不滿足則拋出錯誤並中止交易
    require(condition, "Error message");
    • 需要有客戶列表, 才能判斷猜題者是否為客戶。
    • 新增客戶列表-> mapping

    3. ✅每人限猜一次

    4. ✅(只能讓老闆) 設定答案的功能

    • 答案要介於1-200之間

    5. ✅(只能讓老闆)發獎勵

    • 取得用戶猜什麼數字(需要一個資料型態記錄所有用戶猜的數字, 問chatGPT, solidity有沒有方法可以遍歷整個map? -> 沒有, 但可以維護陣列array, 用陣列去存這些對應關係, 也就是會員資料, 再把會員資料去map裡面核對)]
    • 白名單, 會員資料要匯入進來合約裡供查核
    array
    1.動態大小: 裡面不用放數字, 可以動態新增
    2.必須透過push function,不斷新增array後面的值
    3. .length可以查看他的長度
    • 取得正確答案
    • 比對用戶數字看答案(總共500個用戶, 連續循環500次比對數字) -> 迴圈
    • 比對正確就發錢(問chatGPT, 判斷式怎麼寫?If-else寫法, solidity怎麼接收跟轉移以太幣?transfer, 怎麼用solidity轉0.1ETH? 10^17wei)
    • 限定只有老闆可以發獎勵 -> 問chatGPT: 怎麼讓智能合約紀錄創建者地址?
    • 合約裡要有錢才能發-> 問chatGPT: 怎麼寫一個接收以太幣的function?
    // SPDX-License-Identifier: MIT
    pragma solidity 0.8.24;

    contract guessnumber {

    uint256 number;

    uint256 creator;

    uint256 answer;

    uint256 totalParticipants = 500;
    uint256 maxNum = 200;
    uint256 minNum = 1;

    mapping(address => uint) public guessNumMap; mapping(uint => string) public keyValueMap;
    mapping(address => bool) public isVip;
    mapping(address => bool) public isGuess;

    address[] vipList;

    constructor(address[]memory whitelist) {
    creator = msg.sedner; // 將當前的發送者(部署者)地址賦值給creator
    for(uint256 i = 0; i < whitelist.length; i++){
    address vip = whitelist [i];
    vipList.push(vip);
    isVip [vip]= true;
    }
    }

    function guessNum(uint256 num) public {
    require(isVip[msg.sender] == true, "not a vip.");
    require(isGuess[msg.sender] == true, "already guess.");
    require(num >= minNum && maxNum <= maxNum, "over range.");

    guessNumMap[msg.sender] = num;
    isGuess[msg.sender] = true;
    }

    function setAnswer(uint256 _answer) public {
    require(msg.sender == creator, "not a creator.");
    require(_answer >= minNum && maxNum <= maxNum, "over range.");
    answer = _answer;
    }

    function sendReward() public {
    require(msg.sender == creator, "not a creator.");
    //1. 取得用戶猜什麼數字
    for(uint256 i = 0; i < vipList.length; i++){
    address user = vipList[i]; //mapping - key
    uint256 guessNum_ = guessNumMap[user];
    //2. 取得答案 -> 直接呼叫
    //3. 比對用戶數字和答案
    //4. 比中發錢

    //判斷式
    if(guessNum_ == answer){
    payable(user).transfer(0.1ether);//0.1ETH
    }

    }
    }

    function deposit() external payble {
    // 1 ether = 10^18 wei
    }
    }

    區塊鏈的不可篡改與透明性


    [Reference]

    1. 善用 ChatGPT 專案協作,快速入門智能合約開發,NFT 交易所區塊鏈工程師 Paul Wu 帶你上手 Solidity 自學教程, KryptoCamp 區塊鏈人才培育第一品牌, Nov 7, 2023


    [Reference]

    1. Solidity練習 - 猜數字遊戲
    2. 善用 ChatGPT 專案協作,快速入門智能合約開發,NFT 交易所區塊鏈工程師 Paul Wu 帶你上手 Solidity 自學教程, KryptoCamp 區塊鏈人才培育第一品牌
    3. Solidity - 猜数字大小游戏, 登链社区 
    4. solidity简易版猜大小游戏, CSDN
    5. paulwu0903/GuessNumber.sol
    6. Day5- Guess Number Game, theoXX
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.