WebSocket 端点#

WebSockets(WSS)通信协议通过单个 TCP 连接实现客户端与服务器之间的双向通信。该协议在双方之间维持一个持久网络连接,支持实时低延迟通信。与 HTTP 请求-响应协议不同,WebSockets 支持持续的双向通信。

主网(chain-id: 0xC4,十进制 196)#

WSS:

  • wss://xlayerws.okx200.com
  • wss://ws.xlayer.tech

WebSocket 方法#

订阅方法仅适用于 WebSocket 连接,允许您等待事件而无需轮询。例如,DApp 可以订阅日志,并在特定事件发生时收到通知。

以下订阅方法可用:

  • eth_subscribe - 订阅特定事件
  • eth_unsubscribe - 取消活跃订阅

同时支持通过 WebSocket 调用以太坊兼容的 RPC 方法。 您需要安装 ws 或其他 WebSocket 客户端。

shell
# 安装 wss 工具
go install github.com/hashrocket/ws@latest

# 连接到 wss 服务器
ws wss://xlayertestws.okx200.com

eth_subscribe#

通过 WebSocket 订阅不同类型的以太坊事件,如 newHeads、logs、pendingTransactions 和 minedTransactions。

参数 指定订阅事件参数,包括以下内容:

  • newHeads:订阅后,每当新区块头被追加到链上(包括链重组)时,将收到通知。链重组时,订阅会推送新链的所有新区块头,因此同一高度可能收到多个区块头。
  • logs:返回包含在新导入区块中且符合给定过滤条件的日志。链重组时,旧链上已发送的日志会以 removed 属性设为 true 重新发送;新链上交易产生的日志也会被推送,因此同一交易可能收到多次日志。该参数包含以下字段:
    • address(可选) 单个地址或地址数组,仅返回从这些地址产生的日志。
    • topics(可选) 仅返回匹配指定主题的日志。
  • newPendingTransactions:不支持

返回值 subscription ID(订阅 ID):节点上新创建订阅的 ID。

示例 事件 newHeads

shell
> {"id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
json
// 响应 OK
{"jsonrpc":"","id":1,"result":"0x4698d49adc4f4590a7a685702a7890a1"}

// 响应 newHeads
{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x4698d49adc4f4590a7a685702a7890a1","result":{"parentHash":"0x8cbb9b4bbd08169f6721ca427b7596d367343beafefd795a739aa7561e402aa6","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","miner":"0x5e7b89ab3b2de21f0f35da4920b9d7310ccbe259","stateRoot":"0x82a790655c9731a90388eded2cfcb1dfb9ccd7fedc50a76027ece92b1a1c0a99","transactionsRoot":"0xca77a5c5bbc6ab7cc1a5aca874525d644602c06a8bd78b9a30530cbc311c1204","receiptsRoot":"0x59c28ec1a61258d901bdb099195292ec2ed440e3a8820401c28ec7c77f752791","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000008000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","size":"0x356","number":"0xf92e","gasLimit":"0x1c9c380","gasUsed":"0x2c84c","timestamp":"0x65558e95","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","hash":"0x3313d5a4c5580d6db0310cd6a2e1107bb5b4f94cf16232619ac3bd7d9d04a8f0","transactions":["0x762b9a2eb0b13775beabdacd91fb9150dab945f998c93b92bb838a26542d49c5"],"uncles":[]}}}

事件 logs

shell
> {"jsonrpc":"2.0","method":"eth_subscribe","params":["logs",{"topics":["0x7bcec107ebaef6075ec44d44bbaceef2832d8ef887883240b63415dd770788e9"]}],"id":0}
json
// 响应 OK
{"jsonrpc":"2.0","id":1,"result":"0x9aebda1c07ed47f78053751ebbbd26d5"}

// 响应事件 Logs
{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x9aebda1c07ed47f78053751ebbbd26d5","result":{"parentHash":"0x2f823eea412f288a4575c66f845b0eebb40fba3313c36197e20af204b6f7d3be","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","miner":"0x4e830165ff22f4592f0933f01d2d4ffd0b1fccf8","stateRoot":"0xd579fdae44038a6654d23e18ab12d8447fb2732b49eae323f7586959a844f1b2","transactionsRoot":"0x60fd8387b75b3c2c16cd9a51e466d188a967d3a27ef845844cf56008a50b0ddc","receiptsRoot":"0xa0480d2161fb5802ed71872b85cd6828cf9ea74794dc04307d0009ac80e3ed73","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","size":"0x273","number":"0x29502","gasLimit":"0x1c9c380","gasUsed":"0x5208","timestamp":"0x652cdae7","extraData":"0x","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","hash":"0x9703f514105904358b28a804d2ceda3ee3bc075dae9a23d99f352e0346e3f582","transactions":["0x495faaf906c862af71e6f298880c239415a2f80f7fb103bedb00f57dd0392ab0"],"uncles":[]}}}

eth_unsubscribe#

调用 eth_unsubscribe 取消指定订阅。返回布尔值,表示取消是否成功。

参数

  • subscription ID(订阅 ID):您要取消订阅的订阅 ID。

返回值

  • unsubscribed flag(取消标志):(布尔值)成功取消订阅时返回 true。

示例

shell
# 取消订阅新区块头
> {"id": 1, "method": "eth_unsubscribe", "params":["0xefa20a66c94a4da7ae18294db6261b42"]}
json
// 响应
{"jsonrpc":"","id":1,"result":true}