Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
网络与协议指南阅读约 11 分钟

中继链路桥:跨链中继如何运作以及如何验证

一份关于中继链路桥模型的实用指南:中继者如何传输并证明跨链消息、如何端到端追踪一笔桥接交易,以及如何测量保障中继可靠性的 RPC 层。

TL;DR

中继链路桥并非单一合约;它是一条流水线:链下中继者观察源链事件、打包证据,并提交给目标链验证者,由验证者判定该操作是否有效。中继者提供传输与活性,验证者提供安全性。本文解释这一分工,展示如何通过可运行的 RPC 调用在两条链上追踪一笔桥接交易,并说明如何测量中继者和集成方所依赖的 RPC 层。它将有文档记载的桥接行为与你必须针对自己的端点自行运行的测量区分开来。

中继链路桥究竟是什么

“中继链路桥”一词描述这样一种跨链系统:中继者将消息、证明或证词从源链移动到目标链,目标链上的验证者判定该证据是否可接受。中继者是传输层;验证者是信任层。混淆二者是关于桥接安全性的错误假设最常见的来源。

区块链非常擅长就自身状态达成一致,却不擅长自行获知另一条链的事实。即使目标合约能够检查外部区块头或签名集,也必须有人获取该区块头、组装载荷并支付 gas 将其提交。这个人就是中继者。如果没有中继者出现,桥可能仍然安全但不再有用,因为即使安全性在链上,活性也存在于链下。

本文涵盖通用的中继链路桥模型,而非为特定产品背书。Relay、Wormhole、LayerZero 以及基于 IBC 的系统等具名桥以不同方式实现该模型,你应阅读各协议自身的文档以了解其确切的信任假设。下文是一个心智模型、一套诊断流程,以及一种可应用于其中任何一种的测量方法。

  • 中继者:观察源链事件、打包证据、提交目标链交易。
  • 验证者:轻客户端、验证者集合、守护者委员会或预言机,负责判定有效性。
  • 执行者或求解者:在基于意图的设计中,先行垫付流动性,并在验证后获得偿还。
  • 面向用户的应用:构建源交易的“链接”或网页界面。

追踪转账前的假设与前提条件

要端到端追踪一笔桥接交易,你需要对源链和目标链的读取权限、源交易哈希,以及两侧的桥接合约地址。追踪不需要有资金的 wallet,但每条链都需要一个可靠的 RPC 端点。公共端点适合一次性查询;对于重复诊断或中继者监控,请使用托管服务商。OnFinality 的多链 RPC 端点指南说明了如何跨多个网络组织端点访问,网络目录列出了可用的链。

开始前记录四项事实:源链 ID、目标链 ID、源交易哈希,以及目标链上的桥接合约地址。没有目标合约地址,你无法高效过滤日志;没有两条链的 ID,你无法确认中继者提交到了你预期的链。

中继流水线:观察、打包、提交、验证

每个中继链路桥都遵循相同的四阶段流水线,即使实现细节有所不同。

观察。中继者监视源链日志中桥接合约发出的事件,例如存款、锁定或消息发送事件。它必须跟踪最终性:后来因重组而被移除的存款不得被中继。这就是中继者要等待因链而异的确认深度的原因。

打包。中继者组装目标验证者所需的证据。在轻客户端桥中,这是区块头加 Merkle 证明。在证词桥中,这是一组来自守护者或验证者委员会的签名。在基于预言机的设计中,它可能是由独立网络生成的价格或状态证词。

提交。中继者发送携带载荷的目标链交易并为其支付 gas。有些设计允许任何人提交并奖励提交者;另一些则将提交限制在允许列表中。

验证并执行。目标合约根据其存储的状态检查证据,然后铸造、解锁或执行消息。只有这一步决定有效性。中继者的意见从不决定。

  • 安全边界:验证者合约及其信任假设。
  • 活性边界:中继者集合及其激励。
  • 最终性边界:中继者在源链上等待的确认深度。

使用 RPC 调用追踪桥接转账

理解中继链路桥最快的方法是观察一笔交易穿过它。首先读取源交易收据并提取桥接事件。以下 curl 调用使用占位端点;请将源链的 RPC_URL 替换为你自己的。

  • 在信任任何日志之前,检查 status 为 0x1。
  • 记下 blockNumber;你将需要它来确认最终性深度。
  • 在日志发出者中识别桥接合约地址。
  • 解码第一个 topic,以确认它与桥接文档记载的事件签名匹配。
curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_getTransactionReceipt",
    "params": ["0xSOURCE_TX_HASH"]
  }'

查找匹配的目标交易

获得源事件后,在目标链上搜索中继者的提交。最可靠的方法是按桥接合约地址和源链上发出的消息标识符过滤目标日志。以下 JavaScript 使用标准 JSON-RPC 客户端和占位值。

  • 如果日志范围很大,使用源交易时间戳缩小 fromBlock。
  • 如果没有日志出现,中继者可能尚未提交,或者事件签名可能不同。
  • 在得出成功结论之前,用收据确认目标交易状态。
import { createPublicClient, http, parseAbiItem } from 'viem';

const dest = createPublicClient({ transport: http(process.env.DEST_RPC_URL) });
const event = parseAbiItem(
  'event MessageReceived(bytes32 indexed messageId, address indexed recipient)'
);

const logs = await dest.getLogs({
  address: '0xDESTINATION_BRIDGE_CONTRACT',
  event,
  args: { messageId: '0xSOURCE_MESSAGE_ID' },
  fromBlock: 0n,
  toBlock: 'latest'
});

