名称: 超通道消息自中继 描述: 使用Hyperlane CLI在以太坊协议类型的链之间手动交付(自中继)消息。
超通道消息自中继
使用CLI的status --relay命令手动交付超通道消息。
输入参数
| 参数 | 是否必需 | 默认值 | 描述 |
|---|---|---|---|
origin_chain |
否 | 从Explorer API派生 | 源链名称(如果未提供则自动派生) |
dispatch_tx |
否* | - | 发送交易哈希(消息发送时的交易) |
message_id |
否* | - | 超通道消息ID(dispatch_tx的替代) |
registry_path |
否 | CLI默认值 | 本地注册表路径(如果private_rpcs为true则覆盖) |
key |
否 | $(HYPERLANE_MONOREPO=$(git rev-parse --show-toplevel) hypkey) |
用于签名中继交易的私钥 |
private_rpcs |
否 | true |
如果为true,通过本地http-registry使用私有RPCs |
* 必须提供dispatch_tx或message_id中的一个,但不能同时提供。
说明
步骤0: 查找Monorepo根目录
工作目录可能不是monorepo根目录。通过查找CLAUDE.md或具有"name": "hyperlane-monorepo"的package.json来找到它:
git rev-parse --show-toplevel
将此路径存储为MONOREPO_ROOT。所有后续命令必须以cd $MONOREPO_ROOT &&为前缀以确保正确执行。
步骤1: 验证输入
验证dispatch_tx / message_id:
- 如果既未提供
dispatch_tx也未提供message_id→ 错误: “必须提供dispatch_tx或message_id” - 如果同时提供了
dispatch_tx和message_id→ 错误: “请只提供dispatch_tx或message_id中的一个,不要同时提供”
步骤2: 启动私有RPC注册表(如果需要)
如果private_rpcs为true:
- 强制覆盖
registry_path为http://localhost:3333 - 启动http-registry通过/start-http-registry
步骤3: 查询Explorer API以获取缺失数据
查询Hyperlane Explorer GraphQL API以解析任何缺失的值(dispatch_tx、origin_chain)。
如果提供了message_id:
query {
message_view(
where: { msg_id: { _eq: "\\x<message_id_without_0x>" } }
limit: 1
) {
origin_tx_hash
origin_domain
is_delivered
}
}
如果提供了dispatch_tx但origin_chain缺失:
query {
message_view(
where: { origin_tx_hash: { _eq: "\\x<dispatch_tx_without_0x>" } }
limit: 1
) {
origin_domain
is_delivered
}
}
使用mcp__hyperlane-explorer__query-graphql工具。注意:bytea字段使用\\x前缀而不带0x。
提取值:
origin_tx_hash→ 将\\x...转换为0x...格式 → 设置为dispatch_txorigin_domain→ 设置为origin_chain(例如,“ethereum”, “citrea”)is_delivered→ 如果为true,通知用户消息已交付(无需中继)
如果未找到消息: 错误 “在Hyperlane Explorer中未找到消息”
步骤4: 确定密钥值
- 如果提供了
key,直接使用该值 - 如果未提供
key,使用默认值:$(HYPERLANE_MONOREPO=$(git rev-parse --show-toplevel) hypkey) - 重要: 默认密钥值是一个命令替换。不要直接执行
hypkey。仅在运行中继命令时将其用作环境变量值。
步骤5: 运行自中继命令
运行以下命令(如果设置了registry_path,则附加--registry <registry_path>):
cd $MONOREPO_ROOT && \
LOG_FORMAT=pretty LOG_LEVEL=debug HYP_KEY="<key>" \
pnpm -C typescript/cli hyperlane status --relay --origin <origin_chain> --dispatchTx <dispatch_tx>
步骤6: 清理
如果private_rpcs为true:
- 终止http-registry使用步骤2中保存的shell/task ID
- 确认清理成功
步骤7: 报告结果
向用户展示输出,包括:
- 中继是否成功
- 遇到的任何错误
- 如果成功,目标交易哈希
示例
示例1: 使用dispatch_tx
cd $MONOREPO_ROOT && \
LOG_FORMAT=pretty LOG_LEVEL=debug HYP_KEY="$(HYPERLANE_MONOREPO=$(git rev-parse --show-toplevel) hypkey)" \
pnpm -C typescript/cli hyperlane status --relay --origin ethereum --dispatchTx 0xabc123...
示例2: 仅使用message_id(origin_chain自动派生)
- 查找monorepo根目录:
MONOREPO_ROOT=$(git rev-parse --show-toplevel) - 通过/start-http-registry在后台启动http-registry
- 查询GraphQL以获取消息
0xdef456...→ 获取origin_tx_hash和origin_domain - 检查
is_delivered- 如果已交付,通知用户并跳过中继 - 运行:
cd $MONOREPO_ROOT && \ LOG_FORMAT=pretty LOG_LEVEL=debug HYP_KEY="$(HYPERLANE_MONOREPO=$(git rev-parse --show-toplevel) hypkey)" \ pnpm -C typescript/cli hyperlane status --relay --origin <origin_domain> --dispatchTx <origin_tx_hash> --registry http://localhost:3333 - 终止http-registry进程