Facebook Libra focus on account mint

Apisak Srihamat
3 min readJul 21, 2019

--

วันนี้เรามาทำความเข้าใจการสร้างเงินใน libra ด้วยคำสั่ง account mint coins กันนะครับ

ก่อนอื่นเพื่อให้เข้าใจตรงกันขออ้างอิงข้อมูลจาก libra white paper ทาง libra มีความตั้งใจที่จะทำให้ราคา coins ไม่แปรผันง่ายๆ โดยจะใช้วิธีนำสินทรัพย์ (asset) มาคำ้ประกันไว้เพื่อให้สามารถสร้างเงินได้ในแต่ละครั้ง จึง(เชื่อว่า)จะทำให้สามารถแลกเปลี่ยนเงินกลับมาเป็นเงินสกุลที่ใช้อยู่ปัจจุบันได้เสมอ เพื่อประโยชน์ในการโอนเงินใช้ระหว่างประเทศในราคาถูกซึ่งเป็นเหตุผลหลักที่ทำให้เกิด libra ขึ้นมา เพราะฉะนั้นคำสั่ง mint นี้จะไม่สามารถเรียกใช้กันได้ง่ายๆนะครับ libra testnet เพียงแค่เปิดให้ทดลองใช้งานเพื่อทุกๆฝ่ายที่สนใจ จะได้เข้าใจตรงกันว่าระบบจะทำงานอย่างไร

Ref: https://libra.org/en-US/white-paper/#the-libra-currency-and-reserve

ก่อนหน้านี้ผมไม่แน่ใจว่า asset นี้ใครจะเป็นผู้เก็บไว้กันแน่ เพราะว่ามีบทความบอกว่าถ้าเขาต้องการสร้างเงิน หนึ่งล้าน coins ซึ่งเท่ากับ หนึ่งล้าน USD เขาจะต้องนำเรือยอร์ช (asset) ราคาหนึ่งล้าน USD เข้ามาคำ้ประกัน แต่เขาไม่ได้ระบุว่าใครจะเป็นผู้เก็บ asset เหล่านั้นและจะยังคงนำเรือยอร์ชนั้น ออกไปขับเล่นได้อยู่ไหม แต่ปัจจุบัน white paper ได้กล่าวไว้ชัดเจนว่าจะเป็น “bank deposits and short-term government securities in currencies from stable and reputable central banks” จากข้อมูลนี้ค่อนข้างชัดเจนว่ารัฐบาลและธนาคารจะต้องเข้ามามีส่วนร่วมด้วย และเขาเหล่านั้นล่ะครับควรจะเป็นคนใช้คำสั่ง mint ไม่ใช่เรา …(^ ^)

เอาล่ะเมื่อพอเข้าใจหลักการสร้าง coins แล้ว เรามาเริ่มต้นสร้าง account ขึ้นมาก่อนนะครับด้วยคำสั่ง account create แล้วจึงสร้าง coins ด้วยคำสั่ง account mint

สร้าง account#0 ขึ้นเพื่อทดสอบ
จากนั้นสร้าง 1,000 coins ให้กับ account#0

ในขั้นตอนนี้จะเห็นข้อความว่า Mint request submitted นะครับ แสดงว่าเรากำลัง request ไปที่ไหนสักที่นึงเพื่อที่จะสร้าง 1,000 coins ว่าแต่ submit ไปที่ไหนกันล่ะ เราก็มาเริ่มเปิด code ภาษา Rust เพื่อดูคำตอบของคำถามนี้กันเลยครับ

Rust command AccountCommandMint

เมื่อดูจาก code จะเห็นว่าการ Minting coins จะมี 2 วิธี

  1. Mint without block => ถ้าเป็นวิธีนี้แสดงข้อความ “Mint request submitted”
  2. Mint with block => ถ้าเป็นวิธีนี้แสดงข้อความ “Finished minting!”

