สองวันหนึ่งคืนในการเข้าร่วมงาน Blockchain Hackathon
ได้รับความรู้และประสบการณ์มากมายเกี่ยวกับ
- แนวคิด Blockchain ทั้งในยุค 1.0 และ 2.0
- Blockchain ecosystem
- Ethereum
- การสร้าง Contract ใน Ethereum
- การพัฒนาระบบด้วย web3.js
รวมทั้งสิ่งที่สำคัญมาก ๆ คือ การพัฒนาระบบงานผ่าน Contract ของ Ethereum
เป็นแนวคิดที่สนุกมาก ๆ
เทียบง่าย ๆ ก็คือ Serverless นั่นเอง
ดังนั้นมาลองสร้างระบบงานง่าย ๆ ผ่าน Contract ของ Ethereum กันดีกว่า
เพื่อจะได้เข้าใจกันมากขึ้น
สิ่งที่ต้องเข้าใจและต้องเตรียมก่อนลงมือประกอบไปด้วย
- ติดตั้ง Ethereum Wallet หรือ Mist ก็ได้
- จากนั้นก็ทำการ sync ข้อมูลมาซะ (สำหรับ private หรือ testnet)
- ทำความรู้จักกับ Solidity เป็นภาษาสำหรับสร้าง Contract ใน Ethereum ซึ่งจะมีรูปแบบคล้าย ๆ กับ JavaScript
- ในการเขียน contract นั้นจะทำผ่าน Browser Solidity
- ระบบ web application จะพัฒนาด้วย library ชื่อว่า web3.js
สิ่งที่น่าสงสัยสำหรับการเริ่มต้นพัฒนาระบบงานด้วย Ethereum นั้น
มี resource จำนวนที่น้อยมาก ๆ
หรือไม่ก็ไม่สามารถทำตามได้เลย
ดังนั้นจึงทำการสรุปขั้นตอนการศึกษาและพัฒนาแบบเบื้องต้นไว้นิดหน่อย
เมื่อทุกอย่างพร้อมก็มาเริ่มกันดีกว่า
สิ่งที่น่าสนใจมาก ๆ คือ architecture ที่เปลี่ยนไป
จากเดิมคือ Client-Server แสดงดังรูป
แต่เมื่อเปลี่ยนเป็นระบบแบบ Decentralization แล้วจะเปลี่ยนไปดังรูป
จะพบว่าในส่วนของ Data logic จะอยู่ในส่วนของ Blockchain
ซึ่งในส่วนนี้เราจะทำผ่าน Contract ของ Ethereum
ดังนั้นสิ่งที่เราต้องทำก่อนคือ การออกแบบ Contract
ซึ่งพัฒนาด้วยภาษา Solidity นั่นเอง
มาดู HelloWorld Contract เป็นดังนี้
ใน contract ประกอบไปด้วย 2 function
- sayHello() ทำการส่งค่า Hello world กลับออกมา
- sayHi(name) ทำการส่งชื่อเข้าไป แล้วส่งคำทักทายออกมา
ปล. ใน function strConcat นั้นเอาไว้เชื่อมต่อข้อมูล
เนื่องจากในภาษา Solidity มันไม่มีนะ !!
ชีวิตลำบากใช้ได้เลย
การเขียนภาษา Solidity มีตัวช่วยมากมายนะ เช่น
- ผ่าน Editor online ชื่อว่า Browser Solidity
- ผ่าน plugin ใน Atom
ตัวอย่างการใช้งานผ่าน Browser Solidity
ซึ่งสามารถทดสอบการทำงานได้เลย
แสดงดังรูป
เมื่อทุกอย่างเรียบร้อยแล้ว ก็ทำการสร้าง Contract สิ
ใช้ได้ทั้ง Mist และ Ethereum Wallet
โดยไปที่ menu Contract และนำ code ที่เขียนไว้ไปใส่
จากนั้นทำการ deploy ดังรูป
ทำการกรอก password และผลที่ได้มีสิ่งที่เราต้องใช้งาน 2 อย่างคือ
1. Contract address
2. Contract Interface
แสดงดังรูป
ข้อมูลของ Contract Interface ซึ่งอยู่ในรูปแบบของ JSON
รวมทั้งเราสามารถทดสอบการใช้งานได้อีกด้วยนะ
แต่จำเป็นต้องมี ether หรือเงินด้วยนะ
ถึงเวลาของการเขียน code เพื่อใช้งาน Hello Contract ที่สร้างไว้
ผมเลือกเขียนด้วย web3.js + Node.js
มีขั้นตอนการทำงานดังนี้
- ทำการ import library web3.js
- ทำการสร้าง contract object จาก contract address และ contract interface
- ทำการเรียกใช้งาน function ต่าง ๆ ที่สร้างไว้ใน contract
ทำการ run ด้วย Node.js ดังนี้
$npm install web3 $node hello.js
ผลที่ได้คือ ไม่สามารถติดต่อไปยัง http://localhost:8545 !!
เนื่องจากเรายังไม่ start server ขึ้นมา
ดังนั้นสิ่งที่ต้องทำคือ start server ขึ้นมาด้วย geth
ด้วยคำสั่งดังนี้
$geth --testnet --fast --rpc --rpccorsdomain "*" --rpcapi "web3,eth,personal" --rpcaddr "0.0.0.0"
คำอธิบาย
- ใช้ network test ของ Ethereum
- เปิดให้เรียกแบบ cross domain ได้
แสดงผลการทำงานดังรูป
เพียงเท่านี้ก็น่าจะเริ่มใช้งานได้แล้ว
แต่ยังมีรายละเอียดต่าง ๆ อีกเยอะเลยครับ
Source code ตัวอย่างอยู่ที่ Github::Up1::Demo with Ethereum
จากการพัฒนาระบบและลองผิดลองถูกมา 2 วัน 1 คืนพบว่า
ระบบ network ของ private หรือ test net ของ Ethereum นั้นไม่มีความเสถียรอย่างยิ่ง
รวมทั้งต้องการพื้นที่จัดเก็บข้อมูลจำนวนมาก
แต่สามารถแก้ไขด้วยการใช้งาน TestRPC
ซึ่งเป็น Ethereum client สำหรับการทดสอบและพัฒนา ทำงานเร็วมาก ๆ
หรือติดตั้ง server กลางทิ้งไว้
บางทีอาจจะทำการสร้าง private ethereum มาใช้เอง
น่าจะทำให้ชีวิตดีขึ้นมา
แถมยังมี Docker Image ให้ใช้งานอีกนะ
ภาษา Solidity สำหรับการพัฒนา Contract ใน Ethereum นั้น
ยังมีความยุ่งยากมากมาย และ ไม่ยืดหยุ่นต่อการใช้งาน
แต่เป็นเพียงการเรียนรู้แบบคร่าว ๆ เท่านั้น
ยังไม่ได้ลงไปในรายละเอียดมากนัก
แต่ว่าก็ยังชอบในแนวคิดของ Contract
สำหรับฝั่ง client ซึ่งเป็น web application
โดยใช้ library ชื่อว่า web3.js นั้น
พบว่า feature ต่าง ๆ ยังไม่สมบูรณ์
และขาด feature หลาย ๆ อย่างไป
เช่นการรอจนกว่า block ที่สร้างใหม่นั้นจะถูก update ใน Ethreum network แล้วหรือไม่ เป็นต้น
ในการสร้าง Contract, Block และ Transaction ขึ้นมานั้น
เราสามารถเข้าไปตรวจสอบได้จาก Etherscan
ซึ่งทำให้การพัฒนาง่ายขึ้นอีกเป็นกอง
โดยรวมแล้วเป็น 2 วัน 1 คืนที่คุ้มมาก ๆ ครับ
ได้รับความรู้เยอะมาก ๆ
ได้คุยกันเยอะมาก ๆ
ได้กินเยอะมาก ๆ อิ่มมาก ๆ
ได้นอน 2 ชั่วโมง
สุดท้ายขอขอบคุณทีมผู้จัดงานครับผม
และได้เวลาลบข้อมูลออกไปจากเครื่องได้แล้ว !!
Reference Websites
https://blog.ethereum.org/2016/07/12/build-server-less-applications-mist/