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.pswp.cn/web/88696.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五镜头倾斜摄影相机的技术优势与应用原理

倾斜摄影技术作为三维实景建模的核心手段,其硬件设计直接影响数据采集效率与模型质量。在众多镜头配置方案中,五镜头结构(下视前、后、左、右四个倾斜视角)已成为行业主流选择。这一设计并非偶然,而是基于严苛的技术需…

ThinkSound V2版 - 一键给无声视频配音,为AI视频生成匹配音效 支持50系显卡 一键整合包下载

ThinkSound 是阿里通义实验室开源的首个音频生成模型,它能够让AI像专业“音效师”一样,根据视频内容生成高度逼真、与视觉内容完美契合的音频。 ThinkSound 可直接应用于影视后期制作,为AI生成的视频自动匹配精准的环境噪音与爆炸声效&#x…

如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)

一、前言 从0开始基于自定义Agent构建AI应用,涉及从创建智能Agent到使用、测试及优化提示词等一系列步骤。前置:什么是LLM、Prompt、Mcp和Agent? 二、步骤一:规划和设计AI应用 在创建AI应用之前,你需要明确应用的目标…

Java ThreadLocal详解:从原理到实践

Java ThreadLocal详解:从原理到实践(图解极简示例) 一、什么是ThreadLocal?——线程的"专属储物柜" ThreadLocal 是 Java 提供的线程本地存储机制,通俗来说,它能为每个线程创建一个独立的变量副本…

如何在 Visual Studio Code 中使用 Cursor AI

在当今快节奏的开发环境中,像 Cursor AI 这样的 AI 工具正在彻底改变开发人员编写和管理代码的方式。Cursor AI 通过提供智能代码建议、自然语言编辑和多文件项目更新功能,增强了“ Visual Studio Code (VS Code )”的功能,所有这些功能均由 …

阿里面试:服务与发现 ,该选择 CP 还是 AP?为什么?

说在前面 最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 服务注册发现,该选 AP 还是 CP? 为什么? 最近有小伙伴在面 阿里。 小伙…

模拟实现Vue2-Vue3响应式更新

Vue2作为 MVVM框架/* Vue2 通过 Object.defineProperty 监听、挟持数据,实现响应式 并通过 Dep(依赖收集器) 和 Watcher 实现依赖收集,通知视图更新 *//* 但是 Vue2用Object.defineProperty 无法监听新增属性、无法监听数组索引变…

一文理解锂电池充电、过放修复与电量测量:从原理到实战

一、为什么要看这篇文章? 手机电量突然从20%跳到0%?电动车冬天续航腰斩?18650过放后还能救吗? 本文用一张思维导图一张表格一段口诀,一次性讲透锂电池的充电四阶段、过放修复全方案、电量测量底层原理,并给…

【爬虫】01 - 爬虫原理及其入门

爬虫01 - 爬虫原理及其入门 文章目录爬虫01 - 爬虫原理及其入门一:爬虫原理1:爬虫的优势‌2:爬虫的核心库3:经典举例4:合规问题一:爬虫原理 学习爬虫之前前置知识需要了解这些: 我的HTTP介绍, 了…

React对于流式数据和非流式数据的处理和优化

React 在处理流式数据和非流式数据时,可以借助其组件模型、状态管理以及 React 18 引入的并发特性来实现高效的数据处理与渲染优化。 文章目录一、流式数据(Streaming Data)1. 定义2. 常见来源3. 处理方式使用 useState / useReducer 管理状态…

3、Vue 中使用 Cesium 实现可拖拽点标记及坐标实时显示功能

在 Cesium 地图开发中,实现点标记的拖拽交互并实时显示坐标信息是一个常见的需求。本文将详细介绍如何在 Vue 框架中使用 Cesium 的 Primitive 方式创建点标记,并实现拖拽功能及坐标提示框跟随效果。先看效果图功能实现概述我们将实现的功能包括&#xf…

Anthropic:从OpenAI分支到AI领域的领军者

自2021年由前OpenAI高管Dario和Daniela Amodei创立以来,Anthropic已迅速崛起为人工智能(AI)领域的重要力量。 公司专注于开发安全、可控且具备深度推理能力的AI系统,其Claude系列模型在生成式AI领域取得了显著成就。 此外&#xf…

前端开发中的输出问题

前端开发中的输出问题:console.log输出[object Object]在前端开发中,一个常见问题是使用console.log输出对象时显示为[object Object],而不是对象的详细内容。这通常发生在开发者试图直接打印对象时,浏览器默认只显示对象的字符串…

DSSA(Domain-Specific Software Architecture)特定领域架构

DSSA(Domain-Specific Software Architecture) 定义:针对特定应用领域设计的可复用软件架构,为领域内产品族提供统一基础。 目标: ✅ 最大化复用(需求/设计/代码)✅ 保证系统一致性✅ 降低开发成…

单调栈单调队列【算法进阶】

这周学完之后最大的收获就是单调栈和单调队列了!!!感觉好厉害能把时间复杂度瞬间压缩为O(N),不行我必须再纪念一下这么美妙的算法!!! 单调栈问题: 如果题目要求一个元素左边或右边…

C++编程基础

编程题一问题分析 题目要求使用 n 根小木棒,按照特定的方式排列,形成一个数字。具体规则如下: 每个数字由小木棒组成,例如: 1 需要 2 根小木棒。0 需要 6 根小木棒。其他数字(如 2, 3, 4, 5, 6, 7, 8, 9&am…

张量拼接操作

一.前言本章节来介绍一下张量拼接的操作,掌握torch.cat torch.stack使⽤,张量的拼接操作在神经⽹络搭建过程中是⾮常常⽤的⽅法,例如: 在后⾯将要学习到的残差⽹络、注意⼒机 制中都使⽤到了张量拼接。二.torch.cat 函数的使用torch.cat 函数…

Dify 连接本地 SpringAI MCP Server

Dify 连接本地 SpringAI MCP server 连接 MCP server 的方式大致有两种,一种是基于 stdio,一种是基于 sse,如果对于稳定和性能好的方案的话,sse 要比 stdio 好的多,所以本文采用的是基于 sse 和 Spring AI 部署本地 MC…

基于 Python 的数据分析技术综述

先说一点个人的看法“”MDX、OLAP(Mondrian)技术更适合构建面向业务用户的标准化分析产品,尤其当产品需要满足以下特点时:分析维度固定(如时间、区域、产品类别);需支持高并发查询(如…

Live555-RTSP服务器

RTSP Server创建 RTSP服务器初始化: RTSPServer::createNew->new RTSPServer::RTSPServer->GenericMediaServer::GenericMediaServer->turnOnBackgroundReadHandling(IPV4sock/IPV6sock,incomingConnectionHandlerIPv4)如上流程,创建RTSP服务器…