EIP-234: 向 JSON-RPC 过滤器选项添加 `blockHash`。
Authors | Micah Zoltu (@MicahZoltu) |
---|---|
Created | 2017-03-24 |
Requires | EIP-1474 |
简单总结
向 JSON-RPC 过滤器选项(由 eth_newFilter
和 eth_getLogs
使用)添加一个选项,允许指定应包含在结果中的块哈希。此选项将替代 fromBlock
/toBlock
选项。
摘要
此添加将允许客户端获取特定块的日志,无论这些块是否在当前主链中。这解决了由于链重组的性质、不可靠的网络连接以及结果集中在空情况下没有包含足够的详细信息而导致难以/成本高昂地编写健壮的客户端的一些问题。
规范
eth_newFilter
使用的过滤器选项将有一个额外的可选参数,名为 blockHash
,其值为单个块哈希。响应请求的以太坊节点将发送回一个错误(如果未找到块哈希),或者它将返回与过滤器匹配的结果(按正常操作),约束到提供的块。在内部,这(大概)会类似于 fromBlock
和 toBlock
过滤器选项。
理由
一个需要可靠通知日志添加(在新块上)和日志删除(在链重组上)的客户端(dApp)无法在仅依赖于订阅和过滤器的情况下实现此目的。这是因为在重组期间网络或远程节点发生故障会导致客户端与实际情况失去同步. Websocket 中发生这种情况的一个例子是当客户端打开一个 web socket 连接,设置一个日志过滤器订阅,收到一些新日志的通知,然后失去 web socket 连接,然后(断开连接时)发生重组,然后客户端连接回来并建立一个新的日志过滤器。在这种情况下,他们将不会收到节点发送的日志删除通知,因为他们在删除广播时断开了连接,并且连接丢失导致节点忘记了他们的存在。对于 HTTP 客户端,也可以构想一个类似的场景,即在轮询更新之间,节点关闭并返回(导致过滤器状态丢失),并且在相同的两次轮询之间也发生了重组。
为了在仍然为内部块/日志添加/删除提供一个健壮的机制的同时处理这种情况,客户端可以在内部维护一个区块链(最后 n
个块),并且只订阅/轮询新块。当收到一个新块时,客户端可以将它们的内部模型与新块进行协调,可能回填父块或从它们的内部模型中回滚/删除块,以与节点同步。这可以解决任何类型的断开连接/重组/中断情况,并且还允许客户端(作为一个额外的好处)与一组以太坊节点(例如,通过轮询)进行通信,而不是与单个节点紧密耦合。
一旦用户获得了可靠的块流,他们就可以查看新块的 bloom 过滤器,如果该块 可能 有感兴趣的日志,他们可以从节点获取该块的过滤日志。出现的问题是,在客户端收到块和客户端获取该块的日志之间可能会发生重组。鉴于当前的一组过滤器选项,客户端只能按块号请求日志。在这种情况下,他们收到的日志 不是 他们想要的日志,而是接收到一个已被重组的块的日志(并且可能没有与内部客户端状态完全协调)。可以通过查看生成的日志本身并确定它们是否用于请求的块哈希来部分解决此问题。但是,如果结果集是一个空数组(没有获取任何日志),那么客户端就不知道结果是哪个块的。结果对于所讨论的块来说可能是合法空(bloom 过滤器可能会产生误报),或者他们可能会收到他们不知道的块的空日志。在这一点上,客户端无法做出任何可以保证恢复的决定。他们可以假设空日志是针对正确的块,但如果不是,那么他们将永远不会再次尝试获取。如果该块只是暂时性地被重组出来,因为它可能在下一次块轮询之前返回,那么客户端将永远不会见证重组,这将产生一个问题。他们可以假设空日志是针对错误的块,并重新获取它们,但它们可能会继续获得空结果,使它们回到相同的情况。
通过添加按哈希获取日志的能力,可以保证客户端,如果他们得到一个结果集,那么它是针对所讨论的块的。如果他们得到一个错误,那么他们可以采取适当的措施(例如,回滚客户端上的该块并重新获取最新的)。
向后兼容性
这里唯一潜在的问题是 fromBlock
和 toBlock
字段。同时包含哈希和数字是没有意义的,所以 fromBlock
/toBlock
应该与 blockHash
互斥。
测试用例
{ "jsonrpc": "2.0", "id": 1, "method": "eth_getLogs", params: [{"blockHash": "0xbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0c"}] }
应该返回哈希值为 0xbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0c
的块的所有日志。如果将 topics
字段添加到过滤器选项中,那么应该返回该块的过滤日志集。如果不存在具有该哈希的块,那么应该返回一个错误,其 code
为 -32000
,message
为 "未找到块。"
,data
为 "0xbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0cbl0c"
。
实现
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Micah Zoltu (@MicahZoltu), "EIP-234: 向 JSON-RPC 过滤器选项添加 `blockHash`。," Ethereum Improvement Proposals, no. 234, March 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-234.