For the complete documentation index, see llms.txt. This page is also available as Markdown.

WebSocket 订阅

通过 WebSocket 订阅 Rome EVM 事件——使用带有 newHeads 和 logs 的 eth_subscribe,配合 ethers 可开箱即用;使用 viem 时,请使用轮询。

Rome EVM 端点支持 Ethereum WebSocket 订阅(eth_subscribe / eth_unsubscribe),共计 wss://。连接到与 HTTPS RPC 相同的主机,使用 wss:// 协议:

wss://<chain>.<network>.romeprotocol.xyz/

这就是 ethers WebSocketProvider 在底层使用的内容,因此 .on('block') 和 contract.on(event) 开箱即用。 viem 只需要一个设置,详见 viem 部分。

订阅类型

类型
触发于
适用于

newHeads

每个新区块

区块计时器、余额/nonce 刷新、按区块运行的机器人、索引器

logs

匹配事件(按 地址 / 主题)

响应你的合约事件、中继器/桥、交易机器人

newPendingTransactions

——

被接受但从不发出(Rome 没有公共 mempool)

ethers(v6)

import { ethers } from "ethers";

const provider = new ethers.WebSocketProvider(
  "wss://martius.testnet.romeprotocol.xyz/"
);

// newHeads
provider.on("block", (blockNumber) => {
  console.log("新区块", blockNumber);
});

// logs — 响应合约事件
const contract = new ethers.Contract(address, abi, provider);
contract.on("Transfer", (from, to, value) => {
  console.log("转账", from, to, value.toString());
});

viem

viem的 webSocket transport 仅在 id 为字符串时注册订阅。Rome 返回的是数字,因此 watchBlocks 通过普通的 webSocket transport 收不到任何内容。传入 poll: true 和 viem 而是通过连接轮询(使用 watchBlocks),或使用 ethers 以获取推送更新。

原始 JSON-RPC

订阅 ID 是 JSON 数字,而不是十六进制字符串,通知携带的也是相同的数字。 ethers 会为你处理这一点。 viem的 webSocket transport 只接受字符串 id,因此会丢弃这些通知(见 viem)。如果你编写原始客户端,请将 id 按数字比较,并将该数字传回给 eth_unsubscribe.

对于 logs,请将过滤器对象作为第二个参数传入:

说明

  • 订阅会在生成新区块时推送更新(延迟大约为一个区块时间)。

  • 对于长连接,请在客户端处理中断重连——这对任何 WebSocket RPC 都是标准做法。

最后更新于

这有帮助吗?