连接区块链意味着让两个独立的账本对某一事实达成一致:资产已转移、消息已送达或价格已被观测。一条链无法原生读取另一条链的状态,因此每个连接都依赖于一个外部方或协议来观测一条链并向另一条链作证。本文解释了主要的连接模式,展示了如何用可运行的代码验证跨链转账,并涵盖了在信任跨链桥或消息层之前应衡量的故障模式和权衡。
连接区块链实际需要什么
区块链是一个封闭的状态机。验证者只执行引用该链已知状态的交易,因此一个网络上的合约无法原生读取另一个网络上的余额、事件或存储槽。连接区块链就是弥合这一差距的实践:外部系统观测源链,生成证明,目标链根据该证明采取行动。
该外部系统就是信任边界。无论它被称为跨链桥、跨链消息协议、预言机网络还是轻客户端中继,连接的安全性取决于谁能生成有效证明以及目标链如何验证它。因此,理解连接区块链与其说是关于“桥”这个词,不如说是关于验证模型。
本指南涵盖了常见的连接模式、一种可复现的验证跨链转账的方法以及需要衡量的权衡。关于每个网络的端点选择,配套的 RPC Assistant 答案在文末链接,而非在此重复。
假设与前提条件
以下流程假设您至少拥有两个网络的 RPC 访问权限、一种读取交易收据的方法,以及对事件和日志的基本理解。运行只读验证步骤不需要有资金的 wallet;只有在您打算发起转账时才需要。
保持占位符原样。将 RPC_URL_SOURCE 和 RPC_URL_DEST 替换为您控制的端点,切勿将真实私钥粘贴到共享脚本中。如果您正在选择提供商,请先阅读多链 RPC 端点指南和RPC 端点指南。
- 您要连接的两条链的源和目标 RPC URL
- 两条链上的跨链桥或消息合约地址
- 源链存款或消息发送的交易哈希
- 每条链的区块浏览器以交叉核对日志
连接不同区块链网络的四种主要模式
大多数生产环境中的连接都属于四种模式之一。它们的区别在于转移的内容以及由谁作证。
锁定铸造 / 销毁释放跨链桥。 资产被锁定在源链的合约中,并在目标链上铸造包装表示。反向流程则销毁包装资产并释放原始资产。跨链桥托管人或验证者集控制铸造,因此连接的安全性仅取决于该集合。
跨链消息层。 这些协议不转移资产,而是传递任意负载。源合约发出消息,链下委员会或轻客户端为其作证,目标合约执行负载。代币转移成为消息层之上的一个应用。
用于外部和跨链数据的预言机。 预言机网络观测数据(包括其他链的状态),并将经过证明的值写入链上。它们常用于价格馈送以及根据其他地方的事件触发合约逻辑。
轻客户端和 Rollup 原生连接。 目标链直接验证源链共识,例如 Rollup 向父链证明其状态。这是最强的验证模型,但成本高昂且特定于链。
心智模型:观测、证明、验证、执行
每个连接都可以分解为四个阶段。首先,观察者读取源链并等待最终性。其次,证明者对关于该状态的陈述进行签名或证明。第三,目标链根据已知权威或共识规则验证证明。第四,目标合约执行效果。
当跨链转账似乎卡住时,确定哪个阶段失败。目标交易缺失通常意味着观察者尚未达到最终性或证明者尚未签名。目标交易回滚通常意味着验证失败或负载已被处理。这种分解比将跨链桥视为黑盒更有用。
最终性假设在这里很重要。基于单次确认行动的连接容易受到源链重组的影响;等待经济最终性的连接较慢但更安全。衡量实际的确认策略,而不是假设它。
可运行检查:使用 curl 验证跨链转账
第一个诊断是确认源交易存在并检查其日志。使用 JSON-RPC 调用获取收据并查找跨链桥合约的事件。确切的事件签名取决于跨链桥,因此请先阅读其文档或 ABI。
以下命令获取收据。替换占位符;不要在生产环境中使用虚构的公共端点。
curl -s RPC_URL_SOURCE \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_getTransactionReceipt",
"params": ["0xSOURCE_TX_HASH"]
}'可运行检查:在 JavaScript 中比较源和目标状态
只有当目标链反映源事件时,跨链转账才算完成。下面的脚本读取源收据和目标收据,然后打印两个状态和区块号,以便您比较。它使用 ethers 和您提供的两个 RPC URL。
在跨链桥报告完成后运行它。如果目标状态为 null,则交易尚未被挖掘或哈希错误。如果为 0,则目标执行回滚。
import { JsonRpcProvider } from 'ethers';
const source = new JsonRpcProvider('RPC_URL_SOURCE');
const dest = new JsonRpcProvider('RPC_URL_DEST');
async function compare(sourceTxHash, destTxHash) {
const [srcReceipt, dstReceipt] = await Promise.all([
source.getTransactionReceipt(sourceTxHash),
dest.getTransactionReceipt(destTxHash),
]);
console.log('source status:', srcReceipt?.status, 'block:', srcReceipt?.blockNumber);
console.log('dest status:', dstReceipt?.status, 'block:', dstReceipt?.blockNumber);
if (!dstReceipt) {
console.log('destination not mined yet: check attester and finality policy');
} else if (dstReceipt.status === 0) {
console.log('destination reverted: check verification and replay protection');
}
}
compare('0xSOURCE_TX_HASH', '0xDEST_TX_HASH');预期验证结果和结果表流程
健康的连接会产生状态为 1 的源收据、状态为 1 的目标收据,以及目标区块号大于源区块号。目标收据还应包含跨链桥的完成事件,并且包装余额应增加预期金额减去费用。
记录您自己的测量值,而不是信任已发布的数字。使用如下表格并每次转账填写;在观察到之前将单元格留空。
- | 字段 | 源链 | 目标链 |
- | 交易状态 | | |
- | 区块号 | | |
- | 时间戳 | | |
- | 跨链桥事件已发出 | | |
- | 之前/之后金额 | | |
- | 观察到的延迟(秒) | | |
排查卡住或不匹配的跨链转账
源交易待处理。 观察者无法行动,直到源交易被挖掘并达到跨链桥的确认阈值。检查源链的 gas 条件和跨链桥的最终性策略。
目标交易缺失。 证明者可能尚未签名,或者消息可能因速率限制而排队。检查跨链桥的状态页面和证明者的链上活动。如果跨链桥使用挑战期,延迟可能是有意的。
目标交易回滚。 常见原因包括重放保护(消息已被处理)、目标 gas 不足,或验证失败因为证明与预期签名者集不匹配。从收据日志中读取回滚原因。
金额不匹配。 费用、滑点和链间小数位数差异是常见原因。在假设损失之前,确认包装代币的小数位数和跨链桥的费用表。
连接区块链的局限性和权衡
每个连接都增加了单链上不存在的信任假设。托管和验证者集跨链桥将风险集中在少数群体中;轻客户端连接降低了这种风险,但成本高昂且特定于链。消息层继承其证明者集的安全性,预言机继承其节点运营商的安全性。
流动性是另一个限制。锁定铸造跨链桥依赖目标池有足够的流动性来释放资产;消息层依赖目标 gas 可用。两者都不是免费的,且都可能在负载下失败。
最后,可组合性有限。转移代币的连接不会自动转移其治理权、收益累积或合约级权限。将每个连接的资产视为独立的工具,并在目标链上验证其行为。
后续步骤:衡量和运营连接
在生产环境中依赖连接之前,在一天中的不同时间对多次转账运行验证流程,并记录延迟、失败率和费用差异。将结果与跨链桥公布的保证进行比较。
对于基础设施,选择覆盖两条链并暴露您所需方法的 RPC 端点。API 服务概览和RPC 定价页面解释了选项,当您需要为观察者或中继器提供一致吞吐量时,专用节点是合适的选择。在网络页面上浏览支持的网络。
如果您正在为特定链选择提供商,请使用 RPC Assistant 获取具体建议,而不是从列表中猜测。相关答案包括Web3 项目最佳 RPC 提供商和区块链节点托管指南。