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
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    James Bachini
    Part 1 index.html (0-6mins) create a index.html - shift + ! select.filter-todo option div.todo-containter <!DOCTYPE html> <html lang="en"> <head
    [Refernce] 55 荷兰拍卖, MasterCui, Mar 29, 2022
    [Reference] Soulbound Token - Code WalkThrough
    [Reference] Create a Multi-Signature Wallet - Solidity Tutorial What is Multisig Technology? What is a multi-sig wallet?
    [Reference] How To Get a Random Number Using Chainlink VRF v2, Chainlink
    James Bachini
    Part 1 index.html (0-6mins) create a index.html - shift + ! select.filter-todo option div.todo-containter <!DOCTYPE html> <html lang="en"> <head
    [Refernce] 55 荷兰拍卖, MasterCui, Mar 29, 2022
    [Reference] Soulbound Token - Code WalkThrough
    [Reference] Create a Multi-Signature Wallet - Solidity Tutorial What is Multisig Technology? What is a multi-sig wallet?
    [Reference] How To Get a Random Number Using Chainlink VRF v2, Chainlink
    你可能也想看
    Google News 追蹤
    Thumbnail
    Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
    Thumbnail
    這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
    Thumbnail
    今天他在做檢查的時候,不知怎?我內在感到好悲傷!🥲
    Thumbnail
    食藥署設置辣椒粉檢出蘇丹色素不合格專區?怎麼點?一次看!...食藥署公布豬肉檢出西布特羅案專家會議紀錄?結論是...
    Thumbnail
    每一個期待透過AI進行寫作的創作者,都能夠從這篇文章獲得啟發。 這將可以幫助你提升GPT4的寫作品質,優化輸入與提示的效能。 藉由這三大策略,你將能夠更有效地利用GPT4來創造出豐富且有趣的文章。
    Thumbnail
    對於使用GPT-4將草稿轉換為次原子想法的你,這篇文章提供了改進GPT-4寫作效率的策略。 通過優化「輸入內容」與「寫作提示」,你將能產出更高質量的次原子想法。 快來嘗試這些經過500次實踐驗證的策略吧!
    Thumbnail
    這算是我自己混合一些現有的知識,然後很直覺地想出來的不專業方法。從結論來說,即時的方法為「當一個負面想法跳出來時,先接納他,然後想三個非負面想法或正面想法去平衡」。
    Thumbnail
    最近的市場剛從銀行倒閉的驚慌失措中脫離,什麼東西都漲的很好,好的就像是牛市要回來了一樣,但是實際上真的是這樣嗎?現在到底是牛還是熊?2023年最重要分出牛熊的時間段或許已經非常接近了,讓我們從一些小細節中看看能否找出控制市場的那隻手真正的企圖吧
    Thumbnail
    可能包含敏感內容
    一陣爆擊槍林彈雨後,滿室瀰漫縈繞不散的濃臭,簡直就像催情劑讓公寓各位男優,精確而言是各頭雄性走獸,身心都逐漸浮燥起來,所以,雖說是排解了性,慾卻像蟄伏在體內的癮頭,蠢蠢蠕動著,連帶使得一絲絲情感,都因焦慮而放大了許多。
    Thumbnail
    論手氣,是酋長還是歐皇好?一般來說,正常情況都會回答後者吧。但,當你喜歡的角不在熱門區內,甚至還經常站到極圈時,就算天生是歐皇手氣的你,也會覺得自己像是酋長一樣。現在蹲在扭蛋機旁邊的熊先生,目前還等不到任何一個人出現……
    Thumbnail
    Hi 我是 VK~ 在 8 月底寫完〈探索 AI 時代的知識革命:NotebookLM 如何顛覆學習和創作流程?〉後,有機會在 INSIDE POSSIBE 分享兩次「和 NotebookLM 協作如何改變我學習和創作」的主題,剛好最近也有在許多地方聊到關於 NotebookLM 等 AI 工具
    Thumbnail
    這是張老師的第三本書,我想前二本應該也有很多朋友們都有讀過,我想絕對是受益良多,而這次在書名上就直接點出,著重在從投資的角度來切入
    Thumbnail
    今天他在做檢查的時候,不知怎?我內在感到好悲傷!🥲
    Thumbnail
    食藥署設置辣椒粉檢出蘇丹色素不合格專區?怎麼點?一次看!...食藥署公布豬肉檢出西布特羅案專家會議紀錄?結論是...
    Thumbnail
    每一個期待透過AI進行寫作的創作者,都能夠從這篇文章獲得啟發。 這將可以幫助你提升GPT4的寫作品質,優化輸入與提示的效能。 藉由這三大策略,你將能夠更有效地利用GPT4來創造出豐富且有趣的文章。
    Thumbnail
    對於使用GPT-4將草稿轉換為次原子想法的你,這篇文章提供了改進GPT-4寫作效率的策略。 通過優化「輸入內容」與「寫作提示」,你將能產出更高質量的次原子想法。 快來嘗試這些經過500次實踐驗證的策略吧!
    Thumbnail
    這算是我自己混合一些現有的知識,然後很直覺地想出來的不專業方法。從結論來說,即時的方法為「當一個負面想法跳出來時,先接納他,然後想三個非負面想法或正面想法去平衡」。
    Thumbnail
    最近的市場剛從銀行倒閉的驚慌失措中脫離,什麼東西都漲的很好,好的就像是牛市要回來了一樣,但是實際上真的是這樣嗎?現在到底是牛還是熊?2023年最重要分出牛熊的時間段或許已經非常接近了,讓我們從一些小細節中看看能否找出控制市場的那隻手真正的企圖吧
    Thumbnail
    可能包含敏感內容
    一陣爆擊槍林彈雨後,滿室瀰漫縈繞不散的濃臭,簡直就像催情劑讓公寓各位男優,精確而言是各頭雄性走獸,身心都逐漸浮燥起來,所以,雖說是排解了性,慾卻像蟄伏在體內的癮頭,蠢蠢蠕動著,連帶使得一絲絲情感,都因焦慮而放大了許多。
    Thumbnail
    論手氣,是酋長還是歐皇好?一般來說,正常情況都會回答後者吧。但,當你喜歡的角不在熱門區內,甚至還經常站到極圈時,就算天生是歐皇手氣的你,也會覺得自己像是酋長一樣。現在蹲在扭蛋機旁邊的熊先生,目前還等不到任何一個人出現……