大師手把手一步一步來
- block.difficulty: 區塊難度
- msg.value: 別人傳了多少以太幣進來
- msg.sender: 誰在跟智能合約互動?
需求
- 老闆要辦猜數字遊戲
- ✅參與者: 500個客戶
- ✅數字區間: 1-200
- ✅獎金: 0.1ETH
功能
1. ✅猜數字功能
- 有什麼結構?可以記錄, 哪個用戶猜了什麼數字?key 跟 value的關係 -> 問chatgpt: solidity有沒有key-value的資料結構?
mapping(uint => string) public keyValueMap;
2. ✅限定客戶才能猜數字
- 問chatgpt: solidity如何拋出錯誤?
require(condition, "Error message");
- 需要有客戶列表, 才能判斷猜題者是否為客戶。
- 新增客戶列表-> mapping
3. ✅每人限猜一次
4. ✅(只能讓老闆) 設定答案的功能
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?
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;
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.");
for(uint256 i = 0; i < vipList.length; i++){
address user = vipList[i];
uint256 guessNum_ = guessNumMap[user];
if(guessNum_ == answer){
payable(user).transfer(0.1ether);
}
}
}
function deposit() external payble {
}
}
區塊鏈的不可篡改與透明性
[Reference]
- 善用 ChatGPT 專案協作,快速入門智能合約開發,NFT 交易所區塊鏈工程師 Paul Wu 帶你上手 Solidity 自學教程, KryptoCamp 區塊鏈人才培育第一品牌, Nov 7, 2023
[Reference]
- Solidity練習 - 猜數字遊戲
- 善用 ChatGPT 專案協作,快速入門智能合約開發,NFT 交易所區塊鏈工程師 Paul Wu 帶你上手 Solidity 自學教程, KryptoCamp 區塊鏈人才培育第一品牌
- Solidity - 猜数字大小游戏, 登链社区
- solidity简易版猜大小游戏, CSDN
- paulwu0903/GuessNumber.sol
- Day5- Guess Number Game, theoXX