Libra: มาลองเขียน Transaction Script ด้วย Move กันเถอะ

Sorawit Suriyakarn
Band Protocol Thailand
3 min readJun 19, 2019
Project Libra ของ Facebook และผองเพื่อนที่กำลังมาแรงในตอนนี้

ตอนนี้กระแส Libra กำลังมาแรงมากทั้งในไทยและต่างประเทศ สำหรับในบทความนี้ เราจะมาเขียนลองเขียน Transaction Script สำหรับส่ง Transaction ที่มากกว่าแค่ mint หรือ tranfer ธรรมดาๆกัน สำหรับใครที่ยังไม่เคยลองลง Libra แนะนำให้ไปเริ่มต้นที่บทความนี้ก่อนนะครับ

Transaction Script คืออะไร?

ในโลกของ Libra นั้น เมื่อเราทำการส่ง Transaction เข้าไปใน Network เราจะต้องแนบสิ่งที่เรียกว่า Transaction Script ไปด้วย นั่นคือชุดของคำสั่งที่เราอยากให้ Transaction นี้รันนั่นเอง ตัว Transaction Script จะเป็นโปรแกรมที่เขียนภาษา Move และสามารถ Interact กับ Module ต่างๆที่ถูก Deploy ไปแล้วบน Blockchain Module เหล่านี้เราหรือ Developers คนอื่นๆสามารถเขียนเพิ่มและ Deploy ลงไปได้ (ปัจจุบันทำได้เฉพาะใน Local Node เท่านั้น)

ข้างล่างคือตัวอย่างโค้ด peer_to_peer_transfer.mvir ที่ทำการเรียกฟังชั่น pay_from_sender บน Module LibraAccount. Transaction Script นี่จะถูกส่งไปเมื่อเรารันคำสั่ง transfer ... ... ... ใน CLI นั่นเอง

โค้ดจาก language/stdlib/transaction_scripts/peer_to_peer_transfer.mvir

สำหรับใครที่สงสัย ข้างล่างนี้คือโค้ดของ LibraAccount.pay_from_sender ครับ เดี๋ยวเรื่องวิธีการเขียนและอ่าน Module โค้ดใน Move ผมจะสรุปออกมาในบทความต่อๆไป สำหรับตอนนี้ เข้าใจได้ว่าฟังชั่นนี้ เช็คว่าคนที่เราจะส่งเงินให้มี Account Resource อยู่แล้วรึเปล่า ถ้ามีอยู่แล้ว ก็จะหักเงินเราไปฝากให้เขา แต่ถ้ายังไม่มีก็จะเสก Account ให้เขาโดยหักเงินบางส่วนของเราไป

ส่วนหนึ่งของ language/stdlib/modules/libra_account.mvir

สำหรับตัวอย่างของ Transaction Scripts ทั้งหมดที่มีอยู่ใน stdlib ของ release ปัจจุบัน สามารถดูได้ที่ Folder นี้ เลยครับ

ใน official Libra testnet ที่รันโดย Libra Foundation (Facebook?)นั้น เราไม่สามารถส่ง Transaction Script ที่เราเขียนขึ้นเองได้ เนื่องจากทางนั้นกลัวเราจะไประเบิดระบบ— จะโดน Reject ด้วย [ERROR] Failed to perform transaction: Transaction failed with vm status: Validation(UnknownScript). ดังนั้นหากเราต้องการทดลองเขียน Transaction Script ด้วยตัวเอง จะต้องทำการรัน Local Validator Node ด้วยคนเอง

เขียน Transaction Script ทำอะไรกันดี?

สำหรับตัวอย่างง่ายๆในบทความนี้ เราจะมาลองเขียน (แก้) Transaction Script ที่ทำให้เราส่งเงินให้ส่งได้สำเร็จเฉพาะตอนที่เราส่งเงินไปไม่เกินครึ่งหนึ่งของที่เรามี ก็คือสมมติเรามีเงิน 100 ถ้าพยายามส่ง 10 จะสำเร็จ แต่ถ้าส่ง 60 จะเฟล คิดง่ายๆ เอาไว้กัน Race condition ตอนกดส่งรัวๆจนเงินหมดตัว สำหรับวิธีการ Hackๆ ของเราในวันนี้ เราจะไปแก้ Script ที่มีอยู่แล้วเลยครับ 🙈

vim language/stdlib/transaction_scripts/peer_to_peer_transfer.mvir

แก้โค้ดให้เป็นแบบนี้

