วันนี้จะพามาดูการใช้เครื่องมือต่าง ๆ สำหรับการพัฒนา Ethereum Smart Contract กันครับ โดยเริ่มตั้งแต่สร้างโปรเจคด้วย Truffle จนถึงการ deploy smart contract ไปที่ blockchain เลยครับ
Truffle เป็น framework ที่ใช้สำหรับการพัฒนา Ethereum ซึ่งเป็นเครื่องมือที่ช่วยอำนวยความสะดวกในหลาย ๆ ด้าน เช่น
● Compile Smart Contract
● Test Smart Contract ด้วย Mocha หรือ Chai ได้
● Deploy contract ไป Chain ที่ต้องการได้
● Log ไปเล่นกับ Smart Contract ที่ Deploy ไปได้
เรียกได้ว่าเป็น one-stop solution สำหรับการพัฒนา Ethereum เลยก็ว่าได้ครับ
เพื่อให้สะดวกในการทำงานผมแนะนำให้ติดตั้ง NVM ซึ่งเป็นตัวบริหารจัดการ Node version เนื่องจากบ่อยครั้งที่ในบางโปรเจคมีความต้องการใช้ Node version ที่แตกต่างกัน โดย NVM ทำให้สามารถเปลี่ยนแปลง version ของ Node ที่จะนำไปใช้ได้ง่ายมาก ๆ
ติดตั้ง NVM
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
จากนั้นติดตั้ง Node version 12.16 ดังนี้
$ nvm install 12.16
$ nvm use 12.16
ทดสอบ Node version ดังนี้
ดู version ของ node และ npm ที่ใช้งานอยู่
ติดตั้ง Truffle ด้วย npm โดยใช้คำสั่งต่อไปนี้
$ npm install -g truffle
ต่อมาเริ่มสร้างโปรเจค metacoin ซึ่งเป็นโปรเจคตัวอย่างของทาง Truffle ที่เตรียมไว้ให้เราศึกษา โดยเราจะตั้งชื่อ Folder ว่า Metacoin โดยใช้คำสั่งต่อไปนี้
$ mkdir Metacoin
$ cd Metacoin
$ truffle unbox metacoin
เมื่อสร้างโปรเจคเสร็จแล้ว เราจะเห็นว่าโปรเจคมีโครงสร้างดังต่อไปนี้ คือ
● contracts/: ใช้สำหรับเก็บ .sol ไฟล์ หรือ Solidity contact ต่าง ๆ
● migrations/: ใช้สำหรับเก็บไฟล์สำหรับ Migration และ Deplotment ไฟล์
● test/: ใช้สำหรับเก็บไฟล์สำหรับทำ test
● truffle.config.js/: ใช้สำหรับตั้งค่าของ truffle
ต่อมาเพื่อความรวดเร็วในการศึกษาการใช้งาน truffle เราจะมาดูไฟล์ต่าง ๆ จากตัวอย่างโปรเจคเริ่มต้นกันครับ
โดยเริ่มจากเปิดโปรเจคด้วย VSCode ดังนี้ (ใช้ Editor อะไรก็ได้นะครับแล้วแต่สะดวกครับผม)
เปิดโปรเจค MetaCoin ด้วย VSCode
จากนั้นให้ติดตั้ง Extension Solidity ด้วยดังนี้
ติดตั้ง solidity ใน VSCode
เริ่มจากศึกษาดูจากไฟล์ต่างๆดังนี้
● contracts/MetaCoin.sol : เป็น Smart Contract ซึ่งเขียนด้วยภาษา Solidity สำหรับสร้าง token MetaCoin โดยในไฟล์นี้จะอ้างอิงไปถึงไฟล์ contracts/ConvertLib.sol ด้วยที่อยู่ใน directory เดียวกัน
MetaCoin.sol
● contracts/Migrations.sol : เป็นไฟล์ Solidity ที่แยกออกมาสำหรับบริหารจัดการ state ของการ deploy smart conteact
● migrations/2_deploy_contracts.js : ไฟล์นี้ใช้สำหรับบอกว่าเราจะ deploy contract อะไรบ้าง?
2_deploy_contracts.js
● test/TestMetacoin.sol : ไฟล์สำหรับ test Solidity
● test/metacoin.js : ไฟล์สำหรับ test. JavaScript
● truffle-config.js : ไฟล์สำหรับตั้งค่าต่างๆสำหรับ truffle เช่น ตั้งค่า network ว่าจะ deploy ไปที่ไหน? เป็นต้น
อันนี้ผมพาดูภาพของตัวอย่าง MetaCoin ก่อน แล้วเดี๋ยวจะกลับมาลองเล่นอีกครั้งในหัวข้อต่อไป
MetaMask เป็น Extension ที่สามารถทำงานร่วมกับ Webbrowser ต่าง ๆ ได้ เช่น Chrome, Firefox หรือ Brave เป็นต้น
โดย MetaMask เป็น Ethereum wallet ใช้สำหรับบริหารจัดการ Ethereum และ Token บน Ethererum อีกทั้งใช้เก็บ Key สำหรับใช้ในการ Deploy Smart Contract ไปบน Network ต่าง ๆ ได้ด้วย โดยเข้าไปที่ metamask.io
MetaMask
เมื่อลงเรียบร้อยแล้ว ต่อมาเราจะมาเลือก Network ที่ต้องการจะ Deploy ในตัวอย่างนี้ผมใช้ Kovan โดยไปที่รูป icon ขวาบนจากนั้นเลือก Network เป็น Kovan ดังนี้
ต่อมาเราจะมาขอ ETH สำหรับ Kovan Testnet โดยไปที่ https://faucet.kovan.network/ จากนั้น login ด้วย GitHub account (ใครยังไม่มี account ให้สมัครเลยครับที่ https://github.com/) จะพบหน้าจอดังนี้
โดยเราจะ copy address ของ MetaMask ไปใส่ที่ website จากนั้นกด Send me KETH! จากนั้นรอซักพักเราจะได้รับ 1 ETH เข้ามาที่กระเป๋าของเรา
จากนั้นเราจะเก็บ Private Key จาก MetaMask เก็บไว้ สำหรับเอาไว้ใส่ในการ Deploy Smart Contract โดยไปที่เมนู hamburger => Details => Export Private Key => ใส่ password => กด Confirm จากนั้นเราจะได้ Private Key ให้ copy เก็บไว้ครับ (โดย Key นี้ต้องเก็บไว้เป็นความลับอย่าส่งต่อให้ใครนะครับ)
Infura รัน Node ของ Ethereum โดยเปิดให้เราสามารถเข้าไปเรียกใช้งาน APIs ต่างๆได้แบบฟรี ๆ หรือ พูดง่าย ๆ ก็คือ Infura ช่วยให้เราสามารถเชื่อมต่อกับ Ethereum Network ได้ง่าย ๆ โดยไปที่ https://infura.io/ จากนั้นสมัครแล้วสร้างโปรเจค จากนั้นให้เรา copy endpoint ของ Kovan (ขออนุญาตขีดเส้นไว้นิดนึงนะครับ) ไว้สำหรับไปตั้งค่าใน truffle นะครับ
Ganache เป็น Ethereum Blockchain บนเครื่องเราเอง ไว้สำหรับ deploy contract แบบ local ได้นั่นเอง โดย Ganache จะทำงานแบบ 1 Block / 1 Transaction ทำให้เราสามารถพัฒนา ทดสอบ smart contract ได้รวดเร็วมาก ๆ เนื่องจากบางครั้งเราไม่อยาก Deploy ไปบน Test Network เพราะจะใช้เวลานาน และต้องขอ ETH จาก faucet สรุปเพื่อความสะดวกสบายในการพัฒนาครับ
โดยโหลด Ganache ได้จาก https://www.trufflesuite.com/ganache จากนั้นเปิด Ganache จะพบหน้าจอดังต่อไปนี้
โดย Ganache จะใช้ RPC server port เป็น 7545 ให้จำเลขนี้ไว้นะครับ เราจะเอาไปใช้ในการตั้งค่า truffle ต่อไป
เปิด terminal จากนั้น รันคำสั่งต่อไปนี้
$ truffle test ./test/TestMetaCoin.sol
จะได้ผลลัพธ์ดังต่อไปนี้
complie smart contract ด้วยคำสั่งต่อไปนี้
$ truffle compile
จากนั้นจะได้ผลลัพธ์ดังต่อไปนี้
เริ่มจากติดตั้ง truffle-hdwallet-provider และ dotenv ด้วย npm ดังนี้
$ npm install truffle-hdwallet-provider dotenv
ให้เพิ่มไฟล์ชื่อ .env ไว้สำหรับเก็บค่า PRIVATE_KEY, INFURA_KEY และ GANACHE_PORT โดยในที่นี้เราจะใช้ dotenv เป็นตัวช่วยในการดึงค่าตัวแปรต่าง ๆข้างต้นที่กำหนดไว้ โดยมีข้อมูลดังนี้
PRIVATE_KEY='<YOUR_PRIVATE_KEY>'
INFURA_KEY=<YOUR INFURA KEY>
GANACHE_PORT=7545
โดยวาง .env ไว้ดังนี้
จากนั้นมาแก้ไขไฟล์ truffle-config.js โดยในที่นี้ผมจะตั้งให้
● development จะเป็นการ deploy contract ไปที่ ganache
● kovan จะเป็นการ deploy ไปที่ Koven Network โดยผมจะต้องส่ง private_key ของ metamask ไปด้วย
จากนั้นมาแก้ไขไฟล์ truffle-config.js โดยในที่นี้ผมจะตั้งให้
$ truffle migrate --network development
จากนั้นลองดูใน Ganache จะพบว่ามี Transctions ดังนี้
ต่อมาลอง deploy ไปที่ Kovan บ้าง โดยใช้คำสั่งต่อไปนี้
$ truffle migrate --network kovan
จากนั้นจะเห็นผลลัพธ์ใน terminal ซึ่งเหมือนกันกับ deploy ไปที่ ganache ดังนี้
จากนั้นลองเอา contract address ไปค้นหาใน http://kovan.etherscan.io/ จะพบว่า contract ได้ถูก deploy ไปที่ Kovan เรียบร้อยดังนี้
ต่อมาเราสามารถใช้ truffle console เพื่อเข้าไปเรียกดู Contract ที่ deploy ไป ดังนี้
$ truffle console --network development
จากนั้นจะปรากฎหน้าจอดังนี้
truffle(development)>
เริ่มจากเข้าถึง MetaCoin ที่ deploy ไว้ และ account ของ Ganache ดังนี้
truffle(development)> let instance = await MetaCoin.deployed()
truffle(development)> let accounts = await web3.eth.getAccounts()
เช็ค MetaCoin balance จาก account[0] ดังนี้
(await instance.getBalance(accounts[0])).toNumber()
จากนั้นลองโอน metacoin ไปให้ account อื่นจำนวน 1000 ด้วยคำสั่งต่อไปนี้
instance.sendCoin(accounts[1],1000)
เช็คที่ account ว่าได้รับ metacoin ไหม? ดังนี้
(await instance.getBalance(accounts[1])).toNumber()
และสุดท้ายลองเช็ค account แรกว่า metacoin ลดลงไปไหม? ดังนี้
(await instance.getBalance(accounts[0])).toNumber()
ในบทความนี้เราได้เรียนรู้การใช้งาน Truffle ตั้งแต่ ติดตั้ง, complie, test และ deploy smart contract ไป Network ต่าง ๆ รวมถึงเครื่องมืออื่นๆที่เกี่ยวข้องได้แก่ MetaMask, Infura และ Ganache จะเห็นได้ว่า Truffle นี้ครบเครื่องมากๆ เป็นอย่างที่ผมบอกไว้ว่า One-stop solution ในการพัฒนา Smart Contract จริงๆเลยใช่ไหมครับ
สุดท้ายนี้ เนื้อหาในบทความนี้ผิดพลาดประการใดต้องขออภัยมา ณ ที่นี้ด้วยนะครับ สำหรับเพื่อนๆที่ลองทำตามแล้วติดไปต่อไม่ได้ ติดตามผมได้ตามช่องทางต่างๆ ได้เลยครับ หรือถ้าชอบใจก็ฝากแชร์ หรือ กดติดตาม ด้วยนะครับ ^^
บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต