市值: $2.5665T -2.09%
成交额(24h): $64.1207B 43.32%
恐惧与贪婪指数:

33 - 恐惧

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

选择语种

选择语种

选择货币

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

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),我们将及时删除。

相关百科

如何计算持有 BTCUSDT 期货头寸的总成本

如何计算持有 BTCUSDT 期货头寸的总成本

2026-10-26 04:06:35

BTCUSDT 期货头寸的总成本构成1. 持有BTCUSDT期货头寸的总成本包括显性费用和隐性费用。显性成本包括开仓和平仓交易费用,而隐性成本主要来自一段时间内的资金费率支付或收入。 2. 开仓费用按照入场时的名义价值与交易所的吃单/挂单费用表的乘积计算——对于主要平台上的吃单来说,开仓费用通常在 ...

如何同时监控 XRPUSDT 资金费率和未平仓合约

如何同时监控 XRPUSDT 资金费率和未平仓合约

2026-10-20 18:39:42

XRPUSDT 永续合约的资金费率机制1. XRPUSDT永续合约的资金费率每八小时计算一次,使用XRP和USDT计价借贷市场之间的溢价指数和利差。 2. Binance、Bybit 和 OKX 等交易所在其衍生品 API 端点中发布实时资金费率数据,从而实现仪表板或警报系统的自动摄取。 3. 正的...

如何设置 SOLUSDT 永续合约盈亏平衡止损

如何设置 SOLUSDT 永续合约盈亏平衡止损

2026-10-23 09:34:18

了解盈亏平衡止损机制1. 盈亏平衡止损是一种动态订单,随着头寸盈利变动而向上调整,执行时锁定零净损失。 2. 它仅在交易达到预定利润阈值后才起作用——通常是初始风险或入场费的 1 至 2 倍。 3. 在币安 SOLUSDT 永续合约上,此逻辑必须手动触发或编写脚本,因为本机交易所 UI 不会自动将止...

如何使用币安期货计算器进行 ETHUSDT 交易

如何使用币安期货计算器进行 ETHUSDT 交易

2026-10-21 02:00:11

了解币安期货计算器界面1. 该计算器直接嵌入币安合约交易界面中,可通过订单输入面板下的 ETHUSDT 永续合约页面访问。 2. 随着用户调整输入字段(包括仓位大小、入场价格、杠杆水平以及止盈或止损水平),它会动态更新。 3. 接受多种格式的输入值:合约数量(ETH)、名义价值(USDT)或保证金金...

合约强平前如何查看BTCUSDT标记价格

合约强平前如何查看BTCUSDT标记价格

2026-10-26 12:20:18

了解BTCUSDT期货的标记价格1. 标记价格是交易所为防止市场波动期间出现不公平清算而使用的计算值。 2.反映了来自多个来源的公平、稳定的参考价格,包括指数价格和资金费率。 3. 与最新成交价不同,标记价格包含来自顶级现货交易所的时间加权平均值,以降低操纵风险。 4. 在币安上,BTCUSDT标记...

如何调整 TRUMPUSDT 永续合约的杠杆

如何调整 TRUMPUSDT 永续合约的杠杆

2026-10-30 22:19:37

了解 TRUMPUSDT 永续合约机制1. TRUMPUSDT 是在多个一级衍生品交易所上市的主题永续期货合约,旨在跟踪围绕美国政治叙事而非基础资产基本面的价格情绪。 2、根据平台不同,采用标准的反向或线性结算逻辑,以USDT作为报价和保证金资产。 3. 合约使用的标记价格源自现货 BTC/USDT...

如何计算持有 BTCUSDT 期货头寸的总成本

如何计算持有 BTCUSDT 期货头寸的总成本

2026-10-26 04:06:35

BTCUSDT 期货头寸的总成本构成1. 持有BTCUSDT期货头寸的总成本包括显性费用和隐性费用。显性成本包括开仓和平仓交易费用,而隐性成本主要来自一段时间内的资金费率支付或收入。 2. 开仓费用按照入场时的名义价值与交易所的吃单/挂单费用表的乘积计算——对于主要平台上的吃单来说,开仓费用通常在 ...

如何同时监控 XRPUSDT 资金费率和未平仓合约

如何同时监控 XRPUSDT 资金费率和未平仓合约

2026-10-20 18:39:42

XRPUSDT 永续合约的资金费率机制1. XRPUSDT永续合约的资金费率每八小时计算一次,使用XRP和USDT计价借贷市场之间的溢价指数和利差。 2. Binance、Bybit 和 OKX 等交易所在其衍生品 API 端点中发布实时资金费率数据,从而实现仪表板或警报系统的自动摄取。 3. 正的...

如何设置 SOLUSDT 永续合约盈亏平衡止损

如何设置 SOLUSDT 永续合约盈亏平衡止损

2026-10-23 09:34:18

了解盈亏平衡止损机制1. 盈亏平衡止损是一种动态订单,随着头寸盈利变动而向上调整,执行时锁定零净损失。 2. 它仅在交易达到预定利润阈值后才起作用——通常是初始风险或入场费的 1 至 2 倍。 3. 在币安 SOLUSDT 永续合约上,此逻辑必须手动触发或编写脚本,因为本机交易所 UI 不会自动将止...

如何使用币安期货计算器进行 ETHUSDT 交易

如何使用币安期货计算器进行 ETHUSDT 交易

2026-10-21 02:00:11

了解币安期货计算器界面1. 该计算器直接嵌入币安合约交易界面中,可通过订单输入面板下的 ETHUSDT 永续合约页面访问。 2. 随着用户调整输入字段(包括仓位大小、入场价格、杠杆水平以及止盈或止损水平),它会动态更新。 3. 接受多种格式的输入值:合约数量(ETH)、名义价值(USDT)或保证金金...

合约强平前如何查看BTCUSDT标记价格

合约强平前如何查看BTCUSDT标记价格

2026-10-26 12:20:18

了解BTCUSDT期货的标记价格1. 标记价格是交易所为防止市场波动期间出现不公平清算而使用的计算值。 2.反映了来自多个来源的公平、稳定的参考价格,包括指数价格和资金费率。 3. 与最新成交价不同,标记价格包含来自顶级现货交易所的时间加权平均值,以降低操纵风险。 4. 在币安上,BTCUSDT标记...

如何调整 TRUMPUSDT 永续合约的杠杆

如何调整 TRUMPUSDT 永续合约的杠杆

2026-10-30 22:19:37

了解 TRUMPUSDT 永续合约机制1. TRUMPUSDT 是在多个一级衍生品交易所上市的主题永续期货合约,旨在跟踪围绕美国政治叙事而非基础资产基本面的价格情绪。 2、根据平台不同,采用标准的反向或线性结算逻辑,以USDT作为报价和保证金资产。 3. 合约使用的标记价格源自现货 BTC/USDT...

查看所有文章

User not found or password invalid

Your input is correct