ethereum - 如果require语句中的字符串超过32字节,它是否保存在2个存储槽中?坚固性

标签 ethereum solidity cryptocurrency

假设我有这样的 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/

相关文章:

ethereum - 是否可以从 Ledger Nano S 以太坊钱包导出 Xpub Key

reactjs - 警告 : Do not use <img> element. 使用 next/image 中的 <Image/> 代替

stack - CompilerError : Stack too deep, 尝试删除局部变量

cryptocurrency - 共识算法检查表

multithreading - Docker 容器而不是多处理

java - 如何使用 Java 为以太坊生成确定性 key ?

java - 从java应用程序调用智能合约函数,无需监听事件

solidity - 调用 remix.ethereum 中的外部函数

angular - 如何使用 Web3.js 将 Metamask 连接到 Angular App?