eth_00
สองวันหนึ่งคืนในการเข้าร่วมงาน 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 แสดงดังรูป

eth_01

แต่เมื่อเปลี่ยนเป็นระบบแบบ Decentralization แล้วจะเปลี่ยนไปดังรูป
จะพบว่าในส่วนของ Data logic จะอยู่ในส่วนของ Blockchain
ซึ่งในส่วนนี้เราจะทำผ่าน Contract ของ Ethereum

eth_02

ดังนั้นสิ่งที่เราต้องทำก่อนคือ การออกแบบ Contract

ซึ่งพัฒนาด้วยภาษา Solidity นั่นเอง
มาดู HelloWorld Contract เป็นดังนี้

ใน contract ประกอบไปด้วย 2 function

  1. sayHello() ทำการส่งค่า Hello world กลับออกมา
  2. sayHi(name) ทำการส่งชื่อเข้าไป แล้วส่งคำทักทายออกมา

ปล. ใน function strConcat นั้นเอาไว้เชื่อมต่อข้อมูล
เนื่องจากในภาษา Solidity มันไม่มีนะ !!
ชีวิตลำบากใช้ได้เลย

การเขียนภาษา Solidity มีตัวช่วยมากมายนะ เช่น

ตัวอย่างการใช้งานผ่าน Browser Solidity
ซึ่งสามารถทดสอบการทำงานได้เลย
แสดงดังรูป

eth_03

เมื่อทุกอย่างเรียบร้อยแล้ว ก็ทำการสร้าง Contract สิ

ใช้ได้ทั้ง Mist และ Ethereum Wallet
โดยไปที่ menu Contract และนำ code ที่เขียนไว้ไปใส่
จากนั้นทำการ deploy ดังรูป

eth_04

ทำการกรอก password และผลที่ได้มีสิ่งที่เราต้องใช้งาน 2 อย่างคือ
1. Contract address
2. Contract Interface

แสดงดังรูป

eth_05

ข้อมูลของ Contract Interface ซึ่งอยู่ในรูปแบบของ JSON

eth_06

รวมทั้งเราสามารถทดสอบการใช้งานได้อีกด้วยนะ
แต่จำเป็นต้องมี ether หรือเงินด้วยนะ

eth_07

ถึงเวลาของการเขียน code เพื่อใช้งาน Hello Contract ที่สร้างไว้

ผมเลือกเขียนด้วย web3.js + Node.js
มีขั้นตอนการทำงานดังนี้

  1. ทำการ import library web3.js
  2. ทำการสร้าง contract object จาก contract address และ contract interface
  3. ทำการเรียกใช้งาน 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 ได้

แสดงผลการทำงานดังรูป

eth_08

เพียงเท่านี้ก็น่าจะเริ่มใช้งานได้แล้ว
แต่ยังมีรายละเอียดต่าง ๆ อีกเยอะเลยครับ

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/