มาแกะ code bsc-eth bridge กันเถอะ (Part 4 finish fetchBlock)

Nattawat Songsom
3 min readJul 15, 2022

--

จาก part ที่แล้ว เราดู function DeleteBlockAndTxEvents ไปละ มาต่อกันให้จบ function fetchBlock กัน

เรากำลังแกะ backend ตรงกลางละนะ

จากฟังก์ชัน fetchBlock ที่มี code ตามนี้

เราถึงบรรทัดที่ 91 แล้วละนะ

โอเค เราเรียก function SaveBlockAndTxEvents ในบรรทัด 100 ไปดูโค้ดฟังก์ชันนั้นกัน

โอเค มาดูทีละส่วนกัน

เริ่มจากการสร้าง row ในตาราง BlockLog

ซึ่งเป็นการดึงข้อมูล block ถัดไป จาก block ล่าสุดใน db มา insert ลง db ละนะ โอเคไปต่อกัน

ต่อมาเราวนลูปตัวแปร packages เป็นการดึง event SwapStarted จาก block ถัดไป จาก block ล่าสุด มา save ลง db

อันนี้ตัว event จาก contract ละนะ
อันนี้ตัว schema ที่รับ event SwapStartTxLog มาเก็บ

โอเค ต่อมาเป็นการเรียก function UpdateSwapStartConfirmedNum มาดูกันว่า code เป็นยังไง

มาดู code ทีละส่วนกัน

เราหา update จากตาราง SwapStartTxLog โดยอัพเดท field confirmed_num เพื่อนับว่าผ่านไปกี่ block แล้ว

จากนั้นหาว่า block เหล่านั้น ผ่าน block confirm ของตัวเองแล้วยัง โดยอันนี้จะกัน case orphan block ละนะ ถ้าผ่านแล้วก็ update สถานะ จะได้ไม่ต้องมาคำนวณระยะห่าง block ว่า confirm แล้วยังทุกครั้ง และไม่ต้องมาอัพเดทระยะห่าง block ด้วย

โอเค สุดท้ายเป็นการเรียก UpdateSwapPairRegisterConfirmedNum มาดู code กัน

อันนี้เป็น code เต็มๆนะ มาดู code ทีละส่วนกัน

เป็นการอัพเดทระยะห่างของ block ล่าสุด กับ block ที่เกิด event SwapPairCreated ในตาราง SwapPair แต่ยังไม่เจอ code การ insert เข้าตารางนี้เลย เดี๋ยวคงเจอ code ส่วนนั้นละนะ

ต่อมาเป็นดูว่าระยะห่างของ block ที่เกิด event SwapPairCreated นั้น ถึงจำนวน confirm block ของ chain นั้นๆแล้วยัง ถ้าถึงก็จะอัพเดทสถานะว่า confirm แล้ว เดาว่าน่าจะมีการ find block number ที่คอนเฟิร์มแล้วเอาไปดึงข้อมูล event SwapPairCreated อีกที เพื่อนำไปยิง contract อีกเชน

note

ตอน find เพื่ออัพเดทระยะห่างของ block ล่าสุด มีการเช็คสถานะ block ด้วยว่าเคยอัพเดทว่า confirm แล้วยัง น่าจะช่วย optimize อยู่

โอเค function fetchBlock ใน function Start ของ executor chain BSC ก็จะประมาณนี้

สรุป

ใน fetchBlock มีการทำงานหลักๆคือ

  1. ดึง block ใน blockchain ที่ต่อจาก block ล่าสุดในตาราง blockLog มา ถ้า parentHash ของ block ใน blockchain นั้น ไม่ตรงกับ hash ของ block ล่าสุดใน db เราก็จะลบ block ใน db ของเราทิ้ง รวมทั้งตาราง event ต่างๆที่เกี่ยวข้องด้วย ตาม function DeleteBlockAndTxEvents (เพราะมีการ fork เกิดขึ้น และเราหยิบ block มาจาก fork ผิดเส้นประมาณนี้) แล้วกลับไปทำข้อ 1 ใหม่
  2. SaveBlockAndTxEvents จะ save ข้อมูล block ใน blockchain นั้นลง database รวมถึงถ้ามี event SwapStarted ใน block นั้นก็จะนำมา insert ลง db ด้วย
  3. UpdateSwapStartConfirmedNum เป็นการคำนวนระยะห่าง block ในตารางที่เก็บข้อมูล block ที่มี event SwapStarted ของ db เพื่อที่จะอัพเดท db ว่า block นั้นผ่าน confirm block range แล้วยัง
  4. UpdateSwapPairRegisterConfirmedNum เป็นการอัพเดท db เหมือนข้อ 3 เลยแต่เป็นของ event SwapPairCreated แทน ยังไม่เห็นการ insert ของ event SwapPairCreated เลยแหะ แปลกจัง ลองดู code ต่อไปเรื่อยๆก่อนแล้วกัน

เหมือนเค้าจะใช้วิธีไล่ดึงข้อมูลทุกๆ block มาเก็บลง db แล้วรอให้พ้น confirm block ก่อน แล้วค่อยส่งคำสั่งไป contract นะ วิธีนี้น่าจะช่วยแก้ case orphan block ได้ รวมทั้งถ้าล่มไปข้อมูลก็ไม่หาย เพราะเรารู้เลข block ล่าสุดที่ดึงมาเก็บใน db อยู่ละ

โอเคการทำงานของ Fetch หลักๆน่าจะจบละ line by line หมดเลยคงยาวไป ครั้งหน้าไปดูการ Prune และ Alert กัน

ref:

https://github.com/bnb-chain/bsc-eth-swap

--

--

No responses yet