Reading and Writing to a State Variable

本节是《Solidity by Example》的中文翻译与深入讲解,专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 + 解说 + 提示”的方式,带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。

Solidity 是以太坊等智能合约平台使用的主要编程语言,就像写网页要用 HTML 和 JavaScript,写智能合约就需要会 Solidity。

如果你从没写过区块链代码也没关系,只要你了解一点点编程概念,比如“变量”“函数”“条件判断”,我们就能从最简单的例子开始,一步步建立你的 Solidity 编程思维。

Reading and Writing to a State Variable

读写状态变量

要写入或更新状态变量,你需要发送一笔交易。 另一方面,你可以免费读取状态变量,无需支付交易费用

  • 状态变量:状态变量是存储在区块链上的数据(例如一个数字或字符串),它们是智能合约的“持久化”数据,类似于数据库中的记录。
  • 写入状态变量:
    • 修改状态变量(例如更新一个数字)需要发送一笔交易(transaction)。
    • 交易会改变区块链的状态,因此需要支付 Gas 费用(以太坊的计算和存储费用)。
    • 交易必须由用户或另一个合约发起,并由区块链网络确认。
  • 读取状态变量:
    • 读取状态变量(例如查看当前值)不需要发送交易。
    • 如果通过 链下调用(off-chain call,例如通过 Web3 库查询),读取是免费的,因为它不会改变区块链状态。
    • 通常,读取函数会标记为 view,表示它们只读数据,不消耗 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 SimpleStorage {// 定义一个名为 `SimpleStorage` 的智能合约。// 合约是一个运行在以太坊区块链上的程序,包含数据(状态变量)和逻辑(函数)。// 这个合约的目的是展示如何读写状态变量。// State variable to store a number// 用于存储数字的状态变量uint256 public num;// 声明一个名为 `num` 的状态变量,类型为 `uint256`(256 位无符号整数,范围从 0 到 2^256-1)。// `public` 关键字表示该变量可以被外部访问,Solidity 会自动为其生成一个 getter 函数(类似于 `function num() public view returns (uint256)`)。// 未初始化,默认值为 0,存储在区块链上。// You need to send a transaction to write to a state variable.// 你需要发送一笔交易来写入状态变量。function set(uint256 _num) public {// 定义一个名为 `set` 的公共函数,用于更新状态变量 `num`。// 接受一个参数 `_num`,类型为 `uint256`,表示要设置的新值。// `public` 表示函数可以被外部调用(用户、其他合约或 DApp)。// 没有 `view` 或 `pure` 修饰符,表示函数会修改区块链状态,需要消耗 Gas。num = _num;// 将状态变量 `num` 的值更新为传入的参数 `_num`。// 修改状态变量会触发区块链存储更新,因此需要发送交易并支付 Gas。}// You can read from a state variable without sending a transaction.// 你可以无需发送交易即可读取状态变量。function get() public view returns (uint256) {// 定义一个名为 `get` 的公共函数,用于读取状态变量 `num` 的值。// `public` 表示函数可以被外部调用。// `view` 修饰符表示函数只读取区块链数据,不修改任何状态,因此链下调用免费。// 返回值类型为 `uint256`,表示返回 `num` 的当前值。return num;// 返回状态变量 `num` 的当前值。}
}

SimpleStorage 是一个简单的智能合约,展示了如何在以太坊区块链上读写状态变量。它包含:

  • 一个状态变量 num,用于存储一个数字(初始值为 0)。
  • 一个函数 set,用于更新 num 的值(写入操作)。
  • 一个函数 get,用于查看 num 的当前值(读取操作)。

代码做什么?

  • 状态变量 num
    • 存储一个数字,永久保存在区块链上。
    • 因为是 public,可以直接通过 getter 函数(num())或 get 函数读取。
  • 写入操作(set 函数):
    • 接受一个新数字 _num,更新 num 的值。
    • 修改区块链上的数据需要发送交易,消耗 Gas。
    • 例如,调用 set(42) 会将 num 改为 42。
  • 读取操作(get 函数):
    • 返回 num 的当前值。
    • 只读取数据,不修改区块链状态,因此链下调用免费。
    • 例如,调用 get() 会返回当前的 num 值(如 42)。
  • Gas 成本:
    • 部署合约时,初始化 num(默认 0)需要 Gas。
    • 调用 set 函数修改 num 需要 Gas(因为更改区块链状态)。
    • 调用 get 函数或 num 的 getter 函数是 view 操作,链下调用不消耗 Gas。

