当前位置: 首页 > news >正文

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

常量的注意事项

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

相关文章:

  • SSM 框架整合教程:从环境搭建到 CRUD 实现
  • html页面,一个控件,可以粘贴图片和样式,一直按enter键会将下面内容推下去
  • OrCAD 24.1补丁005中文界面切换指南
  • QT Android 如何打包大文件到目录下?
  • 【Pandas】pandas DataFrame from_records
  • Android开发中几种scope的对比
  • ClickHouse JSON 解析
  • Kubernetes Dashboard UI 部署安装
  • stm32计时的两个方法
  • HarmonyOS学习记录4
  • 基于U-net的高阶心音信号去噪系统设计与实现
  • SSE方式调用php,不是直接 post,
  • 【C++基础语法】
  • STM32F103之ModBus\RS232\RS422\RS485
  • 瑞幸X多邻国“疯感”营销:以情感共鸣取代硬广触达
  • Qt开发:QtConcurrent介绍和使用
  • Python正则表达式实战指南
  • 深度学习13(经典卷积网络结构+卷积网络结构优化)
  • J1939协议
  • 个体户核定多地暂停,将不再享受核定征收?
  • 人工智能-基础篇-29-什么是低代码平台?
  • 大数据学习6:Sqoop数据迁移工具
  • ArcGIS 打开 nc 降雨量文件
  • MinerU2将PDF转成md文件,并分拣图片
  • TB6612电机驱动
  • [注解: @ComponentScan]-原理分析
  • Cloudflare 发布容器服务公测版:边缘计算新时代来临?
  • 职坐标:嵌入式AI边缘计算实战
  • React 实现五子棋人机对战小游戏
  • FFmpeg Windows安装