EIP-7799: 系统日志
没有关联交易的每个区块的日志
Authors | Etan Kissling (@etan-status), Gajinder Singh (@g11tech) |
---|---|
Created | 2024-10-29 |
Discussion Link | https://ethereum-magicians.org/t/eip-7799-system-logs/21497 |
Requires | EIP-1559, EIP-4895, EIP-6466, EIP-7708 |
Table of Contents
摘要
此 EIP 定义了 eth_getLogs
的扩展,以提供与给定交易不关联的事件的日志,例如区块奖励和提款。
动机
通过 EIP-7708,钱包可以使用 eth_getLogs
来跟踪其 ETH 余额的变化。但是,ETH 余额可能会在没有显式交易的情况下,通过区块生产和提款而发生变化。通过让此类操作发出区块级别的系统日志,eth_Logs
提供了 ETH 余额变化的完整视图。
规范
本文档中的关键词 “MUST”(必须),”MUST NOT”(禁止),”REQUIRED”(需要),”SHALL”(应),”SHALL NOT”(不应),”SHOULD”(应该),”SHOULD NOT”(不应该),”RECOMMENDED”(推荐),”NOT RECOMMENDED”(不推荐),”MAY”(可以)和 “OPTIONAL”(可选)应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
系统日志列表
引入了一个新列表来跟踪从系统交互中发出的所有区块级别日志。该定义使用了来自 EIP-6466 的 Log
的 SSZ 类型。
system_logs = List[Log, MAX_LOGS_PER_RECEIPT](
log_0, log_1, log_2, ...)
优先费用处理
EIP-1559 优先费用 SHALL(应)不再在每次单独交易后记入。相反,它们 SHALL(应)被汇总,并在处理完一个区块的所有交易后,但在处理 EIP-4895 提款之前记入。
一个日志 SHALL(应)被附加到系统日志列表中,以反映此优先费用的记入。
字段 | 值 |
---|---|
address |
0xfffffffffffffffffffffffffffffffffffffffe (SYSTEM_ADDRESS ) |
topics[0] |
0x5dfe9c0fd3043bb299f97cfece428f0396cf8b7890c525756e4ea5c0ff7d61b2 (keccak256('PriorityRewards(address,uint256)') ) |
topics[1] |
to 地址 (零填充到 uint256) |
data |
以 Wei 为单位的 amount (大端 uint256) |
提款处理
一个日志 SHALL(应)在每次 EIP-4895 提款时附加到系统日志列表中。
字段 | 值 |
---|---|
address |
0xfffffffffffffffffffffffffffffffffffffffe (SYSTEM_ADDRESS ) |
topics[0] |
0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65 (keccak256('Withdrawal(address,uint256)') ) |
topics[1] |
to 地址 (零填充到 uint256) |
data |
以 Wei 为单位的 amount (大端 uint256) |
Genesis 处理
当为从一开始就采用此 EIP 的网络生成 genesis 区块时,一个日志 SHALL(应)被附加到系统日志列表中。
字段 | 值 |
---|---|
address |
0xfffffffffffffffffffffffffffffffffffffffe (SYSTEM_ADDRESS ) |
topics[0] |
0xba2f6409ffd24dd4df8e06be958ed8c1706b128913be6e417989c74969b0b55a (keccak256('Genesis(address,uint256)') ) |
topics[1] |
to 地址 (零填充到 uint256) |
data |
以 Wei 为单位的 amount (大端 uint256) |
执行区块头更改
执行区块头 扩展了一个新字段 system-logs-root
。
block_header.system_logs_root = system_logs.hash_tree_root()
JSON-RPC API
JSON-RPC API 上下文中的区块头对象被扩展为包含:
systemLogsRoot
:DATA
, 32 字节
JSON-RPC API 上下文中的日志对象按如下方式更新:
logIndex
:QUANTITY
- 附加的系统日志在来自交易收据的现有日志之后连续索引transactionIndex
:QUANTITY
-null
也用于系统日志;挂起的日志仍然可以通过检查blockHash
是否为null
来识别transactionHash
: DATA, 32 字节 -null
也用于系统日志
Engine API
在 Engine API 中,与采用此 EIP 的 forks 对应的版本的 ExecutionPayload
扩展为包含:
systemLogsRoot
:DATA
, 32 字节
作为 engine_forkchoiceUpdated
的一部分,执行层实现 SHALL(应)验证每个区块的 systemLogsRoot
是否与从本地处理计算出的实际值匹配。这扩展了现有的 receiptsRoot
验证。
共识 ExecutionPayload
更改
共识 ExecutionPayload
类型扩展了一个新字段来存储系统日志根。
class ExecutionPayload(Container):
...
system_logs_root: Root
理由
与 EIP-7708 一起,此 EIP 提供了钱包从日志计算确切 ETH 余额的能力,而无需下载每个区块头和所有提款。
来自优先费用的区块奖励不再需要通过处理所有收据来汇总,并且可以从系统日志根获得,从而使其可以被有效证明。
批量记入优先费用改进了交易的并行执行,因为一笔交易不再可能以不足的费用开始,并且只有在增量优先费用被记入后才有资格执行。
备选方案 / 未来
-
可以不必将优先费用合并为一笔付款,每笔交易都可以将优先费用付款作为单独的日志发出。无论如何,每个交易都需要一个交易费用日志来用于费用销毁。可以将该负载扩展为 2 组 uint256,一组用于销毁,另一组用于优先费用,而不是合并费用;并且还将费用接收者添加为这些日志的附加主题,以便为
eth_getLogs
搜索编制索引。但是,这将阻止并行执行的好处,因为每笔交易都将继续需要对费用接收者的帐户进行独占锁定以记入费用,并且无法有效地证明一个区块赚取的总优先费用,因为它将需要处理该区块内的所有收据。 -
现在,提款中的信息在
withdrawals
列表和系统日志中重复出现。也许可以将这些信息整合到发出的Withdrawal
日志数据中,从而可以停用现有的withdrawals
列表。当前列表设计要求钱包获取所有区块头和所有提款,以确保它们获得与观察到的帐户有关的所有数据。允许使用eth_getLogs
查询它们更符合存款的跟踪方式。 -
日志定义本身可能会发生变化。将它们与 ERC-20 保持一致性,以便进行纯粹的信用。对于提款,日志数据可以匹配存款日志和 EIP-7685 请求日志的形式。
向后兼容性
费用接收者现在在区块的末尾而不是在每次交易后递增地收到优先费用,这使得仅在下一个区块中才可以花费它们。这可能需要更新区块构建器基础设施,并更改 MEV 用例的流动性要求。
安全考虑
发出的日志使用 SYSTEM_ADDRESS
作为它们的 address
,这不会与用户控制的智能合约冲突。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Etan Kissling (@etan-status), Gajinder Singh (@g11tech), "EIP-7799: 系统日志 [DRAFT]," Ethereum Improvement Proposals, no. 7799, October 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7799.