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

Sei 节点与 RPC API:EVM 与 Cosmos 双运行时

了解 Sei 节点如何同时提供兼容以太坊的 JSON-RPC API 和 Cosmos/Tendermint 接口,以及如何验证 Sei 端点。

TL;DR

Sei 是一个基于 Cosmos-SDK 和 CometBFT 的 L1,内置 EVM 执行环境,因此单个 Sei 节点同时提供兼容以太坊的 JSON-RPC 接口(eth_* 方法及 Sei 特有辅助方法)和 Cosmos/Tendermint 接口(Tendermint RPC 和 Cosmos gRPC/REST)。EVM 区块高度和 Cosmos 区块高度是独立的计数器,因此在核对交易时必须选择正确的高度来源。本文解释数据访问层、关键 JSON-RPC 方法、使用 seid 二进制文件进行节点配置,以及可复现的端点验证流程。还涵盖自托管与托管端点的对比、限制和故障排除手册。

Sei 的双运行时模型:Cosmos 共识与嵌入式 EVM

Sei 不是纯粹的 EVM 链。它是一个基于 Cosmos-SDK 和 Tendermint (CometBFT) 的 Layer 1,包含内置的 EVM 执行环境。这意味着单个 Sei 节点暴露两个不同的 API 接口:用于 EVM 交互的兼容以太坊的 JSON-RPC 接口,以及用于共识和模块级查询的 Cosmos/Tendermint 接口。Sei 文档描述了节点操作和 seid 二进制文件,而 EVM 文档详细介绍了 JSON-RPC 接口。

EVM 接口使用标准 eth_* 方法回答有关智能合约、账户余额和 EVM 交易的问题。Cosmos 接口使用 Tendermint RPC 和 Cosmos gRPC/REST 回答有关质押、治理、银行余额和共识状态的问题。理解哪个接口回答哪个问题对于在 Sei 上构建可靠应用至关重要。

  • EVM JSON-RPC:eth_chainId、eth_blockNumber、eth_getBalance、eth_call、eth_getLogs、eth_sendRawTransaction,以及 Sei 特有的辅助方法如 eth_getSei... 方法。
  • Cosmos/Tendermint RPC:通过节点的共识端口进行共识状态、区块查询和交易广播。
  • Cosmos gRPC/REST:针对 bank、staking、governance 和其他 SDK 模块的模块级查询。

数据访问层:自托管节点、托管提供商和索引器

访问 Sei 数据主要有三种方式。第一,自托管的 seid 节点直接提供 JSON-RPC API,让您完全控制数据新鲜度和可用性。第二,托管提供商运行 Sei 节点并暴露相同的 JSON-RPC API,通常还提供额外工具和支持。第三,Cosmos REST/gRPC 端点和索引器/浏览器层提供模块级查询和聚合数据,例如交易历史和分析。

普通节点能高效地提供近期和共识数据,但深度历史 EVM 状态可能需要归档节点。自托管与使用托管端点之间的权衡取决于您的运营能力和延迟要求。有关协议风格的比较,请参阅 JSON-RPC vs gRPC vs REST。

  • 自托管:完全控制,但您需要管理升级、存储和正常运行时间。
  • 托管提供商:托管基础设施,通常支持归档和更高可用性。
  • 索引器/浏览器:聚合视图,适用于分析但不适用于实时状态。

关键 JSON-RPC 方法及其返回值

Sei 上的 EVM JSON-RPC 接口遵循 以太坊 JSON-RPC 规范的标准方法。身份方法如 eth_chainId 和 web3_clientVersion 返回链 ID 和客户端版本。头部方法如 eth_blockNumber 和 eth_getBlockByNumber 返回最新区块号和区块详情。账户和合约状态方法如 eth_getBalance、eth_getTransactionCount 和 eth_getCode 返回余额、nonce 和字节码。eth_call 执行只读合约调用,eth_getLogs 检索区块范围内的事件日志,eth_sendRawTransaction 提交已签名交易。

