市值: $2.1591T 2.61%
成交额(24h): $74.6886B -50.71%
恐惧与贪婪指数:

15 - 极度恐惧

  • 市值: $2.1591T 2.61%
  • 成交额(24h): $74.6886B -50.71%
  • 恐惧与贪婪指数:
  • 市值: $2.1591T 2.61%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

Solidity 中的不可变变量和常量是什么?它们如何节省 Gas?

Immutable variables in Solidity are set once in the constructor and save gas by avoiding costly storage writes, while constants are compile-time literals embedded directly in bytecode for zero-cost access.

2025/11/13 04:40

了解 Solidity 中的不可变变量

1. Solidity 中的不可变变量是使用immutable关键字声明的,并且只能在合约构建期间赋值一次。一旦设置,它们的值就无法在合约的整个生命周期中更改。

2. 这些变量在部署时解析,允许编译器通过将它们放置在合约的元数据中而不是放置在用于常规状态变量的存储槽中来优化存储。

3. 由于不可变变量不占用可变存储,因此部署后无需进行 SSTORE 操作,这是以太坊中最昂贵的操作码之一。

4. 不可变变量的值通常在构造函数内分配,这使其非常适合部署时已知但同一合约的实例之间存在差异的参数。

5. 使用不可变通过表明意图来提高代码清晰度——开发人员知道某些值在部署后是固定的,从而降低了意外修改的风险。

常数在气体优化中的作用

1. 常量是使用constant关键字定义的,并且必须在声明时赋值。它们的值在编译期间被硬编码到字节码中。

2. 由于常量值直接嵌入到 EVM 指令中,因此读取它们不会产生存储访问成本,这意味着检索其值时不会执行 SLOAD 操作。

3. 任何使用常量的函数都会内联该值,从而在编译时将变量引用有效地替换为其文字值。

4. 这种内联行为减少了执行费用和合约大小,因为不需要为这些值分配或引用持久存储。

5. 常量最适合在所有部署中真正静态的值,例如计算中使用的协议参数或数学系数。

不可变和常量之间的区别

1. 虽然两者都通过避免运行时存储成本来节省gas,但常量要求在编译时知道它们的值,而不可变则允许在构造期间分配。

2. 常量不能依赖于任何输入或外部状态——它必须是编译时常量表达式,例如数字、字符串或具有常量输入的纯函数调用的结果。

3. 不可变变量提供更大的灵活性;它们可以采用构造函数参数,使不同的合约实例具有不同的值,同时仍然受益于降低的运行时成本。

4. 从gas使用的角度来看,常量通常会提供稍微更好的优化,因为它们的值在部署之前就已经完全解析,而不可变则涉及在构建期间的一次性初始化。

5. 滥用任何一种类型(例如将经常更改的值声明为不可变的值)都可能导致设计不灵活,因此正确的用例对齐至关重要。

天然气节省机制解释

1. 使用 SLOAD 从 EVM 存储中进行的每次读取至少消耗 2100 个 Gas,而访问存储在代码空间中的值(如常量)的成本接近于零。

2. 使用 SSTORE 写入存储的成本甚至更高,首次写入时花费高达 20,000 Gas,后续更新花费 5,000 Gas - 不可变在构建后完全避免了这一成本。

3. 通过将数据从存储转移到代码或构造函数初始化的内存区域,常量和不可变变量都减少了智能合约的操作足迹。

4. 严重依赖配置值(例如费用百分比、地址允许列表或代币上限)的合约在将这些值声明为常量或不可变时会显着受益。

5. 编译器优化利用这些声明来最大限度地减少冗余操作,去除不必要的检查,并生成更精简的字节码,进一步提高效率。

常见问题解答

构造函数运行后可以更改不可变变量吗?不可以。一旦在构造函数中设置了不可变变量,就无法对其进行修改。任何重新分配它的尝试都会导致编译错误。

哪些类型可以声明为常量有限制吗?是的。只有像 uint、int、bool、address 和字符串文字(有一些限制)这样的值类型可以是常量。数组和结构不能声明为常量,除非它们在内联汇编中或由较新的编译器版本处理的特殊情况。

不可变变量会增加部署 Gas 成本吗?由于构造函数逻辑,它们可能会稍微增加部署成本,但这可以通过交互过程中的长期节省来抵消。多次交易的净效应通常是总 Gas 支出的显着减少。

