Constants

发布于:2025-07-14 ⋅ 阅读:(13) ⋅ 点赞:(0)

本节是《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_ADDRESSMY_UINT 仍然是状态变量,存储在区块链上(storage)。
    • public 提供了外部访问的 getter 函数,调用这些函数是 view 操作,链下调用免费。
  • 用途:
    • 常量常用于存储合约中固定的配置值,例如管理员地址、最大限制值、协议参数等。

常量的注意事项

  • 不可修改:尝试修改常量(如 MY_ADDRESS = newAddress;)会导致编译错误。
  • 硬编码:常量的值必须在编译时确定,不能在运行时动态设置(与 immutable 不同)。
  • 命名规范:虽然不强制,但全大写命名是最佳实践,方便区分常量和普通变量。
  • Gas 优化:常量适合存储不会改变的值(如固定地址、配置参数),可以减少存储和访问成本。
  • 限制:常量不能用于复杂数据类型(如动态数组 uint[] 或映射 mapping),仅支持值类型(如 uint256addressbytes32)。

网站公告

今日签到

点亮在社区的每一天
去签到