For the complete documentation index, see llms.txt. This page is also available as Markdown.

Chiliz Chain から Solana へ bridge する

LayerZero v2 を使って Chiliz Chain 上に OFT Adapter を、Solana 上に Native OFT をデプロイし、Chiliz Chain から Solana ネットワークへトークンを bridge します。

既存のトークンを Chiliz Chain から Solana へ bridge するには、2 つの別々の smart contract を記述して deploy する必要があります。トークンがすでに存在するチェーン(Chiliz Chain)上の OFT Adapter と、宛先チェーン(Solana)上の Native OFT です。

なお、LayerZero は OFT contract 用の独自の QuickStart を提供しています:

前提条件

Chiliz Chain(EVM)から Solana(非 EVM)への bridge には、デュアルスタック開発が必要です。 両方のエコシステム向けに環境とウォレットをセットアップする必要があります。

そのため、以下の環境が必要になります:

このガイドには以下が必要です:

  • Chiliz Chain 上のトークン contract アドレス。所有している必要はありません。

  • 各チェーン用の Web3 ウォレット(MetaMask は非 EVM チェーンをサポートしていません):

  • 各チェーン上で、contract の deploy 費用とメッセージ送信の gas 手数料を支払うのに十分な gas トークン。

    • Chiliz Chain 上: CHZ トークン。

    • Solana 上: SOL トークン。

ステップ 1: Contract の開発

「Shared Decimals」の課題

Solana は Ethereum Virtual Machine(EVM)とは異なる方法でトークンの計算を扱うため、decimals を正しく処理する必要があります:

  • Chiliz Chain(EVM): 標準的な ERC-20 トークンは通常 18 decimals の精度を持ちます。

  • Solana: ネイティブな SPL Token は通常 9 decimals の精度を持ちます。

単位を Chiliz から Solana へ送信すると、Solana の contract は数量を誤って解釈し、宛先チェーン上でトークンが大幅にインフレする結果となります。

計算を正規化するため、LayerZero は sharedDecimals 設定を使用します。デフォルトでは、LayerZero V2 OFT 標準は sharedDecimals を 6 に設定します。

  • ユーザーが Chiliz から 1.00 トークンを bridge すると、Adapter は最下位の 12 decimals(「dust」として扱う)を切り捨て、数値を 6 decimals に縮小します。

  • メッセージが bridge を越えて送信されます。

  • Solana プログラムは 6 decimals の数値を受け取り、mint する前にローカルの 9 decimals まで_拡大_します。

詳しくはこちら

Chiliz Chain 上の OFTAdapter の準備

OFTAdapter contract は、既存のトークンのための保管庫(lockbox)として機能します。ユーザーが Chiliz Chain からトークンを bridge して移動させると、この contract が元の ERC20 トークンをロックします。

LayerZero の OFTAdapter はデフォルトで sharedDecimals を 6 に設定するため、標準の実装を使用できます。これを変更する必要がある場合(例: 8 に)、sharedDecimals() 関数をオーバーライドします。

contracts フォルダに ChilizTokenAdapter.sol という名前の新しいファイルを作成します:

ご覧のとおり、この contract は LayerZero OFT Adapter contract を継承しており、管理キーを付与するための標準的な Ownable.sol contract も継承しています。あなた、そしてあなただけが安全にチェーン同士を接続(wire)できるようにするため、両方が必要です。

Solana 上の OFT の準備と deploy

Chiliz Chain とは異なり、Solana は Ethereum Virtual Machine(EVM)や Solidity 言語を使用しません。Solana の smart contract(「Programs」と呼ばれます)は Rust で記述されます。

トークンを bridge するには、Solana 上に OFT プログラムを deploy する必要があります。このプログラムが Chiliz に deploy された OFTAdapter から検証済みメッセージを受け取ると、対応する SPL トークンをユーザーの Solana ウォレットに mint します。

LayerZero は、Rust の bridge ロジックを一から記述しなくて済むよう、すぐに使える Anchor の例 を提供しています。

1. LayerZero OFT Solana の例を clone する:

2. Rust プログラムをビルドする

これにより、固有の Solana Program ID(EVM における contract アドレスに相当)も生成されます:

ビルドが完了すると、Anchor は target/deploy/oft_solana-keypair.json に新しい keypair を生成します。 新しい Program ID は次のコマンドを実行すると取得できます:

3. Solana Mainnet に deploy する

Solana CLI が Mainnet 用に設定されており、ローカルウォレットに deploy とストレージレント用の $SOL が十分にあることを確認してください。 deploy 前に、Anchor.toml ファイルと lib.rs の declare_id! マクロを、この新しい Program ID で更新するのを忘れないでください。