如果我尝试在构造函数外部分配不可变变量,会发生什么情况? Solidity 编译器会抛出错误。不可变变量的分配仅限于构造函数上下文,以确保其完整性和可预测性。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

2026-06-06 02:54:55

合同结算机制1. Bybit的线性永续合约以USDT结算,这意味着所有盈亏计算、保证金要求和清算门槛均以稳定币单位计价。 2.反向永续合约以BTC本身结算,因此每笔交易都会直接影响交易者的BTC余额——收益会增加BTC持有量,而损失会减少BTC持有量。 3. 反向合约的定价引擎使用 BTC/USDT...

如何识别和避免止损、欺骗等期货市场操纵行为?

如何识别和避免止损、欺骗等期货市场操纵行为?

2026-06-07 14:20:10

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

2026-06-04 16:40:15

账户级损失限额配置1. 使用双因素身份验证通过网络或移动应用程序登录您的 Bybit 帐户。 2. 导航至“资产”部分,然后从左侧菜单中选择“风险管理”。 3. 选择“每日损失限制”并将该功能切换为“开”以激活控制。 4. 输入代表当前交易日 USDT 最大允许净亏损的数值。 5. 使用您的电子邮件...

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

2026-06-05 04:59:43

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少每个区块新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将使其达到 3.1...

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

2026-06-04 03:59:47

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何处理美国加密货币期货交易利润的税务影响?

如何处理美国加密货币期货交易利润的税务影响?

2026-05-29 18:19:59

Bitcoin 减半机制1. Bitcoin 的协议强制规定 2100 万枚代币的固定供应上限,并通过区块奖励引入新单位。 2. 每 210,000 个区块(大约每四年)区块奖励就会减少一半,这个过程称为减半。 3. 最近一次减半发生在 2024 年 4 月,每个区块的奖励从 6.25 BTC 减少...

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

在Bybit上进行BTC交易如何选择线性永续合约和反向永续合约?

2026-06-06 02:54:55

合同结算机制1. Bybit的线性永续合约以USDT结算,这意味着所有盈亏计算、保证金要求和清算门槛均以稳定币单位计价。 2.反向永续合约以BTC本身结算,因此每笔交易都会直接影响交易者的BTC余额——收益会增加BTC持有量,而损失会减少BTC持有量。 3. 反向合约的定价引擎使用 BTC/USDT...

如何识别和避免止损、欺骗等期货市场操纵行为?

如何识别和避免止损、欺骗等期货市场操纵行为?

2026-06-07 14:20:10

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

如何在Bybit上设置风险管理规则来限制我的每日最大损失?

2026-06-04 16:40:15

账户级损失限额配置1. 使用双因素身份验证通过网络或移动应用程序登录您的 Bybit 帐户。 2. 导航至“资产”部分,然后从左侧菜单中选择“风险管理”。 3. 选择“每日损失限制”并将该功能切换为“开”以激活控制。 4. 输入代表当前交易日 USDT 最大允许净亏损的数值。 5. 使用您的电子邮件...

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

如何在币安上启用投资组合保证金模式以降低我的保证金要求?

2026-06-05 04:59:43

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少每个区块新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将使其达到 3.1...

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

如何将我的未平仓期货头寸从币安迁移到Bybit而不平仓?

2026-06-04 03:59:47

Bitcoin 减半机制1. Bitcoin 的协议强制执行固定的发行时间表,其中大约每 210,000 个区块,区块奖励就会减少一半。 2. 该事件大约每四年发生一次,直接减少了新进入流通的 BTC 数量。 3.截至2020年减半,矿工每区块获得6.25 BTC;下一次减少将达到 3.125 BT...

如何处理美国加密货币期货交易利润的税务影响?

如何处理美国加密货币期货交易利润的税务影响?

2026-05-29 18:19:59

Bitcoin 减半机制1. Bitcoin 的协议强制规定 2100 万枚代币的固定供应上限,并通过区块奖励引入新单位。 2. 每 210,000 个区块(大约每四年)区块奖励就会减少一半,这个过程称为减半。 3. 最近一次减半发生在 2024 年 4 月,每个区块的奖励从 6.25 BTC 减少...

查看所有文章

User not found or password invalid

Your input is correct