新的 gas 成本与之前的 gas 成本遵循相同的曲线,同时确保新的 gas 成本始终小于或等于之前的成本。这可以防止现有的对内存分配 gas 成本做出假设的程序导致错误,而又不会不适当地降低低于当前成本的内存。直观地,一个使用到页面边界的程序所支付的费用比旧模型少一个页面,而一个使用量超出页面边界一个字的程序所支付的费用比旧模型少一个字。
我们认为,这种增量减少不会对有效的 gas 限制产生重大影响,因为随着程序使用的 RAM 增多,它所占的比例会越来越小。
跨越两个页面的 MLOAD 和 MSTORE 的额外成本
加载或存储跨越两个内存页面的数据需要 EVM 实现做更多的工作,EVM 实现必须在页面边界处拆分字并更新两个(可能是不相交的)页面。由于我们不能保证现有 EVM 程序中的加载和存储是页对齐的,因此我们不能为了效率而禁止这种行为。相反,我们建议将每个加载或存储视为两个,以进行 gas 记帐。这不鼓励使用此功能,并考虑了额外的执行成本,而没有完全禁止它。
这将导致执行这些操作的任何程序的额外 gas 成本。我们认为这是最小的,并希望进行未来的分析以确认这一点。
向后兼容性
新的内存扩展 gas 成本函数经过专门设计,可通过始终收取小于或等于当前 EVM 收取的金额来避免向后兼容性问题。在某些情况下,现有程序将因跨越页面边界的 MLOAD 和 MSTORE 而被收取更高的费用,如上所述。我们认为这些更改将影响最少的程序,并且仅对其 gas 消耗产生很小的影响。
测试用例
待定
安全注意事项
通过对非页面对齐的读取和写入收取更多费用,可以缓解由新模型下完成的额外工作引起的潜在 CPU DoS 问题。内存扩展的费用逐渐接近当前有效的费用,因此此更改不会允许程序分配比现在可以分配的内存多得多的内存。