Mint NFT Cross-Chain with Axelar

paramet kongjaroen
Under Ledger
Published in
2 min readJun 14, 2022

โดยบทความนี้จะมาแชร์ ความรู้เกี่ยวกับการ Mint NFT แบบ Cross-Chain โดย service ที่เราใช้นั้น เราจะใช้ของ Axelar เพื่อทำการโอน Token จาก Chain หนึ่ง ไปสู่อีก Chain หนึ่ง เพื่อทำการ Mint NFT บน Chain ปลายทาง

การออกแบบการทำงานของระบบ

แผนภาพ Daigram เบื้องต้น

โดยการออกแบบจะออกแบบในรูปแบบที่ง่าย ๆ และสามารถเอา service อื่น ๆ มา Integrate ร่วมกับระบบเราเพิ่มได้อีกด้วย โดยหน้าของแต่ละกล่องมีดังนี้

  1. MCrossMintController

กล่องแรกเปรียบเสมือนเป็น Controller ที่คอยเรียกใช้ service ต่าง ๆ ที่เราได้นำมา Imprement กับระบบของเราโดยบทความนี้เราจะใช้เพียงแค่ Axelar

โดย Function ที่สำคัญของ MCrossController คือ Function mint โดย Function จะรับค่า uint256 _mintAmount หรือจำนวนที่ต้องการ Mint และ payload โดย payload สามารถที่จะรับค่าที่ encode อะไรมาก็ได้ เพื่อให้หยืดหยุ่นนำไปใช้ใน service ที่นอกเหนือจาก Axelar โดย Function นี้จะมีหน้าที่ดึง WETH ของ User เพื่อไป Bridge ข้ามไปอีก Chain และทำหน้าที่ในการรับ Native Token เพื่อเตรียมส่งต่อไปที่ MCrossBridgeToken เพื่อจ่ายค่า gas ให้กับ Axelar

บรรทัดที่ 41–45 คือขั้นตอนที่ MCrossController เตรียมส่ง WETH, Native Token และข้อมูลต่างๆ ไป MCrossBridgeToke

2. IMCrossBridgeToken

IMCrossBridgeToken ทำหน้าที่เป็น Interface เพื่อให้ Contract Service ต่าง ๆ นำไปสืบทอดแล้วนำ function _bridge มา oveeride โดย IMCrossBridgeToken ทำหน้าที่เหมือนตัวคอยแปลภาษาให้ตรงตามแต่ละ Service ที่ต้องการที่จะนำข้อมูลไปใช้งาน ในการ Bridge Token

3. MCrossBridgeToken

MCrossBridgeToken ทำหน้าที่ในการส่งออก Token และ payload เช่น ส่ง WETH และ Message ไปยัง Chain ปลายทางโดยใช้ Service ของ Axelar

บรรทัดที่ 86–93 คือการ สืบทอด IMCrossBridgeToken จากนั้นนำมา Override Function ให้ไปใช้ Service ของ Axelar โดยจะเรียกย้อนกลับไปที่ Function _mintAxelar

บรรทัดที่ 46–84 คือการ Bridge Token โดยใช้ Service ของ Axelar โดยจะมี method ที่สำคัญดังนี้

  1. บรรทัดที่ 67 คือ การจ่าย gas ให้กับ Axelar โดยทาง Axelar จะไม่แบกค่า gas ให้เรา ดังนั้นเราจะต้อง provide ค่า gas ให้กับทาง Axelar เอง โดยเราสามารถเลือกจ่ายได้หลายแบบ โดยในบทความนี้จะใช้ payNativeGasForContractCallWithToken คือการใช้ Native Token ของ Chain นั้น ๆ นำไปจ่ายค่าแก๊สให้กับ Axelar และบอก Axelar ว่า เป็นการ callContractWithToken คือเป็นการ Call Contract ปลายทางพร้อมกับส่ง Token จากต้นทางไปด้วย
  2. บรรทัดที่ 77 คือ การเรียกใช้งาน method callContractWithToken โดยทาง Axelar จะ call contract แล้วทำการส่ง Token กับ payload บน Chain ต้นทางของเราส่งไปตาม Chain ปลายทางที่เราได้กำหนดไว้

3. MCrossReceiveToken

MCrossReceiveToken จะเป็น Contract ที่อยู่ปลายทาง เมื่อเราทำการ Bridge Token จาก Chain ต้นทางแล้ว Axelar ก็จะมาทำการ Execute Contract ของเรา

บรรทัดที่ 38 เนื่องจากตัว MCrossReceiveToken ได้ทำการสืบทอด IAXelarExecutable เราสามารถที่จะนำ Function _executeWithToken มา override ได้ โดยเราจะนำ payload ที่แนบมาจาก Chain ปลายทางนั้น นำมา decode ออกมา ซึ่งเราจะได้ address minter, uint256 mintAmount ออกมา จากนั้นเราก็ทำการส่งไปต่อที่ Contract NFT เพื่อไปทำการ Mint NFT ให้กับ address minter ต่อไป

--

--