4. OFT と SPL Mint を初期化する

Solana では、トークンのロジックとその台帳(ledger)が分離されています。新しい Mint Account(SPL Token)を初期化し、新たに deploy した OFT プログラムを Mint Authority として割り当てる必要があります。これにより、LayerZero bridge のみが Solana 上で新しいトークンを mint できるようになります。

LayerZero SDK は、この初期化をコマンドラインから直接処理するための Hardhat/TypeScript タスクを提供しています。oft-solana プロジェクトで、Solana 用の LayerZero Endpoint(30168)を設定し、初期化スクリプトを実行します:

重要なパラメータ:

  • --mint-decimals 9: Solana 上での標準的な SPL トークン精度を設定します。

  • --shared-decimals 6: Chiliz Chain の OFTAdapter で設定した shared decimals(またはデフォルト)と一致させる必要があります。これが 1 Chiliz トークン = 1 Solana トークンを保証するものです。

この初期化トランザクションが Solana ブロックチェーン上で確認されると、ネイティブ OFT プログラムは完全にセットアップされ、Chiliz OFTAdapter に接続(wire)する準備が整います!

ステップ 2: LayerZero の設定

Chiliz Adapter が deploy され、Solana OFT プログラムが初期化されたら、次にそれらの接続を設定する必要があります。ここで EVM ネットワークと非 EVM ネットワークの違いが非常にはっきりと現れます。

アドレスのフォーマット:

  • Chiliz Chain(EVM): 標準的な 20 バイトの 16 進数アドレスを使用します(例: 0x123...)。

  • Solana: Base58 エンコードのアドレスを使用します(例: YourProgramId111111111111111111111111111111)。

LayerZero のクロスチェーンメッセージングでは、すべての peer アドレスbytes32 としてフォーマットする必要があります。幸いなことに、設定でエンドポイントを正しく定義していれば、LayerZero V2 の Hardhat ツールが Base58 から Bytes32 への変換を自動的に処理してくれます。

Simple Config Generator は、wiring 設定を生成するための推奨される方法です。双方向の wiring を自動化し、内部で推奨されるセキュリティ設定を適用します。

Hardhat プロジェクトのルートに layerzero.config.ts ファイルを作成または更新します:

LayerZero の wire タスクはこれを読み取り、Base58 文字列をデコードし、32 バイトにパディングして、Chiliz OFTAdapter の setPeer 関数に安全に渡します。

ステップ 3: デプロイのワークフロー

contract を記述し、layerzero.config.ts を準備したら、Chiliz OFTAdapter を deploy する時です。ステップ 1 ですでに Anchor を使って Solana のネイティブ OFT プログラムをビルドして deploy しているため、このステップでは Hardhat を使って bridge の EVM 側を deploy することに焦点を当てます。

Chiliz OFTAdapter contract の deploy

Hardhat プロジェクトで、deploy/ ディレクトリに 01_deploy_chiliz_solana_adapter.ts という名前のデプロイスクリプトを作成します。このスクリプトは、既存のトークンアドレスと Chiliz Endpoint V2 アドレス(EID)を constructor に渡します。

Chiliz OFTAdapter の deploy

進める前に、以下を確認してください:

  • 生成された Base58 Program ID を layerzero.config.ts ファイルにコピーしたこと。

  • hardhat.config.ts に Chiliz Chain Mainnet 用の RPC URL と秘密鍵が正しく設定されていること。

EVM Adapter を deploy するには、ターミナルで次のコマンドを実行します:

deploy が完了すると、Hardhat は Chiliz contract アドレスを deployments/ フォルダに保存します。

この時点で、Chiliz Chain(EVM)と Solana(SVM)の両方にライブな contract がありますが、まだ互いを信頼していません。両者を引き合わせる時です!

ステップ 4: Wiring と Peering

OFTAdapter contract と OFT プログラムが通信できるようにするには、両者を信頼できる peer として「wire」する必要があります。

私たちはまったく異なる 2 つの仮想マシン(EVM と SVM)をまたいで bridge しているため、設定には特別な注意が必要です。

EVM の gas と Solana の compute units

ユーザーが Chiliz Chain から別の EVM チェーン(Base など)へトークンを bridge する場合、LayerZero Executor は lzReceive を呼び出すために EVM gas を必要とします。

しかし、Chiliz Chain から Solana へ bridge する場合、ターゲットチェーンは EVM gas を使用しません。Compute Units と Lamports($SOL の端数)を使用します。 さらに、ユーザーがあなたのトークをまだ保有していない Solana ウォレットへトークンを bridge する場合、Executor はそのウォレット用に Associated Token Account(ATA)を作成するために Solana の「rent exemption」手数料を支払う必要があります。これには宛先で実際の $SOL の価値を投入する必要があります。

