Solidity之变量数据存储和作用域

news2024/11/25 6:57:42

引用类型

引用类型(Reference Type):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。

数据位置

solidity数据存储位置有三类:storage,memory和calldata。不同存储位置的gas成本不同。storage类型的数据存在链上,类似计算机的硬盘,消耗gas多;memory和calldata类型的临时存在内存里,消耗gas少。

  • storage:合约里的状态变量默认都是storage,存储在链上。
  • memory:函数里的参数和临时变量一般用memory,存储在内存中,不上链。
  • calldata:和memory类似,存储在内存中,不上链。与memory的不同点在于calldata变量不能修改(immutable),一般用于函数的参数。例子:
    在这里插入图片描述

赋值规则

在不同存储类型相互赋值时候,有时会产生独立的副本(修改新变量不会影响原变量),有时会产生引用(修改新变量会影响原变量)。规则如下:

  • storage(合约的状态变量)赋值给本地storage(函数里的)时候,会创建引用,改变新变量会影响原变量。例子:
	uint[] x= [1,2,3];

    function Fstorng() public{
        //声明一个storage的变量,指向x。修改变量也会影响x
        uint[] storage S=x;
        S[0] =99 ;
    }

在这里插入图片描述

  • storage赋值给memory,会创建独立的副本,修改其中一个不会影响另一个;反之也是一样的。
    uint[] x=[1,2,3];//状态变量  类型为数组

    function fMemory() public view{
         //声明一个Memory的变量,复制x。修改变量不会影响x
        uint[] memory xMemory = x;
        xMemory[0] = 100;
        xMemory[1] = 200;
        uint[] memory xMemory2 = x;
        xMemory2[0] = 300;
    }

在这里插入图片描述

  • memory赋值给memory,会创建引用,改变新变量会影响原变量。
  • 其他情况,变量赋值给storage,会创建独立的副本,修改其中一个不会影响另一个。

变量的作用域

Solidity中变量按作用域划分有三种,分别是状态变量(state variable),局部变量(local variable)和全局变量(global variable)

1. 状态变量

状态变量是数据存储在链上的变量,所有合约内函数都可以访问 ,gas消耗高。状态变量在合约内、函数外声明:

contract HelloWeb3{

    uint public a=1;
    string public _str= "\u54c8\u55bd";
    bool _bool=false;

    function text() external{
        a = 5;
        _str="hello";
        _bool=true;
    }
    }

在这里插入图片描述

也可以在函数里面改变状态变量,可以通过调试来查看函数里面状态变量的变化

在这里插入图片描述

2.局部变量

局部变量是仅在函数执行过程中有效的变量,函数退出后,变量无效(就是只给函数内部使用)。局部变量的数据存储在内存里,不上链,gas低。局部变量在函数内声明:

 //函数
 function fun1() public pure  returns (uint){
     uint _a=1;
     uint b=1;
     uint c=_a+b;
     return c;
    }

在这里插入图片描述

3.全局变量

全局变量是全局范围工作的变量,都是solidity预留关键字。他们可以在函数内不声明直接使用:
在这里插入图片描述
下面是一些常用的全局变量,更完整的列表请看这个链接:

  • blockhash(uint blockNumber): (bytes32)给定区块的哈希值 – 只适用于256最近区块,
    不包含当前区块。
  • block.coinbase: (address payable) 当前区块矿工的地址
  • block.gaslimit:(uint) 当前区块的gaslimit
  • block.number: (uint) 当前区块的number
  • block.timestamp: (uint) 当前区块的时间戳,为unix纪元以来的秒
  • gasleft(): (uint256) 剩余gas
  • msg.data: (bytes calldata) 完整call data
  • msg.sender: (addresspayable) 消息发送者 (当前 caller)
  • msg.sig: (bytes4) calldata的前四个字节 (function identifier)
  • msg.value: (uint) 当前交易发送的wei值

小提示

storage, memory和calldata三个关键字出现的原因是为了节省链上有限的存储空间和降低gas。

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

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

相关文章

加州驾照笔试准备笔记

文章目录 数字错题注意事项 参考文档:官方中文文档 数字 BAC:21岁以下0.01%;其它成人是 0.08%當有車輛向您駛來時,在距離對方車輛 500 英尺內,或,同向行駛的前方車輛距離您不超過 300 呎,將遠光…

01-MySQL-安装

一、windows安装mysql 安装详情查看 https://blog.csdn.net/cygqtt/article/details/124396223 二、CentOS安装mysql (方式一) ①:安装MySQL 8的存储库 # 安装前可以更新一下yum包 yum updatewget https://repo.mysql.com//mysql80-community-release-el7-3.noarc…

04-MySQL-基础-多表查询事务

一、多表查询 ①:多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结 构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分…

RAID卡管理工具使用

RAID 基本概念 由于现代数据中心业务量的与日俱增,单台服务器上需要运行的数据也日益增多。当 单个物理磁盘在容量和安全性上不足以支持系统业务时,就需要将多个磁盘以某种特 定方式组合起来,对外作为一个可见的磁盘来使用,才可…

