Facebook Libra focus on Admission Control (Part 1)
วันนี้เรามาเรียนรู้เรื่อง Admission Control กันนะครับ แต่ก่อนจะไปถึงตรงนั้นเรามาสรุปความเข้าใจของ libra command กับสิ่งที่เราได้เรียนรู้ไปประมาณอาทิตย์ที่ผ่านมาโดยผมทำเป็นรูปสรุปไว้ด้านล่างนี้แล้วครับ
โดยจากข้อมูลที่เรารู้จะเห็นว่าการทำงานของ admission control มี 2 function หลักและมีการเรียกใช้ดังนี้
- UpdateToLatestLedger: ใช้โดย account create และ query balance
- SubmissionTransaction: โช้โดย account mint (sender is zero) และ transfer
ครั้งนี้ผมจะใช้ libra_swarm แทนที่จะเชื่อมต่อ testnet และผมจะใช้งาน debug! แทนที่จะใช้งาน println! เหมือนทุกๆครั้งที่ผ่านมานะครับ โดยเราจะใช้ RUST_LOG=debug เพื่อรัน libra_swarm ดังนี้ครับ
$ RUST_LOG=debug cargo run -p libra_swarm -- -s
เอาล่ะครับ เมื่อเครื่องมือพร้อมแล้วเรามาเริ่มทำความเข้าใจกันที่ UpdateToLatestLedger ละกันนะครับ ดูแล้วน่าจะง่ายกว่า ส่วน SubmitTransaction เอาไว้แบ่งเป็นบทความถัดไป (ถ้ามี) ก็แล้วกันครับ :)
จะเห็นว่ามีการเรียก storage_read_client แล้วส่ง client_known_version และ account’s address แล้วจะได้รับค่า 3 ค่ากลับมาคือ response_items, ledger_info_with_sigs, validator_change_events จากนั้นจึงนำมาปรับ format พร้อมส่งกลับไปเป็น response
Public API update_to_latest_ledger ของ LibraDB ค่อนข้างยาวนะครับแต่ในความเป็นจริงแล้วจะสามารถเลือกดึงข้อมูลเฉพาะที่อยู่ใน RequestItems เท่านั้น เป็นการออกแบบ Public API ที่เอาไว้ใช้ในหลายสถานะการณ์โดยสามารถเลือกข้อมูลได้ดังนี้
- GetAccountState
- GetAccountTransactionBySequenceNumber
- GetEventsByEventAccessPath
- GetTransactions
มาถึงตรงนี้การติดตามลึกลงไปในส่วนการเชื่อมต่อ LibraDB ก็น่าสนใจเช่นเดียวกัน แต่เนื่องจากอาจจะทำให้บทความยาวมากๆ ผมอาจจะขอแยกบทความออกไปสำหรับเรื่องนั้น (ถ้ามี) นะครับ
อย่างไรก็ตามเมื่อได้รับ response จาก storage read service แล้วทาง admission control ก็ส่งกลับไปที่ทาง client ซึ่งทาง client ก็จะตรวจสอบอีกครั้งหนึ่งตามที่ได้อธิบายไปแล้วตอนทำความเข้าใจเรื่อง query balance แต่ไหนๆก็ไหนๆแล้ว เรามา debug response ที่ admission control ได้รับมาสักหน่อยดีกว่าครับ โดยย้อนกลับไปที่ function update_to_latest_ledger_inner เพื่อเพิ่ม debug code
Note: ที่หน้าต่าง tail log จะเห็นว่า ข้อมูลหายไปเล็กน้อย เราไม่เห็น validator_change_events ซึ่งเป็นค่าว่างในฝั่ง client และข้อมูลบางส่วนของ ledger_info_with_sigs คาดว่าน่าจะเป็น limit ของการใช้คำสั่ง grep ครับ อย่างไรก็ตามหวังว่าบทความนี้จะมีประโยชน์ ไม่มากก็น้อย ราตรีสวัสดิ์ครับ :)
บทความอื่นๆเกี่ยวกับการทำความเข้าใจ 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 2)
Facebook Libra focus on mempool
Facebook Libra focus on consensus (Part 1)