ทดลองสร้าง Smart Contract และ Backend ด้วย GO

บทความนี้จะพาเพื่อนๆมาดูวิธีการพัฒนา Ethereum Smart Contract และ Backend ด้วยภาษา Go โดยจะมีเนื้อหาดังต่อไปนี้ครับ

- เตรียมความพร้อม และติดตั้งโปรแกรมต่างๆ

- สร้างและ Compile Smart Contract ด้วย Solidity

- Deploy Smart Contract ไปที่ Blockchain โดยใช้ go-ethereum

- สร้าง backend เชื่อมต่อกับ Blockchain ด้วย go-ethereum และ Echo

- ทดลอง backend

เพื่อไม่ให้เสียเวลามาเริ่มกันเลยครับ

เตรียมความพร้อม และติดตั้งโปรแกรมต่างๆ

เริ่มจากสร้าง Folder และเตรียมไฟล์เปล่าๆไว้ก่อนดังรูปต่อไปนี้

ติดตั้ง Go

เป็นภาษาหลักที่เราจะใช้กันในบทความนี้ครับ โดยให้ไป download ตัวติดตั้งที่ link นี้

เมื่อติดตั้งเรียบร้อยแล้ว ให้ลองรันคำสั่งต่อไปใน terminal

$ go version

ติดตั้ง Solidity

ภาษาสำหรับพัฒนา Smart Contract โดยใช้คำสั่งต่อไปนี้

> pip3 install solc-select
> solc-select install 0.8.0
> solc --version

ติดตั้ง Ganache

Ganache เป็น Ethereum Blockchain บนเครื่องเราเอง ไว้สำหรับ deploy contract แบบ local ได้นั่นเอง โดยให้ไป download ตัวติดตั้งที่ link นี้

เมื่อติดตั้งเรียบร้อยแล้ว ให้ทดลองรันจะปรากฎหน้าจอดังนี้

เตรียม Project GO กันครับ

เริ่มจากสร้าง file go.mod โดยใช้คำสั่งต่อไปนี้

> go mod init greetergo

จากนั้นเราจะติดตั้ง go-ethereum โดยใช้คำสั่งต่อไปนี้

> go get github.com/ethereum/go-ethereum

จากนั้น จะสังเกตว่ามีไฟล์ go.sum เพิ่มขึ้นมา ซึ่งเป็นไฟล์ที่มีไว้สำหรับการ checksum เพื่อตรวจว่าไฟล์ที่เราโหลดมาถูกต้องตามต้นฉบับหรือเปล่า ตอนนี้ Project เราจะมีหน้าตาประมาณนี้ครับ

สร้างและ Compile Smart Contract ด้วย Solidity

สร้าง Smart Contract

ให้เพิ่ม code ใน Greeter.sol ใน folder contracts ดังต่อไปนี้

ขออธิบาย code ซักเล็กน้อย Smart Contract ดังนี้

บรรทัดที่ 2: กำหนด version ของ Solidity คือ 0.8.0

บรรทัดที่ 4: contract นี้มีชื่อว่า Greeter

บรรทัดที่ 5: ตัวแปร greeting กำหนดค่าเริ่มต้นเป็นคำว่า HelloWorld

บรรทัดที่ 7-9: function greet() ใช้สำหรับคืนค่า greeting ที่จัดเก็บไว้

บรรทัดที่ 11-13: function setGreeting() สำหรับรับค่า _greeting มาจัดเก็บไว้ที่ greeting

Complie Smart Contract

จากนั้น complie Greeter.sol โดยใช้คำสั่งต่อไปนี้

> solc --optimize --abi ./contracts/Greeter.sol -o build
> solc --optimize --bin ./contracts/Greeter.sol -o build
> abigen --abi=./build/Greeter.abi --bin=./build/Greeter.bin --pkg=api --out=./api/Greeter.go

จากนั้นคำสั่งข้างต้น จะได้ .abi และ .bin อยู่ใน folder build และสุดท้ายเราใช้ทั้ง 2 ไฟล์ข้างต้นสำหรับสร้าง Go interface โดยใช้คำสั่ง abigen ซึ่งเราจะได้ Greeter.go อยู่ใน folder api ดังนี้

Deploy Smart Contract ไปที่ Blockchain โดยใช้ go-ethereum