关键点:

  • 状态变量:
    • 存储在区块链的 storage 中,永久保存。
    • 修改需要交易和 Gas,读取通常免费。
  • 交易 vs. 调用:
    • 交易(Transaction):修改区块链状态(如调用 set),需要 Gas,记录在区块链上。
    • 调用(Call):只读取数据(如调用 get),链下免费,不记录在区块链上。
  • 公共变量:
    • public 变量自动生成 getter 函数,功能与 get 函数类似。
    • 例如,num 本身可以直接查询,等价于调用 get
  • 用途:
    • 读写状态变量是智能合约的核心功能,广泛用于存储用户数据、记录状态或实现业务逻辑。
    • 例如,SimpleStorage 可以用来记录一个计数器、用户余额或其他持久化数据。

读写状态变量的注意事项

  • 写入需要交易:
    • 任何修改状态变量的操作(如 set)都需要发送交易,消耗 Gas。
    • 交易失败(例如 Gas 不足或逻辑错误)会导致状态回滚,但已消耗的 Gas 不退还。
  • 读取免费:
    • view 函数(如 get)或 public 变量的 getter 函数在链下调用免费。
    • 如果在链上调用(例如另一个合约调用 get),会消耗少量 Gas。
  • 状态变量的存储成本:
    • 状态变量存储在区块链的 storage 中,占用空间较大,初始化和修改成本高。
    • 选择合适的类型(如 uint8uint256 更省空间)可以优化 Gas。
  • 安全性:
    • public 变量可以被任何人读取,注意不要存储敏感数据。
    • 修改状态变量时,考虑添加权限控制(例如只有管理员可以调用 set)。
  • 溢出检查:
    • 在 Solidity 0.8.0+ 中,uint256 的算术运算自动检查溢出/下溢,失败时交易会回滚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88867.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88867.shtml

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

相关文章

c# 深度解析:实现一个通用配置管理功能,打造高并发、可扩展的配置管理神器

文章目录深入分析 ConfigManager<TKey, TValue> 类1. 类设计概述2. 核心成员分析2.1 字段和属性2.2 构造函数3. 数据加载机制4. CRUD 操作方法4.1 添加数据4.2 删除数据4.3 更新数据4.4 查询数据4.5 清空数据5. 数据持久化6. 设计亮点7. 使用示例ConfigManager<TKey, …

运维打铁: Python 脚本在运维中的常用场景与实现

文章目录引言思维导图常用场景与代码实现1. 服务器监控2. 文件管理3. 网络管理4. 自动化部署总结注意事项引言 在当今的 IT 运维领域&#xff0c;自动化和效率是至关重要的。Python 作为一种功能强大且易于学习的编程语言&#xff0c;已经成为运维人员不可或缺的工具。它可以帮…

【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术

文章目录 前言实现天空盒反射1、新建一个cube2、全反射材质3、增加环境反射分辨率反射探针1、一样把小球材质调成全反射2、在小球身上加添加反射探针3、设置静态物体4、点击烘培5、效果6、可以修改反射探针区域大小7、实时反射专栏推荐完结前言 当对象收到直接和间接光照后,它…

React Three Fiber 实现 3D 模型点击高亮交互的核心技巧

在 WebGL 3D 开发中&#xff0c;模型交互是提升用户体验的关键功能之一。本文将基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;总结 3D 模型点击高亮&#xff08;包括模型本身和边框&#xff09;的核心技术技巧&#xff0c;帮助开发者快速掌握复杂…

卷积神经网络实战:MNIST手写数字识别

夜渐深&#xff0c;我还在&#x1f618; 老地方 睡觉了&#x1f64c; 文章目录&#x1f4da; 卷积神经网络实战&#xff1a;MNIST手写数字识别&#x1f9e0; 4.1 预备知识⚙️ 4.1.1 torch.nn.Conv2d() 三维卷积操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化层的作用&#x1f4…

HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位

HarmonyOS应用无响应&#xff08;AppFreeze&#xff09;深度解析&#xff1a;从检测原理到问题定位 在日常应用使用中&#xff0c;我们常会遇到点击无反应、界面卡顿甚至完全卡死的情况——这些都可能是应用无响应&#xff08;AppFreeze&#xff09; 导致的。对于开发者而言&am…

湖北设立100亿元人形机器人产业投资母基金

湖北设立100亿元人形机器人产业投资母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;时长01:20 近日&#xff0c;湖北设立100亿元人形机器人产业投资母基金&#xff0c;重点支持人形机器人和人工智能相关产业发展。 人形机器人产业投资母基金由湖北省财政厅依托省政府…

时序预测 | Pytorch实现CNN-LSTM-KAN电力负荷时间序列预测模型

预测效果 代码主要功能 该代码实现了一个结合CNN&#xff08;卷积神经网络&#xff09;、LSTM&#xff08;长短期记忆网络&#xff09;和KAN&#xff08;Kolmogorov-Arnold Network&#xff09;的混合模型&#xff0c;用于时间序列预测任务。主要流程包括&#xff1a; 数据加…