โค้ด Transaction Script ที่เราเขียน ที่จะอนุญาตให้มีการส่งเงินเฉพาะตอนที่ส่งไม่เกินครึ่งหนึ่งของเงินที่มี

สังเกตว่าในโค้ดใหม่นี้ เราใช้ฟังชัน LibraAccount.balance เพื่อตรวจสอบ Balance ของเราในตอนนี้ และจะอนุญาตให้การส่งนั้นเกิดขึ้น เมื่อมันมีค่าไม่เกินครึ่งหนึ่งของเงินที่เรามี

โค้ดที่เราแก้จะอยู่ที่ language/stdlib/transaction_scripts/peer_to_peer_transfer.mvir
Diff ของ peer_to_peer_transfer.mvir ที่เราแก้ให้มันปลอดภัยขึ้น

รัน Local Node กันและเทส Script ของเรากันเถอะ!

ตามที่เว็บนี้บอกไว้ การรัน Local Validator โหนดสามารถทำได้ง่ายด้วยคำสั่ง

cargo run -p libra_swarm -- -s

ขั้นตอนนี้อาจจะใช้เวลาซักหน่อย (เครื่อง MBA ของผมรันประมาณ 5–10 นาที) ยังไงก็อดใจรอกันหน่อยนะครับ

สิ่งที่เห็นหลังจากสร้าง Local Node ขึ้นมาสำเร็จ

หลังจากนั้นเราก็จะเข้าสู่หน้า CLI ที่คุ้นเคย ตรงนี้เราสร้าง Account ขึ้นมา 2 คนเพื่อลองเทสการส่งเงินได้เลยครับ ในที่นี้เราจะลองส่ง 10 Libra (น้อยกว่าครึ่งของเงินที่มี) และ 60 Libra (มากกว่าครึ่งของเงินที่มี) ตัวอย่างดูได้ข้างล่างเลยครับ

// สร้าง Account 2 คน
libra% create account
libra% create account
// เสกเงินให้ #0 = 100 Libra
libra% account mint 0 100
libra% query balance 0 -> 100
libra% query balance 1 -> 0
// ลองส่งเงิน 10 Libra จาก #0 ไป #1
libra% transferb 0 1 10
// พบว่าตอนนี้ #0 มีเงิน 90 และ #1 มีเงิน 10!
libra% query balance 0 -> 90
libra% query balance 1 -> 10
// ลองส่งเงิน 60 Libra จาก #0 ไป #1
libra% transferb 0 1 60
// พบว่าตอนนี้ #0 มีเงิน 90 และ #1 มีเงิน 10! การส่งล้มเหลว!!!
libra% query balance 0 -> 90
libra% query balance 1 -> 10
หลักฐานว่ามัน Work จริงๆนะ

สรุปปิดท้าย

สำหรับบทความนี้ เราได้ทดลองการเขียน Tranasction Script แบบง่ายๆ เพื่อสร้าง Transaction รูปแบบใหม่ๆบน Libra blockchain ข้อสังเกตที่เห็นได้ชัดเลยคือเมื่อทำแบบนี้ จะทำให้ Transaction แบบที่ซับซ้อนๆทำได้ง่ายขึ้น (แบบเดียวกับที่ Ethereum ต้องการจะทำด้วย Account Abstraction)

สำหรับบทความต่อๆไป เราจะมาเจาะมากขึ้นเกี่ยวกับการเขียน Module และการ Deploy สิ่งต่างๆขึ้น Libra blockchain ครับ ฝากติดตามเพจ Band Protocol (Thailand) และ เพจหลัก Band Protocol ด้วยนะครับ 🙏 สำหรับใครสนใจเนื้อหาในด้าน Blockchain และสนใจอยากจะร่วมการกับทีมของ Developers ไฟแรงที่สนใจในด้านนี้เหมือนกัน ติดต่อมาทาง Band Protocol ได้เลยนะครับ เราอยากได้คุณมาลุยไปด้วยกัน!!!

Band Protocol เป็นแพลตฟอร์มที่สนับสนุนให้ทุกคนมีส่วนร่วมในการสร้างข้อมูลที่ถูกต้องเข้าสู่โลก blockchain โดยพวกเราเป็นทีม developer ที่อยากจะเชื่อมต่อโลกความจริงกับโลกของ blockchain เข้าด้วยกัน และถ้าคุณเป็น developer ที่มีความสนใจในด้านนี้และอยากร่วมงานกับเรา ติดต่อเราได้ที่ talent@bandprotocol.com

--

--