เมื่ออ่าน code นี้ผมเข้าใจว่ามีวิธีแบบ asyncronize (คือแบบที่เราทดลองทำเมื่อสักครู่) และแบบ syncronize คือจะต้องรอจนกว่ากระบวนการ mint จะสำเร็จ อย่างไรก็ตามกระบวนการ mint จะเรียกคำสั่ง mint_coins ของ object client ครับ น่าแปลกที่การ mint ไม่ควรจะทำได้โดย client (ผู้ใช้งาน) แต่ควรเป็นจากรัฐบาลและหรือสถาบันการเงินตามที่ได้อธิบายไว้ตั้งแต่ต้น ในขั้นตอนนี้คงจะต้องมีการเปลี่ยนแปลง libra core design structure ในอนาคตอันใกล้นี้ (หรือกำลังทำอยู่หว่า ?) เพื่อมี client for user และ client for … (น่าจะเป็น partner หรือ node หรือ รัฐบาล หรือ ธนาคาร) อย่างไรก็ตาม คงจะไม่ให้ใช้ client เดียวกันเพราะวัตถุประสงค์การใช้งานแตกต่างกันอย่างชัดเจน

function mint_coins ของ client

ในจุดนี้จะเห็นว่ามีการเรียก get_account_address_from_parameter เพื่อให้รู้ว่า receiver address คืออะไร และเรียก convert_to_micro_libras เพื่อให้ได้มาซึ่งจำนวน coins ที่ต้องการสร้าง จากนั้นมีการเรียก mint_coins_with_local_faucet_account ซึ่งน่าจะเป็นการสร้าง coins ไว้อ้างอิงด้วย local faucet account ของเราเอง และมีการเรียก mint_coins_with_faucet_service ซึ่งน่าจะเป็นการสร้าง coins ที่ validator server และ node อื่นๆ​(ผ่านการ consensus)

function mint_coins_with_local_faucet_account ของ client จะเห็นว่าเป็นการเตรียมข้อมูล sender, program, request เพื่อทำการ submit transaction reqest
function create_submit_transaction_req ของ client จะมีการ sign transaction ด้วย key_pair ได้ object SubmitTransactionRequest ที่มี signed_txn ด้วยรายละเอียดของ account นั้นๆออกมา
function SubmitTransaction ของ object grpc_client จะเริ่มด้วยการ เรียก submit_transaction_opt (เลือกระหว่าง syncronize กับ asyncronize) เมื่อได้ response มาก็นำมา cast object response เป็น SubmitTransactionResponse::from_proto เพื่อทำการตรวจสอบและเพิ่ม sequence_number
function submit_transaction_opt ของ object grpc_client ที่จะไปเรียก function SubmitTransactionRequest ของ object admission_control_proto
การประกาศ function reference ไปใช้งาน SubmitTransactionRequest ที่ object admission_control_proto

จากจุดนี้เราได้ submit transaction ไปที่ admission control แล้วนะครับ และจะได้รับ response กลับมาแล้วเพราะว่า default_grpc_call_option เป็นแบบ syncronize ในขั้นตอน admission control นี้เนื่องจากอาจทำให้บทความยาวมากๆ ขอทำความเข้าใจเรื่องนี้ในบทความต่อไป (ถ้ามี) นะครับ อ้างอิงคำอธิบายจาก libra Ref: https://github.com/libra/libra/edit/master/admission_control/README.md

กลับมาทำความเข้าใจต่อในส่วน function mint_coins_with_faucet_service ของ object client ครับ ในขั้นตอนนี้เป็นการ request web service ไปที่ faucet_server เพื่อทำการสร้าง transaction consencus นั่นเอง ว่าแต่ส่งไปที่ไหนกันนะ เราก็ทำการ print debug ง่ายๆอีกครั้งนึงครับ :)

function mint_coins_with_faucet_service ของ client (with simple print debug)
ผลการทำสอบการ mint หลังจากทดลองแก้ไข print debug

ผลการทดสอบที่ได้คือ client จะทำการส่ง TrnsactionSubmitionRequest พร้อมกับจำนวน coins และ receiver ไปที่ faucet.testnet.libra.org นั่นเอง ในที่สุดก็ได้คำตอบของคำถามในขั้นต้น :)

บทความอื่นๆเกี่ยวกับการทำความเข้าใจ source code libra มีดังนี้ครับ

Facebook Libra on Windows is easy

Facebook Libra focus on account create

Facebook Libra focus on query balance

Facebook Libra focus on admission control (Part 1)

Facebook Libra focus on admission control (Part 2)

Facebook Libra focus on mempool

Facebook Libra focus on consensus (Part 1)

Facebook Libra focus on create testnet-like

Facebook Libra focus on consensus (Part 2)

--

--

Apisak Srihamat

Master of Science AIT, Embedded systems course UC Irvine, Bachelor of Computer Engineering KMITL, Love innovation ideas.