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

Optimism 链:架构、RPC 访问与验证工作流

一份关于 Optimism 链的实用指南,涵盖其 Rollup 架构、OP Stack 组件、RPC 连接以及可复现的验证方法。

TL;DR

Optimism 链是一个以太坊 Layer 2 乐观 Rollup,它在以太坊主网之外执行交易,同时将压缩数据发布回主网以确保安全。本指南解释了 OP Stack 架构、如何通过 JSON-RPC 连接到该链,以及如何使用可复现的诊断命令验证你连接的是正确的网络。内容涵盖常见的连接与配置问题、乐观 Rollup 设计的权衡,以及开发者在 Optimism 链上构建或运营基础设施的后续步骤。

Optimism 链是什么以及本指南涵盖的内容

Optimism 链,通常被称为 OP Mainnet,是一个基于乐观 Rollup 技术构建的以太坊 Layer 2。它在自己的链上执行交易,但通过将交易数据和状态承诺发布到以太坊主网来从以太坊获得安全性。用户获得比以太坊 L1 更低的费用和更快的确认,而开发者获得一个 EVM 等效环境,现有的 Solidity 合约通常无需修改即可部署。

本指南面向需要了解该链工作原理以及如何可靠连接它的开发者和基础设施运营者。内容涵盖 OP Stack 组件模型、JSON-RPC 连接、链身份验证、故障排查以及乐观 Rollup 设计固有的权衡。具体端点选择是另一个问题;如果你需要提供商推荐,请参阅 Optimism RPC 提供商概览。

Optimism 生态系统还包括许多基于相同 OP Stack 软件构建的独立链,有时被称为 Superchain 成员。每条链都有自己的链 ID、排序器和 RPC 端点。在本指南中,除非另有说明,“Optimism 链”指的是 OP Mainnet,但只要你替换为正确的链 ID 和端点,这些诊断方法适用于任何 OP Stack 链。

  • OP Mainnet 是一个由以太坊保障安全的 EVM 等效乐观 Rollup。
  • OP Stack 是开源软件,被 OP Mainnet 之外的许多链使用。
  • 每条 OP Stack 链都有独特的链 ID 和 RPC 端点。

前提条件与假设

以下流程假设你有一个安装了 curl 的终端,可选地安装 Node.js 18+ 或 Python 3.9+ 用于脚本示例,并且可以访问 Optimism 链的 HTTP JSON-RPC 端点。诸如 RPC_URL 之类的占位符必须替换为你提供商提供的可用端点。运行只读诊断不需要有资金的账户;只有当你打算发送交易时才需要私钥,并且私钥绝不应提交到源代码管理中。

如果你在运行这些检查之前评估提供商,RPC 端点指南解释了在端点可靠性和速率限制方面应该关注什么。对于生产工作负载,专用基础设施通常比共享公共端点更可取;关于该模式,请参阅专用节点选项。

乐观 Rollup 如何执行和结算交易

乐观 Rollup 将执行与结算分离。在 Optimism 链上,排序器对传入交易进行排序并生成 L2 区块。这些区块由 Rollup 的执行客户端执行,产生的交易数据被批量打包并作为 calldata 或 blob 发布到以太坊。由于重建 L2 状态所需的数据在以太坊上可用,任何人都可以验证链的历史。

“乐观”一词指的是欺诈证明模型。发布到以太坊的状态承诺被假定为正确,除非在争议窗口内被挑战。如果发布了无效的状态转换,验证者可以提交欺诈证明,无效承诺将被回滚。这与零知识 Rollup 不同,后者在每个批次中提交密码学有效性证明。实际后果是,从 Optimism 链提款到以太坊通常需要等待挑战期,而从以太坊存款则快得多。

OP Stack 将该系统分解为不同的服务:排序器、将交易数据提交到 L1 的批处理程序、提交状态根的提议者,以及监控并质疑无效提议的挑战者。故障证明系统随时间演变,特定链上激活的确切机制取决于其配置和升级历史。请查阅链的官方文档以了解当前的证明系统,而不是假设特定设计。

  • 执行发生在 L2;数据可用性和结算锚定到以太坊。
  • 欺诈证明在挑战窗口后保护状态承诺。
  • L1 到 L2 的存款很快;L2 到 L1 的提款需要等待挑战期。

