ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EIP-3322 账户 Gas 存储操作码解析:SELFGAS / USEGAS / STOREGAS 的设计、定价与测试验证

EIP-3322 账户 Gas 存储操作码解析:SELFGAS / USEGAS / STOREGAS 的设计、定价与测试验证 EIP-3322 账户 Gas 存储操作码解析SELFGAS / USEGAS / STOREGAS 的设计、定价与测试验证【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文围绕以太坊改进提案 EIP-3322Account gas storage opcodes 展开该提案为合约账户引入一个可持久化的gas 退款计数器并新增SELFGAS、USEGAS、STOREGAS三个操作码用于读取、消耗与充值该计数器从而为 gas 市场提供一种比 GasToken 更高效、更少状态开销的 gas 存储机制。通过阅读本文你将理解以太坊 refund退款机制的运作原理、GasToken 套利模式的缺陷以及 EIP-3322 如何借助现有退款计数器的 50% DoS 防护来构建受控的 gas 弹性供给同时我们会逐行验证提案附带的 EVM 字节码测试用例并梳理其与 EIP-1884、EIP-2200、EIP-3529 等 EIP 的关联脉络。提案概览与当前状态EIP-3322 由 William Morrisswjmelements于 2020-03-04 提出类别为Standards Track / Core当前状态为Stagnant停滞即该提案目前未被纳入任何以太坊网络升级文中描述的操作码与 gas 定价均属于提案层面的设计尚未在主网生效。该提案的核心主张可以浓缩为一句话允许合约账户把 gas 存起来并在之后转移给执行上下文的退款计数器使用。提案的 Abstract 明确给出了三层设计合约可以持久化persistgas留待后续转移给退款计数器为此引入三个新操作码这三个操作码分别负责读取read、**增加add to和使用use**这个 gas 计数器。背景refund 机制与 GasToken 的两难要理解 EIP-3322 的价值必须先理解它想解决的问题——GasToken 对退款机制的利用。以太坊的 gas 退款refund机制最初由 EIP-2200Structured Definitions for Net Gas Metering 等提案系统性定义当SSTORE将存储槽清零、或SELFDESTRUCT销毁合约时会向执行上下文的退款计数器refund counter写入 gas交易结束时统一结算。EIP-2200 定义了SLOAD_GAS、SSTORE_SET_GAS、SSTORE_RESET_GAS、SSTORE_CLEARS_SCHEDULE等定价参数其中SSTORE_RESET_GAS为5000、SSTORE_CLEARS_SCHEDULE为15000——这正是 EIP-3322 为USEGAS5000和STOREGAS5000 amount定价时参考的两个锚点。问题在于退款机制被 GasToken 演变成了一种跨区块的 gas 套利工具。EIP-3322 的 Motivation 对此的表述非常直白The refund mechanism is currently being used by gas tokens to arbitrage gas price. This brings gas supply elasticity and price stability by moving gas from blocks with less demand to blocks with more demand. Unfortunately this rewards unnecessary state growth.即GasToken 通过在低费区块囤积gas、在高费区块释放gas确实带来了 gas 供给弹性和价格稳定但代价是奖励了不必要的状态增长——因为存储槽被当作电池来储存 gas网络因此承担了大量本无意义的存储膨胀。这一判断在后续的 EIP-3529Reduction in refunds 中被再次确认refunds 加剧了状态规模state slots 被当作battery、增加了区块大小方差理论上区块实际消耗的 gas 可接近账面上限的两倍。EIP-3322 提出的解决方案方向是与其让 GasToken 通过污染状态来存储 gas不如在协议层提供一个一等公民的 gas 存储机制——即账户级 gas 退款计数器。这样一来gas 市场所需的存储与计算开销都会显著降低。核心规范账户级 gas 退款计数器与三个操作码状态模型每个合约账户新增一个计数器规范的第一步是定义状态变化Contract accounts gain an unsigned gas refund counter, initially zero.即每个合约账户新增一个无符号 gas 退款计数器unsigned gas refund counter初始值为 0。该计数器属于账户状态随账户持久化。同时提案强调由于大多数账户不会存储任何 gas每个账户的存储开销在常规情况下应当极小甚至为零——这为客户端实现提供了状态布局上的优化空间例如采用稀疏存储或默认零值压缩。三个新操作码操作码字节码栈行为Gas 成本语义SELFGAS0x49将当前账户的 gas 退款计数器压入栈顶与SELFBALANCE相同即GasFastStep5 gas见 EIP-1884只读不修改计数器USEGAS0x4a弹出amount将min(amount, 当前账户计数器)转入执行上下文的退款计数器5000消耗账户中存储的 gas转移给本交易的退款计数器STOREGAS0x4b弹出amount将当前账户的退款计数器增加amount5000 amount把 gas 存入账户供未来交易使用三个操作码的职责边界非常清晰SELFGAS是纯查询、USEGAS是取款、STOREGAS是存款。值得注意的是USEGAS的取款语义是截断式的——它取amount与账户计数器两者的最小值因此不会把计数器取成负数而STOREGAS的成本与存入量线性相关5000 amount意味着存款行为本身要按存入额计价从机制上避免了无限囤积。字节码定位与 SELFBALANCE、GASLIMIT 同处 0x4X 区间Rationale 中专门解释了操作码编号的选择The opcode numbers chosen are in the same0x4Xrange asSELFBALANCEandGASLIMIT.0x4X区间是 EIP-1884Istanbul 升级开辟的新操作码安置区由于0x3X区间已满SELFBALANCE被安排在0x47定价为GasFastStep5 gas。EIP-1884 当时给出的理由是SELFBALANCE仍需在缓存的trie 中查找余额且余额在执行期间并非恒定因此比同类快速操作略贵。EIP-3322 延续这一编号惯例将三个新操作码紧邻SELFBALANCE之后放置既保持编码空间整洁也与同类账户状态操作在语义上聚拢。设计原理为什么这样做是安全的、便宜的、高效的复用退款计数器的 50% DoS 防护这是整个提案最精妙的一处设计。Rationale 写道By reusing the execution contexts refund counter we can reuse its 50% DoS protection, which limits its block elasticity contribution to 2x.退款机制自引入起就带有一层 DoS 防护交易的退款上限为实际使用 gas 的一定比例最初是 50%EIP-3529 将其收紧为 1/5即MAX_REFUND_QUOTIENT 5。由于退款只发生在交易结束结算时、且被上限钳制攻击者无法借助退款让区块实际消耗超过限额的执行资源。EIP-3322 让USEGAS直接把账户中存储的 gas 转入执行上下文已有的退款计数器而不是另起炉灶——这样它就自动继承了既有的 50%后为 20%钳制将整个机制对区块弹性block elasticity的贡献严格限制在 2 倍以内无需设计新的防护逻辑。定价参照SELFBALANCE 与 SSTORERationale 明确说明 gas 成本的设计依据The gas costs are based on similar opcodesSELFBALANCEandSSTORE.SELFGAS与SELFBALANCE同价两者都是对当前账户自身状态的只读访问无需从栈上取地址、天然命中缓存工作量相当USEGAS定价 5000对齐SSTORE_RESET_GASEIP-2200 定义的非零值覆写成本因为它本质上是修改账户状态消耗计数器与一次存储重置的成本相当STOREGAS定价5000 amount其中 5000 对应状态写入的基准成本amount则是对存入额的线性计价类似SSTORE中按写入内容量级计费的思路。常规情况零开销Most accounts will store no gas, so the per-account storage overhead should be minimal or even zero in the normal case.对于绝大多数不参与 gas 存储的账户其计数器恒为 0客户端可采用默认值压缩或稀疏索引的方式避免为每个账户引入固定存储开销。测试用例逐行验证提案附带的测试用例表是理解操作码行为的最佳素材。表格各列含义如下CodeEVM 字节码序列Used Gas执行该序列消耗的 gasRefund执行结束后执行上下文退款计数器中的值Original执行前账户 gas 退款计数器的初始值Final执行结束后账户 gas 退款计数器的终值。CodeUsed GasRefundOriginalFinal0x6000490050030000x6003490050032200x6003490050033300x6003490050033410x60034960034900100064400x60034960034900100066600x484900501010000010000000x61ffff4a00705380065535用规范中的操作码语义逐一验算可以确认这些测试的行为逻辑0x60004900PUSH1 0 → 0x49 → STOPUsed Gas 3PUSH1 50000x49 5003。若此处 0x49 为读取型操作则账户计数器不变Original 0、Final 0、Refund 0。✓0x60034900PUSH1 3 → 0x49 → STOP的三种变体Used Gas 恒为 5003若 0x49 对应USEGAS的取款语义取min(amount, counter)Original 2 时min(3, 2) 2转入 RefundFinal 2 − 2 0✓Original 3 时min(3, 3) 3转入 RefundFinal 0✓Original 4 时min(3, 4) 3转入 RefundFinal 4 − 3 1。✓0x60034960034900连续两次取款每次 amount 3Used Gas 2 × (3 5000) 10006。Original 4 时第一次取min(3,4)3计数器余 1第二次取min(3,1)1计数器归零Refund 累计 4。✓ Original 6 时两次各取 3Refund 6、Final 0。✓0x61ffff4a00PUSH2 0xffff → 0x4a → STOP若 0x4a 对应STOREGAS的存款语义成本为5000 65535加上 PUSH2 的 3 gas恰好等于 70538账户计数器从 0 增至 65535Refund 保持 0。✓以上验算显示提案的测试表直接验证了USEGAS取款与STOREGAS存款的核心行为取款受账户余额钳制、存款按量计费、读写均产生 5000 gas 级别的状态写入成本。需要说明的是测试表中的操作码字节0x49 表现出取款行为、0x4a 表现出存款行为与最终规范正文中的编号0x49SELFGAS、0x4aUSEGAS、0x4bSTOREGAS存在对应关系上的偏差这反映了提案在停滞前编号方案曾有过调整阅读测试用例时应以其行为语义为准。兼容性与安全考量向后兼容Because the gas is added to the refund counter, no compatibility issues are anticipated.EIP-3322 认为自身几乎不引入兼容性问题理由有二其一新增操作码与新增账户字段不影响既有操作码的语义其二由于USEGAS把 gas 注入的是交易结算时统一处理的退款计数器而非执行过程中的可用 gasrefund 机制自 EIP-3529 起就明确refunds are only applied after transaction execution因此不会改变任何调用帧在执行期间可用的 gas 量已部署合约的执行路径不受影响。安全考量DoS is already limited by the 50% refund limit.提案的 Security Considerations 只有这一句却点明了整个设计的安全基础gas 存储机制最危险的滥用场景——通过低价存储、高价释放制造区块执行资源波动——已经被退款计数器既有的 50% 上限提案写作时天然约束。后续 EIP-3529 将钳制进一步收紧为gas_used // 5并论证了退款上限对存储写密集型 DoS 攻击的限制能力最多放大 25% 的存储写操作量如果 EIP-3322 在未来被重新激活其安全边界会随之一并收紧。生态定位与相关 EIP 的关系图谱EIP-3322 并不是孤立的提案它处于一条关于gas 弹性与退款机制的演进脉络中理解这条脉络有助于把握它的设计取舍EIP-1884Repricing for trie-size-dependent opcodes引入SELFBALANCE0x475 gas并说明0x4X是新操作码安置区间——EIP-3322 的三个操作码正是沿用了这一编号空间与定价风格。EIP-2200Net Gas Metering系统定义了退款计数器的增删规则与SSTORE定价参数SSTORE_RESET_GAS 5000是 EIP-3322 定价与复用退款计数器设计的直接参考。EIP-3529Reduction in refunds/EIP-3403Partial removal of refunds/EIP-3298Remove storage-clear refund and refund cap这三份提案代表了以太坊社区对退款机制的另一条治理路径——收缩乃至移除refund以消除 GasToken 与区块大小方差问题。EIP-3322 则代表了与之相对的路径把 gas 存储内建于协议让弹性供给以更低的状态开销实现。两者目标一致降低 GasToken 对网络的损害手段相反。EIP-2583Penalty for account trie misses同期针对账户状态访问的定价讨论其操作码影响面分析中提到SELFBALANCE不受 trie-miss 惩罚影响因为访问的是自身账户——这一分析同样适用于SELFGAS这类自引用操作码的定价合理性。从最终结果看以太坊选择了 EIP-3529 收缩退款的路径EIP-3322 因而长期处于 Stagnant 状态。但作为一篇研究性文档它系统展示了一种用协议内建状态替代隐性状态滥用的 EVM 扩展设计范式新的状态字段如何最小化常规开销、新操作码如何复用既有安全机制、gas 定价如何锚定既有操作码——这些方法论至今仍值得 EVM 设计者与客户端实现者参考。总结EIP-3322 提出了一套完整、自洽的账户级 gas 存储方案以每个合约账户一个无符号计数器为状态基础以SELFGAS读取5 gas、USEGAS取款5000 gas受余额钳制、STOREGAS存款5000 amount gas为操作接口通过复用执行上下文退款计数器及其 50%后为 20%钳制在不引入全新安全机制的前提下实现了受控的 gas 弹性供给。其测试用例表给出了可直接验证的字节码与预期值文档中的定价锚点SELFBALANCE、SSTORE与编号策略0x4X 区间也都能在 EIP-1884 与 EIP-2200 中找到明确的出处。尽管该提案最终未获采纳它仍是研究以太坊退款机制治理历史与 EVM 操作码设计原则的重要文献。版权说明本提案内容遵循 CC0 协议放弃版权参见 LICENSE.md。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表