Bridge จาก Chiliz Chain ไป Solana
ปรับใช้ OFT Adapter บน Chiliz Chain และ Native OFT บน Solana โดยใช้ LayerZero v2 เพื่อ bridge token จาก Chiliz Chain ไปยังเครือข่าย Solana
ในการ bridge token ที่มีอยู่แล้วจาก Chiliz Chain ไปยัง Solana คุณต้องเขียนและปรับใช้ smart contract แยกกันสองชุด ได้แก่ OFT Adapter บนเครือข่ายที่ token นั้นมีอยู่แล้ว (Chiliz Chain) และ Native OFT บนเครือข่ายปลายทาง (Solana)
โปรดทราบว่า LayerZero มี QuickStart สำหรับ OFT contracts ของตัวเองด้วย:
ข้อกำหนดเบื้องต้น
การ bridge จาก Chiliz Chain (EVM) ไปยัง Solana (Non-EVM) ต้องใช้การพัฒนาแบบ dual-stack คุณจะต้องตั้งค่า environment และ กระเป๋าเงิน สำหรับทั้งสองระบบ
ดังนั้นคุณจะต้องมี environment ดังต่อไปนี้:
สำหรับการใช้งาน Chiliz Chain: Node/npx และ Hardhat
สำหรับการใช้งาน Solana: Rustup (Solana smart contract ใช้ภาษาโปรแกรม Rust), Solana CLI และ Anchor framework และ LayerZero's Solana SDK
คู่มือนี้ต้องการสิ่งต่อไปนี้:
ที่อยู่ contract ของ token บน Chiliz Chain คุณไม่จำเป็นต้องเป็นเจ้าของ
กระเป๋าเงิน Web3 สำหรับแต่ละเครือข่าย (MetaMask ไม่รองรับเครือข่าย non-EVM):
สำหรับ Chiliz Chain: กระเป๋าเงิน MetaMask พร้อม การกำหนดค่า RPC ของ Chiliz Chain
สำหรับ Solana: กระเป๋าเงิน Solflare พร้อม การกำหนดค่า Solana Mainnet นี่คือ คู่มือการตั้งค่า
gas token เพียงพอบนแต่ละเครือข่ายเพื่อชำระค่าธรรมเนียมการปรับใช้ contract รวมถึงค่าธรรมเนียม gas สำหรับการส่งข้อความ
บน Chiliz Chain: token CHZ
บน Solana: token SOL
ขั้นตอนที่ 1: การพัฒนา Contract
ความท้าทายเรื่อง "Shared Decimals"
เนื่องจาก Solana จัดการคณิตศาสตร์ของ token แตกต่างจาก Ethereum Virtual Machine (EVM) เราจึงต้องจัดการ decimals อย่างถูกต้อง:
Chiliz Chain (EVM): token ERC-20 มาตรฐานมักมีความแม่นยำ 18 decimals
Solana: Native SPL Tokens มักมีความแม่นยำ 9 decimals
หากคุณส่ง หน่วยจาก Chiliz ไปยัง Solana contract ของ Solana จะตีความจำนวนผิด ส่งผลให้เกิดการ inflation ของ token อย่างมหาศาลบนเครือข่ายปลายทาง
เพื่อทำให้การคำนวณเป็นมาตรฐาน LayerZero ใช้การกำหนดค่า sharedDecimals โดยค่าเริ่มต้น LayerZero V2 OFT standard กำหนด sharedDecimals ไว้ที่ 6
เมื่อผู้ใช้ bridge 1.00 token จาก Chiliz Adapter จะตัด 12 decimals ล่างสุดออก (ถือว่าเป็น "dust") เพื่อลดตัวเลขให้เหลือ 6 decimals
ข้อความถูกส่งข้าม bridge
โปรแกรม Solana รับตัวเลข 6 decimals แล้วปรับ ขึ้น ไปยัง 9 decimals ในระบบของตนก่อนการสร้าง
การเตรียม OFTAdapter บน Chiliz Chain
OFTAdapter บน Chiliz Chainนี่เป็นขั้นตอนการเตรียมความพร้อม อย่าปรับใช้ตอนนี้! คุณจะปรับใช้ในขั้นตอนที่ 3
contract OFTAdapter ทำหน้าที่เป็นกล่องล็อคสำหรับ token ที่มีอยู่ของคุณ เมื่อผู้ใช้ bridge token ออกจาก Chiliz Chain contract นี้จะล็อค token ERC20 ต้นฉบับไว้
เนื่องจาก OFTAdapter ของ LayerZero กำหนด sharedDecimals เป็น 6 โดยค่าเริ่มต้น คุณจึงสามารถใช้การใช้งานมาตรฐานได้ หากคุณต้องการเปลี่ยนค่านี้ (เช่น เป็น 8) คุณจะต้อง override ฟังก์ชัน sharedDecimals()
สร้างไฟล์ใหม่ชื่อ ChilizTokenAdapter.sol ในโฟลเดอร์ contracts ของคุณ:
ดังที่เห็น contract นี้ขยาย LayerZero OFT Adapter contract รวมถึง contract Ownable.sol มาตรฐานเพื่อให้สิทธิ์ผู้ดูแลระบบ คุณต้องการทั้งสองอย่างเพื่อให้คุณ และเฉพาะคุณเท่านั้น สามารถเชื่อมโยงเครือข่ายทั้งสองได้อย่างปลอดภัย
การเตรียมและปรับใช้ OFT บน Solana
OFT บน Solanaต่างจาก Chiliz Chain ตรงที่ Solana ไม่ได้ใช้ Ethereum Virtual Machine (EVM) หรือภาษา Solidity Smart contract ของ Solana (เรียกว่า "Programs") เขียนด้วย Rust
ในการ bridge token ของคุณ คุณต้องปรับใช้โปรแกรม OFT บน Solana เมื่อโปรแกรมนี้ได้รับข้อความที่ผ่านการยืนยันจาก OFTAdapter ที่ปรับใช้บน Chiliz มันจะสร้าง SPL token ที่สอดคล้องกันเข้าไปใน กระเป๋าเงิน Solana ของผู้ใช้
LayerZero มี ตัวอย่าง Anchor ที่พร้อมใช้งาน ดังนั้นคุณไม่ต้องเขียนลอจิก bridge ด้วย Rust ตั้งแต่ต้น
1. Clone ตัวอย่าง LayerZero OFT Solana:
2. Build โปรแกรม Rust
สิ่งนี้จะสร้าง Solana Program ID ที่ไม่ซ้ำกันของคุณด้วย (เทียบเท่ากับ ที่อยู่ contract ใน EVM):
หลังจาก build เสร็จสมบูรณ์ Anchor จะสร้าง keypair ใหม่ใน target/deploy/oft_solana-keypair.json
คุณสามารถดึง Program ID ใหม่ของคุณได้โดยรัน:
3. ปรับใช้บน Solana Mainnet
ตรวจสอบให้แน่ใจว่า Solana CLI ของคุณได้รับการกำหนดค่าสำหรับ Mainnet และ กระเป๋าเงิน ในเครื่องของคุณมี $SOL เพียงพอสำหรับการปรับใช้และ storage rent
อย่าลืมอัปเดตไฟล์ Anchor.toml และ macro declare_id! ใน lib.rs ด้วย Program ID ใหม่นี้ก่อนปรับใช้
4. Initialize OFT และ SPL Mint
บน Solana ลอจิกของ token และบัญชีแยกประเภทถูกแยกออกจากกัน คุณต้อง initialize Mint Account ใหม่ (SPL Token) และกำหนดโปรแกรม OFT ที่ปรับใช้ใหม่ของคุณเป็น Mint Authority เพื่อให้แน่ใจว่าเฉพาะ bridge ของ LayerZero เท่านั้นที่สามารถสร้าง token ใหม่บน Solana ได้
LayerZero SDK มี task ของ Hardhat/TypeScript เพื่อจัดการการ initialize นี้โดยตรงจาก command line ในโปรเจกต์ oft-solana ของคุณ กำหนดค่า LayerZero Endpoint สำหรับ Solana (30168) และรัน initialization script:
พารามิเตอร์สำคัญ:
--mint-decimals 9: กำหนดความแม่นยำของ SPL token มาตรฐานบน Solana--shared-decimals 6: ต้องตรงกับ shared decimals ที่คุณกำหนดค่า (หรือค่าเริ่มต้น) บนOFTAdapterของ Chiliz Chain ซึ่งเป็นสิ่งที่รับประกันว่า 1 token บน Chiliz = 1 token บน Solana
เมื่อธุรกรรม initialization นี้ได้รับการยืนยันบน blockchain ของ Solana โปรแกรม OFT ของคุณก็พร้อมใช้งานและพร้อมที่จะเชื่อมต่อกับ Chiliz OFTAdapter แล้ว!
ขั้นตอนที่ 2: การกำหนดค่า LayerZero
เมื่อปรับใช้ Chiliz Adapter และ initialize โปรแกรม Solana OFT แล้ว คุณต้องกำหนดค่าการเชื่อมต่อระหว่างกัน นี่คือจุดที่ความแตกต่างระหว่างเครือข่าย EVM และ non-EVM ปรากฏชัดเจนมาก
รูปแบบที่อยู่:
Chiliz Chain (EVM): ใช้ที่อยู่เลขฐานสิบหกขนาด 20 bytes มาตรฐาน (เช่น
0x123...)Solana: ใช้ที่อยู่แบบ Base58 encoded (เช่น
YourProgramId111111111111111111111111111111)
การส่งข้อความข้ามเครือข่ายของ LayerZero กำหนดให้ ที่อยู่ peer ทั้งหมดต้องอยู่ในรูปแบบ bytes32 โชคดีที่ tooling Hardhat ของ LayerZero V2 จัดการการแปลง Base58 เป็น Bytes32 ให้คุณโดยอัตโนมัติ ตราบใดที่คุณกำหนด endpoint อย่างถูกต้องในการกำหนดค่า
Simple Config Generator เป็นวิธีที่แนะนำในการสร้างการกำหนดค่า wiring เนื่องจากจัดการ bidirectional wiring โดยอัตโนมัติและใช้การกำหนดค่าความปลอดภัยที่แนะนำโดยไม่ต้องตั้งค่าเอง
สร้างหรืออัปเดตไฟล์ layerzero.config.ts ในไดเรกทอรีรากของโปรเจกต์ Hardhat ของคุณ:
task wire ของ LayerZero จะอ่านสิ่งนี้ ถอดรหัสสตริง Base58 เติมให้ครบ 32 bytes และส่งต่ออย่างปลอดภัยไปยังฟังก์ชัน setPeer ของ Chiliz OFTAdapter
ขั้นตอนที่ 3: ขั้นตอนการปรับใช้
เมื่อเขียน contract และเตรียม layerzero.config.ts แล้ว ถึงเวลาปรับใช้ Chiliz OFTAdapter เนื่องจากคุณได้ build และปรับใช้โปรแกรม native OFT ของ Solana โดยใช้ Anchor ในขั้นตอนที่ 1 แล้ว ขั้นตอนนี้จึงมุ่งเน้นที่การปรับใช้ฝั่ง EVM ของ bridge โดยใช้ Hardhat
การปรับใช้ contract Chiliz OFTAdapter
ในโปรเจกต์ Hardhat ของคุณ สร้าง deployment script ในไดเรกทอรี deploy/ ชื่อ 01_deploy_chiliz_solana_adapter.ts script นี้ส่ง ที่อยู่ token ที่มีอยู่และ Chiliz Endpoint V2 address (EID) ไปยัง constructor
การปรับใช้ Chiliz OFTAdapter
ก่อนดำเนินการต่อ ตรวจสอบให้แน่ใจว่า:
คุณได้คัดลอก Base58 Program ID ที่ได้ไปใส่ในไฟล์
layerzero.config.tsของคุณแล้วhardhat.config.tsของคุณมีการกำหนดค่า RPC URL และ private key อย่างถูกต้องสำหรับ Chiliz Chain Mainnet
รันคำสั่งต่อไปนี้ใน terminal เพื่อปรับใช้ EVM Adapter:
เมื่อการปรับใช้เสร็จสมบูรณ์ Hardhat จะบันทึก ที่อยู่ contract ของ Chiliz ไว้ในโฟลเดอร์ deployments/
ณ จุดนี้ คุณมี contract ที่ใช้งานอยู่ทั้งบน Chiliz Chain (EVM) และ Solana (SVM) แต่พวกมันยังไม่เชื่อถือกัน ถึงเวลาให้พวกมันรู้จักกัน!
ขั้นตอนที่ 4: การ Wire และ Peer
เพื่อให้ contract OFTAdapter และโปรแกรม OFT ของคุณสื่อสารกันได้ คุณต้อง "wire" พวกมันเข้าด้วยกันในฐานะ peer ที่เชื่อถือได้
เนื่องจากเราเป็น bridge ข้าม Virtual Machine สองประเภทที่แตกต่างกันโดยสิ้นเชิง (EVM และ SVM) การกำหนดค่าจึงต้องใส่ใจเป็นพิเศษ
EVM gas เทียบกับ Solana compute units
เมื่อผู้ใช้ bridge token จาก Chiliz Chain ไปยังเครือข่าย EVM อื่น (เช่น Base) LayerZero Executor ต้องใช้ EVM gas เพื่อเรียก lzReceive
อย่างไรก็ตาม เมื่อ bridge จาก Chiliz Chain ไปยัง Solana เครือข่ายปลายทางไม่ได้ใช้ EVM gas มันใช้ Compute Units และ Lamports (เศษส่วนของ $SOL) นอกจากนี้ หากผู้ใช้ bridge token ไปยัง กระเป๋าเงิน Solana ที่ยังไม่ได้ถือ token ของคุณ Executor จะต้องจ่ายค่า "rent exemption" ของ Solana เพื่อสร้าง Associated Token Account (ATA) สำหรับพวกเขา ซึ่งต้องใช้ค่า $SOL จริงๆ บนปลายทาง
เพื่อรับประกันว่า Executor มี Compute Units และ Lamports เพียงพอในการสร้าง token และสร้าง ATA บน Solana คุณต้องกำหนดขีดจำกัดเหล่านี้ในไฟล์ layerzero.config.ts ก่อน การ wire
รันคำสั่ง wire อัตโนมัติใน terminal ของคุณ:
สิ่งนี้จะเตรียมธุรกรรมการกำหนดค่าที่จำเป็น 6 รายการ:
setSendLibrary: กำหนด MessageLib สำหรับ packet ขาออกsetReceiveLibrary: กำหนด MessageLib สำหรับ packet ขาเข้าsetConfig: กำหนดค่า DVN และ ExecutorsetConfig: กำหนดค่า DVN สำหรับการยืนยันขาเข้าsetEnforcedOptions: รับประกันพารามิเตอร์การดำเนินการที่สอดคล้องกัน (สำคัญมากเพื่อให้แน่ใจว่าผู้ใช้ชำระเงินล่วงหน้าเพียงพอเพื่อครอบคลุม Solana Compute Units และ Lamport rent)setPeer: เชื่อมโยง Solana EID กับ Base58 Program ID ปลายทางของคุณ
LayerZero V2 toolbox จัดการส่วนที่หนักโดยอัตโนมัติ: มันจะถอดรหัส ที่อยู่ Solana แบบ Base58 เติมให้ครบรูปแบบ bytes32 ของ EVM และส่งธุรกรรม setPeer และ setEnforcedOptions ไปยังทั้งสองเครือข่าย
เมื่อธุรกรรม wiring ได้รับการยืนยัน bridge EVM-to-Solana ของคุณก็เปิดใช้งานและได้รับการกำหนดสิทธิ์อย่างปลอดภัยแล้ว
token ของคุณพร้อมข้ามแดน EVM/SVM อย่างเป็นทางการแล้ว!
ขั้นตอนที่ 5: การใช้งานและการทดสอบ
เมื่อปรับใช้ Chiliz Adapter เริ่มต้น Solana Native OFT และ wire ทั้งสองเข้าด้วยกันอย่างถูกต้องแล้ว token ของคุณก็พร้อมข้ามแดน EVM/SVM อย่างเป็นทางการแล้ว ขั้นตอนสุดท้ายคือการดำเนินการและติดตามการโอน ทดสอบจาก Chiliz Chain ไปยัง Solana
1) การส่งข้อความข้ามเครือข่ายไปยัง Solana
LayerZero V2 toolbox มี task ของ Hardhat สำหรับส่งการโอน OFT โดยตรงจาก command line
ต่างจากการโอน EVM-to-EVM ที่ปลายทางเป็นสตริงเลขฐานสิบหกมาตรฐาน ปลายทางของคุณที่นี่คือ ที่อยู่ กระเป๋าเงิน Solana แบบ Base58 LayerZero CLI จัดการการแปลง Base58 เป็น Bytes32 สำหรับ message payload โดยอัตโนมัติ
รันคำสั่งต่อไปนี้ใน terminal ของคุณ:
เกิดอะไรขึ้นที่นี่?
script จะแสดงค่าธรรมเนียมข้ามเครือข่ายใน $CHZ (ซึ่งครอบคลุม EVM gas ค่าธรรมเนียมเครือข่ายผู้ยืนยัน และค่าธรรมเนียมปลายทาง Solana)
มันเรียกฟังก์ชัน
send()บน Chiliz Adapter ของคุณAdapter ล็อค 10 token (18 decimals) มันตัด 12 decimals ล่างสุดเป็น "dust" (ทิ้งไว้ใน กระเป๋าเงิน Chiliz ของคุณ) เพื่อปรับ payload ลงเป็น
sharedDecimalsจำนวน 6LayerZero Endpoint ส่ง packet ไปยัง Solana Mainnet
2) การติดตาม Packet บน LayerZero Scan
เนื่องจากการ bridge ไปยัง Solana เกี่ยวข้องกับการแปลระหว่างกลไกฉันทามติสองประเภทที่แตกต่างกันโดยสิ้นเชิงและรอ SVM finality ความล่าช้าแบบ asynchronous จึงเป็นเรื่องปกติ
ในการติดตามการเดินทางนี้แบบ real-time ให้คลิกลิงก์ LayerZero Scan ที่ปรากฏใน CLI output
เรียนรู้เพิ่มเติมเกี่ยวกับ tool นี้ได้ที่นี่:
การแปล Decimal
Solana Native OFT จะปรับ payload 6-decimal ที่มาจาก bridge ขึ้นเป็น SPL มาตรฐาน 9 decimals โดยอัตโนมัติ ดังนั้น กระเป๋าเงิน Solana ของคุณจะได้รับ token ครบถ้วนจำนวน 10 token
4) การแก้ไขปัญหาข้อความที่ค้างอยู่
หากธุรกรรมของคุณถูกทำเครื่องหมายว่ายืนยันแล้วบน Chiliz แต่ไม่ดำเนินการบน Solana สาเหตุที่พบบ่อยที่สุดคือข้อผิดพลาด Insufficient Lamports หรือ Compute Units
หาก กระเป๋าเงิน Solana ปลายทางยังไม่มี Associated Token Account (ATA) สำหรับ token เฉพาะของคุณ LayerZero Executor จะต้องจ่ายค่า "rent exemption" ของ Solana เพื่อสร้างมัน
หากพารามิเตอร์
value(Lamports) ในenforcedOptionsของคุณถูกตั้งต่ำเกินไปเพื่อครอบคลุม rent นี้ หรือหากgas(Compute Units) ไม่เพียงพอ Executor จะปฏิเสธที่จะจ่ายเอง และข้อความจะหยุดชะงักวิธีแก้ไข: คุณไม่สูญเสีย token คุณสามารถดัน stuck message ผ่าน LayerZero Scan UI ได้ด้วยตัวเอง เชื่อมต่อ กระเป๋าเงิน Solana ของคุณ คลิกปุ่ม "Force Resume" หรือ "Execute" บน block explorer และชำระค่าธรรมเนียมปลายทางในเครื่อง (Compute Units + ATA Rent ใน $SOL) ด้วยตัวเองเพื่อทำให้การสร้างเสร็จสมบูรณ์
อัปเดตล่าสุด
สิ่งนี้มีประโยชน์หรือไม่?