4.3 [實作] 猜數字合約

閱讀時間約 8 分鐘

大師手把手一步一步來

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
    尋大神腳印, 亦步亦趨。
    留言0
    查看全部
    發表第一個留言支持創作者!
    從 Google News 追蹤更多 vocus 的最新精選內容