你知道在游戏开发中怎么将算法与其作用的对象隔离开来吗?

点击上方亿元程序员关注和★星标 引言 你可能知道的设计模式-访问者模式 大家好,今天我们要来聊一聊在游戏开发中非常实用的设计模式——访问者模式。访问者模式是一种将算法与对象结构分离的软件设计模式,它可以让代码更加灵活、可扩展,同…

11.6区间估计、置信区间

已知总体方差 就是说,在总体里随机取样的时候,取样的均值服从总体的均值,方差为总体均值方差与样本量比值的正态分布,样本量越小,方差越大,样本量越大,方差越小,取样的样本均值浮动…

VMware ifconfig ip报错解决记录

1.报错 ifconfig后出现以下报错 lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 9216 b…

5.5逆波兰表达式求值(LC150-M)

算法&#xff1a; 其实就是后缀表达式。 本题中每一个子表达式要得出一个结果&#xff0c;然后拿这个结果再进行运算&#xff0c;那么这岂不就是一个相邻字符串消除的过程&#xff0c;和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了…

PostgreSQL JDBC连接详解(附DEMO)

PostgreSQL JDBC连接详解 PostgreSQL JDBC连接详解摘要引言1. JDBC基础1.1 JDBC简介1.2 JDBC驱动程序1.3 建立JDBC连接 2. 配置PostgreSQL JDBC连接2.1 PostgreSQL连接JDBC2.2 PostgreSQL连接JDBC是否成功2.3 PostgreSQL连接JDBC获取表信息注释等2.4 PostgreSQL连接JDBC根据表名…

Unity热更新那些事

目录 热更新方案Unity程序的两种编译方式编译阶段执行阶段Mono方式IL2CPP方式两种方式打包以后的项目目录结构 其他 ILRuntime热更新ILRuntime使用注意ILRuntime的实现原理ILRuntime的性能优化建议ILRuntime的性能优化建议 HybridCLR热更新 参考链接 Unity热更新那些事 一小时极…

关闭 win10自动更新、关闭激活

做工控或者数据大屏、服务器之类的,都不想系统自动更新,不知不觉自动重启类。 激活过了一段时间,又要重新激活这些事情,所以需要手工去关闭这些服务。 一、关闭 win10自动更新 首先打开 服务,找到windows update: window +R 输入:Services.msc 停止windows update ,然…

Python 海龟绘图基础教学教案(六)

Python 海龟绘图——第 9 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 综合应用&#xff0c;绘制长方形。 答案&#xff1a; 不使用循环。 Python 海龟绘图——第 10 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 综合命令使用。 答案&#xff1a; 使用循环…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候&#xff0c;需要对两张表进行…

【ES分词】

分词 #测试分词器 POST /_analyze {"text": "小米手机和华为手机都是国产mobilephone", "analyzer": "english" }不管analyzer是改成&#xff1a;standard还是chinese都无法实现中文分词。 处理中文分词一般采用IK分词器 安装链接&…

Mongoose 开源库--json 使用笔记

一、 json相关API mongoose 开源库可以使用json进行数据处理。 ①创建json字符串 // A helper macro for printing JSON: mg_snprintf(buf, len, "%m", MG_ESC("hi")) #define MG_ESC(str) mg_print_esc, 0, (str) char *mg_mprintf(const char *fmt, ...)…

银行项目网上支付接口调用测试实例详解

前言 公司最近有一个网站商城项目要开始开发了&#xff0c;这几天老板和几个同事一起开着需求会议&#xff0c;讨论了接下来的业务规划和需求策略&#xff0c;等技术需求一下来还要讨论技术需求&#xff0c;确认后再慢慢的进入开发阶段&#xff0c;趁着闲暇时间想总结一下进入…

【0基础学Java第七课】-- 类和对象02

7.类和对象02 7.6 封装7.6.1 封装的概念7.6.2 访问限定符7.6.3封装扩展之包a.包的概念b. 导入包中的类c. 自定义包d 常见的包 7.7 static 成员7.7.2 静态修饰成员变量7.7.4 static修饰成员方法7.7.5 static成员变量初始化 7.8 代码块7.8.1 代码块概念以及分类7.8.2 普通代码块7…

Linux个性化登录提示信息

在Linux系统中&#xff0c;您可以为每个用户登录后显示个性化的提示信息。这通常通过修改用户的shell配置文件来实现&#xff0c;这个文件通常是用户的.bashrc或.bash_profile文件。以下是一些示例步骤&#xff0c;来实现这个目标&#xff1a; 打开终端并登录到Linux系统。 使…

AI:64-基于深度学习的口罩佩戴检测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

“2024上海智博会”为我国智能科技产业发展注入新的动力

作为开年智能科技第一展“2024上海智博会”将于2024年三月份在国际大都市上海隆重召开&#xff0c;本届展会将充分展示我国智能科技产业新技术、新产品及未来发展方向。 据悉&#xff0c;本届展会将汇聚全球智能科技产业的领军企业和人物&#xff0c;共同探讨和分享最新的技术趋…