EIP-7975: eth/70 - 部分区块收据列表
添加了一个在 p2p 协议中分页区块收据列表的功能
Authors | Felix Lange <fjl@ethereum.org>, Jochem Brouwer (@jochem-brouwer), Giulio Rebuffo (@Giulio2002) |
---|---|
Created | 2025-06-16 |
Discussion Link | https://ethereum-magicians.org/t/eip-7975-eth-70-partial-block-receipt-lists/24658 |
Requires | EIP-7642, EIP-7825 |
摘要
本 EIP 修改了 ‘eth’ p2p 协议,支持请求部分区块收据列表。
动机
随着以太坊在主网上朝着更高的区块 gas 上限发展,区块收据列表的最坏情况总大小也会变大,并可能最终超过客户端中常用的 10MiB 消息大小限制。这可能导致同步失败。
规范
按如下方式修改 Receipts (0x10)
消息中收据的编码:
-
(eth/69):
[request-id: P, [[receipt₁, receipt₂], ...]]
-
(eth/70):
[request-id: P, lastBlockIncomplete: {0,1}, [[receipt₁, receipt₂], ...]]
如果 lastBlockIncomplete
标志设置为 true (1
),则最后一个收据列表不包含区块的所有收据,客户端将必须在新请求中请求该区块的剩余收据。
为了支持此类部分查询,我们还修改了 GetReceipts (0x0f)
消息:
-
(eth/69):
[request-id: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]
-
(eth/70):
[request-id: P, firstBlockReceiptIndex: P, [blockhash₁: B_32, blockhash₂: B_32, ...]]
对于请求的区块哈希列表中的第一个区块,服务器应从响应中省略最多到 firstBlockReceiptIndex
的收据。
跨多个消息下载区块收据会产生新的攻击面。部分收据列表无法根据区块头进行验证,因此在 lastBlockIncomplete = 1
的响应中,必须以不同的方式验证最后一个收据列表:
- 验证已传递的收据总数是否与交易计数匹配。
- 验证每个收据的大小是否符合相应交易的 gas 限制,即,如果大于 gaslimit/8 则拒绝。
- 验证下载的收据总大小是否不大于区块 gas 限制允许的大小。
理由
由于 EIP-7825 将单笔交易的 gas 限制限制为 30M gas,因此单个交易收据的大小将始终受到限制。 具体来说,一笔交易最多可以产生 30000000/8 = 3.75MiB 的日志数据。
但是,一个区块可以包含多个交易,因此整个区块收据列表可能会大得多。 在大约 83M 的区块 gas 限制下,Receipts
消息可能会超过 10MiB。 客户端通常会拒绝大于此大小的消息,因为只有在获取完整消息后才能确定其有效性。
对于 Receipts
消息,每个区块收据列表都通过检查完整列表与区块头中存储的树根来验证。 当跨多个请求下载分页列表时,客户端必须潜在地缓冲超过 10MB 的未验证输入。 这是不可避免的,因为该协议允许在高区块 gas 限制下存在这种大小的收据列表。 但是,我们可以至少通过应用规范部分中建议的健全性检查来限制输入大小。
向后兼容性
此 EIP 更改了 eth 协议,需要推出新版本 eth/70
。 支持线协议的多个版本是可能的。 推出新版本不会立即破坏旧客户端,因为它们可以继续使用协议版本 eth/69
。
此 EIP 不会更改 EVM 的共识规则,也不需要硬分叉。
安全考虑
无
版权
Copyright and related rights waived via CC0.
Citation
Please cite this document as:
Felix Lange <fjl@ethereum.org>, Jochem Brouwer (@jochem-brouwer), Giulio Rebuffo (@Giulio2002), "EIP-7975: eth/70 - 部分区块收据列表 [DRAFT]," Ethereum Improvement Proposals, no. 7975, June 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7975.