跳转到主要内容

使用WebSocket

Alchemy
websocket
查询中
javascript
初学者
Elan Halpern
2020年12月1日
8 分钟阅读

这是有关使用WebSocket和Alchemy向以太坊区块链发出请求的入门级指南。

 (opens in a new tab)WebSockets 与 HTTP

与HTTP不同的是,使用WebSocket,你无需要需要特定信息时持续进行请求。 WebSocket为你维护网络连接(如果操作正确)并侦听变化。

与任何网络连接一样,你不应该假设WebSocket将永远保持打开状态而不会中断,但是正确地手动处理丢弃的连接和重新连接可能很难做到正确。 WebSocket的另一个缺点是,你在响应中不会得到HTTP状态码,而只会得到错误消息。

Alchemy Web3 (opens in a new tab) 自动添加对 WebSocket 连接失败的处理并重试,无需进行配置。

试一试

测试 WebSocket 最简单的方式是安装一个命令行工具来进行 WebSocket 请求,例如 wscat (opens in a new tab)。 使用wscat,你可以发送如下请求:

注意:如果你有 Alchemy 帐户,可以将 demo 替换为自己的 API 密钥。 在此注册免费的 Alchemy 帐户! (opens in a new tab)

wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo

>  {"jsonrpc":  "2.0", "id": 0, "method":  "eth_gasPrice"}

<  {"jsonrpc":  "2.0", "result":  "0xb2d05e00", "id": 0}

如何使用 WebSockets

首先,使用应用的WebSocket URL打开WebSocket 你可以在你的仪表板 (opens in a new tab)中打开应用的页面并点击“View Key”,即可找到应用的 WebSocket URL。 请注意,你的应用的 WebSocket URL 与其 HTTP 请求的 URL 不同,但两者都可以通过点击“View Key”找到。

在你的 Alchemy 仪表板中查找 WebSocket URL 的位置

Alchemy API 参考 (opens in a new tab)中列出的任何 API 都可以通过 WebSocket 使用。 为此,请使用与HTTP POST请求正文相同的有效载荷,而不是通过WebSocket发送该有效负载。

使用 Web3

在使用像Web3这样的客户端库时过渡到WebSocket是很简单的。 在实例化你的Web3客户端时,只需传递WebSocket URL而不是HTTP URL。 例如:

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

订阅 API

通过 WebSocket 连接时,你可以使用两个额外的方法:eth_subscribeeth_unsubscribe。 这些方法将允许你侦听特定事件并立即收到通知。

eth_subscribe

为指定的事件创建新的订阅。 了解有关 eth_subscribe 的更多信息 (opens in a new tab)

参数

  1. 订阅类型
  2. 可选参数

第一个参数指定要侦听的事件类型。 第二个参数包含其他选项,具体取决于第一个参数。 不同的描述类型,其选项和事件有效载荷描述如下。

返回值

订阅 ID:此 ID 将附加到所有收到的事件,也可用于通过 eth_unsubscribe 取消订阅。

订阅事件

当订阅处于活动状态时,你将收到包含以下字段的对象事件:

  • jsonrpc:始终为 "2.0"
  • method:始终为 "eth_subscription"
  • params:一个包含以下字段的对象:
    • subscription:创建此订阅的 eth_subscribe 调用所返回的订阅 ID。
    • result:一个对象,其内容因订阅类型而异。

订阅类型

  1. alchemy_newFullPendingTransactions

返回被添加到待定状态的所有交易的交易信息。 此订阅类型可订阅待处理的交易,类似于标准 Web3 调用 web3.eth.subscribe("pendingTransactions"),但不同之处在于它会发出_完整的交易信息_,而不仅仅是交易哈希。

例如:

  1. newHeads

每当向链中添加新标头时(包括在链重组期间)都会触发事件。

发生链重组时,此订阅将触发一个事件,其中包含新链的所有新标头。 具体地说,这意味着你可能会看到多个高度相同的标头,当发生这种情况时,应该将后一个标头视为重组后的正确标头。

例如:

  1. logs

触发日志,这些日志是符合指定筛选条件的新添加区块的一部分。

当发生链重组时,属于旧链上区块的日志将再次发出,其 removed 属性会设置为 true。 此外,作为新链上区块的一部分的日志被触发,这意味着在重组的情况下可以多次看到同一交易的日志。

参数

  1. 具有以下字段的对象:
    • address(可选):一个表示地址的字符串,或由这类字符串组成的数组。
      • 只会触发从这些地址之一创建的日志。
    • topics:主题说明符数组。
      • 每个主题说明符可以是 null、代表一个主题的字符串,或一个字符串数组。
      • 数组中每个非 null 的位置都会限制所发出的日志,只包含在相应位置上拥有给定主题之一的日志。

主题规范的一些示例:

  • []:允许任何主题。
  • [A]:A 在第一个位置(以及之后的任何内容)。
  • [null, B]:第一个位置为任何内容,第二个位置为 B(以及之后的任何内容)。
  • [A, B]:A 在第一个位置,B 在第二个位置(以及之后的任何内容)。
  • [[A, B], [A, B]]:第一个位置为(A 或 B),第二个位置为(A 或 B)(以及之后的任何内容)。

例如:

eth_unsubscribe

取消一个现有的订阅,以便不再发送任何事件。

参数

  1. 订阅 ID,即先前从 eth_subscribe 调用返回的 ID。

返回值

如果订阅成功取消,则为 true;如果不存在具有给定 ID 的订阅,则为 false

例如:

请求

curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'


结果

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

免费注册 Alchemy (opens in a new tab),查看我们的文档 (opens in a new tab),并在 Twitter (opens in a new tab) 上关注我们以获取最新消息。

页面最后更新: 2026年3月3日

这篇教程对您有帮助吗?