通过 JSON-RPC 连接到 Optimism 链

Optimism 链暴露标准的以太坊 JSON-RPC 接口。一旦你将大多数以太坊工具指向 Optimism 端点并使用正确的链 ID,它们就可以不变地工作。任何集成的第一步是确认你使用的端点确实服务于你期望的链。

以下 curl 命令检索链 ID。正确配置的 OP Mainnet 端点返回对应于链 ID 10 的十六进制值,即十六进制的 0xa。如果你收到不同的值,则你连接到了不同的 OP Stack 链或完全不同的网络。

curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'

验证链身份和区块进度

仅凭链 ID 是一个弱检查,因为它可能被错误配置的代理欺骗。更强的验证结合多个 RPC 调用,并将它们的结果与独立来源(如区块浏览器)进行比较。以下流程检查链 ID、最新区块号以及最新区块的时间戳和哈希。每隔几秒运行每个调用两次,以确认区块号在推进。

将结果记录在下表中。不要凭记忆填写预期值;在测试时从链的官方浏览器或文档获取它们。表格的目的是使你的验证可复现且可审计。

  • | 检查项 | RPC 方法 | 预期结果 | 观察结果 |
  • | 链身份 | eth_chainId | 与链的文档 ID 匹配 | 记录十六进制值 |
  • | 活跃性 | eth_blockNumber | 调用之间增加 | 记录两个值 |
  • | 区块元数据 | eth_getBlockByNumber("latest", false) | 时间戳较新;哈希非零 | 记录时间戳和哈希 |
  • | 浏览器交叉检查 | 手动 | 区块哈希与浏览器匹配 | 记录浏览器 URL 和哈希 |
const RPC_URL = process.env.RPC_URL;

async function rpc(method, params = []) {
  const res = await fetch(RPC_URL, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params })
  });
  const json = await res.json();
  if (json.error) throw new Error(`${method}: ${json.error.message}`);
  return json.result;
}

(async () => {
  const chainId = await rpc("eth_chainId");
  const blockA = await rpc("eth_blockNumber");
  await new Promise(r => setTimeout(r, 5000));
  const blockB = await rpc("eth_blockNumber");
  const latest = await rpc("eth_getBlockByNumber", ["latest", false]);

  console.log("chainId:", chainId);
  console.log("block A:", parseInt(blockA, 16));
  console.log("block B:", parseInt(blockB, 16));
  console.log("advancing:", parseInt(blockB, 16) > parseInt(blockA, 16));
  console.log("latest timestamp:", new Date(parseInt(latest.timestamp, 16) * 1000).toISOString());
  console.log("latest hash:", latest.hash);
})();

解读验证结果

一个健康的 Optimism 端点返回与你预期网络匹配的链 ID,调用之间增加的区块号,以及时间戳与墙上时钟时间相差几秒内的最新区块。区块哈希应与公共浏览器在相同区块高度显示的一致。如果所有四项检查都通过,你的端点正在服务正确的链,并且相当新。

如果区块号不推进,端点可能落后、被速率限制或指向过时的节点。如果链 ID 正确但区块哈希与浏览器不一致,你可能连接到了分叉或由于错误配置而共享链 ID 的测试网。如果时间戳远在过去,节点可能正在同步或降级。这些区别很重要,因为每种故障模式有不同的补救措施。

排查常见的 Optimism RPC 问题