Sei 还提供 Cosmos 风格的关联查询,例如 eth_getSei... 辅助方法,用于桥接 EVM 地址和 Cosmos 账户。这些是 Sei 特有的,并在 Sei EVM 文档中有记录。

  • eth_chainId:返回 EVM 链 ID(例如 Sei 主网为 1329)。
  • eth_blockNumber:返回最新的 EVM 区块号。
  • eth_getBalance:返回给定区块上某个地址的余额。
  • eth_call:对合约执行只读调用。
  • eth_getLogs:返回匹配区块范围过滤器的日志。
  • eth_sendRawTransaction:提交已签名的原始交易。

EVM 区块高度与 Cosmos 区块高度:正确性关键区别

Sei 将 Cosmos 最终性(CometBFT BFT 最终性)与 EVM 区块生产分开。EVM 区块高度和 Cosmos 区块高度是不同的计数器。在核对交易时,您必须刻意选择正确的高度来源。对于 EVM 交易,使用来自 eth_blockNumber 或 eth_getTransactionReceipt 的 EVM 区块号。对于 Cosmos 交易,使用来自 Tendermint RPC 或 Cosmos gRPC/REST 的 Cosmos 区块高度。

混合这些高度可能导致对交易最终性或数据可用性的错误假设。始终验证给定 API 返回的是哪个高度,并在您的集成中记录它。

  • EVM 高度:随每个 EVM 区块递增,由 eth_* 方法使用。
  • Cosmos 高度:随每个 CometBFT 区块递增,由 Tendermint RPC 和 Cosmos 模块使用。
  • 核对:通过交易收据或索引器将 EVM 交易映射到其 Cosmos 区块。

运行 Sei 节点以提供 JSON-RPC API

要运行 Sei 节点,您需要使用 seid 二进制文件。使用 seid init 初始化节点后,配置 config.toml 和 app.toml。在 app.toml 中,启用 JSON-RPC 服务器和 evm_rpc 部分,包括 websocket 支持(如果需要)。节点暴露多个端口:共识端口(默认 26656)、Tendermint RPC 端口(26657)、Cosmos gRPC 端口(9090)、Cosmos REST 端口(1317)以及 EVM JSON-RPC 端口(8545)和 websocket(8546)。

Sei 文档提供了节点操作和配置的详细说明。确保您的节点在提供 API 请求之前完全同步。

seid init my-node --chain-id sei-chain
# Edit ~/.sei/config/app.toml to enable JSON-RPC and EVM RPC
# [json-rpc]
# enabled = true
# [evm_rpc]
# enabled = true
# ws-enabled = true
seid start

验证 Sei 端点:可复现的流程

要验证 Sei 端点是否在线且诚实,请执行一系列 JSON-RPC 调用。首先,调用 eth_chainId 并确认它与预期的 Sei 链 ID 匹配(例如主网为 1329)。其次,调用 eth_blockNumber 两次并确认区块号递增。第三,在报告的区块高度调用 eth_getBlockByNumber 并确认区块哈希一致。第四,对已知账户调用 Cosmos 查询以确认模块接口正常工作。这可以检测出回答错误链或停滞的端点。

使用以下 Node.js 脚本自动化这些检查。将结果记录在表格中以便跨端点比较。

const axios = require('axios');
const endpoint = 'https://your-sei-endpoint';

async function verify() {
  const chainId = await axios.post(endpoint, { jsonrpc: '2.0', method: 'eth_chainId', params: [], id: 1 });
  console.log('Chain ID:', chainId.data.result);
  const block1 = await axios.post(endpoint, { jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 2 });
  await new Promise(r => setTimeout(r, 2000));
  const block2 = await axios.post(endpoint, { jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 3 });
  console.log('Block numbers:', block1.data.result, block2.data.result);
  const block = await axios.post(endpoint, { jsonrpc: '2.0', method: 'eth_getBlockByNumber', params: [block1.data.result, false], id: 4 });
  console.log('Block hash:', block.data.result.hash);
}
verify();

