Facebook Libra focus on Admission Control (Part 2: SubmitTransaction)

Apisak Srihamat
3 min readJul 28, 2019

--

หลังจากถูกการงานการบ้านรุมเร้าเลยพักการเรียนรู้ไปหลายวัน วันนี้เรามาเรียนรู้เรื่อง Admission Control ในส่วนที่เกี่ยวข้องกับ SubmitTransaction กรณี Account Mint และ Transfer กันนะครับ โดยเราจะต้องรัน libra_swarm ด้วยคำสั่ง

$ RUST_LOG=debug cargo run -p libra_swarm -- -s

เริ่มด้วยการ mint coins 1,000
และเช่นเคยเราเปิดอีกหน้าต่างขึ้นมาสำหรับดู log grep admission จะเห็นว่ามี debug log เดิมที่นักพัฒนาของ libra ใช้สำหรับทดสอบอยู่แล้ว
เปิด code submit_transaction ของ AdmissionControl API ขึ้นมาดูจึงเห็นว่ามีการเรียกต่อไปที่ submit_transaction_inner

Source code ของ function submit_transaction_inner ค่อนข้างยาวจะขอสรุปเงื่อนไขการทำงานดังนี้

  1. check ว่า mempool เต็มหรือยัง ถ้ายังก็ไปต่อ
  2. ทำการแปลง signed_txn จาก library proto เพื่อสามารถ get gas_cost มาคำนวนได้
  3. vm_validator ทำการ validate_transaction โดย AC จะใช้ validator set information ไปหา state_root ของ transaction info เพื่อ verify signatures ของ validator set, จากนั้นจึงสร้าง VerifiedStateView ด้วย verified state

4. add transaction นั้นเข้าสู่ mempool

ในการศึกษาการทำงานนั้นผมสนใจที่ function validate_transaction (ขั้นตอนที่ 3) เพราะว่าในส่วนการ check mempool เป็นการตรวจเช็ค flag และในส่วนการแปลง signed_txn เราก็ได้ดูไปบ้างแล้วในขั้นตอนอื่นๆในบทความก่อนหน้านี้ครับ เพราะฉะนั้นเราจะกระโดดเข้าไปดูรายละเอียกใน function validate_transaction กันเลยนะครับ

function validation_transaction ของ VM_Validator

ก่อนอื่นใน function validate_transaction มี TODO กล่าวเกี่ยวกับเงื่อนไขที่ validator ควรจะมี 2 options คือ

  1. trust storage: ไม่ไปหา root hash, สร้างโครงสร้างคล้ายการทำ verified state view โดยไม่ต้อง verification
  2. non-trust storage: AC จะใช้ validator set information ไปหา state_root ของ transaction info เพื่อ verify signatures ของ validator set, จากนั้นจึงสร้าง VerifiedStateView ด้วย verified state

ว่าแต่ ผมมีข้อสงสัยว่าใช้เงื่อนไขอะไรตัดสินใจว่าเป็น trust storage กันนะ ? น่าเสียดายที่ทีมงาน libra ยังไม่ได้ implement ส่วนงานนี้ (ทุก case เป็น non-trust storage) ผมได้ส่งคำถามไปที่ libra community หวังว่าทีมงาน libra จะมาตอบเร็วๆนี้ครับ

โดย function validate_transaction พยายามจะค้นหา transaction info object จาก account state proof

ซึ่ง function validate_transaction เรียก update_to_latest_ledger โดยส่ง RequestItem GetAccountState เข้าไป ซึ่งเราได้เรียนรู้ไปแล้วใน Facebook Libra focus on Admission Control Part 1 ว่าเราจะได้ 3 ค่า กลับมา คือ response_items (account_state_with_proof), ledger_info_with_sigs, validator_change_events

จากนั้นจึงนำ account_state_with_proof สืบกลับ (derived) ไปหา transaction_info และ transaction_state_root แล้วจึงสร้าง SparseMerkleTree (single root hash ใน memory) ขึ้นมาจาก state_root ที่ได้ เมื่อดูรูปโครงสร้างข้อมูลใน storage ของ libra จะเห็นภาพมากขึ้น

โครงสร้างการเก็บข้อมูลใน storage ของ libra

Libra จะใช้ SparseMerkleTree สำหรับ 2 กรณีนะครับ

  1. ใช้สนับสนุนการทำ ledger based consensus algorithm
  2. ใช้เป็นกระดาษทดจาก global MerkleTree เพื่อให้สามารถคำนวน แล้วจัดการกับ uncommitted transaction ได้ครับ

กลับมาที่ function validate_transaction กันต่อ ในขั้นตอนการสร้าง SparseMerkleTree ที่ตอนนี้มีแค่ state root นะครับ จึงต้องเรียกใช้งาน storage_read_client เข้าไป query ข้อมูล เพื่อให้ได้ SparseMerkleTree จากข้อมูลล่าสุดเรียกใช้ constructure ของ VerifiedStateView

หน้าตาของ SparseMerkleTree :)

ทดสอบ debug validation_status ของ function validate_transaction ใน function submit_transaction_inner

แก้ไข function submit_transaction_inner เพื่อทดสอบ debug validation_status
จากนั้นทดสอบ account mint ผลลัพธ์ได้ค่า None เพราะว่า ถ้าไม่มี error ก็ไม่ได้รับอะไรกลับมานะครับ ในขั้นตอนนี้จะเห็นว่าทาง admission_control ไม่ได้รับรู้ถึงการสร้าง MerkleTree ซึ่งก็เป็นการออกแบบแบ่งการทำงานที่ชัดเจนดี

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

Facebook Libra on Windows is easy

Facebook Libra focus on account create

Facebook Libra focus on account mint

Facebook Libra focus on query balance

Facebook Libra focus on admission control (Part 1)

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.