How to use DappChef to enhance Solidity Skill?
April 08, 2023
Dapp Chef 使用心得
Preface
大家好,我是來自 SWF Lab 的成員,FoodChain!這篇文主要想要分享我們 Lab 最近製作的一項專案,希望可以分享給更多想學習 solidity 的人們。
開始 DappChef 的動機
當初在學習 solidity 的時候,看到了許多免費的資源,像是 Cryptozombie 的學習平台。如果你不知道 Cryptozombie,他是一個以專案導向的學習方式,一步步的帶過 solidity 的各種語法,其中也包括 ERC721、ERC20、Chainlink Oracle 與 Truffle 等課程 (現今版本還有 zkSync 😂)。
雖然對於初來乍到學習 solidity 的人而言,Cryptozombie 算是個蠻不錯的資源,有著詳細的語法教學、比對答案的系統與以專案為導向的教學方式。
但很遺憾的是,學習到後面會發現它只是一個「文字對比器」而已,例如多一個會被當成錯誤的答案。
"contract": ✅
" contract": ❌
寫過程式的人應該都知道,對於同個問題的解法,一百個人來寫可能會有一百種解法,因此「文字對比器」對於學習程式的方式真的頗有限。
對於一般在學校學習程式語言的人應該都接觸過 Online Judge。以我自己為例,使用過台大資工的 Judge Girl、電機系自己架設的 Online Judge 與資管系的 PDogs。Online Judge 的模式,是先將使用者輸入的程式碼進行編譯後,依照每一題多個獨立測資計算結果,最後比對是否與預期答案相同。
因此 Online judge 會更人性化的比對函式產生的結果是否與預期的結果相同,而並非只是一昧的比較文字是否正確與否,也被我們認為是一個很適合做為學習工具的系統。
若是在業界中提到 Online Judge,可能會想到 LeetCode 這套系統,除了可以對於不同的程式語言做編譯,也有非常多題目可以練習,我相信 Online Judge 一定幫助了許多學習程式的人們。
而我們觀察到學習 solidity 的過程中並沒有一個好用的 Online Judge 來幫我們批改,因此萌發了開發 DappChef 的想法。
下面我會帶大家看一下 DappChef 的使用方式語介紹他的特色!
DappChef 簡介
如果你還沒聽過 DappChef,他是類似 solidity 版本的 Leetcode,你可以在這個平台上面學習 Ethereum 的智能合約語言 -- solidity。
🍩 DappChef is a Ethereum Smart Contract Development Learning platform, which is similar to Leetcode.
你可以在上面解題,接著進行編譯的動作,待編譯成功後便可以進行 Online Judge 系統,最後會在網頁的 console 上呈現出你是否成功通過了這道題目。
題目從基礎的語法內容、ERC20、ERC721、ERC1155 等,還包含進階一點的內容,像是 ECDSA 的 recover 流程、Merkle Root 的驗證或是 Defi 中流動性、
下面我來示範一次 DappChef 的解題流程
使用情境 (以解題為例 )
1. Sign in
(在打開之前,請確定你的瀏覽器有提供 Metamask 的 extension。若不知道 Metamask 是什麼,請前往這個網站。 )
進入 DappChef.com 後,你會看到一個很精美的封面動畫!
但是這時是無法使用 DappChef 來進行解題的,因此你需要按下右上角的「Sign In」來連接你的 Metamask。
連接成功後,畫面突然驟變,我們的主廚正在火爆的炒著程式碼。並且你在右上角的頭像會變成一顆可愛的蛋 😂。
接下來你可以點下「Start」或是「向下」進入 Problems 的部分。
2. 選題
在這個頁面中你可以看到四個分類:
- Tag: 這道題目的分類。
- Title: 這道題目的標題。
- Difficulty: 難度,會隨星星數而上升。
- Status: 你登入的帳號是否解完這一題了。 (可以看到我上面登入的地址還沒寫過任何一題! )
你可以參考每一題的 Tag、Title 或是 Difficulty 來選擇你想要挑戰的題目。 (又或是你不知道怎麼選擇,便直接點進去看也可以 )
這邊我選擇了第一題!
3. 進入解題畫面的說明
在解題的畫面中,會有兩個主要的框框。
第一個框框有著這題的資訊,像是 id、Tag、Title 與星星數。
最重要的是可以看到右上角有個「Discussion」的按鈕,如果對解題上有任何問題的話,例如完全沒有頭緒或是在 Judge 的時候遇到問題,都可以前往這個平台來詢問!
有一個討論的平台真的會幫助學習者的思考,除了可以汲取不同的想法外,也可以比較自己的做法與他人做法的優缺點,可以增加學習的速度。
第二個框框便是題目本身了!
基本上,你只要依循著 TODO
以及 Comment
中的說明 ,便可以順利的完成每一題了,以這題為例,可以看到有 4 個 TODO
呈現在畫面上,並在 contract
前也有題目的說明。
這邊就交給大家自己完成這個題目吧!
4. 解題完成
解題完成後,可以按下題目框右下角的 Compile
。
這時有任何錯誤都會在左方的 console 中印出來。
因此你在作答區先將答案寫完後,需要先進行 Compile
,確認程式的語法上完全無誤後再進行批改。
5. Judge
成功 Compile
後,下方會出現 Judge
的 console 與按鈕。
按下 Judge
後,系統會跳出 Metamask,請你進行交易。這筆交易主要是為了將合約部署到 Goerli 鏈上,以便隨後的批改。
若回答錯誤,錯誤資訊會出現在 Judge
的 console 中。
Trying to deploy problem 1 with Deployer Contract:
Tx successful with hash: 0xfe53fe43ef6db35bcf292a3fde302f08d5f3243376c77a53c0b90aecb4d74045
Deployed contract address is 0xFF0D11f6A07891c423E05b187727150b264E0771
Begin the Judging...
Testing 0: getUint()
- Sample Input:
- Sample Output: 0
- Your Output: 12
...Wrong Answer!
✨ Done in 4.73s.
如果回答正確後,你可以在 Judge
的 console 中看到下面的資訊。
Trying to deploy problem 1 with Deployer Contract:
Tx successful with hash: 0x2ed3be30c496fa0883964ca0fb417fbbddda641f0a2b98af314bc4e66dfb451d
Deployed contract address is 0x42c3827135362D2048fe37f95F615c3438C02D5d
Begin the Judging...
Testing 0: getUint()
- Sample Input:
- Sample Output: 0
- Your Output: 0
...Accepted!
Testing 1: getBool()
- Sample Input:
- Sample Output: false
- Your Output: false
...Accepted!
Testing 2: getAddress()
- Sample Input:
- Sample Output: 0x0000000000000000000000000000000000000000
- Your Output: 0x0000000000000000000000000000000000000000
...Accepted!
Testing 3: getString()
- Sample Input:
- Sample Output:
- Your Output:
...Accepted!
All Accepted!
Total Used Gas: 0
✨ Done in 4.87s.
6. Mint NFT!
在批改且全部通過後 (代表你通過這題 ),頁面會跳出以下的畫面讓你去 mint。
按完之後 Metamask 會再跳出一次交易,這次交易就是為了 mint 解題成功的 NFT。
這枚 NFT 的意義有二:
- 作為「解題成功的憑證」,在 mint 後可以在「Profile」裡面看到。
- 紀錄解題的「時間戳記」,在 mint 時會自動紀錄解完題的時間戳記,紀錄你是在何時完成這一題的。
7. 去 profile 查看你得到的 NFT
成功 Mint 後會跳回主頁,此時你可以按右上角的「Profile」,在這個頁面中可以看到你自己的資訊。
最左邊 Badge
是你完成題目後 mint 到你地址中的 NFT,中間的 Solved Problem
代表你已完成的題目。
而最右面的 User Info
中有個圖表可以查看你目前一星、二星與三星的答題狀況。
8. 查看 Dune 的資料
回到主頁,在 Find Your Dune data here...
這邊可以查看 DappChef 整體的答題狀況:總用戶數、總提交次數、平均完成題數、完成題數的級距與你目前與全部人的排名。
你也可以挑戰成為 User Rank 上的第一名!
Conclusion
最後統整一下我認為 DappChef 有哪些好處:
For Learner
首先,對於學習者 (尤其是學生 )而言,我認為「免費」這件事是非常重要的。DappChef 提供了一個完全免費的環境,從 Deploy 到 Mint NFT 都是在測試鏈上進行,且也沒有任何一個地方會需要使用者付費。
在 DappChef 上除了可以練習 solidity 的主要語法,其中也有需要進階的題目可以讓大家學習。另外其中也提供討論區 (可見 3.進入解題畫面的說明 )讓大家討論題目內容,在你毫無靈感的時候提供想法。
For Employer
這可能是我們最想透過 DappChef 達成的事情。
一般大公司 (Facebook、Google、Amazon 等 )在篩選人才時,會將 Leetcode 作為他們的參考標準,例如 LeetCode 上的拿到的分數,或將類似的題目作為考題。但是在 web3/區塊鏈 的公司中尚未發展出這樣的一套標準與流程,因此我們也誠心希望 DappChef 能夠在未來可以幫助這些公司發展出篩選人才的標準。