Executor が Solana 上でトークンを mint し、ATA を作成するのに十分な Compute Units と Lamports を確実に持てるようにするため、wiring の_前に_これらの上限を layerzero.config.ts ファイルで定義する必要があります。

ターミナルで自動 wire コマンドを実行します:

これにより、必要な 6 つの設定トランザクションが準備されます:

  1. setSendLibrary: 送信パケット用の MessageLib を割り当てます。

  2. setReceiveLibrary: 受信パケット用の MessageLib を割り当てます。

  3. setConfig: DVN と Executor を設定します。

  4. setConfig : 受信検証用の DVN を設定します。

  5. setEnforcedOptions: 一貫した実行パラメータを保証します(ユーザーが Solana の Compute Units と Lamport レントを賄うのに十分な金額を前払いすることを保証するために重要です)。

  6. setPeer: Solana EID を宛先の Base58 Program ID にリンクします。

LayerZero V2 toolbox は面倒な作業を自動化します。Base58 の Solana アドレスをデコードし、必要な bytes32 の EVM フォーマットにパディングし、setPeersetEnforcedOptions トランザクションを両方のチェーンに送信します。

wiring トランザクションが確認されると、EVM から Solana への bridge がライブになり、安全に権限が付与されます。

あなたのトークンは、いよいよ EVM/SVM の壁を越える準備が整いました!

ステップ 5: 運用とテスト

Chiliz Adapter が deploy され、Solana Native OFT が初期化され、両者が適切に wire されたことで、あなたのトークンはいよいよ EVM/SVM の壁を越える準備が整いました。最後のステップは、Chiliz Chain から Solana へのテスト転送を実行して追跡することです。

1) Solana へのクロスチェーンメッセージの送信

LayerZero V2 toolbox には、OFT 転送をコマンドラインから直接送信するための Hardhat タスクが含まれています。

宛先が標準的な 16 進数文字列である EVM から EVM への転送とは異なり、ここでの宛先は Base58 の Solana ウォレットアドレスです。LayerZero CLI は、メッセージペイロードのために Base58 から Bytes32 への変換を自動的に処理します。

ターミナルで次のコマンドを実行します:

ここで何が起こるのか?

  1. スクリプトはクロスチェーン手数料を $CHZ で見積もります(EVM gas、verifier ネットワーク手数料、Solana 宛先手数料を賄います)。

  2. Chiliz Adapter の send() 関数を呼び出します。

  3. Adapter は 10 トークン(18 decimals)をロックします。最下位の 12 decimals を「dust」として切り捨て(Chiliz ウォレットに残します)、ペイロードを 6 sharedDecimals に縮小します。

  4. LayerZero Endpoint が Solana Mainnet に向けてパケットを発行します。

2) LayerZero Scan でのパケットの追跡

Solana への bridge では、まったく異なる 2 つのコンセンサスメカニズム間の変換と SVM のファイナリティの待機が伴うため、非同期的な遅延は正常です。

この過程をリアルタイムで追跡するには、CLI の出力に表示される LayerZero Scan リンクをクリックします。

このツールについて詳しくはこちら:

Decimal の変換

Solana Native OFT は、bridge から届いた 6 decimals のペイロードを自動的に標準の SPL 9 decimals まで拡大しているため、Solana ウォレットはちょうど 10 個のトークン全体を受け取ります。

4) 詰まったメッセージのトラブルシューティング

トランザクションが Chiliz 上で確認済みとマークされているのに Solana 上で実行に失敗する場合、最も一般的な原因は Lamports 不足、または Compute Units エラーです。

  • 宛先の Solana ウォレットがあなたの特定のトークン用の Associated Token Account(ATA)をまだ持っていなかった場合、LayerZero Executor はそれを作成するために Solana の「rent exemption」手数料を支払う必要がありました。

  • enforcedOptionsvalue パラメータ(Lamports)がこのレントを賄うには低すぎる設定だった場合、または gas(Compute Units)が不十分だった場合、Executor は自腹を切ることを拒否し、メッセージは停滞します。

  • 解決策: トークンが失われることはありません。詰まったメッセージは LayerZero Scan UI から手動で通すことができます。Solana ウォレットを接続し、ブロックエクスプローラー上で「Force Resume」または「Execute」ボタンをクリックし、ローカルの宛先手数料(Compute Units + $SOL での ATA レント)を自分で支払って mint を完了させます。

最終更新

役に立ちましたか?