Optimism 链上的大多数集成失败属于少数几类。下表将症状映射到可能的原因和初步诊断步骤。按顺序处理它们;链 ID 不匹配会导致误导性的下游错误,因此在调试应用程序逻辑之前验证身份。

  • | 症状 | 可能原因 | 第一步 |
  • | eth_chainId 返回意外值 | 错误的端点或代理 | 确认 URL 和提供商网络设置 |
  • | 429 或速率限制错误 | 共享端点配额超限 | 降低请求速率或迁移到专用计划 |
  • | eth_call 意外回滚 | 合约未在此链上的该地址部署 | 在链的浏览器上验证地址 |
  • | 交易卡在待处理状态 | Gas 价格太低或 nonce 间隙 | 检查 eth_getTransactionByHash 和待处理 nonce |
  • | 区块号冻结 | 节点同步中或不健康 | 针对第二个端点重试 |
  • | 提款未到达 L1 | 挑战期未过 | 检查桥接的文档等待时间 |

发送交易并确认包含

只读检查确认连接性,但完整的集成测试还应发送交易并确认它被包含在区块中。以下 Python 示例使用 web3.py 签名并发送价值转移。将 PRIVATE_KEY 和 RPC_URL 替换为你自己的值,并使用资金最少的测试密钥。切勿使用生产密钥进行诊断交易。

发送后,脚本等待收据并打印区块号和状态。状态为 1 表示成功。如果收据从未到达,请在浏览器上检查交易哈希并检查待处理 nonce 以排除 nonce 间隙。

import os
from web3 import Web3

w3 = Web3(Web3.HTTPProvider(os.environ["RPC_URL"]))
account = w3.eth.account.from_key(os.environ["PRIVATE_KEY"])

print("connected:", w3.is_connected())
print("chain id:", w3.eth.chain_id)
print("nonce:", w3.eth.get_transaction_count(account.address))

tx = {
    "to": account.address,
    "value": w3.to_wei(0, "ether"),
    "gas": 21000,
    "maxFeePerGas": w3.to_wei(0.001, "gwei"),
    "maxPriorityFeePerGas": w3.to_wei(0.0001, "gwei"),
    "nonce": w3.eth.get_transaction_count(account.address),
    "chainId": w3.eth.chain_id,
}

signed = account.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
print("sent:", tx_hash.hex())

receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=120)
print("block:", receipt.blockNumber, "status:", receipt.status)

乐观 Rollup 模型的局限性与权衡

Optimism 链在数据可用性和结算方面继承了以太坊的安全模型,但它不会自动继承以太坊的去中心化属性。排序目前由中心化排序器运营,这意味着交易排序由该运营者控制。这是为了性能而做出的有意权衡,在 Rollup 中很常见;路线图和治理过程决定了这一点如何以及何时改变。

提款到以太坊受挑战期约束,通常以天为单位。需要快速跨链移动的应用程序通常使用第三方桥,这会引入它们自己的信任假设。欺诈证明还需要活跃的验证者;如果没有诚实的参与者在监视,无效状态可能会持续存在。这些是乐观 Rollup 的结构性属性,不是错误,它们应该影响你设计依赖于提款时间或桥接安全性的应用程序的方式。

最后,OP Stack 是共享软件,不是单一网络。基于它构建的链可能有不同的安全配置、排序器运营者和升级时间表。集成时,请验证特定链的参数,而不是假设 OP Mainnet 的行为适用于所有地方。网络目录是识别支持的链及其标识符的有用起点。

在 Optimism 链上构建或运营的后续步骤

一旦你的端点通过验证检查,下一步取决于你的角色。应用程序开发者应针对链测试合约部署和交互,确认 Gas 估算行为,并验证事件索引。基础设施运营者应监控区块高度、对等节点数和磁盘使用情况,并应为 Rollup 节点随时间积累的存储增长做好规划。

对于生产工作负载,评估共享端点是否满足你的延迟和速率限制要求,或者是否需要专用节点。RPC 服务的定价通常基于请求量和吞吐量;有关成本模型,请参阅 RPC 定价页面。如果你正在比较提供商,API 服务概览描述了托管产品,而 Optimism RPC 提供商指南更深入地涵盖了选择标准。

无论你选择哪条路径,请将本指南中的验证流程保留在你的运行手册中。在任何端点变更后重新运行链 ID、区块进度和区块哈希检查,可以在问题到达用户之前发现错误配置。

永远不用担心基础设施

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

开始