Bridge NFT with Axelar Service
บทความนี้เราจะมาสอนวิธีการ Bridge NFT ง่ายๆ จาก Chain ต้นทางของเรานั้น ให้ไปยัง Chain เป้าหมายที่เราต้องการ โดยใช้แค่ Service Axelar
เบื้องต้นเราต้องออกแบบระบบของเราก่อนว่า จะให้มี Contract อะไรบ้าง
โดยการออกแบบนี้จะเป็นการออกแบบใช้งานคร่าวๆ ในบทความเรา เพื่อใช้งานในการ Bridge NFT โดยในเบื้องต้นเราจะต้องทำการ Deploy NFT ไว้ก่อนทั้ง Source Chain และบน Destination Chain เพื่อง่ายต่อการทดลองใช้ Service Axelar
ต่อมาเราจะมาอธิบายกันนะครับว่าแต่ละกล่อง มีหน้าที่อะไรบ้าง เขียนยังไงบ้างในส่วนนี้ผมจะขอข้ามขั้นตอนการ Deploy Contract NFT นะครับ
- MCrossBridgeNFT Controller (Source Chain)
โดย Controller ในฝั่ง Source Chain นั้นมีหน้าที่ในการรับ NFT จากต้นทางเข้ามา Lock หาก Original NFT อยู่บน Chain เดียวกันกับ Controller แต่ถ้าหาก NFT นั้นมี Original Chain ที่ไม่ตรงกันกับ Controller จะใช้วิธีการ burn NFT ชุดนั้นไป เพราะ NFT ชิ้นนั้นไม่ใช่ Original
โดยฝั่ง Source Chain เราจะโฟกัสที่ บรรทัด 62–85 โดย Function bridge จะรับ Argument ดังนี้
- chainId => Destination Chain
- tokenId => Token Id ของ NFT
- amountFree => ค่าทำเนียม
- header => อันนี้คือ Flexible ไว้รองรับ Service อื่น ถ้าไม่มีก็ใส่ 0x00 ได้เลย
โดยการทำงานจะเช็คก่อนว่า chainName ที่ set ค่าไว้ก่อน Deploy Contract มีค่าเท่ากับ Ethereum หรือไม่ ถ้าเท่ากันก็จะทำการ Lock NFT ไว้ใน Contract แต่ถ้าไม่ใช่ก็จะทำการ Burn ทิ้ง
จากนั้นเราจะทำการ set value payload ให้มีค่าเป็น msg.sender, tokenId เพื่อใช้ข้อมูลนี้ในการ Mint NFT ปลายทาง ต่อมาก็จะไปเรียกใช้งาน IMCrossBridgeNFT เพื่อทำการส่ง Data โดยสิ่งที่เพิ่มเติมคือ เราจะส่งตัว Function Signature ของ Controller ไปด้วย เมื่อ Axelar Execute ที่ Contract ปลายทาง ก็จะสามารถที่จะ Call กลับมาที่ Controller ปลายทางได้เลย
2. IMCrossBridgeNFT
ทำหน้าที่เป็น Interface เพื่อให้ Contract Service ต่าง ๆ นำไปสืบทอดแล้วนำ function _bridge มา oveeride โดย IMCrossBridgeNFT ทำหน้าที่เหมือนตัวคอยแปลภาษาให้ตรงตามแต่ละ Service ที่ต้องการที่จะนำข้อมูลไปใช้งาน ในการ Bridge NFT
3. MCrossBridgeNFT
โดยกล่องนี้จะเป็นขั้นตอนในการ Bridge NFT โดยใช้ Service ของ Axelar โดยในฝั่งของ Source Chain เราจะสนใจแค่ บรรทัดที่ 48–79 โดยการทำงานเราจะ override function _bridge ที่ได้ทำการสืบทอดมาจาก IMCrossBridgeNFT นำมาเขียนเช็ค Permission ว่าคนที่จะทำการ Call Function นี้ได้ต้องมาจาก Address Controller เท่านั้น หลักจากนั้นเราจะส่งข้อมูลเข้าไป Function _bridgeAxelar เพื่อ Call Axelar Service โดยส่วนนี้เราจะใช้ Method ของ Axelar คือ payNativeGasForContractCall คือการใช้ Native Token ในการจ่ายค่า Gas ให้กับ Axelar หลังจากนั้นจะใช้ Method callContract คือการสั่งให้ Axelar ไป Call Contract บน Chain เป้าหมายของเราและแนบ payload เพื่อไปใช้งานบน Destination Chain
4. MCrossBridgeNFT (Destination Chain)
โดย Contract นี้จะเขียนเหมือนกันกับ หัวข้อที่ 3 แต่เราจะมาโฟกัสที่ Function _execute เมื่อเราได้ทำการ callContract จาก Source Chain แล้วทาง Axelar จะมา เรียก function _execute บน Contract จากเรา โดยเบื้องต้นจะเช็คก่อนว่า Source Chain ที่ส่งมาเป็น Address ที่เราได้ให้ Permission ไว้หรือไม่ จากนั้นจะทำการ call Function Signature ที่ได้แนบมาในตอนขั้นตอนที่ 1 ไปที่ Controller ที่ Destination Chain ต่อไปในขั้นตอนที่ 5
5. MCrossBridgeNFT Controller (Destination Chain)
โดย Contract นี้จะเขียนเหมือนกันกับ หัวข้อที่ 1 โดยสนใจที่ Function unlock เมื่อ MCrossBridgeNFT ได้ทำการ call Contract แล้ว ฝั่ง Controller ก็จะไปเรียก Function unlock โดยจะทำการเช็คว่า chainName ที่เราได้ set ชื่อ Chain ไว้ตอน Deploy Contract นั้นมีค่าเท่ากับ Ethereum หรือไม่ ถ้าหากเท่ากันเราจะทำการส่ง NFT ที่ได้ทำการ Lock ไว้ส่งกลับคืนให้กับ User แต่ถ้าไม่ใช่ เราจะทำการ Mint NFT ขึ้นมาใหม่ โดยจะทำการอ้างอิง BaseURI และ TokenId จากของ Original เดิม
ก็จบแล้วนะครับสำหรับการทำ Service Bridge NFT ด้วย Axelar Service เพื่อน ๆ สามารถดู Code ตัวเต็มได้ที่นี่
และเพื่อนสามารถศึกษา Service Axelar เพิ่มได้ที่นี่เลยครับ