axelar-gmp について
axelar-gmpは、Axelar GMPを使うHederaスマートコントラクト開発者向けの実装ガイドです。クロスチェーン通信と認可を扱い、ブリッジ転送と業務ロジックの分離、HSSとの連携を説明します。
主な機能
- 01Axelar GMPの送受信フロー
- 02Gateway呼び出し前のネイティブGas支払い
- 03送信元チェーンとアドレスの許可リスト検証
- 04転送層と業務ロジックの分離
- 05Hedera HSSスケジューリングとの連携
活用シーン
- 01Hederaコントラクト間のクロスチェーン通信の実装
- 02受信側での送信元チェーンとアドレスの検証
- 03HSSで定期実行するブリッジタスクの設計
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hedera-dev/ hedera-skills --skill axelar-gmpインストール後、Claude Code で/axelar-gmpを入力して読み込まれたか確認します。
同梱ファイルreferences/examples.mdreferences/hedera-axelar.md
詳細
Axelar GMP(Hedera)
GMP パターン: ソースチェーンでペイロードをエンコードし、ネイティブトークンで Axelar のガス代を支払い、Gateway を呼び出してから、許可リストに登録された送信元を確認したうえで、宛先でデコードして処理します。
Source app → BridgeSender (pay gas + gateway.callContract)
→ Axelar relayers
→ AxelarExecutable._execute → Handler
Hedera では、オーケストレーションで GMP と HSS(0x16b)を組み合わせ、コントラクトが自らスケジュールを再設定し、各サイクルでディスパッチできるようにすることがよくあります。ブリッジのトランスポートは薄い送信インターフェースの背後に置き、オーケストレーターがブリッジに依存しないようにします。
クイックリファレンス
| 要素 | 役割 |
|---|---|
IAxelarGateway | callContract(destChain, destAddress, payload) |
IAxelarGasService | Gateway 呼び出しの前に payNativeGasForContractCall{value} を呼び出します |
AxelarExecutable | 宛先側のベース。_execute(...) をオーバーライドします |
| チェーン名 | Axelar の文字列 ID — 例:"hedera"、"ethereum-sepolia"(数値のチェーン ID ではありません) |
| アドレス | 相手側コントラクトの EVM 形式の文字列(チェックサム付きの 0x…) |
チェーン名の規則と SDK のインポートについては、references/hedera-axelar.md を参照してください。送信側/受信側のスケッチについては、references/examples.md を参照してください。
重要:先にガス代を支払い、その後に Gateway を呼び出す
必ず callContract の前にガス代を支払います。リレーフィーには msg.value > 0 を使用してください。返金先アドレスは、資金を供給したオーケストレーター(またはプラン所有者)にしてください。無関係な EOA を指定してはいけません。
gasService.payNativeGasForContractCall{ value: msg.value }(
address(this), // sender contract
destinationChain, // Axelar name string
destinationAddress, // receiver 0x… as string
payload,
refundAddress // usually authorizedCaller / orchestrator
);
gateway.callContract(destinationChain, destinationAddress, payload);
重要:呼び出し元を承認し、許可リストを設定する
| 側 | ガード |
|---|---|
| ソース側の送信者 | authorizedCaller(オーケストレーター)のみが send を実行できます |
| 宛先側の受信者 | 処理の前に srcChain と srcAddress を検証します(大文字と小文字を区別しません) |
| 宛先側のハンドラー | ビジネスロジックを呼び出せるのは受信者のみです(authorizedCaller) |
Axelar のチェーン名/アドレス文字列は、共有の小文字化ハッシュで比較してください。Axelar では大文字と小文字の表記が異なる場合があります。
require(
keccak256(bytes(_toLower(srcChain))) == keccak256(bytes(_toLower(expectedSourceChain))),
"invalid source chain"
);
require(
keccak256(bytes(_toLower(srcAddress))) == keccak256(bytes(_toLower(expectedSourceAddress))),
"invalid source address"
);
アーキテクチャ:トランスポートとビジネスロジックを分離する
Source chain Destination chain
───────────────────────────── ─────────────────────────────
Orchestrator ──send──► MessageReceiver (_execute)
│ BridgeSender iface │ Handler iface
BridgeSender Handler (swap / settle / …)
- ハンドラーを先にデプロイします(ブリッジに関する知識は不要です)。
- Gateway、想定される送信元、ハンドラーを指定して受信者をデプロイします。
- Gateway、ガスサービス、宛先チェーン/アドレスを指定して送信者をデプロイします。
- 送信者アドレスを指定してオーケストレーターをデプロイし、送信者側でオーケストレーターを承認します。
- 両方のデプロイ後に接続します。送信者に宛先を設定し、受信者に想定される送信元を設定します。
- オーケストレーターに資金(Axelar のガス代用のネイティブトークン)を、ハンドラーに資金(宛先での処理用のトークン/資本)を供給します。
ペイロードの仕様
両側で同じ ABI エンコード/デコードを使用するようにしてください。フィールドを変更する場合は、ペイロードをバージョン管理できるようにします。デコードが一致しないと、ルートが機能しなくなります。
bytes memory payload = abi.encode(/* agreed fields… */);
// receiver:
(/* fields… */) = abi.decode(payload, (/* matching types… */));
Hedera のオーケストレーションフック(HSS)
ソースアプリが HSS(0x16b)を使って自らをスケジュールする場合、各サイクルで次の処理を行います。
- インターバルとプランの有効状態を確認します
- Axelar のガス代分のネイティブトークンを添えて、ブリッジ送信者を呼び出します
hasScheduleCapacityとscheduleCallを使って次の期限を再スケジュールします(SUCCESS =22)
スケジュールに失敗した場合は、復旧フラグを設定し、プラン所有者が手動で再スケジュールできるようにします。
チェックリスト
-
callContractの前にネイティブトークンでガス代を支払う - 宛先チェーン名が Axelar の ID と一致している(数値のチェーン ID ではなく文字列)
- 両方のコントラクトをデプロイした後に相手側のアドレスを設定する(接続手順)
- 両側でソースの許可リストと呼び出し元の承認を設定する
- ペイロードのエンコード/デコードが一致している
- オーケストレーターにリレーガス用の資金があり、宛先のハンドラーに処理用の資金がある
- デモと本番環境で、宛先の収益の所有者を明確にする
参考資料
- references/examples.md — 送信側/受信側/許可リストのスケッチ
- references/hedera-axelar.md — チェーン名と ID の違い、SDK のインポート
- Axelar GMP の概要
- axelar-gmp-sdk-solidity