
先区分接口、通道与通知
讨论区块链通知机制时,可以先问三个问题:向谁获取数据、数据如何传送、收到消息代表什么。节点接口、通信连接和业务通知分别回答这些问题。它们可以配合使用,但各自承担不同职责。
例如,页面显示某项链上状态发生变化,背后可能包含获取节点数据、识别变化和更新界面三个环节。“页面收到通知”本身,不能说明节点采用了哪种接口,也不能说明该状态已经最终确定。
JSON-RPC:描述怎样调用节点
以太坊开发文档说明,应用通过节点读取区块链数据或提交交易。JSON-RPC 是使用 JSON 表达数据的轻量、无状态远程调用协议,可用于 HTTP、套接字等不同传输环境;具体方法支持情况需要查看客户端文档。
理解这个术语时,可以把调用规则与传输方式分开:方法名称和参数表达应用要查询什么,通信通道负责传递消息。因此,看到“支持 JSON-RPC”,还不足以判断服务是否支持持续推送或某种订阅功能。
WebSocket:保持双向通信的通道
MDN 对 WebSocket API 的说明强调,浏览器与服务器能够建立双向交互式通信会话,发送信息并接收事件驱动的响应,无需通过持续轮询等待回复。MessageEvent 表示收到消息,CloseEvent 表示连接关闭。
这里的“事件”首先是浏览器接口中的通信事件。收到 MessageEvent 只说明消息到达,消息是否涉及新区块、状态变化或普通服务提示,要依据消息内容及服务接口定义判断。WebSocket 的存在也不自动赋予服务某种区块链订阅能力。
轮询与事件驱动适用于什么场景
轮询指应用反复查询,以判断数据是否变化;事件驱动强调在消息到来后触发处理。前者适合通过查询接口获取状态的场景,后者适合服务器支持主动发送消息、应用需要及时响应的场景。
选择哪种方式,需要结合服务能力与更新需求。连接保持畅通、消息已经到达、业务状态得到确认,是不同判断,应用应分别处理,不能用其中一个代替其他判断。
常见问题:收到通知是否代表最终确定
以太坊查询接口中的区块参数能够指定查询所依据的状态,包括 latest、safe、finalized 和 pending 等。这些标记涉及不同状态范围,所以解释通知时,还需要明确其数据对应哪个区块或状态。
另一个常见疑问是“接口无状态是否意味着不能保持连接”。无状态描述调用协议的特征,持久连接描述通信通道的特征,两者处于不同层面。判断一个通知系统的实际能力,应同时看方法定义、传输支持和消息语义。