ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

解读 EIP-3041:为 `eth_getBlockByHash` 响应新增 `baseFee` 字段的 JSON-RPC 接口扩展

解读 EIP-3041:为 `eth_getBlockByHash` 响应新增 `baseFee` 字段的 JSON-RPC 接口扩展 解读 EIP-3041为eth_getBlockByHash响应新增baseFee字段的 JSON-RPC 接口扩展【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs本文以 EIP-3041EIPS/eip-3041.md为核心深入讲解该提案如何在以太坊 JSON-RPC 接口eth_getBlockByHash的响应对象中暴露 EIP-1559 引入的每区块基础费base fee。读完本文你将掌握eth_getBlockByHash的完整请求/响应结构、baseFee字段的 MUST/MUST NOT 语义、Quantity十六进制编码规则以及 base fee 在区块头、EVM 与 RPC 三层的落点并了解它与 EIP-1474、EIP-1559、EIP-3198 等姊妹规范的关系。一、提案背景为什么 RPC 需要暴露 base fee1.1 EIP-1559 在协议层引入了 base feeEIP-1559Fee market change for ETH 1.0 chain状态为 Final在共识层引入了每单位 Gas 的基础费base fee per gas概念每个区块的区块头新增base_fee_per_gas字段该值由协议根据父区块的 Gas 使用量与 Gas 目标值gas limit 除以弹性倍数自动上下浮动并被销毁burn矿工只能获得优先费priority fee。从 EIP-1559 的参考实现可以看到其Block数据类中明确包含base_fee_per_gas: int 0字段dataclass class Block: ... gas_limit: int 0 # note the gas_limit is the gas_target * ELASTICITY_MULTIPLIER gas_used: int 0 timestamp: int 0 extra_data: bytes bytes() proof_of_work: int 0 nonce: int 0 base_fee_per_gas: int 0同时EIP-1559 的验证逻辑给出了 base fee 的推导规则分叉块expected_base_fee_per_gas INITIAL_BASE_FEE初始值1000000000wei即 1 Gwei父块 Gas 使用量等于目标值base fee 保持不变父块 Gas 使用量高于目标值base fee 上调增量为max(parent_base_fee * gas_used_delta // parent_gas_target // 8, 1)父块 Gas 使用量低于目标值base fee 下调增量同理。也就是说base fee 是一个由共识保证、写入区块头、随网络拥堵程度上下波动的公开数值。正是区块头里多了一个字段这一事实催生了 EIP-3041 这样的接口层提案。1.2 动机更准确的气费预测EIP-3041 的 Motivation 段落明确写道base fee 是用户在某个给定区块需要的关键数值它对提高 Gas 价格预测的准确性至关重要Base fee value is important to make gas price predictions more accurate。在 EIP-1559 之前钱包和基础设施服务只能依赖eth_gasPrice见 EIP-1474这类动态接口来猜测下一个区块的费用而有了按区块公开的 base fee客户端就可以基于历史区块的 base fee 序列结合 EIP-1559 的调整公式外推未来几个区块的 base fee 区间从而让钱包自动设置max_fee_per_gas成为可能。二、规范详解eth_getBlockByHash的修改EIP-3041 属于 Standards Track / Interface 类提案其定位是对既有 RPC 方法的增量修改而非引入全新端点。提案要求 EIP-1474Remote procedure call specification即以太坊 RPC 规范与 EIP-1559 作为前置依赖。2.1 方法描述eth_getBlockByHash返回由哈希指定的区块信息。提案用 RFC-2119 的 MUST/MUST NOT 语气对baseFee字段的呈现做出硬性约束区块号在EIP-1559 分叉块之前的区块响应MUST NOT包含baseFee字段区块号在EIP-1559 分叉块及之后的区块响应MUST包含baseFee字段。这一按分叉点条件化的设计是 EIP-3041 规范的核心语义它保证了同一端点对历史区块pre-1559返回的结构与旧版客户端完全一致而对新区块则多出一个字段。2.2 参数不变Parameters remain unchanged.eth_getBlockByHash仍接受两个参数完整定义见 EIP-1474 的eth_getBlockByHash小节#类型说明1{Data}区块哈希64 个十六进制字符0x 前缀2{boolean}true返回完整交易对象false仅返回交易哈希调用示例原始请求体{ id: 1337, jsonrpc: 2.0, method: eth_getBlockByHash, params: [0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331, true] }2.3 返回对象新增字段在 EIP-1474 定义的块对象成员列表extraData、hash、logsBloom、miner、nonce、parentHash、receiptsRoot、sha3Uncles、stateRoot、transactionsRoot、difficulty、gasLimit、gasUsed、number、size、timestamp、totalDifficulty、transactions、uncles等基础上EIP-3041 为后 EIP-1559 区块追加一个新成员{Quantity}baseFee- 本区块的 base fee单位wei字段类型引用的是 EIP-1474 的Quantity编码规范Quantity值MUST以十六进制编码MUST带0x前缀MUST使用每个字节所需的最少十六进制位数禁止前导零零值MUST表示为0x0。因此baseFee: 0x7表示 7 weibaseFee: 0x3b9aca00表示 1 Gwei10^9 wei。示例中0x0400、0x00这类带前导零的写法都是非法 Quantity。2.4 完整请求/响应示例EIP-3041 给出了完整的 curl 调用与响应示例# Request curl -X POST --data { id: 1559, jsonrpc: 2.0, method: eth_getBlockByHash, params:[0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331, true] } url # Response { id: 1559, jsonrpc: 2.0, result: { difficulty: 0x027f07, extraData: 0x0000000000000000000000000000000000000000000000000000000000000000, baseFee: 0x7, gasLimit: 0x9f759, gasUsed: 0x9f759, hash: 0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331, logsBloom: 0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331, miner: 0x4e65fda2159562a496f9f3522f89122a3088497a, nonce: 0xe04d296d2460cfb8472af2c5fd05b5a214109c25688d3704aed5484f9a7792f2, number: 0x1b4, parentHash: 0x9646252be9520f6e71339a8df9c55e4d7619deeb018d2a3f2d21fc165dde5eb5, sha3Uncles: 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347, size: 0x027f07, stateRoot: 0xd5855eb08b3387c0af375e9cdb6acfc05eb8f519e419b874b6ff2ffda7ed1dff, timestamp: 0x54e34e8e, totalDifficulty: 0x027f07, transactions: [], transactionsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421, uncles: [] } }注意示例中baseFee为0x7即 7 wei与 EIP-3198BASEFEE opcode状态 Final测试用例中假设当前区块 base fee 为 7 wei的取值一致可互相印证。请求中的id取 1559 也并非随意——它呼应了 EIP-1559 的编号。三、设计取舍RationaleEIP-3041 的 Rationale 阐明了两个关键决策只加字段、不新增端点与其为读取 base fee 引入一个全新的 RPC 方法不如在既有eth_getBlockByHash响应中追加单个参数。这是改动最小、最容易被各客户端集成the simplest change that would be easiest to get integrated的方案。pre-1559 区块不返回 baseFee出于向后兼容考虑对 EIP-1559 分叉前的区块省略该字段。这样旧工具在读取历史区块时不会遇到意外的新键解析行为不变。四、向后兼容性与安全性向后兼容Backwards CompatibilityEIP-3041 声明完全向后兼容。凡是查询 EIP-1559 分叉前区块的调用响应中会省略baseFee字段既有客户端无需任何改动即可继续工作。安全性Security Considerations新增的baseFee字段是纯信息性informational数据其值原本就公开存在于区块头中不引入任何技术安全隐患。这一点与 EIP-3198 的安全考量base fee 并非敏感数据公开可查相互呼应。五、同系列姊妹提案与规范全景EIP-3041 并非孤立提案。同一作者Abdelhamid Bakhta围绕把 base fee 暴露到 RPC 响应这一主题在 EIPS 目录 中还提交了三个结构完全同构的姊妹提案均以 EIP-1474、EIP-1559 为前置依赖均处于 Stagnant 状态提案目标方法文件EIP-3041eth_getBlockByHash响应新增baseFeeEIPS/eip-3041.mdEIP-3044eth_getBlockByNumber响应新增baseFeeEIPS/eip-3044.mdEIP-3045eth_getUncleByBlockHashAndIndex响应新增baseFeeEIPS/eip-3045.mdEIP-3046eth_getUncleByBlockNumberAndIndex响应新增baseFeeEIPS/eip-3046.md四个提案共享完全相同的 MUST/MUST NOT 语义分叉前省略、分叉后必含、相同的Quantity类型、相同的 Rationale 与兼容性结论只是在方法名与参数上不同。例如 EIP-3044 的请求示例为{ id: 1559, jsonrpc: 2.0, method: eth_getBlockByNumber, params:[latest, true] }此外base fee 在接口层还有一个重要落点——EIP-3198BASEFEE opcode状态 Final为 EVM 增加了BASEFEE (0x48)操作码Gas 成本G_base2 gas让合约在链上直接读取当前区块的 base fee。至此base fee 形成了三层暴露体系共识层区块头base_fee_per_gas字段EIP-1559EVM 层BASEFEE操作码EIP-3198RPC 层eth_getBlockByHash等方法的baseFee字段EIP-3041 及姊妹提案。六、实际应用基于baseFee的 Gas 预测综合以上规范baseFee字段在工程上最典型的用途是按区块粒度的 Gas 价格预测通过eth_getBlockByHash或 EIP-3044 的eth_getBlockByNumber批量拉取近期区块解析每个区块的baseFee与gasUsed、gasLimit依据 EIP-1559 的调整公式BASE_FEE_MAX_CHANGE_DENOMINATOR 8、ELASTICITY_MULTIPLIER 2外推下一区块的 base fee钱包据此为用户设置合理的max_fee_per_gas与max_priority_fee_per_gas避免因max_fee_per_gas低于 base fee 而导致的交易无法打包EIP-1559 校验规则assert transaction.max_fee_per_gas block.base_fee_per_gas。实现时需注意的细节解析baseFee必须按 EIP-1474 的Quantity规则 解码0x 前缀、最少位数、零为0x0且要区分字段缺失pre-1559 区块正常现象与字段解析失败客户端实现异常两种情况——这正是 EIP-3041 强制 MUST/MUST NOT 语义的工程价值所在。七、状态说明与阅读建议截至本仓库收录的版本EIP-3041 的元数据状态为Stagnant停滞同系列 EIP-3044、EIP-3045、EIP-3046 亦为 Stagnant。需要说明的是实际主流客户端在后 EIP-1559 区块的eth_getBlockByHash响应中已普遍携带baseFee字段但本文严格以仓库文档为依据不对提案是否被正式采纳做任何断言。若想深入理解本条提案建议按以下顺序阅读本仓库文档EIPS/eip-1559.md —— 理解 base fee 的来源、块头字段与调整算法EIPS/eip-1474.md —— 理解 RPC 方法定义、Quantity/Data编码与错误码约定EIPS/eip-3198.md —— 了解 base fee 在 EVM 层的暴露方式EIPS/eip-3044.md、EIPS/eip-3045.md、EIPS/eip-3046.md —— 对比同系列姊妹提案的异同。八、版权声明本文所述规范内容源自 EIP-3041 等以太坊改进提案文档相关版权与相关权利已依据 CC0 协议放弃见 LICENSE.md。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表