เนื่องจากในบทความนี้เราจะใช้ Ganache สำหรับเป็น Blockchain บนเครื่องเราเอง โดยสิ่งที่เราต้องใช้ตอนนี้ คือ Private Key ซึ่งให้เข้าไปที่โปรแกรม Ganache จากนั้นกดที่ กุญแจ ด้านขวามือของ address อันไหนก็ได้ (แต่กดที่อันแรกก็ง่ายดีครับ) โดย copy Private Key ในรูปกรอบสีแดงดังนี้

จากนั้นเพิ่ม code ใน deploy.go ใน folder deploy โดยแก้ไขบรรทัดที่ 22 เป็น Private Key ที่ copy ไว้ข้างต้น และจะมีบรรทัดที่ 7 ที่จะไม่เหมือนในรูปจะเป็นไปตามชื่อ folder ที่ตั้งครับ

รันคำสั่งเพื่อทำการตรวจหาตัว Dependency ที่ไม่จำเป็นและนำออกไปจาก go.mod ดังนี้

> go mod tidy

จากนั้น deploy ด้วยคำสั่งต่อไปนี้

> go run ./deploy/deploy.go

เมื่อรันสำเร็จเราจะได้เลข Contract Address ดังนี้

สร้าง backend เชื่อมต่อกับ Blockchain ด้วย go-ethereum และ Echo

ในบทความนี้จะใช้ Echo ซึ่งเป็น web framework ของภาษา GO พัฒนาโดย LabStack เห็นเค้าบอกว่า มีประสิทธิภาพสูง (High performance), ขยายเพิ่มเติมได้ (Extensible), มีความเรียบง่าย (Minimalist) อันนี้ไม่รู้จริงไหมนะครับ

จากนั้นติดตั้ง echo ด้วยคำสั่งต่อไปนี้

> go get github.com/labstack/echo/v4
> go get github.com/labstack/echo/v4/middleware@v4.7.2

จากนั้นเพิ่ม code ใน main.go ใน folder script โดยแก้ไขบรรทัดที่ 22 เป็น Private Key และบรรทัดที่ 37 เป็น Contract Address ดังนี้

ขออธิบาย code สั้นๆครับ

บรรทัดที่ 47-53: เป็นการสร้าง Endpoint /greet สำหรับ call ที่ไป function Greet เพื่อคืนค่า greeting จาก Blockchain

บรรทัดที่ 55-62: เป็นการสร้าง Endpoint /greet/:_greeting สำหรับ call ที่ไป function SetGreeting เพื่อกำหนดค่า greeting ใหม่

บรรทัดที่ 65: ตั้ง port ที่ 1324

จากนั้นรัน backend ด้วยคำสั่งต่อไปนี้

> go run ./script/main.go

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

ทดลอง backend

เริ่มผมลองเปิด Browser แล้ว เรียกไปที่ http://localhost:1324/greet จะได้ผลลัพธ์ดังนี้

ซึ่งจะแสดงผลลัพธ์เป็นคำว่า HelloWorld

จากนั้นผมลอง set ค่า greeting เป็นคำว่า smartcontactgo ใหม่โดยเรียกไปที่ http://localhost:1324/greet/smartcontactgo จะได้ผลลัพธ์ดังนี้

จากนั้นผมลองรับไปเรียกที่ http://localhost:1324/greet จะได้ผลลัพธ์ดังนี้

ซึ่งจะแสดงผลลัพธ์เป็นคำว่า smartcontactgo แสดงว่าเราสามารถ set ค่าไปที่ blockchain ได้สำเร็จผ่านทาง backend ที่สร้างขึ้นครับ

สรุป

ในบทความนี้เราได้เรียนรู้หลายเรื่องเลยครับ ตั้งแต่การสร้าง compile และ deploy Smart Contract ด้วย GO จากนั้นเราก็สร้าง backend สำหรับเชื่อมไปที่ blockchain

สุดท้ายนี้ เนื้อหาในบทความนี้ผิดพลาดประการใดต้องขออภัยมา ณ ที่นี้ด้วยนะครับ

บทความต่อไป เราจะลองใช้ Blockchain จริงๆบ้าง อ่านต่อที่ link นี้ครับ

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

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