บันทึกการเรียนรู้ Solidity ผ่าน Ethernaut

Published on

เขียนวันที่ : May 2, 2022

  • บันทึกการเรียนรู้ Solidity ผ่าน Ethernaut
ethernaut/intro

สวัสดีครับ วันนี้ผมจะขอมาบันทึกการเรียนรู้ Solidity ผ่าน Ethernaut นะครับ ตัวผมเองก็เพิ่งเริ่มศึกษา Solidity ไม่นาน ก็เลยคิดว่าจะลองเอา Ethernaut มาฝึก เพื่อเรียนรู้ครับ

และคิดว่าไหนๆ ก็เรียนรู้แล้ว จดบันทึกไปด้วย และก็เผื่อเป็น Guide สำหรับคนที่สนใจเหมือนๆกัน เป็นแหล่งเรียนรู้เพิ่มเติมไปด้วยเลย น่าจะดี เพราะโลก Web3 นั้นไปไวมาก

จริงๆ แล้ว ตัว Ethernaut ผมเห็นมีคนโพสพวก Solution พวก How-to, Guide, Walkthrought กันเยอะอยู่เหมือนกัน แต่นั่นไม่ใช่เป้าหมาย เป้าหมายของผมคือการลองทำด้วยตัวเองก่อน และค่อยดู Solution ของคนอื่นๆ ทีหลัง

Ethernaut คือ?

Ethernaut เป็นเกมฝึกแก้โจทย์ Web3/Solidity จริงๆ มันอารมณ์คล้ายๆ การ hack มากกว่า แรงบันดาลใจมาจาก Overthewire - ที่ให้เราได้เรียนและฝึกฝนเกี่ยวกับ Security

ซึ่งตัว Ethernaut ก็เป็นแบบฝึก ทั้งมุมมองที่เราเข้าใจ Solidity มากขึ้น และก็เข้าใจเรื่องของ Security ไปด้วย

ตัวเกมจะแบ่งออกเป็น Level เรียงลำดับความง่าย ไป ยาก

เป้าหมายการเรียนรู้ คือ

  1. ฝึกโจทย์ผ่าน Browser จากเว็บ Ethernaut
  2. นำโจทย์มารันด้วย Hardhat - ตัว Repo ผมอัพลง Github ไว้ที่นี่
  3. เรียนรู้จาก solhint และ warning ต่างๆ รวมถึงลองฝึกในรูปแบบต่างๆ
  4. ตัว Contract เป็น Solidity v0.6 ซึ่งปัจจุบัน 0.8+ และคิดว่ามี breaking changes บ้าง ฝึกโดยการสร้าง Contract ให้เป็น v0.8

เตรียมความพร้อม

จริงๆ เริ่มต้นที่หน้า Hello Ethernaut ก็จะมีขั้นตอน คำอธิบาย ว่าเริ่มยังไง

1. Setup Metamask

  • ติดตั้ง Metamask ใช้เป็น Browser Extension ของอะไรก็ได้แล้วแต่ชอบ (Chrome, Firefox, Brave, Edge)
  • ผมสร้างเป็น Browser Profile ใหม่ เพื่อแยก Metamask ไว้สำหรับ Dev
  • Network เลือกเป็น Rinkeby Testnet
  • กรณีไม่มี Rinkeby Testnet ให้เลือก ให้ไปปรับ ก่อน ที่ Settings -> Advanced -> Show test networks

2. เปิด Browser's Console

  • เช่นบน Chrome เปิด Tools -> Developer Tools หรือ View -> Developer -> Developer Tools
  • หากเปิดไม่เป็น อ่านนี่ครับ Open Chrome DevTools
  • ใช้ Console เป็น เช่น พิมพ์ player หรือ help() ได้

3. Helper function help()

(index)Value
player'current player address'
ethernaut'main game contract'
level'current level contract address'
contract'current level contract instance (if created)'
instance'current level instance contract address (if created)'
version'current game version'
getBalance(address)'gets balance of address in ether'
getBlockNumber()'gets current network block number'
sendTransaction(option)'send transaction util'
getNetworkId()'get ethereum network id'
toWei(ether)'convert ether units to wei'
fromWei(wei)'convert wei units to ether'

4. async/await

  • เราสามารถใช้ await ผ่าน Console ได้เลย โดยไม่ต้องใช้กับ async function

5. Free Ether

  • หากเปิด Wallet ใหม่ ไม่มี Ether ใช้ ก็ต้องไปขอจาก Paradigm faucet เพื่อเป็นค่า gas

6. instance

  • ทุกๆ Level จะต้องกด Get new instance เป็นเหมือนการสร้าง Contract ใหม่ จากนั้น เราก็จะ interact กับ contract ที่เราสร้างได้ โดยใช้ contract หรือดูข้อมูล contract address ด้วย instance
  • ถ้าแก้โจทย์เสร็จแล้ว ก็กด Submit instance

ลองเล่น 0. Hello Ethernaut ดูนะครับ หรือใครจะข้ามไปเลยก็ได้ เพราะจริงๆ ก็เป็นแค่ Guide แนะนำเบื้องต้น

พร้อมแล้วก็ไปลุย Level 1 เลยละกัน 🤣

สำหรับบันทึกของผม อาจจะไม่ได้มีทุกวัน อยู่ที่ช่วงเวลาว่างด้วย ว่าจะว่างจากงาน หรือหาเวลาว่างมาเรียนได้มั้ย ฉะนั้นก็ไม่การันตีว่าจะอัพบทความบ่อยๆ หรือว่าจะทำครบหรือเปล่า 🤣

หากส่วนไหนมีข้อผิดพลาด ขออภัยด้วยครับ และหากผู้ที่หลงเข้ามาอ่าน มีข้อเสนอแนะ คำติชม สามารถแลกเปลี่ยนกันได้นะครับ แล้วมาเรียนรู้ไปด้วยกันนะครับ ขอบคุณครับ

Discord