for (const log of logs) {
  console.log(log.transactionHash, log.blockNumber);
}

预期的验证结果及其证明内容

一次成功的追踪会得到:状态为 0x1 的源收据、包含消息标识符的解码源事件,以及状态为 0x1 且日志包含相同标识符的目标收据。这条证据链证明中继者传输了消息,且目标验证者接受了它。它并不证明桥是无信任的;这取决于验证者检查了什么。

记录两个区块的时间戳及其差值。该差值就是本次转账观察到的中继延迟,也是你应与桥接文档预期进行比较的数字。不要从单笔交易进行概括;在得出结论前先收集样本。

  • 源状态 0x1 且目标状态 0x1。
  • 两侧消息标识符匹配。
  • 目标区块时间戳减去源区块时间戳等于观察到的延迟。
  • 从目标合约的文档设计识别验证者类型。

测量中继者所依赖的 RPC 层

中继者是 RPC 密集型客户端:它们持续轮询日志、读取区块头并提交交易。如果你自己的集成或监控依赖于中继链路桥,请测量你使用的 RPC 端点,而不是假定服务商的营销宣传。以下流程会生成一张由你自己填写的结果表;此处不提供数字,因为它们取决于你的地区、链和端点。

对于每个候选端点,在固定时间窗口内运行固定数量的请求,并将指标记录到表中。对每个端点使用相同方法,以确保比较公平。

  • | 端点 | 链 | p50 延迟(毫秒) | p95 延迟(毫秒) | 错误率 | 最大区块滞后 |
  • | RPC_URL_A | 源链 | 测量 | 测量 | 测量 | 测量 |
  • | RPC_URL_B | 目标链 | 测量 | 测量 | 测量 | 测量 |
  • 区块滞后:将 eth_blockNumber 与参考节点或浏览器高度进行比较。
  • 对每个端点在一天中的同一时间运行测试,以减少昼夜偏差。
import time, statistics, requests

RPC_URL = "https://your-endpoint.example"
N = 50
latencies = []
errors = 0

for _ in range(N):
    start = time.perf_counter()
    try:
        r = requests.post(RPC_URL, json={
            "jsonrpc": "2.0", "id": 1,
            "method": "eth_blockNumber", "params": []
        }, timeout=5)
        r.raise_for_status()
        r.json()["result"]
    except Exception:
        errors += 1
    latencies.append((time.perf_counter() - start) * 1000)

latencies.sort()
print("p50_ms", statistics.median(latencies))
print("p95_ms", latencies[int(len(latencies) * 0.95) - 1])
print("error_rate", errors / N)

排查停滞或不匹配的中继

大多数中继问题都属于少数几类。按顺序逐一排查,而不是猜测。

没有目标交易。中继者可能仍在等待源链最终性、可能 gas 资金不足,或可能丢弃了消息。首先对照桥接文档要求检查源确认深度。

目标交易回滚。如果合约暴露了回滚原因,请读取它。常见原因包括消息截止时间已过、重放防护拒绝重复消息,或验证者拒绝与其存储状态不匹配的证据。

消息标识符不匹配。如果目标日志存在但标识符不同,你可能解码了错误的事件,或查看的是不同的桥接路由。对照协议文档确认合约地址和事件签名。

RPC 不一致。如果一个端点报告了源事件而另一个没有,你很可能读取的是滞后的节点。比较区块高度,并在滞后端点追上后重新查询。

  • 在假定中继者故障之前,确认源链最终性深度。
  • 如果设计使用无需许可的提交,检查中继者 gas 余额。
  • 确认你在每条链上查询的是正确的桥接合约。
  • 针对第二个端点重新运行日志查询,以排除节点滞后。

中继模型的局限与权衡

中继链路桥以一定的去中心化换取速度和成本。链下中继者可以在数秒内响应,但它们增加了活性依赖,并且在证词设计中增加了对签名委员会的信任依赖。轻客户端桥减少了信任,但增加了目标链 gas 成本,因为验证在链上进行。

最终性假设与密码学同样重要。在源链最终性之前提交的中继者,面临中继一笔后来在重组中消失的交易的风险。等待太久的中继者安全但缓慢。每个桥都在该曲线上选择一个点,集成方应知道自己的桥位于何处。

最后,面向用户的“链接”不是协议。网页界面可能不可用,而底层合约和中继者继续运作,反之亦然。应在合约和中继者层面诊断,而不是在界面层面。

集成方和运营者的后续步骤

如果你要将中继链路桥集成到 wallet 或支付流程中,首先记录你支持的每条路由的验证者类型和最终性要求。然后构建一个监控器,使用上述流程将源事件追踪到目标收据,并在观察到的延迟超过阈值时告警。

对于 RPC 层,对你的故障转移集合中的每个端点运行测量流程,并保持结果表为最新。如果你需要为中继基础设施提供专用吞吐量,请在做出承诺前查看专用节点选项和 RPC 定价。关于每个网络的具体端点和服务商建议,RPC Assistant 直接涵盖这些内容;本页专注于中继机制和测量方法。你还可以查看 API 服务概览,了解托管访问如何与你自己的中继者技术栈配合。

  • 记录每条路由的验证者类型和最终性深度。
  • 构建带延迟告警的源到目标追踪监控器。
  • 为每个故障转移端点维护最新的 RPC 结果表。
  • 在任何桥接合约升级或中继者集合变更后重新测试。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始