OCR 识别:车牌识别相机的 “火眼金睛”

车牌识别相机在交通管理、停车场收费等场景中&#xff0c;需快速准确识别车牌信息。但实际环境中&#xff0c;车牌可能存在污渍、磨损、光照不均等情况&#xff0c;传统识别方式易出现误读、漏读。OCR 技术让车牌识别相机如虎添翼。它能精准提取车牌上的字符&#xff0c;不管是…

Java面试基础:面向对象(2)

1. 接口里可以定义哪些方法抽象方法&#xff1a;抽象方法是接口的核心部分&#xff0c;所有实现接口的类都必须实现这些方法。抽象方法默认是 public 和 abstract 修饰&#xff0c;这些修饰符可以省略。public interface Animal {void Sound(); }默认方法&#xff1a;默认方法是…

有哪些更加简洁的for循环?循环语句?

目录 简洁的for循环 循环过程修改循环变量 循环语句 不同编程语言支持的循环语句 foreach 无限循环 for循环历史 break和continue 循环判断结束值 循环标签 循环语句优化 循环表达式返回值 简洁的for循环 如果需要快速枚举一个集合的元素&#xff0c;尽管C语言可以…

RK3568/3588 Android 12 源码默认使用蓝牙mic录音

遇到客户一个需求&#xff0c;如果连接了带mic的蓝牙耳机&#xff0c;默认所有的录音要走蓝牙mic通道。这个功能搞了好久&#xff0c;终于搞定了。1. 向RK寻求帮助&#xff0c;先打通 bt sco能力。此时&#xff0c;还无法默认就切换到蓝牙 mic通道&#xff0c;接下来我们需求默…

解锁HTTP:从理论到实战的奇妙之旅

目录一、HTTP 协议基础入门1.1 HTTP 协议是什么1.2 HTTP 协议的特点1.3 HTTP 请求与响应的结构二、HTTP 应用场景大揭秘2.1 网页浏览2.2 API 调用2.3 文件传输2.4 内容分发网络&#xff08;CDN&#xff09;2.5 流媒体服务三、HTTP 应用实例深度剖析3.1 使用 JavaScript 的 fetc…

uvm_config_db examples

通过uvm_config_db类访问的UVM配置数据库,是在多个测试平台组件之间传递不同对象的绝佳方式。 methods 有两个主要函数用于从数据库中放入和检索项目,分别是 set() 和 get()。 static function void set ( uvm_component cntxt,string inst_name,string …

(C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)

目录 前言&#xff1a; 源代码&#xff1a; 代码解析&#xff1a; 一.头文件和命名空间 1. #include - 输入输出功能2. #include - 链表容器3. #include - 字符串处理4. using namespace std; - 命名空间 可视化比喻&#xff1a;建造房子 &#x1f3e0; 二.menu()函数 …

Java 中的异步编程详解

前言 在现代软件开发中&#xff0c;异步编程&#xff08;Asynchronous Programming&#xff09; 已经成为构建高性能、高并发应用程序的关键技术之一。Java 作为一门广泛应用于后端服务开发的语言&#xff0c;在其发展过程中不断引入和优化异步编程的支持。从最初的 Thread 和…

MySQL逻辑删除与唯一索引冲突解决

问题背景 在MySQL数据库设计中&#xff0c;逻辑删除&#xff08;软删除&#xff09;是一种常见的实践&#xff0c;它通过设置标志位&#xff08;如is_delete&#xff09;来标记记录被"删除"&#xff0c;而不是实际删除数据。然而&#xff0c;当表中存在唯一约束时&am…

php命名空间用正斜杠还是反斜杠?

在PHP中&#xff0c;命名空间使用反斜杠&#xff08;\&#xff09;作为分隔符&#xff0c;这是PHP语言规范明确规定的。反斜杠在命名空间中扮演路径分隔的角色&#xff0c;用于区分不同层级的命名空间。 具体说明&#xff1a;语法规则 PHP命名空间使用反斜杠&#xff08;\&…

《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》

在C#的ASP.NET Core开发中&#xff0c;依赖注入绝非简单的技术技巧&#xff0c;而是重构代码关系的底层逻辑。它像一套隐形的神经网络&#xff0c;让程序模块摆脱硬编码的束缚&#xff0c;在运行时实现动态连接&#xff0c;从而为系统注入可测试、可进化的核心生命力。理解其深…

星云ERP本地环境搭建笔记

看到星云ERP两个比较实用的功能&#xff0c;编号规则和打印模板&#xff0c;如下图所示&#xff0c;于是本地跑起来学习学习。开发环境必备&#xff1a;1. JDK 1.82. MySQL 5.73. Redis 44. RabbitMQ 3.12.45. nodejs 206. pnpm 9.7.1 (npm install -g pnpm9.7.1)其他开发工具&…