Solana から Chiliz Chain へ bridge する
LayerZero v2 を使用して Solana に OFT Adapter を、Chiliz Chain に Native OFT をデプロイし、トークンを Solana から Chiliz Chain へ bridge します。
既存のトークンを Solana から Chiliz Chain へ bridge するには、2 つの個別の smart contract を記述してデプロイする必要があります。トークンがすでに存在するチェーン(Solana)には OFT Adapter を、宛先チェーン(Chiliz Chain)には Native OFT をデプロイします。
なお、LayerZero は OFT contract 向けに独自の QuickStart を提供しています。
前提条件
Solana(非 EVM)から Chiliz Chain(EVM)への bridge には、デュアルスタックの開発が必要です。 両方のエコシステム向けに環境とウォレットをセットアップする必要があります。
したがって、以下の環境が必要になります。
Solana とのやり取り用: Rustup(Solana の smart contract は Rust プログラミング言語を使用します)、Solana CLI と Anchor framework、および LayerZero の Solana SDK。
Chiliz Chain とのやり取り用: Node/npx と Hardhat。
このガイドには以下が必要です。
Chiliz Chain へ bridge したい既存の SPL Token の mint address。
各チェーン用の Web3 ウォレット:
Solana 用: Solana Mainnet 構成を備えた Solflare ウォレット。こちらがそのセットアップガイドです。
Chiliz Chain 用: Chiliz Chain RPC 構成を備えた MetaMask ウォレット。
contract のデプロイ、およびメッセージ送信の gas fee を支払うのに十分な gas トークンを各チェーン上に保有していること。
Solana 上: SOL トークン。
Chiliz Chain 上: CHZ トークン。
ステップ 1: Contract の開発
「Shared Decimals」の課題
Ethereum Virtual Machine(EVM)は Solana とは異なる方法でトークンの計算を扱うため、トークンが bridge を渡る前に小数精度を揃える必要があります。
Solana(ソース): ネイティブの SPL Token は通常 9 桁の小数精度を持ちます。
Chiliz Chain(宛先): 標準的な ERC-20 トークン(および新しい宛先 OFT)は通常 18 桁の小数を使用します。
変換せずに 9 桁の小数のペイロードを Solana から Chiliz へ直接送信した場合、EVM contract は金額を誤って解釈し、宛先チェーンでごく微小なトークンの端数が mint される結果となります。
計算を正規化するため、LayerZero は sharedDecimals 構成を使用します。デフォルトでは、LayerZero V2 OFT 標準は sharedDecimals を 6 に設定します。
ユーザーが Solana から 1.00 SPL トークンを bridge すると、Solana Adapter はその数値を 6 桁の小数にスケールダウンします(SPL トークンの下位 3 桁の小数を「dust」として扱い、ユーザーのウォレットに安全に残します)。
6 桁の小数のメッセージペイロードが bridge を渡って送信されます。
Chiliz Chain Native OFT は 6 桁の小数の数値を受け取り、ERC-20 トークンをユーザーの EVM ウォレットに mint する前に、ローカルの 18 桁の小数へとスケール_アップ_します。
Solana Program の開発
トークンはすでに Solana 上に存在するため、新しいトークン contract を作成する必要はありません。代わりに、Rust で記述された Solana OFT Adapter Program をデプロイします。この program は分散型ロックボックスとして機能し、ユーザーがトークンを Chiliz Chain へ bridge する際に SPL トークンを安全に保持し、ユーザーが bridge して戻す際にそれらを解放します。
LayerZero は、ビルド済みで監査済みの contract を備えた Anchor workspace を提供しているため、Rust のロジックをゼロから記述する必要はありません。
1. LayerZero Solana SDK のクローン
まず、Solana OFT Adapter のサンプルを含む公式の LayerZero 開発者ツールリポジトリをクローンします。
ターミナルを開いて、次を実行します。
2. Solana Adapter Program のビルド
このディレクトリは、Native OFT と OFT Adapter の両方の実装を含む Anchor workspace です。固有の Solana Program ID を生成するために、Rust program をビルドする必要があります。
ビルドが完了したら、次を実行して新しい Program ID を取得します。
デプロイ前に、新しい Program ID で Anchor.toml ファイルと programs/oft-adapter/src/lib.rs ファイル内の declare_id! マクロを更新する必要があります。
3. Solana Mainnet へのデプロイ
Solana CLI が Mainnet 用に構成されていること、およびローカルウォレットがデプロイサイズとストレージレントをカバーするのに十分な $SOL を保有していることを確認してください。
4. OFT Adapter の初期化
新しい Mint の作成を必要とする Native OFT とは異なり、Adapter の初期化は、新しくデプロイした Program ID を既存の SPL Token Mint Address にリンクするだけです。
LayerZero SDK は、この初期化をコマンドラインから処理するための Hardhat タスクを提供しています。Solana LayerZero Endpoint(30168)が構成されていることを確認してから、次を実行します。
ここには重要なパラメータがあります。
--mint: これは、bridge したい SPL トークンの正確な Base58 Mint Address でなければなりません。Adapter は、このトークン専用の escrow アカウントを作成します。--shared-decimals 6: これは、Adapter が EVM に送信する前にペイロードをどのようにスケールするかを規定します。Solana トークンが 9 桁の小数を持つ場合、ここで shared decimals を 6 のままにすることで、オーバーフローの問題なく bridge を安全に渡って変換されることが保証されます。
この初期化トランザクションが Solana 上で確認されると、Adapter は稼働状態になり、SPL トークンを安全にロックする準備が整います!
Chiliz Contract の開発
Solana SPL トークンは Chiliz Chain 上にはまだ存在しないため、標準的な Native OFT contract をデプロイする必要があります。この contract は minter として機能します。Solana Adapter から検証済みのメッセージを受け取ると、対応する ERC-20 トークンを mint します。ユーザーが Solana へ bridge して戻すと、それらを burn します。
「The Shared Decimals Challenge」で説明したとおり、Solana Adapter は送信前にペイロードを 6 桁の小数へとスケールダウンします。
LayerZero の EVM 実装は、カスタムのスケーリングロジックを記述する必要がないように作られています。デフォルトでは、OFT.sol contract は 18 桁のローカル小数と 6 桁の shared decimals を使用します。Solana から到着する 6 桁の小数のペイロードを自動的に検出し、ERC-20 トークンをユーザーのウォレットに mint する前に、標準的な 18 桁の小数形式()へとスケールアップします。
Chiliz Chain への OFT のデプロイ
Hardhat プロジェクトの contracts/ フォルダーに ChilizNativeOFT.sol という名前の新しいファイルを作成します。
まだデプロイしないでください! ただし、以下の点を念頭に置いてください。
ユーザーに統一された体験を提供するため、
_nameと_symbolのパラメータが元の Solana SPL トークンと正確に一致していることを確認してください。Chiliz Mainnet にデプロイする際は、
_lzEndpointとして Chiliz Endpoint V2 アドレス(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B)を渡します。
ステップ 2: LayerZero の構成
Solana Adapter が初期化され、Chiliz Native OFT がデプロイの準備ができたので、両者間の接続を構成する必要があります。
ここでの主な課題はアドレスのフォーマットです。LayerZero のクロスチェーンメッセージングでは、すべての peer アドレスを bytes32 としてフォーマットする必要があります。LayerZero V2 Hardhat ツールボックスは、Base58 の Solana Adapter Program ID をデコードし、標準的な EVM 形式にパディングすることで、これを自動的に処理します。
Simple Config Generator は、双方向の配線を自動化し、推奨されるセキュリティ構成を内部で適用するため、配線構成を生成する推奨方法です。
Hardhat プロジェクトのルートに layerzero.config.ts ファイルを作成または更新します。
このジェネレーターは、Solana Base58 アドレスを Chiliz smart contract が必要とする EVM bytes32 パディングへと自動的に変換する処理を扱います。
ステップ 3: デプロイのワークフロー
この段階で、Solana Adapter はすでにコンパイル、デプロイ、初期化されています(ステップ 1 で扱ったとおり)。次に、bridge の EVM 側、つまり Native OFT を Chiliz Chain にデプロイする必要があります。
Hardhat を使用して、この contract を Chiliz Mainnet にプッシュします。
1. Chiliz Native OFT デプロイスクリプト
Hardhat プロジェクトの deploy/ ディレクトリに、01_deploy_chiliz_native_oft.ts という名前のデプロイスクリプトを作成します。このスクリプトは、Chiliz 上で新しい ERC-20 トークンを初期化します。
2. Solana Program のデプロイ
簡単な確認として、Solana Adapter は初回デプロイに Hardhat を使用しません。以下をすでに完了しているはずです。
anchor buildとanchor deployを実行して、Rust program を Solana Mainnet にプッシュした。lz:oft-adapter-solana:initタスクを実行して、Adapter を既存の SPL Token Mint にリンクした。得られた Base58 Program ID を
layerzero.config.tsファイルにコピーした。
3. Chiliz デプロイの実行
hardhat.config.ts ファイルに、chiliz ネットワーク用の RPC URL と private key が正しく構成されていることを確認してください。
Native OFT をデプロイするには、ターミナルで次のコマンドを実行します。
デプロイが完了すると、Hardhat は新しく mint された Chiliz contract アドレスを deployments/ フォルダーに保存します。これで Solana(SVM)と Chiliz Chain(EVM)の両方にライブ contract が揃いましたが、両者はまだ互いに通信する権限を持っていません。
ステップ 4: 配線とピアリング
この時点で、Solana 上に Rust Adapter Program が、Chiliz Chain 上に Native EVM OFT があります。両者が安全に通信できるようにするには、信頼できる peer として両者を「配線」する必要があります。
逆方向の bridge と同様に、私たちは 2 つのまったく異なる Virtual Machine(SVM と EVM)を扱っています。このため、Enforced Options(Gas Limit)を正しく構成することが、トランザクションが宛先チェーンで停止しないようにするうえで重要です。
Chiliz(EVM)用の「Enforced Options」
ユーザーが SPL トークンを Solana から Chiliz へ bridge すると、LayerZero Executor は、ERC-20 トークンを mint するために Chiliz contract 上の lzReceive 関数を呼び出す EVM gas を必要とします。
逆に、戻りの行程(Chiliz から Solana へ戻る)では、Executor は SPL トークンをアンロックし、場合によっては Associated Token Account(ATA)のレントを支払うために、Solana Compute Units と Lamports を必要とします。
構成の更新
Executor が両方向に十分な gas を持つことを保証するため、配線の前に layerzero.config.ts ファイルにこれらの上限を定義する必要があります。
config ファイル内の connections 配列を更新して、以下の enforcedOptions を含めます。
Wire タスクの実行
構成が保存されると、LayerZero V2 ツールボックスがピアリングのプロセスを自動化します。Base58 の Solana アドレスをデコードし、必要な bytes32 EVM 形式にパディングして、構成トランザクションを Solana Mainnet と Chiliz Mainnet の両方に送信します。
ターミナルで次のコマンドを実行します。
CLI はトランザクションの確認を求めてきます。構成済みの Solana ウォレットを使用してソーストランザクションを送信し($SOL の費用がかかります)、Hardhat を使用して Chiliz 宛先トランザクションを送信します($CHZ の費用がかかります)。
Chiliz 側では、LayerZero Hardhat ツールボックスが、必要な 6 つの構成トランザクションを自動的に生成して実行します。
setSendLibrary: メッセージ送信用の V2 MessageLib を割り当てます。setReceiveLibrary: メッセージ受信用の MessageLib を割り当てます。setConfig(Send Library): DVN と Executor を構成します。setConfig(Receive Library): インバウンド検証用の DVN を構成します。setEnforcedOptions: 一貫した実行パラメータを保証します(特に、戻りの行程に十分な Solana Compute Units が支払われるようにします)。setPeer: Chiliz EID を Solana Adapter の Base58 Program ID(bytes32に変換されたもの)に暗号的にリンクします。
Solana SDK は、SVM 側の同等のプログラム的命令を内部で処理します。
両方のトランザクションが確認されると、Solana から Chiliz への bridge が正式に稼働し、安全に権限付与された状態になります!
ステップ 5: 運用とテスト
Solana Adapter がデプロイされ、Chiliz Native OFT が初期化され、両者が適切に配線されたことで、SPL Token は正式に SVM/EVM の境界を越える準備が整いました。最後のステップは、Solana から Chiliz Chain へのテスト転送を実行して追跡することです。
1) Solana ウォレットの準備
Adapter にアローワンスを付与するために、事前に個別の approve() トランザクションを実行する必要がある EVM とは異なり、Solana はトークンのアプルーバルと転送を同じトランザクション命令内で処理します。
ただし、ローカルの Solana ウォレット(プロジェクトで構成されているもの)が、bridge しようとしている SPL トークンの残高を実際に保有していること、およびソーストランザクション手数料と LayerZero クロスチェーンメッセージ手数料を支払うのに十分な $SOL を保有していることを確認する必要があります。
2) Chiliz へのクロスチェーンメッセージの送信
LayerZero V2 ツールボックスには、ソースチェーンが Solana の場合でも、コマンドラインから直接 OFT 転送を送信するための Hardhat タスクが含まれています。
Solana 間の転送とは異なり、ここでの宛先は標準的な EVM の 16 進数ウォレットアドレス(例: 0x123...)です。LayerZero CLI は、ペイロードのパディングとバイト変換を自動的に処理します。
ターミナルで次のコマンドを実行します。
ここで何が起こるのでしょうか?
スクリプトがクロスチェーン手数料を
$SOLで見積もります。ウォレットから 10 SPL トークンを Solana Adapter の escrow アカウントへ転送するトランザクションを構築します。
Adapter が 9 桁の小数の SPL トークン金額を 6 桁の shared decimals へとスケールダウンします。
LayerZero Endpoint が Chiliz Mainnet に向けてパケットを発行します。
3) LayerZero Scan でのパケットの追跡
Solana からの bridge は、2 つのまったく異なるコンセンサスメカニズム間の変換と、EVM 上で実行する前に SVM 上でトランザクションをファイナライズすることを伴うため、非同期の遅延が発生するのは正常です。
このジャーニーをリアルタイムで追跡するには、CLI 出力に表示される LayerZero Scan リンクをクリックします。
このツールの詳細はこちらをご覧ください。
Chiliz Native OFT は、6 桁の小数のペイロードを EVM 標準の 18 桁の小数へと自動的にスケールアップしているため、ちょうど 10 個の完全なトークンを受け取ります。
4) 停止したメッセージのトラブルシューティング
トランザクションが Solana 上で確認済みとマークされたものの Chiliz 上での実行に失敗する場合、最もよくある原因は EVM の Out-of-Gas エラーです。
enforcedOptions(ステップ 5 で構成)内のgasパラメータが、Chiliz ネットワークがlzReceiveの mint 関数を処理するには低く設定されすぎていた場合、LayerZero Executor はメッセージの配信に失敗します。修正: トークンを失うことはありません。停止したメッセージは、LayerZero Scan UI 経由で手動でプッシュできます。EVM ウォレットを Chiliz Chain に接続し、block explorer 上の「Force Resume」または「Execute」ボタンをクリックして、自分で Chiliz gas fee を支払って mint を完了させるだけです。
最終更新
役に立ちましたか?