มาแกะ code bsc-eth bridge กันเถอะ (Part 1 contract)
3/100 days of code
bridge คืออะไร?
bridge คือการย้ายเหรียญข้าม chain
overview ภาพรวม
ตัว bridge จะประกอบด้วย 2 contract และ 1 backend ขั้นตอนการทำงานคร่าวๆคือ
การ Register
- Register (เพิ่มเหรียญที่จะให้ bridge ได้) ผ่าน contract ฝั่ง ETH ก่อน
- backend จะทำการ deploy เหรียญ BEP20 ฝั่ง BSC ให้
การ Swap จาก ETH ไป BSC
- เรียก contract ฝั่ง ETH โดยระบุ เหรียญ, จำนวน และค่า fee ที่จะทำการ lock
- backend จะเรียก contract ฝั่ง BSC เพื่อ mint เหรียญ BEP20 ให้กับ address ของ user
การ Swap จาก BSC ไป ETH
- เรียก contract ฝั่ง BSC โดยระบุ เหรียญ, จำนวน และค่า fee ที่จะทำการ burn
- backend จะเรียก contract ฝั่ง ETH เพื่อโอนเหรียญที่ lock ไว้ให้กับ address ของ user
โอเค มาลองดู code ทีละส่วนกัน
การ Register
การ register ด้วย user จะเรียก function registerSwapPairToBSC ของ contract ETHSwapAgent มีขั้นตอนดังนี้
- เช็คว่าเหรียญต้องยังไม่เคย register
- ดึงข้อมูล name, symbol และ decimal ของเหรียญนั้น
- เช็คว่า name ของเหรียญนั้นไม่เป็น string ว่าง
- เช็คว่า symbol ของเหรียญนั้นไม่เป็น string ว่าง
- เก็บว่าเคย register เหรียญนี้แล้ว
- emit event SwapPairRegister เพื่อ trigger ให้ backend ทำงานต่อไป
ต่อมา backend จะทำการเรียก function createSwapPair ของ contract BSCSwapAgent มีขั้นตอนดังนี้
- เช็คว่า address ต้องไม่เคย register ที่ฝั่งนี้
- deploy BEP20 contract
- เก็บว่าคู่ address ของเหรียญทั้ง 2 ฝั่ง
- emit event SwapPairCreated อันนี้ไม่แน่ใจว่าเอาไว้ทำอะไร คงต้องไปแกะ code backend อีกที ไว้ครั้งหน้าละกัน
การ Swap จาก ETH ไป BSC
user เรียก function swapETH2BSC ของ contract ETHSwapAgent มีขั้นตอนดังนี้
- เช็คว่าต้องเคย register address นี้แล้ว
- เช็ค swapFee จาก msg.value ต้องเท่ากับค่าที่ตั้งไว้
- โอน erc20 มาเก็บยังตัว contract เพื่อ lock
- โอน swapFee ไปยัง owner ของ contract
- emit event SwapStarted
6. backend เรียก function fillETH2BSCSwap ของ contract BSCSwapAgent
7. เช็คว่า txHash ยังไม่เคยนำมา bridge
8. ดึงข้อมูล address ของ BEP20 ที่คู่กับ ERC20 มาเก็บไว้
9. เช็คว่ามี address ของ BEP20 ที่คู่กับ ERC20
10. เก็บว่า txHash นี้เคย bridge แล้ว
11. mint BEP20 ให้กับ address user
12. emit event SwapFilled
การ Swap จาก BSC ไป ETH
user เรียก function swapBSC2ETH ของ contract BSCSwapAgent มีขั้นตอนดังนี้
- ดึง address erc20 ที่คู่กับ BEP20 ที่จะ bridge
- เช็คว่ามีค่า address erc20 ที่คู่กับ BEP20 อยู่ ไม่เป็น string ว่าง
- เช็คว่าต้องส่ง Fee(BNB) มาเท่ากับที่ตั้งไว้
- ดึง BEP20 ที่จะ bridge มายัง contract
- burn BEP20 ที่ดึงมา
- emit event SwapStarted
7. backend เรียก function fillBSC2ETHSwap ของ contract ETHSwapAgent โดยเริ่มจาก เช็คว่า txHash นั้นยังไม่เคยนำมา bridge
8. เช็คว่า erc20 นั้นเคย register มาแล้ว
9. เก็บว่า txHash เคย bridge แล้ว
10. โอน ERC20 ไปให้ address user
11. emit event SwapFilled
โอเค part contract ก็ประมาณนี้ ไว้มาต่อ part backend กัน