ลองใช้ Truffle, MetaMask, Ganache และ Infura สำหรับพัฒนา Ethereum Smart Contract

วันนี้จะพามาดูการใช้เครื่องมือต่าง ๆ สำหรับการพัฒนา Ethereum Smart Contract กันครับ โดยเริ่มตั้งแต่สร้างโปรเจคด้วย Truffle จนถึงการ deploy smart contract ไปที่ blockchain เลยครับ

เริ่มจาก Truffle คือ ?

Truffle เป็น framework ที่ใช้สำหรับการพัฒนา Ethereum ซึ่งเป็นเครื่องมือที่ช่วยอำนวยความสะดวกในหลาย ๆ ด้าน เช่น

● Compile Smart Contract

● Test Smart Contract ด้วย Mocha หรือ Chai ได้

● Deploy contract ไป Chain ที่ต้องการได้

● Log ไปเล่นกับ Smart Contract ที่ Deploy ไปได้

เรียกได้ว่าเป็น one-stop solution สำหรับการพัฒนา Ethereum เลยก็ว่าได้ครับ

ติดตั้ง Truffle

เพื่อให้สะดวกในการทำงานผมแนะนำให้ติดตั้ง 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

สร้างโปรเจคด้วย 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

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 คือ ?

Infura รัน Node ของ Ethereum โดยเปิดให้เราสามารถเข้าไปเรียกใช้งาน APIs ต่างๆได้แบบฟรี ๆ หรือ พูดง่าย ๆ ก็คือ Infura ช่วยให้เราสามารถเชื่อมต่อกับ Ethereum Network ได้ง่าย ๆ โดยไปที่ https://infura.io/ จากนั้นสมัครแล้วสร้างโปรเจค จากนั้นให้เรา copy endpoint ของ Kovan (ขออนุญาตขีดเส้นไว้นิดนึงนะครับ) ไว้สำหรับไปตั้งค่าใน truffle นะครับ

ติดตั้ง Ganache

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 ต่อไป

ลอง Test Smart Contract

เปิด terminal จากนั้น รันคำสั่งต่อไปนี้

$ truffle test ./test/TestMetaCoin.sol

จะได้ผลลัพธ์ดังต่อไปนี้

ลอง Compile Smart Contract

complie smart contract ด้วยคำสั่งต่อไปนี้

$ truffle compile

จากนั้นจะได้ผลลัพธ์ดังต่อไปนี้

Deploy Smart Contract ไป Network ต่าง ๆ

เริ่มจากติดตั้ง 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

ต่อมาเราสามารถใช้ 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 จริงๆเลยใช่ไหมครับ

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

บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค

วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต