Constants
本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 + 解说 + 提示”的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。
Solidity 是以太坊等智能合约平台使用的主要编程语言,就像写网页要用 HTML 和 JavaScript,写智能合约就需要会 Solidity。
如果你从没写过区块链代码也没关系,只要你了解一点点编程概念,比如“变量”“函数”“条件判断”,我们就能从最简单的例子开始,一步步建立你的 Solidity 编程思维。
Constants
常量是不能修改的变量。
常量的值是硬编码(固定写死)的,使用常量可以节省 Gas 成本。
// SPDX-License-Identifier: MIT
// 声明代码采用 MIT 开源许可证,这是一种常见的开源许可协议,允许自由使用、修改和分发代码。pragma solidity ^0.8.26;
// 指定 Solidity 编译器版本必须大于或等于 0.8.26 并且小于 0.9.0。
// `pragma` 指令确保合约使用兼容的编译器版本,`^0.8.26` 表示支持 0.8.26 或更高版本(但不超过 0.9.0)。contract Constants {// 定义一个名为 `Constants` 的智能合约。// 合约是一个运行在以太坊区块链上的程序,包含数据(状态变量)和逻辑(函数)。// 这个合约的目的是展示 Solidity 中的常量(constants)。// Constants are variables that cannot be modified.// 常量是不可修改的变量。// Their value is hard coded and using constants can save gas cost.// 常量的值是硬编码(固定写死)的,使用常量可以节省 Gas 成本。// coding convention to uppercase constant variables// 编码规范:常量变量通常使用全大写字母命名。address public constant MY_ADDRESS =0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;// 声明一个名为 `MY_ADDRESS` 的常量,类型为 `address`(以太坊地址,20 字节)。// `constant` 关键字表示这个变量的值在定义后不可修改。// 初始化值为一个固定的以太坊地址 `0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc`。// `public` 关键字表示该常量可以被外部访问,Solidity 会自动为其生成一个 getter 函数。// 按照命名规范,常量通常用全大写字母(如 `MY_ADDRESS`)。uint256 public constant MY_UINT = 123;// 声明一个名为 `MY_UINT` 的常量,类型为 `uint256`(256 位无符号整数,范围从 0 到 2^256-1)。// `constant` 关键字表示这个变量的值不可修改。// 初始化值为 123。// `public` 允许外部访问,并生成 getter 函数。// 同样遵循全大写命名规范。
}
Constants
是一个简单的智能合约,展示了 Solidity 中的常量(constants)。常量是一种特殊的变量,它们的值在合约部署时就固定了,之后不能被修改。
代码做什么?
- 定义常量:
MY_ADDRESS
存储一个固定的以太坊地址。MY_UINT
存储一个固定的数字123
。
- 不可修改:因为使用了
constant
关键字,这两个变量的值在合约部署后不能被改变。 - 公开访问:因为是
public
,外部可以通过 getter 函数读取这些常量的值(例如MY_ADDRESS()
和MY_UINT()
)。 - 节省 Gas:常量在区块链上存储时比普通状态变量更节省 Gas,因为它们的值是硬编码的,编译器可以优化存储和访问。
关键点
- 常量的特点:
- 使用
constant
关键字定义。 - 值在合约部署时固定,之后不可修改(硬编码)。
- 通常用于存储不会改变的数据(如固定地址、配置值)。
- 使用
- Gas 优化:
- 常量不像普通状态变量那样需要动态存储空间,编译器会将它们的值内联到代码中,减少存储和访问的 Gas 成本。
- 例如,
MY_UINT
的值123
可能直接嵌入到调用它的函数中,而不是每次从区块链存储中读取。
- 命名规范:
- 常量通常用全大写字母命名(如
MY_ADDRESS
),以区别于普通变量。 - 这是一个社区约定,便于代码可读性。
- 常量通常用全大写字母命名(如
- 状态变量:
- 尽管是常量,
MY_ADDRESS
和MY_UINT
仍然是状态变量,存储在区块链上(storage
)。 public
提供了外部访问的 getter 函数,调用这些函数是view
操作,链下调用免费。
- 尽管是常量,
- 用途:
- 常量常用于存储合约中固定的配置值,例如管理员地址、最大限制值、协议参数等。
常量的注意事项
- 不可修改:尝试修改常量(如
MY_ADDRESS = newAddress;
)会导致编译错误。 - 硬编码:常量的值必须在编译时确定,不能在运行时动态设置(与
immutable
不同)。 - 命名规范:虽然不强制,但全大写命名是最佳实践,方便区分常量和普通变量。
- Gas 优化:常量适合存储不会改变的值(如固定地址、配置参数),可以减少存储和访问成本。
- 限制:常量不能用于复杂数据类型(如动态数组
uint[]
或映射mapping
),仅支持值类型(如uint256
、address
、bytes32
)。