结果表:根据您自己的检查测量端点行为

使用下表记录您的测量结果。用您从端点观察到的值填写。这是一种由读者验证的方法;此处不提供基准数字。

列:检查项、预期值、观察值、通过/失败。行:eth_chainId、eth_blockNumber(第一次调用)、eth_blockNumber(第二次调用)、eth_getBlockByNumber 哈希、Cosmos 账户查询。

  • eth_chainId:预期为 Sei 主网的 1329。
  • eth_blockNumber:第二次调用应大于第一次。
  • eth_getBlockByNumber:哈希应与该高度上的区块匹配。
  • Cosmos 账户查询:应返回账户的余额或序列号。

自托管与托管端点:权衡与选择

自托管 Sei 节点让您完全控制数据和隐私,但需要大量的运营工作,包括硬件、升级和监控。托管端点(例如 OnFinality 提供的端点)提供托管基础设施,具有更高的可用性,并且通常支持归档。选择取决于您团队的能力以及应用程序的延迟和可靠性要求。

有关支持的网络列表并选择端点,请参阅 RPC 定价 和 API 服务。您还可以浏览相邻的协议指南,如 HyperEVM JSON-RPC EVM 方法指南 和 NEAR Protocol JSON-RPC API 与节点设置 以进行比较。

  • 自托管:控制力强,但您需要管理正常运行时间和升级。
  • 托管:托管服务,通常支持归档和更高吞吐量。
  • 混合:生产环境使用托管,开发环境使用自托管。

限制与假设

本文假设您熟悉 JSON-RPC 和基本的区块链概念。它不涵盖所有 Sei 特有方法或完整的 Cosmos SDK 查询接口。确切的端口号和配置选项可能因 Sei 版本而异;请始终参考 Sei 文档获取最新详细信息。验证流程假设使用标准 Sei 节点,没有自定义修改。

提供商特定的行为(如速率限制和支持的方法)因提供商而异。请始终针对您选择的端点进行测试。

  • 并非所有 eth_* 方法都可能被每个提供商支持。
  • 历史 EVM 状态需要归档节点。
  • Cosmos gRPC/REST 端点可能默认禁用。

Sei 端点故障排除手册

常见问题包括链 ID 错误、EVM 与 Cosmos 高度不匹配、getLogs 范围为空以及 websocket 断开。对于链 ID 错误,请验证端点的 eth_chainId 与预期的 Sei 链 ID 是否匹配。对于高度不匹配,请确保您为查询使用了正确的高度来源。对于 getLogs 为空,请检查区块范围是否有效以及合约是否发出事件。对于 websocket 断开,请实现重连逻辑并监控连接健康状况。

如果端点停滞,请随时间比较区块号。如果 Cosmos 接口失败,请检查 gRPC/REST 端口是否已启用并可访问。

  • 链 ID 错误:端点可能指向不同的网络。
  • 高度不匹配:EVM 查询使用 EVM 高度,Cosmos 查询使用 Cosmos 高度。
  • getLogs 为空:验证区块范围和合约事件。
  • Websocket 断开:添加心跳和重连逻辑。

后续步骤:将 Sei 集成到您的技术栈中

验证 Sei 端点后,使用标准以太坊库(如 ethers.js 或 web3.js)进行 EVM 交互,并使用 Cosmos SDK 客户端进行模块查询,将其集成到您的应用程序中。有关身份方法,请参阅 以太坊节点身份方法:chainId 和 clientVersion。有关网络的更广泛概述,请访问 OnFinality Learn 中心 并探索 Optimism 作为另一个 EVM 兼容网络的示例。

考虑在生产工作负载中使用托管提供商,以确保可靠性和归档访问。始终监控端点的健康状况和区块高度进展。

  • 使用 ethers.js 进行 EVM JSON-RPC 调用。
  • 使用 CosmJS 进行 Cosmos gRPC/REST 查询。
  • 定期监控区块高度和链 ID。

永远不用担心基础设施

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

开始