demo_00
จากงาน Blockchain Hackathon ซึ่งเขียนอธิบายไว้ที่ Blog ก่อนหน้า
นั้นอยู่ร่วมกับทีมสร้างระบบเกี่ยวกับชาวนา
โดยแนวคิดคร่าว ๆ คือ
ต้องการเก็บข้อมูลของการผลิตข้าวของชาวนา
ตั้งแต่ก่อนการปลูก การปลูก การเก็บเกี่ยว
ตลอดจนการซื้อขายข้าว
รวมไปถึงรู้ได้เลยว่าข้าวแต่ละถุงที่เรา ๆ ท่าน ๆ กินกันอยู่
มีประวัติในการปลูกอย่างไรบ้าง

เพื่อทำให้ผู้บริโภคมั่นใจในข้าวที่กินอยู่
เพื่อทำให้ชาวนาสามารถแลกเปลี่ยนข้อมูลการเกษตรได้
สุดท้ายเพื่อทำให้ชาวนามีชีวิตที่ดีขึ้น (Better Farmer)

ก่อนที่จะไปไกลมาดูขั้นตอนการพัฒนาระบบดีกว่า

ซึ่งทำได้จริง ๆ เพียง

  • การสร้างข้อมูลชาวนา (Farmer)
  • การแสดงข้อมูลชาวนา
  • การสร้างข้อมูลการปลูกข้าวของชาวนา (Story/Activity)
  • การแสดงข้อมูลการปลูกข้าว

โดยการพัฒนาเริ่มจากการออกแบบ Smart Contract ใน Ethereum ก่อน

แน่นอนว่าต้องเขียนด้วยภาษา Solidity
มาเริ่มสร้าง Contract กันเลย

1. ตั้งชื่อ Contract ว่า BetterFarmerContract

2. กำหนดโครงสร้างข้อมูลของชาวนาและข้อมูลการปลูกข้าว

กำหนดโดยใช้ struct นั่นเอง

สิ่งที่พบก็คือ เราไม่สามารถ return Struct ที่เราสร้างออกมาได้
แต่สามารถเรียกผ่านตัวแปร public ได้
นั่นก็คือ ถ้าต้องการดึงข้อมูลชาวนาและข้อมูลการปลูกข้าวทั้งหมด
ต้องดึงข้อมูลผ่านตัวแปร farmers และ stories

ปล. การออกแบบยังแย่มาก ๆ นะ
แต่ก็ทำให้เข้าใจภาษา Solidity มากยิ่งขึ้น

3. ทำการกำหนด function การทำงาน หรือให้ใช้งานนั่นเอง

โดยประกอบไปด้วย

  • การสร้างข้อมูลของชาวนา
  • การดึงข้อมูลของชาวนาแต่ละคน
  • การสร้างข้อมูลการปลูกข้าวของชาวนาแต่ละคน
  • จำนวนข้อมูลการปลูกข้าวทั้งหมดของชาวนาแต่ละคน

ต้องทำการทดสอบผ่าน Browser Solidity ให้ผ่านก่อนนะ
แสดงดังรูป

demo_01

จากนั้นทำการ deploy contract บน Ethereum Wallet หรือ Mist ได้เลย
จะได้ค่า contract address และ contract interface ในรูปแบบ JSON
ซึ่งนำค่านี้มาใช้ในการ connect ต่อไป

demo_02

4. ทำการพัฒนาระบบงานด้วย web3.js

สิ่งที่น่าสนใจมี 2 เรื่องคือ

  • การสร้างข้อมูลทั้ง farmer และ story/activity
  • การดึงข้อมูลของ farmer และ story/activity

โดยสิ่งที่ต้องการในการสร้างระบบงานคือ
สำหรับการสร้างข้อมูล farmer และ story
จะให้ทำการสร้าง transaction หรือ block ใหม่ขึ้นมา
ส่วนการดึงข้อมูลไม่ต้องสร้าง transaction หรือ block ขึ้นมา

ดังนั้นจึงส่งผลต่อการเขียน code ด้วย web3.js ดังนี้

ตัวอย่างการสร้าง Story/Activity ขึ้นมา
แสดงดัง code

คำอธิบาย
ถ้าเราต้องการให้ทำการสร้าง block หรือ transaction ขึ้นมา
ต้องใช้งานผ่าน function sendTransaction()
โดยจะทำการสร้าง transaction และส่ง transaction id หรือ hash ออกมาให้
แต่สิ่งที่สำคัญก็คือ transaction นั้นจะยังไม่ถูก confirm จาก node อื่น ๆ !!
ดังนั้นถ้าไม่รอจะทำให้ข้อมูลไม่เปลี่ยนแปลง

สิ่งที่ต้องแก้ไขก็คือ ผมต้องการให้ระบบงาน
รอไปจนกว่า transaction จะถูก confirm จาก node อื่น ๆ
ด้วยการสร้าง function ชื่อว่า waitForTransationToBeMined() ขึ้นมา
แต่ให้ลองตรวจสอบ 15 รอบเท่านั้น
เพื่อไม่ให้ระบบรอนานจนเกินไป
โดย code นำมาจากบทความเรื่อง The Blockchain Explained to Web Developers

เมื่อ transaction ใหม่ถูก confirm แล้วก็ทำการดึงข้อมูลมาแสดงผล
โดยข้อมูลที่ต้องการคือ story/activity ทั้งหมดของชาวนานั้น ๆ
ซึ่งเป็น list ของ struct (สามารถออกแบบได้หลายแบบนะ)
แต่ที่ผมออกแบบคือ ไปดึงข้อมูลจากตัวแปรชื่อว่า stories

คำอธิบาย
ก่อนอื่นต้องดึงข้อมูลจำนวน story/activity ของชาวนาที่ต้องการ
แน่นอนว่า ไม่เกิด transaction หรือ block ใหม่ขึ้นมา
จากนั้นทำการวน loop เพื่อดึงข้อมูลของแต่ละ story/activity ออกมา

ทำให้เรียนรู้ว่า การจะเข้าถึงโครงสร้างข้อมูลแบบนี้เป็นอย่างไร !!
และสิ่งที่สำคัญมาก ๆ คือ การทำความเข้าใจกับภาษา Solidity
รวมทั้งการออกแบบ data model/structure ของ contract นั่นเอง

เพียงเท่านี้ก็สามารถสร้างระบบแบบง่าย ๆ ได้แล้ว
และในงาน Blockchain hackathon ก็มีระบบงานที่น่าสนใจ เช่น

  • ระบบ refer ของโรงพยาบาล
  • เกมส์เศรษฐี
  • ซื้อขายสินค้า