假设我有这样的 require 语句:
require(owner == msg.sender, "只有所有者才能调用此函数 xxxxxxxxxx");
字符串长度超过 32 个字节,所以我的问题是它是否存储在 2 个存储槽中。
如果字符串短于 32 字节,我们是否可以节省 Gas。
谢谢
最佳答案
你的假设有些正确。但它并不像“每 32 字节一个存储槽,乘以每个槽读取 2100 个 Gas 单位”那么简单。
首先,它是一个常量,因此它包含在编译后的合约字节码中(有效地存储在多个存储槽中)。根据同一槽中该字符串之前存储的字节码数量,有时甚至短于 32 字节的字符串理论上也可以分为 2 个槽。
但由于它是合约字节码的一部分,因此整个执行的函数都会加载到内存中,并从内存中返回字符串,而无需任何额外的存储读取。
因此,在合约部署期间拥有较长的错误消息会更加昂贵(需要存储较长的字节码)。但每次访问内存槽的执行成本仅增加 3 个 Gas 单位,这在大多数情况下微不足道。
示例 1 - 字节码 374 字节,执行 foo()
21510 Gas。
pragma solidity ^0.8;
contract MyContract {
function foo() external {
require(false, "Only owner can call this function xxxxxxxxxx");
}
}
示例 2 - 字节码 322 字节,执行 foo()
21492 气体。
pragma solidity ^0.8;
contract MyContract {
function foo() external {
require(false, "no");
}
}
关于ethereum - 如果require语句中的字符串超过32字节,它是否保存在2个存储槽中?坚固性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72100565/