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

这篇具有很好参考价值的文章主要介绍了Solidity之变量数据存储和作用域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引用类型

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

数据位置

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

  • storage:合约里的状态变量默认都是storage,存储在链上。
  • memory:函数里的参数和临时变量一般用memory,存储在内存中,不上链。
  • calldata:和memory类似,存储在内存中,不上链。与memory的不同点在于calldata变量不能修改(immutable),一般用于函数的参数。例子:
    Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

赋值规则

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

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

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

Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

  • 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;
    }

Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

  • 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;
    }
    }

Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

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

Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

2.局部变量

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

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

Solidity之变量数据存储和作用域,# Solidity,区块链,remix,Solidity,智能合约

3.全局变量

全局变量是全局范围工作的变量,都是solidity预留关键字。他们可以在函数内不声明直接使用:
Solidity之变量数据存储和作用域,# Solidity,区块链,remix,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。文章来源地址https://www.toymoban.com/news/detail-745762.html

到了这里,关于Solidity之变量数据存储和作用域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【区块链实战】Solidity 智能合约如何给账户充值

    目录 一、实战场景 二、知识点 智能合约 智能合约函数 智能合约充值 payable 智能合约部署地址 智能合约的运行 合约 this 对象 三、菜鸟实战 四、运行结果 Solidity 智能合约如何给账户充值 1、充值金额 2、充值并查看结果

    2024年02月09日
    浏览(43)
  • 【区块链-智能合约工程师】第二篇:Solidity入门

    参考文章:一文速览2022十大智能合约开发工具 资料地址:WTF学院 HelloWorld remix:在线智能合约开发IDE(Integrated Development Environment,集成开发环境),可以在浏览器中快速部署测试智能合约。 合约HelloWorld: 事项 说明 代码所用的软件许可(license) 不写许可的话编译时会警告

    2024年02月09日
    浏览(47)
  • 区块链智能合约solidity的中的一些关键字

    目  录 pragma mapping msg对象 block对象 contract constructor struct 数据地址 地址类型 address payable revert 以下场景使用 revert() : require 以下场景使用 require() : assert 以下场景使用 assert(): 访问权限 internal public private external function returns return view pure constant event emit modifier pragma   

    2024年01月16日
    浏览(71)
  • 【区块链-智能合约工程师】第三篇:Solidity进阶(一)

    学习资料地址:WTF学院 库合约一般都是一些好用的函数合集(库函数),为了提升solidity代码的复用性和减少gas而存在。他和普通合约主要有以下几点不同: 不能存在状态变量 不能够继承或被继承 不能接收以太币 不可以被销毁 String库 String库合约是将uint256(大正整数)类型

    2024年02月06日
    浏览(48)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(62)
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码

    专栏:区块链技术开发 Truffle Box是一个开发工具,为Truffle生态系统中的开发人员提供了预构建

    2023年04月16日
    浏览(49)
  • 如何使用remix编辑智能合约

    今天突然发现一个很有趣的合约代码,顺便教一下怎么操作remix的编译 。 我们将向您展示 Solidity 中的一个简单的 前期部署 ,它会自动将任何流动性定位到 BSC 代币。如果代币的流动性已完全调入您的钱包,则卖出会自动触发获利。- 利润的 10% 自动重新进入先行池。- 90% 的利

    2024年02月16日
    浏览(29)
  • 基于Remix+MetaMask部署智能合约

    由于论文迟迟没有进展,基础知识掌握不牢,今由重新拾起区块链的应用,研究了下节点连接和智能合约部署的一些操作。 基础知识: remix是用来部署智能合约的,metamask是可视化的钱包。 准备环境: 基于浏览器的Remix,网址为:http://remix.ethereum.org/ 。 MetaMask是一个基于Ch

    2024年02月07日
    浏览(33)
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包