Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

สรุปการสร้าง Smart Contract บน Ethereum ของทีมชาวนา

$
0
0

demo_00

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

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

ซึ่งทำได้จริง ๆ เพียง
  • การสร้างข้อมูลชาวนา (Farmer)
  • การแสดงข้อมูลชาวนา
  • การสร้างข้อมูลการปลูกข้าวของชาวนา (Story/Activity)
  • การแสดงข้อมูลการปลูกข้าว

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

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

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

[gist id="5c596215e24e1ad09f1f56dc9fa8c6af" file="1.sol"]

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

กำหนดโดยใช้ struct นั่นเอง [gist id="5c596215e24e1ad09f1f56dc9fa8c6af" file="2.sol"] สิ่งที่พบก็คือ เราไม่สามารถ return Struct ที่เราสร้างออกมาได้ แต่สามารถเรียกผ่านตัวแปร public ได้ นั่นก็คือ ถ้าต้องการดึงข้อมูลชาวนาและข้อมูลการปลูกข้าวทั้งหมด ต้องดึงข้อมูลผ่านตัวแปร farmers และ stories
ปล. การออกแบบยังแย่มาก ๆ นะ แต่ก็ทำให้เข้าใจภาษา Solidity มากยิ่งขึ้น

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

โดยประกอบไปด้วย
  • การสร้างข้อมูลของชาวนา
  • การดึงข้อมูลของชาวนาแต่ละคน
  • การสร้างข้อมูลการปลูกข้าวของชาวนาแต่ละคน
  • จำนวนข้อมูลการปลูกข้าวทั้งหมดของชาวนาแต่ละคน
[gist id="5c596215e24e1ad09f1f56dc9fa8c6af" file="3.sol"] ต้องทำการทดสอบผ่าน 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 [gist id="5c596215e24e1ad09f1f56dc9fa8c6af" file="4.js"] คำอธิบาย ถ้าเราต้องการให้ทำการสร้าง 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 [gist id="5c596215e24e1ad09f1f56dc9fa8c6af" file="5.js"] คำอธิบาย ก่อนอื่นต้องดึงข้อมูลจำนวน story/activity ของชาวนาที่ต้องการ แน่นอนว่า ไม่เกิด transaction หรือ block ใหม่ขึ้นมา จากนั้นทำการวน loop เพื่อดึงข้อมูลของแต่ละ story/activity ออกมา ทำให้เรียนรู้ว่า การจะเข้าถึงโครงสร้างข้อมูลแบบนี้เป็นอย่างไร !! และสิ่งที่สำคัญมาก ๆ คือ การทำความเข้าใจกับภาษา Solidity รวมทั้งการออกแบบ data model/structure ของ contract นั่นเอง เพียงเท่านี้ก็สามารถสร้างระบบแบบง่าย ๆ ได้แล้ว และในงาน Blockchain hackathon ก็มีระบบงานที่น่าสนใจ เช่น
  • ระบบ refer ของโรงพยาบาล
  • เกมส์เศรษฐี
  • ซื้อขายสินค้า

Viewing all articles
Browse latest Browse all 1997

Trending Articles